现有2个空水壶,容积分别为5升和6升,问题是如何只用这2个水壶从池塘里取得3升的水?水壶问题(裴蜀等式)

水壶问题(裴蜀等式)

水壶问题 有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。

先来简单的

假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。

答案:由满6向空5倒,剩1升,把这1升倒5里,然后6剩满,倒5里面,由于5里面有1升水,因此6只能向5倒4升水,然后将6剩余的2升,倒入空的5里面,再灌满6向5里倒3升,剩余3升。
 

裴蜀等式

定理:对于不全为0的整数a,b和d,方程sa+tb=d存在整数解s和t当且仅当gcd(a,b)|d。方程sa+rt=d称作裴蜀(Bezout)等式或贝祖等式。

证明:

(充分性)通过回代法,可知sa+tb=gcd(a,b)存在整数解s’和t’,若d=k·gcd(a,b),则ks’,kt’是方程的一组解。

(必要性)若方程存在整数解s,t,则gcd(a,b)|sa+tb=d

欧几里得算法与裴蜀等式 

欧几里得算法

欧几里得算法是欧几里得(Euclid)在《几何原本》中提出的计算最大公因子的算法,被认为是最早的算法,也是人类历史上最优美的算法。

在表述算法之前,先给出算法的理论基础:

定理:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r)

证明:

若d|a且d|b,则有d|a且d|r=a-qb

若d|b且d|r,则有d|b且d|qb+r=a

这表明a与b的公因子集合与b与c的公因子集合相同,最大公因数肯定相同。

算法实现:

 int gcd(int a, int b)
 {
     return b == 0 ? a : gcd(b, a % b);
}

这个算法也被叫做“辗转相除法”,为什么呢?

你看啊,这个过程先右除以左,然后左除以右,再右除以左,左除以右......,就像一个人辗转反侧,所以辗转相除法就是从算法表现得到的。我们进一步分析,会发现另一个现象。

观察输出的5是怎么得到的?

  • 5=85-2*40
  • 5=85-2*(210-2*85)=5*85-2*210
  • 5=5*(715-3*210)-2*210=5*715-17*210

可以发现,最大公因子5可以由a,b线性表示。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云草桑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值