【雑記】 | |
2010/6/20 多倍長と小数と | |
先日モンゴメリ乗算(※1)を調べたのでRSAのベースになっている多倍長整数のライブラリの見直しを検討するも、整数のみでは汎用性に欠け面白みが無いとつらつら考えていた所、ふと固定桁10のべき乗による内部表現なら小数のサポートも難しく無いのではと思い立ち試しに作ってみた (ちなみにこの手の実装の難易度の9割は符号化(十進基数では関係無い)と除算になる(笑) 一応ソース内のI_PREC,D_PRECを変更する事で任意の桁精度を得る事ができる;-)
1. 表現が「浮動」小数である事
上記は実際には演算の極限付近の状態であるので致命的では無く、せいぜい日常の金銭計算程度なら計算式が固定であれば過程をちゃんと吟味すれば問題無い場合も多いが、計算自体を題材にするには少々頭の痛いのも事実で、また固定式においても安易に式を作るには日常的な (実社会での) 計算には無い概念まで考慮しなければならないのは少々気分が悪い、という事で自前で持っていても悪くも無かろうという所. 信頼性さえ別にすれば(笑) DBや金融計算で扱う程度の精度域ならこれで十分だろう、上記のソースではオーバー/アンダーフローは単にメッセージを出しているだけだが特定用途、例えば金銭計算等では自分で好きなように例外などを組み込めるのも大きいかもしれない. 固定桁でも反復計算でなければ数千桁程度は問題無いので、必要ならdoubleの値域 (およそ±308桁) をカバーするのも悪くない. また10のべき乗を基数にする限り、可変桁への対応もそんなに難しい話では無いと思われるので、気が向いたらこれも作ってみても良いかもしれない. ただ技術計算には単なる多倍長だけで無く有理数表現も無いと意味が無い、また実質的には多倍長が必要なのは一部の整数論や多項式の反復演算などに限定され、後はアルゴリズムに誤差が混入していないかのチェック用として検算やプロトタイプに使用するのも有用ではあるものの、殆どの(技術計算分野の)実用問題は本当に多倍長が必要なのか考え直すのが妥当な場合が多いのも事実ではある.
--------------- ※1) 半分仕事っぽいカンジで扱ったので、概念の模式モデル等はここには提示できないが、内容的は有限体上の乗算 a*b mod N をモンゴメリ領域と呼ばれる空間に変換し 乗算3回+加算1回+シフト+ビットマスク に置き換える演算法、これを用いて最終的には有限体上のべき計算 a^b mod N を高速化するのに使用する、一応RSAの実装に興味がある(?) 人もいるみたいなので手がかり程度というカンジで(笑) ※2) 車輪の再発明と云う無かれ、プログラム作成において万全の保証と100%の設計の柔軟さを得るには極めて重要な話なワケです (抱えてるエンジニアが救いようの無いアホでどんなソースを書かせてもまともに書けず、自分達が作ったものを信頼もできないという悲惨な環境を除く)
:-P
|