用C ++中的AKS素数测试计数Twins-素数我在做什么错?

时间:2018-09-27 21:21:55

标签: c++ math gcc codeblocks primes

晚安,我不是C ++专家。我需要计算3和极限内的双素数。我的输出始终为1.我在做什么错?这也是我使用AKS的算法!

#include <bits/stdc++.h>
using namespace std;

long long c[100];

void coef(int n)
{
    c[0] = 1;
    for (int i = 0; i < n; c[0] = -c[0], i++) {
        c[1 + i] = 1;

        for (int j = i; j > 0; j--)
            c[j] = c[j - 1] - c[j];
    }
}

bool isPrime(int n)
{

    coef(n);


    c[0]++, c[n]--;


    int i = n;
    while (i-- && c[i] % n == 0)
        ;


    return i < 0;
}

int main()
{
    int limit=10000,counter=1,i;
    for(i=3;i<=limit;i+=2){
    if (isPrime(i)){

        if(isPrime(i+2)){
                counter++;
    }
 }
}
cout <<counter;
return 0;
}

我在Windows 10 Pro上的代码块17.02上。我在做什么蠢事?

1 个答案:

答案 0 :(得分:0)

这不是素数的AKS算法的全部。它看起来像RosettaCode task的略微修改版本,它实现了指数时间引理。这将比简单的试验划分要慢,更不用说没有模块化算法,这种实现基本上是没有用的,因为它甚至会在玩具大小的输入上溢出。

一旦您进行了适当的素数测试,要考虑的一件事就是不要一遍又一遍地在相同的输入上调用isprime()。您可以每个号码拨打一次,并且只记得您找到的上一个素数。如果isprime(i)为true,则计算您找到的最后一个是否为i-2。现在,您不需要重复调​​用,也不需要值数组。

更好的是,因为要生成n的所有素数,所以要使用筛子。即使使用更好的素数测试,该任务比素数测试效率更高。您可以在RosettaCode page for that task上找到普通的C版本。那里有更好的,但是考虑到您的开始,这实际上并不重要。