快速幂取模算法理解

使用场景

在学习使用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;
}
  
  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值