您的位置:首页 > 其它

模运算相关数论知识

2013-08-07 15:04 274 查看
模运算

1. 欧几里德算法——求最大公约数

递归:

//initially a>b>=0,return greatest common divisor
int gcd(int a,int b)
{
return b? gcd(b,a%b) : a;
}

非递归:
int gcd(int a,int b)
{
int q;
while(b!=0)
{
q=a%b;
a=b;
b=q;
}
return a;
}


2. 欧几里德扩展算法

定理:对不全为零的两个非负整数 a,b,其最大公约数为 gcd (a,b),则必存在两个整数 x , y ,使得 a*x+b*y=gcd (a,b) 

算法简述:利用欧几里德算法的中间过程,不断将a,b值用b,a%b代替,直到a%b为零,则有x=1,y=0。

证明与实现: 1. 假设a>b,当 b=0 ,则 x=1,y=0.                      

                       2. a*x1 + b*y1 =gcd (a,b)                  

                  同理 b*x2 + (a%b)*y2 =gcd (b,a%b)=gcd (a,b) 成立,且因为 (a%b)=a-b*(a/b)                 

                  所以 x1=y2;                 

                          y1=x2-(a/b)*y2;                 

                 所以x1,y1可以从x2,y2的值推导出来。并且最后a%b必然可以达到零,可以退出递归。

递归:

void Ext_Euclid (int a , int b , int &x, int &y)
{_
if (b == 0) { x = 1; y = 0; return; }
Ext_Euclid(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
}


扩展欧几里德的应用: 1> 求解不定方程。2> 求解同模方程。3> 求乘法逆元

         1> a*x+b*y=m,有解的充要条件为m % gcd(a,b)==0

         2> a*x = b (mod p)   

         3> a模b 的乘法逆元 。x*(1/a) mod b=x*(a') mod b 等同于 a*a'=1(mod b)  当且仅当 gcd(a,b)=1。可转化为,求a*a'+b*b'=1,其中,a'是a模b的乘法逆元,b‘是b模a的乘法逆元。
求乘法的逆元:1>欧几里德 2>快速幂(p为质数) a^(p-2) * a = 1 (mod p)。故a^(p-2)为a的逆。 

欧拉函数
欧拉定理

中国剩余定理

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  GCD 扩展 算法