Euclid算法

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+r0r<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+r0r<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 da,db,daqb=r
所以 d d d d ′ d' d的公因数即 d ≤ d ′ d\le d' dd.
d ′ ∣ b , d ′ ∣ r , d ′ ∣ q b + r = a d'|b,d'|r,d'|qb+r=a db,dr,dqb+r=a,
所以 d ′ d' d d d d的公因数,所以 d ′ ≤ d d'\le d dd,故 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的逆元 sa.

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)=ab

def lcm(a, b):
    return a * b // gcd(a, b)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

都学点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值