扩展欧几里得算法及其应用

问题:假设你有一个3升的容器和一个5升的容器(以及充足的水源),如何精确地取出4升水来?(为了下文叙述的方便,我们不妨把3升的容器和5升的容器分别记做容器A和容器B)。这里提供一种解法:

  1. 将A装满(3升),全部倒入B
  2. 再次将A装满(3升),用A中的水将B装满,此时A有1升,B有5升
  3. B中的水全部倒出,将A中的1升水倒入B,此时A没有水,B有一升
  4. 再次将A装满(3升),将A中的水全部倒入B,此时B中恰有4升的水

显然这类问题可以有其他的解决方案。我们可轻易地编出其他类似的问题,比如是否能够用7升的水杯和13升的水杯量出5升的水,再比如能否用9升的水杯和15升的水杯量出10升的水,不胜枚举。三升五升得四升的问题还算直观,稍作思考便可构造解决方案。7升13升得5升,似乎就没那么直观了。而且还有一个问题,首先需要判断是否可行,然后才是给出解决方案。

这样的问题存在一个万能的解法吗?答案是肯定的。注意到,用3升的容器和5升的容器量出4升的水,这一看似复杂的步骤可以简单地概括为:不断地将整杯整杯的A往B里倒,期间只要B被装满就把B倒空。即求解 3xmod5=43x\mod 5=4,使用 扩展欧几里得算法及其应用 一文的算法我们可轻易解得 x=3x=3。首先根据扩展欧几里得算法,问题有解。x=3x=3 时,对应的解决方案见上文。

接着看 7 升 13 升得 5 升,也即 7xmod13=57x\mod 13=5,7,137,13 互质,首先判断有解,即存在这样一个解决方案。这个方案是怎样的呢?

第一步,首先来看贝祖等式时的情况,也即 7xmod13=17x\mod 13=1时,此时解得 x=2x=2,也即 2 个 A 倒入 B,A余一升(得1升)

第二步,7xmod13=57x \mod 13=5,此时 x=(2×5)%13=10x= (2\times 5)\%13=10,也即对第一步的行为执行五次,如下:

  1. 将装满 7 升水的 A 倒入 B ⇒ A(0升),B(7升)
  2. 将装满7升水的 A 倒入 B,直到 B 加满为止 ⇒ A(1升),B(13升)
  3. 将 B 清空,⇒ A (1升),B(0升)
  4. 将 A 中的一升水倒入 B,⇒ A(0升),B(1升)(1,2,3,4 步为一个单元)
  5. 将 A 加满倒入 B,⇒ A(0升),B(8升)
  6. 再次将 A 加满倒入 B,直到 B 满为止,⇒ A(2升),B(13升)
  7. 将 B 清空,⇒ A(2升),B(0升)
  8. 将 A 中的 2 升水倒入 B,⇒ A(0升),B(2升)
    。。。
    直到 A(5升),B(0升)

我们进一步将问题抽象,用容积分别为 aa 和 bb 的水杯量出体积为 cc 的水,实际上相当于求解方程 a⋅xmodb=ca\cdot x\mod b=c。如果 a,ba,b 互质,问题保证有解。如果 c==gcd(a,b)c==gcd(a,b) 或者 c==k⋅gcd(a,b)c==k\cdot gcd(a,b),用扩展欧几里得算法便可求解 xx,然后得最终的量水方案。如果 cc 不能被 gcd(a,b)gcd(a,b) 整除,方程无解,也即问题无解,比如9升15升的容器得10升的水,1010 不能被 gcd(9,15)=3 gcd(9,15)=3 整除。

def ext_euclid(a, b):# 扩展的欧几里得算法# 用以求解# d = gcd(a, b) = a*x+b*yif b == 0:return (a, 1, 0)d, x, y = ext_euclid(b, a%b)return (d, y, x-a//b*y)def mod_linear_equation(a, b, c):d, x, y = ext_euclid(a, b)if c % d:raise 'no solution'return x * c//d % bif __name__ == '__main__':print(mod_linear_equation(3, 5, 4))# 3print(mod_linear_equation(7, 13, 5))# 10

