第 9 章 多項式について
9.3 多項式に関する函数
72 第9章 多項式について ratweyl
デフォルト値:[]
weylの共役テンソル成分の簡易化を制御する大域変数の一つです.trueであれば成分は有理的に 簡易化されます.facratがtrueであれば結果は因子分解されたものになります.
ratwtlvl
デフォルト値:[false]
ratweight函数を用いた式を纏める際の有理式(CRE表現)の切捨ての制御で用いられます.尚,
デフォルト値がfalseであれば,切捨ては生じません.
resultant
デフォルト値:[subres]
終結式の計算で用いるアルゴリズムを設定します.指定可能なアルゴリズムを以下に示しておき ます.
デフォルト subres モジュラー終結式アルゴリズム mod
hline縮約prs red
殆どの問題では,subresが最適です.単変数の大きな次数や2変数問題では, modがより良いで しょう.
savefactors
デフォルト値:[false]
trueであれば,幾つかの同じ因子を含む後の式の展開の処理速度向上の為,式の各因子がある函 数で保存されます.
coeff
coeff(h式i,h変数i,h次数i)
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
combine
combine(h式i)
h式iに含まれる和の部分式を同じ分母で纏めて一つの項にします.
content
content(h多項式i,h変数1>,· · ·, <変数ni)
二成分のリストを返します.このリストは,h変数1iをh多項式iの主変数とした場合の各係数の 最大公約因子をリストの第一成分とし, 第二成分は第一成分で多項式を割ったもの(monicな多項 式)となります.
(%i43) content(2*x*y+4*x^2*y^2,y);
2
(%o43) [2 x, 2 x y + y]
denom
denom(h有理式i)
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
74 第9章 多項式について (%i43) denom((x^2+1)/2);
(%o43) 2
divide
divide(h多項式1i,h多項式2i,h変数1>,· · ·, <変数ni)
h多項式2iによるh多項式1iの商と剰余を計算します. 各多項式はh変数niを主変数とし,その 他の変数はratvars函数に現れるものとします.結果はリストで返却され,第一成分が商,第二成分 が剰余となります.
(c1) divide(x+y,x-y,x);
(d1) [1, 2 y]
(c2) divide(x+y,x-y);
(d2) [ - 1, 2 x]
eliminate
eliminate([h方程式1i,h方程式2>,· · ·, <方程式n>],[<変数1i,h変数2>,· · ·, <変数ki])
方程式(又は零と等しいと仮定した式)から続けて終結式を取る事で,指定された変数の消去を行
います. k個のh変数1 >,· · ·, <変数kiが消去されたn-k個の式のリストを返します.最初のh変 数1iは消去されてn-1個の式を生成し,h変数2i以降も同様です.k=nの場合,結果リストはk個の
h変数1>,· · ·, <変数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]
ezgcd
ezgcd(h多項式1i,h多項式2i,· · ·)
リストを返します.リストの成分は,先ず第一成分が全ての多項式のGCD (最大公約因子)とな り,残りの元がGCDで割った値になります. このezgcdではezgcdアルゴリズムが常用されてい ます.
factcomb
factcomb (h式i)
h式i中に現われる階乗の係数を階乗それ自体で置換して纏めます. 例えば,(n+1)*n!を(n+1)!
にする事です.ここで,sumsplitfact[true]がfalseに設定されていれば,minfactorialがfactcombの 後に適用されます.
factor
factor(h式i) factor(h式i,hpi)
h式iを整数上で既約因子に分解します.
factor(h式i,hpi)の場合,最小多項式がhpiとなる整数体上で式の因子分解を行います. 但し,大 域変数の設定によって動作が異なります.
• 大域変数factorflagがfalseの場合,有理式の整数部分の分解を抑制します. 大域変数dontfactor に変数リスト(デフォルト値は空)を設定し,その変数に対して因子分解を行わない様にして も構いません. dontfactorリストに含まれた変数よりも(CRE表現に仮定された変数の順序 を用いて)小さな任意の変数に対しても因子分解は実行されません.
• 大域変数savefactorsがtrueの場合,式の因子を幾つかの同じ因子を含む式の因子分解の処理
速度を向上させる為,函数で保存します.
• 大域変数berlefactがfalseの場合,kronecker因子分解アルゴリズムが使われ, そうでなけれ
ば,標準のberlekampアルゴリズムが使われます.
• intfaclimは大きな整数の引数分解を行う時に試みられる最大の約数となります. false(この
場合はfactorを明示的に呼び出した場合)に設定した場合,整数がfixnum(1機械語長に適合
するものです.尚,それ以外の数はbignumと呼ばれます)の場合には,整数の因数分解を試み
76 第9章 多項式について ます.intfaclimの設定では,内部に対しfactorの呼出に使われます.intfaclimをMaximaが大 きな整数の因数分解に長時間を費さない様に再設定しても構いません.
• 大域変数newfacがtrueの場合,新しい因子分解ルーチンを使います.
factorout
factorout(h式i,h変数1i,h変数2i,· · ·)
h式iをf(h変数1i,h変数2i,· · ·)∗gの形式の項の和に書換えます.ここで,gはfactoroutの引数 の各変数を含まない式の積で,fは因子分解されたものになります.
factorsum
factorsum(h式i)
グループ単位でh式iの因子分解を試みます.このグループの項はそれらの和が因子分解可能な ものです.expand((x+y)^2+(z+w)^2)の結果は復元可能ですが,expand((x+1)^2+(x+y)^2)の結 果は共通項が存在する為に復元出来ません.
(c1) (x+1)*((u+v)^2+a*(w+z)^2),expand;
2 2 2 2
(d1) a x z + a z + 2 a w x z + 2 a w z + a w x + v x
2 2 2 2
+ 2 u v x + u x + a w + v + 2 u v + u (c2) factorsum(%);
2 2
(d2) (x + 1) (a (z + w) + (v + u) )
fasttimes
fasttimes(h多項式1i,h多項式2i)
多項式の積に対する特殊なアルゴリズムを用いて,h多項式1iとh多項式2iの積を計算します.こ れらの多項式は,多変数で各次数に対して係数が0でない項が多く,両者共に殆ど同じ大きされな ければ効果があまり出ません.
nとmを多項式の次数とすると,古典的な積ではn*mのオーダーで計算を行いますが, fasttimes を用いるとmax(n,m)**1.585のオーダーとなります.
fullratsimp fullratsimp(h式i)
h式iに非有理式が含まれていれば,普通,簡易化した結果を返す際に,やや非力な非有理的(一般 的)簡易化に続いてratsimpを呼出します. 時には,その様な呼出しが一回以上必要であるかもしれ ません. fullratsimpは,この操作を簡易にしたものです.
fullratsimpは非有理的簡易化に続けてratsimpを式に変化が生じなくなる迄適用します.例えば,式
exp:(x^(a/2)+1)^2*(x^(a/2)-1)^2/(x^a-1)に対しては,ratsimp(exp)により(x^(2*a)-2*x^a+1)/(x^a-1) が得られ,fullratsimp(exp)を実行するとx^a-1が得られます.
fullratsimp(h式i,h変数1i,· · ·,h変数ni)
ratsimpとratと同様に一つ又はそれ以上の引数を取ります.
gcd
gcd (h式1i,h式2i,h変数1i,· · ·)
p1とp2の最大公約数を計算します.大域変数gcdで適用されるアルゴリズムを決めます.大域 変数gcdにez,eez,subres,redやspmodを設定する事で,ezgcd, 新しいeez gcd,副終結式prs,縮約 や剰余と云ったアルゴリズムが各々選択されます.
gcd:falseであれば,gcd(h式1i,h式2i,h変数1i)は全てのh変数iに対して常に1を返します.多く の函数(例えば,ratsimp,factor,等)はgcdを裏側で計算しています.
同次多項式に対しては,gcd:subresを用いる事を推奨します.
代数的整数の場合,例えば,gcd(x^2-2*sqrt(2)*x+2,x-sqrt(2))のgcdを計算する為には al-gebraicがtrueでなければならず,gcdがezであってはなりません.
subresは新しいアルゴリズムでred設定を用いている場合,それをsubresに変更すべきです
尚,大域変数gcdがfalseであれば,式がCRE表現に変換すると,最大公約因子を取らない様にな
ります.これはgcdが必要とされない場合には計算の高速化に繋がる事があります.
gcdex
gcdex(h多項式1i,h多項式2i,h変数i) gcdex(h多項式1i,h多項式2i)
3個の多項式を成分とするリスト[a,b,c]を返します.この多項式cは引数のh多項式1iとh多項 式2iの最大公約因子(gcd)で,多項式a,bはc=a∗ h多項式1i + b∗ h多項式2iを満すものです.
ここでのアルゴリズムはユークリッドの互除法に基くものです.
尚,多項式が単変数の場合はh変数iを指定する必要はありませんが,多変数の場合,多項式をh変 数iで指定した単変数の多項式と看倣してgcdを計算します.
何故,多変数多項式が相手の場合に,変数の指定を行う必要があるかと言えば,多変数多項式の場 合は,二つの多項式の最大公約因子が存在するとは限らないからです.
数学的には,最大公約因子は二つの多項式が生成するイデアルの生成元となります. 通常,多項式 の係数が実数や複素数で,考えている多項式が単変数のみ,即ち,多項式環k[x]であれば,任意のイ デアルは単項イデアル,即ち,一つの多項式だけで生成されるので,この場合は最大公約因子が必ず 存在します.
その為,多変数の場合には二つの多項式の主変数として変数を一つ選択する必要があります.但 し,その選択が妥当でなければ,gcdexは適当な答を返すだけです.
(%i16) gcdex(x^2+1,x^3+4);
2
x + 4 x - 1 x + 4 (%o16)/R/ [- ---, ---, 1]
17 17
(%i18) gcdex(x*(y+1),y^2-1,x);
78 第9章 多項式について 1
(%o18)/R/ [0, ---, 1]
2 y - 1 (%i19) gcdex(x*(y+1),y^2-1,y);
(%o19)/R/ [1, 0, x y + x]
ここで,最後の多変数の例で,gcdex(x*(y+1),y^2-1,x)の結果で, gcdとして1を返している事 に注意して下さい.この場合,多項式環k(y)[x]で処理を行っているので,共通の因子として期待さ れるy+1にはなりません. ここで,k(y)[x]はxを主変数としたxとyの多項式環,つまり,xの多項 式で, その係数がk上のyの多項式となるものとして,xとyのk[x,y]多項式を見直したものです.
一般的に可換環kがufdであれば,k[x]もufdになる事が知られています. その為,ユークリッドの 互除法が利用可能になるので,gcdexは必ず結果を返します.
gcdex(x*(y+1),yˆ 2-1,y);とすれば,多項式環k(x)[y]の話になるので1ではなくにならず,xy+x になります.但し,この返却値が良いものとは言い難いものがあります.
gcfactor
gcfactor(hGauss整数i)
Gauss整数上でhGauss整数iの因子分解を行います. 尚,Gauss整数とは,複素数a+biで,aと bが整数になります. 因子はaとbを非負とする事で正規化されています.
(%i56) gcfactor(5*%i+1);
(%o56) (1 + %i) (3 + 2 %i)
(%i57) gcfactor(2);
2
gfactor
gfactor(h多項式i)
Gauss整数上でh多項式iの因子分解を行ないます.これはfactor(exp,a^2+1)と同様の結果
を返します.
(%i3) gfactor(x^4-1);
(%o3) (x - 1) (x + 1) (x - %i) (x + %i) (%i4) factor(x^4-1,a^2+1);
(%o4) (x - 1) (x + 1) (x - a) (x + a) (%i5)
この例で,factorを用いたものでは方程式x2+ 1 = 0の解となる代数的整数a(=i)を用いてx^4-1 を因子分解しています.
gfactorsum
gfactorsum (h多項式i)
factorsumに似ていますが,factorの代りにgfactorが適用されます.
(%i58) gfactorsum(x^2+1);
(%o58) (x - %i) (x + %i)
(%i59) factor(x^2+1);
2
(%o59) x + 1
hipow
hipow (h多項式i,h変数i)
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
尚,hipowの逆の低い次数を検出する函数はlopowです.
lopow
lopow (h多項式i,h変数i)
h多項式iの部分式h変数iの次数で,明示的に現われものの中で最も低い次数を返します.
mod
mod (h多項式i) mod (h多項式i,h整数i)
h多項式iを大域変数modulusで指定した値に対する剰余を計算します. 尚,大域変数modulus はデフォルトではfalseの為,mod(h多項式i)を実行するとエラーになります.
大域変数modulusの値と無関係に,多項式の剰余を計算したければ, mod(h多項式i,h整数i)で h多項式iのh整数iによる剰余を計算します. 尚,大域変数modulusの値は変更されません.
num
num(h有理式i)
有理式の分子(NUMerator)を返します.
quotient
quotient (h多項式1i,h多項式2i,h変数1i,· · ·)
h多項式2iによるh多項式1iの割り算の商を計算します.