用 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位大素数 用到米勒拉宾素性测试

Python 中的 AKS Primes 算法

数论部分第一节:素数与素性测试详解

Miller-Rabin 素性测试

MillerRabin素性测试(数论:素数Template)

ZZNUOJ_用Java编写程序实现1555:双胞胎素数(附源码)