• 法雷级数


    法雷级数定义  R.亨斯贝尔格著李忠翻译的《数学中的智巧》一书,介绍了法雷级数。这里每一行从0/1开始,以1/1结尾,其它数自左至右将所有的真分数按增加顺序排列;第n行是由所有分母小于或等于n的真分数组成,我们称为n阶法雷级数。如下表:

      F1: 0/1 1/1

      F2: 0/1 1/2 1/1

      F3: 0/1 1/3 1/2 2/3 1/1

      F4: 0/1 1/4 1/3 1/2 2/3 3/4 1/1

      F5: 0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1

      F6:0/1 1/6 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 5/6 1/1

      …… ………………………………

      这里我们想问的是第n行Fn的真分数的个数有多少个呢?

      我们设Fn的个数为ψ(n), ψ(n)比 ψ(n-1)增加的个数是分母是n,分子比n小且与n互质的数的个数,这正是欧拉函数φ(n)。即

      ψ(n)=ψ(n-1)+ φ(n)

      ψ(1)=1+φ(1)

      ψ(2)=ψ(1)+φ(2)

      ψ(3)=ψ(2)+φ(3)

      ………………

      ψ(n)= ψ(n-1)+ φ(n)

      所以 ψ(n)=1+φ(1)+φ(2)+φ(3)+……+φ(n)很容易证明,当n≥3时,欧拉函数φ(n)是个偶数。由此我们得到除ψ(1)=2是偶数外,法雷级数其它各级的个数都是奇数,并且许多是素数。ψ(1)=2,ψ(2)=3,ψ(3)=5,ψ(4)=7,ψ(5)=11,ψ(6)=13,ψ(7)=19,ψ(8)=23,ψ(9)=29,……。

    性质

      法雷级数Fn具有很多美妙的性质,下面是一些常见的性质:

      1.如果a/b,c/d是相邻的两项,则abs(a*d-b*c)=1。

      2.如果a/b,c/d,e/f是相邻的三项,则 (a+e)/(b+f)=c/d,特别的,如果c/d是新添加的,即c/d不属于F(n-1),则c=a+e;d=b+f。

      性质2对于这个问题至关重要,它的证明可以参见哈代(Hardy)写的数论导引第三章

      关于Farey级数的介绍。根据这条性质可以知道,丛F(n−1)到F(n)的构造过程中,F(n)的新项的分母一定是其相领两项的分母和。另一方面,如果F(n−1)中的相邻两项 a/b,c/d, b+d=n,则(a+c)/n一定会被添加到F(n)中。


    题目:poj3090

    链接:http://poj.org/problem?id=3090

    题意:一个(n+1)*(n+1)的点阵,问多少点能被点(0,0)看到。如果(0,0)到(i,j)的连线被点挡住就算看不到。
    用数组ans[i]记录(i+1)*(i+1)的点阵可以看到的点数,则x=y=i的点肯定不能看到,考虑x>y的情况,很容易发现规律:点(x,y)能被发现只有当gcd(x,y)=1时,否则会被点
    (x/gcd(x,y),y/gcd(x,y))挡住,然后只需要计算i的欧拉函数值,即点(i,i)的下方有多少点满足条件,再加上x<y的情况(对称的),所以ans[i]=ans[i-1]+2*phi[i]。
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    const int maxn=1000+10;
    int a[maxn];
    int euler(int n)
    {
        int ans=n;
        for(int i=2;i*i<=n;i++)
            if(n%i==0)
        {
            ans=ans/i*(i-1);
            while(n%i==0)   n/=i;
        }
        if(n>1)   ans=ans/n*(n-1);
        return ans;
    }
    int main()
    {
        int t;
        cin>>t;
        for(int cas=1;cas<=t;cas++)
        {
            int n;
            cin>>n;
            memset(a,0,sizeof(a));
            a[1]=3;
            for(int i=2;i<=n;i++)
            a[i]=a[i-1]+euler(i)*2;
            cout<<cas<<" "<<n<<" "<<a[n]<<endl;
        }
        return 0;
    }
    

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    const int maxn=1000+10;
    int phi[maxn];
    void phi_table(int n)
    {
        for(int i=2;i<=n;i++)
            phi[i]=0;
        phi[1]=1;
        for(int i=2;i<=n;i++)
            if(!phi[i])
            for(int j=i;j<=n;j+=i)
            {
                if(!phi[j])
                    phi[j]=j;
                phi[j]=phi[j]/i*(i-1);
            }
    }
    int main()
    {
        int t;
        cin>>t;
        phi_table(1000);
        for(int cas=1;cas<=t;cas++)
        {
            int n;
            cin>>n;
            phi[1]=3;
            long long ans=0;
            for(int i=2;i<=n;i++)
                ans+=2*phi[i];
            cout<<cas<<" "<<n<<" "<<ans+3<<endl;
        }
        return 0;
    }
    


  • 相关阅读:
    verilog 数组参数
    跨时钟域设计【一】——Slow to fast clock domain
    跨时钟域设计【二】——Fast to slow clock domain
    跨时钟域设计【三】—— 数据同步
    Vivado学习笔记_002
    使用modelsim仿真DDR3时编译出错的解决方法
    Modelsim仿真tcl脚本与wave.do文件
    %s 与 %0s在 verilog中的区别
    BFM1
    verilog 常用系统函数及例子
  • 原文地址:https://www.cnblogs.com/wolf940509/p/6617107.html
Copyright © 2020-2023  润新知