一、先理解几个定义
规定定义在正整数上的二元函数gcd(a, b)(a≥b)表示正整数a和正整数b的最大公约数,例如:gcd(6,3)=3, gcd(7,4)=1.运算mod表示模数运算,例如5 mod 3 = 2, 或者 5 = 2 (mod 3)
欧几里德有个十分又用的定理: gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出来 a 和 b 的最大公约数了,这就是欧几里德算法。例如:gcd(15750, 27216) = gcd(15750, 11466)=gcd(11466,4284)=gcd(4284, 2898) = gcd(2898, 1386) = gcd(1386, 126) = gcd(126, 0) = 126
二、扩展的欧几里得算法
给出正整数a和b,扩展的欧几里得算法可以计算a和b的最大公约数d,同时得到两个符号相反的整数x和y满足:d=gcd(a, b) = ax+by
乘法逆元
简单说,如果有:ab mod q = 1成立,则称a和b互为模q意义下的乘法逆元(a与b均与q互质)。
二、根据扩展的欧几里得算法求乘法逆
若a与b互质,那么d=gcd(a, b)=1, 即 ax + by = 1, 于是 by = (-x)a+1
也即:by=1(mod a),于是y即为b在模a意义下的乘法逆元。
在欧几里得算法中,可以把过程写的更清晰一些:
(仍以d=gcd(a,b)=ax+by为例)
a = q1b + r1, r1=ax1+by1;
b = q2r1 + r2, r2=ax2+by2;
r1 = q3r2 + r3, r3=ax3+by3;
… … … …
r(n-2) = q(n)r(n-1)+r(n), r(n)=ax(n)+b*y(n)
r(n-1) = q(n+1)*r(n)+0
则:r(i-2) = q(i)r(i-1)+r(i)或 r(i) = r(i-2) - r(i-1)q(i)
又r(i-1) = ax(i-1)+by(i-1)且r(i-2) = ax(i-2)+by(i-2)
带入得:
x(i) = x(i-2)-q*x(i-2)
y(i) = y(i-2)-q*y(i-2)
于是,据此可以构建一个表格来计算乘法逆元,可以在草稿纸上快速手算的那种,在考试中很有用,编程方法其它博文一般都有讲,就不提了
计算 | 满足 | 计算 | 满足 |
---|---|---|---|
r(-1)=a | x(-1)=1; y(-1)=0 | a = ax(-1)+by(-1) | |
r(0)=b | x(0)=0; y(0)=1 | b = ax(0)+by(0) | |
r(1)=a mod b q(1)=a/b | r(-1)=q(1)*r(0)+r(1) | x(1) = x(-1)-q(1)*x(0) y(1) = y(-1)-q(1)*y(0) | r(1)=ax(1)+by(1) |
… | … | … | … |
r(n)=r(n-2) mod r(n-1), q(n)=r(n-2)/r(n-1) | r(n-2)=q(1)*r(n-1)+r(n) | x(n) = x(n-2)-q(n)*x(n-1) y(n) = y(n-2)-q(n)*y(n-1) | r(n)=ax(n)+by(n) |
r(n+1) = r(n-1) mod r(n)=0 , q(n+1)=r(n-1)/r(n) | r(n-1)=q*r(n)+0 | d=gcd(a,b)=r(n), x=x(n) , y=y(n) |
注:表格中的除法都是整除
下面举一个例子,令a=1759, b=550,求x和y使得
ax+by=gcd(a,b)
i | ri | qi | xi | yi |
---|---|---|---|---|
-1 | 1759 | 1 | 0 | |
0 | 550 | 0 | 1 | |
1 | 109 | 3 | 1 | -3 |
2 | 5 | 5 | -5 | 16 |
3 | 4 | 21 | 106 | -339 |
4 | 1 | 1 | -111 | 355 |
5 | 0 | 4 |
解释:以i=2这一列为例:
r2 = r1 mod r0 = 550 mod 109 = 5; q2=550/109=5;
x2 = x0-q2*x1 = 0-5*1=-5; y2 = 1-5*(-3)=16
由此,1759*(-111)+550355 = 1
550×355 = 111×1759 + 1
550×355 = 1(mod 1759)
题目:求550在模1759下的乘法逆元。
答:乘法逆元是355
另,还可以这样看:
1759(-111) = (-355)*550+1
1759×(-111)= 1(mod 550)
题目:求1759在模550下的乘法逆元。
答:乘法逆元是-111+550=439
再看一个例子,求7的乘法逆元(mod 71)
先建表,得算式1×71+(-10)×7 = 1,
故而7关于71的乘法逆元是-10+71 = 61.
读者可自行验算之
好了,欧几里德算法笔算方法先介绍到这里,以后补充其它方法。