【问题标题】:Relation between a number and position of smallest prime larger than its square root in the list of primes [closed]素数列表中大于其平方根的最小素数的数量与位置之间的关系[关闭]
【发布时间】:2014-06-29 04:02:47
【问题描述】:

在制作素数列表时,需要检查一个数字是否可以被任何等于或小于其平方根的素数整除。但是,与其每次检查质数是否大于被检查数字的平方根(如本页所做的那样: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")
}

可能是什么关系/方程式?感谢您的帮助。

【问题讨论】:

  • 素数定理是一个很好的起点。大约有 n / log(n) 个小于 n 的素数。尝试询问数学 stackexchange。
  • 这个问题似乎跑题了,因为它是关于数学而不是编程的。
  • pi(n) ~= n/log(n); pi(sqrt(n)) ~= 2*sqrt(n)/log(n) 是一个近似值。
  • 感谢您的信息。但是,如果我保留此标准,则会包括一些非素数。即使是 3*sqrt... 也包括一些非素数。但是,4*sqrt... 似乎可以正常工作。

标签: r algorithm math primes


【解决方案1】:

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

如果您有一个长度为 n 的升序数字列表,您可以搜索此列表以使用二进制斩波在列表长度中以时间对数方式找到小于 sqrt(target) 的最大数字,这比搜索要快一次一个地浏览列表。

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

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

【讨论】:

  • 谢谢。我正在尝试采纳您的所有建议。
  • 而且您甚至不需要检查是否必须将其提前一个档次 - 根本不需要。你也提前知道——当你把代码翻过来,而是在素数的连续平方之间产生素数(知道前几个素数是 2,你可以通过递归使用相同的算法得到的较小素数的供应, 3,...)。如果你读过 Haskell,see this.
  • 感谢您提供此信息和链接。
  • @mcdowella:我试过了,但我不认为你的说法是正确的:“记住小于sqrt(target)的最大数字的位置为前一个数字,你可以从这里向前搜索当处理下一个数字”。你能提供一些代码吗?
  • 我的意思是,您检查的素数数字会增加。因此,例如,如果您检查 9 是否为素数并发现您需要检查除数最多为 3,那么当您检查 10 是否为素数时,您需要检查除数至少为 3,并注意到 4 仍然太大必须检查。事实上,在您检查 16 之前,您需要检查的最大数是 3。当您检查 16 时,您最后需要将您需要检查的最大除数从 3 推进到 4。
猜你喜欢
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 2017-02-17
  • 2018-01-21
  • 2012-02-12
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多