最小素数的数量和位置之间的关系大于素数列表中的平方根

时间:2014-06-29 04:02:48

标签: r algorithm math primes

在制作素数列表时,需要检查一个数字是否可被任何等于或小于其平方根的素数整除。但是,不是每次检查素数是否超过正在检查的数字的平方根(如本页所述:Optimize prime number finder and cpu speed checker in R),如果可以知道它在列表中的位置,将会很有用。在素数列表中,数字与最小素数的位置之间是否有任何关系或等式大于其平方根。下面的代码(在R中)和图表显示可能存在关系:

pnum_sqrtpos_plot = function(){
    p_nums = c(2L,3L)
    counter = 3L
    sqrtcounter=1L
    sqrtposlist = c(1L,1L)
    countchecker=10000
    while (counter<200000){
        isPRIME = FALSE
        counter = counter +2L
        sqrtcounter = sqrt(counter)
        for(n in p_nums) {
            if(n > sqrtcounter){ isPRIME=TRUE; break; }
            if(counter %% n == 0){ isPRIME = FALSE; break;}
        }
        if(isPRIME) { p_nums[length(p_nums)+1]=counter 
            sqrtpos = which(p_nums>sqrt(counter))[1]
            sqrtposlist[length(sqrtposlist)+1] = sqrtpos
        }
        if(counter > countchecker) {cat("Numbers checked: ",counter,"\n");
                counterchecker = countchecker+10000;
        }
    }
    plot(p_nums, sqrtposlist
    , main="Relation between number & \nposition of smallest prime larger than its square root in list of primes"
    , xlab="Number", ylab="Position in list of prime numbers")
}

enter image description here 什么是关系/等式?谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

在您指向的示例代码中,您按升序构建素数列表,并在每个点通过测试列表中每个数字的可分性来检查数字的素数,直到数字的平方根正在接受测试。

如果您有一个长度为n的升序的数字列表,您可以搜索此列表,使用二进制印章在列表长度中以时间对数查找小于sqrt(目标)的最大数字,这比搜索更快通过列表一次一个。

事实上,你可以做得比这更好,因为你正在按升序寻找新的素数。如果你还记得前一个号码的小于sqrt(目标)的最大数字的位置,你可以在处理下一个号码时从这里向前搜索 - 所以对于每个号码你通常只需要检查你不是需要更改最大的测试除数来检查,并且需要将一小部分时间移动到一个位置。

(这些都是有趣的小调整,但我怀疑他们是否会以任何明显的数量加速你的代码。我注意到http://stat.ethz.ch/R-manual/R-devel/library/utils/html/Rprof.html有一个分析器可以用来查看你的R程序在哪里花时间。在优化代码时,运行这样的分析器通常是值得的,因为人们非常难以猜测什么是昂贵的,什么不是,并且没有必要加倍代码的速度,只占总数的1%时间)。