埃及分数
在看科普视频的时候学到了埃及分数和贪婪算法,这里用code实现一下。
埃及分数
古埃人使用的是象形文字,他们用这样的符号表示分数


他们在圈圈下面画几个竖线代表几分之一,还有几个规定好的分数有特殊的符号,分数有无数多个,不可能给所有分数都画上符号,所以古埃及人把任意分数都表示为不同的单位分数的和,就是分子为1,分母为各不相同的正整数。任何正有理数都能表达成这一个形式。
例如:
1还可以表示为:
接下使用贪婪算法来生成任意一个正有理数的埃及分数形式。
贪婪算法
贪婪算法:将一项分数分解成若干项单分子分数后的项数最少,称为第一种好算法;最大的分母数值最小,称为第二种好算法。 例如:
又例如,
找出仅小于
把
例子:把
所以结果是:
代码实现
# 寻找最大公约数
def _gcd(a, b):
# Supports non-integers for backward compatibility.
while b:
a, b = b, a%b
return a
# 约分
def ReduceFraction(numerator, denominator):
if type(numerator) is int is type(denominator):
g = _gcd(numerator, denominator)
if denominator < 0:
g = -g
else:
g = _gcd(numerator, denominator)
numerator //= g
denominator //= g
return (numerator, denominator)
# 分数减法
def SubFraction(a, b):
an, ad = a
bn, bd = b
numerator = an*bd - ad*bn
denominator = ad * bd
return ReduceFraction(numerator, denominator)
# 埃及分数生成器返回分母的list
def EgpytFraction(numerator=0, denominator=None, ret=[]):
a = (denominator // numerator) + 1
ret.append(a)
t = SubFraction((numerator, denominator), (1, a))
if t[0] == 1:
ret.append(t[1])
return ret
return EgpytFraction(t[0], t[1], ret=ret)
EgpytFraction(5, 121, ret)
[25, 757, 763309, 873960180913, 1527612795642093418846225]
总结
埃及分数的表示不是唯一的,但应该有一个项数最少的表达式,我们把这个叫做最优的,但目前还没有一个算法可以求出最优的埃及分数。