用Python研究质数分布情况

质数又称素数,是指一个大于1的自然数,除了1和它本身没有任何因数的数。那么如何用Python算出一个范围内质数的数量及同这个范围内所有自然数之比呢?我在这里以50000为例。

首先,我们得做一个“质数判断器”。质数就是除了1和它本身没有任何因数的数。因为一个数的因数一定小于或等于这个数,所以我们只要把1到这个数之间的所有数挨个儿用这个数除一遍,看看有没有能整除的,如果有,那么这个数就是合数;如果没有,那么这个数就是质数。函数示例如下:

def prime_judgementer(number):
    for i in range(1,number+1):
        if number%i == 0 and i != number:  #条件:如果这个数除以一个小于或等于它的数,余数是0,而且这两个数不相等
            return False  #那么这个数就是合数
    return True  #如果把1到这个数之间的所有数挨个儿用这个数除了一遍,还是没有能整除的,那么这个数就是质数

接着,我们用for循环把1到50000以内的所有自然数都用质数判断器判断一次,如果是质数就存在列表里。代码如下:

li = []
t1 = 50000
for j in range(2,t1):
    if prime_judgementer(j):
        li.append(j)

然后,我们要每判断10000个数就报告一次,因为等到算到上十万的数时,电脑可能需要时间,你要实时查看电脑算到哪儿了。代码如下:

li = []
t1 = 50000
t2 = 1
for j in range(2,t1):
    if j%10000 == 0:
        print("have arrived"+str(t2*10000))
        t2 += 1
    if prime_judgementer(j):
        li.append(j)

最后我们算出结果,并把结果保留一位小数。当然,如果只有一位小数,就不用做这件事了。代码如下:

percentage = round(len(li)/t1*100,1)
print(str(percentage)+"%")

完整代码如下: 

 

def prime_judgementer(number):
    for i in range(2,number+1):
        if number%i == 0 and i != number:
            return False
    return True

li = []
t1 = int(input())
t2 = 1
for j in range(2,t1):
    if j%10000 == 0:
        print("have arrived"+str(t2*10000))
        t2 += 1
    if prime_judgementer(j):
        li.append(j)

print(len(li))
percentage = round(len(li)/t1*100,1)
print(str(percentage)+"%")

 

结果如下:

  • 100以内:25%
  • 200以内:23%
  • 300以内:20.7%
  • 400以内:19.5%
  • 500以内:19%
  • 750以内:17.6%
  • 1000以内:16.8%
  • 1500以内:15.9%
  • 2000以内:15.2%
  • 3500以内:14.0%
  • 5000以内:13.4%
  • 1万以内:12.3%
  • 1.5万以内:11.7%
  • 2万以内:11.3%
  • 5万以内:10.3%
  • 10万以内:9.6%
  • 20万以内:9%
  • 35万以内:8.6%
  • 50万以内:8.3%
  • 75万以内:8%
  • 100万以内:7.8%
  • 150万以内:7.6%
  • 200万以内:7.4%
  • 300万以内:7.2%
  • 350万以内:7.1%

最后,如果我的代码有错误,请在评论区告诉我。我还是一个小学生,代码难免有误,请大家多多指正!