代数操作
多項式の変形操作 | 代数的数体における多項式 |
多項式の部分抽出 | 三角関数式 |
多項式の順序 | 複素数の変数を含む式 |
有理式の変形操作 | 論理関数と区分関数 |
多項式の代数演算 | 簡約化 |
素数を法とする多項式 | 仮定の使用 |
対称式 |
Expand[poly] | 式の積とベキ乗を展開する |
Factor[poly] | 式を因数分解する |
FactorTerms[poly] | 数値の共通因数をくくり出す |
FactorTerms[poly,{x,y,…}] | x, y, …に依存しない共通因数をくくり出す |
Collect[poly,x] | 多項式を x のベキ乗項として整理し直す |
Collect[poly,{x,y,…}] | 多項式を x, y, …のベキ乗項として整理し直す |
Expandを使い,積とベキを展開し,単純な和の形に書き直す:
Factorで多項式を完全に因数分解する:
同じ多項式でも,さまざまな形に書かれる.そのうちの3つの標準的な形が関数Expand,FactorTermsとFactorで得られる.Expandは,多項式の持つすべての積を展開し,式を単純な項の和の形でまとめ直す.FactorTermsは,すべての項に共通な因子でまとめ直す.また,Factorは,なるべく小さい次数の因数に分解する.
複数の変数の多項式については,変数のどれか1つを主要な変数とし,その変数について式を書き直すことが考えられる.Collect[poly,x]は,多変数の多項式を取るが,x を主変数と見立ててベキ乗項の和の形に書き直す.
主変数を複数指定した上でCollectを使う.すると,指定した変数について多項式をまとめ直してくれる:
Expand[poly,patt] | パターン patt にマッチする項を含まない部分は避けて多項式 poly を展開する |
PowerExpand[expr] | 式 expr に (ab)c と (ab)c の形のベキ乗項があればそれらを展開する |
PowerExpand[expr,Assumptions->assum] | |
assum と仮定して expr を展開する |
Wolframシステムは,cが整数である場合を除いて,(ab)cのような形の項を自動的に展開しない.一般に,後者の展開はaとbがともに正の実数であるときに限り正しい.それでも,関数PowerExpandを使えば,aとbが正の実数であると仮定し展開してくれる.
Logもそのままでは展開してくれない:
今度も,PowerExpandを使えば展開できるようになる:
PowerExpandは,指定された仮定に対して正しい結果を返す:
求まった各項の係数部にFactorを適用する:
HornerForm[expr,x] | expr を x についてホーナー(Horner)形式にする |
PolynomialQ[expr,x] | 式 expr が変数 x の多項式かどうか判定する |
PolynomialQ[expr,{x1,x2,…}] | 式 expr が変数 xi の多項式かどうか判定する |
Variables[poly] | 多項式 poly の持つ変数をリストアップする |
Exponent[poly,x] | 多項式 poly における変数 x にかかる最大指数を返す |
Coefficient[poly,expr] | 多項式 poly における式 expr の係数を抽出する |
Coefficient[poly,expr,n] | 多項式 poly における式 exprn の係数を抽出する |
Coefficient[poly,expr,0] | 多項式 poly において式 expr に依存しない項を抽出する |
CoefficientList[poly,{x1,x2,…}] | 多項式 poly の持つ xi の項の係数を抽出し配列を構成する |
CoefficientRules[poly,{x1,x2,…}] | 多項式の指数ベクトルと係数を抽出する |
これは,Coefficient[t,x^2]に等しい:
CoefficientListを使い, の各次数における項の係数を抽出し, の係数から始まるリストを構成する:
CoefficientListを多変数の多項式に適用すると,各変数について各次数ごとに係数が抽出され,各次数ごとに配列表示される:
CoefficientRulesには,非零の係数を持つ単項式のみが含まれる:
MonomialList[poly] | 単項式のリストを取得する |
CoefficientRules[poly] | 指数ベクトルと係数で単項式を表す |
FromCoefficientRules[list] | 規則のリストから多項式を構築する |
FromCoefficientRulesは,規則と変数のリストからもとの多項式を構築する:
この他,順序は重み行列を与えることでも記述することができる.この場合,指数ベクトルは重み行列で乗算され,その結果が辞書式順序に降ベキの順にソートされる.異なる順序に対する行列は以下のように与えられる.
GroebnerBasisとPolynomialReduceのような関数では,順序は正しく並んでいなければならない.これで要素の降順が有限(要素が非負の指数のベクトルである)ということが確実となる.このためには,重み行列の角列の非零の値は正でなければならない.
TraditionalFormでは,辞書式順序に最も近い順序で項が並べ替えられる.
TraditionalFormで表現された多項式である:
以下では高度なタイプセット機能を使い,TraditionalForm出力で現れるのと同じ順序で項のリストを得る:
MonomialListで使用される6つの順序から,結果のリストを逆にするだけで別の順序が得られる.これは事実上指数ベクトルを反転させることに等しい.可換の場合は,変数の順序を反転させることによっても別の順序が得られる.
ExpandNumerator[expr] | 分子だけを展開する |
ExpandDenominator[expr] | 分母だけを展開する |
Expand[expr] | 分子を展開した上で,各項を分母で割った形にまとめる |
ExpandAll[expr] | 分子と分母の両方を完全に展開し,分子の各項を分母で割った形にまとめる |
ExpandNumeratorを使い,各項の分子を展開する:
Expandを使うと,各項の分子を展開した上で対応する分母で割った形に式が展開される:
ExpandDenominatorだと,各項の分母が展開する:
ExpandAllを使い,各項の分子と分母の両方を展開し,分子の各項を分母で割った形にまとめる:
ExpandAll[expr,patt]
, etc.
|
パターン patt にマッチした項を持たない部分は展開しない
|
Together[expr] | 通分する |
Apart[expr] | 単純な分母を持ついくつかの分数項に展開する(部分分数分解) |
Cancel[expr] | 約分する |
Factor[expr] | 分母分子を因数分解する |
Togetherを使い,通分する:
まとめた式にFactorを適用し,分母と分子を因数分解する:
Apartを使い,より簡単な分母を持った項からなる和の式に書き直す(部分分数分解):
Cancelを使い,分母と分子の共通因数を約分する:
Factorを使うと,まず,通分し,その後に分母分子を因数分解する:
数学用語で言えば,Apartは有理式を「部分分数」に分解することを意味する.
複数の変数を持つ式は,Apart[expr,var]を使い各変数について部分分数へ分解できる.
PolynomialQuotient[poly1,poly2,x] | x の多項式 poly1を poly2で割ったときの商.剰余は除去する |
PolynomialRemainder[poly1,poly2,x] | x の多項式 poly1を poly2で割ったときの剰余を抽出する |
PolynomialQuotientRemainder[poly1,poly2,x] | |
商と剰余をリストで与える | |
PolynomialMod[poly,m] | m を法として多項式 poly を簡約する |
PolynomialGCD[poly1,poly2] | 2つの多項式の最大公約式を探す |
PolynomialLCM[poly1,poly2] | 2つの多項式の最小公倍式を探す |
PolynomialExtendedGCD[poly1,poly2] | 2つの多項式の拡大最小公倍式を探す |
Resultant[poly1,poly2,x] | 2つの多項式の終結式を返す |
Subresultants[poly1,poly2,x] | 2つの多項式の主部分終結式の係数を見付ける |
Discriminant[poly,x] | 多項式 poly の判別式を見付ける |
GroebnerBasis[{poly1,poly2,…},{x1,x2,…}] | |
多項式 polyi についてグレブナー基底を探す | |
GroebnerBasis[{poly1,poly2,…},{x1,x2,…},{y1,y2,…}] | |
yi を消去してグレブナー基底を探す | |
PolynomialReduce[poly,{poly1,poly2,…},{x1,x2,…}] | |
多項式 poly を項 polyi で構成された最も小さい形に変換する |
多項式 と が与えられたとき,の次数が より低いという条件の下で,関係式 は必ず一意的に決定する.商 はPolynomialQuotientで,また,剰余 はPolynomialRemainderで求めることができる.
PolynomialModは,整数に対する関数Modの多項式版と考えればよい.m が整数なら,PolynomialMod[poly,m]は,単に多項式 poly の各係数を整数 m を法としてできるだけ低い次数の多項式に還元する.一方,m が多項式のときは,PolynomialMod[poly,m]は,m の適当な倍数 q m を poly から減算することで,次数を最小とした項を実効的に探そうとする.乗数 q は多項式であっても構わないが,その次数は poly の次数より低いものでなければならない.PolynomialModの返す最終的な多項式は,次数と先頭係数をともに最小化した多項式である.
PolynomialModとPolynomialRemainderの主な相違点は,前者が多項式の積と差を取ることで機能するのに対して,後者は割り算を用いるという点にある.また,PolynomialModは,複数の法による簡約化を可能にしている.典型的な例として,多項式と整数をともに法とする簡約化がある.
PolynomialGCDは,2つの多項式の最大公約式を与える:
PolynomialExtendedGCDは,2つの多項式の拡大最大公約式を与える:
関数Resultant[poly1,poly2,x]は,古典的代数問題で必要とされる各種アルゴリズムで使われる.ともに最高次の係数を1とする2つの多項式 と の終結式は,その根の差 の積で与えられる.ある多項式の対があるとき,それらの終結式はもとの多項式対の係数を持った多項式になることが知られている.また,終結式がゼロになるように多項式対のパラメータの値を変えることで対に共通な根を見付けることができる.最高次の係数を1とする2個の多項式は,リストSubresultants[poly1,poly2,x]の最初の 個の要素がゼロであれば, 個の共通な根を持つ.
関数Discriminant[poly,x]はその根の差分の2乗の積である.これを使うと,その多項式に重根があるかどうかが判別できる.判別式は,変数に非依存の因数まで,多項式およびその導関数の終結式に等しい.
グレブナー基底は近代代数アルゴリズムでよく使われる.関数GroebnerBasis[{poly1,poly2,…},{x1,x2,…}]は,与えられた多項式の集合を,式の性質が簡単に推定できる標準的な形に変形してくれる.また,これは重要な特徴だが, GroebnerBasisから得られる多項式系に共通な根はもとの多項式系の共通根に等しい.
Factor[poly] | 多項式を因数分解する |
FactorSquareFree[poly] | 多項式を無平方分解する |
FactorTerms[poly,x] | x に依存しない項について因数分解する |
FactorList[poly]
,
FactorSquareFreeList[poly]
,
FactorTermsList[poly] | |
結果の因数をリスト形式で返す |
関数Factor,FactorTerms,FactorSquareFreeはさまざまの種類の多項式の因数分解を行う.Factorは,整数の範囲で因数分解を行う.FactorTermsでは,多項式の「内容」が対象になる.FactorSquareFreeでは,2乗形の因数を取り出す.
FactorSquareFreeだと,2との因数は引き出すが,他はいじらない:
Factorを使うと,式が完全に因数分解され,もとの形が得られる:
多項式を扱うプログラムを書く場合等で,多項式の項を抽出できると後で操作するのに都合よくなることがある.関数FactorListを使うと,因数分解の後に各因数を,指数部分を付けた形で,リストの成分として得ることができる.このリストの第1要素は,必ず多項式に共通な数値形の因子がくる.
Factor[poly,GaussianIntegers->True] | |
ガウスの整数を係数に許容して因数分解する |
Factorとこれに関連した関数は,通常,普通の整数や有理数を係数とした多項式を扱う.GaussianIntegers->Trueのオプションを設定しておくと,Factorで実数部と虚数部がともに有理数である複素数を係数に持った多項式も扱えるようになる.普通不可能な因数分解の問題でも,この設定をしておくと可能になる場合がよくある.
IrreduciblePolynomialQ[poly] | poly が有理数体上の既約多項式かどうかを判定する |
IrreduciblePolynomialQ[poly,GaussianIntegers->True] | poly がガウスの有理数体上で既約かどうかを判定する |
IrreduciblePolynomialQ[poly,Extension->Automatic] | poly の代数的数の係数により拡張された有理数体上での既約性を判定する |
Sqrt[2]により拡張された有理数体上では,この多項式は可約である:
Cyclotomic[n,x] | n 次の x に関する円周等分多項式を構成する |
Decompose[poly,x] | 可能であれば,多項式 poly をより単純な多項式の合成に分解し,それらの多項式をリストで返す |
因数分解は多項式の再構成に使う重要な手法の1つである.これとは異なる手法として「分解」がある.多項式 を因数分解するとき,それは多項式 の積 の形で書かれる.一方,多項式 を分解するときは,多項式を合成した形,で構成されるとする.
Decomposeを使った簡単な例を見てみよう.もとの多項式 は多項式(ここで は多項式 )と書ける:
Decomposeでもとの関数に分解する:
Decompose[poly,x]は x の多項式をリスト形式で返すが,それらの多項式を合成するともとの多項式が復元できるようになっている.このとき,もとの多項式に x 以外の変数があっても構わないがDecomposeが生成する一連の多項式は x の関数とみなされる.
因数分解と異なり,合成の仕方は完全に一意的ではない.例えば,と の関係にある多項式 と多項式 は,ともに同じ合成式を与える.つまり,になる.またWolfram言語では,定数の項があれば,Decomposeの返すリストにおける最初の項に組み入れられることになっている.
InterpolatingPolynomial[{f1,f2,…},x] | |
x の多項式で,x が整数 i に等しいときには fi に等しくなるものを返す | |
InterpolatingPolynomial[{{x1,f1},{x2,f2},…},x] | |
x の多項式で,x が xi のときには fi に等しくなるものを返す |
PolynomialMod[poly,p] | p を法とし多項式の係数を簡約する |
Expand[poly,Modulus->p] | p を法とし poly を展開する |
Factor[poly,Modulus->p] | p を法とし poly を因数分解する |
PolynomialGCD[poly1,poly2,Modulus->p] | |
p を法とする polyi の最大公約式GCDを探す | |
GroebnerBasis[polys,vars,Modulus->p] | |
p を法とするグレブナー基底を探す |
SymmetricPolynomial[k,{x1,…,xn}] | 変数 の 次基本対称式 |
SymmetricReduction[f,{x1,…,xn}] | となるような の多項式のペアを返す.ここで は対称部分, は剰余である |
SymmetricReduction[f,{x1,…,xn},{s1,…,sn}] | |
の基本対称式を で置換したペアを返す |
SymmetricReductionは記号係数を持つ多項式に適用することができる:
Factorのような関数で多項式の因数分解をするとき,通常,得られる式の係数はすべてが有理数からなるものとする.ただし,オプションExtensionを設定することで係数の存在し得る領域を広げることが可能である.
Expandを作用されると,もとの式が得られる:
Factorのデフォルト設定だと,因数分解してくれない:
他の多項式に関する関数もFactorと同じように機能する.つまり,特に条件を指定しなければ代数的数は単なるシンボルとして扱われ,係数が有理整数において操作可能である.それに対し,Extension->Automaticとオプション設定をすれば,係数の表現に代数的数を使った変形操作が可能となる.
デフォルト設定では,これらの多項式はCancelでは約分できない:
デフォルト設定では,PolynomialLCMで共通な因数は見付けられない:
IrreduciblePolynomialQ[poly,ExtensionAutomatic] | poly が poly の係数により拡張された有理体上の既約多項式かどうかを判定する |
IrreduciblePolynomialQ[poly,Extension->{a1,a2,…}] | poly が poly の係数と a1,a2,…により拡張された有理体上で既約であるかどうかを判定する |
IrreduciblePolynomialQ[poly,ExtensionAll] | すべての複素数体上での既約性を判定する |
Sqrt[2]により拡張された有意数体上では,この多項式は可約である:
Sqrt[3]により拡張された有理数体上では,可約である:
TrigExpand[expr] | 三角関数式を項の和に展開する |
TrigFactor[expr] | 三角関数式を項の積に分解する |
TrigFactorList[expr] | 因数分解で得られる項をその指数とともにリスト形式で返す |
TrigReduce[expr] | 整数倍の角度を用いて三角関数式を簡約する |
TrigExpandを使うと,双曲線関数も展開可能である:
TrigReduceでもとの形に復元する:
Wolframシステムでは,Tanのような関数が自動的に優先される:
TrigToExpで三角関数を指数表記に書き直す:
TrigToExpは双曲線関数に使うこともできる:
ExpToTrigで逆の変形を行う.変形操作で複素数はできる限り取り払われる:
ExpToTrigは双曲線関数や円関数にも適用できる:
ExpToTrigを純粋な数値からなる式に適用してもよい:
ComplexExpandは代数式や三角関数の式を展開するのに使うが,変数の取れる型は明確に条件付けられる.
ComplexExpand[expr] | すべての変数が実数であるという前提で式 expr を展開する |
ComplexExpand[expr,{x1,x2,…}] | 変数 xi が複素数であるという前提で式 expr を展開する |
実数のパラメータを使い複素数の変数 z を表す方法はいくつかある.例えば,先に示したように,z は「直交座標の形式」でRe[z]+I Im[z]と書ける.また,「極形式」なら,Abs[z] Exp[I Arg[z]]と書ける.
ComplexExpandの指定にオプションTargetFunctionsの設定を付加することで,複素数の変数をどう表すべきか指定できる.TargetFunctionsには{Re,Im,Abs,Arg,Conjugate,Sign}の中の関数をリスト形式で割り付ける.すると,ComplexExpandが,与えられた関数を使い展開式の変数を書き直してくれる.何も指定していないときは, ReとImがデフォルトで使われる.
LogicalExpand[expr] | expr 中の論理関数を展開する |
PiecewiseExpand[expr] | expr 中の区分関数を展開する |
PiecewiseExpand[expr,assum] | 指定の仮定のもとで展開する |
LogicalExpandは論理式をORとANDからなる標準的な選言標準形(disjunctive normal form,略してDNF)にする.
LogicalExpandを使うとこの式がORとANDを含む形に展開される:
LogicalExpandはすべての論理関数に使うことができ,常に論理式を標準的なORとANDの形式にする.必然的に結果が非常に大きくなることもある.
XorはANDとORを用いて表すことができる:
MaxやAbsのような関数は,ClipやUnitStepと同じように,暗示的に条件を含んでいる.それらの条件の組合せはPiecewiseExpandを使って単一のPiecewiseオブジェクトに簡約することができる.
これは結果を単一のPiecewiseオブジェクトとして与える:
Wolfram言語はデフォルトで,計算のどの段階においても,Floorのような単一の区分関数の展開で明示的に生成する場合数を限定している.この境界は$MaxPiecewiseCasesを再設定することで変更できる.
Simplify[expr] | さまざまな代数的変換式と三角関数の変換式を用いて式を簡約する |
FullSimplify[expr] | はるかに広い範囲の変換規則を使い簡約する |
Simplifyを適用し簡約化を強制する:
Simplifyを使えば,標準的な代数的変換式や三角関数の変換式を用いて簡約してくれる:
FullSimplifyを使えばさらに変換が可能である:
FullSimplify[expr,ExcludedForms->pattern] | |
パターン pattern にマッチする式の成分は除くようにして,式 expr を簡約する |
デフォルト設定での,FullSimplifyは,式のすべてを簡約しようとする:
FullSimplifyに平方根を簡約化処理から外すように指示する:
FullSimplify[expr,TimeConstraint->t] | |
式 expr を簡約するが,変換処理に t 秒以上の時間がかかるようなら処理を中止する | |
FullSimplify[expr,TransformationFunctions->{f1,f2,…}] | |
式 expr の部分の変換に関数 fi だけを用いる | |
FullSimplify[expr,TransformationFunctions->{Automatic,f1,f2,…}] | |
fi と組込み変換を用いる | |
Simplify[expr,ComplexityFunction->c] および FullSimplify[expr,ComplexityFunction->c] | |
c を用いて最も単純な形を決定して簡約する |
これは,SimplifyとFullSimplifyのどちらにも有効だが,簡約化とは,どんな式の形を使ったら最も簡単な式が形成できるかに尽きる.最適な形を自動的に探させるのではなく,意図的に指定することも可能になっている.これをするにはComplexityFunction->c のオプション設定を行う.指定した関数が候補にあがる式に適用され,最小な数値を生む候補の式が最終的な簡約した式として出力される.
Simplifyのデフォルトの設定だと,この式は何も簡約できない:
Wolfram言語は通常,オブジェクトの処理に必要なだけの最小限の仮定しかしない.これによりその結果も可能な限り一般的になる.しかし,場合によってこれらの結果は,より多くの仮定がなされた場合よりもかなり複雑になってしまうこともある.
Refine[expr,assum] | 仮定を用いて expr を約す |
Simplify[expr,assum] | 仮定の下で簡約する |
FullSimplify[expr,assum] | 仮定の下で完全に簡約する |
FunctionExpand[expr,assum] | 仮定の下で関数を展開する |
デフォルトのSimplifyはこの式に本質的には何もしない:
これによりSimplifyで方程式が真であるという証明ができる:
SimplifyとFullSimplifyは常に式の最も簡単な形を求めようとする.しかし,場合によってはWolfram言語に特定の前提条件の下で通常の評価過程を進ませたいこともあるだろう.そのような場合にはRefineを使うとよい.Refine[expr,assum]は expr 中の変数が前提条件 assum を満たす数式で置き換えられたならばWolfram言語が自動的に行うであろう変形と同じ変形を行う.
これ以上簡単な形はSimplifyには見付けられない:
仮定において重要なことは,あるオブジェクトが特定の領域の要素であるということを主張することである.x∈dom を用いてそのような仮定を設定することができる.ここで,∈文字はEscelEscまたは∖[Element]として入力できる.
x∈dom または Element[x,dom] | x は領域 dom の要素である |
{x1,x2,…}∈dom | すべての xi は領域 dom の要素である |
patt∈dom | patt と合致するような任意の式が領域 dom の要素である |
Complexes | 複素数 の領域 |
Reals | 実数 の領域 |
Algebraics | 代数的数 の領域 |
Rationals | 有理数 の領域 |
Integers | 整数 の領域 |
Primes | 素数 の領域 |
Booleans |
FullSimplifyは,特殊関数の知識にアクセスする:
Simplify[expr,assum]あるいはRefine[expr,assum]のようなものには使いたい前提条件を明示的に与える.しかし,操作全体に1組の前提を指定したい場合もあるだろう.そのような場合はAssumingを使うとよい.
Assuming[assum,expr] | 前提条件 assum を使って expr を評価する |
$Assumptions | デフォルトの前提条件 |
SimplifyやRefineのような関数は使うべきデフォルトの前提条件を指定するオプションAssumptionsを取る.デフォルトでは,このオプションの設定はAssumptions:>$Assumptionsである.Assumingは,Blockにおけるように局所値を$Assumptionsに割り当てるという方法で作用する.
Assumptionsオプションを取るためにAssumingを使って前提条件を指定できる関数はSimplifyとRefineの他にもたくさんある.FunctionExpand,Integrate,Limit,Series,LaplaceTransform等がその例である.
Integrateでは自動的に前提条件が使われる: