AI智能
改变未来

模乘与Montgomery 模乘

此篇主要介绍模乘的基本性质,mentgomery里面的reduction,以及应用reduction的模乘的算法原理。主要讲算法原理,不涉及硬件具体怎么实现。
对这方面研究不是很深入,有看到文章有问题的,请多指教呀。

1. 模乘基本运算法则

(a + b) % p = (a % p + b % p) % p (1)

(a – b) % p = (a % p – b % p) % p (2)

(a * b) % p = (a % p * b % p) % p (3)

(a^b) % p = ((a % p)^b) % p (4)

结合律:

((a+b) % p + c) % p = (a + (b+c) % p) % p (5)

((ab) % p * c)% p = (a * (bc) % p) % p (6)

交换律:

(a + b) % p = (b+a) % p (7)

(a * b) % p = (b * a) % p (8)

分配律:

((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (9)

重要定理:

若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);(10)

若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);(11)

若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a – c) ≡ (b – d) (%p),

(a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p); (12)

备注

a≡b (% p) 的意思是 a% p = b % p

2. 逆元 inverse

对于正整数a,b,c,存在
a * b % c = 1.
则称b为a的模c的逆元

比如说:
5 % 3 = 2;
5 * 2 % 3 = 1;
则称2是5的逆元。
可以看到有性质如下:
1). 如果存在逆元,那么个数就无限
2). 当a和c不互素,即gcd(a,c)>1, 那么就不存在逆元。比如2 % 4 = 2;就找不到逆元。

备注

gcd()是求最大公约数的。
互素的意思是两个数的最大公约数是1。 比如5和6就是互素。 6和8就不互素。

3. mentgomery reducton 约分

这个reduction是用来干甚的呢。如下:

若N,R为正整数,且gcd(N,R)=1, R>N。设定:R‘是R的模N逆元, (-N‘)是N的模R逆元。给定整数t,0<=t<NRmentgomery reduction计算目标就是:t⋅R‘ (mod N)
### 备注这个R怎么取呢,一般根据进制,比如说求“98%34”,即N=34。然后你想要按10进制来算,那就是R就等于10^2=100,比N大的整数。如果你想按2进制来算mod,那R就等于2^6=64。以下的R都这么取。为什么呢,因为如果你算除法的话,2进制就是移位,10进制就是挪小数点。所以一般口算用10进制的,计算机处理用2进制的。

那接下来有2个问题,一个是reduction具体怎么算出来(就是不需要除法或者求模运算的计算步骤),另一个是这个有什么应用。先搞第一个把。

3.1 reduction具体怎么算出来(就是不需要除法或者求模运算的计算步骤)

这里采用偷看参考答案证明法,就是根据结果来找算法原理。这里只说明算法原理,不设计具体硬件实现。

参考答案:先定义:若N,R为正整数,且gcd(N,R)=1, R>N。设定:R‘是R的模N逆元, (-N‘)是N的模R逆元。给定整数t,0<=t<NR1. 定义 m =  t * N‘ mod R;2. 定义 s = (t + N*m)/R  其中n为正整数3. if s>N  return (s-N) else return s结果 return的s就是等于  t⋅R‘ (mod N)算法原理:需要证明两个结论1) s是整数; 2) s ≡ t⋅R‘ (mod N)1) s是整数因为: N*N‘ modR = -1;所以: N*N‘ = -1 + kR : k为整数因为: m =  t * N‘ mod R;所以: m + aR = t * N\' : a为整数因此: s = ( t + N*m) /  R= (t + N * (t * N\' - aR)) / R= (t + t * N*N\' - NRa) / R= (t -t + kRt - NRa) / R= kt - Na其中 k,t,N,a都是整数,所以,s是整数。得证2) s ≡ t⋅R‘ (mod N)因为: s = (t + N*m)/R  其中n为正整数所以: sR = t + N*m所以: sR mod N = t所以: sR*R‘ mod N = t * R’ mod N所以: s mod N = t * R’ mod N得证。备注:这个s大小是一定小于R的,前提有R>N,因此不一定小于N。所以输出的时候要比较一下s跟N,s大于N的话输出s-N,否则直接输出s。

3.2 应用

先定义:若N,R为正整数,且gcd(N,R)=1, R>N。
设定:R‘是R的模N逆元, (-N‘)是N的模R逆元。
1) 可以求某个数的模,比如说求 “T%N”
先搞到 t = T * R
然后将t作为参数进行reduction就可以得到“T%N”
2)用来计算模乘,第4点介绍

4. 模乘

先定义:若N,R为正整数,且gcd(N,R)=1, R>N。
设定:R‘是R的模N逆元, (-N‘)是N的模R逆元。
对于整数a,b;模乘就是M:“a*b mod N”

我再定义前面第三点中实现的reduction的函数,方面后面描述

function mont_reduct(input t, input R, input N, ***output*** t⋅R‘ (mod N));输入: 整数t,0<=t<NR输入: R  看定义输入: N 看定义输出: t⋅R‘ (mod N) 是montgomery reduction。功能:计算montgomery reduction。

4.1 大致算法原理

先预计算:A = a * R mod NB = b * R mod NA B 怎么搞到的呢,厉害了,用mont_reduct函数mont_reduct( a * R * R, R, N, A);  // A = a * R * R * R‘ mod N = a * R mod Nmont_reduct( b * R * R, R, N, B);  // B = b * R * R * R‘ mod N = b * R mod N再得到A*B的约分:M_tmp = A * B * R‘ mod N = a * b * R mod NM_tmp具体怎么得到呢,再用mont_reduct函数mont_reduct( A * B, R, N, M_tmp);  //M_tmp = A * B * R‘ mod N = a * b * R mod N最终得到我们想要的模乘的结果M:M = a * b mod N怎么通过M_tmp来得到M呢,再用mont_reduct函数mont_reduct( M_tmp, R, N, M);  //M = M_tmp * R‘ mod N = a * b * R *R‘ mod N (R * R‘ mod N = 1)最终我们得到了模乘的结果M,计算通过3次mont_reduct,函数的具体实现可以参考3.1来实现。基本不涉及到复杂的除法和求余的运算。这就是mentgomery很大的贡献了。

4.2 搞个例子

定义:若N,R为正整数,且gcd(N,R)=1, R>N。设定:R‘是R的模N逆元, (-N‘)是N的模R逆元。将N =  47,根据第三点的备注,以10进制,得到R = 100那么R‘ =  8。(怎么得到R‘,根据第二点的逆元)对于整数34,32;模乘就是M:“34*32 mod 47”(计算器得到7)先算 A = a * R mod N = 34 * 100 % 47 = 16B =  b * R mod N = 32 * 100 % 47 = 4再来 M_tmp = A * B * R\' mod N = 16 * 4 * 8 mod 47 = 42最后 M = M_tmp * R\' mod N = 42 * 8 mod 47 = 7最后结果34*32 mod 47 = 7
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 模乘与Montgomery 模乘