第 2 章 Maxima のデータとその操作 73
2.2 多項式
2.2.8 多項式に関する函数
多項式に関連する述語函数
¶ ³
函数 trueを返す条件 ratnump(h式i) h式iが有理式の場合
ratp(h式i) h式iが拡張CRE表現の場合
µ ´
ratnump函数はh式iがh有理数式iであればtrue,それ以外はfalseを返します.
ratp函数はh式iがCRE表現,或いは拡張CRE表現であればtrueで,それ以外はfalseを返し ます.
多項式の係数を取出す函数
¶ ³
coeff(h式i,h変数i,h次数i) ratcoef(h式1i,h式2i,hni) ratcoef(h式1i,h式2i) bothcoef(h式i,h変数i)
µ ´
coeff函数は,h式iに含まれる項h変数ih次数iの係数を求めます. h次数iを省略すると次数は1 が設定されます. h変数iはアトムか真の部分式です. 具体的には,x,sin(x),a[i+ 1],x+y等です.
尚,真の部分式の場合,(x+y)が式の中に現れていなければならなりません. ここでh変数ih次数i の項を正確に求める為には,式の展開や因子分解が必要な場合もあります.何故なら,coeff函数では 自動的に式の展開や因子分解が実行されないからです.
(%i1) coeff(2*a*tan(x)+tan(x)+b=5*tan(x)+3,tan(x));
(%o1) 2 a + 1 = 5
(%i2) coeff(y+x*%e**x+1,x,0);
(%o2) y + 1
ratcoefは h式1 に含まれる項h式2ihniの係数を返します. hniが1の場合はhniが省略出来ま す. 尚,返却値には,h式2iに含まれる変数を函数の変数としても含まないものです.
この様な係数が存在しない場合は零を返します.ratcoefは展開等を行って式を簡易化するので, 単純にh式2ihniの係数を返すcoefと異った答を返します.
例えば,ratcoeff((x+1)/y+x,x)は(y+1)/yを返却しますが,coeffは1を返します.
ratcoef(h式1i,h式2i,0)は,h式1iからh式2iを含まない項の和を返します. その為,h式2iが負 の羃の項に含まれれば,ratcoefは使ってはいけません.h式1iが有理的に簡易化されていれば,係数 は予期した様に現れないかもしれません.
bothcoef函数は二成分のリストを返し,このリストの第一成分がh式i中のh変数iの係数(式が
CRE表現であればratcoef,それ以外はcoeff函数で見つけたもの)となります. 第二成分がh式i の残りとなります.即ち,[a,b]が返却値であれば,h式i=a∗ h変数i+bとなります.
項数や次数を返す函数
¶ ³
nterms(h式i)
powers(h式i,h変数i)
µ ´
nterms函数はh式iを展開した時の項数を返却します.この函数は多項式以外の函数を含む通常
の式でも利用可能ですが,函数は引数の形式を問わず一つで数えられます.
(%i26) nterms((x+1)^2);
(%o26) 3
(%i27) nterms(sin(x+1)^2);
(%o27) 1
(%i28) nterms((sin(x+1)+1)^3);
(%o28) 4
(%i29) nterms((sin((x+1)^10)+1)^3);
(%o29) 4
この例で示す様に,sin函数の引数がどの様な式であっても,一つで数えられている事に注意して 下さい.
次のpowers函数はh式iに現われるh変数iの次数リストを返します.この函数を利用する為に
は,予め, load(powers);で函数の読込を行う必要があります.
多項式の項の次数を返す函数
¶ ³
hipow(h多項式i,h変数i) lopow(h多項式i,h変数i)
µ ´
hipow函数はh多項式iに含まれるh変数iの項の最高次数を返します.尚,hipowでは式の展開
を自分で実行しない為,予め式を展開しておく必要があります.以下の例では(x+ 1)4を展開せず
にhipowを用いた結果とexpandで展開した式に対してhipowを用いた結果を示しています.
(%i5) hipow((x+1)^4,x);
(%o5) 1
(%i6) hipow(expand((x+1)^4),x);
(%o6) 4
lopow函数はh多項式iの部分式h変数iの次数で,明示的に現われものの中で最も低い次数を
返します.
多項式の変数に関する函数
¶ ³
ratvars(h変数1i,· · ·,h変数ni)
ratweight(h変数1i,h重み1i,· · ·,h変数ni,h重みni) showratvars(h式i)
µ ´
ratvars函数は与えられた変数リストに含まれる変数に沿った順序をMaximaに入れる函数です.
変数リストはn個の変数引数で構成し,ratvars函数を実行した後,リスト中の一番右側のh変数ni が有理式にあれば,その変数を有理式の主変数になります.又,他の変数の順序はリストの右から左 への順番に従います.ある変数がratvarsリストから抜けていれば,その変数は一番左側のh変数1i よりも低い順序が付けられます.
ratvars函数の引数は変数,或いはsin(x)の様な非有理的函数の何れかでなければなりません.尚,
大域変数ratvarsは,この函数に与えられた引数のリストとなります.
(%i26) ratvars(x,y,z);
(%o26) [x, y, z]
(%i27) rat(x+y+z);
(%o27)/R/ z + y + x
(%i28) rat(a+x+y+z);
(%o28)/R/ z + y + x + a
(%i29) ratvars(z,y,x);
(%o29) [z, y, x]
(%i30) rat(a+x+y+z);
(%o30)/R/ x + y + z + a
ratweight函数は,h重みiiをh変数iiに割当てます.その重みが大域変数ratwtlvlの値に従って項 が0で置き換えられます. 項の重みは項の中の変数の羃を重みに掛けた積の和となります. 例えば, 3·v12·v2の重みは 2·w1+w2となります.この切捨ては,式のCRE表現の積や羃乗を実行する時 のみに生じます.
尚,ratfac函数とratweight函数の手法は互換性がないので両方同時に使えません.
showratvars函数はh式iの大域変数ratvarsのリストを返します.
(%i30) exp:x^2+y^2+z^3;
3 2 2
(%o30) z + y + x
(%i31) showratvars(exp);
(%o31) [x, y, z]
多項式を纏める函数
¶ ³
factcomb(h式i)
fasttimes(h多項式1i, h多項式2in ) rootscontract(h式i)
µ ´
factcomb函数はh式i中に現われる階乗の係数を階乗それ自体に置換して纏めます.即ち, (n+1)∗n!
を(n+ 1)!にする事です.ここで,大域変数sumsplitfactがfalseに設定されていれば,minfactorial がfactcombの後に適用されます.
fasttimes函数は多項式の積に対する特殊なアルゴリズムを用いて,h多項式1iとh多項式2iの積 を計算します. これらの多項式は,多変数で各次数に対して係数が0でない項が多く,両者共に殆ど 同じ大きされなければ効果があまり出ません.
nとmを多項式の次数とすると,古典的な積ではn∗mのオーダーで計算を行いますが,fasttimes 函数を用いるとmax(n,m)1.585 のオーダーになります.
rootscontract函数は有理数次数の羃同士の積を大域変数rootsmodeの値に従って纏めます.例
えば,rootsmodeがtrueの場合,xˆ(1/2)*yˆ(3/2)の様な根同士の積をsqrt(x*yˆ3)に纏めます.
大域変数radexpandがtrueで大域変数domainがrealであれば,rootscontract函数はabsをsqrt に変換します.即ち,abs(x)*sqrt(y)をsqrt(xˆ2*y)に変換します.
rootscontract函数はlogcontract函数と似た手法でratsimp函数を用います.
有理式に関連する函数
¶ ³
combine(h式i) denom(h有理式i) num(h有理式i) ratdenom(h有理式i) ratnumer(h有理式i) ratdiff(h有理式i,h変数i)
µ ´
combine函数はh式iに含まれる和の部分式を同じ分母で纏めて一つの項にします.
denom函数はh有理式iの分母(DENOMinator)を返します. 尚,有理式が通常の多項式であれ
ば,1を返します.
(%i40) denom((x^2+1)/(y^2+1)/2);
2
(%o40) 2 (y + 1)
(%i41) denom(x^2+1);
(%o41) 1
(%i42) denom(1/2*x^2+1/2);
(%o42) 1
(%i43) denom((x^2+1)/2);
(%o43) 2
num函数は有理式の分子(NUMerator)を返します.
ratdenom函数はh有理式iの分母を計算します. h有理式iが一般形式で,結果も一般形式のも
のが必要ならば, denom函数を用いましょう.
ratnumer函数はh有理式iの分子を取り出します. 一般形式のh有理式iに対して,CRE表現の
結果が不要であれば, num函数を使いましょう.
ratdiff函数はh有理式iの微分をh変数iで行います.有理式に対してはdiff函数よりも処理が
速く,計算結果はCRE表現になります.尚,ratdiff函数は因子分解されたCRE表現には使ってはい けません. 因子分解された式では通常のdiff函数を使いましょう.
終結式に関連する函数
¶ ³
resultant(h多項式1i,h多項式2i,h変数i) bezout(h多項式1i,h多項式2i,h変数i)
eliminate([h方程式1i,h方程式2i,· · ·,h方程式ni],[h変数1i,h変数2i,· · ·,h変数ki])
µ ´
bezout函数は,h多項式1iとh多項式2iに対して, h変数iを主変数とした場合のある係数行列 を返します. この係数行列の行列式を取ると終結式に等しくなるものです.
この行列bezout(f,g,x)のdeterminantが多項式fとgの終結式になります. 従って,bezout函数 とdeterminant函数と組合せればresultant函数の代替になります.
resultant函数は二つの多項式h多項式1iとh多項式2iの終結式を計算し,指定したh変数iを消 去します.
ここで,多項式f とgの解を各々αi,βjとすると,多項式f とgの終結式res(f, g)は以下の式と 等しくなる事が知られています.
res(f, g) =anmbmn ∏
1≤i≤m,1≤j≤n
(αi−βj)
その為,終結式はh多項式1iとh多項式2iが共通の定数の因子を持つ場合に限って零になる多項 式となる事が判ります.
終結式の計算方法は,h多項式1iとh多項式2iを h変数iの多項式と看倣した場合の係数から構 成される行列の行列式から計算出来ます. 行列の大きさは,h多項式1iとh多項式piの次数を各々 m, nとすると,m+n次の正方行列となりますが,bezoutでは行列操作によって,それよりも小さ な行列が得られる場合には,その行列を表示します.
具体的には,多項式f と gを次のものとします.
f =
∑m i=0
aixi
g=
∑n i=0
bixi
すると,
resultant(f, g, x) = det
am am−1 · · · · · · a1 a0 · · · 0 ... . .. . .. . .. . .. ... 0 · · · am am−1 · · · · a1 a0 bn bn−1 · · · · · · b1 b0 · · · 0
... . .. . .. . .. . .. ... 0 · · · bn bn−1 · · · · b1 b0
で終結式は計算出来ます.尚,h多項式1i,h多項式2iが因子分解可能であればresultant函数を呼 び出す前にfactor函数を呼出すと良いでしょう.
eliminate函数は与えられた方程式,或いは零と等しいと仮定した式から続けて終結式を取る事
で,指定された変数の消去を行います. eliminate函数に引渡したk個のh変数1i,· · ·,h変数kiを消 去したn-k個の式のリストを返します. 最初のh変数1iは消去されてn-1個の式を生成し,h変数2i 以降も同様です.
k=nの場合,結果リストはk個のh変数1i,· · ·,h変数kiを持たない一つの式となります.そして 最後の変数に対応する終結式を解く為にsolve函数を呼出します.
(%i1) exp1:2*x^2+y*x+z;
2
(%o1) z + x y + 2 x
(%i2) exp2:3*x+5*y-z-1;
(%o2) - z + 5 y + 3 x - 1
(%i3) exp3:z^2+x-y^2+5;
2 2
(%o3) z - y + x + 5
(%i4) eliminate([exp3,exp2,exp1],[y,z]);
8 7 6 5
(%o4) [7425 x - 1170 x + 1299 x + 12076 x
4 3 2
+ 22887 x - 5154 x - 1291 x
+ 7688 x + 15376]
(%i5) eliminate([x+y=2,2*x+3*y-5=0],[x,y]);
(%o5) [1]
(%i6) eliminate([x+y=2,2*x+3*y-5=0],[x]);
(%o6) [y - 1]
(%i7) eliminate([x+y=2,2*x+3*y+5=0],[x]);
(%o7) [y + 9]
(%i8) eliminate([x+y=2,2*x+3*y+5=0],[x,y]);
(%o8) [- 9]
終結式のアルゴリスムを指定する大域変数
¶ ³
変数名 初期値 可能な値 resultant subres [subres, mod, red]
µ ´
大域変数resultantは同名のresultant函数による終結式の計算で用いるアルゴリズムを設定し
ます.指定可能なアルゴリズムを以下に示しておきます.
デフォルト subres モジュラー終結式アルゴリズム mod
縮約prs red
殆どの問題ではsubresが最適です.単変数の大きな次数や2変数問題ではmodがより良いで しょう.
共通因子を求める函数
¶ ³
gcd(h式1i,h式2i,h変数1i,· · ·) gcde(h多項式1i,h多項式2i,h変数i) gcdex(h多項式1i,h多項式2i) gcfactor(hGauss整数i) gfactor(h多項式i) gfactorsum(h多項式i)
ezgcd(h多項式1i,h多項式2i,· · ·)
content(h多項式i,h変数1i,· · ·,h変数ni)
µ ´
gcd函数は与えられた多項式の最大公約因子を計算します. このgcd函数は多くの函数,例え ば,ratsimp函数やfactor函数等でも利用されています.
gcd函数に直接影響を及ぼす大域変数として,同名の大域変数gcdがあります. この大域変数gcd はgcd函数で用いるアルゴリズムを決定する変数です.
大域変数gcdに設定可能な値
¶ ³
値 概要
subres 副終結式を利用(デフォルト値)
ez ezgcd函数を利用
eez eez gcdを利用
red 被約
spmod 剰余
false gcd函数は常に1を返却
µ ´
代数的整数を扱う場合,例えば,gcd(xˆ2-2*sqrt(2)*x+2,x-sqrt(2))のGCDを計算する為には,大 域変数のalgebraicがtrueであり,大域変数gcdがezとfalse以外の値でなければなりません.
同次多項式に対しては,gcd:subresを用いる事を推奨します.