これまでの授業で学んできたように、Pythonでは処理の繰り返しを行うためにfor文とwhile文が用意されています。
for文は決まった回数の繰り返し、while文はある条件が成り立つ間の繰り返しを行うものですが、通常の終了の前に繰り返しを強制的に終了する必要がある場合にはbreak
を使用します。
次のコードのように、基本的には何かしらの条件判定を行うif文を入れてその中にbreak
を書きます。
result = 1
for n in range(1,100):
result = result*n
if result >= 5000:
break #for文を強制的に終了
print("条件「nの階乗が5000以上」を満たす最小のnは",n)
print("その階乗の値は",result)
条件「nの階乗が5000以上」を満たす最小のnは 7 その階乗の値は 5040
なお、for文またはwhile文のネスト(入れ子)の場合は、break
を実行する最も内側の繰り返しのみが強制的に終了されます。
素数(prime number)は、正の約数が $1$ と自分自身のみであるような $2$ 以上の自然数のことです。$2$ 以上の自然数のうち素数でないものを、合成数(composite number)と呼びます。
与えられた $2$ 以上の自然数が素数であるかどうかを判定する方法はいくつか知られていますが、最もシンプルな考え方に基づいた方法として試し割り法(trial division)があります。
試し割り法においては、与えられた $2$ 以上の自然数 $n$ に対して、$n$ が $2$ から $n-1$ までの数で割り切れるかどうかを小さい順に調べます。いずれかの数で割り切れれば $n$ は合成数であり、どの数でも割り切れなければ $n$ は素数という結論になります。
import random
n = random.randint(2,100) #2以上100以下のランダムな整数を与える
print(n)
flag = True #素数判定のためのフラグ(bool型の変数) Trueは真
for m in range(2,n): #m=2からn-1まで繰り返す
if n%m == 0: #nがmで割り切れるなら(%は余りを求める演算子)
print(m,"で割り切れるので、合成数である")
flag = False #フラグをFalse(偽)にする
break #for文を強制的に終了
if flag: #bool型の変数を使った条件判定
print("素数である")
77 7 で割り切れるので、合成数である
$n$ が自分自身でない $\sqrt{n}$ より大きな約数をもつ場合には、$n$ は $1$ でない $\sqrt{n}$ より小さな約数も必ずもちます。
したがって、割り切れるかどうかを調べるのは、実際には $n-1$ ではなく $\sqrt{n}$ 以下の最大の自然数までで十分であることが分かります。
$2$ 以上の自然数 $n$ に対してそれが素数ならTrue
、合成数ならFalse
を返す関数is_prime(n)
を定義して、is_prime(43)
とis_prime(91)
の値を表示してください。
(オプション)可能であれば、上記の注意を反映したコードにすること。
#演習1のコード
def is_prime(n):
#ここに、関数の処理を書く
#合成数ならreturn Falseとする
return True
print(is_prime(43))
print(is_prime(91))
演習1で定義した関数is_prime(n)
を用いて、小さい順に $1$ 番目から $20$ 番目の素数を格納したリストを作成してその値を表示してください。
さらに、作成したリストを用いて、素数の番号と値の関係を表すグラフを描画してください。
#演習2のコード
import matplotlib.pyplot as plt
prime_list = []
#ここで、prime_listに要素を追加する
#while文とif文を使うとよい
print(prime_list)
#ここで、グラフの描画を行う
演習1~演習2に取り組んでください。