给定预先计算的素数排序列表和提供的数字X,我想估计X在素数列表中的大致位置,然后开始搜索。
所以,我已经在二进制文件中计算并存储了1..2 ^ 32-1的素数列表。我有一个程序在一个程序中运行该文件给我第n个素数,一个随机素数,存在多少素数等等。但是为了给这个程序添加一个函数来告诉我提供的数字在哪里是素数,我无法想出一种估计从哪里开始搜索的方法。使用天真的O(n)方法很快就变得不可行,即使对于数字< 2 ^ 32
我已经尝试过Prime数定理(x / ln x),并在其他一些领域做过研究,但还没有找到正确的分布,我担心我的数论不符合标准
我正在寻找类似的东西,例如
1 2 3 4 5 6 .. 100 .. 500 .. 1000 .. 5000 .. 10000
2 3 5 7 11 13 .. 541 .. 3571 .. 7919 .. 48611 .. 104729
所以,查找(13)会给我一个数字,但是< = 6,lookup(7920)会给我一个数字< = 1000,而查找(104729)会给出一个数字< = 10000,等
P.S。我发现这是一个愚蠢的方法有几个原因:a)我可以用不同的方式存储它并进行O(1)查找; b)我可以大大压缩存储; c)对于这么小的数字,我可以在运行时对给定的数字进行主要测试,完全跳过查找表,它会更快。我对这些问题的解决方案不感兴趣;我真的想知道是否有一种经过验证的方法可以估算给定数字的排序列表中的哪个位置。因此,这更像是一个数学/数论理论问题,而不是一个实现问题。
P.P.S。这不是家庭作业。
P.P.P.S。我对StackOverflow进行了彻底的搜索,但可能错过了对此的直接回答。
谢谢。
答案 0 :(得分:8)
小于x的素数大约是x,li(x)的对数积分。反转函数*可以非常好地估计第k个素数的大小。
如果你想避免编程对数积分,那么合理的近似就是
k ln n + k ln ln k - k
在查看表格中该点的值后,您可以通过使用该点处的素数密度更准确地估计正确的位置。因此,如果你想要百万分之一的素数并且估计它是15,502,175,但是发现当时最接近的素数是1,001,000 th,你可以重新估计百万分之一素数作为旧估计 - 1000 ln(15502175)。
*从技术上讲,该函数不是双射的,因此不可反转,但很容易反转你关心的区域,比如x> = 2.
答案 1 :(得分:2)
答案 2 :(得分:1)
如果我误解了这个问题,请纠正我,但不会简单的二元搜索在有序列表中找到正确的对吗?