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] を返します。
多項式 p の x^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)' として使います。
expr が var を含む何かの項の多項式であれば、
この関数はベクトル `[x, c, a]' を返します。
ただし、x は var に依存する項,
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' となります。
もし p
が x
の多項式でなければ(例えば `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.
利用度数