计算素数和优化蛮力除数的公式

问候! 我决定在闲暇时研究寻找素数的问题。 这个话题是广泛而有趣的。 我想就此发表一些想法。 互联网上的搜索没有发现这种现象,这表明它们的独创性。

首先,我从未找到用于计算阶数的数学公式。 但是毕竟,如果有算法,那么当然可以使用逻辑函数或运算符来组成公式。 我在下面给出最简洁的公式。

对于一些数字序列 X = X 1X 2X 3X 中号一个X 我们介绍了检测等于a的第一个数字的运算符:

\ mathbf {Dt_ {a}}(x_ {m}):= \左\ {\开始{矩阵} m \ \ mathbf {if} \ \存在\ m:\ forall \,k <m \ x_ {k} \ neq a \ \ mathbf {and} \ x_ {m} = a \\ 0 \ \ mathbf {否则} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \末尾{矩阵} \对

\ mathbf {Dt_ {a}}(x_ {m}):= \左\ {\开始{矩阵} m \ \ mathbf {if} \ \存在\ m:\ forall \,k <m \ x_ {k } \ neq a \ \ mathbf {and} \ x_ {m} = a \\ 0 \ \ mathbf {否则} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \末尾{矩阵} \对


从5开始的所有素数都可以通过以下公式计算:

Pn=Pn1+2 mathbfDt0i mathbfDt0jPn1+2i\,mod\,Pj+1    forall\,n geqslant3 forall\,imax geqslant max fracP alphaP  alpha12+10 ,,  2 leqslant alpha leqslantn1;  jmax= pi sqrtPn1+2i1


操作员  mathbfDtj0 遍历 j 将每个候选数除以简单的余数 Pn1+2i 至已经找到的素数 Pjmax+1 。 从大于前一个质数的奇数中按顺序选择候选数 Pn1 pi sqrtPn1+2i 是pi函数,显示素数  leqslant sqrtPn1+2i
操作员  mathbfDti0 遍历 操作员输出值  mathbfDtj0 直到找到0。由于素数级数是无限的,所以这迟早会发生。 在操作员出口处  mathbfDti0 所以总会有一些数字 。 下界 imax 由相邻质数的最大差小于所需的质数确定。 这种差异的增加是对数的。 下图显示了最大和平均增长率的依赖性  DeltaP alphan开始的前100,000个素数。 对最大值进行采样,并对每千个数字取平均值。 图片
质数差的最大增加  deltamax DeltaP alpha 到以前的最大值 max DeltaP alpha 等于20(素数之差31397-31469 = 72相对之差25523-25471 = 52)。 它是包络对数的导数的区域  DeltaP alpha 仍然足够大,素数不再太小。 根据此值, imax 。 图表  deltamax DeltaP alpha 下面给出的前50,000个素数。 每千计算一次值。 图片
峰值在20处可见。随着n的增加曲线变为负数,表明大素数的增长率降低。

第二个考虑是优化素数序列的计算。
上式中列出的算法是枚举除数的改进方法。 改进之处是排除偶数,仅检查小于平方的素数的可除性。 候选号码的根。 该算法最困难的部分是对其余mod函数集的计算。 通过优化此功能可以降低复杂度。 但是,还有一种更有效的方法。 让 rn1j+1=r2r3...r pi sqrtPn1 是从最后找到的质数除以3到质数根的质数的残基序列。 我们将形成以下形式的序列

(r_ {i,j + 1} ^ {n})= {(r_ {2} + 2i)\,mod \,P_2,(r_ {3} + 2i)\,mod \,P_3,... \\(r _ {\ pi(\ sqrt {P_ {n-1}})} + 2i)\,mod \,P _ {\ pi(\ sqrt {P_ {n-1}})}},(P_ {n -1} + 2i)\,mod \,P _ {\ pi(\ sqrt {P_ {n-1} + 2i})}}

从开始 i=1 。 如果满足以下条件,则计算最后一项  pi sqrtPn1+2i neq pi sqrtPn1 。 在计算的某些步骤时,余数 rnij+1 等于0,转到下一个序列。 一直进行到找到所有残数都不为零的i为止。 这意味着找到下一个质数。 顺序 rnj+1 必须保存它,直到找到下一个素数。 用于以这种方式计算素数的递归公式转换为:

Pn=Pn1+2 mathbfDt0i mathbfDt0jrnij+1    forall\,n geqslant3


在提出的算法中,简化了操作mod- [R Ĵ + 1 + 2 / P Ĵ + 1 倍数的分隔线。 唯一的例外是新的简单分隔符的出现。 在计算机内存中,实现算法时,有必要将素数数组存储到所求根,以及可变残差数组。 一般意义上的算法复杂度(工作量)可能小于其他已知方法。 其中最复杂的操作是平方根的提取,残差的计算和乘法。 根可以提取到最接近的整数。 要获得残差,您可以使用基于可除性一般规则的有效算法。 乘法仅使用2个相对较小的数字i 。 通过根据i的值分配工作,可以减少算法的时间复杂度。 以这种方式获得的分段筛在多线程计算机上应该可以更快地工作。 但是,由于股息增加,所执行的工作将更大。 您也可以将车轮分解分解“拧入”算法。 使用轮毂的最佳尺寸,可以在n的特定范围内降低复杂度-直到硬件“狂野”降低了速度。

也许有人会派上用场。

Source: https://habr.com/ru/post/zh-CN472036/


All Articles