第 2 章 Maxima のデータとその操作
2.2 多項式
2.2.6 tellrat 函数
より徹底して代数的整数を利用する場合はtellrat函数を用います.このtellrat函数は最小多項 式や等式にtellrat属性を設定するもので,ratsimp函数やratexpand函数で処理を行う際に大域変 数algebraicがtrueとなっていれば,その属性が処理に反映されます.
このtellrat函数は次の写像をMaximaに組込むものです.
tellrat(式) :M aximaの係数環→M aximaの係数環/⟨式⟩
但し,tellrat属性はCRE表現を扱うratexpand函数やratsimp函数で処理を行う時のみに反映 されます.
tellrat函数
¶ ³
tellrat(⟨monicな多項式⟩) tellrat(⟨等式⟩)
tellrat()
µ ´
引数として与えられる式は主変数に対してmonicな多項式に限定されます.これはtellrat函数 が代数的整数をMaximaに与える事を目的としているからです. 又,等式として与える場合に等式 の左辺は代数的整数の羃乗で係数が1のものに限定されます.この時,左辺の変数が主変数と看倣 され,右辺を左辺に移した式を最小多項式とする代数的整数が与えられます.従って,a2=c3−2を
tellrat函数に与えた場合, 主変数がaとなり,このaがMaximaに追加される代数的整数となり,
その最小多項式がa2−c3+ 2 で与えられます.ここでa2−c3+ 2を引数として与えると,主変数
はMaximaの項順序>mからcとなる為に代数的整数はc となる事に注意して下さい.
このtellrat函数は任意個の因子を取る事が可能です.
(%i22) tellrat(x^2+x+1);
2
(%o22) [x + x + 1]
(%i23) tellrat(y^3+y^2+y+1);
3 2 2
(%o23) [y + y + y + 1, x + x + 1]
(%i24) tellrat();
3 2 2
(%o24) [y + y + y + 1, x + x + 1]
(%i25)
tellratで最小多項式を導入しても即座には反映されません.先ず,代数的整数の簡易化を行う為
に大域変数algebraicをtrueに設定していなければなりません. それからratsimp等のCRE表現 が扱える函数で処理を行う必要があります.
例として,tellrat(aˆ2-2,bˆ2=cˆ4)と入力した場合を示します.
(%i11) tellrat(a^2-2,b^2=c^4);
2 4 2
(%o11) [b - c , a - 2]
(%i12) (a+2)^4,algebraic,expand;
4 3 2
(%o12) a + 8 a + 24 a + 32 a + 16
(%i13) (a+2)^4,algebraic,expand,ratsimp;
(%o13) 48 a + 68
(%i14) (b+c)^3,algebraic,expand,ratsimp;
5 4 3 2
(%o14) 3 c + b c + c + 3 b c
(%i15) (b+c)^3,expand,ratsimp;
3 2 2 3
(%o15) c + 3 b c + 3 b c + b
(%i16) algebraic:true;
(%o16) true
(%i17) ratexpand((b+c)^3);
5 4 3 2
(%o17) 3 c + b c + c + 3 b c
(%i18) expand((b+c)^3);
3 2 2 3
(%o18) c + 3 b c + 3 b c + b
この例で示す様に,tellratで設定した属性は大域変数algebraicをtrueに設定した環境下で,ratsimp
函数やratexpand函数等のCRE表現を内部で用いる函数で処理する時に反映されます.
尚,この例での(a+2)ˆ4,algebraic,expand,ratsimpといった表記は,ev函数の表記方法の一つで, ev((a+2)ˆ4,algebraic,expand,ratsimp)と同値です.
次に, tellrat(aˆ2-2,bˆ2=cˆ4); で代数的整数bを追加した為, ratexpand((b+c)ˆ3)で,bˆ2がcˆ4 で置換されている事に注意して下さい. この様に,多変数の多項式を用いて代数的整数を入れる場
合,通常はMaximaの項順序>m の影響を受ける為,等式の右辺に代数的整数の項を置きます. 例
えば,a=aˆ2+cˆ3やaˆ2=cˆ3-aの様にします.
ここで,tellrat函数を用いて多項式を被約する際に零因子で分母の有理化を試みない様に注意し なければなりません.
例えば,tellrat(wˆ3-1);algebraic:true;rat(1/(wˆ2-w))は零による割算になります.このエラーは ratalgdenom:falseに設定する事で回避出来ます.
tellrat函数で設定した属性はtellrat()で見る事が出来ます.この場合,引数は特に設定する必要
がありません.
untellrat函数
¶ ³
untellrat(⟨x⟩)
µ ´
tellrat函数で設定した属性はuntellrat函数を使えば削除出来ます. この場合,untellratで代数的 整数を直接指定します.
(%i36) tellrat(a^2-2,b^3-c^2);
2 3 2
(%o36) [c - b , a - 2]
(%i37) tellrat();
2 3 2
(%o37) [c - b , a - 2]
(%i38) untellrat(a);
2 3
(%o38) [c - b ]
(%i39) untellrat(b);
2 3
(%o39) [c - b ]
(%i40) untellrat(c);
(%o40) []
(%i41) tellrat(a^2-2,b^3=c^2);
3 2 2
(%o41) [b - c , a - 2]
(%i42) untellrat(c);
3 2 2
(%i43) untellrat(b);
2 (%o43)
次に,複数の変数に対してtellratとuntelratを実行した例を示します.
(%i21) tellrat(x^2+1,y^2+1);
2 2
(%o21) [y + 1, x + 1]
(%i22) ev(rat(x^3+1+y^3+y),algebraic);
(%o22)/R/ - x + 1
(%i23) untellrat(y);
2
(%o23) [x + 1]
(%i24) ev(rat(x^3+1+y^3+y),algebraic);
3
(%o24)/R/ y + y - x + 1
この例では変数x,yがx2+ 1 = 0とy2+ 1 = 0を満す代数的整数と設定しています. この様に複 数の変数に対して整係数多項式をtellratに入力する事も可能で, evでも的確に評価されています.
次にuntellrat(y)でyに関してのみ,tellratで設定した性質(yはy2+ 1 = 0を満す代数的整数) である事を除去しています.その後には,xに関する性質だけで評価が行われています.
尚,tellrat函数で入力可能な多項式は主変数に関してmonic(最高次項の係数が1)なものでなけ ればならなりません.又,多変数の場合,untellrat函数は主変数(maimvar)に対して行います.
(%i15) tellrat(x+y+z*y1);
Minimal polynomial must be monic
-- an error. Quitting. To debug this try debugmode(true);
(%i16) tellrat(x+y+z+1);
(%o16) [z + y + x + 1]
(%i17) untellrat(y);
(%o17) [z + y + x + 1]
(%i18) untellrat(z);
(%o18) []
(%i19) tellrat(2*x+y+z+1);
(%o19) [z + y + 2 x + 1]
(%i20) untellrat(z);
(%o20) []
この例で示す様に,x+y+z*y+1に関しては主変数がzで係数がyとなる為にエラーになります.
但し,2*x+y+z+1の様に主変数zがmonicでありさえすれば問題はありません.untellrat函数が主 変数のみに使える事も上の例から分ります.