求a^n, a^n%m : binary exponentiation O(logN)

计算a^n

常规思路:O(N)

按照N为循环次数进行计算

public long pow(int a, int n){
    long result = 1;
    while(n-- > 0){
    	result *= a;
	}
	return result; 
}

Binary Exponentiation: log(N)

计算a^n

1.如果n为偶数: a^n = (a * a) ^ (n / 2)

2.如果n为奇数: a^n = a * (a * a) ^ ( (n - 1) / 2 )

时间复杂度从 O(N) 降低为 O(log(N))

递归方法

public int binPow(int a, int n){
    if(n == 0) return 1;
    if(n % 2 == 1) return a * binPow(a * a, (n - 1) / 2 );
    return binPow(a * a, n / 2);
}

迭代方法

public long binPow(int a, int n){
    long result = 1;
    while(n > 0){
        if(n % 2 == 1)
            result = result * a;
        a = a * a;
        n = n >> 1;
    }
    return result;
}

计算a^n % m

要求:不溢出,时间复杂度log(N)

运算规则:(a * a) % m = (a % m * a % m) % m

计算a^n % m

1.如果n为偶数: a^n % m = ( (a * a ) ^ (n/2) ) ) % m = binMod(a * a % m, n / 2, m);

2.如果n为奇数: a^n = (a * (a * a) ^ ( (n - 1) / 2 ) ) % m =

binary

递归方法

public int binMod(int a, int n, int m){
    if(n == 0) return 1;
    if(n % 2 == 0) return binMod(a * a % m, n / 2, m);
    return (a % m * binMod(a * a % m, (n - 1) / 2, m)) % m;
}

迭代方法

public int binMod(int a, int n, int m){
    int result = 1;
    while(n > 0){
        if(n % 2 == 1) result = ( result * a ) % m;
        a = (a * a) % m;
        n = n >> 1;
    }
    return result;
}

参考:https://www.hackerearth.com/practice/math/number-theory/basic-number-theory-1/tutorial/

posted @ 2022-02-07 15:12  nunuZhang  阅读(61)  评论(0)    收藏  举报