exgcd

本文详细介绍了欧几里得算法及其扩展版本,用于求解两个整数的最大公约数及线性组合。通过数学证明阐述了算法原理,并提供了具体的递归实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自https://www.cnblogs.com/hadilo/p/5914302.html

欧几里得

定义: \(gcd(a,b)\)为整数 \(a\)\(b\) 的最大公约数

引理:\(gcd(a,b)=gcd(b,a \bmod b)\)

证明:

    设$ r=a \bmod b , c=gcd(a,b) $

    则$ a=xc , b=yc $, 其中x , y互质

    \(r=a \bmod b=a-pb=xc-pyc=(x-py)c​\)

    而\(b=yc\)

    可知:$y $与 $x-py $互质

证明:

​   假设 \(y\) 与$ x-py $不互质

​   设 $y=nk , x-py=mk $, 且 $k>1 $(因为互质)

​    将 y 带入可得

​   \(x-pnk=mk\)

​   \(x=(pn+m)k\)

​    则$ a=xc=(pn+m)kc , b=yc=nkc$

​   那么此时 \(a\) 与$ b $的最大公约数为 $kc $不为 \(k\)

​   与原命题矛盾,则 \(y\) 与$ x-py $互质

    因为 \(y\)\(x-py\) 互质,所以 \(r\)\(b\) 的最大公约数为 \(c\)

    即 \(gcd(b,r)=c=gcd(a,b)\)

    得证

  当\(a \bmod b=0\)时,\(gcd(a,b)=b\)

  这样我们可以写成递归形式

实现:

int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}

扩展欧几里得

引理:存在 \(x , y\) 使得\(gcd(a,b)=ax+by\)

证明:

\(b=0\) 时,\(gcd(a,b)=a,此时 x=1 , y=0\)
\(b \neq 0\) 时,设

\(ax+by=gcd(a,b)=gcd(b,a \bmod b)=b{x}'+(a \bmod b){y}'\)

\(\because a \bmod b = a-a/b*b\)

\(\therefore ax+by=b{x}'+(a-a/b*b){y}'\)

\(\therefore ax+by=b{x}'+a{y}'-b*a/b*{y}'\)

\(\therefore ax+by=a{y}'+b{x}'-b*a/b*{y}'\)

\(\therefore ax+by=a{y}'+b({x}'-a/b*{y}')​\)

\(解得 x={y}' , y={x}'-a/b*{y}'\)

\(b=0\) 时存在 x , y 为最后一组解

实现:

递归进入下一层,当$ b=0 \(时就返回\)x=1,y=0$

再根据\(x={y}' , y={x}'-a/b*{y}'\)得出当前所在层的解

回到第一层的时候得到答案。

void exgcd(int a,int b,int &x,int &y){
    if(!b){x=1,y=0;return a;}
    int r=exgcd(b,a%b,x,y),t=x;x=y;y=t-a/b*y;
    return r;
}

转载于:https://www.cnblogs.com/mimiorz/p/10297921.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值