数学ソフトウェアの記述を考える
(仮)自己紹介に代えて
LS
ゼミ 1999/05/17 神戸 発表分レジュメ クラスによる既存ライブラリへのインターフェース・ライブラリ *多倍長浮動小数点演算と初等関数値計算ライブラリ
以下のような多様な数学的対象を扱う。(以下の分類は厳密なものではない。)
数値解析浮動小数点演算(四則演算、基数変換、丸め、精度保証)、線型計算(線型方程式の求解、行列の固有値)、関数値計算(初等関数、特殊関数)、級数展開と評価(多項式、有理式、FFT、…)、補間とあてはめ、数値積分、高速微分法、反復による微分方程式の求解(一次元と多次元、初期条件と境界条件)、反復による非線型方程式の求解、有限要素法、線型計画法、… 数式処理(計算機代数)
整数演算
(多倍長整数や有理数の四則演算、素因数分解、素数判定、…)、多項式演算(多項式や有理式の四則演算、微分、積分)多項式で表わされる方程式の求解(多項式の因数分解、終結式、Grobner基底、CAD、代数的数、根号表現、二分法による数値解の算出)、多項式で表される不等方程式の求解(Quontifier Elimination)、… 統計統計量の算出
(平均、分散、相関、…)、モデリング、検定、データの可視化具体的な手法は数値解析と共通する部分も多い。
論理推論、定理証明
あまり詳しくない…。
大雑把に分けて以下のような形態のソフトウェアがある。
ソフトウェアから呼び出されて使われる頻度が高い前者ほど能率が重視され、対話的な利用が多くなる後者ほど応答も重視されるようになる。
1)
計算エンジン/ライブラリ2)
「電卓」やインタプリタ3)
ソルバー4)
シミュレータ数学的対象を計算機資源に写像し、計算機上で取り扱えるようにするソフトウェア。
余談
1:計算機の最も古い利用法を支えるソフトウェア。余談
2:計算機上の処理は程度の差こそあれ数学的背景がある。余談
3:数学ソフトウェアを使用した数学の研究を「数学の最前線に挑む機械化数学部隊」と評した人もいる。C++クラスによる既存ライブラリへのインターフェース・ライブラリ
(
1994年、1993年度修士論文)(
1994年、計算機代数に関する数解研研究集会で発表)基本的要求を核となるライブラリに任せ、使い易いAPIの仕様という追加的要求を追及する。
計算機は有限なので無条件の無限精度は無理。
精度の評価
(数値解析):数値解析では有限精度で計算を打ちきる代わりに解が一定の範囲内にあることを保証しようとする。無限精度
(数式処理):数式処理では打ちきらずに精度を確保する代わりに基本演算の所要時間が一定せず、計算によっては正常には終了しない場合もある。処理が完了する、つまり解けるものだけを解くという姿勢。応答性よりは能率重視。
それ自身が使い易さの基準である5)は4)の拡張が衝突しないためにも必要になる。
基礎集合から生成規則(公理系)に則って有限回のベキと直積によって有限生成された集合(基礎概念)を考えるとき、基礎集合と基礎概念の組(型)として、型と公理系の組。
複数の構造を併せ持ったり、複数の構造の組み合わせになっている構造もある。
主なものを大きく分けて以下の
3種類がある。計算機科学的には、数学的構造は「値の集合(台集合)」とそれらの値を関連付ける「関係、演算、関数のシグニチャの組(型)」、そして「関係、演算、関数の計算規則(意味)」の組。
数学的構造(特に数学的型)を型システム上に写像する。
ポリモルフィックな型システム:
1つのオブジェクトが複数の型に属すことができる型システム。表
.1:ポリモルフィズム技法の分類
名前 |
異称 |
|
ad hoc |
型強制 (coercion) |
暗黙の型変換 |
多重定義 (overloading) |
||
general |
包含 (inclusion) |
継承 |
総称型 (parametric) |
テンプレート型 |
(
Caradelli & Wegner 1985に基づく)長所:台集合に共通部分があるが、構造が準同型の関係ですらない型を結びつける唯一の方法
短所
1:コピーが作成されるので、あまり巨大な構造を作るような変換を行なったりさせない方が無難かも…。短所
2:一般にあまり大規模な処理が仮定されていないので、あまり重い処理をさせない方が無難かも…。長所
1: 実行効率を落さずに概念的には同じだが実装の著しく異なる関数や演算子のポリモルフィックな適用が可能になる。長所
2:(ラジアン型など)目新しい表現・アルゴリズムに対する違和感を減らす効果がある。長所
3:(逆行列を求解に用いるなどの)初歩的な間違いを減らす効果がある。短所
1:定義の作業が結構煩雑。短所
2:C++では備え付けの演算子を既定の優先順位でしか利用できない。解析関数の階層構造の表現
行列の構造分類の階層構造
(テンプレートを利用した方が賢かったかも。)長所:一部関数のコードが素直に再利用できる。
短所
1:準同型の中でも部分構造は制約がきついので数学ソフトウェアでは利用できる局面が必ずしも多くない。短所
2:あまり軽い処理ではオーバーヘッドが大きくなる。(ループの中で使われる処理でなければさして問題ではない。)a)
関数型に共通のテンプレートb)
精度のパラメータ化メモ:この研究の当時(
1993年前後)はまだテンプレートが十分に利用できなくてマクロで代用。長所:構造的には同じだが実装の著しく異なる型のポリモルフィックな定義が実行効率を落さずに可能になる。
短所
1:マクロ展開のような実装のためC++ではデバッグがし辛い傾向がある。短所
2:マクロ展開のような実装のためC++ではコードが膨張することがある。
事前に程度が予測し辛い多項式の評価を行う。
研究のヤマ場は
20年以上も前に終わっていて、あるサーベイが嘆くことには「今や秘術」。特に基数変換では苦労した。
→結局、全てマジメに計算した。
(数式処理学会
1995年度大会で発表)(未発表)
(係数だけで
1Kバイトもあるようなこともあり、そのように酷い場合は何ページにもわたって係数が表示されることもある。)(1997
年特許出願(もう公開されているはず…)。)[省略]
(1996年、PCW’95 Japan及びASCM’96で発表)
以上、動機は十分。実現するには色々勉強が必要。以下はその方向性について。
色々夢はあるが、まずは言語を設計してみたい。
→コンパイラを元にしてインタプリタ的に使える環境を備える。
→言語処理系と計算エンジン部分は分離する。
(「手続き型のような体裁で書ける関数型言語」)
→目をつけている技術:
Lazy Evaluation、List/Array comprehension→目をつけている技術:
Type Inference→目をつけている技術:
Future→目をつけている技術:
Agent関連→目をつけている技術:
Dynamic Loading関連取り敢えずアルゴリズム記述について考える。