Mathematica のアルゴリズム

Mathematica の持つ組込み関数には,コンピュータサイエンスおよび数学の分野で開発された非常に多くのアルゴリズムが使われている.アルゴリズムのいくつかは古くから使われてきたものだが,ほとんどのものは Mathematica 用に特別に開発したものか,既存のものを改良したものである.中でもより数学的なアルゴリズムについては,開発過程のどこかで人間の手計算で同じ問題が解かれ,アルゴリズムの計算が正確かどうか確かめられている.いずれにしても,手計算で使う手法が実際のアルゴリズムとは異なることに注意してほしい.

記号積分を例に見てみよう.手計算では,よく,変数変換や他の技法を使って積分していく.

これに対して,Mathematica では,記号積分は体系化されたごく少数の手法だけで計算が実行される.例えば,不定積分を求める場合は,まず,最も一般的な積分の原形が検索される.次に,見付かった原形が微分され,その微分式においてもとの積分式に釣り合った数の不確定係数が得られたかどうか判定が行われる.

上記の手順で作業が進行すると,計算の途中で,非常に複雑な代数式が生成されてしまう.時には,非常に難解な数学関数が含まれてしまう.それでも,この手順は完全に体系化されているので,手計算で使うような巧妙な技法は必要としない,という大きな利点を持っている.

だから,Mathematica の積分で得られる結果は,常に体系的に求められたものであると考えてよい.しかし,結果が導出される方法は,手計算の手法とは似ても似つかないものと考えてよいだろう.

同様なことが,Mathematica の使うほとんどのアルゴリズムに関してもいえる.一見簡単そうな演算でも,Mathematica 内で処理されると,高等数学や計算工学の定理に基づいた体系的なアルゴリズムが使われるため,案外複雑なものとなる.

例えば, についての多項式を因数分解するには,まず,17のような素数を法として,その素数ともとの多項式を法とした の高次ベキで還元することにより得られた行列の零空間を求める.次に,各種の代数学と解析学の定理を使い,同じ素数の連続するベキを法として「持上げ」操作が行われることで整数係数上における因数分解が完了する.

このように,体系化した強力なアルゴリズムが使われているので,組込み関数だけを使い,難解な式でも,一般化された式でもすべてを一様に扱うことができる.しかし,式が単純なものなら,わざわざ複雑な処理をしなくてもよく,事実,単純な計算には,より効率の高い簡素化されたアルゴリズムが使われるようにもなっている.

このように,特殊ケースにも対応しているため,組込み関数には数多くの補助的なコードが付加されている.このために,カーネル全体のコード形態が非常に複雑なものになってしまっている.ちなみに,関数によっては基本的なソースコードだけなら5ページの記述で済むところが,補助的なコードのため100ページの長さになってしまったものもある.

Mathematica で使われるアルゴリズムは,上記の特殊なものも入れて,ほとんどが手作業で構築されたものであるが,中にはコンピュータを使い自動的に生成されたものもある.

このようなものに,機械精度による数学関数の評価で使われる数値解析アルゴリズムがある.アルゴリズムの主要な部分はなるべくコンパクトで,かつ,最高精度の近似をもたらす式からなっている.

数値解析に使われる式の多くは,Mathematica を使い導出されたものである.最終的な式の構築のために,非常に長いコンピュータ時間が費やされるが,その結果として,関数を効率よく評価できる短く最適化された式が得られている.

New to Mathematica? Find your learning path »
Have a question? Ask support »