第 2 章 Maxima のデータとその操作
2.2 多項式
2.2.4 有理式の CRE 表現
有理式は多項式の分数ですが,有理式のCRE表現の表現は,多項式の分母と分子に共通因子が無 く,分母の筆頭項(leading term)の係数を正にしたものとなります.
以下に実例を示しましょう.
(%i1) r1: rat((y-1)/((y-x)*z^2+1));
y - 1
(%o1)/R/
---2 (y - x) z + 1 (%i2) r2: rat((y-1)/((x-y)*z^2+1));
y - 1
(%o2)/R/ -
---2 (y - x) z - 1 (%i3) r3:rat((y-1)/(-(y-z)*x^2+1));
y - 1
(%o3)/R/
---2 2
x z - x y + 1 (%i4) :lisp $r3;
((MRAT SIMP $(X $Y $Z) (X13180 Y13181 Z13182)) (Y13181 1 1 0 -1) Z13182 1 (X13180 2 1) 0 (Y13181 1 (X13180 2 -1) 0 1))
(%i4) t3:(y-1)/(-(y-z)*x^2+1);
y - 1
(%o4)
---2
x (z - y) + 1 (%i5) :lisp $t3;
((MTIMES SIMP)((MPLUS SIMP) -1 $Y)
((MPLUS SIMP) 1
((MTIMES SIMP)((MEXPT SIMP) $X 2)((MPLUS SIMP) ((MTIMES SIMP) -1 $Y) $Z)))
-1)) (%i5)
この例では変数順序>mが逆アルファベット順の為,変数の順序はz>my>mxになります.そ の為,zが主変数となり,式はzの多項式として纏められます.最初の二つの例では, (x-y)*zˆ2は,y
>mxとなる為に, -(y-x)*zˆ2に並び替えられてしまいます.この際に,最も順序の高い項となるy*
zˆ2の係数を正にする為に,必要に応じて-1がかけられています.この例で示す様に,式がCRE表 現,或いはCRE表現の部分式を含む場合,記号/R/が行ラベルに続きます.
:lisp $r3;でCRE表現の内部表現を表示しています.先頭のMRATでCRE表現である事を示
し,その後のリストで有理式の変数がX,Y,Z,これらの変数に対応する内部変数がX13180,Y13181
とZ1382である事を示しています.ここで内部変数はLISPのgensym函数で生成されるもので,後
ろの番号は生成順に付けられるものです. 尚,有理式の変数はMaximaのshowvar函数を使って取 り出す事が可能ですが,それらの変数に対応する内部変数はMaximaの内部変数のgenvarに登録 され,参照する場合には:lisp genvarの様にします.
又,変数リストの順版は順序>mに対して小さい順に左から並ぶ為,左端が最小で右端が主変数と なります.その為,この式ではZが主変数となります.この様な変数リストを含むリスト(MAT cdots) の後に分子となる式が来ます.この式は先頭がY13181の為,変数Yの多項式で,後の1 1 0 -1か ら次数が1でその係数が1の項と,次数が0で係数が-1である事が判ります.最後の副リストが分 母の式となり,先頭がZ13182となっているので,主変数Zの多項式である事が判ります. 以降,分 子の時と同じ様に読めば良いのです.但し,式はMaximaの変数順序>mに従って読む必要があり ます.
この例ではZ>mY>mXの順なので,変数Zが式中にあれば, Zの多項式として表現し,Zがな くて変数YがあればYの多項式,そして,変数ZとYの両方が無ければ変数Xの多項式と,帰納的 に解釈します.
これに対し,同じ多項式の一般表現を最後に示しますが,非常に長いものになっている事が判り ます.
尚,CRE表現で分母が整数の場合(CRE表現では,浮動小数点は有理数で近似されます),CRE表 現の内部表現は少し変化します.
(%i4) r1:rat((x-1)/5);
x - 1
(%o4)/R/
---5 (%i5) :lisp $r1;
((MRAT SIMP $(X) (X13157)) (X13157 1 1 0 -1) . 5)
この例で示す様に分子はx-1ですが,分子と分母の間に記号.が入っています. CRE表現では分 子と分母の間に,分母が整数の時に限って記号.を入れています. これはCRE表現の生成でLISP のcons函数が用いられている事を示しています. また変数Xの後に数値が入っていますが,これは LISP内部の処理で変数Xに対応するシンボルを生成した際に割当てられた通し番号です.
拡張CRE表現はtaylor級数を表現する為に用いられています.有理式の表記は正の整数では無
く,正か負の有理数となる様に拡張されており,係数はそれ自身, 多項式と云うよりは,上で記述し た様に有理式となっています. これらは内部的に再帰的な多項式形式によって表現され,多項式形 式はCRE表現に類似していますが,より一般化したものです.尚,切り捨てられる次数の様な情報 も追加されています.
式を表示する際に,拡張CRE表現の場合は記号/T/が式の行ラベルに続きます.
(%i1) t1:taylor(exp(x),x,0,5);
2 3 4 5
x x x x
(%o1)/T/ 1 + x + -- + -- + -- + --- + . . .
2 6 24 120
(%i2) :lisp $t1;
((MRAT SIMP (((MEXPT SIMP) $%E $X) $X) (%e^x13162 X13163) ($(X ((5 . 1)) 0 NIL X13163 . 2)) TRUNC)
PS (X13163 . 2) ((5 . 1)) ((0 . 1) 1 . 1) ((1 . 1) 1 . 1) ((2 . 1) 1 . 2) ((3 . 1) 1 . 6) ((4 . 1) 1 . 24) ((5 . 1) 1 . 120))
雰囲気はCRE表現に近いものですが,係数と羃のリストの書式がconsで結合されたリストであ り,他に,リストの第一成分にTaylor展開の様々な情報が追加されている事が判ります.
CRE表現変換に関連する大域変数
¶ ³
変数名 初期値 概要
keepfloat false 実係数の有理数への近似を制御
ratepsilon 2.0E-8 実係数の有理数近似する際の誤差を指定
ratalgdenom true 代数的整数を分母とする項の有理化を制御
ratprint true CRE表現変換時のメッセージを制御
µ ´
大域変数keepfloatがtrueであれば,浮動小数点を含む式がCRE表現に変換される際に,浮動小
数点が有理数に近似変換される事を防ぎます.尚,浮動小数点が有理数に近似される際に生じる誤 差はratepsilonで制御されます.
大域変数ratepsilonは式をCRE表現に変換する際に,係数を有理数に変換する時に用いられる
許容範囲となります.大域変数ratepsilonよりも小さな浮動小数点は無視されます.浮動小数点を 有理数に変換したくなければ,大域変数keepfloatをtrueに設定します.
(%o30) 2.0e-8 (%i31) ratsimp((1+2.0e-8)*x);
rat replaced 1.00000002 by 1//1 = 1.0
(%o31) x
(%i32) ratsimp((1+2.0e-7)*x);
rat replaced 1.0000002 by 5000001//5000000 = 1.0000002 5000001 x
(%o32)
---5000000
この例で示す様に,ratsimp函数を作用させた場合に大域変数ratepsilonよりも小さな数が無視さ れ,浮動小数点が有理数に変換されている事が判ります。
大域変数ratalgdenomは式中に代数的整数を項の分母として持つ式に対し,大域変数ratalgdenom
がtrueの場合に,その分母を有理化します.これを実行する為には,大域変数algebraicをtrueに設 定して,式をCRE表現に変換しておく必要があります.
(%i16) algebraic:true;
(%o16) true
(%i17) ratalgdenom:true;
(%o17) true
(%i18) rat(1/sqrt(2)*x^2+1);
2 sqrt(2) x + 2
(%o18)/R/
---2 (%i19) ratalgdenom:false;
(%o19) false
(%i20) rat(1/sqrt(2)*x^2+1);
2
x + sqrt(2)
(%o20)/R/
---sqrt(2)
この例で示す様に,大域変数algebraicと大域変数ratalgdenomを同時にtrueにすると,分母に
√2 を持つ式の分母が有理化されている事に注意して下さい.
大域変数ratprintがfalseであれば,浮動小数点の有理数への変換を報せるメッセージ出力を抑
制します.
CRE表現の式の処理に関連する大域変数
¶ ³
変数名 初期値 概要
ratdenomdivide true 分子の項の分離を制御
ratexpand false CRE表現の展開を制御
ratfac false CRE表現式の因子分解を制御
ratsimpexpons false ratsimpの自動実行を制御
ratwtlvl false 近似の際の切捨てを制御
ratweights [] 重みのリスト
rootsconmode true rootscontract函数を制御
µ ´
大域変数ratdenomdivideがfalseであれば,ratexpand函数を作用させた式に対して,分子の項を 分離する事を抑制します.
大域変数ratexpandがtrueであれば,それらが一般形式に変換されるか表示された時にCRE式
が展開されます.
大域変数ratfacがtrueであれば,CRE有理式に対して部分的に因子分解された形式で出力しま
す.有理的操作の間,factor函数を実際に呼ばずに,式を可能な限り因子分解します.これでメモリ空 間を節約し,計算時間を幾らかを節約します.有理式の分子と分母は互いに素とします.
例えば,rat((xˆ2 -1)ˆ4/(x+1)ˆ2)は(x-1)ˆ4*(x+1)ˆ2になりますが, 各部分の因子は互いに素と は限りません.
大域変数ratfacと大域変数ratweightsの手法は互換性が無いので,両者を同時に使っていけま
せん.
大域変数ratsimpexponsがtrueであれば,簡易化中に式の羃に対し,自動的にratsimp函数が実 行されます.
大域変数ratwtlvlはratweight函数を用いた式を纏める際に,CRE表現の切捨ての制御で用いら
れます.尚,デフォルト値がfalseであれば,切捨ては生じません.
大域変数ratweightsは ratweight函数で設定される指定された重みのリストです. 大域変数
ratweightsやratweight()函数でそのリストが見られます.
大域変数rootsconmodeはrootscontract函数の挙動を定めます.大域変数rootsconmodeがfalse
の分母が割切れる羃だけを纏めますallの場合,全ての有理次数の分母のLCMを取って纏めます.
式 rootsconmode rootscontractの結果
xˆ(1/2)∗yˆ(3/2) false (x∗yˆ3)ˆ(1/2)
xˆ(1/2)∗yˆ(1/4) false xˆ(1/2)∗yˆ(1/4) xˆ(1/2)∗yˆ(1/4) true (x∗yˆ(1/2))ˆ(1/2)
xˆ(1/2)∗yˆ(1/3) true xˆ(1/2)∗yˆ(1/3)
xˆ(1/2)∗yˆ(1/4) all (xˆ2∗y)ˆ(1/4)
xˆ(1/2)∗yˆ(1/3) all (xˆ3∗yˆ2)ˆ(1/6)