• 浅谈裴蜀定理&扩展欧几里得


    裴蜀定理

    \(a,b\) 是整数,且 \(\gcd(a,b)=d\),那么对于任意的整数 \(x,y\)\(ax+by\) 都一定是 \(d\) 的倍数。特别地,一定存在整数 \(x,y\),使 \(ax+by=d\) 成立。

    换种说法,若 \(ax+by=c\) 有解,当且仅当 \(c\)\(\gcd(a,b)\) 的倍数。

    证明:

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

    一、必要性:如果有整数解,那么 \(c\)\(p\) 的倍数。

    \(a=a'*p,b=b'*p\)

    \(ax+by=a'*p*x+b'*p*y=p*(a'x+b'y)=c\)

    因此 \(c\)\(p\) 的倍数。必要性得证。

    二、充分性:如果 \(c\)\(p\) 的倍数,那么就有整数解。

    根据欧几里得算法,求 \(\gcd\) 的时候,最后一定是 \(a=p,b=0\)

    此时满足 \(ax+by=c\) 的解很容易找,例如 \(x=\frac{c}{p},y=0\)

    然后考虑从 \((b,a\%b)\) 的整数解推到 \((a,b)\) 的整数解。(有点像归纳)

    \(b*x1+a\%b*y1=c\)

    \(ax+by=b*x1+a\%b*y1=b*x1+(a-\lfloor\frac{a}{b}\rfloor*b)*y1=a*y1+b*(x1-\lfloor\frac{a}{b}\rfloor*y1)\)

    显然当 \(x=y1,y=x1-\lfloor\frac{a}{b}\rfloor*b\) 时等式成立,则必然有整数解。充分性得证。

    扩展欧几里得

    其实扩展欧几里得就是要求类似 \(ax+by=c\) 这样式子的解。而在刚刚裴蜀定理充分性的证明中,已经将如果求一组特殊解的过程说了。

    即:先求出 \(\gcd\),并令此时 \(x=\frac{p}{\gcd},y=0\),然后一步一步向上推导回去。

    如方程 \(99x+78y=6\),求解过程如下表所示:(\(x=y1,y=x1-\lfloor\frac{a}{b}\rfloor*b\)

    a b \(\lfloor\frac{a}{b}\rfloor\) x y
    99 78 1 -22 28
    78 21 3 6 -22
    21 15 1 -4 6
    15 6 2 2 -4
    6 3 2 0 2
    3 0 - x=gcd(99,78)=2 0

    验证一下:\(99*(-22)+78*28=-2178+2184=6\)

    void exgcd(int a,int b,int &d,int &x,int &y)
    {
        if (b==0){ d=a;x=c/a;y=0;}
        else
        {
            int x1,y1;
            exgcd(b,a % b,d,x1,y1);
            x=y1;
            y=x1-a/b*y1;
        }
    }
    

    做到这里,我们已经求出来了一组特解,那么如何求出一般解呢?

    我们设特解 \((x0,y0)\) 的下一组解是 \((x0+d1,y0+d2)\),有

    \(a*x0+b*y0=a*(x0+d1)+b*(y0+d2)=c\)

    \(a*d1+b*d2=0\)

    \(\dfrac{d1}{d2}=-\dfrac{b}{a}\)

    约分得 \(\dfrac{d1}{d2}=-\dfrac{\frac{b}{\gcd(a,b)}}{\frac{a}{\gcd(a,b)}}\)

    而根据定义,\(d1\) 应该尽可能小,所以 \(d1=\dfrac{b}{\gcd(a,b)},d2=-\dfrac{a}{\gcd(a,b)}\)

    因此 \(ax+by=c\) 的一般解形式就可以表示成 \(x=x0+k*(\frac{b}{\gcd(a,b)}),y=y0-k*(\frac{a}{\gcd(a,b)})\),其中 \(k\in \mathbb{Z}\)

    \(\\\)
    \(\\\)
    \(\\\)

    拓展:

    对于整数序列 \(A_1,A_2,A_3,\dots,A_n\) 是否存在 \(X_1,X_2,X_3,\dots,X_n\) 使得 \(A_1*X_1+A_2*X_2+A_3*X_3+\dots+A_n*X_n=C\) 其中满足\(\gcd(A_1,A_2,A_3,\dots,A_n)|C,n\ge 2\).

    结论:存在。

    证明:使用数学归纳。

    \(n=2\) 时成立(根据裴蜀定理)。

    设当 \(n=k\) 时成立,考虑 \(n=k+1\) 时是否成立。

    \(\gcd(A_1,A_2,A_3,\dots,A_k)*x+A_{k+1}*X_{k+1}=C\) 有解,因为 \(\gcd(\gcd(A_1,A_2,A_3,\dots,A_k),A_{k+1})=\gcd(A_1,A_2,A_3,\dots,A_{k+1})\),而 \(\gcd(A_1,A_2,A_3,\dots,A_{k+1})|C\)

    同时 \(A_1*X_1+A_2*X_2+A_3*X_3+\dots+A_k*X_k=\gcd(A_1,A_2,A_3,\dots,A_k)*x\) 也有解。

    得证。并且上述证明过程也可以用于求解过程。

    int main() 
    {  
        scanf("%d",&n);
        gcd[0]=0;
        for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&a[i]);
    		gcd[i]=Gcd(gcd[i-1],a[i]);
    	}
        scanf("%d",&c);
        if (c % gcd[n]==0)
        {  
        	y[n]=c/gcd[n];
        	for (int i=n;i>1;i--) 
    			exgcd(gcd[i-1],a[i],gcd[i]*y[i],y[i-1],x[i]);    
        	x[1]=y[1];
        	for(int i=1;i<=n;i++)
    			printf("%d ",x[i]);
        }
        return 0;
    }
    
  • 相关阅读:
    Object.prototype的原型对象 格式化日期【js笔记】
    数组中去掉重复的 【js笔记】
    按照内容多少,每行自动按照内容较多的div设置其他div的高度【jq笔记】
    动态操作表格 【js笔记】
    关于记录任意选择行删除或者其他的操作【jq笔记】
    Good studying and day day up
    第三周星期一
    第二周星期天
    第二周星期六
    第二周星期五
  • 原文地址:https://www.cnblogs.com/Livingston/p/16219407.html
Copyright © 2020-2023  润新知