浅谈裴蜀定理&扩展欧几里得
裴蜀定理#
是整数,且 ,那么对于任意的整数 , 都一定是 的倍数。特别地,一定存在整数 ,使 成立。
换种说法,若 有解,当且仅当 是 的倍数。
证明:
令 。
一、必要性:如果有整数解,那么 是 的倍数。
。
因此 是 的倍数。必要性得证。
二、充分性:如果 是 的倍数,那么就有整数解。
根据欧几里得算法,求 的时候,最后一定是 。
此时满足 的解很容易找,例如 。
然后考虑从 的整数解推到 的整数解。(有点像归纳)
设
显然当 时等式成立,则必然有整数解。充分性得证。
扩展欧几里得#
其实扩展欧几里得就是要求类似 这样式子的解。而在刚刚裴蜀定理充分性的证明中,已经将如果求一组特殊解的过程说了。
即:先求出 ,并令此时 ,然后一步一步向上推导回去。
如方程 ,求解过程如下表所示:()
a | b | 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 |
验证一下:。
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;
}
}
做到这里,我们已经求出来了一组特解,那么如何求出一般解呢?
我们设特解 的下一组解是 ,有
约分得 。
而根据定义, 应该尽可能小,所以 。
因此 的一般解形式就可以表示成 ,其中 。
拓展:
对于整数序列 是否存在 使得 其中满足.
结论:存在。
证明:使用数学归纳。
当 时成立(根据裴蜀定理)。
设当 时成立,考虑 时是否成立。
有解,因为 ,而 。
同时 也有解。
得证。并且上述证明过程也可以用于求解过程。
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现