【问题标题】:C++ Sieve of Atkin Returning Several CompositesAtkin 的 C++ 筛选器返回几个复合材料
【发布时间】:2014-02-16 06:22:56
【问题描述】:

我已经用 C++ 实现了我自己的 Atkin 筛子,它生成的素数很好,直到大约 860,000,000。在那里和更高的地方,程序开始返回几个复合材料,或者我认为是这样。我在程序中有一个变量,用于计算找到的素数的数量,并且在 ~860,000,000 处,计数超过了应有的数量。我对照埃拉托色尼筛的一个类似程序和几个互联网资源检查了我的计数。我是编程新手,所以这可能是一个愚蠢的错误。

不管怎样,这里是:

#include <iostream>
#include <math.h>
#include <time.h>

int main(int argc, const char * argv[])
{
    long double limit;
    unsigned long long int term,term2,x,y,multiple,count=2;
    printf("Limit: ");
    scanf("%Lf",&limit);
    int root=sqrt(limit);
    int *numbers=(int*)calloc(limit+1, sizeof(int));
    clock_t time;


    //Starts Stopwatch
    time=clock();


    for (x=1; x<root; x++) {
        for (y=1; y<root; y++) {
            term2=4*x*x+y*y;
            if ((term2<=limit) && (term2%12==1 || term2%12==5)){
                numbers[term2]=!numbers[term2];
            }
            term2=3*x*x+y*y;
            if ((term2<=limit) && (term2%12==7)) {
                numbers[term2]=!numbers[term2];
            }
            term2=3*x*x-y*y;
            if ((term2<=limit) && (x>y) && (term2%12==11)) {
                numbers[term2]=!numbers[term2];
            }

        }
    }


    //Print 2,3
    printf("2 3 ");



    //Sieves Non-Primes That Managed to Get Through
    for (term=5; term<=root; term++) {
        if (numbers[term]==true) {
            multiple=1;
            while (term*term*multiple<limit){
                numbers[term*term*multiple]=false;
                multiple++;
            }
        }
    }

    time=clock()-time;

    for (term=5; term<limit; term++) {
        if (numbers[term]==true) {
            printf("%llu ",term);
            count++;
        }
    }


    printf("\nFound %llu Primes Between 1 & %Lf in %lu Nanoseconds\n",count,limit,time);



    return 0;
}

【问题讨论】:

  • limit 的最大值是多少?
  • 如果 ` 4*xx+yy > 限制 ` 怎么办?
  • 是的,最大值是限制,如果 4*xx+yy > 限制,那么该值是无用的,因为它超出了限制的范围。
  • 可能与问题无关,但你为什么使用int*数字来存储bool值?
  • 我觉得也不是,但是calloc(分配内存)必须使用指针。

标签: c++ algorithm primes sieve-of-atkin


【解决方案1】:

来自wikipedia

The following is pseudocode for a straightforward version of the algorithm:
// arbitrary search limit
limit ← 1000000         

// initialize the sieve
for i in [5, limit]: is_prime(i) ← false

// put in candidate primes: 
// integers which have an odd number of
// representations by certain quadratic forms
for (x, y) in [1, √limit] × [1, √limit]:
    n ← 4x²+y²
    if (n ≤ limit) and (n mod 12 = 1 or n mod 12 = 5):
        is_prime(n) ← ¬is_prime(n)
    n ← 3x²+y²
    if (n ≤ limit) and (n mod 12 = 7):
        is_prime(n) ← ¬is_prime(n)
    n ← 3x²-y²
    if (x > y) and (n ≤ limit) and (n mod 12 = 11):
        is_prime(n) ← ¬is_prime(n)

// eliminate composites by sieving
for n in [5, √limit]:
    if is_prime(n):
        // n is prime, omit multiples of its square; this is
        // sufficient because composites which managed to get
        // on the list cannot be square-free
        for k in {n², 2n², 3n², ..., limit}:
            is_prime(k) ← false

print 2, 3
for n in [5, limit]:
    if is_prime(n): print n

for (x, y) in [1, √limit] × [1, √limit]: 是你的问题。

你用过:

for (x=1; x<root; x++) 
        for (y=1; y<root; y++)

改为使用:

for (x=1; x<=root; x++) 
        for (y=1; y<=root; y++)

希望这会有所帮助!

【讨论】:

  • 谢谢!完美运行!
猜你喜欢
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2013-10-13
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
相关资源
最近更新 更多