美文网首页
快速幂取模算法

快速幂取模算法

作者: byene | 来源:发表于2017-03-11 03:07 被阅读0次
    算法简介

    快速幂取模算法是在o( logn )的时间内求得 a ^ b % n的值

    先证明结论:
    a*b % c = ( ( a % c ) * ( b % c ) ) % c

    证明:
    a % c = d ----> a = d + c * x;
    b % c = e ----> b = e + c * y;
    a * b % c = ( de + cex + cdy + xy*c ^ 2 ) %c = ( de ) %c
    即证
    

    a ^ b % n = ( a % n ) ^ b % n;

    算法核心

    递归:
    b & 1 == 1时 a ^ b = ( a ^ ( b / 2 ) ) ^ 2 * a;
    b & 1 == 0时 a ^ b = ( a ^ ( b / 2 ) ) ^ 2;

    int pow_mod( int a, int b, int n )
    {
        int t = 1;
        if( b == 0 ) return 1;
        if( b == 1 ) return a % n ;
        t = pow_mod( a, b >> 1, n );
        t = t * t % n;
        if( b & 1 ) t = t * a % n;
        return t;
    }
    

    非递归:
    b = p(n)2^n + p(n-1)2^(n-1) +...+ p(1)*2 + p(0)

    int pow_mod( int a, int b, int n )
    {
       int t = 1, tmp = a % n;
       while( b )
       {
           if( b & 1 ) t = t * tmp % n;
           tmp = tmp * tmp % n;
           b >> = 1;
       }
       return t;
    }
    
    byene.jpg

    相关文章

      网友评论

          本文标题:快速幂取模算法

          本文链接:https://www.haomeiwen.com/subject/ltcagttx.html