初等数论之求解二元不定方程
定理1:
设二元一次不定方程
$$
ax + by = c \\hspace{1cm}
(1)
$$
(其中a, b, c是整数, 且a, b都不是0), 假定有一组整数解,$x=x_0, y=y_0$。
则原式的一切整数的通解可以表示成
$$
\\left\\{
\\begin{aligned}
x = x_0 + \\frac b {(a, b)}t, & \\\\
& (t \\in z) \\\\
y = y_0 - \\frac a {(a, b)}t, & \\\\
\\end{aligned}
\\right.
$$
定理2:
$\\hspace{1cm}(1)$式有整数解等价于$(a, b)|c$。
解法:
扩展欧几里得算法就是求解二元不定方程的手段之一
扩展中国剩余定理模板题
#include<iostream>
using namespace std;
typedef long long LL;
LL exgcd(LL a, LL b, LL &x, LL &y){
if(!b){
x = 1, y = 0;
return a;
}
LL d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main(){
int n;
cin >> n;
LL a1, m1, a2, m2, k1, k2;
cin >> a1 >> m1;
while ( -- n){
cin >> a2 >> m2;
LL d = exgcd(a1, a2, k1, k2);
if((m2 - m1) % d){
cout << -1 << endl;
return 0;
}
k1 = k1 * (m2 - m1) / d; // 特解
k1 = (k1 % (a2 / d) + a2 / d) % (a2 / d);
m1 = a1 * k1 + m1;
a1 = a1 * a2 / d;
}
m1 = (m1 % a1 + a1) % a1;
cout << m1 << endl;
return 0;
}
参考书籍
这个通解t前面任何系数都可以约掉,为什么一定需要引入一个最小公倍数呢
我也觉得(a, b)有点没必要。。。。
确实是任何一个数都可以,不过好像是在编程的时候方便写成整数形式,类似最小公倍数除以整数,具体咋样我忘了
https://www.acwing.com/solution/content/21747/
这里的通解的推导过程中同除(a, b),使得方程右侧为 1, 确保可以基于裴蜀定理使得ai / d互质,然后有后续证明。
ok
多谢
密码学应用甚广
初等数论可以参考陈景润先生的书籍,他是我最敬佩的数学家之一
这题解不应该放分享上吗?容易误导人