求解线性模运算中的逆元

我们在中学都学过这个问题:已知非零正整数a,b如何求解a,b的最大公约数?
答案是欧几里得公式,表达出来就是
gcd(a,b) = gcd(b,a mod b)
用python写出来就是

def gcd(a,b):
    if b ==0:
        return a
    return gcd(b,a%b)

接下来讨论引理:

a在模b中有逆元,当且仅当gcd(a,b)=1

这个引理指出了有逆元的条件,我们来证明其充分性
假如存在整数x,y,使得
a·x + b·y = 1 (模b)
则x是a的逆元,因为a·x =1 (模b)
我们可以使用扩展欧几里得算法来求解x,y

ax + by = gcd(a,b)
bx1 + (a%b)y1 = gcd(b,a%b)

可推导出
x = y1
y = x1 - (a/b)*x

使用python写

def exgcd(a,b):
    if b == 0:
        return 1,0
    x1,y1 = exgcd(b, a%b)
    return y1, x1- int(a/b)*y1

能求解x,y
当a,b互质时,ax + by = gcd(a,b) = 1
充分性得证
必要性在这里不证明了,比较简单
x即为a的逆元

你可能感兴趣的:(数学,线性代数,python)