算法数论.3(拓展欧几里得,中国剩余定理)
1.扩展欧几里得算法
int exgcd(int a, int b, int &x,int &y){
if(!b)// b == 0
{
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);//根据交换,交换x, y
y -= a / b * x;//更新y
return d;
}
题目:
要解本题,首先介绍一下裴蜀定理:有一对正整数a,b,那么一定存在整数x,y,使得
ax + by = gcd (a, b)
简单证明一下:a是gcd(a,b)的倍数, b是gcd(a,b)的倍数, 那么倍数加倍数ax + by = d也一定是gcd(a,b)的倍数。
b ==0 时, (a,0) = a, ax + by = a, 此时 x = 1, y = 0;
b != 0时, 此时 d = exgcd(b, a % b, y, x) ;即 by + (a % b)x = (a,b)
by + (a - a/b * b)* x = d
a*x + b*(y - a/b * x) = d
#include <bits/stdc++.h>
using namespace std;
int exgcd(int a, int b, int &x,int &y){
if(!b)// b == 0
{
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);//根据交换,交换x, y
y -= a / b * x;//更新y
return d;
}
int main(){
int n;
cin >> n;
while(n --){
int x, y, a, b;
cin >> a>> b;
exgcd(a, b, x, y);
cout <<x <<" "<<y<<endl;
}
return 0;
}
2.线性同余方程
题目:
要求题;即存在y属于整数,使得 a* x = m*y + b;
ax - my = b
即ax + my = b ----> 扩展欧几里得
即证明b是(a, m)(即d)最大公约数的倍数。 若b不是, 则无解。
#include <bits/stdc++.h>
using namespace std;
int exgcd(int a, int b, int &x,int &y){
if(!b)// b == 0
{
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main(){
int n;
cin >> n;
while(n --){
int x, y, m, a, b;
cin >> a>> b>>m;
int d = exgcd(a, m, x, y);//满足ax+my=最大公约数的d
if(b%d) cout <<"impossible"<<endl;//若b不是d的倍数,无解
else cout<<(long long)b/d *x%m<<endl;//不是,有解
}
return 0;
}