模运算相关数论知识
2013-08-07 15:04
274 查看
模运算
1. 欧几里德算法——求最大公约数
递归:
非递归:
2. 欧几里德扩展算法
定理:对不全为零的两个非负整数 a,b,其最大公约数为 gcd (a,b),则必存在两个整数 x , y ,使得 a*x+b*y=gcd (a,b)
所以x1,y1可以从x2,y2的值推导出来。并且最后a%b必然可以达到零,可以退出递归。
扩展欧几里德的应用: 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的逆。
欧拉函数
欧拉定理
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的逆。
欧拉函数
欧拉定理
中国剩余定理
相关文章推荐
- 数论相关知识及其算法(上)
- 位运算相关知识
- 位运算相关知识
- HDU4925 Apple Tree(位运算相关知识)
- 位运算相关的基础知识
- 运算放大器相关参数基本知识(一)
- 位运算相关知识
- iOS程序猿必知的位运算相关知识
- 快速幂运算(数论知识)
- 位运算相关知识讲解
- 数论相关知识
- C++中指针的数据类型和运算相关知识小结
- Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识
- Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识
- hduoj1021,Fibonacci Again,数论水题,利用同余式相关知识很容易解决
- 大数运算相关知识简介
- 数论 算法 不定方程 欧几里得 同余定理 相关知识
- i2c相关知识
- JAVA相关基础知识(1)
- OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理