$2$ 以上の自然数 $n$ に対してそれが素数ならTrue
、合成数ならFalse
を返す関数is_prime(n)
を定義して、is_prime(43)
とis_prime(91)
の値を表示してください。
(オプション)可能であれば、下記の注意を反映したコードにすること。
$n$ が自分自身でない $\sqrt{n}$ より大きな約数をもつ場合には、$n$ は $1$ でない $\sqrt{n}$ より小さな約数も必ずもちます。 したがって、割り切れるかどうかを調べるのは、実際には $n-1$ ではなく $\sqrt{n}$ 以下の最大の自然数までで十分であることが分かります。
#オプションに対応していないコード
def is_prime(n):
for m in range(2,n): #m=2からn-1まで繰り返す
if n%m == 0: #nをmで割った余りが0、すなわち、mがnの約数ならば
return False #False(偽)を返す
return True #True(真)を返す(上のfor文で一度もreturnされない場合のみ実行される)
#定義した関数を呼び出すとき、一度returnが実行されると関数の残りの処理は無視されて、元のコードの続きに戻る
print(is_prime(43))
print(is_prime(91))
True False
#オプションに対応したコード
def is_prime(n):
for m in range(2,int(n**(1/2))+1): #int関数を使えば、小数点以下を切り捨てて整数に変換できる(math.floor関数を使ってもよい)
if n%m == 0:
return False
return True
print(is_prime(43))
print(is_prime(91))
True False
演習1で定義した関数is_prime(n)
を用いて、小さい順に $1$ 番目から $20$ 番目の素数を格納したリストを作成してその値を表示してください。
さらに、作成したリストを用いて、素数の番号と値の関係を表すグラフを描画してください。
import matplotlib.pyplot as plt
prime_list = []
N = 20 #最後の番号(変数Nを使うメリットとして、ここの値を変えるだけで実行結果が変わる)
n = 2
while len(prime_list) < N: #リストの要素数がNより少ない間、繰り返す
if is_prime(n): #nが素数ならば
prime_list.append(n) #nをリストの末尾に追加する
n = n+1
print(prime_list)
plt.plot(range(1,N+1),prime_list,'.-') #点付きの折れ線グラフを描画する
plt.grid()
plt.xticks(range(0,N+1,5))
plt.title("Prime numbers")
plt.show()
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]