| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
4.1 多項式について 4.2 多項式に関する諸定義
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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] | [ ? ] |
(* 訳者注:
代数的整数とは最高次数の係数が1となる整数係数多項式方程式の解となる数である。 これに対し、代数的数とは有理数係数多項式の解になる数である。例えば、純虚数iや sqrt(2)の様な数は代数的整数であり、代数的整数と有理数は代数的数になる。
*)
(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
|
(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 |
(C1) CONTENT(2*X*Y+4*X**2*Y**2,Y); (D1) [2*X, 2*X*Y**2+Y]. |
(C1) DIVIDE(X+Y,X-Y,X); (D1) [1, 2 Y] (C2) DIVIDE(X+Y,X-Y); (D2) [ - 1, 2 X] |
(* 訳者注:
(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が主変数となる他は結果
の表示に違いが無い。
*)
|
例:
(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] *) |
(C1) (N+1)^B*N!^B;
B B
(D1) (N + 1) N!
(C2) FACTCOMB(%);
|
例はEXAMPLE(FACTOR);を実行せよ。
(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) )
|
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と同様に一つ又はそれ以上の引数を 取る。
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が必要とされない場合には計算の高速化 に繋がる事がある。
(* 訳者注: イデアル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にはならない。
(* 訳者注: |
(C4) gcdex(x*(y+1),y^2-1,x);
1
(D4) [0, ------, 1]
2
y - 1
(* 訳者注:
gcdex(x*(y+1),y^2-1,y);とすれば、多項式環 |
(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
で置換えて計算している。
*)
|
(*訳者注: (C1) hipow((x+1)^4,x); (D1) 1 (C2) hipow(expand((x+1)^4),x); (D2) 4 この様に、expandを行なわないと正しい値を計算しない。 *) |
警告:MODULUSを再設定した時点でEXPが既にCRE形式であれば、正しい結果を得る為に、 EXPに再びRATを作用させる必要がある。例えば、EXP:RAT(RATDISPREP(EXP))とする。 (MODULEに正の非素数が設定されていれば、この設定は採用されるものの警告が出る)
(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
|
この種類の係数が存在しなければ零が返される。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 |
(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
|
(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
|
CTENSR(Component Tensor Manipulation)パッケージでは、RATFACがTRUEであれば Ricci,Einsten,RiemannとWeylテンソルとスカラ曲率が自動的に因子分解される。 ** これはテンソルの成分が幾つかの項で構成されている事が判っている場合に 対してのみ設定すべきである。
注意:RATFACとRATWEIGHTの手法は互換性が無く、両者を同時に使ってはならない。
(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
|
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に代入されない。
*)
|
RATVARSに対する引数は変数か非有理的関数(例えば、SIN(X))のどちらかでなければ ならない。RATVARS変数はこの関数に対して与えられた引数のリストである。
(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
|
KILL(...,RATWEIGHTS) |
SAVE(...,RATWEIGHTS); |
RESULTANT[SUBRES] - 終結式の計算で用いるアルゴリズムを制御する。副終結式prs [デフォルト]向けがSUBRES、モジュラー終結式アルゴリズム向けがMOD、縮約prs向けが REDである。殆どの問題では、SUBRESが最適であろう。単変数の大きな次数や2変数問題 では、MODがより良いだろう。他にはBEZOUT命令があり、RESULTANTと同じ引数を取って 行列形式で返す。この行列のDETERMINANTが必要な終結式である。
(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が多項式を被約する時、零因子で分母の有理化を試みない様に注意する。 例えば、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
*)
|
(* 訳者注:
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] | [ ? ] |