我将实现一个Farey分数近似,将有限精度的用户输入转换为可能重复的有理数。
http://mathworld.wolfram.com/FareySequence.html
我可以轻松找到序列中最接近的Farey分数,我可以通过构建Stern-Brocot树递归搜索mediant分数来找到Fn。 http://mathworld.wolfram.com/Stern-BrocotTree.html
然而,我提出的用于在序列Fn中找到分数的方法似乎非常低效:
(伪)
For int i = 0 to fractions.count -2
{
if fractions[i].denominator + fractions[i+1].denominator < n
{
insert new fraction(
numerator = fractions[i].numerator + fractions[i+1].numerator
,denominator = fractions[i].denominator + fractions[i+1].denominator)
//note that fraction will reduce itself
addedAnElement = true
}
}
if addedAnElement
repeat
我将几乎总是定义序列Fn,其中n = 10 ^ m,其中m> 1
所以也许最好一次构建序列并缓存它......但似乎应该有更好的方法来推导它。
修改
本文有一个很有前途的算法:
http://www.math.harvard.edu/~corina/publications/farey.pdf
我会尝试实施。
问题是他们的“最有效”算法需要知道前两个元素。我知道任何序列的元素之一是1 / n,但找到第二个元素似乎是一个挑战......
EDIT2:
我不确定我是如何忽视这一点的:
给定F0 = 1 / n
如果x> 2然后
F1 = 1 /(n-1)
因此对于所有n&gt; 2,前两个分数将始终为
1 / n,1 /(n-1)我可以实现Patrascu的解决方案。
所以现在,我们对这个问题的回答应该证明这个解决方案使用基准测试是否是最优的。
答案 0 :(得分:1)
为什么你需要Farey系列?使用continued fractions会在不预先计算系列的情况下在线提供相同的近似值。
答案 1 :(得分:0)
Farey序列中的相邻分数在Sec。 Farey子序列中的3个邻近分数http://arxiv.org/abs/0801.1981。