线性丢番图方程 裴蜀定理 扩展欧几里得算法

二元线性丢番图方程

方程 ax+by=c 称为二元线性丢番图方程,其中 a,b,c 为常量,x,y 为变量,问方程是否有整数解。

该方程实际上是二维平面上的一条直线,无固定解,所以丢番图方程又称为不定方程


在数论中,我们记 (a,b)ab 的最大公约数,即 gcd(a,b) 的简写。

那么,在讨论不定方程是否有整数解上,我们可得到以下定理。


裴蜀定理

如果 a,bN ,则有整数 x,y 使 ax+by=(a,b)

这个等式称为裴蜀等式。

推论

  1. 如果 a,bN ,且 (a,b)=1 ,当且仅当  x,yN ,使 ax+by=1
  2. 如果 a,bN ,则有则有整数 x,y,n 使 ax+by=(a,b)×n

证明

换个理解方式:对 x,yd=ax+byd 一定是 (a,b) 的整数倍;其中最小的 d 就是 (a,b)

a,b 互质, 则 d=(a,b)=1 ,所以 ax+by=1

那么,如果 d 不是 (a,b) 的整数倍,不定方程一定没有整数解。


扩展欧几里得算法

问题1

ax+by=(a,b) 的一组整数解。

算法

b=0 时,ax+by=a ,故而 x=1, y=0

b0 时,

由欧几里得算法,(a,b)=(b,a%b)

由裴蜀定理,

(1)(a,b)=ax+by(2)(b,a%b)=bx1+(a % b)y1(3)=bx1+(aab×b)y1(4)=ay1+b(x1aby1)

所以 x=y1, y=x1aby1

利用递归,先求出下一层的 x1, y1

再回代上一层,回代求特解 x0, y0

tips

实际上,就是等式两边同时除以 (a,b) ,得到 cx+dy=1

其中,c=a(a,b), d=b(a,b) ,可以直接写出通解 x=x0+dn, y=y0cn

构造通解

{x=x0+b(a,b)×ky=y0a(a,b)×k

问题2

ax+by=c 的一组整数解。

算法

(a,b)c ,则有整数解。

先用扩展欧几里得算法求 ax+by=(a,b) 的解。

再乘以 c(a,b) ,即得到原方程的特解 x0, y0。(原理就是上面tips的逆运用)

(a,b)c ,则无整数解。



[AcWing877] 扩展欧几里得算法

题目描述

给定 n 对正整数 ai,bi,对于每对数,求出一组 xi,yi,使其满足 ai×xi+bi×yi=gcd(ai,bi)

输入格式

第一行包含整数 n

接下来 n 行,每行包含两个整数 ai,bi

输出格式

输出共 n 行,对于每组 ai,bi,求出一组满足条件的 xi,yi,每组结果占一行。

本题答案不唯一,输出任意满足条件的 xi,yi 均可。

数据范围

1n105,
1ai,bi2×109

输入样例:

2
4 6
8 18

输出样例:

-1 1
-2 1

算法

这里就用 a=4, b=6 来手推扩欧算法。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll exgcd(int a,int b,int &x,int &y)
{
if (b == 0){
x = 1, y = 0;
return a;
}
int x1, y1, gcd;
gcd = exgcd(b, a % b, x1, y1);
x = y1, y = x1 - a / b * y1;
return gcd;
}
int main()
{
int n; cin >> n;
while (n--){
int a, b, x, y;
cin >> a >> b;
int gcd = exgcd(a,b,x,y);
cout << x << " " << y << endl;
}
return 0;
}
posted @   AKgrid  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示