[Python3 练习] 008 欧几里德算法
题目:写个“欧几里德算法”的小程序
(1) 描述
- 我知识浅薄,一开始被“欧几里德”的大名唬住了,去搜了一下才知道这就是高中时学过的“辗转相除法”
- 辗转相除法的用处
- 求两个正整数的最大公约数
- 示例
- a = 30,b = 18,求 a 与 b 的最大公约数
- a % b = 12 => a = 18, b = 12
- a % b = 6 => a = 12, b = 6
- a % b = 0 => 此时的 b 即为原来两数的最大公约数
- a = 30,b = 18,求 a 与 b 的最大公约数
- 总结
- 大的数 num1 对小的数 num2 取余
- 把 num2 的值赋给 num1,把余数赋给 num2,再进行上一步操作,直到余数为 0
- 余数为 0 的那个式子中的 num2 即为最大公约数
(2) 证明
- 方法来自互联网
1) 证明方法1
设 num1,num2,m,r,d 均为自然数
不妨设 num1 > num2,d 为两个数的任意一个公约数;m 表示倍数,r 表示余数
num1 = m * num2 + r
=> r = num1 - m * num2
等式两边同除以 d,得 r/d = (num1 - m * num2)/d = num1/d - m * num2/d
因为 d 为 num1,num2 的公约数,且 m 为自然数
所以 r/d 也是自然数
=> d 必是 r 的约数
=> 求 num1 与 num2 的最大公约数,可以转为求 num2 与 r 的最大公约数
2) 证明方法2
令 d 为 num1,num2 的最大公约数
取 num1 的某一个约数 m1,num2 的某一个约数 m2,使得 num1 = m1 * d,num2 = m2 * d —— (1)
不妨设 r = num1 % num2 = num1 - m * num2 —— (2)
将 (1) 代入 (2),得 r = m1 * d - m * (m2 * d) = (m1 - m * m2) * d
=> d 也是余数 r 的约数
若 (m1 - m * m2) 与 m2 不互质
不妨设 (m1 - m * m2) = k1 * d',m2 = k2 * d',(d'>1)
m1 = m * m2 + k1 * d' = m * (k2 * d') + k1 * d' = (m * k2 + k1) * d'
=> num1 = m1 * d = [(m * k2 + k1) * d'] * d = (m * k2 + k1) * (d' * d)
num2 = m2 * d = (k2 * d') * d = k2 * (d' * d)
=> num1 与 num2 有公约数 (d' * d)
因为 d' > 1,d >= 1
所以 (d' * d) > d
=> 与题设矛盾
=> (m1 - m * m2) 与 m2 互质
=> d 也是 num2 与 r 的最大公约数
(3) 要求
- 写出“欧几里德算法”的程序,起名为 gcd()
- gcd 为 Greatest Common Divisor(最大公约数) 的缩写
(3) 程序
1) 代码
# 解法1
def gcd(num1, num2): # 不需要规定 x > y,就算 x < y,取一次余就换回来了
while num2 != 0:
t = num1 % num2
num1 = num2
num2 = t
return num1
# 解法2 更贴近算法的描述
def gcd(num1, num2):
while num1:
num1, num2 = num2 % num1, num1
return num2
2) 运行情况
>>> print(gcd(16, 36))
4
[Python3 练习] 008 欧几里德算法的更多相关文章
- (扩展欧几里德算法)zzuoj 10402: C.机器人
10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...
- 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...
- POJ 1061青蛙的约会(拓展欧几里德算法)
题目链接: 传送门 青蛙的约会 Time Limit: 1000MS Memory Limit: 65536K Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见 ...
- poj2142-The Balance(扩展欧几里德算法)
一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...
- poj2115-C Looooops(扩展欧几里德算法)
本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...
- poj1061-青蛙的约会(扩展欧几里德算法)
一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...
- Sicily1099-Packing Passengers-拓展欧几里德算法
最终代码地址:https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1099.c 做这题的时候查了别人的做法花了半天都没 ...
- HDU 1576 A/B 扩展欧几里德算法
A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 欧几里德算法gcd及其拓展终极解释
这个困扰了自己好久,终于找到了解释,还有自己改动了一点点,耐心看完一定能加深理解 扩展欧几里德算法-求解不定方程,线性同余方程. 设过s步后两青蛙相遇,则必满足以下等式: (x+m*s)-(y+n ...
随机推荐
- libboost_regex 备份用时
libboost_regex-vc100-mt-s-1_57.lib //生成数据
- angular,,以及深度拷贝问题;JSON.parse,JSON.stringify灵活运用
问题: $scope.list = [];$scope.listTree = {};$scope.dataTree = []; //获取listTree的数据$scope.getList = func ...
- Flask【第2篇】:Flask基础
Flask基础 知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref,werkzeug,uwsgi 2.实例化Flask对象,里面是有参数的 app = Flask(__name ...
- ZROI 19.07.28 组合计数/lb
T1 题意:\(n\)个变量,\(0 \leq x_i \leq c_i\),求\(\sum x_i = A\)方案数.\(n \leq 32\). Sol: \(n \leq 10\)的时候容斥很水 ...
- Java验证码程序
1.设计思想利用random的随机生成数字,利用for循环控制随机数字的个数来控制验证码的输出.利用JFrame实现布局的管理,对登录框内容的位置进行管理. 2.流程图 3.源代码 denglu类 i ...
- ESP8266的使用学习
ESP8266-01 ESP8266-12F简介 让灯闪烁 ESP8266-中断 模拟输入(ADC-A0) 模拟输出(PWM) 串口通信(Serial) EEPROM类库的使用 ...
- Python私有变量(Private Variable)
Variables can be private which can be useful on many occasions. A private variable can only be chang ...
- 包、time、datetime、hashlib和hmac、request、re
目录 包 包的特点 time模块 datetime模块 hashlib模块和hmac模块 hmac密钥(加盐) typing模块 request模块 正则模块 以下必须得记住 哪些做了解 包 包,这里 ...
- hdu 6206 : Apple 【计算几何 + 分数类】
题目链接 比赛时C++上__float128都被卡精度,然后扔给队友用Java的BigDecimal过了 算法不多说,求三角形外心可以参考 维基百科 https://zh.wikipedia.org/ ...
- c++ printf和cout的性能
今天做了一道编程题,仔细检查了算法并没有错误,但是结果显示时间超时,但仍有80%的案例通过了,很奇怪. 通过将cin换成scanf,cout换成printf结果AC,实验发现二者性能差了很多,在输出1 ...