
中学の数学 (9) 完全数を python で探そう
[ サイトマップを見る ]
完全数
今日学ぶこと
完全数を Python で探す。
6 の約数は,1, 2, 3, 6 です。このうち,一番大きな 6 を除いた 1, 2, 3 を足します。6 になります。このような約数をもっている数のことを完全数といいます。
8 は完全数でしょうか?計算してみましょう。
8の約数は,1, 2, 4, 8 です。8を除いた,1, 2, 4 を足し合わせると 7 になります。もとの数とは一致しません。8 は完全数ではありません。
9 は完全数でしょうか?計算してみましょう。
9 の約数は,1, 3, 9 です。9 を除いた,1, 3 を足しあわせると4になります。下の数とは一致しません。9 は完全数ではありません。
6 以外に完全数はあるのでしょうか。Python で完全数を探すコードを書いてみましょう。
以前に素数をみつけるコードを書きました。
import math
def is_prime_number(n):
l = []
l.append(1)
for i in range(2, math.floor(n/2)+1):
if n % i == 0:
l.append(i)
l.append(n)
return(len(l) == 2)
l = []
for i in range(2,1001):
if is_prime_number(i):
l.append(i)
print(l)
このコードはすべての約数をリスト l に入れるというコードです。完全数を見つけるためには,一番大きな約数はいらないので,含めないようにします。リストを足し合わせて,もとの数と一致するか確認すれば,完全数かどうかを判定するコードがかけます。
次のコードです。
import math
import sys
def is_perfect_number(n):
l = []
l.append(1)
for i in range(2, math.floor(n/2)+1):
if n % i == 0:
l.append(i)
return(sum(l) == n)
l = []
for i in range(2, int(sys.argv[1])+1):
if is_perfect_number(i):
l.append(i)
print(l)
引数に数字を書くことで, 1 からどこまで探すか指定できます。下の例は,1 から 1000 までの間にある完全数を表示させています。
python3 perfect.py 1000
1000まででしたら,ほとんど実行に時間はかかりません。次のように出力されます。1000までの間には3個しかないようです。6 と 28 と 496 です。
[6, 28, 496]
10000までも,ほとんど時間はかからないでしょう。しかし,100000 以上になると,ちょっと待たないと計算が終わりません。
コードの無駄を取り除けば,もっと計算ははやくなります。また,別の記事で計算量を小さくすることに挑戦してみましょう。
関連する書籍
[ サイトマップを見る ]