题目:写个“欧几里德算法”的小程序

(1) 描述

  • 我知识浅薄,一开始被“欧几里德”的大名唬住了,去搜了一下才知道这就是高中时学过的“辗转相除法”
  • 辗转相除法的用处
    • 求两个正整数的最大公约数
  • 示例
    • a = 30,b = 18,求 a 与 b 的最大公约数

      1. a % b = 12 => a = 18, b = 12
      2. a % b = 6 => a = 12, b = 6
      3. a % b = 0 => 此时的 b 即为原来两数的最大公约数
  • 总结
    1. 大的数 num1 对小的数 num2 取余
    2. 把 num2 的值赋给 num1,把余数赋给 num2,再进行上一步操作,直到余数为 0
    3. 余数为 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 欧几里德算法的更多相关文章

  1. (扩展欧几里德算法)zzuoj 10402: C.机器人

    10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...

  2. 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  3. POJ 1061青蛙的约会(拓展欧几里德算法)

    题目链接: 传送门 青蛙的约会 Time Limit: 1000MS     Memory Limit: 65536K Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见 ...

  4. poj2142-The Balance(扩展欧几里德算法)

    一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...

  5. poj2115-C Looooops(扩展欧几里德算法)

    本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...

  6. poj1061-青蛙的约会(扩展欧几里德算法)

    一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...

  7. Sicily1099-Packing Passengers-拓展欧几里德算法

    最终代码地址:https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1099.c 做这题的时候查了别人的做法花了半天都没 ...

  8. HDU 1576 A/B 扩展欧几里德算法

    A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  9. 欧几里德算法gcd及其拓展终极解释

    这个困扰了自己好久,终于找到了解释,还有自己改动了一点点,耐心看完一定能加深理解   扩展欧几里德算法-求解不定方程,线性同余方程. 设过s步后两青蛙相遇,则必满足以下等式: (x+m*s)-(y+n ...

随机推荐

  1. hdu 1506 单调栈

    #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #defin ...

  2. deviceiocontrol与ioctl

    驱动配置设置,配置 ioctl --linux 平台 https://blog.csdn.net/coolwriter/article/details/78242256

  3. CSS居中完全指南——构建CSS居中决策树

    CSS居中完全指南--构建CSS居中决策树 本文总结CSS居中,包括水平居中和垂直居中.本文相当于CSS决策树,下次再遇到CSS居中问题时有章可循. 参考Centering in CSS: A Com ...

  4. DevExpress ASP.NET Core Controls 2019发展蓝图(No.5)

    本文主要为大家介绍DevExpress ASP.NET Core Controls 2019年的官方发展蓝图,更多精彩内容欢迎持续收藏关注哦~ [DevExpress ASP.NET Controls ...

  5. python中strftime和strptime函数

    strftime和strptime函数均来自包datetime from datetime import * strftime: 将datetime包中的datetime类,按照入参格式生成字符串变量 ...

  6. 02-webpack的作用

    webpack的作用,将不同静态资源的类型打包成一个JS文件,在html页面应用该JS文件的时候,JS文件里的html就可以正常的运行,去执行操作. 也可以加载前端页面的CSS样式.Img图片

  7. delphi 10.3 IOS中英文错位

    delphi 每回升级都会遇到各种问题, 在安卓和windows下正常,ios遇到排版问题. 解决办法:将附件文件放至程序目录下. 百度网盘下载附件 链接: https://pan.baidu.com ...

  8. tapmode="hover"属性

    .hover{ opacity: .; } <span tapmode="hover" onclick="fnOpen()">open</sp ...

  9. 【bzoj2073】【[POI2004]PRZ】位运算枚举子集的特技

    (上不了p站我要死了) Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一 ...

  10. Ubuntu 16.04下使用docker部署MySQL主从复制

    (以下docker相关的命令,需要在root用户环境下或通过sudo提升权限来进行操作.) 首先更新 软件源 https://mirrors.tuna.tsinghua.edu.cn/help/ubu ...