欧几里德算法又称辗转相除法,主要是用于计算两个整数a,b的最大公约数。
简单点说一下算法原理:两个整数的最大公约数等于其中小的那个数跟大除以小余数的最大公约数。
即: gcd(a,b)=gcd(b,a mod b) 。
举个简单的例子:
比如求 10跟 24 的最大公约数:
a = gcd(10, 24):
1. 求10和24的最大公约数等于求10和4的最大公约数 :
a = gcd(10, 24) = gcd(10, 4)
2. 求10跟4的最大公约数等于求4跟2的最大公约数,为2 :
a = gcd(10, 24) = gcd(10, 4)
= gcd(4, 2) = 2
# python
def gcd(a, b):
return a if b == 0 else gcd(b, a % b)
print(gcd(10,24)) # 2
拓展欧几里德算法
算法原理:若a和b为正整数,则存在整数x, y 使得gcd(a,b)=ax by;
通俗点说就是 gcd(a,b)可以表示为a,b的整数线性组合。
举个简单的例子:
gcd(10, 24) = 2
2 = 10*(-7) 24*3
主要应用有以下三方面:
1. 求解不定方程;
例题:求 435x 783y = 87 的一组整数解:
先通过欧几里得算法得:
783 = 1× 435 348
435 = 348×1 87
348 = 87 × 4 0
∴ 87 = 435 – 348
87 = 435 – (783 – 435)
87 = (–1)(783) 2(435)
∴ x = 2, y = −1是此不定方程的一组整数解。
2. 求解模的逆元(乘法逆元),参考
3. 求解模线性方程(线性同余方程);
1). 求解同余方程 ax ≡ b (mod m), x = ?
举个极端代表性的例子: 15x = 1 mod 26
这道题转化成15x - 26y = 1 既可以当做1求解不定方程 ,也可以当做2求乘法逆元
解法如下:
26 = 1× 15 11
15 = 11×1 4
11 = 4 × 2 3
4 = 1 × 3 1
3 = 1 × 3
∴ 1 = 4 – 3
= 4 – (11 – 4×2)
= 4×3 – 11
= (15-11) ×3 - 11
= 15×3 - 11×4
= (26-11)×3 - 11 ×4
= 26×3 - (26 - 15)×7
=26×(-4) 15×7
∴ x = 7, y = −4 为此不定方程的一组整数解,15关于模26的乘法逆元为7
2). 求解同余方程组 继续往下看中国剩余定理
中国剩余定理在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3 余2),
五五数之剩三(除以5 余3),七七数之剩二(除以7 余2),问物几何?”
宋朝数学家秦九韶于1247年《数书九章》卷一、二《大衍类》对“物不知数”问题做出了完整系统的解答。明朝数学家程大位将解法编成易于上口的《孙子歌诀》:
三人同行七十稀,
五树梅花廿一支,
七子团圆正半月,
除百零五便得知。
意思是只要是除以3余了一个1,就加上一个70;
只要是除以5余了一个1,就加上一个21;
只要是除以7余了一个1,就加上一个15。然后累加。
最后计算这个总和除以105的余数。
也就是 (2×70 3×21 15×2 ) mod 105 = 23
解法如下:
先从3和5、3和7、5和7的公倍数中相应地找出分别被7、5、3除均余1的较小数15、21、70 ( 此步又称为求"模逆"运算,参考乘法逆元解法)。即:
15÷7=2……余1,
21÷5=4……余1,
70÷3=23……余1.
再用找到的三个较小数分别乘以所要求的数被7、5、3除所得的余数的积连加,
15×2 21×3 70×2=233.
最后用和233除以3、5、7三个除数的最小公倍数.
233÷105=2……余23,
这个余数23就是合乎条件的最小数.
拓展到一般情况:
假设整数m1, m2, ... , mn两两互质,则对任意的整数:a1, a2, ... , an 方程组:
都存在整数解,且若X , Y 都满足该方程组,则必有 X ≡ Y (mod N) 其中:
公式如下:
课本上的公式符号实在不想看,就拿作业来举两个例子吧。
作业1:求解同余方程组:
x ≡ 12 (mod 25)
x ≡ 9 (mod 26)
x ≡ 23 (mod 27)
以上方程组等价于 x = 25a 12 = 26b 9 = 27c 23
移一下项 得:
① : 25a - 27c = 23-12 = 11
②: 26b - 25a = 12-9 = 3
首先对①式运用拓展欧几里得:
27 = 25×1 2
25 = 2×7 11
则:
11 = 25 - 2×7
= 25 - (27-25) ×7
= 25×8 - 27×7
所以a=8, c=7
代入x = 25a 12 = 27c 23 得:
x = 212
得到合并方程 x = 212 25 × 27t 即:x ≡ 212 (mod 675)
然后再跟x ≡ 9 (mod 26) 合并
x = 212 675t = 26b 9
26b - 675t = 203
675 = 26×25 25
25 = 25×1
所以:
203 = (26-25)×203
= (26 - (675-26*25))×203
= 26×5278 - 675×203
b=5278 , t=203
代入得x = 137237
得到合并方程 x = 137237 25 × 27×26t 即:x ≡ 137237 (mod 17550) , x=14387
x = 14387 17550n (n∈Z)
作业2:求解如下同余方程组:
13x ≡ 4 (mod 99)
15x ≡ 56 (mod 101)
这类同余方程组带着系数让人头大,但是也不妨碍使用拓展欧几里德,
首先去掉系数:
x ≡ 46 (mod 99)
x ≡ 98 (mod 101)
# 求解方法很多,这里列举利用二元一次不定方程方法:
# 13x ≡ 4 (mod 99) 转化为 13x-99y = 4
然后用拓展欧几里德:
13×46-99×6 = 4
x=46, y=6
所以不定方程13x-99y = 4 的所有解为
x=46 99t
y=6 13t
所以原同余方程解为:x ≡ 46 (mod 99)
消去x得: 99a - 101b = 52
拓展欧几里德走你:x = 7471 (mod 9999)
x = 9999 n 7471 (n ∈ Z)