最近在学密码学—求乘法逆元的方法
其中的核心算法——扩展欧几里得算法,虽然有大量的资料阐述了它的公式推导和代码实现,但均未从直观、形象化的角度说明,为什么这个算法适合用来求乘法逆元
这个算法的精髓与欧几里得算法求最大公约数一样:逼近+等效
我们先来看看欧几里得算法
a
=
q
n
+
r
a = qn+r
a=qn+r
最大公约数有多大我们不知道,但它一定比余数
r
r
r小
无论是大数 a a a,小数 n n n,还是余数 r r r,都是由最大公约数这个砖头叠成的塔
于是这个找砖头的游戏,就可以由高塔 a a a和低塔 n n n之间的较量,等效成低塔 n n n和高塔的塔尖 r r r之间的较量
这样一层一层迭代下去,塔就会一步一步向砖头逼近
现在我们再回过头来看扩展欧几里得算法
定义式整个除以最大公约数gcd(a,b),右边就会变成1,左边a, b中必定有一个变成质数
其实就是求乘法逆元的问题:一个质数和一个比它小的数,它俩乘以多少倍之后差为1
看一个例子:
如果说刚才是拆塔找砖,那现在就是用砖盖塔,让两个塔高度差刚好为1
同样,根据逼近的思想,我们多用几块小砖,尝试让它跟大砖一样高:
550
×
3
=
1759
−
109
550×3=1759-109
550×3=1759−109
可惜还是差了一些(109)。不过,相比于刚开始两块砖的高度差,550×3与1759的差距已经小了很多
注意,现在两座塔的高度差,已经与大砖1759,无关了!通过调节小砖(550)与3块小砖(109)的相对数目,我们可以把这高度差控制在109以内。现在大砖的等效高度变成了550,小砖变成了109
109的小砖,其实是5×1759与(3×550)+550的差值状态!
5个109与550很接近,因此左边堆5个1759,右边堆5个550×3和1个550后,两座塔的高度差缩小到了5
新的高度差调节阈值,也变成了5!
109包含21个5,也就是说,
不断地等效—迭代后,最终一定会找到一组数据,使得高度差恰好为1
如果对你有帮助的话,点个赞吧!