発想
ある自然数について、それより小さい素数で割り切れなければ、その自然数は素数である。
という発想でプログラムを書いてみました。
あるリストを用意しておいて、素数をつぎつぎとそのリストに保存していきました。
コード
import time
primes_list = [] # このリストに素数を保存していく
upper_lim = 10000 # テキトーな数を設定
start_time = time.time() # 開始時刻を記録
for integer in range(2, upper_lim + 1, 1): # 2-10000の整数に対して、
if len(primes_list) < 1 : # primes_listが空だったら、
primes_list.append(integer) # primes_listにinteger(=2)を追加する
else: # その他の場合(本題)、
is_divisible = False # integerが割り切れない、つまり素数であることを仮定する
for prime in primes_list: # 今までに保存された全ての素数"prime"について、
if integer % prime == 0: # integerがprimeで割り切れるならば
is_divisible = True # 割り切れます(つまり素数じゃない)
break # そしたらもうこのforはやる意味がないです。
# integerが合成数ならどっかのprimeでis_divisible = Trueになる
if not is_divisible: # すべてのprimeについてこの判定をしたのち、それでもなおis_divisible = Falseならばもうそれは素数
primes_list.append(integer) # integerを素数として認め、primes_listに追加する
print(primes_list)
print(len(primes_list), "prime numbers foud.")
elapsed_time = time.time() - start_time # 経過時間 = 現在時刻 - 開始時刻
print ("run time: {0}".format(elapsed_time) + " seconds")
出力:
$ python prime_numbers.py
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
(...省略...)
9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973]
1229 prime numbers foud.
run time: 0.0615689754486084 seconds
実行時間について
- $10^2$まで探索: 0.0001 sくらい
- $10^3$まで探索: 0.001 sくらい
- $10^4$まで探索: 0.06 sくらい
- $10^5$まで探索: 4 sくらい
- $10^6$まで探索: 240 s = 4 minくらい
- $10^7$以降: ??? 数時間くらい?
環境は
- MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports)
- プロセッサ:2.4 GHz クアッドコアIntel Core i5
- メモリ:16 GB 2133 MHz LPDDR3