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是怎么滚动的?文章的疑惑很有帮助。