Euclid算法
Euclid除法
定理:(Elide除法)设a,b是两个整数,其中b>0,则存在唯一的整数q,r使得
a
=
q
b
+
r
0
≤
r
<
b
a = qb+r\quad 0\le r\lt b
a=qb+r0≤r<b
gcd
最大公因数,记a,b的最大公因数为 g c d ( a , b ) gcd(a,b) gcd(a,b)或 ( a , b ) (a,b) (a,b)。
定理:设a,b,r是三个不全为零的整数。如果
a
=
q
b
+
r
0
≤
r
<
b
a = qb+r \quad 0\le r\lt b
a=qb+r0≤r<b
其中q是整数,则
(
a
,
b
)
=
(
b
,
r
)
(a,b)= (b,r)
(a,b)=(b,r)。
证明:
令
d
=
(
a
,
b
)
,
d
′
=
(
b
,
r
)
d=(a,b),d'=(b,r)
d=(a,b),d′=(b,r),
则
d
∣
a
,
d
∣
b
,
d
∣
a
−
q
b
=
r
d|a,d|b,d|a-qb=r
d∣a,d∣b,d∣a−qb=r,
所以
d
d
d是
d
′
d'
d′的公因数即
d
≤
d
′
d\le d'
d≤d′.
又
d
′
∣
b
,
d
′
∣
r
,
d
′
∣
q
b
+
r
=
a
d'|b,d'|r,d'|qb+r=a
d′∣b,d′∣r,d′∣qb+r=a,
所以
d
′
d'
d′是
d
d
d的公因数,所以
d
′
≤
d
d'\le d
d′≤d,故
d
=
d
′
d=d'
d=d′。证毕。
def gcd(a, b):
while b != 0:
r = a % b
a = b
b = r
return a
最大公因数为 ( a , b ) = 1 (a,b)=1 (a,b)=1,表明 a , b a,b a,b互素。
ext_gcd
扩展Euclid十分重要,可以用于求逆元。
给定 a , b a,b a,b,则存在唯一的 s , t s,t s,t使得 s a + t b = ( a , b ) sa+tb=(a,b) sa+tb=(a,b),若 ( a , b ) = 1 (a,b)=1 (a,b)=1,则 s a = 1 m o d b sa=1\ mod\ b sa=1 mod b, s 是 a 的 逆 元 s是a的逆元 s是a的逆元.
def ext_gcd(a, b):
s1, t1, r1 = 1, 0, a
s2, t2, r2 = 0, 1, b
while r2 != 0:
q = r1 // r2
temp1, temp2, temp3 = s1 - q * s2, t1 - q * t2, r1 - q * r2
s1, t1, r1 = s2, t2, r2
s2, t2, r2 = temp1, temp2, temp3
return s1, t1, r1
invert
求 a m o d p 的 逆 元 a\;mod\;p的逆元 amodp的逆元。
def invert(a, p):
s1, t1, r1 = ext_gcd(a, p)
if r1 != 1:
print(str(s1) + "*" + str(a) + "+" + str(t1) + "*" + str(p) + "=" + str(r1))
return None
else:
return s1 % p
最小公倍数
lcm
定理, l c m ( a , b ) ∗ g c d ( a , b ) = a ∗ b lcm(a,b)*gcd(a,b)=a*b lcm(a,b)∗gcd(a,b)=a∗b
def lcm(a, b):
return a * b // gcd(a, b)