试除法计算最小的N个素数

Trial division

试除法求最小N个素数是一个经典的算法。

可以使用素数分类的性质来加快计算的速度。

除了2以外,素数只能是2n+1,n>=1。

除了2、3和5以外,素数只能是6n+1或6n+5,n>=1。

/*
 * 试除法计算最小的N个素数
 *
 * 素数中除了2以外,均为奇数。
 * 可以用试除法从奇数中挑选出最小的N个素数。
 *
 * 另外,<span style="color: rgb(0, 128, 0);">除了2、3和5之外,</span>素数只可能是6n+1或6n+5,n>=1。
 * 所有有另外一种计算方法,会稍微快一些。
 */

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

#define N   25

int prime[N] = {2, 3, 5};

void output_result(void);

void primes()
{
    int n = 3;
    int i = 2;
    for(;;) {
        n += 2;
        int j, q =sqrt(n);
        for(j=1; prime[j]<=q; j++)
            if(n % prime[j] == 0)
                break;
        if(prime[j] > q)
            prime[i++] = n;
        if(i == N)
            break;
    }
}

void primes2()
{
    int n1=1, n2 = 5;
    int i = 3;
    for(;;) {
        n1 += 6;
        int j, q =sqrt(n1);
        for(j=1; prime[j]<=q; j++)
            if(n1 % prime[j] == 0)
                break;
        if(prime[j] > q)
            prime[i++] = n1;
        if(i == N)
            break;

        n2 += 6;
        q =sqrt(n2);
        for(j=1; prime[j]<=q; j++)
            if(n2 % prime[j] == 0)
                break;
        if(prime[j] > q)
            prime[i++] = n2;
        if(i == N)
            break;
    }
}

int main(void)
{
    primes();

    output_result();

    primes2();

    output_result();

    return 0;
}

void output_result()
{
    int i;
    for(i=0; i<N; i++)
       printf("%d:%d\n", i+1, prime[i]);
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值