Location : Home > Languages > Perl > Package Title : Math::BaseArith |
![]() |
Math::BaseArith - 異なる基による数値の変換
use Math::BaseArith; encode( value, base_list ); decode( representation_list, base_list );
本モジュールは APL 言語の encode (すなわち「表現」 "representation")と decode (すなわち「基による数」 "base-value")の2つの関数からインスピレーションを得た。主な利用法は、ある基に基づく数値を他の基に変換することである。混合基( Mixed number bases)も利用可能である。
Perl の実装においては、ある特定の基数の表現は、その基における数値のリストから構成される。例えば10進数における 31 は2進数では最初に0が並ぶ、5桁の数字 [0, 0, 0, 1, 1, 1, 1, 1] で表現される。同じ数字は16進数(基が16)では3桁の数字を用いれば [0, 1, 15] と表せ、10進数では [0, 3, 1] と表せる。
また 51インチはヤード・フィート・インチでは混合基の例として [1, 1, 3] と表せる。
以下の encode と decode に関する説明では、Q は全体値または絶対量を、R はその表現を、B は基を意味する。Q は Perl におけるスカラーであり、R と B は Perl のリストである。R における値は B における基数に対応する。
以下の例では出力は $, = ' ' で置き換えられているものとし、 => はシェルのプロンプトであるとする。
&encode
Encode はある基のもとで表現された表現を他の基に変換する際に用いられる。
第1引数は変換対象の数であり、第2引数は表現に用いる基を規定する。まず、単一の基に対するスカラーの表現を考えよう。
print encode( 2, [2, 2, 2, 2] ) => 0 0 1 0 print encode( 5, [2, 2, 2, 2] ) => 0 1 0 1 print encode( 13, [2, 2, 2, 2] ) > 1 1 0 1 print encode( 62, [16, 16, 16] ) => 0 3 14
第2引数は基のリスト(base list)と呼ばれる。基のリストの長さは第1引数の表現における桁数を決定する。元の数値を表現するのに長さが不十分であってもエラーを出さない。このような状況は encode の他の用法を示唆しており、複数の基を用いて encode した場合に明らかになるだろう。
# 4 を基とする 75 の表現 print encode( 75, [4, 4, 4, 4] ) => 1 0 2 3 # すべて表現するには4桁が必要 print encode( 75, [4, 4, 4] ) => 0 2 3 # もし第2引数の桁が足りなければ # 頭のほうの数字は表現に現れない。 print encode( 75, [4, 4] ) => 2 3 # 第2引数が1要素しかなければ、encode の動作は法(Modulus; %)と同等 print encode( 75, [4] ) => 3 print encode( 76, [4] ) => 0 # encode( Q, [0] ) という式は常に Q を結果として与える。 print encode ( 75, [0] ) => 75 # この用法は商と剰余を返す。 print encode( 75, [0, 4] ) => 18 3 # 当初の商 (18) は再度 4 で除され # 2番目の商と剰余を与える。 print encode( 75, [0, 4, 4] ) => 4 2 3 # このプロセスは繰り返される。最後の商は 4 より小さいので # 結果は encode(75,[4,4,4,4]) と同じになる。 print encode( 75, [0, 4, 4, 4] ) => 1 0 2 3
ここで混合基(mixed number base)について考えよう。
175 インチを、ヤード・フィート・インチに変換すると
# 175 インチは 14 フィート 7 インチ (商と剰余) print encode( 175, [0, 12] ) => 14 7 # 14 フィートは 4 ヤード 2 フィート print encode( 14, [0, 3] ) => 4 2 # したがって 175 インチは 4 ヤード 2 フィート 7 インチ print encode( 175, [0, 3, 12] ) => 4 2 7
&decode
Decode (または基における数)はある基における量の表現の値を決定するために用いられる。R を リスト B によって定義された基におけるある量 Q (おそらく encode 関数で生成された量) のリスト表現とする。
つまり @R = encode($Q,@B) であるならば decode(@R,@B) は $Q を与える。
print decode( [0, 0, 1, 0], [2, 2, 2, 2] ) => 2 print decode( [0, 1, 0, 1], [2, 2, 2, 2] ) => 5 print decode( [0, 3, 14], [16, 16, 16] => 62
表現リストの長さは基の長さ以下でなければならない。
print decode( [1, 1, 1, 1], [2, 2, 2, 2] ) => 15 print decode( [1, 1, 1, 1], [2] ) => 15 print decode( [1], [2, 2, 2, 2] ) => 15 print decode( [1, 1, 1, 1], [2, 2, 2] ) => (void) (LENGTH ERROR が発生)
encode 関数同様、混合基が利用可能である。
# 4 ヤード 2 フィート 7 インチをインチに変換 print decode( [4, 2, 7], [0, 3, 12] ) => 175 # 2 日 3 時間 5 分 27 秒を秒に変換 print decode( [2, 3, 5, 27], [0, 24, 60, 60] ) => 183927 # 分に変換 print decode( [2, 3, 5, 27], [0, 24, 60, 60] ) / 60 => 3065.45
基のリスト(第2引数)の最初の値は使われない。値の長さを確認するためにのみ用いられる。
use Math::BaseArith; &encode &decode use Math::BaseArith ':all'; &encode &decode BaseArith::debug
$Math::BaseArith::debug をグローバルにインポートすれば標準出力にデバッグ情報を出力する。
1 に設定すれば関数名とパラメータが出力される。
2 に設定すれば中間の値も出力される。
APL 言語における encode 関数は引数として単一値もリストも許容し、列が表現のベクトルであるような値も利用できる。例えば encode([15,31,32,33,75],[4,4,4,4]) とコールすれば以下の行列を生成する。
0 0 0 0 1 0 1 2 2 0 3 3 0 0 2 3 3 0 1 3
本バージョンでは encode 関数は第1引数としてはスカラー値のみをサポートする。APL バージョンでは decode 関数は 非整数値をサポートするが、本バージョンでは未対応である。
Gary Puckering, <gary.puckering@cognos.com>
http://www.acm.org/sigapl/encode.htm
![]() |
Updated : 2007/02/15 |