使用场景
在学习使用RSA加密算法时,需要用到大数运算取模的算法,但是使用C语言,定义成long long类型也存不下,所以查到了快速幂取模算法,这种算法专门用来计算求出
a^b Mod c (注意:b是一个大数)
这种算式,可以简化计算过程。
以下附大神链接:
大神写的详细推导过程
个人理解
在大神的推导过程中,是属于由高位向低位解析,而程序属于低位到高位计算,有点难以理解,但是我们可以把算式拆开计算:
公式: (a * b) Mod c = [(a Mod c)*(b Mod c)] Mod c
假设计算a^53%c
现将53拆分为二进制为110101,按照公式细推如下图:
由上图推导可以看出当bn=0时,可以省略计算步骤
在bn=1时,需要由上一个结果A乘以当前的kn,由大神的kn计算公式可得,kn=(k(n-1) * k(n-1))%c(大神表述的是Tn),
即,假设bn=1时,
kn5=(kn4 * kn4)%c;
kn4=(kn3 * kn3)%c;
……
kn1=(kn0 * kn0)%c,其中kn0=A0;
所以说kn在每一步计算时都需要累乘,以便用于下一次计算:
代码
由上图从低位到高位解析的结果,就可以着手写代码
在这里插入代码片
int exp(void)
{
int a,b,c;//计算a^b%c
int A,T;
A = 1;//初始值
T = a%c;//计算T,用于累乘,
while(b>0)
{
if(b&1)
{
A=A*T%c;//如果bn=1,则kn=Tn,且A2=(A1*Kn)%c
}
//如果bn=0,则A2=A1,不需要计算,但是需要计算出Tn+1=Tn*Tn%c,便于下次计算
T=T*T%c;
b>>=1;
}