基于《算法导论》,下面是《算法导论》求解模线性方程的源代码
#include <iostream>
using namespace std;
//三元组存放数据
class Data
{
public:
int gcd;
int x;
int y;
};
/*算法功能*/
//对于 d =gcd(a,b) = ax + by,求解x,y 的整数值
//注意:x ,y可以是负数
Data gcdPlus(int a, int b)
{
//这个基线其实就是普通的gcd递归算法,只不过是多了 x,y
//其中gcd是由基线确定的,一旦确定了,在递归中就不再改变了
if(b == 0){
Data d_temp{a,1,0};
return d_temp;
}else{
Data temp = gcdPlus(b, a % b);
//这个算法的核心,其正确性详见《算法导论》P549
Data d1 {temp.gcd,temp.y,temp.x- (a/b) * temp.y};
return d1;
}
}
/*算法功能:求解 ax 同余 b(mod n)*/
void Modular_Linear_Equation_solver(int a, int b, int n)
{
//对于以下的公式和判定条件,以及这个算法的正确性见《算法导论》P545 P555
Data d = gcdPlus(a,n);
if(b % d.gcd == 0){ //如果有解
int x = (d.x * (b/d.gcd)) % n + n; //其中一个解是这个x,并且对于这里,算法导论在这里没有 +n,实际来说要+上一个n
for(int i=0;i<=d.gcd-1;i++){ //一共有 d 个解
//根据公式循环输出
cout << (x + i * (n / d.gcd)) %n << endl;
}
}else{
cout << "无解" << endl;
}
}
int main()
{
// ax 同余 b( mod n )
int a,b,n;
cin >> a >> b >> n;
Modular_Linear_Equation_solver(a, b, n);
return 0;
}