公式:
说明:
- a 小于等于n
是小于等于a的素数个数
是小于等于n的素数个数
解读:
当a等于0时,上式就是高斯提出的素数定理,当a等于n时上式显然成立。a越大,上式求出的结果越精确,但是a越大越难求,实际使用需权衡考虑。
推导:
- a到n素数个数约为:
- 上式求解很复杂,黎曼素数计数公式推导过程有介绍上式的求解,太过专业,一般人看不懂吧。我们利用欧拉乘积公式处理,上式约等于:
- 再利用积分处理,上式约等于:
误差:
上式还存在一定误差,主要原因有两个,一是欧拉乘积公式本身不够精确,二是用积分代替求和会出现一些偏差。当然,这些都可以优化,但没增加一步优化,就会增加一定的计算量。
程序:
import math
n = 1e15
a = 1e14
pi_a = 3204941750802 #查表可是小于等于a的数组个数为这么多
pi_n = 29844570422669 #查表可是小于等于n的数组个数为这么多
gao_pi_n = (n) / (math.log(n))
print("优化之前的pi_n", gao_pi_n)
my_pi_n = (n - a) / math.log(n) + pi_a
print("优化之后的pi_n", my_pi_n)
print("优化之前的误差", pi_n - gao_pi_n)
print("优化之后的误差", pi_n - my_pi_n)
输出结果:
优化之前的pi_n 28952965460216.79
优化之后的pi_n 29262610664997.11
优化之前的误差 891604962452.2109
优化之后的误差 581959757671.8906
如此看来,效果并不明显,哎哟。