見出し画像

中学の数学 (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 以上になると,ちょっと待たないと計算が終わりません。

コードの無駄を取り除けば,もっと計算ははやくなります。また,別の記事で計算量を小さくすることに挑戦してみましょう。

関連する書籍

[ サイトマップを見る ]

この記事が気に入ったらサポートをしてみませんか?