Go to the first, previous, next, last section, table of contents.


多項式を分解する(Decomposing Polynomials)

poly 関数は、一つの多項式と一つの変数を引数として取り、 多項式係数群のベクトル(リスト)を返します(定数項が先頭に来ます)。 例えば、`poly(x^3 + 2 x, x)'[0, 2, 0, 1] を返します。 入力が x の多項式でない場合、 poly 呼出しは(評価されずに) シンボリックなまま残されます。 入力が変数 x を含まない場合、それは定数項と解釈され、 その入力がそのまま長さ 1 のリストとして返されます。 `poly(x, x)' 呼出しはリスト [0, 1] を返します。 返されたリストの最後の要素はゼロでないことが保証されます。 注意: `poly(0, x)' は空リスト [] を返します。 注意その2: x は実はどんな式でも構いません。 例えば、`poly(sin(x)^2 - sin(x) + 3, sin(x))'[3, -1, 1] を返します。

多項式 px^k の係数を得るには、 `poly(p, x)_(k+1)' としてください。 多項式 p の次数を得るには `vlen(poly(p, x)) - 1' としてください。 例えば、`poly((x+1)^4, x)'`[1, 4, 6, 4, 1]' を返すので、 `poly((x+1)^4, x)_(2+1)' はこの多項式における x^2 の係数 6 を与えます。

解決エンジンの重要な特徴のひとつは、 "本質的な"多項式を認識する能力です。 この能力は gpoly 関数を通じてユーザーが利用できます。 これはちょうど poly のように、 `gpoly(expr, var)' として使います。 exprvar を含む何かの項の多項式であれば、 この関数はベクトル `[x, c, a]' を返します。 ただし、xvar に依存する項, c は(poly が返すのと同じような)多項式係数のリスト, a は 乗数で普通は 1 です (訳注: 1 以外を返すのは例えば `gpoly(2x, x)' は [x, [2], x] を返す)。 基本的に、 `expr = a*(c_1 + c_2 x + c_3 x^2 + ...)' です。 c の最後の要素はゼロでないことが保証され、 c`[1]' になることはあり得ません (つまり、くだらない分解 expr = x は多項式とは見なされません)。 (訳注: `gpoly(x^2, x)' は [x, [1], x^2] を返すぞ?) 副作用は、 多項式と認識されても良さそうな `gpoly(x, x)'`gpoly(6, x)' が、(くだらないから)そうならない事です。

例えば、`gpoly((x-2)^2, x)' は、 多項式を展開すると 4 - 4 x + x^2 なので `[x, [4, -4, 1], 1]' を返します。

x 自体が var の多項式になる場合があります。 これによって c ベクトルのサイズを小さくできる場合はそうなります。 例えば、 `gpoly(x^4 + x^2 - 1, x)'`[x^2, [-1, 1, 1], 1]' を返します。 x^2 の 2次多項式は x の 4次多項式より簡単だからです。

gpoly が認識できる多項式の例をいくつか挙げます:

sin(x) - 1               [sin(x), [-1, 1], 1]
x + 1/x - 1              [x, [1, -1, 1], 1/x]
x + 1/x                  [x^2, [1, 1], 1/x]
x^3 + 2 x                [x^2, [2, 1], x]
x + x^2:3 + sqrt(x)      [x^1:6, [1, 1, 0, 1], x^1:2]
x^(2a) + 2 x^a + 5       [x^a, [5, 2, 1], 1]
(exp(-x) + exp(x)) / 2   [e^(2 x), [0.5, 0.5], e^-x]

poly および gpoly 関数は、 第3 の整数引数を使って受付ける多項式の最大次数を指定できます。 これが n の場合なら、 長さが n+1 以下の c ベクトルだけが返されます。 そうでなければ、poly または gpoly 呼出しがそのまま (シンボリックなまま)残ります。 例えば、方程式解決エンジンは 4次までの多項式を扱えるので、 `gpoly(expr, var, 4)' を呼出して、 expr が 1次〜4次式のどれかとして扱えないか確かめます。

pdeg 関数は、多項式の次数を計算します。 `pdeg(p,x)'p 中に現れる x の最高べき次数です。 これは `vlen(poly(p,x))-1' と同じですが、ずっと効率的です。 もし x について p が定数ならば、`pdeg(p,x) = 0' となります。 もし px の多項式でなければ(例えば `pdeg(2 cos(x), x)')、 関数は評価されずに残ります。 2番目の引数 x は省略可能で、その場合 `pdeg(p)' は、 多項式 p の中に現れる全ての変数の合計最高次数を返します。 注意: ゼロでない任意の定数 c について pdeg(c) = pdeg(c,x) = 0 であり、 また定数ゼロの次数は -inf (負の無限大)と見なします。

plead 関数は、多項式の主項を見つけます。 `plead(p,x)'`poly(p,x)_vlen(poly(p,x))' と同等ですが、 より効率的です。 特に、`plead((2x+1)^10, x)' は係数リストを展開することなく 1024 を返します。 p = 0 のときに限り、plead(p,x) の値はゼロになります。

pcont 関数は、多項式の コンテント(content) を見つけます。 これは多項式の全係数の最大公約数です。 2引数では、pcont(p,x) は実質的に `poly(p,x)' を使って係数リストを得、 次に pgcd (the polynomial GCD function) を使って答を計算します。 例えば、`pcont(4 x y^2 + 6 x^2 y, x)'`2 y' になります。 コンテントは、p を割切れる「最大の」多項式です。 コンテントの符号は主項の係数と同じです。

1引数では、`pcont(p)' は多項式の数値コンテント、 つまり全ての数値係数の gcd を計算します。 注意: gcd は整数のような有理数に対して定義されていて、 分子の gcd や分母の lcm を計算します。 それで、`pcont(4:3 x y^2 + 6 x^2 y)' は 2:3 を返します。 多項式をこの数で割ると、分数係数を消すことができます。 多項式の全ての係数が負の場合に限り、数値コンテントは負になります。

pprim 関数は、多項式の primitive part を見つけます。 これは多項式をそのコンテントで(必要なら pdiv を使って)割ったものです。 入力の多項式が有理数の係数を持っていたら、 結果は整数係数を使った簡単な式になります。


Go to the first, previous, next, last section, table of contents.     利用度数