Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算量最小的素数求法_Java_C++_Algorithm_Function_Methods - Fatal编程技术网

Java 计算量最小的素数求法

Java 计算量最小的素数求法,java,c++,algorithm,function,methods,Java,C++,Algorithm,Function,Methods,假设您要编写一个函数/方法来查找素数,那么最有效的方法是什么?我认为这将是一个类似这样的测试: 下面的代码是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;

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

下面的代码是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;
}
boolprimetest(intx){//x是我们正在测试的数字
int testUpTo=(int)((sqrt(x))+1);

对于(inti=3;i,您可以改进只测试奇数值的代码

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;
}
boolprimetest(intx){//x是我们正在测试的数字
如果(x==2)
返回true;
int testUpTo=(int)((sqrt(x))+1);

对于(inti=3;i维基百科有一篇关于这方面的非常好的文章:


除了2和3之外,所有素数都是6的倍数的一倍或一倍。使用这一事实可以改进您的代码。类似这样的内容(未经测试)

boolprimetest(intx){//x是我们正在测试的数字
如果(x==1)返回false;
如果(x==2 | | x==3)返回true;
如果(x%2==0 | | x%3==0)
返回false;
int testUpTo=(int)((sqrt(x))+1);
对于(int i=6;i我将使用,对于小于341550071728321的数字(2^31比这个小得多),可以很容易地使其具有确定性

伪代码:有许多不同的情况

  • x
    小于9:Return
    (x&1)!=0 | | x==2
  • x
    小于约200(可调整):使用试算法(您使用的)
  • x
    小于1373653:使用带基数2和基数3的Miller Rabin
  • x
    小于4759123141(这是其他所有内容):将Miller Rabin与基数2、7和61一起使用

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

    Richard p.Brent的素性测试:


    (请参阅另一篇帖子:)

    请参阅Eratosthenes筛。如果需要重复此操作,可能会更有用。我们讨论的是运行时计算还是编译时计算?从一开始就拒绝偶数。只对奇数进行模测试。将计算减半,耶!请参阅:你真的想要最快的吗(当然,我假设你是指运行时的复杂性),或者只是一个没有任何复杂数学的快速测试?最快的,你可以使用一些质数测试的AKS类。除此之外,你还可以测试质数值:dex除了它对x==2不起作用之外,这仍然是非常低效的。@jambjo第一行:if(x%2==0)返回false;这是一个错误。2是素数,因此它应该返回true。我已经编辑了我的代码。@ricky:Ackar完全正确。最初的测试声称2不是素数。Ackar刚刚编辑了他的回答,但代码仍然不正确。现在它声称所有偶数都是素数。此函数为数字1、2和3给出了错误的结果。此alg算法不准确,我不知道它为什么有3个投票。25和35不是一个素数,但是你的算法说它是一个素数,甚至更多。请考虑更新这个。
    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;
    }