![見出し画像](https://assets.st-note.com/production/uploads/images/62744061/rectangle_large_type_2_a0f82874603daeb9cce59265d0a2e124.png?width=1200)
Pythonで区間ごとの素数の数を数える
素数の数がいくつあるかというのは、興味深いものです。そこで区間ごとにいくつ素数が分布しているかを調べるプログラムをつくります。
詳しくは、Pythonで素数の計算をする、をご参照ください。
10000までの素数を収めるリストの作成
import sympy
prime_l=list(sympy.primerange(2,10000))
print(prime_l)
print(len(prime_l))
defaultdictを使いリストから1000毎に素数を集計
import collections
d=len(str(max(prime_l)))
p_dict=collections.defaultdict(int)
interval=1000
for i in prime_l:
temp=int((i-1e-6)//interval)*interval
cls=f'{str(temp+1):>{d}}'+'-'+f'{str(temp+interval):>{d+2}}'
p_dict[cls]+=1
p_dict_s=dict(sorted(p_dict.items(), key=lambda x:x[0]))
p_dict_s
{' 1- 1000': 168,
'1001- 2000': 135,
'2001- 3000': 127,
'3001- 4000': 120,
'4001- 5000': 119,
'5001- 6000': 114,
'6001- 7000': 117,
'7001- 8000': 107,
'8001- 9000': 110,
'9001- 10000': 112}
値が大きくなるにしたがって、少しずつ減っていくことがわかります。最後にsympyモジュールで結果を確認します。
import sympy
total=0
for i in range(10):
cnt=len(list(sympy.primerange(i*1000+1,(i+1)*1000+1)))
print(cnt)
total+=cnt
print(total)
168
135
127
120
119
114
117
107
110
112
1229
正しく計算されていることがわかりました。