使用辗转相除法求两个数的最大公因数(python实现)
数学背景:
整除的定义:
任给两个整数a,b,其中b≠0,如果存在一个整数q使得等式
a = bq
成立,我们就说是b整除a,记做b|a.
性质1:如果c|a,c|b,且对于任意的整数m,n,则有c|ma + nb
证明: 利用上述定义进行证明
因为c|a ,c|b,所以有a = c*q1,b = c*q2,
对于任意m,n有,ma+nb = m(c*q1) + n(c*q2) = c(m*q1 + n*q2),
因为m*q1 +n*q2为整数,很显然有 c|ma + nb .
带余除法: 设a,b 是两个整数,其中b > 0 ,则存在两个唯一的整数q和r,使得
a = b*q + r, 0≤ r < b
成立.
公因数和最大公因数的定义:
设a1,a2,a3,......,an是n个不全为0的整数,若整数d是它们之中每一个数的因数,那么d就叫做a1,a2,a3,......,an的一个公因数.这时它们的公因数只有有限个,整数a1,a2,a3,......,an的公因数中最大的一个叫做最大公因数,记做(a1,a2,a3,......,an),若(a1,a2,a3,......,an)=1,我们说a1,a2,a3,......,an互素.
定理1:设a,b,c是任意三个不全为零的整数,且 a = bq + c,其中q是整数,则(a,b) = (b,c).也就是说,a和b的最大公因数等于b和c的最大公因数.
证明: 因为(a,b)是a和b的最大公因数,所以(a,b)|a,且(a,b)|b,由于c = a - bq,所以由性质1可以知道(a,b)|c,所以可以看到,(a,b)是b,c的一个公因数,而由公因数的定义可以知道 (b,c)是b,c的最大公因数,任何公因数都是小于最大公因数的,所以(a,b) ≤ (b,c).
同样的道理可以证明 (b,c) ≤(a,b).
因此有(a,b) = (b,c)
辗转相除法:给任意整数 a > 0,b >0, 由带余除法,有以下等式
a = b*q1 + r1, 0 < r1 < b,
b = r1*q2 + r2, 0 < r2 < r1,
r1 = r2*q3 + r3, 0 < r3 < r2,
......
rn-2 = rn-1*qn + rn , 0< rn <rn-1
rn-1 = rn *qn+1 + rn+1 ,rn+1 = 0
因为 b> r1 > r2 > r3 >....,故经过有限次带余除法以后,总可以得到一个余数为0,上面rn+1 = 0
由上面的定理1可以知道,(a,b) = (b,r1) = (r2,r1) = ....= (rn-2,rn-1) = (rn-1,rn) = (rn,0) = rn
所以要想求a,b得最大公因数,就需要不断的使用带余除法,直到余数为0,就可以得到a,b的最大公因数.
举例:
使用辗转相除法求 288 和 158 的最大公因数
288 = 158 * 1 + 130
158 = 130 * 1 + 28
130 = 28 * 4 + 18
28 =18 * 1 + 10
18 = 10 * 1 + 8
10 = 8 * 1 + 2
8 = 2 * 4
所以(288,158) = (158,130) = (130,28) = (28,18)=(18,10)=(10,8)=(8,2)=(2,0)=2
python 实现:
递归
def gcd(a,b):
if b == 0 : return a
return gcd(b,a % b)
迭代
def gcd(a,b):
while b != 0:
a,b = b,a%b
return a
使用辗转相除法求两个数的最大公因数(python实现)的更多相关文章
- C实现辗转相除法求两个数的最大公约数
什么是辗转相除法? 辗转相除法(又名欧几里德算法),它主要用于求两个正整数的最大公约数.是已知的最古老的算法. 用辗转相除法求132和72的最大公约数的步骤: 132 / 72 = 1 ... 60 ...
- C++中用辗转相除法求两个数的最大公约数和最小公倍数
两个数的最大公约数:不能大于两个数中的最小值,算法口诀:小的给大的,余数给小的,整除返回小的,即最大公约数,(res=max%min)==0? max=min,min=res return min; ...
- python 函数求两个数的最大公约数和最小公倍数
1. 求最小公倍数的算法: 最小公倍数 = 两个整数的乘积 / 最大公约数 所以我们首先要求出两个整数的最大公约数, 求两个数的最大公约数思路如下: 2. 求最大公约数算法: 1. 整数A对整数 ...
- C语言辗转相除法求2个数的最小公约数
辗转相除法最大的用途就是用来求两个数的最大公约数. 用(a,b)来表示a和b的最大公约数. 有定理: 已知a,b,c为正整数,若a除以b余c,则(a,b)=(b,c). (证明过程请参考其它资料) 例 ...
- 求两个数的最大公约数&求N个数的最大公约数
一.求两个数的最大公约数 如何编程计算N个数的最大公约数(Greatest common divisor)呢?第一想法那便是两两计算,但是往往最简单的想法是不怎么靠谱的.下面用递归来解决.递归有一大好 ...
- 求两个数的最大公约数(Euclid算法)
求两个数 p 和 q 的最大公约数(greatest common divisor,gcd),利用性质 如果 p > q, p 和 q 的最大公约数 = q 和 (p % q)的最大公约数. 证 ...
- 求两个数中的较大值max(a,b)。(不用if,>)
题目:求两个数的较大值,不能使用if.>. 1.不使用if.>,还要比较大小,貌似就只能使用条件表达式: x=<表达式1>?<表达式2>:<表达式3>; ...
- 求两个数a、b的最大公约数
//求两个数a.b的最大公约数 function gcd(a,b){ return b===0?a:gcd(b,a%b) }
- c语言实践:求两个数的最大公约数
我的思路是这样的:比如12和16这两个数.先理解一下概念,什么叫最大公约数.就是12有很多个因数,16也有很多个因数,这两堆因数中有一些重合的因数,在这些重合的因数中找到那个最大的.那么最大公约数一定 ...
随机推荐
- 购物车中的input输入框只能输入数字和输入为0的时候默认为1
<input type="text" value="1" onkeyup="value=(parseInt((value=value.repla ...
- 33、求按从小到大的顺序的第N个丑数
一.题目 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 二.解法 ...
- 工具===激活xmind 8
[下载jar包]: https://stormxing.oss-cn-beijing.aliyuncs.com/files/XMindCrack.jar 方法: 打开xmind 8 安装目录的 ...
- Ubuntu16.04安装记
Ubuntu16.04安装记 基本信息: 华硕笔记本 Windows 10 家庭版 处理器:Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2.71GHz 已安装的内 ...
- Codeforces Round #456 (Div. 2)
Codeforces Round #456 (Div. 2) A. Tricky Alchemy 题目描述:要制作三种球:黄.绿.蓝,一个黄球需要两个黄色水晶,一个绿球需要一个黄色水晶和一个蓝色水晶, ...
- Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,输出异常
Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,出现请求异常时,会进入熔断处理,但是不会抛出异常信息. 经过以下配置,可以抛出异常: 将原有ErrorEncoder ...
- Logistic回归与梯度上升算法
原创作品出处 原始出处 .作者信息和本声明.否则将追究法律责任.http://sbp810050504.blog.51cto.com/2799422/1608064 Logistic回归与梯度上升算法 ...
- 20165301实验二java面向对象程序设计
20165301实验二java面向对象程序设计 实验目的与要求(提交点一): 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST完成单 ...
- 20165301 2017-2018-2 《Java程序设计》第五周学习总结
20165301 2017-2018-2 <Java程序设计>第五周学习总结 教材学习内容总结 第七章:内部类与异常类 内部类 在一个类中定义另一个类 非内部类不可以是static类 匿名 ...
- csu 1114平方根大搜索(JAVA大小数+二分)
1114: 平方根大搜索 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 182 Solved: 96[Submit][Status][Web Boar ...