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} a′≡aR(modN),b′≡bR(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=a′b′,我们可以设计一个函数来计算 X R − 1 ( m o d N ) XR^{-1}\pmod{N} XR−1(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} X1≡XR−1≡a′b′R−1≡abR(modN),这样在调用一遍函数计算 X 1 R − 1 ( m o d N ) X_{1}R^{-1}\pmod{N} X1R−1(modN)就得到我们最终需要的结果 a b ( m o d N ) ab\pmod{N} ab(modN)了。我们称这个算法叫蒙哥马利约简算法。所以说,蒙哥马利约简的产生是为了蒙哥马利模乘计算服务的。
2、蒙哥马利约简
根据上述分析可知蒙哥马利算法的核心在于蒙哥马利约简。而且前面提到,蒙哥马利算法的主要思想是把取模运算变得简单,到底是怎么做到的呢?
主要思想:蒙哥马利约简是计算 X R − 1 ( m o d N ) XR^{-1}\pmod{N} XR−1(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
RR′−NN′=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′=−N−1(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+mN≡0(modR)XN′+mNN′≡0(modR)XN′+m(RR′−1)≡0(modR)XN′≡m(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):
-
计算 N ′ = − N − 1 ( m o d R ) N'=-N^{-1}\pmod{R} N′=−N−1(modR),计算 m = X N ′ ( m o d R ) m=XN'\pmod{R} m=XN′(modR);
-
计算 y = X + m N R y=\frac{X+mN}{R} y=RX+mN:将 X + m N X+mN X+mN右移 k k k位;
-
若 y > N y>N y>N,则 y = y − N y = y-N y=y−N;
这时的 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+R⋅N<RRN+R⋅N=2N -
返回y。
3、蒙哥马利模乘流程
Montgomery Multiply ( a , b , N ) (a,b,N) (a,b,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' a′≡aR(modN),b′≡bR(modN),X=a′b′;
- 调用蒙哥马利约简算法: 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);
- 再调用蒙哥马利约简算法: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);
- 返回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' a′≡aR(modN),b′≡bR(modN),X=a′b′),总的来看复杂度也没有降低啊?实际上,第一步可以看成是蒙哥马利的预先计算,在硬件实现中,先把预先计算的算好,在后面运行就会快很多。尤其是当出现大量的模乘运算时,可以通过并行运算进行预计算,这会大量节省运行时间。
5、蒙哥马利模幂
当进行模幂运算时,也可以利用蒙哥马利算法。如计算 a e ( m o d N ) a^{e}\pmod{N} ae(modN)。根据重复平方-乘方法,模幂运算中就有很多步的模乘运算,这恰恰可以发挥蒙哥马利模乘的优势。具体的,在重复平方法的每一次模乘中都利用蒙哥马利模乘进行计算,把需要的参数提前计算好就行。