欧几里得算法:辗转相除法,用于求两个数的最大公约数
裴属定理:ax+by=gcd(a , b) 即如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。
扩展欧几里得用途:
判断方程ax+by=m是否有解(如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍);
求ax+by=m的任意一组解、通解、最小整数解;
线性同余方程是最基本的同余方程,形如 (等价于
)的未知数是 x 的同余式
#include<iostream>
using namespace std;
//拓展欧几里得算法
int extend_gcd(int a, int b, int& x, int& y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
else
{
int temp = extend_gcd(b, a % b, x, y);
int t = y;
y = x - (a / b) * y;
x = t;
return temp;
}
}
int main()
{
int a, b;
int x, y;
int c;
cin >> a >> b;
int g = extend_gcd(a, b, x, y);
cout << "最大公约数是:" << g << endl;
cout << "请输入c的值:";
cin >> c;
//求x,y其中的一个的解
if (c % g == 0)
cout << "有解";
cout << "x:" << x << endl << "y:" << y << endl;
//求ax+by=gcd(x,y)的最小正整数解
//a 和 b 互素(即 gcd(a,b)=1)
x += b / g;
y -= a / g;
cout << "最小x正整数解(=gcd(a,b),与c无关)" << endl << "x:" << x%(b/g) << endl << "y:" << y%(x/g) << endl;
//求同余式的解
if (c % g != 0)
cout << "同余式无解";
else
{
cout << "同余式" << endl;
x *= c / g;
for (int i = 0; i < g; i++)
cout << (x + b / g * i) % b << endl;
}
}