整除性与最大公因数(欧几里得算法)

整除性与最大公因数

1 基本概念

  设 m , n m,n m,n是整数, m ≠ 0 m\ne 0 m=0 m m m整除 n n n指: n n n m m m的倍数,即存在整数 k k k使得 n = k m n=km n=km。整除 n n n的数称为 n n n因数

  对于两个已知整数,它们的公因数指:可以整除它们两个的数。

  两个整数 a , b a,b a,b(不全为0)的最大公因数是整除它们两个的最大数,记为 g c d ( a , b ) gcd(a,b) gcd(a,b)。如果 g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1,则称 a a a b b b互素

  最大公因数是一个很重要的量,经常在数论中见到。

2 一些求最大公因数的方法

  • 因数分解,例如求:
    g c d ( 225 , 120 ) = 15 gcd(225,120)=15 gcd(225,120)=15
    通过因数分解 225 = 3 2 ∗ 5 2 225=3^2*5^2 225=3252 120 = 2 3 ∗ 3 ∗ 5 120=2^3*3*5 120=2335可以验证答案是正确的。

  • 打表,我们可以把 a , b a, b a,b的所有公因数都找出来,然后找出同时出现在两个表中的最大数

3 欧几里得算法

  欧几里得算法是求两个数最大公因数的最有效方法,算法由直到余数为0的一系列带余除法组成的。

3.1 一个例子

  计算:
g c d ( 36 , 132 ) gcd(36, 132) gcd(36,132)
第一步:
132 = 3 ∗ 36 + 24 132=3*36+24 132=336+24
第二步取 36 36 36,用前一步的余数 24 24 24 36 36 36得:
36 = 1 ∗ 24 + 12 36=1*24+12 36=124+12
下一步同理:
24 = 2 ∗ 12 + 0 24=2*12+0 24=212+0
欧几里得算法说明当得到余数0时,则前一步的余数就是最初两个数的最大公因数。因此 g c d ( 36 , 163 ) = 12 gcd(36, 163)=12 gcd(36,163)=12

3.2 形式化地表示

  欧几里得算法可以用下式来形式化地表示:
A = B ∗ Q + R A=B*Q+R A=BQ+R
每一步用 B , R B,R B,R替换原来的 A , B A,B A,B,重复此过程知道得到余数0为止。

  对于一般情形给出 a , b a,b a,b有:
a = q 1 ∗ b + r 1 b = q 2 ∗ r 1 + r 2 r 1 = q 3 ∗ r 2 + r 3 r 2 = q 4 ∗ r 3 + r 4 ⋯ ⋯ r n − 3 = q n − 1 ∗ r n − 2 + r n − 1 r n − 2 = q n ∗ r n − 1 + r n r n − 1 = q n + 1 ∗ r n + 0 \begin{aligned} &a=q_1*b+r_1\\ &b=q_2*r_1+r_2\\ &r_1=q_3*r_2+r_3\\ &r_2=q_4*r_3+r_4\\ &\cdots \cdots \\ &r_{n-3}=q_{n-1}*r_{n-2}+r_{n-1}\\ &r_{n-2}=q_{n}*r_{n-1}+r_{n}\\ &r_{n-1}=q_{n+1}*r_{n}+0\\ \end{aligned} a=q1b+r1b=q2r1+r2r1=q3r2+r3r2=q4r3+r4rn3=qn1rn2+rn1rn2=qnrn1+rnrn1=qn+1rn+0
如果我们令 a = r − 1 , b = r 0 a=r_{-1},b=r_0 a=r1,b=r0则上述的每一行都形如为:
r i − 1 = q i + 1 ∗ r i + r i + 1 r_{i-1} = q_{i+1}*r_i+r_{i+1} ri1=qi+1ri+ri+1

r n r_n rn就是 a , b a,b a,b的最大公因数

3.3 证明

  首先证明: r n r_n rn a , b a,b a,b的公因数。自底向上分析。最后一行 r n − 1 = q n + 1 ∗ r n r_{n-1}=q_{n+1}*r_{n} rn1=qn+1rn说明 r n r_n rn整除 r n − 1 r_{n-1} rn1,同理倒数第二行 r n − 2 = q n ∗ r n − 1 + r n r_{n-2}=q_{n}*r_{n-1}+r_{n} rn2=qnrn1+rn表明 r n r_{n} rn整除 r n − 2 r_{n-2} rn2,再往上依旧成立,直到第 1 , 2 1,2 1,2行可以得到 r n r_n rn整除 a a a b b b,故 r n r_n rn a , b a,b a,b的公因数得证。

  再证明: r n r_n rn a , b a,b a,b的最大公因数。设 d d d a , b a,b a,b的任意公因数。自顶向下分析,我们从第一个等式 a = q 1 ∗ b + r 1 a=q_1*b+r_1 a=q1b+r1出发,由于 d d d整除 a a a b b b,可知 d d d整除 r 1 r_1 r1,到第二行式子 b = q 2 ∗ r 1 + r 2 b=q_2*r_1+r_2 b=q2r1+r2,由于 d d d整除 b b b r 1 r_1 r1,可知 d d d整除 r 2 r_2 r2。再往下也是同理,对于每一步, d d d整除前两个余数 r i r_i ri r i − 1 r_{i-1} ri1。最后我们能够得到 d d d整除 r n r_n rn的结论。既然 a , b a,b a,b的任意公因数 d d d都整除 r n r_n rn r n r_n rn也是 a , b a,b a,b的公因数。那么 r n r_n rn一定是 a a a b b b的最大公因数。

3.4 定理(欧几里得算法)

  要计算两个整数 a a a b b b的最大公因数,先令 r − 1 = a r_{-1}=a r1=a r 0 = b r_0=b r0=b,然后计算相继的商和余数:
r i − 1 = q i + 1 ∗ r i + r i + 1      ( i = 0 , 1 , 2 , ⋯   ) r_{i-1} = q_{i+1}*r_i+r_{i+1}\ \ \ \ (i=0,1,2,\cdots) ri1=qi+1ri+ri+1    (i=0,1,2,)
直到某余数 r n + 1 r_{n+1} rn+1 0 0 0。最后的非零余数 r n r_n rn就是 a , b a,b a,b的最大公因数。

4 算法实现

  python实现 g c d gcd gcd并计算 g c d ( 316258250 , 1160718174 ) gcd(316258250, 1160718174) gcd(316258250,1160718174)

def gcd(a, b):
    while a % b:
        a, b = b, a % b
    return b
    
print(gcd(316258250, 1160718174))

递归实现

def gcd(a, b):
    if not b:
        return a
    return gcd(b, a % b)

print(gcd(316258250, 1160718174))

结果:

1078

5 参考资料

[1] 《数论概论》P19-P22

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值