为了在farey sequence中找到分数的位置,我尝试在“ 初始算法 ”下实现此处http://www.math.harvard.edu/~corina/publications/farey.pdf给出的算法,但我无法理解我哪里出错了,我得不到正确的答案。请有人指出我的错误。 例如。对于n = 7的顺序和分数1 / 7,1 / 6我得到相同的答案。 这是我为给定的学位(n)而尝试的,以及a / b的分数:
sum=0;
int A[100000];
A[1]=a;
for(i=2;i<=n;i++)
A[i]=i*a-a;
for(i=2;i<=n;i++)
{
for(j=i+i;j<=n;j+=i)
A[j]-=A[i];
}
for(i=1;i<=n;i++)
sum+=A[i];
ans = sum/b;
感谢。
答案 0 :(得分:2)
您的算法不使用a和b的任何特定属性。在第一部分中,数组A的每个相关条目是a的倍数,但该因子独立于a,b和n。设置数组忽略因子a,即以A [1] = 1开始,A [i] = i-1为2&lt; = i&lt; = n,在嵌套循环之后,数组包含{{3无论a,b,n是什么,即A [i] = phi(i)。从1到n的总和的总和是N阶的Farey序列的元素数(加或减1,取决于您使用的定义中包含0/1和1/1中的哪一个)。所以你的答案总是近似值(a *项数)/ b,这是接近但不精确的。
我还没有看过你的论文与论文中的算法有何关系,请稍后再查看更新。
附录:最后有时间看一下这篇论文。你的初始化不是他们给出的。在他们的算法中,A[q]
初始化为floor(x*q)
,对于理性x = a/b
,正确的初始化是
for(i = 1; i <= n; ++i){
A[i] = (a*i)/b;
}
在代码的其余部分中,只有ans = sum/b;
必须更改为ans = sum;
。
答案 1 :(得分:1)
在备注7.10(ii)(a)中显示了在 n > 1的Farey序列中找到分数的位置 t 的非算法方法(a) )paper,在 m:= n -1下,其中mu-bar代表正整数的数论理论Mobius函数,取值集{-1,0, 1}。
答案 2 :(得分:0)
这是我的Java解决方案。将头(0/1),尾(1/1)节点添加到SLL。 然后通过传递headNode,tailNode并设置所需的orderLevel开始。
public void generateSequence(Node leftNode, Node rightNode){
Fraction left = (Fraction) leftNode.getData();
Fraction right= (Fraction) rightNode.getData();
FractionNode midNode = null;
int midNum = left.getNum()+ right.getNum();
int midDenom = left.getDenom()+ right.getDenom();
if((midDenom <=getMaxLevel())){
Fraction middle = new Fraction(midNum,midDenom);
midNode = new FractionNode(middle);
}
if(midNode!= null){
leftNode.setNext(midNode);
midNode.setNext(rightNode);
generateSequence(leftNode, midNode);
count++;
}else if(rightNode.next()!=null){
generateSequence(rightNode, rightNode.next());
}
}