蒙哥马利算法(Montgomery Algorithm)|蒙哥马利约简、模乘、模幂

19 篇文章 21 订阅
10 篇文章 4 订阅

Montgomery Algorithm(蒙哥马利算法)

蒙哥马利算法分为3种,蒙哥马利模乘,蒙哥马利约简,蒙哥马利模幂

1、从蒙哥马利模乘说起

模乘是为了计算 a b ( m o d N ) ab\pmod{N} ab(modN)。普通算法中,在计算模N时,利用的是带余除法,除法运算需要太多次乘法,计算复杂度较高,蒙哥马利算法的思想就是利用进制表示简化除法运算,转化成位运算

  • 蒙哥马利形式:为了计算 a b ( m o d N ) ab\pmod{N} ab(modN),找一个 R R R,然后使得 a ′ ≡ a R ( m o d N ) , b ′ ≡ b R ( m o d N ) a'\equiv aR\pmod{N},b'\equiv bR\pmod{N} aaR(modN),bbR(modN),这就是蒙哥马利形式。
  • 这个 R R R不是随便一个数,需要满足两个条件:1: R = 2 k > N R=2^{k}>N R=2k>N,其中 k k k是满足条件的最小的正数,这个取法能够保证除以 R R R就相当于右移k位,避免除法运算;2: g c d ( R , N ) = 1 gcd(R,N)=1 gcd(R,N)=1,这使得能够求出下面的m。
  • 蒙哥马利形式有什么用?往下看

前面只是铺垫,下面才真正开始。为了计算一开始的 a b ( m o d N ) ab\pmod{N} ab(modN),需要用到上面的蒙哥马利形式。令 X = a ′ b ′ X=a'b' X=ab,我们可以设计一个函数来计算 X R − 1 ( m o d N ) XR^{-1}\pmod{N} XR1(modN),简单计算发现这个函数的计算结果为 X 1 ≡ X R − 1 ≡ a ′ b ′ R − 1 ≡ a b R ( m o d N ) X_{1} \equiv XR^{-1}\equiv a'b'R^{-1}\equiv abR\pmod{N} X1XR1abR1abR(modN),这样在调用一遍函数计算 X 1 R − 1 ( m o d N ) X_{1}R^{-1}\pmod{N} X1R1(modN)就得到我们最终需要的结果 a b ( m o d N ) ab\pmod{N} ab(modN)了。我们称这个算法叫蒙哥马利约简算法。所以说,蒙哥马利约简的产生是为了蒙哥马利模乘计算服务的。

2、蒙哥马利约简

根据上述分析可知蒙哥马利算法的核心在于蒙哥马利约简。而且前面提到,蒙哥马利算法的主要思想是把取模运算变得简单,到底是怎么做到的呢?

主要思想:蒙哥马利约简是计算 X R − 1 ( m o d N ) XR^{-1}\pmod{N} XR1(modN),这相当于 X R ( m o d N ) \frac{X}{R}\pmod{N} RX(modN),如何才能避免除法?从前面的 R R R的定义中我们知道, R = 2 k R=2^{k} R=2k,所以 X R = X > > k \frac{X}{R}=X>>k RX=X>>k (X右移k位)。但是新的问题出现了,右移k位可能会抹掉X的低位中的一些1,如 7 ÷ 4 = 0 b 111 > > 2 = 0 b 1 = 1 7\div 4=0b111>>2=0b1=1 7÷4=0b111>>2=0b1=1,这个不是精确计算,而是向下取整的除法。当且仅当X是R的整数倍时, X ÷ R X\div R X÷R严格等于 X > > k X>>k X>>k。所以我们实际上是找一个 m m m,使得 X + m N X+mN X+mN R R R的倍数,这样计算 X + m N R ( m o d N ) \frac{X+mN}{R}\pmod{N} RX+mN(modN)就可以了。

m如何找

根据R的定义, g c d ( R , N ) = 1 gcd(R,N)=1 gcd(R,N)=1,根据扩展的欧几里得算法,有 R R ′ − N N ′ = 1 RR'-NN'=1 RRNN=1并且有 0 < N ′ < R , 0 < R ′ < N < R 0<N'<R,0<R'<N<R 0<N<R,0<R<N<R。(注意这里是 − N N ′ -NN' NN,所以有 N ′ = − N − 1 ( m o d R ) N'=-N^{-1}\pmod{R} N=N1(modR)
X + m N ≡ 0 ( m o d R ) X N ′ + m N N ′ ≡ 0 ( m o d R ) X N ′ + m ( R R ′ − 1 ) ≡ 0 ( m o d R ) X N ′ ≡ m ( m o d R ) X+mN \equiv 0\pmod{R}\\ XN'+mNN'\equiv 0\pmod{R}\\ XN'+m(RR'-1)\equiv 0\pmod{R}\\ XN'\equiv m\pmod{R} X+mN0(modR)XN+mNN0(modR)XN+m(RR1)0(modR)XNm(modR)
这样就求出了m。

约简算法总流程

提前工作:已知 a , b , N a,b,N a,b,N,并计算出蒙哥马利形式中的 a ′ , b ′ , R a',b',R a,b,R以及 X X X

