[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4. 多項式

4.1 多項式について  
4.2 多項式に関する諸定義  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 多項式について

MAXIMAで多項式は一般形式か正規有理式(Cannonical Rational Expressions,CRE)形式 で蓄えられる。後者は標準的な形式でfactorやratsimp等々の操作で内部的に利用され る。

正規有理式は本質的に展開された多項式や有理関数(RATFAC[FALSE]がTRUEに設定され た時には部分因子分解された多項式や有理関数にとっても同様)に適した表現で構成さ れている。このCRE形式では(最大から最小の主)変数の順序は個々の式で仮定されてい る。多項式は主変数で構成されたリストから再帰的に表現されており、その主変数は 式の対の列、つまり、多項式の各項に対応する式が後に続いたものである。最初の対 の要素は項の主変数の次数、第二の要素は項の係数で、その係数は数値や他の変数 からこの形式で構成された多項式である。それ故、3*X^2-1のCRE形式の主部は (X 2 3 0 -1)であり、2*X*Y+X-3はYを主変数とすれば(Y 1 (X 1 2) 0 (X 1 1 0 -3)) となり、Xを主変数とすれば(X 1 (Y 1 2 0 1) 0 -3)となる。"主変数"性は通常は 逆アルファベットの順で決められている。CRE式の"変数"は原子である必要は無い。 実際、主演算子が+ - * / や整数羃を持つ^となる任意の部分式は、それが現われる 式(CRE形式)の"変数"として考えられる。例えば、式X+SIN(X+1)+2*SQRT(X)+1の CRE変数はX,SQRT(X)とSIN(X+1)となる。利用者が変数の順序をRATVARS関数で指定しな かった場合、MACSYMAはアルファベット順で選ぶ。一般的にCRE有理式の表現は、即ち、 多項式の分数であり、分母と分子に共通因子が無く、分母が正のものである。内部 形式は本質的に変数の順序リストで順序が上とされた多項式の対(分子と分母)である。

表示する式がCRE形式やCRE形式の任意の部分式を含む場合、記号/R/が行ラベルに続く。 式のCRE形式への変換についてはRAT関数を見よ。拡張CRE形式はTaylor級数を表現する 為に用いられる。有理式の表記は正の整数では無く、正か負の有理数となる様に拡張 されており、係数はそれ自身、多項式と云うよりは、上で記述した様に有理式となって いる。これらは内部的に再帰的な多項式形式によって表現され、この多項式形式は CRE形式に類似しており、一般化したものであるが、切り捨てられる次数の様な情報が 追加されている。CRE形式の場合の様に、記号/T/が式の行ラベルに続く。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2 多項式に関する諸定義

変数: ALGEBRAIC
デフォルト値:[FALSE] - 代数的整数の簡易化を行う場合はTRUEに設定されていな ければならない。

(* 訳者注:

代数的整数とは最高次数の係数が1となる整数係数多項式方程式の解となる数である。 これに対し、代数的数とは有理数係数多項式の解になる数である。例えば、純虚数iや sqrt(2)の様な数は代数的整数であり、代数的整数と有理数は代数的数になる。

*)

変数: BERLEFACT
デフォルト値:[TRUE] - FALSEであれば、Kronecherの因子分解アルゴリズムが利用 され、それ以外ではデフォルトのBerlekampアルゴリズムが使われる。

関数: BEZOUT (p1, p2, var)
RESULTANT命令の代替で行列を返す。この行列のDETERMINANTが求める終結式である。

関数: BOTHCOEF (exp, var)
リストを返し、その第一項がexpの中にあるvarの係数(expがCRE形式であればRATCOEF、 それ以外はCOEFFで見つけたもの)である。そして、第二項がexpの残りの部分である。 つまり、[A,B]を結果とすれば、exp=A*var+Bとなる。
 
(C1) ISLINEAR(EXP,VAR):=BLOCK([C],
        C:BOTHCOEF(RAT(EXP,VAR),VAR),
        IS(FREEOF(VAR,C) AND C[1]#0))$
(C2) ISLINEAR((R**2-(X-R)**2)/X,X);
(D2)                              TRUE

関数: COEFF (exp, v, n)
expに含まれるv**nの係数を求める。nを省略するとnは1とされる。vは原子かexpの真 の部分式、例えば、X,SIN(X),A[I+1],X+Y等である。(後者の場合、式(X+Y)がexpの中 に現れていなければならない)。又、v^nを正確に求める為に、expの展開、又は因子 分解が必要な場合もある。これはCOEFFで自動的に実行されない。
 
(C1) COEFF(2*A*TAN(X)+TAN(X)+B=5*TAN(X)+3,TAN(X));
(D1)                         2 A + 1 = 5
(C2) COEFF(Y+X*%E**X+1,X,0);
(D2)                            Y + 1

関数: COMBINE (exp)
expの和を同じ分母で項を纏めて一つの項に簡易化する。

関数: CONTENT (p1, var1, ..., varn)
リストを返し、そのリストの元は変数varn(これを多項式の主変数とする)の多項式p1 に対して係数の最大公約因子が第一成分となり、第二成分が多項式p1を変数で割った 値である。

 
(C1) CONTENT(2*X*Y+4*X**2*Y**2,Y);
(D1)            [2*X, 2*X*Y**2+Y].

関数: DENOM (exp)
有理式expの分母を返す。

関数: DIVIDE (p1, p2, var1, ..., varn)
多項式p2によるp1の商と剰余を計算する。ここで多項式はvarnを主変数とし、varnの 他の変数はRATVARS関数に現れるものとする。結果はリストであり、その第一成分が商、 第二成分がその剰余となる。
 
(C1) DIVIDE(X+Y,X-Y,X);
(D1)                        [1, 2 Y]
(C2) DIVIDE(X+Y,X-Y);
(D2)                      [ - 1, 2 X]

(注:YはC2の主変数である。)

 
(* 訳者注:

(C93) divide(x^3*y^2*z+2*y^3*z^2*x+3*z^3*x^2*y,x+y+z,x,y,z);
          2    2         3      2  2      3             4    2  3      3  2
(D93) [3 x  y z  + (2 x y  - 3 x  y  - 3 x  y) z - 2 x y  + x  y  + 7 x  y

                             4         5    2  4      3  3       4  2      5
                        + 3 x  y, 2 x y  + x  y  - 8 x  y  - 10 x  y  - 3 x  y]
(C94) divide(x^3*y^2*z+2*y^3*z^2*x+3*z^3*x^2*y,x+y+z,y,x,z);
          2    2         3      2  2      3             4    2  3      3  2
(D94) [3 x  y z  + (2 x y  - 3 x  y  - 3 x  y) z - 2 x y  + x  y  + 7 x  y

                             4         5    2  4      3  3       4  2      5
                        + 3 x  y, 2 x y  + x  y  - 8 x  y  - 10 x  y  - 3 x  y]
(C95) 

この例でvar1,var2に対応するx,yの順番を入れ換えているが、zが主変数となる他は結果
の表示に違いが無い。

*)

関数: ELIMINATE ([eq1,eq2,...,eqn],[v1,v2,...,vk])
方程式(又は零と等しいと仮定した式)から続けて終結式を取る事により変数の消去を 行う。これはk個の変数v1,...,vkが消去されたn-k個の式のリストを返す。最初のv1は 消去されてn-1個の式を生成し、v2以降も同様である。もしk=nであれば、結果のリスト はk個の変数v1,..,vkを持たない一つの式となる。この場合、SOLVEが最後の変数に対す る終結式を解く為に呼出される。

 
例:

(C1) EXP1:2*X^2+Y*X+Z;
                                    2
(D1)                   Z + X Y + 2 X
(C2) EXP2:3*X+5*Y-Z-1;
(D2)                - Z + 5 Y + 3 X - 1
(C3) EXP3:Z^2+X-Y^2+5;
                       2    2
(D3)                  Z  - Y  + X + 5
(C4) ELIMINATE([EXP3,EXP2,EXP1],[Y,Z]);
            8         7         6          5          4
(D3) [7425 X  - 1170 X  + 1299 X  + 12076 X  + 22887 X
                               3         2
                       - 5154 X  - 1291 X  + 7688 X + 15376]

 
(* 訳者注:

もっと簡単な例

(C4) eliminate([x+y=2,2*x+3*y-5=0],[x,y]);
(D4)                                  [1]
(C5) eliminate([x+y=2,2*x+3*y-5=0],[x]);
(D5)                                [y - 1]
(C6) eliminate([x+y=2,2*x+3*y+5=0],[x]);
(D6)                                [y + 9]
(C7) eliminate([x+y=2,2*x+3*y+5=0],[x,y]);
(D7)                                 [- 9]
*)

関数: EZGCD (p1, p2, ...)
リストを返し、最初の元が多項式p1,p2,..のg.c.d(最大公約因子)であり、残りの元が g.c.dで割った値である。このEZGCDでは常にEZGCDアルゴリズムが利用されている。

変数: FACEXPAND
デフォルト値:[TRUE] - FACTORで返された既約因子が展開された形式(デフォルト)か、 再帰的(通常のCRE)形式であるかを制御する。

関数: FACTCOMB (exp)
expに中に現われる階乗の係数を階乗それ自体で置換して纏める。例えば、(N+1)*N!を (N+1)!にする。SUMSPLITFACT[TRUE]がFALSEに設定されていれば、MINFACTORIALが FACTCOMBの後に適用される。
 
(C1) (N+1)^B*N!^B;
                                      B   B
(D1)                           (N + 1)  N!
(C2) FACTCOMB(%);                                         

関数: FACTOR (exp)
任意の数の変数や関数を含む式expを整数上の既約因子に分解する。FACTOR(exp,p)は、 その最小多項式がpとなる整数体上でexpの因子分解を行う。

例はEXAMPLE(FACTOR);を実行せよ。

変数: FACTORFLAG
デフォルト値:[FALSE] - FALSEであれば有理式に含まれる整数の因数分解を抑制する。

関数: FACTOROUT (exp,var1,var2,...)
和expをf(var1,var12,...)*gの形式の項の和に並び換える。ここで、gはvariを含ま ない式の積であり、fは因子分解されたものである。

関数: FACTORSUM (exp)
グループ単位でexpの因子分解を試みる。このグループの項はそれらの和が因子分解可能 なものである。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 (p1, p2)
多項式の積に対する特殊なアルゴリズムを用いて、多項式p1とp2の積を計算する。 それらは多変数で密、そして殆ど同じ大きされなければならない。古典的な積では オーダーはN*Mとなる。ここでNとMは次数である。FASTTIMESはMAX(N,M)**1.585の オーダーである。

関数: FULLRATSIMP (exp)
非有理式が含まれていると、普通、簡易化した結果を返すにはやや非力な非有理的 ("一般的")簡易化に続いて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となる。 ((X^(A/2))^4-2*(X^(A/2))^2+1)/(X^A-1)を返すRAT(EXP);を見れば、その問題が分る だろう。

FULLRATSIMP(exp,var1,...,varn)はRATSIMPとRATと同様に一つ又はそれ以上の引数を 取る。

関数: FULLRATSUBST (a,b,c)
RATSUBSTと同じだが、結果が変化しなくなる迄、自分自身を結果に対して再帰的に 呼出す。この関数は、式の置き換えや置き換えられた式が一つ又はそれ以上の変数を 共通に持つ場合に便利である。FULLRATSUBSTはLRATSUBSTの書式の引数を許容する。 つまり、最初の引数は単一の代入方程式かその様な方程式のリストで良く、第二の引数 は仮定された式である。DEMO("lrats.dem");でデモが利用可能である。

関数: GCD (p1, p2, var1, ...)
p1とp2の最大公約数を計算する。フラグGCD[SPMOD]で適用されるアルゴリズムを決め る。GCDにEZ,EEZ,SUBRES,REDやSPMODを設定する事で、EZGCD,新しいEEZ GCD,副終結式 PRS,縮約や剰余と云ったアルゴリズムが各々選択される。

GCD:FALSEであれば、GCD(p1,p2,var)は全てのvarに対して常に1を返す。多くの関数 (例えば、RATSIMP,FACTOR,等)はGCDを裏側で計算している。同次多項式に対しては、 GCD:SUBRESを用いる事を推奨する。代数的整数の場合、例えば、 GCD(X^2-2*SQRT(2)*X+2,X-SQRT(2));のGCDを計算する為にはALGEBRAICがTRUEでなけれ ばならず、GCDがEZであってはならない。

SUBRESは新しいアルゴリズムでRED設定を用いている場合、それをSUBRESに変更すべき である。

デフォルト値:[SUBRES]のGCDフラグがFALSEであれば、式がCRE形式に変換された時に 最大公約因子を取らない様にする。これはGCDが必要とされない場合には計算の高速化 に繋がる事がある。

関数: GCDEX (f,g)
関数: GCDEX (f,g,var)
リスト[a,b,c]を返す。ここでuはfとgのGCD(最大公約元)で、u=a*f + b*gとなる。 引数fとgは1変数多項式かVARを変数とする多項式でなければならない。 何故なら、この操作の為には主イデアル整域でなければならないからである。

 
(* 訳者注:

イデアルIが主イデアル整域であるとは任意のイデアルが単項イデアル(生成元が
唯一のイデアル)となる整域(零因子を持たない可換環の事)である。詳細は代数学の
教科書等を参照せよ。尚、主イデアル整域は一意分解領域(UFD)、つまり、任意の
単元(逆元を持つ元)を除く元は置換を除いて一意に素元の積(任意の元a,bに対し、
その積a*bがpで割切れるなら、必ずa又はbがpで割切れる様な元p、整数での素数の
一般化概念)の積で表わされる事が知られており、特に、UFDでは後述のユークリッド
の互除法が意味を持つ 

*)

アルゴリズムは単純なユークリッドの互除法である。つまり、多項式の列 lis[i]:[a[i],b[i],r[i]] ..で、それらは全て[f,g,-1]に直交し (* 訳者注:ここで直交するとは、a[i]*f+b[i]*g-r[i]=0となる事 *)、次のものは、 q = quotient(r[i]/r[i+1])とすると、lis[i+2]:lis[i]-q*lis[i+1] となり、lis[i+1]で終了するのはr[i+2]が零になる時である。

 
(C1) gcdex(x^2+1,x^3+4);
                              2
                             x  + 4 x - 1  x + 4
(D1)/R/                   [- ------------, -----, 1]
                                  17        17

(C2) d1.[x^2+1,x^3+4,-1];
(D2)                                   0

次のGCDは1である事に注意する。何故なら、多項式環k(y)[x]で処理 を行っているので、多項式環k[y,x]で期待されるy+1にはならない。

 
(* 訳者注:

k(y)[x]xを主変数としたxyの多項式環、つまり、xの多項式で、その係数が
k上のyの多項式となるものとして、xyk[x,y]多項式を見直したものである。
一般的に可換環kUFDであれば、k[X]UFDである。
*)

 
(C4) gcdex(x*(y+1),y^2-1,x);

                                      1
(D4)                            [0, ------, 1]
                                     2
                                    y  - 1

(* 訳者注:
gcdex(x*(y+1),y^2-1,y);とすれば、多項式環k(x)[y]の話になるので1にならず、
xy+xになる。

(C22) gcdex(x*(y+1),y^2-1,y);
(D22)/R/                        [1, 0, x y + x]

x*y + x <-> x*(y+1) -> y+1の倍数(xは多項式環k(x)[y]では係数になる)。
*)

関数: GCFACTOR (n)
ガウス整数上でガウス整数nの因子分解を行う。つまり、a+b iの形式の数で、aとbが 有理的整数(つまり、通常の整数)のものである。因子はaとbを非負とする事で正規化 されている。

関数: GFACTOR (exp)
Gaussの整数(つまり、SQRT(-1)=%Iを付けたもの)上で多項式expの因子分解を行う。 これはFACTOR(exp,A**2+1)と似ている。ここで、Aは%Iとなる。
 
(C1)  GFACTOR(X**4-1);
(D1)        (X - 1) (X + 1) (X + %I) (X - %I)

 
(*訳者注:

factorで同様の処理を行う;

(C2) factor(x^4+1,a**2+1);
                                 2        2
(D2)                          (x  - A) (x  + A)
(C3) factor(x^4+1,a**4+1);
                                            3        3
(D3)                  (x - A) (x + A) (x - A ) (x + A )

(C2)ではaを方程式x^2+1=0の根として、式x^4+1の1を-a^2で置換えた式の因子分解を
行っている。又、(C3)でも同様に、aを方程式x^4+1=0の根として、式x^4+1の1を-a^4
で置換えて計算している。

*) 

関数: GFACTORSUM (exp)
FACTORSUMに似ているが、FACTORの代りにGFACTORが適用される。

関数: HIPOW (exp, v)
expの明示的な最大の指数。HIPOWで自動的に展開が行われない為にexpを展開する必要 がある。例えば、HIPOW(Y**3*X**2+X*Y**4,X)は2となる。

 
(*訳者注:

(C1) hipow((x+1)^4,x);

(D1)                                  1
(C2)  hipow(expand((x+1)^4),x);

(D2)                                  4

この様に、expandを行なわないと正しい値を計算しない。
*)

変数: INTFACLIM
デフォルト値:[1000] - 大きな整数の因子分解を行う時に試す最大の約数。FALSE (利用者がFACTORを明示的に呼び出す場合)に指定した場合や、整数がfixnum(つまり、 一つの機械語長に適合)の場合、整数の完全な因子分解が試みられる。 INTFACLIMの利用者の設定はFACTORに対する内部呼び出しで用いられる。INTFACLIMは MACSYMAが大きな整数の因子分解に尋常でない長い時間を費すのを防ぐ為に再設定して も良い。

変数: KEEPFLOAT
デフォルト値:[FALSE] - TRUEであれば、式が浮動小数点数を含み、CRE形式に変換さ れる時に浮動小数点数が有理化されるのを防ぐ。

関数: LRATSUBST (list,exp)
SUBST(list_of_equations.exp)と類似しているが、RSTSUBSTがSUBSTの代りに使われる 点で異なる。LRATSUBSTの最初の因子は方程式か方程式のリストで、 SUBST(DESCRIBE(SUBST);を見よ)によって得られる書式と同一のものでなければなら ない。代入は方程式のリストによって与えられた順序、即ち、左から右へと処理され る。デモはDEMO("lrats.dem");を実行せよ。

変数: MODULUS
デフォルト値:[FALSE] - 正の素数pが設定されていれば、全ての有理関数ルーチンの 演算はpの剰余で実行される。つまり、絶対値でp/2よりも小さな全ての整数は被約 される(p=2であれば、全ての整数は1か0に被約される)。これは所謂、"釣合の取れた" 剰余系であり、例えば、N MOD 5 = -2,-1,0,1か2となる。

警告:MODULUSを再設定した時点でEXPが既にCRE形式であれば、正しい結果を得る為に、 EXPに再びRATを作用させる必要がある。例えば、EXP:RAT(RATDISPREP(EXP))とする。 (MODULEに正の非素数が設定されていれば、この設定は採用されるものの警告が出る)

変数: NEWFAC
デフォルト値:[FALSE] - TRUEであれば、FACTORは新しい因子分解ルーチンを用いる。

関数: NUM (exp)
分子、有理式exp=exp1/exp2の分子exp1を得る。

関数: QUOTIENT (p1, p2, var1, ...)
多項式p2による多項式p1の割り算の商を計算する。

関数: RAT (exp, v1, ..., vn)
expをCRE形式に展開して変換を行い、全ての項を共通の分母で纏め、浮動小数点を許容 範囲RATEPSILON[2.0E-8]以内で有理数に変換するのと同様に分子と分母の最大公約因子 を除去する。もし、指定されていれば、変数はRATVARSにてv1,...,vnで順序付けられて いる。RATは一般的に関数を+,-,*,/と羃乗の他は簡易化しない。CER形式での原子(数と 名前)は一般形式のそれらとは異なる。それ故、0と異なる内部表現を持つRAT(0)で、 RAT(X)-Xは計算される。

 
(C1) ((X-2*Y)**4/(X**2-4*Y**2)**2+1)*(Y+A)*(2*Y+X)
        /(4*Y**2+X**2);
                                           4
                                  (X - 2 Y)
              (Y + A) (2 Y + X) (------------ + 1)
                                   2      2 2
                                 (X  - 4 Y )
(D1)          ------------------------------------
                              2    2
                           4 Y  + X
(C2) RAT(%,Y,A,X);
                            2 A + 2 Y
(D2)/R/                     ---------
                             X + 2 Y


変数: RATALGDENOM
デフォルト値:[TRUE] - TRUEであれば、分母wrtの有理化を許容する。これを実行する 為には、代数モードでCRE形式を利用しなければならない。

関数: RATCOEF (exp, v, n)
式expの式v**nの係数Cを返す。もし、nが1であれば、nを省略しても良い。Cはvに含ま れる変数を含まない(非有理的な意味で)ものである

この種類の係数が存在しなければ零が返される。RATCOEFは展開や、有理数として、 その最初の引数を簡易化し、純粋に構文的なCOEFのそれらと異った答を生成する。 ここで、RATCOEFF((X+1)Y+X,X)は(Y+1)/Yを返すが、COEFFは1を返す。

RATCOEF(exp,v,0)は、expを和として見て、vを含まない項の和を与える。それ故、 vが任意の負の羃に含まれるのであれば、RATCOEFは使ってはならない。expはそれを 実行する前に有理的に簡易化されていれば、係数は、それらが予見された様に現れ ないかもしれない。

 
(C1) S:A*X+B*X+5$
(C2) RATCOEF(S,A+B);
(D2)               X

関数: RATDENOM (exp)
有理式expの分母を得る。expが一般形式であれば、CRE形式の結果を望むので無い限り、 DEM関数を代りに使うべきである。

変数: RATDENOMDIVIDE
デフォルト値:[TRUE] - FALSEであれば、RATEXPANDを作用させた式に対し、分子の 項を分離する事を止める。

関数: RATDIFF (exp, var)
有理式exp(これは変数varの多項式の分数か多項式でなければならない)の微分をvar に対して行う。分数式に対してはDIFFよりももっと処理が速い。結果はCRE形式で左に なる。しかしながら、RATDIFFは因子分解されたCRE形式に使ってはならない。その様 な式では代りにDIFFを使う。

 
(C1) (4*X**3+10*X-11)/(X**5+5);
                                         3
                                      4 X  + 10 X - 11
(D1)                                  ----------------
                                            5
                                           X  
(C2) MODULUS:3$
(C3) MOD(D1);
                                2
                               X  + X - 1
(D3)                      --------------------
                           4    3    2
                          X  + X  + X  + X + 1
(C4) RATDIFF(D1,X);
                          5    4    3
                         X  - X  - X  + X - 1
(D4)                ------------------------------
                     8    7    5    4    3
                    X  - X  + X  - X  + X  - X + 1

関数: RATDISREP (exp)
CRE形式から一般形式に引数を変更する。"伝染"を止めたり、非有理的な文脈(context) の中で有理関数を利用する場合、これは時々便利である。殆どのCRE関数はCREと非CRE式 に対して作用するが、答は異った形式を取る。RATDISREPが引数に対して非CRE形式で 与えられると、引数は変更されないで返される。TOTALDISREPも見よ。

変数: RATEPSILON
デフォルト値:[2.0E-8] - 浮動小数点数を有理数に変換する際に用いられる許容範囲。

関数: RATEXPAND (exp)
和の積や指数の和を掛け、共通の分子で因子を纏め、分子と分母の共通約数を通分し、 分子を分母によって割られた項へと分割してexpの展開を行う。これはexpをCRE形式に 変換し、それからを一般形式に戻して達成している。

 
(C1) RATEXPAND((2*X-3*Y)**3);
                3         2       2        3
(D1)      - 27 Y  + 54 X Y  - 36 X  Y + 8 X
(C2) (X-1)/(X+1)**2+1/(X-1);
                              X - 1       1
(D2)                         -------- + -----
                                    2   X - 1
                             (X + 1)
(C3) EXPAND(D2);
                         X              1           1
(D3)                ------------ - ------------ + -----
                     2              2             X - 1
                    X  + 2 X + 1   X  + 2 X + 1
(C4) RATEXPAND(D2);
                             2
                          2 X                 2
(D4)                 --------------- + ---------------
                      3    2            3    2
                     X  + X  - X - 1   X  + X  - X - 1


変数: RATFAC
デフォルト値:[FALSE] - TRUEであれば、CRE有理式に対して部分的に因子分解された 形式を出力する。有理的操作の間、FACTORパッケージを実際に呼ばずに、式を可能な 限り因子分解する。これでメモリ空間を節約し、幾らか計算時間を節約する。分子と 分母は互いに素のままとする。例えば、RAT((X^2 -1)^4/(X+1)^2);は (X-1)^4*(X+1)^2となるが、各部分の因子は互いに素とは限らない。

CTENSR(Component Tensor Manipulation)パッケージでは、RATFACがTRUEであれば Ricci,Einsten,RiemannとWeylテンソルとスカラ曲率が自動的に因子分解される。 ** これはテンソルの成分が幾つかの項で構成されている事が判っている場合に 対してのみ設定すべきである。

注意:RATFACとRATWEIGHTの手法は互換性が無く、両者を同時に使ってはならない。

関数: RATNUMER (exp)
有理式expの分子を得る。もし、expが一般形式で、CRE形式の結果を望まない限り、 NUM関数がその代りに使われる。

関数: RATNUMP (exp)
expが有理数(整数を含む)であればTRUE、それ以外はFALSE。

関数: RATP (exp)
expがCREか拡張CRE形式であればTRUE、それ以外はFALSEとなる。

変数: RATPRINT
デフォルト値:[TRUE] - FALSEであれば、利用者に浮動小数点数の有理数への変換を 報せるメッセージ出力を抑える。

関数: RATSIMP (exp)
非有理的関数に対して、有理的に式expとその部分式の全てを引数も含めて (RATEXPANDの様に)簡易化する。結果は二つの多項式の商として、再帰的形式で返さ れる。つまり、その主変数の係数は他の変数の多項式である。変数はRATEXPANDの様に 非有理的関数(例えば、SIN(X**2+1))を含むが、RATSIMPで非有理的関数に対する引数 は有理的に簡易化される。RATSIMPはRATEXPANDに影響を与える幾つかの変数の影響を 受ける事に注意せよ。

 
(C1) SIN(X/(X^2+X))=%E^((LOG(X)+1)**2-LOG(X)**2);
                                           2          2
                    X          (LOG(X) + 1)  - LOG (X)
(D1)          SIN(------) = %E
                   2
                  X  + X
(C2) RATSIMP(%);
                                  1          2
(D2)                        SIN(-----) = %E X
                                X + 1
(C3) ((X-1)**(3/2)-(X+1)*SQRT(X-1))/SQRT((X-1)*(X+1));
                       3/2
                (X - 1)    - SQRT(X - 1) (X + 1)
(D3)            --------------------------------
                    SQRT(X - 1) SQRT(X + 1)
(C4) RATSIMP(%);
                                 2
(D4)                      - -----------
                            SQRT(X + 1)
(C5)  X**(A+1/A),RATSIMPEXPONS:TRUE;
                    2
                   A  + 1
                   ------
                     A
(D5)              X


変数: RATSIMPEXPONS
デフォルト値:[FALSE] - TRUEであれば、簡易化の最中で式の羃に対して自動的に RATSIMPが実行される。

関数: RATSUBST (a, b, c)
cに含まれるbにaを代入する。bは和、積、羃等であって良い。SUBSTが単に構文的な 代入を行うところで、RATSUBSTは式が何を意味するか判っている。その為、 SUBST(A,X+Y,X+Y+Z)はX+Y+Zを返すものの、RATSUBSTはZ+Aを返す

RADSUBSTFLAG[FALSE] TRUEであれば、RATSUBSTがXにUをSQRT(X)として代入する事を 許容する。

 
(*訳者注:

(C1)  RADSUBSTFLAG:FALSE;

(D1)                                FALSE
(C2)  ratsubst(u,sqrt(x),x);

(D2)                                  x
(C3) RADSUBSTFLAG:TRUE;

(D3)                                TRUE
(C4)  ratsubst(u,sqrt(x),x);

                                       2
(D4)                                 u

この様にRATSUBSTFLAGがTRUEでないとSQRT(X)がXに代入されない。
*)
例はEXAMPLE(RATSUBST);を実行せよ。

関数: RATVARS (var1, var2, ..., varn)
n個の引数でリストを構成する。RATVARSを実行した後の有理式で、そのリスト中の 一番右側の変数varnが有理式にあれば、それを有理式の主変数とし、他の変数の順序 はその順番に従う。ある変数がRATVARSリストから抜けていれば、一番左側の変数var1 よりも低い順序が付けられる。

RATVARSに対する引数は変数か非有理的関数(例えば、SIN(X))のどちらかでなければ ならない。RATVARS変数はこの関数に対して与えられた引数のリストである。

関数: RATWEIGHT (v1, w1, ..., vn, wn)
重みwiを変数viに対して割当てる。その重みが変数RAYWTLVLの値[デフォルト値は FALSEで、切捨てなしを意味する]を超過した場合、項が0で置き換えられる。 項の重みは項の中の変数の羃を重みに掛けた積の和である。つまり、3*v1**2*v2では 2*w1+w2となる。この切捨ては、式のCRE形式の積や羃乗を実行する時のみに生じる。

 
(C5) RATWEIGHT(A,1,B,1);
(D5)                         [[B, 1], [A, 1]]
(C6) EXP1:RAT(A+B+1)$
(C7) %**2;
                      2                  2
(D7)/R/              B  + (2 A + 2) B + A  + 2 A + 1
(C8) RATWTLVL:1$
(C9) EXP1**2;
(D9)/R/                       2 B + 2 A + 1

注意:RATFACとRATWEIGHTの手法は互換性が無く、同次に両方は使えない。

変数: RATWEIGHTS
- 指定された重み(RATWEIGHT関数で設定される)のリスト、RATWEIGHTS;か RATWEIGHT();でそのリストが見られる。

 
KILL(...,RATWEIGHTS)
 
SAVE(...,RATWEIGHTS);
は両方共に動作する。

変数: RATWEYL
デフォルト値:[] - Weylの共役テンソル成分の簡易化を制御するスイッチの一つ。 TRUEであれば成分は有理的に簡易化される。FACRATがTRUEであれば結果は因子分解 されたものとなる。

変数: RATWTLVL
デフォルト値:[FALSE] - RATWEIGHT関数を用いた式の纏めで、有理式(CRE形式)の 切捨ての制御で用いられる(デフォルト値がFALSEであれば、切捨ては生じない)。

関数: REMAINDER (p1, p2, var1, ...)
多項式p2による多項式p1の割り算の剰余を計算する。

関数: RESULTANT (p1, p2, var)
二つの多項式p1とp2の終結式を計算し、変数varを消去する。p1とp2が共通の定数の 因子を持たず、また、その時に限って終結式は零になるp1とp2でのvarの係数の行列式 である。p1かp2が因子分解可能であればRESULTANTを呼び出す前にFACTORを呼出す事が 望ましい。

RESULTANT[SUBRES] - 終結式の計算で用いるアルゴリズムを制御する。副終結式prs [デフォルト]向けがSUBRES、モジュラー終結式アルゴリズム向けがMOD、縮約prs向けが REDである。殆どの問題では、SUBRESが最適であろう。単変数の大きな次数や2変数問題 では、MODがより良いだろう。他にはBEZOUT命令があり、RESULTANTと同じ引数を取って 行列形式で返す。この行列のDETERMINANTが必要な終結式である。

変数: SAVEFACTORS
デフォルト値:[FALSE] - TRUEであれば、幾つかの同じ因子を含む後の式の展開の 処理速度向上の為、式の各因子がある関数で保存される。

関数: SQFR (exp)
FACTORと似ているが、多項式因子は無平方(Square-Free)である。つまり、多項式を 互いに素な因子に分解するが、その各因子の次数は1のみを持つ。このアルゴリズムは FACTORの第一段階で用いられるものでもあり、次数がnより大の多項式がその多項式の n次の微分と共通項を持つ事実を利用している。それ故、その多項式に含まれる各変数に 対する微分からgcdを取る事で、全ての次数>1の因子を見付ける。

 
(C1) SQFR(4*X**4+4*X**3-3*X**2-4*X-1);
                             2               2
(D1)                       (X  - 1) (2 X + 1)
(C2) FACTOR(4*X**4+4*X**3-3*X**2-4*X-1);

                                                  2
(D2)                     (X - 1) (X + 1) (2 X + 1)

 

 
(* 訳者注:

無平方(Square-Free)であるとは、多項式の因子fiの微分dfiに対し、fiとdfiが共通
の零点を持たない事である。Aの無平方因子分解はsum(Ai^i,i,1,n)の形に分解する。
ここで、各Aiは無平方で、i!=jであればgcd(Ai,Aj)=1となる。Maxima関数のSQFRは、
与えられた式に対し、この無平方分解を与えるものである。ここで、無平方分解SQFR
と因子分解FACTORとの違いは、上記の4*X^4+4*X^3-3*X^2-4*X-1の例で明確に出ている。
多項式を無平方因子に分解すれば、通常の因子分解程の手間が掛らない。更に、有理
多項式の積分計算では、無平方な因子に分母を分解し、各因子を分母に持つ式に変形
して積分を行うアルゴリズムがある。この様に、この分解は幅広く利用されている。

*)

関数: TELLRAT (poly)
MACSYMAが知っている代数的整数環に整数係数の多項式の解(代数的整数数)を追加する。 MACSYMAには最初に%Iと全て整数と云った根がある。TELLRAT(X);は有理関数に含まれる Xに0を代入する事を意味する。UNTELLRAT命令もあり、これはTELLRATによる写像の核 (有理関数に含まれるXに0を代入する操作の事)を取り、TELLRATの特性を除去する。 TELLRATを多変数多項式で実行する場合、例えば、TELLAT(X^2-Y^2);X^2に対してY^2を 代入するかどうか等々の曖昧さが生じる。例えば利用者がTELLRAT(Y^2=X^2);として X^2でY^2を置き換えたければ、システムは特別の順序を採用する。TELLRATとUNTELLRAT の両方は任意の数の因子を取る事が可能であり、TELLRAT();で現在の代入のリストを 返す。

注意:TELLRATが多項式を被約する時、零因子で分母の有理化を試みない様に注意する。 例えば、TELLRAT(W^3-1)$ ALGEBRAIC:TRUE$RAT(1/(W^2-W));は"零による割算"になる。 このエラーはRATALGEDENOM:FALSE$と設定する事で回避可能である。

ALGEBRAIC[FALSE]は代数的整数(最高次数項の係数が1となる整数係数多項式の解)の 簡易化で効果を発揮する為にTRUEに設定していなければならない。

例題はEXAMPLE(TELLRAT);を実行せよ。

 
(* 訳者注:

TELLRATを実行したからと云って、いきなり全ての入力がTELLRATで設定した性質で
評価されるのでは無い。TELLRATで設定した性質を考慮した評価を行う為には、
ALGEBRAIC:TRUEとするか、EV関数とALGEBRAICオプション付で式を評価する必要がある。

(C1) tellrat(x^2+1);
                                     2
(D1)                               [x  + 1]
(C2) rat(x^2+1);
                                     2
(D2)/R/                             x  + 1
(C3) ratsimp(x^2+1);
                                     2
(D3)                                x  + 1
(C4) ev(rat(x^2+1),algebraic);
(D4)/R/                                0
(C5) ev(ratsimp(x^2+1),algebraic);
(D5)                                   0
(C6) ev(ratsimp(x^3+1),algebraic);
(D6)                                 1 - x
(C7) algebraic:true;
(D7)                                 TRUE
(C8) ratsimp(x^3+1);
(D8)                                 1 - x
(C9) ratsimp(x^2+1);
(D9)                                   0
(C10) rat(x^2+1);
(D10)/R/                               0

*)

関数: TOTALDISREP (exp)
CRE形式から一般形式へexpの全ての部分式を変換する。expそれ自身がCRE形式であれ ば、これはRATDISREPと同一であるが、もしもそうでなければ、TOTALDISPREPがそれを "totally disrep"すれば、RATDISREPはexpを変更せずに返す事は無い。これは RATDISPREPを実行している式、例えば、方程式、リスト、行列等で幾つかのCRE形式の 部分式を持つものに便利である。

関数: UNTELLRAT (x)
TELLRATによる写像の核(kernel)を取り、TELLRAT属性を取り除く。

 
(* 訳者注:

TELLRATで設定した性質を取り除く。ここでの写像とは、TELLRATを用いる事でMaxima
に同値関係が入る為、包含写像から誘導される自然な写像の事を意味する。つまり、
Maximaの入力はこの写像の入力となり、評価された結果が写像の出力となる。
例えば、TELLRAT(X^2+1)を最初に実行すると、包含写像から誘導される自然な写像の
核はX^2+1で生成される多項式環のイデアルとなる。ここでXの整数係数多項式fに対し
てEV(f(X),ALGEBRAIC)を実行するとZ[X]/<x^2+1>で評価が行なわれる事を意味する。

この処理を例で示す。

(C19) tellrat(x^2+1);
                                     2
(D19)                              [x  + 1]
(C20) ev(rat(x^3+1),algebraic);
(D20)/R/                            - x + 1
(C21) untellrat(x);
(D21)                                 []
(C22) ev(rat(x^3+1),algebraic);
                                     3
(D22)/R/                            x  + 1

上の例では、最初に変数Xに対し、TELLRAT(X^2+1)でXは代数的整数でX^2+1=0を満す
ものである事を設定している。UNTELLRAT(X)で、このXの性質を除去している。
実際、UNTELLRATの後には、TELLRATで入れたXの評価が実行されない事が分る。

次に、複数の変数に対してTELLRATとUNTELRATを実行した例を示す。

(C23) tellrat(x^2+1,y^2+1);
                                 2       2
(D23)                          [y  + 1, x  + 1]
(C24) ev(rat(x^3+1+y^3+y),algebraic);
(D24)/R/                            - x + 1
(C25) untellrat(y);
                                     2
(D25)                              [x  + 1]
(C26) ev(rat(x^3+1+y^3+y),algebraic);
                                 3
(D26)/R/                        y  + y - x + 1

この例では変数X,YがX^2+1=0とY^2+1=0を満す代数的整数である事を設定している。
この様に複数の変数に対して整係数多項式をTELLRATに入力する事も可能であり、
EVでも的確に評価されている。次にUNTELLRAT(Y)でYに関してのみ、TELLRATで設定
した性質(YはY^2+1=0を満す代数的整数)である事を除去している。その後には、
Xに関する性質だけで評価が行われている。

尚、TELLRATで入力可能な多項式は主変数に関してMonic(係数が1)なものでなければ
ならない。又、多変数の場合、UNTELLRATは主変数に対して行う。

(C34) tellrat(x+y+z*y1);
Minimal polynomial must be monic
 -- an error.  Quitting.  To debug this try DEBUGMODE(TRUE);)
(C35) tellrat(x+y+z+1);
(D35)                           [z + y + x + 1]
(C36) untellrat(y);
(D36)                           [z + y + x + 1]
(C37) untellrat(z);
(D37)                                 []
(C38) tellrat(2*x+y+z+1);
(D38)                          [z + y + 2 x + 1]
(C39) untellrat(z);
(D39)                                 []

この例で示す様に、x+y+z*y1に関しては主変数がzで係数がy1となる為にエラーになる。
但し、2*x+y+z+1の様に主変数zがmonicでありさえすれば問題は無い。
又、UNTELLRATは主変数のみに使える事も上の例より分る。

*)


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Hiroshi Yokota on September, 16 2002 using texi2html