Loading...

扩欧学习笔记

扩展欧几里得?什么鬼?

扩展欧几里得算法是欧几里得算法(又叫辗转相除法)的扩展。除了计算a、b两个整数的最大公约数,此算法还能找到整数x、y(其中一个很可能是负数)。通常谈到最大公因子时, 我们都会提到一个非常基本的事实: 给予二整数 a 与 b, 必存在有整数 x 与 y 使得\(ax + by = \gcd(a,b)\)。有两个数a,b,对它们进行辗转相除法,可得它们的最大公约数——这是众所周知的。然后,收集辗转相除法中产生的式子,倒回去,可以得到\(ax+by=\gcd(a,b)\)的整数解。

​ ——摘自百度百科

简单来说,就是求满足\(ax+by=\gcd(a,b)\)的最小整数\(x\)的值


求解

  • 一、由特解求通解

    设有特解\(x_0,y_0\)

    则通解为\(x=x_0+t,y\)

    \(\because ax_0+by_0=\gcd(a,b),ax+by=\gcd(a,b)\)

    \(\therefore ax_0+by_0=ax+by\)

    \(\therefore ax_0+by_0=a(x_0+t)+by\)

    化简得\(y=y_0-\frac{a}{b}t\)

    \(\because y,y_0 \in \mathbb{Z}\)

    \(\therefore \frac{a}{b}t\in\mathbb{Z}\)

    \(\therefore \frac{a/\gcd(a,b)}{b/\gcd(a,b)}t\in\mathbb{Z}\)

    \(\therefore t=\frac{b}{\gcd(a,b)}k\)

    \(\therefore x=x_0+\frac{b}{\gcd(a,b)},y=y_0+\frac{a}{gcd(a,b)}\)

  • 二、求特解

    先看辗转相除法

    \(\gcd(a,b)=\gcd(b,a\mod b)\)

    \(\because ax+by=\gcd(a,b),bx_1+(a\mod b)y_1=\gcd(b,a\mod b)\)

    则一定有\(ax+by=bx_1+(a\mod b)y_1\)

    \(\therefore\)该式可变形为\(ax+by=bx_1+(a-\lfloor\frac{a}{b}\rfloor*b)y_1\)

    化简得\(ax+by=ay_1+b(x_1-\lfloor\frac{a}{b}\rfloor*y_1)\)

    \(\therefore x=y_1,y=x_1-\lfloor\frac{a}{b}\rfloor*y_1\)

    这不还是求不出吗

    递归求就行

    如:

    \(72x+46y=\gcd(72,46)\downarrow\)

    \(46x+26y=gcd(46,26)\downarrow\)

    \(26x+20y=\gcd(26,20)\downarrow\)

    \(20x+6y=gcd(20,6)\downarrow\)

    \(6x+2y=\gcd(6,2)\downarrow\)

    \(2x+0y=\gcd(2,0)\)

    此时,\(b=0\),开始回溯,将\(x=1,y=\forall\)即可(以\(y=0\)为例)

    \(a=2,b=0,x=1,y=0\downarrow\)

    \(a=6,b=2,x=0,y=1\downarrow\)

    \(a=20,b=6,x=1,y=-3\downarrow\)

    \(a=26,b=20,x=-3,y=4\downarrow\)

    \(a=46,b=26,x=4,y=-7\downarrow\)

    \(a=72,b=46,x=-7,y=11\)

  • 三、代码

    什么,这不只要\(ctrl+c,ctrl+v\)

    \(Code:\)

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

让我们来个扩展,也就是扩展扩展欧几里得

求满足\(ax+by=c\)的最小整数解\(x\)

好吧,其实这道题和刚在那道题是一样的

让我们来康康:

\(ax+by=c(c≠0)\downarrow\)

\(\frac{a}{c}x+\frac{b}{c}y=1\downarrow\)

\(\frac{a*\gcd(a,b)}{c}x+\frac{b*\gcd(a,b)}{c}y=\gcd(a,b)\)

是不是和之前那个长得很像?

那我们再像一点:

\(a(\frac{gcd(a,b)}{c}x)+b(\frac{gcd(a,b)}{c}y)=gcd(a,b)\)

还能再像?

我们设\(m=\frac{gcd(a,b)}{c}x,n=\frac{gcd(a,b)}{c}y\)

\(\therefore\)原式变为\(am+bx=gcd(a,b)\)

是不是一样了?

我们用之前的方法求出\(m,n\)的值

易知\(x=\frac{cm}{\gcd(a,b)},y=\frac{cn}{\gcd(a,b)}\)

posted @ 2020-10-30 19:09  CNF_Acceptance  阅读(73)  评论(0)    收藏  举报