yuanyuelang

常用链接

统计

最新评论

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

求解模线性方程  axºb(mod n)

1.必备知识:扩展欧几里得算法的知识,可查看我的数论(3)------扩展欧几里得算法

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}

 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




     

posted on 2009-09-05 19:49 原语饿狼 阅读(1326) 评论(0)  编辑 收藏 引用 所属分类: 数论


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理