32ビット整数の計算では、加算と乗算の基本的な演算は暗黙的にmod 2^32として計算されます。結果は最も低い次数になります加算または乗算のビット。c = 2^N + -1のためにmod cを素早く計算する
異なるモジュラスで結果を計算する場合は、異なる言語で任意の数のBigIntクラスを使用できます。そして、値a、b、cについては、< 2^32の中間値を64ビットlong intで計算し、%演算子を組み込んで正しい答えに減らすことができます
しかし、私は特別なトリックCが(2^N)-1または(2^N)+1の形式で、64ビット演算やBigIntライブラリを使用せず、かなり効率的なa * b mod Cを効率的に計算するためには、任意のモジュラス評価を行い、中間乗算を含める場合は32ビット整数をオーバーフローさせるケースも適切に計算します。
このような特殊なケースには高速な評価方法があると聞いていましたが、実際にはこのメソッドの説明は見つかりませんでした。 「クヌスにはないの?」 "それはウィキペディアのどこかではないのですか?"私は聞いたことがあります。
2147483647は2^31 -1に等しい素数なので、a * b mod 2147483647の乗算を行う乱数発生器では、明らかに一般的な手法です。
だから私は専門家に尋ねます。この巧妙な特別なケースは私が何の議論も見つけることができないmodメソッドと掛け合っていますか?
そして、まだこの背後に数学を理解していない私は大学で数学のマイナーを落とした理由です... –
まあ、それは一種の時に残りを得るようなものです9で割る(10-1)。あなたはちょうど数字を追加します。今の場合、ベース10またはベース2の代わりに、あなたは「ベース」です。2^N – FryGuy