多項式は、Maximaの中では、一般形もしくは、標準有理式(CRE)形として記憶されます。 後者は標準形であり、factor, ratsimpなどのような演算によって内部で使われます。
標準有理式は、特に
(RATFACがtrueに設定された時の部分的に因数分解された多項式や有理関数はもちろん)
展開された多項式や有理関数に適したある種の表現を構成します。
このCRE形では、変数の(最もメインから最小にまでの)順序付けは、
式それぞれに仮定されます。
多項式は、一連の式の対が続く主変数から成るリストによって再帰的に表現されます。
それぞれの対の最初のメンバーは、その項の主変数の指数であり、
2番目のメンバーは、その項の係数で、係数は、数、もしくは、再度の形式で表現された別の変数の多項式です。
このように、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関数を使って変数の順序付けを指定しないなら、
Maximaはアルファベットの順序付けを選びます。
一般に、CREは、有理式、すなわち、分子と分母が共通因子を持たず、分母が正の多項式の比を表します。
内部形は、本質的に、変数順序付けリストが先行する多項式の対(分子と分母)です。
もし表示される式がCRE形なら、もしくはもしCRE形の部分式を含むなら、
シンボル/R/が行ラベルに続きます。
式をCRE形に変換することに関してはRAT関数を参照してください。
拡張CRE形は、テイラー級数の表現に使われます。
有理式の概念が拡張され、変数の指数は、単に正の整数ではなく、正の有理数も負の有理数も取ることができ、係数はそれ自身単なる多項式ではなく上で記載された有理式を取ることができます。
これらは内部的にはCRE形に似ていて、その一般化である再帰多項式形によって表現されます。
それは、切り詰めの次数のような追加の情報を持ちます。
CRE形として、そんな式の行ラベルにはシンボル/T/が続きます。
デフォルト値: false
代数的整数の整理の効果が現れるようにするためには、
algebraicはtrueに設定されなければいけません。
デフォルト値: true
berlefactがfalseの時、
Kroneckerの因数分解アルゴリズムが使われます。
そうでなければ、Berlekampのアルゴリズム―これがデフォルトですーが使われます。
resultantコマンドの代替。
行列を返します。
この行列のdeterminantは、望みの結果です。
最初のメンバーがexprの中のxの
(もしexprがCRE形ならratcoefが見つけるような)
係数であり、
2番目のメンバーがexprの残りの部分であるリストを返します。
例えば、
expr = A*x + Bの[A, B]。
例:
(%i1) islinear (expr, x) := block ([c],
c: bothcoef (rat (expr, x), x),
is (freeof (x, c) and c[1] # 0))$
(%i2) islinear ((r^2 - (x - r)^2)/x, x);
(%o2) true
exprのx^nの係数を返します。
ここで、exprはxの多項式か単項式です。
coeff(expr, x^n)は
coeff(expr, x, n)と同値です。
coeff(expr, x, 0)は
xを含まないexprの剰余項を返します。
もし省略されたら、nは1が仮定されます。
xは単純変数か添字付き変数か、演算子1つとその引数のすべてから構成されるexprの部分式です。
expandかfactorを適用することで、
exprと同値な式の係数を計算することが可能かもしれません。
coeff自身はexpandやfactorや他のいかなる関数も
適用しません。
例:
coeffはexprのx^nの係数を返します。
(%i1) coeff (b^3*a^3 + b^2*a^2 + b*a + 1, a^3);
3
(%o1) b
coeff(expr, x^n)は
coeff(expr, x, n)と同値です。
(%i1) coeff (c[4]*z^4 - c[3]*z^3 - c[2]*z^2 + c[1]*z, z, 3);
(%o1) - c
3
(%i2) coeff (c[4]*z^4 - c[3]*z^3 - c[2]*z^2 + c[1]*z, z^3);
(%o2) - c
3
coeff(expr, x, 0)は
exprのxを含まない剰余項です。
(%i1) coeff (a*u + b^2*u^2 + c^3*u^3, b, 0);
3 3
(%o1) c u + a u
xは単純変数か添字付き変数か、演算子1つとその引数のすべてから構成されるexprの部分式です。
(%i1) coeff (h^4 - 2*%pi*h^2 + 1, h, 2);
(%o1) - 2 %pi
(%i2) coeff (v[1]^4 - 2*%pi*v[1]^2 + 1, v[1], 2);
(%o2) - 2 %pi
(%i3) coeff (sin(1+x)*sin(x) + sin(1+x)^3*sin(x)^3, sin(1+x)^3);
3
(%o3) sin (x)
(%i4) coeff ((d - a)^2*(b + c)^3 + (a + b)^4*(c - d), a + b, 4);
(%o4) c - d
coeff自身はexpandやfactorや他のいかなる関数も
適用しません。
(%i1) coeff (c*(a + b)^3, a);
(%o1) 0
(%i2) expand (c*(a + b)^3);
3 2 2 3
(%o2) b c + 3 a b c + 3 a b c + a c
(%i3) coeff (%, a);
2
(%o3) 3 b c
(%i4) coeff (b^3*c + 3*a*b^2*c + 3*a^2*b*c + a^3*c, (a + b)^3);
(%o4) 0
(%i5) factor (b^3*c + 3*a*b^2*c + 3*a^2*b*c + a^3*c);
3
(%o5) (b + a) c
(%i6) coeff (%, (a + b)^3);
(%o6) c
coeffはリスト、行列、等式上を散逸します。
(%i1) coeff ([4*a, -3*a, 2*a], a);
(%o1) [4, - 3, 2]
(%i2) coeff (matrix ([a*x, b*x], [-c*x, -d*x]), x);
[ a b ]
(%o2) [ ]
[ - c - d ]
(%i3) coeff (a*u - b*v = 7*u + 3*v, u);
(%o3) a = 7
最初のメンバーが、多項式変数p_1のx_n に関する項の係数(これが中身です)の最大公約数であり、 2番目のメンバーが中身で多項式p_1を割ったものであるリストを返します。
例:
(%i1) content (2*x*y + 4*x^2*y^2, y);
2 (%o1) [2 x, 2 x y + y]
有理式exprの分母を返します。
メインの多項式変数x_nに関して、
多項式p_2で割った多項式p_1の商と余りを計算します。
他の変数は、ratvars関数の中でようなものです。
結果は、最初の要素が商で、2番目の要素が余りのリストです。
例:
(%i1) divide (x + y, x - y, x); (%o1) [1, 2 y] (%i2) divide (x + y, x - y); (%o2) [- 1, 2 x]
yは2番目の例の主変数であることに注意してください。
連続する結果を取ることによって、式(もしくは0に等しいと仮定された式)から変数を消去します。
これは、k個の変数x_1, ..., x_kが消去された
n - k個の式のリストを返します。
最初、x_1が消去され、n - 1個の式をもたらし、
そして、変数x_2が消去され、などなど。
もしk = nなら、
変数x_1, ..., x_kに依らないリストの中の単一式が返されます。
この場合、最後の変数について最後の結果を解くため、solveがコールされます。
例:
(%i1) expr1: 2*x^2 + y*x + z;
2
(%o1) z + x y + 2 x
(%i2) expr2: 3*x + 5*y - z - 1;
(%o2) - z + 5 y + 3 x - 1
(%i3) expr3: z^2 + x - y^2 + 5;
2 2
(%o3) z - y + x + 5
(%i4) eliminate ([expr3, expr2, expr1], [y, z]);
8 7 6 5 4
(%o4) [7425 x - 1170 x + 1299 x + 12076 x + 22887 x
3 2
- 5154 x - 1291 x + 7688 x + 15376]
最初の要素が、多項式p_1, p_2, p_3, …の最大公約数で、
残りの要素が、多項式を最大公約数で割ったものであるリストを返します。
これはいつもezgcdアルゴリズムを使います。
gcd, gcdex, gcdivide, poly_gcdも参照してください。
例:
三つの多項式は最大公約数 2*x-3を持ちます。
GCDは最初、関数 gcdで計算され、その後、関数 ezgcdで計算されます。
(%i1) p1 : 6*x^3-17*x^2+14*x-3;
3 2
(%o1) 6 x - 17 x + 14 x - 3
(%i2) p2 : 4*x^4-14*x^3+12*x^2+2*x-3;
4 3 2
(%o2) 4 x - 14 x + 12 x + 2 x - 3
(%i3) p3 : -8*x^3+14*x^2-x-3;
3 2
(%o3) - 8 x + 14 x - x - 3
(%i4) gcd(p1, gcd(p2, p3));
(%o4) 2 x - 3
(%i5) ezgcd(p1, p2, p3);
2 3 2 2
(%o5) [2 x - 3, 3 x - 4 x + 1, 2 x - 4 x + 1, - 4 x + x + 1]
デフォルト値: true
facexpandは、factorが返すこれ以上小さくできない因子が
展開された形式(デフォルト)か再帰的(正規のCRE)形式かを制御します。
任意の数の変数と関数を含んだ式exprを整数上既約な因子に因数分解します。
factor (expr, p)はexprを、
有理数体上で、最小多項式がpである要素で因数分解します。
factorは、整数を素因数分解するのにifactor関数を使います。
factorflagがfalseなら有理式の整数因子の素因数分解を抑制します。
dontfactorは、因数分解しない変数のリストに設定されます。
(初期状態では空です。)
因数分解は、dontfactorリスト上のそれらより(CRE形式で仮定された変数順序を使って)重要でない変数に関しても
実行されません。
savefactorsがtrueなら、
同じ因子のいくつかを含む式の後の因数分解をスピードアップするために、因子の積である式の因子が、ある関数によって保存されます。
berlefactが falseならKroneckerの因数分解アルゴリズムが使われ、
そうでなければ、デフォルトであるBerlekampのアルゴリズムが使われます。
intfaclimがtrueなら、
もし自明な割り算やPollardのロー法の後、因子が見つからないなら、整数の素因数分解をあきらめます。
falseに設定されていれば(これはユーザーが陽にfactorをコールする場合です)整数の完全な素因数分解が企てられます。
intfaclimのユーザー設定は内部でfactorがコールされた時に使われます。
intfaclimはMaximaが大きな整数を素因数分解するのにありえない長い時間を使うことを妨げるようにリセットされます。
例:
(%i1) factor (2^63 - 1);
2
(%o1) 7 73 127 337 92737 649657
(%i2) factor (-8*y - 4*x + z^2*(2*y + x));
(%o2) (2 y + x) (z - 2) (z + 2)
(%i3) -1 - 2*x - x^2 + y^2 + 2*x*y^2 + x^2*y^2;
2 2 2 2 2
(%o3) x y + 2 x y + y - x - 2 x - 1
(%i4) block ([dontfactor: [x]], factor (%/36/(1 + 2*y + y^2)));
2
(x + 2 x + 1) (y - 1)
(%o4) ----------------------
36 (y + 1)
(%i5) factor (1 + %e^(3*x));
x 2 x x
(%o5) (%e + 1) (%e - %e + 1)
(%i6) factor (1 + x^4, a^2 - 2);
2 2
(%o6) (x - a x + 1) (x + a x + 1)
(%i7) factor (-y^2*z^2 - x*z^2 + x^2*y^2 + x^3);
2
(%o7) - (y + x) (z - x) (z + x)
(%i8) (2 + x)/(3 + x)/(b + x)/(c + x)^2;
x + 2
(%o8) ------------------------
2
(x + 3) (x + b) (x + c)
(%i9) ratsimp (%);
4 3
(%o9) (x + 2)/(x + (2 c + b + 3) x
2 2 2 2
+ (c + (2 b + 6) c + 3 b) x + ((b + 3) c + 6 b c) x + 3 b c )
(%i10) partfrac (%, x);
2 4 3
(%o10) - (c - 4 c - b + 6)/((c + (- 2 b - 6) c
2 2 2 2
+ (b + 12 b + 9) c + (- 6 b - 18 b) c + 9 b ) (x + c))
c - 2
- ---------------------------------
2 2
(c + (- b - 3) c + 3 b) (x + c)
b - 2
+ -------------------------------------------------
2 2 3 2
((b - 3) c + (6 b - 2 b ) c + b - 3 b ) (x + b)
1
- ----------------------------------------------
2
((b - 3) c + (18 - 6 b) c + 9 b - 27) (x + 3)
(%i11) map ('factor, %);
2
c - 4 c - b + 6 c - 2
(%o11) - ------------------------- - ------------------------
2 2 2
(c - 3) (c - b) (x + c) (c - 3) (c - b) (x + c)
b - 2 1
+ ------------------------ - ------------------------
2 2
(b - 3) (c - b) (x + b) (b - 3) (c - 3) (x + 3)
(%i12) ratsimp ((x^5 - 1)/(x - 1));
4 3 2
(%o12) x + x + x + x + 1
(%i13) subst (a, x, %);
4 3 2
(%o13) a + a + a + a + 1
(%i14) factor (%th(2), %);
2 3 3 2
(%o14) (x - a) (x - a ) (x - a ) (x + a + a + a + 1)
(%i15) factor (1 + x^12);
4 8 4
(%o15) (x + 1) (x - x + 1)
(%i16) factor (1 + x^99);
2 6 3
(%o16) (x + 1) (x - x + 1) (x - x + 1)
10 9 8 7 6 5 4 3 2
(x - x + x - x + x - x + x - x + x - x + 1)
20 19 17 16 14 13 11 10 9 7 6
(x + x - x - x + x + x - x - x - x + x + x
4 3 60 57 51 48 42 39 33
- x - x + x + 1) (x + x - x - x + x + x - x
30 27 21 18 12 9 3
- x - x + x + x - x - x + x + 1)
デフォルト値: false
factorflagがfalseの時、
有理式の整数因子の素因素分解を抑制します。
和exprを
形式f (x_1, x_2, …)*gの項の和に再整理します。
ここで、gは、いかなるx_iも含まない式の積で、fは因数分解されています。
オプション変数keepfloatはfactoroutに無視されることに注意してください。
例:
(%i1) expand (a*(x+1)*(x-1)*(u+1)^2);
2 2 2 2 2
(%o1) a u x + 2 a u x + a x - a u - 2 a u - a
(%i2) factorout(%,x);
2
(%o2) a u (x - 1) (x + 1) + 2 a u (x - 1) (x + 1)
+ a (x - 1) (x + 1)
exprの因子(それらは和です)の中の項を
それらの和が因数分解可能な項のグループにグループ化しようとします。
factorsumは、
expand ((x + y)^2 + (z + w)^2)の結果を回復できますが、
項が共通の変数を持つので、
expand ((x + 1)^2 + (x + y)^2)は回復できません。
例:
(%i1) expand ((x + 1)*((u + v)^2 + a*(w + z)^2));
2 2 2 2
(%o1) 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
(%i2) factorsum (%);
2 2
(%o2) (x + 1) (a (z + w) + (v + u) )
多項式の掛け算のための特殊なアルゴリズムを使って、
多項式p_1とp_2の積を返します。
p_1とp_2は、
多変数で、密で、ほぼ同じサイズであるべきです。
n_1がp_1の次数で、
n_2がp_2の次数だとすると、
古典的な掛け算は、
n_1 n_2のオーダーですが、
fasttimesは、max (n_1, n_2)^1.585のオーダーです。
fullratsimpは、ratsimpと式の非有理的整理を、式変形されなくなるまで繰り返し適応し、結果を返します。
非有理式が含まれる時、ratsimpを1回コールと、その後の非有理的(「一般」)整理だけでは、
整理された結果を返すのに十分でないかもしれません。
時々、複数回のコールが必要とされます。
fullratsimpはこのプロセスを楽にしてくれます。
fullratsimp (expr, x_1, ..., x_n)はratsimpやratと同様
複数の引数を取ります。
例:
(%i1) expr: (x^(a/2) + 1)^2*(x^(a/2) - 1)^2/(x^a - 1);
a/2 2 a/2 2
(x - 1) (x + 1)
(%o1) -----------------------
a
x - 1
(%i2) ratsimp (expr);
2 a a
x - 2 x + 1
(%o2) ---------------
a
x - 1
(%i3) fullratsimp (expr);
a
(%o3) x - 1
(%i4) rat (expr);
a/2 4 a/2 2
(x ) - 2 (x ) + 1
(%o4)/R/ -----------------------
a
x - 1
結果が変わらなくなるまで、自身を再帰的にコールすることを除いて、
ratsubstと同じです。
置き換える式と置き換えられる式が1つ以上の変数を共通に持つ時、
この関数は役に立ちます。
fullratsubstは、lratsubstのフォーマットでも引数を受け付けます。
すなわち、最初の引数は、1つの代入等式もしくは、そんな等式のリストで、
一方、2番目の引数は処理される式というものです。
load ("lrats")は、fullratsubstとlratsubstをロードします。
例:
(%i1) load ("lrats")$
substは多重代入を実行できます。
lratsubstはsubstに類似しています。
(%i2) subst ([a = b, c = d], a + c); (%o2) d + b (%i3) lratsubst ([a^2 = b, c^2 = d], (a + e)*c*(a + c)); (%o3) (d + a c) e + a d + b c
(%i4) lratsubst (a^2 = b, a^3); (%o4) a b
fullratsubstは、
結果が変わらなくなるまで再帰することを除いて、
ratsubstと同値です。
(%i5) ratsubst (b*a, a^2, a^3);
2
(%o5) a b
(%i6) fullratsubst (b*a, a^2, a^3);
2
(%o6) a b
fullratsubstも、
最初の引数として、等式のリストもしくは1つの式を受け入れます。
(%i7) fullratsubst ([a^2 = b, b^2 = c, c^2 = a], a^3*b*c);
(%o7) b
(%i8) fullratsubst (a^2 = b*a, a^3);
2
(%o8) a b
fullratsubstは、不確定な再帰を起こすかもしれません。
(%i9) errcatch (fullratsubst (b*a^2, a^2, a^3)); *** - Lisp stack overflow. RESET
p_1とp_2の最大公約数を返します。
フラグgcdは、どのアルゴリズムを利用するか決めます。
gcdをez, subres, red, もしくはspmod
設定することは、それぞれ、ezgcd, 部分終結式prs, 被約, もしくはモジュラーアルゴリズムを選択します。
もしgcdがfalseなら、
gcd (p_1, p_2, x)は、すべてのxに関していつも1を返します。
(例えば、ratsimp, factor, など)多くの関数は、
陰にgcdを計算します。
斉次多項式に関して、
subresに等しいgcdを使うことが推奨されます。
例えば、gcd (x^2 - 2*sqrt(2)*x + 2, x - sqrt(2))のように、代数的数が含まれる時
algebraicはtrueでなくてはいけません。また、gcdはezであってはいけません。
gcdフラグ―デフォルトはspmod―は、
もしfalseなら、
式が標準有理式(CRE)形に変換される時も、最大公約数を計算させません。
もしgcdが要求されないなら、これは、時々計算のスピードを上げます。
ezgcd, gcdex, gcdivide, poly_gcdも参照してください。
例:
(%i1) p1:6*x^3+19*x^2+19*x+6;
3 2
(%o1) 6 x + 19 x + 19 x + 6
(%i2) p2:6*x^5+13*x^4+12*x^3+13*x^2+6*x;
5 4 3 2
(%o2) 6 x + 13 x + 12 x + 13 x + 6 x
(%i3) gcd(p1, p2);
2
(%o3) 6 x + 13 x + 6
(%i4) p1/gcd(p1, p2), ratsimp;
(%o4) x + 1
(%i5) p2/gcd(p1, p2), ratsimp;
3
(%o5) x + x
ezgcdは
一番目の要素が多項式 p_1と p_2の最大公約数で、
残りの要素が最大公約数で多項式を割ったもので構成されるリストを返します。
(%i6) ezgcd(p1, p2);
2 3
(%o6) [6 x + 13 x + 6, x + 1, x + x]
リスト[a, b, u]を返します。
ここで、uはfとgの最大公約数(gcd)であり、
かつ、a f + b gはuに等しいです。
引数fとgは、1変数多項式であるか、
そうでなければ、指定された主変数xの多項式でなければいけません。
これが機能するには単項イデアル整域にある必要があるからです。
gcdは、他の変数の有理関数係数を持つ1変数多項式としてのfとgに関するgcdを意味します。
gcdexは、ユークリッドのアルゴリズムを実行します。
すべてが[f, g, -1]に直角のL[i]: [a[i], b[i], r[i]]の列を持ち、
q = quotient(r[i]/r[i+1])ならL[i+2]: L[i] - q L[i+1]となるように次を組み立て、
余りr[i+2]がゼロの時、L[i+1]で終了します。
引数 fと gは整数であり得ます。
この場合、gcdexは関数 igcdexを呼び出します。
ezgcd, gcd, gcdivide, poly_gcdも参照してください。
例:
(%i1) gcdex (x^2 + 1, x^3 + 4);
2
x + 4 x - 1 x + 4
(%o1)/R/ [- ------------, -----, 1]
17 17
(%i2) % . [x^2 + 1, x^3 + 4, -1]; (%o2)/R/ 0
以下のgcdは、
k(y)[x]に関して働くので1です。
k[y, x]で期待するy+1ではないことに注意してください。
(%i1) gcdex (x*(y + 1), y^2 - 1, x);
1
(%o1)/R/ [0, ------, 1]
2
y - 1
ガウス整数
すなわち、aとbが有理整数(元々の整数)
である形式a + b
の数、nをガウス整数上に因数分解します。
因子は、aとbを非負にすることによって正規化されます。
%i
多項式exprをガウス整数(虚数単位%iを付け加えた整数)上で因数分解します。
aが%iとなるfactor (expr, a^2+1)ようなものです。
例:
(%i1) gfactor (x^4 - 1); (%o1) (x - 1) (x + 1) (x - %i) (x + %i)
factorsumに似ていますが、
factorの代わりにgfactorを適用します。
exprの中で、xの、陽に示された最も大きな指数を返します。
xは変数もしくは一般式です。
もしxがexprの中に現れないなら、
hipowは0を返します。
hipowは、exprに等価な式を考慮しません。
特に、hipowは、exprを展開しないので、
hipow (expr, x)とhipow (expand (expr, x))
は、違った結果をもたらすかもしれません。
例:
(%i1) hipow (y^3 * x^2 + x * y^4, x); (%o1) 2 (%i2) hipow ((x + y)^5, x); (%o2) 1 (%i3) hipow (expand ((x + y)^5), x); (%o3) 5 (%i4) hipow ((x + y)^5, x + y); (%o4) 5 (%i5) hipow (expand ((x + y)^5), x + y); (%o5) 0
デフォルト値: true
もしtrueなら、
もし試し割りとPollardのロー法の後、因子が見つからなければ、
Maximaは、整数の素因素分解をあきらめ、素因数分解は完了しません。
intfaclimがfalseの時、
(これは、ユーザーが明示的にfactorをコールした場合です)
完全な素因数分解が試みられます。
divisors, divsum やtotientの中で因子が計算される時は、
intfaclimはfalseに設定されます
factorへの内部コールは、
intfaclimのユーザー指定の値を考慮します。
intfaclimをtrueに設定することは、
大きな整数を素因数分解するのに費やす時間を少なくするかもしれません。
デフォルト値: false
keepfloatがtrueの時、
浮動小数点数を含む式が標準有理式(CRE)形に変換される時、
浮動小数点が有理数化されないようにします。
関数solveとそれを呼び出す関数(例えばeigenvalues)は、
現在、このフラグを無視し、とにかく浮動小数点数を変換することに注意してください。
例:
(%i1) rat(x/2.0);
`rat' replaced 0.5 by 1/2 = 0.5
x
(%o1)/R/ -
2
(%i2) rat(x/2.0), keepfloat;
(%o2)/R/ E 0.5 x
solve ignores keepfloat:
(%i3) solve(1.0-x,x), keepfloat; `rat' replaced 1.0 by 1/1 = 1.0 (%o3) [x = 1]
exprの中に陽に現れるxの最小の指数を返します。 例えば、
(%i1) lopow ((x+y)^2 + (x+y)^a, x+y); (%o1) min(a, 2)
substの代わりにratsubstを使うことを除いて、
subst (L, expr)に類似しています。
lratsubstの最初の引数は、
substが受け付けるそれと同一のフォーマットの等式もしくは等式のリストです。
代入は、等式のリストによって与えられた順、すなわち、左から右に、実行されます。
load ("lrats")は、fullratsubstとlratsubstをロードします。
例:
(%i1) load ("lrats")$
substは多重代入を実行できます。
lratsubstはsubstに似ています。
(%i2) subst ([a = b, c = d], a + c); (%o2) d + b (%i3) lratsubst ([a^2 = b, c^2 = d], (a + e)*c*(a + c)); (%o3) (d + a c) e + a d + b c
(%i4) lratsubst (a^2 = b, a^3); (%o4) a b
デフォルト値: false
modulusが正の数pの時、
(ratや関連の関数が返すように)有理数上の演算は、
「バランスさせた」モジュラス系と呼ばれるものを使って、
pを法とする合同変換が実行されます。
「バランスさせた」モジュラス系では、
n modulo pは、
a p + kがnに等しくなるようなある整数aが存在するような整数kと定義され、kは、
pが奇数の時、
[-(p-1)/2, ..., 0, ..., (p-1)/2]の中から、
pが偶数の時、[-(p/2 - 1), ..., 0, ...., p/2]の中から
選ばれます。
modulusが再設定された時、もしexprが既に標準有理式(CRE)形なら、
正しい結果を得るためには、
例えばexpr: rat (ratdisrep (expr))というように、exprを再ratする必要があるかもしれません。
典型的には、modulusは素数が設定されます。
もしmodulusが正の合成数に設定されたら、
この設定は受け入れられますが、警告メッセージが表示されます。
Maximaは、ゼロや負の整数がmodulusに割り当てられるのを許します。
それが役に立つ結果を持つかどうか明らかではありませんが。
もしexprが比なら、その分子を返します。 もしexprが比でないなら、exprが返されます。
numは引数を評価します。
変数xの多項式pをxの多項式の関数合成に分解します。
polydecompは、
lambda ([x], p_1) (lambda ([x], p_2) (... (lambda ([x], p_n) (x)) ...))
がpに等しいようなリスト[p_1, ..., p_n]を返します。
nより小さいiについてp_iの次数は1より大きいです。
このような分解は一意的ではありません。
例:
(%i1) polydecomp (x^210, x);
7 5 3 2
(%o1) [x , x , x , x ]
(%i2) p : expand (subst (x^3 - x - 1, x, x^2 - a));
6 4 3 2
(%o2) x - 2 x - 2 x + x + 2 x - a + 1
(%i3) polydecomp (p, x);
2 3
(%o3) [x - a, x - x - 1]
以下の関数は、xの関数として、
L = [e_1, ..., e_n]を合成します;
それはpolydecompの逆です。
compose (L, x) := block ([r : x], for e in L do r : subst (e, x, r), r) $
composeを使って、上の例を再表現します:
(%i3) polydecomp (compose ([x^2 - a, x^3 - x - 1], x), x);
2 3
(%o3) [x - a, x - x - 1]
compose (polydecomp (p, x), x)はいつも
(展開されていない)pを返しますが、
polydecomp (compose ([p_1, ..., p_n], x), x)は、
必ずしも[p_1, ..., p_n]を返さないことに注意してください。
(%i4) polydecomp (compose ([x^2 + 2*x + 3, x^2], x), x);
2 2
(%o4) [x + 2, x + 1]
(%i5) polydecomp (compose ([x^2 + x + 1, x^2 + x + 1], x), x);
2 2
x + 3 x + 5
(%o5) [------, ------, 2 x + 1]
4 2
多項式pを、変数modulusの値である現在の法に関してモジュラー表現に変換します。
polymod (p, m)は、
modulusの現在値の代わりに法mを使うように指定します。
modulusを参照してください。
exprに現れるxのべきを返します。
load ("powers") loads this function.
多項式p_1を多項式p_2で割った結果を返します。
引数x_1, …, x_nは、ratvarsと同様に解釈されます。
quotientは、divideが返す2要素リストの最初の要素を返します。
exprを標準有理式(CRE)形式に変換します。
展開し、共通の分母上ですべての項を結合し、通分し、ratepsilonの許容誤差内で浮動小数点を有理数に変換します。
変数は、もし指定されたなら、ratvarsのようにx_1, …, x_nに従って並び替えられます。
ratは一般に、加算+, 減算-, 乗算*, 除算/と整数べきの指数を除いた関数を
整理しません。
一方でratsimpはこれらの場合を扱います。
CRE形式の中のアトム(数と変数)は一般形式でのそれと同じではないことに注意してください。
例えば、rat(x) - xはrat(0)を出力します。
これは0とは違う内部表現を持ちます。
ratfacがtrueの時、
ratは、CREの一部因数分解された形式を出力します。
有理演算の最中、因数分解パッケージをコールなしに、式は可能な限り因数分解され続けます。
これにより常に、いくつかの計算でメモリと時間を節約することになります。
分子と分母は互いに素になり(例えば、((x^2 - 1)^4/(x + 10^2)は(x - 1)^4 (x + 1)^2を出力します)、
それぞれの部分の中の因子は互いに素とは限りません。
ratprintがfalseならユーザーに浮動小数点を有理数に変換したことを通知するメッセージの出力を抑制します。
keepfloatがtrueなら、浮動小数点が有理数に変換されることを抑制します。
ratexpandとratsimpも参照してください。
例:
(%i1) ((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 )
(%o1) ------------------------------------
2 2
4 y + x
(%i2) rat (%, y, a, x);
2 a + 2 y
(%o2)/R/ ---------
x + 2 y
デフォルト値: true
ratalgdenomがtrueの時、
根号に関する分母の有理化が有効になることを許します。
ratalgdenomは、
標準有理式(CRE)が代数モードで使われる時だけ、効果を持ちます。
式exprの中の式x^nの係数を返します。
nを省略した場合、nは1が仮定されます。
戻り値は、(非有理な意味で可能な場合を除いて、)xの中の変数の制約を受けません。 このタイプの係数が存在しなければ、0を返します。
ratcoefは最初の引数を展開し、有理的に整理するので、
純粋に構文法的なcoeffのそれとは違った答えを生成することがあります。
このように、ratcoef ((x + 1)/y + x, x)は(y + 1)/yを返しますが、coeffは1を返します。
ratcoef (expr, x, 0)は、exprをsumとして見て、
xを含まない項の和を返します。
ゆえに、もしxの負のべき乗が存在するなら、ratcoefを使うべきではありません。
exprは検査される前に有理的に整理されるので、 係数は、想像された形とは全く違って現れることがあります。
例:
(%i1) s: a*x + b*x + 5$ (%i2) ratcoef (s, a + b); (%o2) x
exprを標準有理式(CRE)に強制した後、exprの分母を返します。 戻り値はCREです。
exprは、もしまだCREでないなら、ratによってCREに強制的に変換されます。
この変換は、すべての項を共通の分母上に置くことによって、
exprの形式を変えます。
denomは似ていますが、
CREではなく通常の式を返します。
また、denomは共通の分母上にすべての項を置こうとはしませんし、
ratdenomによって比と見なされるいくつかの式は、denomには比と見なされません。
デフォルト値: true
ratdenomdivideがtrueの時、
ratexpandは、分子が和である比を、共通の分母を持つ比の和に展開します。
そうでなければ、ratexpandは比の和を1つの比に縮約します。
その比の分子はそれぞれの比の分子の和です。
例:
(%i1) expr: (x^2 + x + 1)/(y^2 + 7);
2
x + x + 1
(%o1) ----------
2
y + 7
(%i2) ratdenomdivide: true$
(%i3) ratexpand (expr);
2
x x 1
(%o3) ------ + ------ + ------
2 2 2
y + 7 y + 7 y + 7
(%i4) ratdenomdivide: false$
(%i5) ratexpand (expr);
2
x + x + 1
(%o5) ----------
2
y + 7
(%i6) expr2: a^2/(b^2 + 3) + b/(b^2 + 3);
2
b a
(%o6) ------ + ------
2 2
b + 3 b + 3
(%i7) ratexpand (expr2);
2
b + a
(%o7) ------
2
b + 3
有理式exprをxに関して微分します。 exprはxの多項式もしくは多項式の商でなければなりません。 引数xはexprの変数もしくは部分式を取り得ます。
たぶん違った形式になりますが、結果は、diffと同値です。
有理式の場合、ratdiffはdiffより速いでしょう。
ratdiffは、もしexprが標準有理式(CRE)なら、標準有理式を返します。
そうでなければ、一般式を返します。
ratdiffは、exprのxへの依存のみを考慮し、dependsで規定された依存性は無視します。
例:
(%i1) expr: (4*x^3 + 10*x - 11)/(x^5 + 5);
3
4 x + 10 x - 11
(%o1) ----------------
5
x + 5
(%i2) ratdiff (expr, x);
7 5 4 2
8 x + 40 x - 55 x - 60 x - 50
(%o2) - ---------------------------------
10 5
x + 10 x + 25
(%i3) expr: f(x)^3 - f(x)^2 + 7;
3 2
(%o3) f (x) - f (x) + 7
(%i4) ratdiff (expr, f(x));
2
(%o4) 3 f (x) - 2 f(x)
(%i5) expr: (a + b)^3 + (a + b)^2;
3 2
(%o5) (b + a) + (b + a)
(%i6) ratdiff (expr, a + b);
2 2
(%o6) 3 b + (6 a + 2) b + 3 a + 2 a
一般式として引数を返します。 もしexprが一般式なら、戻り値は引数から変わりません。
典型的には、ratdisrepは、
標準有理式(CRE)を一般式に変換するためにコールされます。
もし「伝染」を止めたかったり、非有理文脈で有理関数を使いたいなら、
これは、時々便利です。
totaldisrepも参照してください。
exprを展開します。 指数和や和の積を展開し、共通分母上の分数を結合し、通分し、(もし和なら)分子を分母で割ったそれぞれの項に分割します。
たとえexprが標準有理式(CRE)でも、ratexpandの戻り値は一般式です。
スイッチratexpandがtrueなら、CRE式は、一般式や表示形式に変換された時フルに展開されます。
一方もしfalseなら再帰形式に変換します。
ratsimpも参照してください。
ratdenomdivideがtrueの時、
ratexpandは、分子が和である比を、共通の分母を持つ比の和に展開します。
そうでなければ、ratexpandは日の和を、その分子がそれぞれの比の分子の和である単一の比にまとめます。
keepfloatがtrueの時、
浮動小数点を含んだ式がCRE形式に変換される時、浮動小数点が有理化されるのを抑制します。
例:
(%i1) ratexpand ((2*x - 3*y)^3);
3 2 2 3
(%o1) - 27 y + 54 x y - 36 x y + 8 x
(%i2) expr: (x - 1)/(x + 1)^2 + 1/(x - 1);
x - 1 1
(%o2) -------- + -----
2 x - 1
(x + 1)
(%i3) expand (expr);
x 1 1
(%o3) ------------ - ------------ + -----
2 2 x - 1
x + 2 x + 1 x + 2 x + 1
(%i4) ratexpand (expr);
2
2 x 2
(%o4) --------------- + ---------------
3 2 3 2
x + x - x - 1 x + x - x - 1
デフォルト値: false
ratfacがtrueの時、
標準有理式(CRE)は部分的に因数分解された形式で操作されます。
有理演算の間、
式は、factorをコールすることなしに、
可能な限り最大限因数分解されるよう維持されます。
これは、いつも保存領域を節約し、いくつかの計算では時間も節約ことがあります。
分子と分母は互いに素になります。
例えば、rat ((x^2 - 1)^4/(x + 1)^2)は、
(x - 1)^4 (x + 1)^2)をもたらしますが、
それぞれの部分の中の因子は互いに素ではないかもしれません。
ctensr(成分テンソル操作)パッケージでは、
ratfacがtrueの時、
リッチ、アインシュタイン、リーマン、そしてワイルテンソルとスカラー曲率は、
自動的に因数分解されます。
ratfacは、テンソルの成分が2、3の項から成ると知られている場合だけ
設定すべきです。
ratfacとratweight体系は互換性はなく、
同時には使えないかもしれません。
exprを標準有理式(CRE)に強制変換した後、その分子を返します。 戻り値はCREです。
もしまだCREでないなら、exprは、ratによってCREに強制変換されます。
この変換は、
共通の分母上にすべての項を置くことによって、
exprの形式を変えるかもしれません。
numは似ていますが、
CREではなく通常の式を返します。
また、numは共通の分母上にすべての項を置こうとはしませんし、
ratnumerによって比と見なされるいくつかの式は、numには比と見なされません。
もしexprが標準有理式(CRE)もしくは拡張CREなら、trueを返し、
そうでなければ、falseを返します。
CREは、ratと関連関数によって生成されます。
拡張CREは、taylorと関連関数によって生成されます。
デフォルト値: true
ratprintがtrueの時、
ユーザーに浮動小数点を有理数に変換したことを通知するメッセージが表示されます。
式expとその部分式の全てを有理的に整理します(非有理的関数の引数も含みます)。
結果は二つの多項式の商として、再帰的形式—主変数の係数が他の変数の多項式である形式—で返されます。
変数は(例えば、sin(z^2+1)のような)非有理関数を含むかもしれませんが、
どんな非有理関数の引数もまた、有理的に整理されます。
ratsimp (expr, x_1, ..., x_n)は、ratvarsで指定した場合と同様に、
変数の順序指定に従って有理的に整理します。
ratsimpexponsがtrueの時、
ratsimpは式の指数にも適用されます。
ratexpandも参照してください。
ratsimpは、ratexpandに影響するフラグのいくつかに影響されることに注意してください。
例:
(%i1) sin (x/(x^2 + x)) = exp ((log(x) + 1)^2 - log(x)^2);
2 2
x (log(x) + 1) - log (x)
(%o1) sin(------) = %e
2
x + x
(%i2) ratsimp (%);
1 2
(%o2) sin(-----) = %e x
x + 1
(%i3) ((x - 1)^(3/2) - (x + 1)*sqrt(x - 1))/sqrt((x - 1)*(x + 1));
3/2
(x - 1) - sqrt(x - 1) (x + 1)
(%o3) --------------------------------
sqrt((x - 1) (x + 1))
(%i4) ratsimp (%);
2 sqrt(x - 1)
(%o4) - -------------
2
sqrt(x - 1)
(%i5) x^(a + 1/a), ratsimpexpons: true;
2
a + 1
------
a
(%o5) x
デフォルト値: false
ratsimpexponsがtrueの時、
式整理の間、ratsimpが式の指数に適用されます。
デフォルト値: false
radsubstflagがもし trueなら、
ratsubstが
xに関してsqrt (x)に uを代入するような代入をできるようにします。
cの中のbにaを代入し、結果の式を返します。 bはsumでもproductでもpowerなどでも問題ありません。
substは純粋に構文法的代入ですが、ratsubstは式の意味の何かを知っています。
ゆえに、subst (a, x + y, x + y + z)はx + y + zを返す一方、
ratsubstはz + aを返します。
ratsubstflagがtrueの時、ratsubstは、式が陽には含んでいない根への代入を実行します。
ratsubstはオプション変数keepfloatの値trueを無視します。
例:
(%i1) ratsubst (a, x*y^2, x^4*y^3 + x^4*y^8);
3 4
(%o1) a x y + a
(%i2) cos(x)^4 + cos(x)^3 + cos(x)^2 + cos(x) + 1;
4 3 2
(%o2) cos (x) + cos (x) + cos (x) + cos(x) + 1
(%i3) ratsubst (1 - sin(x)^2, cos(x)^2, %);
4 2 2
(%o3) sin (x) - 3 sin (x) + cos(x) (2 - sin (x)) + 3
(%i4) ratsubst (1 - cos(x)^2, sin(x)^2, sin(x)^4);
4 2 (%o4) cos (x) - 2 cos (x) + 1
(%i5) radsubstflag: false$
(%i6) ratsubst (u, sqrt(x), x);
(%o6) x
(%i7) radsubstflag: true$
(%i8) ratsubst (u, sqrt(x), x);
2
(%o8) u
有理式に関して主変数x_1, ..., x_nを宣言します。 もし有理式の中に存在するなら、x_nは主変数と見なされます。 そうでなければ、もし存在すれば、x_[n-1]が主変数と見なされます。 と、先行する変数を通してx_1まで続きます。 x_1は、続く変数が存在しなかった時だけ主変数と見なされます。
もし有理式の中の変数がratvarsリストの中に存在しなかったら、
その変数には、x_1よりも低い優先順位が与えられます。
ratvarsの引数は、変数もしくはsin(x)のような非有理関数であり得ます。
変数ratvarsは、直近にコールされたときの関数ratvarsの引数のリストです。
関数ratvarsのコールそれぞれは、リストを再設定します。
ratvars ()はリストをクリアします。
デフォルト値: true
MaximaはLisp変数VARLISTの中に有理式の主変数の内部リストを保持します。
もしratvarswitchがtrueなら、
すべての評価は新しいリストVARLISTで開始します。
これがデフォルトの振る舞いです。
そうでなければ、以前の評価からの主変数は
内部リストVARLISTから取り除かれません。
主変数は関数ratvarsで宣言されるのですが、
それはオプション変数ratvarswitchによって影響されません。
例:
もし ratvarswitchがtrue, すべての評価は
新しいリストVARLISTで始まります。
(%i1) ratvarswitch:true$
(%i2) rat(2*x+y^2);
2
(%o2)/R/ y + 2 x
(%i3) :lisp varlist
($X $Y)
(%i3) rat(2*a+b^2);
2
(%o3)/R/ b + 2 a
(%i4) :lisp varlist
($A $B)
もしratvarswitchがfalseなら、
直前の評価からの主変数はまだ存在しています。
(%i4) ratvarswitch:false$
(%i5) rat(2*x+y^2);
2
(%o5)/R/ y + 2 x
(%i6) :lisp varlist
($X $Y)
(%i6) rat(2*a+b^2);
2
(%o6)/R/ b + 2 a
(%i7) :lisp varlist
($A $B $X $Y)
重みw_iを変数x_iに割り当てます。
これは、もし重みが変数ratwtlvlの値を越えるなら、項を0に置き換えるようにします。
(デフォルトでは切り詰めはもたらしません。)
項の重みは、項の中の変数の重みの積の和に変数の指数を掛けたものです。
例えば、3 x_1^2 x_2の重みは2 w_1 + w_2です。
ratwtlvlに従った切り詰めは、
標準有理式(CRE)を掛けたり、指数化する時だけ実行されます。
ratweight ()は、重み割り当ての累積リストを返します。
注意:ratfacとratweight体系は互換性はなく、
同時には使えないかもしれません。
例:
(%i1) ratweight (a, 1, b, 1);
(%o1) [a, 1, b, 1]
(%i2) expr1: rat(a + b + 1)$
(%i3) expr1^2;
2 2
(%o3)/R/ b + (2 a + 2) b + a + 2 a + 1
(%i4) ratwtlvl: 1$
(%i5) expr1^2;
(%o5)/R/ 2 b + 2 a + 1
デフォルト値: []
ratweightsは、ratweightで割り当てられた重みのリストです。
リストは累積されます:
ratweightのコールそれぞれは、リストに項目を追加します。
kill (ratweights)とsave (ratweights)はともに期待通り動作します。
デフォルト値: false
ratwtlvlは、
標準有理式(CRE)の切り詰めを制御するために、
ratweight関数と組み合わせて使われます。
デフォルト値のfalseでは、切り詰めは起こりません。
多項式p_1を多項式p_2で割った余りを返します。
引数x_1, ..., x_nは、ratvarsと同様に解釈されます。
remainderは、divideが返す2要素リストの2番目の要素を返します。
変数xを消去して、2つの多項式p_1とp_2の終結式を計算します。 終結式はp_1とp_2の中のxの係数の判別式です。 それは、p_1とp_2が共通に定数でない因子を持つ時だけゼロに等しいです。
もしp_1もしくはp_2が因数分解できるなら、
resultantをコールする前にfactorをコールするのが望ましいかもしれません。
変数resultantは、
どのアルゴリズムが計算に使われるか制御します。
部分終結式prsにはsubres
モジュラー終結式アルゴリズムにはmod
通分prsにはred。
大抵の問題では、subresが最適です。
いくつかの大きな次数の1変数もしくは2変数問題では、modがよりよいかもしれません。
関数bezoutは、resultantと同じ引数を取り、
行列を返します。
戻り値の判別式は望みの終結式です。
デフォルト値: false
savefactorsがtrueの時、
同じ因子のいくつかを含む式の因数分解を後でする時にスピードアップするために、
因子の積である式の因子がある関数によって保存されるようにします。
式exprの中の標準有理式 (CRE)変数のリストを返します。
ratvarsも参照してください。
多項式因子が「平方にならない」ことを除いて、
factorに似ています。
すなわち、それらは、次数1だけの因子を持ちます。
このアルゴリズムは、factorの最初の段階でも使われるのですが、
多項式は、n階微分と共通に nよりも大きな次数のすべての因子を持つという事実を使います。
このように、それぞれの変数に関する微分の多項式との最大公約数を取ることによって、
1よりも大きな次数の因子を見つけることができます。
例:
(%i1) sqfr (4*x^4 + 4*x^3 - 3*x^2 - 4*x - 1);
2 2
(%o1) (2 x + 1) (x - 1)
多項式p_1, ..., p_nの解である要素を Maximaに知られている代数的整数の環に加えます。 それぞれの引数p_iは、整数係数の多項式です。
tellrat (x)は、実際には、
有理関数の中でxに0を代入することを意味します。
tellrat ()は、現在の代入のリストを返します。
代数的整数の整理が効果を持つようにするために、
algebraicは、trueに設定されなければいけません。
Maximaは、起動の際には、虚数単位と整数の根すべてについて知っています。
核を取り、tellratプロパティを削除するコマンドuntellratがあります。
例えば、tellrat (x^2 - y^2)のように、
多変数多項式をtellratする時、
y^2をx^2に代入するのか逆なのかといった
あいまいさがあります。
Maximaは、特定の順序付けを選びますが、
もしユーザーがどちらか指定したいなら、
例えば,tellrat (y^2 = x^2)は
y^2をx^2で置き換えることを示す構文法を供給します。
例:
(%i1) 10*(%i + 1)/(%i + 3^(1/3));
10 (%i + 1)
(%o1) -----------
1/3
%i + 3
(%i2) ev (ratdisrep (rat(%)), algebraic);
2/3 1/3 2/3 1/3
(%o2) (4 3 - 2 3 - 4) %i + 2 3 + 4 3 - 2
(%i3) tellrat (1 + a + a^2);
2
(%o3) [a + a + 1]
(%i4) 1/(a*sqrt(2) - 1) + a/(sqrt(3) + sqrt(2));
1 a
(%o4) ------------- + -----------------
sqrt(2) a - 1 sqrt(3) + sqrt(2)
(%i5) ev (ratdisrep (rat(%)), algebraic);
(7 sqrt(3) - 10 sqrt(2) + 2) a - 2 sqrt(2) - 1
(%o5) ----------------------------------------------
7
(%i6) tellrat (y^2 = x^2);
2 2 2
(%o6) [y - x , a + a + 1]
exprのすべての部分式を標準有理式(CRE)から一般形に変換して、
結果を返します。
もしexprがそれ自身CRE形なら、totaldisrepは、ratdisrepと同一です。
totaldisrepは、
CRE形の部分式を持つ等式やリストや行列などの式をratdisrepするために役に立つかもしれません。
x_1, …, x_nから
tellratプロパティを
削除します。