Montgomery reduction ( X , R , N ) (X,R,N) (X,R,N)

  1. 计算 N ′ = − N − 1 ( m o d R ) N'=-N^{-1}\pmod{R} N=N1(modR),计算 m = X N ′ ( m o d R ) m=XN'\pmod{R} m=XN(modR)

  2. 计算 y = X + m N R y=\frac{X+mN}{R} y=RX+mN:将 X + m N X+mN X+mN右移 k k k位;

  3. y > N y>N y>N,则 y = y − N y = y-N y=yN

    ​ 这时的 y y y满足: 0 < y < 2 N 0<y<2N 0<y<2N。因为
    X < N 2 , m < R , N < R X<N^{2},m<R,N<R X<N2,m<R,N<R
    ​ 所以
    X + m N R < N 2 + R ⋅ N R < R N + R ⋅ N R = 2 N \frac{X+mN}{R}<\frac{N^{2}+R\cdot N}{R}<\frac{RN+R\cdot N}{R}=2N RX+mN<RN2+RN<RRN+RN=2N

  4. 返回y。

3、蒙哥马利模乘流程

Montgomery Multiply ( a , b , N ) (a,b,N) (a,b,N):

  1. 计算 a ′ ≡ a R ( m o d N ) , b ′ ≡ b R ( m o d N ) , X = a ′ b ′ a'\equiv aR\pmod{N},b'\equiv bR\pmod{N},X=a'b' aaR(modN),bbR(modN)X=ab
  2. 调用蒙哥马利约简算法: X 1 X_{1} X1=Montgomery reduction ( X , R , N ) = X / R = a b R ( m o d N ) (X,R,N)=X/R=abR\pmod{N} (X,R,N)=X/R=abR(modN)
  3. 再调用蒙哥马利约简算法:y=Montgomery reduction ( X 1 , R , N ) = X 1 / R = a b ( m o d N ) (X_{1},R,N)=X_{1}/R=ab\pmod{N} (X1,R,N)=X1/R=ab(modN)
  4. 返回y。

4、复杂度分析

蒙哥马利算法是为了简化模 N N N的复杂度,当 N N N是比较大的数时,模N需要多次的加、减、乘运算。从上述过程看来,蒙哥马利约简的复杂度确实降低了,因为只有模 R R R的移位运算。但是看蒙哥马利模乘的流程,在第一步中进行蒙哥马利表示时就计算了两次模N,( a ′ ≡ a R ( m o d N ) , b ′ ≡ b R ( m o d N ) , X = a ′ b ′ a'\equiv aR\pmod{N},b'\equiv bR\pmod{N},X=a'b' aaR(modN),bbR(modN)X=ab),总的来看复杂度也没有降低啊?实际上,第一步可以看成是蒙哥马利的预先计算,在硬件实现中,先把预先计算的算好,在后面运行就会快很多。尤其是当出现大量的模乘运算时,可以通过并行运算进行预计算,这会大量节省运行时间

5、蒙哥马利模幂

当进行模幂运算时,也可以利用蒙哥马利算法。如计算 a e ( m o d N ) a^{e}\pmod{N} ae(modN)。根据重复平方-乘方法,模幂运算中就有很多步的模乘运算,这恰恰可以发挥蒙哥马利模乘的优势。具体的,在重复平方法的每一次模乘中都利用蒙哥马利模乘进行计算,把需要的参数提前计算好就行。

  • 59
    点赞
  • 192
    收藏
    觉得还不错? 一键收藏
  • 32
    评论
蒙哥马利模约减算法Montgomery Reduction)是一种在大数运算中广泛使用的高效算法,特别是在进行模数计算时。这个算法主要应用于对大整数进行快速的除法和乘法运算,特别是当模数非常大时,传统的算术方法效率低下。 算法的核心思想是利用数论中的性质,将两个大数的乘法转换为较小数的加法和位移操作,从而大大减少了所需的位运算次数。具体步骤如下: 1. **模转换**(Modular Transformation):将一个数 `a` 转换到模 `n` 的 Montgomery 域,这通常涉及将 `a` 和 `n` 的商乘以 `n` 的模平方 `n^2` 加上 `n`(即 `a * n^2 + n`)。 2. **快速乘法**(Fast Multiplication):在 Montgomery 域内,两个数 `a` 和 `b` 的乘积可以通过分治法(如Karatsuba算法)高效地计算,避免了直接对大数的逐位相乘。 3. **还原**(Reconstruction):计算结果在 Montgomery 域内的乘积后,需要将其还原回原来的模 `n`。这通常是通过对结果减去 `n` 的适当倍数来完成的。 4. **取模**(Modulo Operation):最后,得到的结果可能大于 `n`,需要对结果取模,以确保其在 `[0, n)` 范围内。 举例来说,假设我们要计算 `(123456789 * 987654321) % 1000000007`,使用蒙哥马利模约减算法,首先将每个数转换到模 `1000000007` 的 Montgomery 域,然后执行快速乘法,最后再还原并取模,整个过程大大减少了运算的复杂度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值