数论 欧几里得
来源:互联网 发布:淘宝手机详情页宽度 编辑:程序博客网 时间:2024/06/07 23:47
最大公约数算法
欧几里得算法:
算法分析:
欧几里德算法是计算最大公约数的传统算法,也是最简单的算法,效率很高
时间复杂度:O(lgn)(最坏情况:斐波那契数列相邻的两项)
空间复杂度:O(1)
但是,对于大整数来说,取模运算非常耗时
Stein算法
算法分析
渐近时间,空间复杂度均与欧几里德算法相同原理:gcd(ka,kb)=k*gcd(a,b)
最大特点:只有移位和加减法计算,避免了大整数的取模运算
代码:
unsigned MaxDivisor(unsigned a, unsigned b) { unsigned c = 0; while(1) { // 退出条件 if(a==0) return b << c; else if(b == 0) return a << c; // 为提高速度,采用位的与运算,避免用取模判断奇偶 if(!(a & 1) && !(b & 1)) //a,b 都是偶数 { a >>= 1; b >>= 1; ++c; } else if(!(a & 1) && (b & 1)) //a偶 b奇 { a >>= 1; } else if((a & 1) && !(b & 1)) //a奇 b偶 { b >>= 1; } else if((a & 1) && (b & 1)) //a,b都是奇数 { unsigned tmp = a>b?b:a; //取较小的一个 a = a>b?a-b:(b-a); //绝对差值 b = tmp; } } }
扩展欧几里德算法
算法分析:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。
【证明】
设 a>b
1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;2,ab!=0 时
设 :ax1+by1=gcd(a,b);
显然也有:bx2+(a mod b)y2=gcd(b,a mod b);
根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);
则:ax1+by1=bx2+(a mod b)y2;
即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;
根据恒等定理得:x1=y2; y1=x2-(a/b)*y2;
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。
//递归代码int exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return a; } int r=exgcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return r; } //非递归代码int exgcd(int m,int n,int &x,int &y) { int x1,y1,x0,y0; x0=1; y0=0; x1=0; y1=1; x=0; y=1; int r=m%n; int q=(m-r)/n; while(r) { x=x0-q*x1; y=y0-q*y1; x0=x1; y0=y1; x1=x; y1=y; m=n; n=r; r=m%n; q=(m-r)/n; } return n; }
应用
扩展欧几里德算法的应用主要有以下三方面:
(1)求解不定方程;
(2)求解模线性方程(线性同余方程);
(3)求解模的逆元;
1 0
- 数论 欧几里得
- HDU 2104数论 欧几里得
- 数论(欧几里得算法)
- 扩展欧几里得【数论
- 数论系列之欧几里得
- 数论 + 扩展欧几里得
- 【数论】扩展欧几里得
- 【数论】扩展欧几里得算法
- 数论-扩展欧几里得算法
- 数论-扩展欧几里得算法
- 数论--欧几里得和扩展的欧几里得定理
- 数论之欧几里得与拓展欧几里得算法
- 欧几里得算法&&扩展欧几里得算法<数论>
- 数论之欧几里得算法hdu1019
- 【模板】【数论】扩展欧几里得算法
- poj 2142 数论 扩展欧几里得
- 数论学习之扩展欧几里得
- 数论 扩展欧几里得用法详解
- 编程之法--字符串包含
- poj 1948 Triangular Pastures
- 动态规划练习一之采药
- 世界坐标转换为NGUI坐标办法举例
- 克隆二叉树
- 数论 欧几里得
- Netpref Test的使用
- 插入排序&希尔排序—思路及实现
- 使用阻塞队列实现生产者-消费者模式——Java实现
- 一篇SSM框架整合友好的文章(二)
- 输出以下的杨辉三角形
- Tomcat servlet工作原理
- LeetCode073 Set Matrix Zeroes
- manifest文件的常用配置项