在C++中使用 AKS 素数测试计算双胞胎素数 我做错了什么?

Counting Twins-primes with AKS primality test in C++ What am I doing wrong?

本文关键字:双胞胎 错了 什么 计算 测试 AKS C++      更新时间:2023-10-16

晚安,我不是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 专业版上的代码块 17.02 上。我在做什么蠢事?

根本不是用于素数的 AKS 算法。 它看起来像是RosettaCode任务的略微修改版本,它实现了指数时间引理。 它将比简单的试验除法慢,更不用说如果没有模块化算法,这种实现基本上是无用的,因为它甚至会在玩具尺寸的输入上溢出。

一旦你有一个适当的素数测试,要考虑的一件事就是不要一遍又一遍地在相同的输入上调用isprime((。 您可以为每个数字调用一次,只需记住您找到的最后一个素数。 如果 isprime(i( 为真,则计算您找到的最后一个是否是 i-2。 现在,您不需要重复调用,也不需要值数组。

更好的是,既然你想生成n的所有素数,就是使用筛子。 对于该任务,即使使用更好的素数测试,它比素数测试更有效。 您可以在 RosettaCode 页面上找到该任务的简单 C 版本。 那里有更好的,但考虑到你从什么开始,这并不重要。