sieve方法c语言,用C语言实现Sieve of Atkin算法

Sieve of Atkin是一种快速的素数筛选算法,算法比较成熟和简单,http://en.wikipedia.org/wiki/Sieve_of_Atkin中的描述已经非常的细致,作者撰写此文的目的在于,对如何把伪代码转为C代码作一个引导,参考如下的示例。

#include

#include

/* limit ← 1000000 */

#define LIMIT(1000000)

#define FALSE(0)

#define TRUE(~FALSE)

int main(int argc, char* argv[])

{

int sieve_list[LIMIT + 1];

int n, r;

int x, y;

int k, i;

/* is_prime(i) ← false, ∀ i ∈ [5, limit] */

for(n = 5; n <= LIMIT; n++)

sieve_list[n] = FALSE;

/* for (x, y) in [1, √limit] × [1, √limit]: */

for(x = 1; x <= (int)sqrt(LIMIT); x++)

for(y = 1; y <= (int)sqrt(LIMIT); y++)

{

/*

n ← 4x²+y²

if (n ≤ limit) and (n mod 12 = 1 or n mod 12 = 5):

is_prime(n) ← ¬is_prime(n)

*/

n = 4 * x * x + y * y;

if(n <= LIMIT && (n % 12 == 1 || n % 12 == 5))

sieve_list[n] = ~sieve_list[n];

/*

n ← 3x²+y²

if (n ≤ limit) and (n mod 12 = 7):

is_prime(n) ← ¬is_prime(n)

*/

n = 3 * x * x + y * y;

if(n <= LIMIT && n % 12 == 7)

sieve_list[n] = ~sieve_list[n];

/*

n ← 3x²-y²

if (x > y) and (n ≤ limit) and (n mod 12 = 11):

is_prime(n) ← ¬is_prime(n)

*/

n = 3 * x * x - y * y;

if(x > y && n <= LIMIT && n % 12 == 11)

sieve_list[n] = ~sieve_list[n];

}

/*

for n in [5, √limit]:

if is_prime(n):

is_prime(k) ← false, k ∈ {n², 2n², 3n², ..., limit}

*/

for(n = 5; n <= sqrt(LIMIT); n++)

if(sieve_list[n] == TRUE)

{

i = 1;

k = i++ * n * n;

while(k <= LIMIT)

{

sieve_list[k] = FALSE;

k = i++ * n * n;

}

}

/* print 2, 3 */

printf("2\n3\n");

/*

for n in [5, limit]:

if is_prime(n): print n

*/

for(n = 5; n <= LIMIT; n++)

if(sieve_list[n] == TRUE)

printf("%d\n", n);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值