このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

AppleScriptでのMod関数の限界?

発言者:大西恒樹
( Date Tuesday, July 18, 2000 22:06:31 )


珍しく(?)純粋にAppleScript関連の質問をさせてください。

最近RSA鍵を使った暗号化に凝っておりまして、AppleScriptでべき乗計算や
Mod(余り)計算をしていて気がついたことがあります。それは、ある桁数
以上のMod計算をすると、全くおかしな数字になるようなのです。

例えば、通常

2 ^ 3 Mod 3 (2の3乗を3で割った時の余り)の答えは2となりますが、
2 ^ 56 Mod 3 (2の56乗を3で割った余り)あたりからおかしくなり
始め、答えが4、8、16と、どんどん倍になっていきます。本来3で割った
余りは2以下のはずですから、正常に計算できていないことになります。

また、割る数を10などにしてみると、やはり55乗あたりから、何と余りの
数がマイナスの数字になります。

AppleScript上でintegerとして扱えなくなる限界が2の29乗ですから、
realとintegerの違いでもなさそうです。

どなたか、原因と対処法を御存知ですか?
どうしようもないということなら、それだけでもわかれば、すっきりと
他の言語で書くのですが、このままだと何か気になってしまって。^^;

田中求之 さんからのコメント
( Wednesday, July 19, 2000 00:23:09 )

>どなたか、原因と対処法を御存知ですか?

これは、PowerPC Native 版(正確には AS 1.1.3 以降のバージョン)での数
値処理のバグです。

ちなみに、68K (MacOS 8.1) だと、2^56 mod 3 は 1.0 になります。

AppleScript では、大西さんもご指摘のように、整数として処理できる範囲が
2^29-1 から -2^29、つまり 536870911 から -536870912 になっていて、この
範囲を越えたものは real に自動的に変換して処理が行われます。

ところが、PowerPC 版に書き換えたときに、整数のオーバーフローを検知して
Real に変換してから処理を行う部分にバグが入り込んでしまったそうです。
これは Apple の人間が applescript users ML ではっきりとバグであること
を認めてました。

ということで、対処法は、現時点では、OS を古くして、AS のバージョンを下
げるか、バグが修正されたバージョンが出るのを待つしかないようです。
(次のリリースではこのバグを修正すると言ってました)

大西恒樹 さんからのコメント
( Wednesday, July 19, 2000 00:58:53 )

田中さん、早速、コメントありがとうございました。
おかげさまで、とってもすっきりです。

使ってないマシンにやらせる仕事としては丁度いいかも。^^)

大西恒樹 さんからのコメント
( Wednesday, July 19, 2000 07:48:28 )

と、思ったのも束の間。
AppleScript J-1.1.2(OS7.5.5)で試したところ、2^64までは計算できま
したが、2^65 mod 3から上は0.0になってしまいます。

PPC9500/132だからでしょうか?68kMacでなければダメとか。

田中求之 さんからのコメント
( Wednesday, July 19, 2000 08:45:02 )

>2^65 mod 3から上は0.0になってしまいます。

これは real に変換される際に、下位の桁の数値が丸められるのが原因では
ないでしょうか? コンピュータでの数値計算では必ずついて回る問題です
よね。

real は、確か 8 バイトでデータを表現するはずですので、表現できる精度
には限界がありますから。

大西恒樹 さんからのコメント
( Wednesday, July 19, 2000 09:12:54 )

>real は、確か 8 バイトでデータを表現するはずですので、表現できる精度
>には限界がありますから。

そ、そうだったんですか?知らんかった^^;
ということは暗号計算なんかはあきらめるしかないですね。

すっきりあきらめて、他の方法考えよ。

重ねて感謝です。>田中プロ