|
3.3.4 多項式の代数演算
普通の計算で多項式を変形する必要があるなら,これまでの節で説明した機能で十分用が足りる.
しかし,さらに高等な代数計算をするなら,以下に示す機能を使う必要があるだろう.
ただし,本節で説明する演算機能のほとんどは,係数が有理数で各項の指数が整数である,通常の多項式についてのみ適用可能であるので注意しなければいけない.

多項式の簡約化的な操作
多項式 と が与えられたとき, の次数が より低いという条件のもとで,関係式 は必ず一意的に決定する.商 は PolynomialQuotientで,また,剰余 はPolynomialRemainderで求めることができる.
を で割ったときの余りを求める.
In[1]:= PolynomialRemainder[x^2, x+1, x]
Out[1]= 
今度は,余りは捨て商を求める.
In[2]:= PolynomialQuotient[x^2, x+1, x]
Out[2]= 
こうするともとの式が再構築できる.
In[3]:= Simplify[ (x+1) % + %% ]
Out[3]= 
この2つの多項式では,式が xについてのものか, yについてのものかにより答が変わってくる.
In[4]:= {PolynomialRemainder[x+y, x-y, x], PolynomialRemainder[x+y, x-y, y]}
Out[4]= 
PolynomialGCD[ , ]は, と の2つの多項式を割り切る最高次数の式を返す.この関数は整数の最大公約数を求めるのに使う関数GCDの多項式版である.
PolynomialGCDを適用し,2つの多項式の最大公約式を求める.
In[5]:= PolynomialGCD[ (1-x)^2 (1+x) (2+x), (1-x) (2+x) (3+x) ]
Out[5]= 
PolynomialModは,整数に対する関数 Modの多項式版と考えればよい. mが整数なら,PolynomialMod[poly, m]は,単に多項式 polyの各係数を整数 mを法として最小数に還元する.一方, mが多項式のときは, PolynomialMod[poly, m]は, mの適当な倍数 q mを polyから減算することで,次数を最小とした項を実効的に探そうとする.乗数 qは多項式であっても構わないが,その次数は polyの次数より低いものでなければならない. PolynomialModの返す最終的な多項式は,次数と先頭係数をともに最小化した多項式である.
を法として を簡約する.結果は単に多項式の割り算の余りである.
In[6]:= PolynomialMod[x^2, x+1]
Out[6]= 
この場合, PolynomialModと PolynomialRemainderは同じ結果にならない.
In[7]:= {PolynomialMod[x^2, a x + 1], PolynomialRemainder[x^2, a x + 1, x]}
Out[7]= 
PolynomialModと PolynomialRemainderの主な相違点は,前者が多項式の積と差を取ることで機能するのに対して,後者は割り算を用いるという点にある.また, PolynomialModは,複数の法による簡約化を可能にしている.典型的な例として,多項式と整数をともに法とする簡約化がある.
と をともに法とし を簡約する.
In[8]:= PolynomialMod[x^2 + 1, {x + 1, 2}]
Out[8]= 
関数 Resultant[ , , x]は,古典的代数問題で必要とされる各種アルゴリズムで使われる.ともに最高次の係数を1とする2つの多項式 と の終結式は, と の根の差 の積で与えられる.ある多項式の対があるとき,それらの終結式はもとの多項式対の係数を持った多項式になることが知られている.また,終結式がゼロになるように多項式対のパラメータの値を変えることで対に共通な根を見付けることができる.最高次の係数を1とする2個の多項式は,リストSubresultants[ , , x]の最初の 個の要素がゼロであれば, 個の共通な根を持つ.
と の多項式を について合成する.多項式に共通な に関する根は,合成式を0にする の値についてのみ存在する.
In[9]:= Resultant[(x-y)^2-2, y^2-3, y]
Out[9]= 
グレブナー基底は近代代数アルゴリズムでよく使われる.関数 GroebnerBasis[ , , ... ,  , , ... ]は,与えられた多項式の集合を,式の性質が簡単に推定できる標準的な形に変形してくれる.また,これは重要な特徴だが, GroebnerBasisで得られる多項式系に共通な根はもとの多項式系の共通根に等しい.
は冗長なので, グレブナー基底には現れない.
In[10]:= GroebnerBasis[{(x+y), (x+y)^2}, {x, y}]
Out[10]= 
多項式 1は根を持たない.このため,もとの多項式には共通な根が存在しない.
In[11]:= GroebnerBasis[{x+y,x^2-1,y^2-2x}, {x, y}]
Out[11]= 
求まる多項式は互いに依存しない形なので,ちょうど5つ根が存在することが分かる.
In[12]:= GroebnerBasis[{x y^2+2 x y+x^2+1, x y+y^2+1}, {x, y}]
Out[12]= 
PolynomialReduce[poly,  , , ... ,  , , ... ]はリスト形式で多項式の集合   , , ... , b を返す.求まる多項式は, bは最小次数で, + + ... + b = polyを満たす.
を項 と項 で書き表し,剰余は のみに依存する.
In[13]:= PolynomialReduce[x^2 + y^2, {x - y, y + a}, {x, y}]
Out[13]= 

