Main Content

smithForm

説明

S = smithForm(A) は、正方可逆行列 Aスミス標準形を返します。A の要素は、整数または symvar(A,1) で決定される変数の多項式でなければなりません。スミス型 S は対角行列です。

[U,V,S] = smithForm(A) は、A のスミス標準形と、S = U*A*V となるようなユニモジュラー変換行列 U および V を返します。

___ = smithForm(A,var) では、A の要素が、指定された変数 var の一変数多項式であると仮定します。A に他の変数が含まれる場合、smithForm ではそれらの変数をシンボリック パラメーターとして扱います。

前述のいずれの構文でも入力引数 var を使用できます。

Avar が含まれない場合、smithForm(A)smithForm(A,var) は異なる結果を返します。

整数行列のスミス型

逆ヒルベルト行列のスミス型を求めます。

A = sym(invhilb(5))
S = smithForm(A)
A =
[    25,   -300,    1050,   -1400,    630]
[  -300,   4800,  -18900,   26880, -12600]
[  1050, -18900,   79380, -117600,  56700]
[ -1400,  26880, -117600,  179200, -88200]
[   630, -12600,   56700,  -88200,  44100]
 
S =
[ 5,  0,   0,   0,    0]
[ 0, 60,   0,   0,    0]
[ 0,  0, 420,   0,    0]
[ 0,  0,   0, 840,    0]
[ 0,  0,   0,   0, 2520]

一変数多項式の行列のスミス型

2 行 2 列の行列を作成します。この行列の要素は、変数 x の多項式です。

syms x
A = [x^2 + 3, (2*x - 1)^2; (x + 2)^2, 3*x^2 + 5]
A =
[   x^2 + 3, (2*x - 1)^2]
[ (x + 2)^2,   3*x^2 + 5]

この行列のスミス型を求めます。

S = smithForm(A)
S =
[ 1,                                 0]
[ 0, x^4 + 12*x^3 - 13*x^2 - 12*x - 11]

多変数多項式行列のスミス型

2 つの変数 xy を含む 2 行 2 列の行列を作成します。

syms x y
A = [2/x + y, x^2 - y^2; 3*sin(x) + y, x]
A =
[      y + 2/x, x^2 - y^2]
[ y + 3*sin(x),         x]

この行列のスミス型を求めます。多項式の変数を指定しない場合、smithForm では symvar(A,1) を使用して、多項式の変数が x であると決定します。3*sin(x) + yx の多項式ではないため、smithForm はエラーをスローします。

S = smithForm(A)
Error using mupadengine/feval (line 163)
Cannot convert the matrix entries to integers or univariate polynomials.

A のすべての要素が変数 y の多項式であると指定して、A のスミス型を求めます。

S = smithForm(A,y)
S =
[ 1,                                                     0]
[ 0, 3*y^2*sin(x) - 3*x^2*sin(x) + y^3 + y*(- x^2 + x) + 2]

スミス型と変換行列

逆ヒルベルト行列のスミス型と変換行列を求めます。

A = sym(invhilb(3));
[U,V,S] = smithForm(A)
U =
[  1,  1, 1]
[ -4, -1, 0]
[ 10,  5, 3]
 
V =
[ 1, -2, 0]
[ 0,  1, 5]
[ 0,  1, 4]
 
S =
[ 3,  0,  0]
[ 0, 12,  0]
[ 0,  0, 60]

S = U*A*V であることを検証します。

isAlways(S == U*A*V)
ans =
  3×3 logical array
     1     1     1
     1     1     1
     1     1     1

多項式行列のスミス型と変換行列を求めます。

syms x y
A = [2*(x - y), 3*(x^2 - y^2);
     4*(x^3 - y^3), 5*(x^4 - y^4)];
[U,V,S] = smithForm(A,x)
U =
[ 0,                        1]
[ 1, - x/(10*y^3) - 3/(5*y^2)]
 
V =
[ -x/(4*y^3), - (5*x*y^2)/2 - (5*x^2*y)/2 - (5*x^3)/2 - (5*y^3)/2]
[  1/(5*y^3),                               2*x^2 + 2*x*y + 2*y^2]
 
S =
[ x - y,                             0]
[     0, x^4 + 6*x^3*y - 6*x*y^3 - y^4]

S = U*A*V であることを検証します。

isAlways(S == U*A*V)
ans =
  2×2 logical array
     1     1
     1     1

整数行列の変数を指定する場合

行列に特定の変数が含まれておらず、その変数を 2 番目の引数として指定して smithForm を呼び出す場合、その結果はその変数を指定しない場合に得られる結果とは異なります。たとえば、変数を 1 つも含まない行列を作成します。

A = [9 -36 30; -36 192 -180; 30 -180 180]
A =
     9   -36    30
   -36   192  -180
    30  -180   180

変数 x を 2 番目の引数として指定して、smithForm を呼び出します。この場合、smithForm では A の要素が x の一変数多項式であると仮定します。

syms x
smithForm(A,x)
ans =
     1     0     0
     0     1     0
     0     0     1

変数を指定せずに smithForm を呼び出します。この場合、smithFormA を整数行列として扱います。

smithForm(A)
ans =
     3     0     0
     0    12     0
     0     0    60

入力引数

すべて折りたたむ

入力行列。正方可逆シンボリック行列として指定します。この行列の要素は、整数または一変数多項式です。A の要素に複数の変数が含まれる場合、引数 var を使用して多項式変数を指定し、他のすべての変数をシンボリック パラメーターとして扱います。A が多変数で、var を指定していない場合、smithForm では symvar(A,1) を使用して多項式の変数を決定します。

多項式の変数。シンボリック変数として指定します。

出力引数

すべて折りたたむ

入力行列のスミス標準形。シンボリック対角行列として返されます。最初の対角要素が 2 番目の対角要素を分割し、2 番目の対角要素が 3 番目の対角要素を分割します。以下同様に続きます。

変換行列。ユニモジュラー シンボリック行列として返されます。A の要素が整数の場合、U の要素も整数です。また、det(U) = 1 であるか、det(U) = -1 です。A の要素が多項式の場合、U の要素は一変数多項式であり、det(U) は定数です。

変換行列。ユニモジュラー シンボリック行列として返されます。A の要素が整数の場合、V の要素も整数です。また、det(V) = 1 であるか、det(V) = -1 です。A の要素が多項式の場合、V の要素は一変数多項式であり、det(V) は定数です。

詳細

すべて折りたたむ

スミス標準形

n 行 n 列の行列 A のスミス標準形は、Si,i がすべての i < n について Si+1,i+1 を除算するような n 行 n 列の対角行列 S です。

バージョン履歴

R2015b で導入