重复平方乘算法简单理解(快速幂运算)

问题描述 :计算 g^{A}\left (mod\displaystyle N \right )
直接方法: 反复不断的乘 ,直到得到g^{A}
        g_1\equiv (modN),g_2\equiv g\cdot g_1(modN),g_3\equiv g\cdot g_2(modN),
        g_4\equiv g\cdot g_3(modN),g_5\equiv g\cdot g_4(modN),...
需要进行A次乘法运算,如果A很大,算法将不再实用
例如 A\approx2^{1000},算法运行的时间将会比现在宇宙的年龄更长
快速幂算法:
1. 计算 的二进制表达形式:
        A = A_0\cdot 2^0+A_1\cdot 2^1+...+A_r\cdot 2^r
        A_0,A_1,...,A_r \in \left \{ 0,1 \right \}
        A_r表示二进制数 的最高位
2. 通过不断的平方,得到 :g^{2^{i}}:
        a_0\equiv g                         (mod N)
        a_1\equiv a_0^{2}\equiv g^{2}             (mod N)
        a_{2}\equiv a_{1}^{2}\equiv g^{2^{2}}           (mod N)
        a_{3}\equiv a_{2}^{2}\equiv g^{2^{3}}           (mod N)
          .        .
          .        .
          .        .
         a_{r}\equiv a_{r-1}^{2}\equiv g^{2^{r}}       (mod N)
3. 通过以下方式计算 g^A\left ( modN \right ):
        
        g^A= g^{A_0\cdot 2^0+A_1\cdot 2^1+A_2\cdot 2^2+...+A_r\cdot 2^r}
              =g^{A_0}\cdot \left ( g^2 \right )^{A_1}\cdot \left ( g^{2^{2}} \right )^{A_2}\cdot \left ( g^{2^{3}} \right )^{A_3}\cdot \cdot \cdot \left ( g^{2^{r}} \right )^{A_r}
              = a_{0}^{A0}\cdot a_{1}^{A1}\cdot a_{2}^{A2}\cdot a_{3}^{A3}\cdot \cdot \cdot \cdot a_{r}^{Ar}\left ( modN\right ) 
注意:
a_0,a_1,...,a_r已经在步骤2中经过r次乘法运算得出。
步骤3也只需要进行r次乘法运算。
r\approx \log_{2}A
当  A\approx 2^{1000}  时,最多进行2000次乘法运算
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
快速模幂乘算法可以用于计算 a^b mod m 的值,其中 a, b 和 m 都是正整数。该算法通过将指数 b 转换为二进制形式,利用幂的性质将幂的乘积转化为幂的平方的乘积降低计算复杂度,同时利用模运算的性质降低中间计算的数值大小,从而避免溢出和提高计算效率。 具体步骤如下: 1. 将指数 b 转换为二进制形式,记作 b0b1b2...bn,其中 bi 表示二进制展开中第 i 位的数值; 2. 初始设置计算结果 res = 1,和幂的底数 base = a; 3. 从二进制展开的最高位 n 开始遍历,若该位的值为 1,则将 res 乘上当前的底数 base 并对乘积取模,即 res = (res * base) % m; 4. 将当前底数 base 的值平方并对其进行模运算,即 base = (base * base) % m; 5. 重复步骤 3 和 4 直到遍历完整个二进制展开,此时 res 的值即为 a^b mod m 的结果。 具体理解可以看下面的示例: 假设需要计算 6^13 mod 11 的值,首先将指数 13 转换为二进制形式为 1101,计算过程如下: b3 = 1,res = 6,base = 6,6 * 6 = 36 = 3 * 11 + 3,res = 6 * 6 = 36 % 11 = 3,base = 6 * 6 = 36 % 11 = 3; b2 = 0,res = 3,base = 3,3 * 3 = 9,res = 3 * 3 = 9 % 11 = 9,base = 3 * 3 = 9 % 11 = 9; b1 = 1,res = 9,base = 9,9 * 3 = 27 = 2 * 11 + 5,res = 9 * 9 = 81 % 11 = 4,base = 9 * 9 = 81 % 11 = 4; b0 = 1,res = 4,base = 4,4 * 4 = 16 = 1 * 11 + 5,res = 4 * 6 = 24 % 11 = 2,base = 4 * 4 = 16 % 11 = 5; 因此,6^13 mod 11 的值为 2。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值