一文彻底弄懂快速幂解法的核心

快速幂的核心在于底数最大化,指数最小化

这样做的目的是大大降低问题的时间复杂度,把原本需要n次的乘法运算转换为不需要进行乘法运算(指数是偶数时的情况),或者只需要进行一次乘法运算(指数是奇数时的情况)。

比如:

3^4可以转换为9^2,再进一步可以转换为81^1.

3^5可以转换为(9^2)*(3^1),再进一步可以转换为(81^1)*(3^1).

从而做到底数最大化,指数最小化。

其核心伪代码可表示为:

if(指数&1){ // 代表指数是奇数
    指数=指数 - 1;
}
while(指数 > 1) {
    底数 = 底数 * 底数;
    指数 = 指数 / 2;
}
// 代码执行到此行时,底数已经做到了最大化,指数也做到了最小化
// 然后我们就可以根据最初的指数是奇数还是偶数来分别处理结果
if(指数&1){
    result = (底数^指数) * 最初的底数
} else {
    result = (底数^指数);
}

一般快速幂的题目呢,会让求最后结果的最后指定位数是多少。从而使得没有用快速幂解法的同学也有可能解题,这种求最后指定位数的题目,假设最后是求最后三位是多少,那么模板题解为:

if(指数&1){ // 代表指数是奇数
    指数=指数 - 1;
}
while(指数 > 1) {
    底数 = 底数 * 底数 % 1000;
    指数 = 指数 / 2;
}
// 代码执行到此行时,底数已经做到了最大化,指数也做到了最小化
// 然后我们就可以根据最初的指数是奇数还是偶数来分别处理结果
if(指数&1){
    result = (底数^指数) * 最初的底数 % 1000
} else {
    result = (底数^指数) // 偶数次最后保留下来的底数绝对是小于1000的,因此不用再取余
}

对于算法题最后的结果只与最后一位,或者最后两位,或者最后指定位数相关这类题。每次运算只需要保留最后几位的原因在于:多次的乘积运算时,前面位数的变化并不影响最后几位的变化,最后几位多次乘积运算也只与最后几位有关,从而可以防止元素溢出导致超时的问题。

本文是阅读了快速幂算法的博客后,自己归纳出的结论,如果看了本文后还不理解,可以前往这篇博客查看从头至尾的全部介绍哦~

你可能感兴趣的:(算法,线性代数,矩阵,快速幂,算法)