数论(4)--------求解模线性方程
求解模线性方程 axºb(mod n)
1.必备知识:扩展欧几里得算法的知识,可查看我的数论(3)-------欧拉phi函数
2.基本思路:
设d=gcd(a,n),用扩展欧几里得算法解线性方程 ax'+ny'=d.
如果d|b,则方程axºb(mod n)有一个解的值x0=x'(b/d)mod n
算法导论里说:(还没理解)
方程axºb(mod n)有解(即存在d|b,其中d=gcd(a,n)),x0是该方程的任意一个解,则该方程对模n恰有d个不同的
解,分别为 x(i)=x(0)+i(n/d)(i=1,2,...d).
特别的设e=x0+n,方程ax=b(mod n)的最小整数解x1=e mod (n/d),最大整数解x2=x1+(d-1)*(n/d)。
所以实际上用欧几里得算法记得x'就可以知道结果了。
3.源代码模板
1//扩展欧几里得算法
2int Extended_Euclid(int a,int b,int& x,int &y)
3{
4 if(b==0){
5 x=1;
6 y=0;
7 return a;
8 }
9 int d=Extended_Euclid(b,a%b,x,y);
10 int temp=x;x=y;y=temp-a/b*y;
11 return d;
12}
2int Extended_Euclid(int a,int b,int& x,int &y)
3{
4 if(b==0){
5 x=1;
6 y=0;
7 return a;
8 }
9 int d=Extended_Euclid(b,a%b,x,y);
10 int temp=x;x=y;y=temp-a/b*y;
11 return d;
12}
1//用扩展欧几里得解模线性方程ax=b (mod n)
2bool modularLinearEquation(int a,int b,int n)
3{
4 int x,y,x0,i;
5 int d=Extended_Euclid(a,n,x,y);
6 if(b%d)
7 return false;
8 x0=x*(b/d)%n;
9 for(i=1;i<=d;i++)
10 printf("%d\n",(x0+i*(n/d))%n);
11 return true;
12}
13
2bool modularLinearEquation(int a,int b,int n)
3{
4 int x,y,x0,i;
5 int d=Extended_Euclid(a,n,x,y);
6 if(b%d)
7 return false;
8 x0=x*(b/d)%n;
9 for(i=1;i<=d;i++)
10 printf("%d\n",(x0+i*(n/d))%n);
11 return true;
12}
13