Mathematica を使う上での制約
たった1つの Mathematica コマンドで,どんなに優秀なコンピュータでも複雑すぎて処理できないような計算を指定することができてしまう.例えばExpand[(1+x)^(10^100)]である.この計算の結果は,
個の項を持つことになる.何と,その数は宇宙に存在する全粒子の数より大きいものである.
それでも,コンピュータが何であれ Mathematica を起動することができるものなら,Expand[(1+x)^100]を問題なく計算できるはずである.それでも,
の指数を増やしていけば,いつかコンピュータのメモリに入り切らないほど結果が大きくなり,計算不能状態に陥ってしまうだろう.実際にどの時点でそうなるかは,使っているコンピュータのメモリ容量だけでなく,計算を行おうとしているときにすでに稼動している他のジョブ等の詳細に依存するため,一概には判断できない.
計算の途中でメモリが足りなくなってしまった場合は,Mathematica のバージョンによっても違うが,そのほとんどは即座に停止してしまう.このため,コンピュータのメモリ容量を考慮した計算手順を計画しておくことが重要である.
代数計算の結果が割合簡単なものであっても,計算の途中で生成される中間式は非常に複雑になることもある.最終的な結果が小さくても,途中の計算がコンピュータで扱えないほど大きくなってしまうことがある.このような状態が起る場合は,あらかじめ計算を小さい単位に分けておき,別々に実行していくとよいだろう.ここで,Mathematica で用いられるメモリ管理法について触れておく.つまり,計算の1つの部分が終了すると,そこで生成された中間式の保持で使われたメモリは解放され即座に新しい式に回される,という方法が取られている.
メモリ容量は,Mathematica で行える計算を最も大きく制約する要因である.また,時間も制約される要因のひとつである.1秒や1分なら計算が終るのを待つが,それが1時間や1日になったらなかなか待つわけにはいかなくなる.1年だったら,絶対に待てないだろう.
Mathematica の内部コードは非常に効率よく最適化されたアルゴリズムを使用している.しかし,最も有名なアルゴリズムを使うと常に非常に時間がかかってしまうタスクもある.典型的な問題として,アルゴリズムが必要とする時間が入力のサイズが大きくなるにつれて指数関数的に増大する点が挙げられる.この古典的な例に素因数分解がある.整数の素因数分解で最も有名なアルゴリズムを使うと,整数の桁数が増えるにつれて使用時間が指数関数的に増大する.実際には,
の桁数がおよそ40桁より小さければ,FactorInteger[k]を使うとほとんど瞬時に結果が得られる.しかし,
が70 桁以上あるような場合,FactorInteger[k]の計算時間は待ちきれないほど長くなる.
場合によっては既知のアルゴリズムに革新的な改善が見られ,後続バージョンの Mathematica における特定の計算が格段に速くなることもある.しかし,計算理論から,実際には多くの計算が簡略することができない計算作業を常に必要としていて,早いアルゴリズムは決して見付けることはできないと考えることができる.
唯一のアルゴリズムに指数関数的に計算時間が増大する問題があるかどうかにかかわらず,特定のコンピュータシステムで計算を続行するのには計算が大きすぎたり時間がかかりすぎたりする点というものが必ずある.Mathematica を使って仕事をする際には,使用している特定のアプリケーションでできる計算にどのような限界があるかの感覚を持つことが大切である.
| • 数億桁からなる数の計算 |
| • |
| • 百万項からなる多項式の展開 |
| • 変数が4つあり数十万項からなる多項式の因数分解 |
| • 数千の独立要素を持つ二次不等式系の簡約 |
| • 次数百万の疎な多項式の整数根の計算 |
| • 反復規則を百万回適用 |
| • 1千万までの全素数の計算. |
| • 1000×1000の密な行列の数値逆行列の計算 |
| • 数百万の非零の係数と百万の変数を持つ疎な線形系の計算 |
| • 250×250整数行列の行列式の計算 |
| • 10×10の記号行列の行列式の計算 |
| • 次数200の多項式の数値根の計算 |
| • 変数が数十万個の疎な線形計画問題の計算 |
| • 1億の要素のリストのフーリエ変換の計算 |
| • 数万個の頂点と数十万の辺のネットワークを自動的に描画 |
| • 百万個のグラフィックスプリミティブの描画 |
| • 1千万個の要素からなるリストの並べ替え |
| • 1千万個の文字からなる文字列の検索 |
| • 数十メガバイトの数値データのインポート |
| • 数百ページに渡るTraditionalForm出力のフォーマッティング |