多項式の因数分解用関数
関数 Factor, FactorTerms, FactorSquareFreeはさまざまの種類の多項式の因数分解を行う. Factorは,整数の範囲で因数分解を行う. FactorTermsでは,多項式の「内容」が対象になる. FactorSquareFreeでは,2乗形の因数を取り出す.
多項式を入力し,展開しておく.
In[14]:= t = Expand[ 2 (1 + x)^2 (2 + x) (3 + x) ]
Out[14]= 
FactorTermsで分解すると,すべての項に共通な 2が外に引き出される.
In[15]:= FactorTerms[t, x]
Out[15]= 
FactorSquareFreeだと, 2と (1 + x)^2の因数は引き出すが,他はいじらない.
In[16]:= FactorSquareFree[t]
Out[16]= 
Factorを使うと,式が完全に因数分解され,もとの形が得られる.
In[17]:= Factor[t]
Out[17]= 
多項式を扱うプログラムを書く場合等で,多項式の項を抽出できると後で操作するのに都合よくなることがある.関数 FactorListを使うと,因数分解の後に各因数を,指数部分を付けた形で,リストの成分として得ることができる.このリストの第1要素は,必ず多項式に共通な数値形の因子がくる.
FactorListの多項式の出力の仕方は, FactorIntegerの整数の出力の仕方に相当する.
前の例で使った多項式をまた因数分解する.ただし,今度は,得られる因数をリストで出す.リストの各要素は項の因数と指数部からなる.
In[18]:= FactorList[t]
Out[18]= 

複素数を係数に持つ因数分解
Factorとこれに関連した関数は,通常,普通の整数や有理数を係数とした多項式を扱う. GaussianIntegers -> Trueのオプションを設定しておくと,実数部と虚数部がともに有理数である複素数を係数に持った多項式も扱えるようになる.普通不可能な因数分解の問題でも,この設定をしておくと可能になる場合がよくある.
普通の整数しか係数に使えないことにすると,この多項式はこれ以上因数分解できない.
In[19]:= Factor[1 + x^2]
Out[19]= 
ガウスの整数もよしとすると,今度は,分解可能になる.
In[20]:= Factor[1 + x^2, GaussianIntegers -> True]
Out[20]= 

円周等分多項式
円周等分した多項式は,さまざまな代数演算アルゴリズムで「基本多項式」として使われる.この多項式は,式 で定義される.ここで, は より小さく,かつ, に対して互いに素となる正整数すべてを動く.
円周等分多項式 を求める.
In[21]:= Cyclotomic[6, x]
Out[21]= 
は の因数に現れる.
In[22]:= Factor[x^6 - 1]
Out[22]= 

多項式の分解
因数分解は多項式の再構成に使う重要な手法の1つである.因数分解に似た手法として「分解」がある.多項式 を因数分解するとき, は項の積, ,の形で構成されるとする.一方,多項式 を合成に分解するときは,多項式を合成した形, ,で が構成されるとする.
Decomposeを使った簡単な例を見てみよう. としたとき,もとの多項式は と書ける.
In[23]:= Decompose[x^4 + x^2 + 1, x]
Out[23]= 
多項式の関数を2つ作っておく.
In[24]:= ( q1[x_] = 1 - 2x + x^4 ; q2[x_] = 5x + x^3 ; )
関数を複合化した形にする.
In[25]:= Expand[ q1[ q2[ x ] ] ]
Out[25]= 
Decomposeでもとの関数に分解する.
In[26]:= Decompose[%, x]
Out[26]= 
Decompose[poly, x]は xの多項式をリスト形式で返すが,それらの多項式を合成するともとの多項式が復元できるようになっている.このとき,もとの多項式に x以外の変数があっても構わないが, Decomposeが生成する一連の多項式は xの関数とみなされる.
因数分解と異なり,合成の仕方は完全に一意的ではない.例えば, と の関係にある多項式 と多項式 は,ともに同じ合成式を与える.つまり, になる.また,定数の項があれば, Decomposeの返すリストにおける最初の項に組み入れられることになっている.

補間多項式を作成する
3つの点を通る2次式を求める.
In[27]:= InterpolatingPolynomial[{{-1, 4}, {0, 2}, {1, 6}}, x]
Out[27]= 
xが 0のとき,2次式の値は 2になる.
In[28]:= % /. x -> 0
Out[28]= 
|