|
1.4.9 Mathematicaを使う上での制約
たった1つの Mathematicaコマンドで,どんなに優秀なコンピュータでも複雑すぎて処理できないような計算を指定することができてしまう.例えば,Expand[(1+x)^(10^100)]である.この計算の結果は, 個の項を持つことになる.なんと,その数は宇宙に存在する全粒子の数より大きいものである.
それでも Mathematicaを使えば,コンピュータが何であれ Mathematicaを走らすことができるものなら, Expand[(1+x)^100]を問題なく計算できるはずである.それでも, (1+x)の指数を増やしていけば,いつかコンピュータのメモリに入り切らないほど結果が大きくなり,計算不能状態に陥ってしまうだろう.実際にどの時点でそうなるかは,使っているコンピュータのメモリ容量だけでなく,計算を行おうとしているときにすでに稼動している他のジョブ等の詳細に依存するため,一概には判断できない.
計算の途中でメモリが足りなくなってしまった場合は, Mathematicaのバージョンによっても違うが,そのほとんどは即座に停止してしまう.このため,コンピュータのメモリ容量を考慮した計算手順を計画しておくことが重要である.
代数計算の結果が割合簡単なものであっても,計算の途中で生成される中間式は非常に複雑になることもある.最終的な結果が小さくても,途中の計算がコンピュータで扱えないほど大きくなってしまうことがある.このような状態が起る場合は,あらかじめ計算を小さい単位に分けておき,別々に実行していくとよいだろう.ここで,Mathematicaで用いられるメモリ管理法について触れておく.つまり,計算の1つの部分が終了すると,そこで生成された中間式の保持で使われたメモリは解放され即座に新しい式に回される,という方法が取られている.
メモリ容量は, Mathematicaで行える計算を最も大きく制約する要因である.また,時間も制約される要因の1つである.1秒や1分なら計算が終るのを待つが,それが1時間や1日になったらなかなか待つわけにはいかなくなる.1年だったら,絶対に待てないだろう.
Mathematicaの内部コードは非常に効率よく最適化されたアルゴリズムを使用している.しかし,最も有名なアルゴリズムを使うと常に非常に時間がかかってしまうタスクもある.典型的な問題として,アルゴリズムが必要とする時間が入力のサイズが大きくなるにつれて指数関数的に増大する点が挙げられる.この古典的な例に素因数分解がある.整数の素因数分解で最も有名なアルゴリズムを使うと,整数の桁数が増えるにつれて使用時間が指数関数的に増大する.実際には,kの桁数がおよそ40桁より小さければ,FactorInteger[k]を使うとほとんど瞬時に結果が得られる.しかし,kが60桁あるような場合,FactorInteger[k]の計算時間は待ちきれないほど長くなる.
場合によっては既知のアルゴリズムに革新的な改善が見られ,後続バージョンのMathematicaにおける特定の計算が格段に速くなることもある.しかし,計算理論から,実際には多くの計算が簡略することができない計算作業を常に必要としていて,早いアルゴリズムは決して見付けることはできないと考えることができる.
唯一のアルゴリズムに指数関数的に計算時間が増大する問題があるかどうかに関わらず,特定のコンピュータシステムで計算を続行するのには計算が大きすぎたり時間がかかりすぎたりする点というものが必ずある.Mathematicaを使って仕事をする際には,使用している特定のアプリケーションでできる計算にどのような限界があるかの感覚を持つことが大切である.

2003年製のPC上級機種において数秒かかる代表的な計算・操作
|