• 検索結果がありません。

第 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)