WindowsにGMPをインストールするという悪夢は望んでいません。
私は2つの数AとB、unsigned long long
sを持っており、最大で10 ^ 10程度の大きさですが、それを行っても((A%M)*(B%M))%M
整数のオーバーフローが発生します。
(A*B)%M
より大きな数を計算するための自作関数はありますか?
モジュラスM
がよりも十分に小さい場合ULLONG_MAX
(10 ^ 10の領域にある場合)、係数の1つを2つの部分に分割することにより、3つのステップでそれを行うことができます。私はそれと、、A < M
とを仮定します。B < M
M < 2^42
// split A into to parts
unsigned long long a1 = (A >> 21), a2 = A & ((1ull << 21) - 1);
unsigned long long temp = (a1 * B) % M; // doesn't overflow under the assumptions
temp = (temp << 21) % M; // this neither
temp += (a2*B) % M; // nor this
return temp % M;
値が大きい場合は、係数を3つの部分に分割できますが、モジュラスが実際にULLONG_MAX
それに近づくと、醜くなります。