扩展欧几里得算法证实及求乘法逆元

扩展欧几里得算法python

已知整数a、b,扩展欧几里得算法能够在求得a、b的最大公约数的同时,能找到整数x、y,使它们知足贝祖等式:ax+by=gcd(a,b)算法

为何必定存在贝祖等式呢,裴蜀定理以下:code

设存在x,y使ax+by=d,d是ax+by取值中的最小正整数,d≠1。再设am+bn=e,则e≥d .若d不整除e,对e作带余除法.一定存在p,r使e=pd+r.r<d则r=e-pd=(m-px)a+(n-py)b.存在整数m-px,n-py使ax+by=r<d,与d的最小性矛盾。因此d整除e.令m=1,n=0,则d整除a;同理d整除b.因此d=gcd(a,b)rem

下面给出扩展欧几里得算法的证实get

ax + by = gcd(a, b)
a'x' + b'y' = gcd(a', b') (其中a'= b, b' = a % b,)
咱们要获得x,y与x',y'的关系
将a'= b, b' = a % b带入第一个等式
得:bx' + (a%b)y' = gcd(a', b')
由于a%b = a - b[a/b] ([a/b],取a除以b的整数)因此ay' + b(x' - [a/b]y') = gcd(a', b') = gcd(a,b)(由展转相除得)
因此,x,y,x',y'的关系是:

x=y'
y=x' - [a/b] * y'

这样就能够用递推公式,不断向下获得x',y'。

下面给出对应的python代码扩展

#扩展欧几里得算法求线性方程的x与y
def exten_(a, b):
    if b == 0:
        return 1, 0
    else:
        k = a // b
        remainder = a % b       
        x1, y1 = get_(b, remainder)
        x, y = y1, x1 - k * y1          
    return x, y

扩展欧几里得算法求乘法逆元gc

aa'=1(mod b) -> aa'=km+1 -> aa'-kb=1
令x=a' y=-k 即得ax+by=1,便可利用扩展欧几里得算法求得a'co

相关文章
相关标签/搜索