分割大数时的余数

时间:2014-02-10 12:29:44

标签: algorithm math modulo modular-arithmetic

当30 ^ 74除以57时的余数是多少?

我通常知道要解决这个问题,你会使用Fermat的Little Theorem,但在这种情况下,57不是素数,所以我不确定如何处理这个问题。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

30 ^ 74 mod 57 =(3 ^ 74 * 10 ^ 74)mod 3 * 19 = 3 * [(3 ^ 73 * 10 ^ 74)mod 19]

(3 ^ 73 * 10 ^ 74)mod 19 =(3 ^(18 * 4)* 3 * 10 ^(18 * 4)* 10 ^ 2)mod 19

现在,通过Fermst的小定理(m ^(p-1)mod p = 1):

(3 ^ 73 * 10 ^ 74)mod 19 =(3 * 10 ^ 2)mod 19 = 300 mod 19 = 15

因此

30 ^ 74 mod 57 = 3 * 15 = 45


用于获得余数的模幂运算方法的基本实现是:

long modular_pow( long base, long exponent, long modulus) {
    long c = 1;
    for ( long e_prim = 0; e_prim < exponent; ++e_prim) {
        c = (c * base) % modulus;
    }
    return c;
}

然而@Vikram Bhat所显示的实施效率更高。

答案 1 :(得分:1)

使用模幂运算: -

modexp(a,pow) = (a*modexp(a,pow-1))%p

更快的模幂运算: -

public static long modexp(long a,long pow,long p) {

       if(pow==0) {
           return(1);
       }   

       long t = modexp(a,pow/2,p);
       t = (t*t)%p;

       if(pow%2==1) {
           t = (t*a)%p;
       }

       return(t);

    }

致电: - modexp(30,74,57)

时间复杂度: O(log(pow))