哥德巴赫猜想的测试及分析

来源:互联网 发布:淘宝换货售后卡怎么填 编辑:程序博客网 时间:2024/06/16 19:54

哥德巴赫猜想:任何一个偶数都可以拆分成两个质数的和

1)针对哥德巴赫猜想,论证10000000以内的偶数都可以被拆成两个质数的和。

#include<stdio.h>
#include<math.h>
#define N 10000000
int prime(int m)
{
    int i,sq,flag=1;
    if(m==2)flag=0;
    else if(m<2||flag%2==0)flag=1;
    else
    for(i=3,sq=sqrt(m);i<=sq;i+=2)
        if(m%i==0){flag=0;break;}
    return flag;
}

int judge(int n)
{
    int i;
    for(i=2;i<=n/2;i++)
        if(prime(i)&&prime(n-i))return 1;
    return 0;
}


int main()
{
    int i;
    for(i=6;i<N;i+=2) if(judge(i)==0)printf("%d is wrong!\n",i);
}

分析:关于判断是不是质数函数:小于二的数不是质数,大于二的偶数不是质数,所以从3开始讨论奇数,当且能被不超过sqrt(m)的数整除后才能不是质数。可是运行速度很慢

下面的算法验证相同的范围就很快了

#include<stdio.h>
#include<math.h>
#include<string.h>


#define N 10000000
char prime[N+1];


void fill()
{
    int i,j;
    memset(prime,1,N);
    prime[0]=prime[1]=0;
    for(i=2; i*i<=N; i++)
    {
        if(prime[i])
            for(j=i*i; j<N; j+=i)prime[j]=0;
    }
}
void print()
{
    int i;
    for(i=0; i<N; i++)
        if(prime[i])printf("%d ",i);
}
int judge(int n)
{
    int i;
    for(i=3; i<=n/2; i+=2)
        if(prime[i]&&prime[n-i])return 1;
    return 0;
}
int main()
{
    int i;
    fill();
    for(i=6; i<N; i+=2)
        if(judge(i)==0)
            printf("%d is wrong!\n",i);
}

后者的算法是先将质数存表,具体实现是创建一个数组,全部赋值1,然后从最小数开始考虑,先将0,1赋值为0,及表示不是质数,然后从2考虑,只考虑i*i开始的整数,因为i*j(j<i)的部分已经在比i更小的整数考虑过了,然后只需要从i*i开始以i为单位递加,因为考虑的是i的倍数,不是i的倍数的整数在其他整数的循环中考虑,然后第二次循环前有一个if(prime[i])判断,是因为若不是质数,则该数的整数倍早已经在比该数小的整数时候考虑过了。

0 0