3升5升得4升——倒水问题的万能解法(扩展欧几里得算法)相关推荐

  1. 如何用3升和5升桶量取4升水?

    如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才能准确称出4公升的水? 解法1: 5-1=4 第一步,将5升的桶装满,然后倒到3升的桶,此时剩下2升水: 第 ...

  2. 升余弦滤波器与根升余弦滤波器

    1 升余弦滚降滤波器有啥用? 1, 升余弦滚降滤波器本质上只是一个低通滤波器,只不过它的滚降因子(rolloff effect)会对波形的幅度产生一定影响,一般是降低了波形的幅度并且低通,2. 升余弦 ...

  3. 中职升本计算机专业学校分数,2019年中职升本科分数线220、升专科110,附各校去年投档分数...

    原标题:2019年中职升本科分数线220.升专科110,附各校去年投档分数 了解广东3+证书相关政策.情况.往年分数,请在广东高考在线公众号发送3+证书. 昨日,广东省2019年"3+证书& ...

  4. 【案例集】直播间“长高产品”翻车了,120升油箱加了161升?

    [说案例6]直播间"长高产品"翻车了 商业真的是无孔不入,有人坐在店里,有人上门推销,朋友圈火的时候微商刷屏,现在播商又火起来了,直播间卖东西这是好事啊,你像新东方不就成功转型了嘛 ...

  5. 学计算机拼音摇号,升初专栏丨小升初计算机摇号入学到底是如何进行随机录取的?...

    原标题:升初专栏丨小升初计算机摇号入学到底是如何进行随机录取的? 6月15日起,丰台.朝阳.海淀等区将陆续进行最后的划片或派位入学志愿填报,虽说已进行了一批次派位录取,但仍有很多家长不清楚计算机摇号到 ...

  6. 重庆自考专升本和普通专升本的区别?

    重庆自考专升本属于成人教育,属于非全日制,普通专升本指统招专升本,是全日制专科毕业生参加的升本考试. 一.普通专升本和自考专升本的区别 1.不同的学习方式 自学是以自学为主,辅以社会助学,而且不属于全 ...

  7. 关于使用一个5升容器和一个6升容器量出3升水的一点解决办法

    关于使用一个5升容器和一个6升容器量出3升水的一点解决办法 我想的方法主要有两个: 第一种方法: 1. 将6升的容器装满水,并将5升水倒到5升的容器里面,6升的容器中现在剩水1升. 2.把5升容器中的 ...

  8. 一个水塘,你有一个5升的瓶子,一个6升的瓶子,怎么装出3升的水

    1 先装5升瓶子,倒入6升瓶子,这时6升瓶子里有5升水 2 再装5升瓶子,倒入6升瓶子,这时5升瓶子里还剩4升水 3 6升瓶子里有6升水,倒掉,再倒入第二步里5升瓶子剩下的4升水,这时6升瓶子里有4升 ...

  9. 3升桶和5升桶,倒出4升的水

    代码实现: from collections import dequed1 = deque(maxlen=3) d2 = deque(maxlen=5)for i in range(5): #灌满5升 ...

最新文章

  1. js填充select下拉框并选择默认值
  2. 【转载】Few-shot learning(少样本学习)和 Meta-learning(元学习)概述
  3. 6410 gpio控制及接口
  4. 21行代码AC_【蓝桥杯】承压计算(解题通法+技巧)
  5. java的poi导出Excel文件
  6. 如何做一个懂产品的程序员?
  7. int 为什么是2147483647_现在的C语言编辑器里的int范围为什么是-2147483648~2147483647...
  8. Redis学习总结(15)——Redis 基本数据类型使用场景
  9. Web API 开发入门--基于Visual Studio
  10. SpringBoot学习(二)——Spring的Java配置方式
  11. 凸优化第二章凸集 2.5 分离与支撑超平面
  12. c语言学习宝典怎么样,C语言学习宝典
  13. 【FPGA - 基础知识(零)】FPGA芯片资源介绍
  14. 无限城app为什么服务器繁忙,鬼灭之刃:无惨为什么敢一人前往无限城,其实他最大底牌就是上五...
  15. [46]python画出心形图
  16. 阿里巴巴编程规范(new)
  17. 计算机怎么学要记笔记,留法十全大补汤 | 学姐告诉你在法国上课如何记笔记,复习,考试!...
  18. Python文件类型识别——python-magic
  19. 新学期,新FLAG | 要以码为梦而非夜郎自大
  20. 单片微型计算机原理及应用实验报告,小学期单片机实验报告_相关文章专题_写写帮文库...

热门文章

  1. HDFS数据平衡:节点间平衡与节点内平衡
  2. Spark Streaming的介绍和IDEA操作
  3. scala中的伴生对象,
  4. java foreach参数_java – Mybatis foreach迭代复杂对象参数中的整数列表
  5. u-boot之autoconf.mk解析
  6. C语言 最小二乘 向量旋转 欧拉方法求洛伦兹方程
  7. linux第三课:一些注意点
  8. 【贪心算法】POJ-2376 区间问题
  9. POJ 3616 Milking Time (字符串DP)
  10. .net通用权限框架B/S (五)--WEB(1)首页