数论(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
//扩展欧几里得算法
2
int 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
}
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
2
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
3
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
6
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
7
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
8
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
9
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
10
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
11
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
12
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
1
//用扩展欧几里得解模线性方程ax=b (mod n)
2
bool 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![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](//www.cppblog.com/Images/OutliningIndicators/None.gif)
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
2
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
3
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
5
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
6
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
7
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
8
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
9
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
10
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
11
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
12
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
13
![数论(4)--------求解模线性方程 数论(4)--------求解模线性方程](http://www.cppblog.com/Images/OutliningIndicators/None.gif)