在farey序列中找到一个分数的位置

时间:2011-11-19 15:06:38

标签: algorithm math

为了在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;

感谢。

3 个答案:

答案 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());
    }

}