题外话:昨天看李煜东老师写的算法竞赛进阶指南中说探究一门学问有三个层次:求其解,知其原因,究其思维之本。通俗地讲,就是”怎么做“,”为什么是对的“,”怎么做才能想到这么去做“。
------------------------------------------------------------------------------------------------------------------------------------
快速幂的深入了解:如果要用最直接的方法去求,那么我们就需要进行
次乘法运算,算法复杂度为
。但是
的幂乘可以用
,可以通过下面的递归函数实现:
n为偶数
n为奇数
int pow(int x,int n)
{
if(n==0)return 1;
res=pow(x*x,n/2);
if(n%2){
res=res*x;
}
return res;
}
最后快速幂是怎么回事呢?快速幂不就是这个递归变成了递推么,可以将n变为二进制看看,然后根据大多数网上那种拆进制的讲解,传送门
------------------------------------------------------------------------------------------------------------------------------------
接着看加法取余的证明:
(a+b)%m=(a%m+b%m)%m
证明:设a=a1*m+ar,b=b1*m+br,然后a+b=a1*m+b1*m+ar+br,接着(a+b)%m=(a1*m+b1*m+ar+br)%m=(ar+br)%m=(a%m+b%m)%m
减法取余的证明:
(a-b)%m = (a%m-b%m+m)%m
证明:设a=a1*m+ar,b=b1*m+br,然后a-b=a1*m-b1*m+ar-br,因为害怕ar-br可能是负数,所以可以将前面a1*m-b1*m借一个m出来,变为a-b=a1*m-b1*m+ar-br=(a1-b1-1)*m+(ar-br+m),接着(a-b)%m=((a1-b1-1)*m+(ar-br+m))%m=(ar-br+m)%m=(a%m-b%m+m)%m
乘法取余的证明:
证明:设a=a1*m+ar,b=b1*m+br,然后a*b=a1*b1*m^2+a1*br*m+b1*ar*m+ar*br=(a1*b1*m+a1*br+b1*ar)*m+ar*br,接着(a*b)%m=((a1*b1*m+a1*br+b1*ar)*m+ar*br)%m=(ar*br)%m=(a%m*b%m)%m
本文深入探讨了快速幂算法的原理与应用,并通过递归和递推两种方式进行了详细说明。此外,还介绍了加法、减法和乘法取余的数学证明。

2042

被折叠的 条评论
为什么被折叠?



