为查找最少计算量的素数的载值

问题描述 投票:0回答:4

弥补您要编写一个函数 /方法来查找质数,这将是最有效的方法? 我认为这将是这样的测试:

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; }
有人有更好的方法可以解决此问题,这将减少计算?

Edit:稍微更改代码,两次。 我没有想到任何特定的语言,尽管我认为由于bool这个词,我认为java上的c ++是java。

java c++ algorithm function methods
4个回答
10
投票
I将使用

millerRabinTest,该测试很容易成为小于341,550,071,728,321的数字(和2^31远小得多)的确定性。 假码:有许多不同的情况。

x
    小于9:返回
  1. (x & 1) != 0 || x == 2
    
    
    x
  2. 小于大约200个(可调整):使用试用部(您使用的方法)
  3. x
  4. 小于1373653:使用米勒·拉宾(Miller Rabin)与基地2和3。
  5. x
    小于4759123141(这就是其他所有内容):使用米勒·拉宾(Miller Rabin)的基地2、7和61.
  6. 
    2和3的apart,所有质数比六个的倍数多于一个或一个。使用该事实将改善您的代码。这样的东西(未经测试)
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; }

3
投票
当然,已经有几个世纪的高级数学来尝试找到更有效的原始测试。 编辑:固定输入25和35

的错误结果

wikipedia在此方面有一篇很好的文章:

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

2
投票

您可以查看本文测试不同原始测试的性能:

Richard P. Brent的主要测试:Http://cs.anu.edu.au/student/comp4600/comletures/comp4600_primality.pdf


1
投票
最快的确定性原则测试是2^1024至2^4096?

)的数字测试。

您只能改善代码测试奇数。

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; }

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.