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

裴蜀定理#

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

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

证明:

gcd(a,b)=p

一、必要性:如果有整数解,那么 cp 的倍数。

a=ap,b=bp

ax+by=apx+bpy=p(ax+by)=c

因此 cp 的倍数。必要性得证。

二、充分性:如果 cp 的倍数,那么就有整数解。

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

此时满足 ax+by=c 的解很容易找,例如 x=cp,y=0

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

bx1+a%by1=c

ax+by=bx1+a%by1=bx1+(aabb)y1=ay1+b(x1aby1)

显然当 x=y1,y=x1abb 时等式成立,则必然有整数解。充分性得证。

扩展欧几里得#

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

即:先求出 gcd,并令此时 x=pgcd,y=0,然后一步一步向上推导回去。

如方程 99x+78y=6,求解过程如下表所示:(x=y1,y=x1abb

a b ab 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)+7828=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),有

ax0+by0=a(x0+d1)+b(y0+d2)=c

ad1+bd2=0

d1d2=ba

约分得 d1d2=bgcd(a,b)agcd(a,b)

而根据定义,d1 应该尽可能小,所以 d1=bgcd(a,b),d2=agcd(a,b)

因此 ax+by=c 的一般解形式就可以表示成 x=x0+k(bgcd(a,b)),y=y0k(agcd(a,b)),其中 kZ



拓展:

对于整数序列 A1,A2,A3,,An 是否存在 X1,X2,X3,,Xn 使得 A1X1+A2X2+A3X3++AnXn=C 其中满足gcd(A1,A2,A3,,An)|C,n2.

结论:存在。

证明:使用数学归纳。

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

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

gcd(A1,A2,A3,,Ak)x+Ak+1Xk+1=C 有解,因为 gcd(gcd(A1,A2,A3,,Ak),Ak+1)=gcd(A1,A2,A3,,Ak+1),而 gcd(A1,A2,A3,,Ak+1)|C

同时 A1X1+A2X2+A3X3++AkXk=gcd(A1,A2,A3,,Ak)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;
}
posted @   Thunder_S  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