第N素数算法

Booker、Carr等人的首页。

对于小素数,即小于300000000000的素数,我们使用程序Andrew Booker提供的数据(有关大素数,请参见下文)。以下是他的描述:

为了快速找到素数n个thprime程序使用一个大型存储数据表以先接近正确答案,然后完成计算时间相对较短。要了解其工作原理,请想象一下数字线分成大小不同的箱子N个,即第一个是从0到N个-1,第二个来自N个至2N个-1等(在我的实现中,N个等于19219200。)在该表中,我们存储了每个函数中的素数箱子。然后,要检索n个第素数,程序将数字相加直到总和超过n个。然后我们就可以准确地知道哪个箱子n个th素数落入。然后可以使用筛选算法在那个箱子。

筛选算法的工作原理如下。首先,我们计算一组基数筛分中使用的底漆。基本素数由所有素数达到bin中最后一个数字的平方根。其次,我们保留一个数组(筛),它为中的每个数字保存一个标志字节箱子。(实际上,数组比箱子的大小,所以箱子首先被分成许多子箱子一次筛一个。)然后,我们通过划掉来“筛选”垃圾箱(设置标志字节)每个基本素数的倍数。末尾,没有划掉的数字(没有他们的国旗字节集)是bin中的所有素数。这些素数被计数直到达到我们原来的数字n。(为了更好地描述筛选算法,请参阅这个条目在里面克里斯·考德威尔的主要词汇表.)

因此,如果料仓尺寸足够小,筛分就可以完成迅速地。这样,找到素数的大部分工作都是在计算数据表。然后,使用改进的sieve算法非常适合筛选多个箱子。  The改进的算法实际上筛选了很多次,每个残留物筛选一次相对素数到一些具有许多小素数因子的数。(我用过30030=2*3*5*7*11*13。)例如,在第一个筛子中这些数字被30030除时有余数1,因此使标志字节表示0,1,2,。。。与标准筛相同算法,它们表示1,1+30030,1+2*30030,。。。这听起来可能像它比以前创造了更多的工作,但事实证明它比以前更快我们只需要考虑相对最优的剩余物30030.这样,2、3、5、7、11和13的倍数为自动消除,使算法大约快6倍。 此外,修改后的算法可以很容易地并行化计算机可以各自处理不同的残留物。使用的表n个UltraSparcs实验室在9小时内计算出了第个主程序和SGI。

返回第N个主页

对于较大的素数(和选定的较小值),我们使用由Andrey V.Kulsha:

Andrey V.Kulsha有一个连续四舍五入值为1.5*(π(x个)-李(x个))10的100000000倍9小于1017(请参见他桌子上的那一页在这里). 他仍然在反复检查这些值,所以目前我们的扩展只是实验性的。

2014年,安德鲁·卡尔和我将这些转换为实际差异(所以我们可以找到10的倍数的π(x)9只需读取一个文件,即可快速计算li(x)。对于其他值,我们使用最接近的10的倍数9然后筛选两者之间的区域,得到π(x)。这是使用完成的原筛作者:Kim Walisch。这可能是速度慢,因为我们的服务器是旧的32位服务器,并且经常忙于验证列表的素数已知最大的素数。(如果您想捐赠一个新的,请联系Chris Caldwell!)

对于第页n个我们从渐近展开的这些项开始对于第页n个[Cipolla1902年]

第页n个=n个(日志n个+日志n个-1+(对数日志(n个)-2)/日志n个-((日志日志(n个))2-6日志(n个)+11)/(2日志2 n个))。

错误,O(n个(日志日志n个/日志n个))),仍然太大,所以我们应用Newton-Raphson迭代找到R的解决方案(x个)=n个.(此处R(x个)是黎曼素数计数函数。)这将是舒适的10内9的正确值。现在我们计算π(x),再次迭代以找到要搜索的区域的另一端。。。现在,我们根据需要进行筛选,以找到第页n个.

我们想不出任何理由将“随机素数”链接扩展到超过前100000000000个素数。

返回第N个主页
从PrimePages打印<t5k.org>©Reginald McLean。