用 C++ 中的 AKS 素性测试计算孪生素数我做错了啥?
Posted
技术标签:
【中文标题】用 C++ 中的 AKS 素性测试计算孪生素数我做错了啥?【英文标题】:Counting Twins-primes with AKS primality test in C++ What am I doing wrong?用 C++ 中的 AKS 素性测试计算孪生素数我做错了什么? 【发布时间】:2018-09-27 21:21:54 【问题描述】:晚安,我不是 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。我在做什么蠢事?
【问题讨论】:
你在看 c[n] where n > sizeof(c) AKS 实现不是我的,我之前测试过,它运行良好。没看懂。 那是我第一次坠毁的地方。您定义了一个不使用的名为 coef 的函数。只看main中的逻辑,为什么只计算对中的较低素数? 试试这个: if (isPrime(i)) std::cout 对不起,我的复制/意大利面错误。 coef() 现在被正确使用了,我还不能得到结果。 【参考方案1】:这根本不是用于素数的 AKS 算法。它看起来像是 RosettaCode task 的略微修改版本,它实现了指数时间引理。它会比简单的试除法慢,更不用说如果没有模运算,这个实现基本上是无用的,因为它会在玩具大小的输入上溢出。
一旦您进行了适当的素性测试,需要考虑的一件事是不要在相同的输入上一遍又一遍地调用 isprime()。您可以为每个数字调用一次,并记住您找到的最后一个素数。如果 isprime(i) 为真,则计算您找到的最后一个是否为 i-2。现在您不需要重复调用,也不需要值数组。
更好的是,因为您想生成 n 的所有素数,所以使用筛子。它比素性测试更有效,即使有更好的素性测试。您可以在RosettaCode page for that task 找到一个简单的 C 版本。那里有更好的,但考虑到你的开始,这并不重要。
【讨论】:
以上是关于用 C++ 中的 AKS 素性测试计算孪生素数我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章
急急急 求大神帮忙 用vc++ 生成1024位大素数 用到米勒拉宾素性测试