【问题标题】:Prime Number Theorem Python素数定理 Python
【发布时间】:2014-11-23 17:12:21
【问题描述】:

我试图通过使用附加代码来支持素数定理。我想以某种方式证明小于 n 的素数之间的平均差距是 log(n)。我现在拥有的代码可以确定某个数字是否为素数,然后第二部分计算我范围内每个连续素数的素数差距。关于如何使用以下代码在 python 中进行的任何想法?

from pylab import *

def Is_Prime (n):
    if n==1:
        return False
    if n == 2 or n == 3:
        return True
    if n == 4:
        return False
    if n%2 == 0 or n%3 == 0:
        return False

    for i in range(5,int(n**0.5)+1,6):
        if n%i == 0 or n%(i+2) == 0:
            return False

    return True

k = 0
for i in range (1,100):
    if Is_Prime(i) == True:
        print(i)
        k+=1
print "Total number of prime numbers in [1,100] is", k


previous = 2
n = 0
for i in range(3,100000):
    if Is_Prime(i):
        n = n+1
        current  = i
        gn = current - previous
            print gn
        plot(n,gn,'rs')
        xlabel('n')
        ylabel('g(n)')
        previous = i
        if n == 100:
            break

show()

【问题讨论】:

  • 什么不完全有效? :) 如果您想加快主要列表的创建速度,请考虑使用埃拉托色尼筛:en.wikipedia.org/wiki/Sieve_of_Eratosthenes
  • 我上面的代码工作正常。我希望添加一些东西来找到平均质数差距,但我不知道如何。

标签: python-2.7 primes


【解决方案1】:

我对如何执行此操作的建议(与您当前的代码相关)如下:

previous = 2
n = 0
for i in range(3,10000000):
    if Is_Prime(i):
        n = n+1
        current  = i
        gn = current - previous
        previous = i
        if n % 1000 == 0:
            print "Now at the gap between prime",n,"and prime",n+1
            average_gap = (i-2)/float(n);
            # (n+1)st prime is i, 1st prime is 2. n gaps.
            # float(n) so that we get float, not int division!
            print "Average gap so far:", average_gap
            print "ln(p)/average_gap:", math.log(i) / average_gap
        if n % 100000 == 0:
            break

请注意,到第 10000 个素数时,我们的比率只有 1.1 ish……到第 100000 个素数时,我们仍然是 1.0831。

接近 1 需要很长时间。这部分是因为它实际上更接近于 Li(n) 函数的倒数:http://en.wikipedia.org/wiki/Logarithmic_integral_function(-因为n 周围的间隙长度约为 @987654327 @...所以低于n 的素数的总密度更合适地是这个的积分...但是对于大的nLi(n) ~ log(n),所以它起作用了)。

(见http://en.wikipedia.org/wiki/Prime_number_theorem右边的第一张图——蓝线代表你将得到的比率,紫色线代表你使用对数积分得到的比率)

另外,(正如我在评论中所建议的那样),看看使用筛子生成素数也会更快 很多 - 例如,请参见此处:@ 987654323@ ...

但是上面的代码有效(至少对我来说)!无论如何,祝你未来的主要努力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2020-11-03
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2015-01-22
    相关资源
    最近更新 更多