»
S
I
D
E
B
A
R
«
俄式农夫乘法,64位整数相乘的取模
四月 18th, 2010 by wxl.name

问题:

求 n*m % p 的值,其中0 <= n,m,p < 2^63。

大数?代码量太大,不值得,有没有更简单的方法?

一种思路:

俄式农夫乘法:

当n为偶数时: n * m=n/2 * 2m
当n为奇数时: n * m=(n-1)/2 * 2m + m

用位运算加速。无符号long long防溢出。

LL mult_mod(LL a , LL b , LL &amp;p)        {
 
        if ( a &lt; b )    a ^= b ^= a ^= b;
        if ( b == 0 )   return 0;
        LL t = mult_mod( (a &lt;&lt; 1) % p , b &gt;&gt; 1 , p);
        if ( b &amp; 1 )    t += a;
        return t % p;
}

原创文章,转载请注明: 转载自MadFroG

本文链接地址: 俄式农夫乘法,64位整数相乘的取模


One Response  
Leave a Reply

»  Substance: WordPress   »  Style: Ahren Ahimsa
© MadFroG