X-man

导航

数论(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数论(4)--------求解模线性方程//扩展欧几里得算法
 2数论(4)--------求解模线性方程int Extended_Euclid(int a,int b,int& x,int &y)
 3数论(4)--------求解模线性方程{
 4数论(4)--------求解模线性方程   if(b==0){
 5数论(4)--------求解模线性方程        x=1;
 6数论(4)--------求解模线性方程        y=0;
 7数论(4)--------求解模线性方程        return a;
 8数论(4)--------求解模线性方程    }

 9数论(4)--------求解模线性方程    int d=Extended_Euclid(b,a%b,x,y);
10数论(4)--------求解模线性方程    int temp=x;x=y;y=temp-a/b*y;
11数论(4)--------求解模线性方程    return d;
12数论(4)--------求解模线性方程}

 

 1数论(4)--------求解模线性方程//用扩展欧几里得解模线性方程ax=b (mod n)
 2数论(4)--------求解模线性方程bool modularLinearEquation(int a,int b,int n)
 3数论(4)--------求解模线性方程{
 4数论(4)--------求解模线性方程    int x,y,x0,i;
 5数论(4)--------求解模线性方程    int d=Extended_Euclid(a,n,x,y);
 6数论(4)--------求解模线性方程    if(b%d) 
 7数论(4)--------求解模线性方程           return false;
 8数论(4)--------求解模线性方程        x0=x*(b/d)%n;
 9数论(4)--------求解模线性方程    for(i=1;i<=d;i++)
10数论(4)--------求解模线性方程       printf("%d\n",(x0+i*(n/d))%n);
11数论(4)--------求解模线性方程    return true;
12数论(4)--------求解模线性方程}

13数论(4)--------求解模线性方程

posted on 2013-05-30 22:33  雨钝风轻  阅读(174)  评论(0编辑  收藏  举报