【问题标题】:Algorithm for finding a prime with the least amount of computations用最少的计算量找到素数的算法
【发布时间】:2011-11-04 13:06:29
【问题描述】:

假设您要编写一个函数/方法来查找素数,那么最有效的方法是什么?我认为这将是一个类似这样的测试:

semi-c++ 中的代码

bool primeTest (int x) { //X is the number we're testing
    int testUpTo = (int)((sqrt(x))+1);
    for (int i=3; i<testUpTo; i+=2){
        if ((x%i)==0) {
            return false;
        }
    }
    return true;
}

有人有更好的方法来解决这个问题吗?需要更少的计算?

编辑:将代码稍微更改了两次。我没有考虑任何特定的语言来写这个,尽管由于 bool 这个词我认为它是 C++ 而不是 java。

【问题讨论】:

  • 见埃拉托色尼筛。如果您需要重复操作,可能会更有用。
  • 我们说的是运行时计算还是编译时计算?
  • 从一开始就拒绝偶数。只对奇数进行模测试。将你的计算量减半,耶!
  • 您真的想要最快的(当然我假设您的意思是运行时复杂性),还是只想要一个没有任何复杂数学的快速?为了最快,您可以使用一些 AKS 类的素数测试。

标签: java c++ algorithm function methods


【解决方案1】:

除了 2 和 3,所有素数都比 6 的倍数大一或小一。使用该事实将改进您的代码。像这样的东西(未经测试)

bool primeTest (int x){//X is the number we're testing
    if (x == 1) return false;
    if (x == 2 || x == 3) return true;
    if(x%2 == 0 || x%3 == 0)
         return false;

    int testUpTo = (int)((sqrt(x))+1);
    for(int i=6; i<testUpTo; i+=6){
        if ((x%(i-1))==0 || x%(i+1)==0){
            return false;
         }
     }
     return true;
}

当然,高等数学已经有数百年的历史来尝试寻找更有效的素性检验。

【讨论】:

  • 这个函数对数字 1、2 和 3 给出了错误的结果。
  • 这个算法不准确,我不知道为什么它甚至有3个赞成票。 25 和 35 不是质数,但您的算法说它是质数甚至更多。请考虑更新。
【解决方案2】:

我会使用Miller Rabin test,它可以很容易地确定小于 341,550,071,728,321 的数字(而 2^31 比这小得多)。

伪代码:有很多不同的情况。

  1. x小于9:返回(x &amp; 1) != 0 || x == 2
  2. x 小于约 200(可调整):使用试用除法(您使用的)
  3. x 小于 1373653:使用带有碱基 2 和 3 的 Miller Rabin。
  4. x 小于 4759123141(即其他所有值):使用带有碱基 2、7 和 61 的 Miller Rabin。

【讨论】:

    【解决方案3】:

    您可以改进您的代码,只测试奇数值。

    bool primeTest (int x){//X is the number we're testing
        if(x == 2)
             return true;
    
        int testUpTo = (int)((sqrt(x))+1);
        for(int i=3; i<testUpTo; i+=2){
            if ((x%i)==0){
                return false;
             }
         }
         return true;
    }
    

    【讨论】:

    • 不仅仅是你可以测试素值:D
    • 除了对x == 2不起作用之外,这仍然是非常低效的。
    • @jambjo 第一行:if(x % 2 == 0) return false;
    • 这是一个错误。 2 是素数,所以它应该返回 true。我已经编辑了我的代码。
    • @ricky:完全是阿卡。最初的测试声称 2 不是素数。 Ackar 刚刚编辑了他的回复,但代码仍然不正确。现在它声称所有偶数都是素数。
    【解决方案4】:

    你可以看看这篇测试不同素数测试性能的论文:

    Richard P. Brent 的PRIMALITY TESTING:http://cs.anu.edu.au/student/comp4600/lectures/comp4600_primality.pdf

    (见其他帖子:What is the fastest deterministic primality test for numbers in the range 2^1024 to 2^4096?

    【讨论】:

      【解决方案5】:

      维基百科对此有一篇相当不错的文章:

      http://en.wikipedia.org/wiki/Primality_test

      【讨论】:

        猜你喜欢
        • 2023-03-30
        • 2011-05-31
        • 1970-01-01
        • 2015-03-03
        • 2010-10-02
        • 2018-01-11
        • 2015-02-25
        • 1970-01-01
        • 2011-10-08
        相关资源
        最近更新 更多