欧几里得算法

BC300

欧几里得算法欧几里得

公元前300年,欧几里得是缪斯院的抄写员。他写的《几何原本》,现在还在做教课书。在他跟毕达哥拉斯之间年代里还有柏拉图、苏格拉底。他们还是哲学家,我们的老子比他们早百把年。逻辑的空无无生万物是很有用的哲学思想。

divmod

直接在IDLE shell里输入divmod就可以求商余数。

divmod(4,7)
(0, 4)
divmod(14,7)
(2, 0)
divmod(3214,327)
(9, 271)

之前的人是怎么做的。

Egyptian division

古希腊人也把这个算法叫做埃及除法,因为它是泛型编程之乘法里面埃及乘法的逆运算。

代码

用Python模拟STL的代码。这个也是求最大公约数的方法。

def largest_doubling(a,b):
    #precondition: b !=0
    while a-b >= b:
        b += b
    return b
#std::pair<integer,line_segment>
def quotient_remainder(a,b):
    #precondition:b >0
    if a < b:return 0,a
    c = largest_doubling(a,b)
    n = 1
    a -= c
    while c != b:
        c = half(c)
        n += n
        if c <= a:
            a -= c
            n += 1
    return n,a

half调用之前的就可以了。

验证

quotient_remainder(4,7)
(0, 4)
quotient_remainder(14,7)
(2, 0)
quotient_remainder(3214,327)
(9, 271)

也许Python里面也是这么写的。

奇怪的0

根号的发现导致了毕氏的灭亡。是他们推动了欧几里得的最大公度量算法。欧几里得这样的除法会有商或余数是0的情况。书上说古人接受这个0用了将近一千年。到比萨的列奥那多(1170-约1240)才开始用0。有人也叫他斐波那契。递归的改造——间隔挑硬币也讲到了他的兔子数列。

应用

回溯——3、5升杯倒4升水讲到了在水足够多的时候可以用求最大公约数的方法倒出肆升水。今天是又加深了对欧几里得的认识。这里开始接触求模运算了,它对解开匹配——rabin_karp是怎么滚动的?文章的疑惑很有帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值