欧几里得 与 扩展欧几里得

欧几里得

求整数a,b的最小公约数gcd(a,b)的算法。即欧几里得算法。
有一个重要的公式如下,这个公式的证明百度百科上有.
\[ gcd(a,b)=gcd(b,a\ mod\ b)\tag{1} \]
我们不妨考虑a,b为正整数的情况。令gcd(a,b)=g,则
\[ a=k_1g \qquad b=k_2g \]
首先k1和k2肯定互质,即gcd(k1,k2)=1,否则说明a,b存在一个更大的约数,这与gcd(a,b)=g矛盾。
那么由(1)式我们知道k1,k2辗转相减一定会定于1。我们就会得到下面的一个结论.

若a,b互质,则 ax+by=1 一定存在整数解(x,y)
扩展的,
若gcd(a,b)<>1,则 ax+by=gcd(a,b) 一定存在整数解(x,y)
因为同除gcd(a,b)有解.

由此我们引出扩展欧几里得

扩展欧几里得

通过上面我的个人理解,推出了扩展欧几里得(证明可能不够严谨...).下面我们来看一下如何求这样整数解(x,y)之一.
根据公式
\(gcd(a,b)=gcd(b,a\ mod\ b)\tag{1}\)
\(ax+by=gcd(a,b)\tag{2}\)

 ● 对于(2)式,当b=0时,ax+by=gcd(a,b)=a,显然(x=1,y=0)是方程的一个解.
 ● 当b不为0时,根据欧几里得定理(1式)gcd(a,b)=gcd(b,a mod b)可得
\[ \begin{align} gcd(a,b) & =gcd(b,a\ mod\ b)\\ \Rightarrow \qquad ax+by=gcd(a,b) & =gcd(b,amodb)=bx′+(a\ mod\ b)y′\\ \Rightarrow \qquad \qquad\qquad\quad ax+by &=bx′+(a\ mod\ b)y′=bx′+(a−b∗⌊a/b⌋)y′\\ \text{移项得}\qquad \qquad ax+by &=ay′+b(x′−⌊a/b⌋y′) \end{align} \]

\[ \text{根据恒等定理,有}\qquad \begin{cases} x=y'\\ y=x′−⌊a/b⌋y′ \end{cases}\qquad\qquad\qquad\qquad\qquad\quad\]

这有什么用呢?x′和y′还是不知道呀.
重新来看看我们得到的两个等式.x和y是\(gcd(a,b)=ax+by\)的解,而\(x'\)\(y'\)是在对gcd(a,b)按欧几里德算法进行一步后的结果对应的贝祖等式\(gcd(b,a\ mod\ b)=bx′+(a\ mod\ b)y′\)的解.也就是说,gcd(a,b)对应的贝祖等式的解x,y可以由gcd(b,a mod b)对应等式的解\(x',y'\)计算得出.

由于欧几里德算法最后一步为gcd(d,0)=d,此时对应的等式的解为x=1,y=0,因此只要如上述代码,从gcd(d,0)往前处理,在进行欧几里德算法的递归的时候根据相邻两次调用间x,y和x’,y’的关系计算即可求出ax+by=gcd(a,b)的解.

更进一步,对于任意不定式ax′+by′=c,只需要在等式ax+by=gcd(a,b)=d两边乘上c/d即可得到解为x′=x∗c/d,y′=y∗c/d

解的范围

递归算到最后y其实可以取任意整数。但是取的太大容易导致使得最后算出来的解爆int之类的事情
下面我们来看一下最终算出来的解x,y的绝对值大小情况
由x y的计算方法x -= (a / b) * y可以知道,x y始终是在max(|a|, |b|)的绝对值范围内的,因此ax + by = gcd(a, b)最后算出的x y的绝对值大小跟a b是同一个级别的。

如何得到所有解?

实际上在之前的计算和证明中我们得到的只是不定方程的一组解,那么怎样得到所有解呢?对于一般形式ax+by=g有通解(x,y),则\(x'=x+b/g,y'=y−a/g\).(证明略,只要代入一下就知道为什么通解是这个了)

exgcd代码

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

转载于:https://www.cnblogs.com/xjdx/p/7810040.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值