我正在尝试continued fraction derivation无理数,例如sqrt(13),Python。我已经获得了一个非常好的解决方案,对于前10次左右的迭代是准确的:
除了后来的迭代之外,这种方法非常有效,float
精度会产生错误的系数。关闭单个系数后,其余系数也将自动生效。
因此,我的问题是,是否有办法处理无理数,例如sqrt(13),像占位符(以后替换)或更精确的方式?
我目前的代码如下:
import math
def continued_fraction(x, upper_limit=30):
a = []
# should in fact iterate until repetitive cycle is found
for i in range(upper_limit):
a.append(int(x))
x = 1.0/(x - a[-1])
return a
if __name__ == '__main__':
print continued_fraction(math.sqrt(13))
结果输出:
[3, 1, 1, 1, 1, 6,
1, 1, 1, 1, 6,
1, 1, 1, 1, 6,
1, 1, 1, 1, 6,
1, 1, 1, 1, 7, 2, 1, 4, 2]
我知道一个事实,结果输出应该是3,然后按照Project Euler Problem 64(我{&#39}}无限重复循环(1,1,1,1,6)。我试图解决。)
答案 0 :(得分:2)
我不知道Python中有任何这样的占位符。
但是,您可以考虑使用decimal.Decimal
来增加数学运算的精度,但绝不会保证无限次重复循环。为什么? Is floating point math broken?
对您的代码进行以下修改可为if(moment($scope.nextDate).isSame(moment(), 'day')){
$scope.daysCountdown = 0;
} else {
$scope.daysCountdown = moment($scope.nextDate).format('D');
}
之前的运行提供正确的结果:
upper_limit=45
答案 1 :(得分:1)
您可能会关注https://rosettacode.org/wiki/Continued_fraction#Python。它使用Fractions和Itertools模块。
答案 2 :(得分:1)
显然Marius Becceanu发布了an algorithm for the specific continued fraction of sqrt(n),这是迭代的,非常好。该算法不需要使用任何浮点。