数与大于其平方根的最小素数在素数列表中的位置之间的关系

标签 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 关系/方程式可能是什么?感谢您的帮助。

最佳答案

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

如果你有一个长度为 n 的升序排列的数字列表,你可以搜索这个列表以找到小于 sqrt(target) 的最大数字,在时间上使用 binary chop 对列表长度的对数,这比搜索更快一次一个地浏览列表。

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

(这些都是有趣的小调整,但我怀疑它们是否会显着加快您的代码速度。我注意到在 http://stat.ethz.ch/R-manual/R-devel/library/utils/html/Rprof.html 有一个分析器,您可以使用它来查看您的 R 程序将其花费在哪里时间。在优化代码时,运行此类分析器通常是值得的,因为人类非常不擅长猜测什么是昂贵的,什么不是,并且只消耗总时间的 1% 的代码速度加倍是没有意义的) .

关于数与大于其平方根的最小素数在素数列表中的位置之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24473055/

相关文章:

r - R中箱线图中的上下四分位数

r - 为什么在使用 plotstyle ="ggplot"时 qqcomp 函数中没有显示任何点?

algorithm - 内存算法时间复杂度

python - Lisp翻译

php - -13 % 64 = -13 在 PHP 中如何实现?

使用不可见列的 R DT 条件格式

用 id 替换另一个数据帧中的 NA 值

java - 我怎样才能用计算机程序解决 Log Pile 木制拼图?

algorithm - 滑动 AABB 碰撞 - 卡在边缘

algorithm - 如何用MapReduce/Hadoop实现特征值计算?