您的位置:首页 > 其它

读初等数论小节(线性同余方程)

2011-06-05 12:27 176 查看
#include<iostream>
using namespace std;
/***************************************************************************/
|定理: 设a,b,m是整数, m>0, gcd(a,m)=d,若b%d!=0则无解, 若b%d=0,则ax==b(mod m)
|恰有 d 个模m的不同余的解  算法过程: 先转化为ax-my=b,根据线性丢番图定理, 求出
|可能特解x0, y0; x=x0*b/d,再由 x = x0 + (m/d)*t  {t->(0, d-1)}
/***************************************************************************/
//扩展欧几里得求 gcd(a,b)和特解 x0
int ex_gcd(int a, int b, int & x, int & y)
{
if(b==0) {x = 1; y = 0; return a;}
int d = ex_gcd(b, a%b, x, y);
int t = x; x = y; y = t - a/b*y;
return d;
}
//线性同余方程 求出d-1 个可行解
bool liner_mod_equation(int a, int b, int m)
{
int x, y;
int d = ex_gcd(a, m, x, y);
if(b%d!=0) return false;
x = x*(b/d)%m;
for(int i=0; i<d; i++)
printf("%d ", x + m/d*i);
return true;
}
int main()
{
int a, b, m;
while(scanf("%d%d%d", &a, &b, &m)!=EOF)
{
if(a==0) break;
if(liner_mod_equation(a, b, m))
printf("/n");
else
printf("no answer/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: