欧几里得算法与扩展欧几里得算法_C++
先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html
注:以下讨论的数均为整数
一、欧几里得算法(重点是证明,对后续知识有用)
欧几里得算法,也叫辗转相除,简称 gcd,用于计算两个整数的最大公约数
定义 gcd(a,b) 为整数 a 与 b 的最大公约数
引理:gcd(a,b)=gcd(b,a%b)
证明:
设 r=a%b , c=gcd(a,b)
则 a=xc , b=yc , 其中x , y互质
r=a%b=a-pb=xc-pyc=(x-py)c
而b=yc
可知:y 与 x-py 互质
证明:
假设 y 与 x-py 不互质
设 y=nk , x-py=mk , 且 k>1 (因为互质)
将 y 带入可得
x-pnk=mk
x=(pn+m)k
则 a=xc=(pn+m)kc , b=yc=nkc
那么此时 a 与 b 的最大公约数为 kc 不为 k
与原命题矛盾,则 y 与 x-py 互质
因为 y 与 x-py 互质,所以 r 与 b 的最大公约数为 c
即 gcd(b,r)=c=gcd(a,b)
得证
当a%b=0时,gcd(a,b)=b
这样我们可以写成递归形式
inline int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
模板题:http://codevs.cn/problem/1212/
二、扩展欧几里得算法
扩展欧几里得算法,简称 exgcd,一般用来求解不定方程,求解线性同余方程,求解模的逆元等
引理:存在 x , y 使得 gcd(a,b)=ax+by
证明:
当 b=0 时,gcd(a,b)=a,此时 x=1 , y=0
当 b!=0 时,
设 ax1+by1=gcd(a,b)=gcd(b,a%b)=bx2+(a%b)y2
又因 a%b=a-a/b*b
则 ax1+by1=bx2+(a-a/b*b)y2
ax1+by1=bx2+ay2-a/b*by2
ax1+by1=ay2+bx2-b*a/b*y2
ax1+by1=ay2+b(x2-a/b*y2)
解得 x1=y2 , y1=x2-a/b*y2
因为当 b=0 时存在 x , y 为最后一组解
而每一组的解可根据后一组得到
所以第一组的解 x , y 必然存在
得证
根据上面的证明,在实现的时候采用递归做法
先递归进入下一层,等到到达最后一层即 b=0 时就返回x=1 , y=0
再根据 x=y’ , y=x’-a/b/y’ ( x’ 与 y’ 为下一层的 x 与 y ) 得到当层的解
不断算出当层的解并返回,最终返回至第一层,得到原解
inline void exgcd(int a,int b)
{
if (b)
{
exgcd(b,a%b);
int k=x;
x=y;
y=k-a/b*y;
}
else y=(x=)-;
}
三、exgcd 解不定方程(使用不将a与b转为互质的方法)
对于 ax+by=c 的不定方程,设 r=gcd(a,b)
当 c%r!=0 时无整数解
当 c%r=0 时,将方程右边 *r/c 后转换为 ax+by=r 的形式
可以根据扩展欧几里得算法求得一组整数解 x0 , y0
而这只是转换后的方程的解,原方程的一组解应再 *c/r 转变回去
(如 2x+4y=4 转换为 2x+4y=2 后应再将解得的 x , y 乘上2)
则原方程解为 x1=x0*c/r , y1=x0*c/r
通解 x=x1+b/r*t , y=y1-a/r*t ,其中 t 为整数
证明:
将 x , y 带入方程得
ax+ab/r*t+by-ab/r*t=c
ax+by=c
此等式恒成立
得证
这里 b/r 与 a/r 为最小的系数,所以求得的解是最多最全面的
证明:
为了推出证明中的 ax+by=c ,且想达到更小的系数,只能将 b/r 与 a/r 同除以一个数 s
而 b/r 与 a/r 互质,且 s 为整数,则 s=1 ,不影响通解
那么 b/r 与 a/r 就为最小的系数
得证
模板题:http://www.cnblogs.com/hadilo/p/5917173.html
四、exgcd 解线性同余方程
关于 x 的模方程 ax%b=c 的解
方程转换为 ax+by=c 其中 y 一般为非正整数
则问题变为用 exgcd 解不定方程
解得 x1=x0*c/r
通解为 x=x1+b/r*t
设 s=b/r (已证明 b/r 为通解的最小间隔)
则 x 的最小正整数解为 (x1%s+s)%s
证明:
若 x1>0,则 (x1%s+s)%s=x1%s%s+s%s=x1%s=x1-ts (t∈N)
若 x1<0,因在 C++ 里 a%b=-(-a%b)<0 (a<0 , b>0) 如 -10%4=-2
则 (x1%s+s)%s=(-(-x1%s)+s)%s=(-(ts-x1)+s)%s=ts-x1 (t∈N)
即为 x1 通过加或减上若干个 s 后得到的最小正整数解
得证
亦可伪证 x1<0 的情况:设 x1=-5 , s=2
则 (x1%s+s)%s=(-5%2+2)%2=(-1+2)%2=3%2=1
即为 x1 加上 3 个 s 后的到的最小正整数解
模板题:http://www.cnblogs.com/hadilo/p/5951091.html
版权所有,转载请联系作者,违者必究
联系方式:http://www.cnblogs.com/hadilo/p/5932395.html
欧几里得算法与扩展欧几里得算法_C++的更多相关文章
- 详解扩展欧几里得算法(扩展GCD)
浅谈扩展欧几里得(扩展GCD)算法 本篇随笔讲解信息学奥林匹克竞赛中数论部分的扩展欧几里得算法.为了更好的阅读本篇随笔,读者最好拥有不低于初中二年级(这是经过慎重考虑所评定的等级)的数学素养.并且已经 ...
- 初等数论-Base-2(扩展欧几里得算法,同余,线性同余方程,(附:裴蜀定理的证明))
我们接着上面的欧几里得算法说 扩展欧几里得算法 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式\(^①\): ax+by = gcd(a, b) =d(解一定存在,根据数论中的 ...
- 扩展欧几里得算法(extgcd)
相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...
- noip知识点总结之--欧几里得算法和扩展欧几里得算法
一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a ...
- vijos1009:扩展欧几里得算法
1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...
- ****ural 1141. RSA Attack(RSA加密,扩展欧几里得算法)
1141. RSA Attack Time limit: 1.0 secondMemory limit: 64 MB The RSA problem is the following: given a ...
- 浅谈扩展欧几里得算法(exgcd)
在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...
- (light oj 1306) Solutions to an Equation 扩展欧几里得算法
题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...
- 『扩展欧几里得算法 Extended Euclid』
Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...
随机推荐
- poj1160 post office
题目大意:有n个乡村,现在要建立m个邮局,邮局只能建在乡村里.现在要使每个乡村到离它最近的邮局距离的总和尽量小,求这个最小距离和. n<300,p<30,乡村的位置不超过10000. 分析 ...
- 【sql】之使用sql根据身份证查询过生日人数
根据当前日期查询有多少人过生日 ,) = DATE_FORMAT(NOW(),'%m'); 查询price一样的人数 select * from people where price in (sele ...
- ifconfig报错:SIOCSIFFLAGS: Operation not permitted
# insmod mt7601Usta.ko rtusb init rt2870 --->usbcore: registered new interface driver rt2870 # iw ...
- 怎样进行Android UI元素设计
Android UI元素里面包含了许多的内容,比如:该平台由操作系统.中间件.用户界面和应用软件组成,一个应用程序要想受用户喜爱,那么UI可不能差. Android为相似的编程名词引入了一些新的术语, ...
- item31,连续子数组的最大和
整型数组,元素有正数和负数.数组中一个或连续的多个整数组成一个子数组,求所有子数组中最大值. =========== 动态规划, 状态转移方程,max[].size = nums.size() max ...
- java运用Comparator为对象排序
要排序的类需要实现Comparator接口,重写compare方法: user类及实现接口的内部类: package test; import java.util.Comparator; public ...
- 限制页面内部链接访问源-HTML注释
不知道大家有没有碰到过这样一个问题:我修改的是别人的网页,他的超连接是指向一个服务器的某个HTML文件,我把超连接地址修改成了我本地机器的跟首页 同一目录下的一个HTML文件,却发现超连接根本 ...
- 静态HTML页面不缓存js文件的方法
今天做项目时候遇到一个问题,由于采用了生成静态的CMS系统,但是页面头部需要显示用户登录的信息,也就是,没有登录时,显示登录框,用户登录后,则显 示登录信息.于是用到了js调用php文件的方法.但是由 ...
- 黄聪:wordpress如何使用wp_rewrite实现自定义伪静态,非301重定向。
今天,想通过wordpress实现 http://hcsem.com/a?h-1 伪静态为 http://hcsem.com/a-1.html 找了很多资料,终于搞定. 只需要在functions.p ...
- Navicat(连接) -1之SSL 设置
SSL 设置 Secure Sockets Layer(SSL) 是一个通过网际网路传输私人文件的协定.为了安全连接,首先你需要做的是安装 OpenSSL 库和下载数据库源. 注意: 只限于 MySQ ...