見出し画像

Pythonで完全数を計算する

完全数の計算に特化した約数の合計を計算する関数

完全数とは、自身が自分自身を除く正の約数の和に等しくなる正の整数のことを指します。1番小さな完全数は6になりますが、n=6について自身6以外の約数は1,2,3となりその合計は6になります。よって、正の整数nに対して正の約数の合計が2nになるものと考えた方が分かりやすい場合もあります。

画像1

ここで完全数の計算をするための関数を作成します。

def divisor_perfect(num):
   cnt = 1
   total = 1
   for i in range(2, int(num**0.5)+1):
       if num % i == 0:
           cnt += 1
           total += i
           if i**2 == num:
               continue
           cnt +=1
           total+=(int(num/i))  
   return cnt,total
                           
divisor_perfect(6)

#(3,6)

上記の通り、正の整数numの約数の個数と合計を計算しますが、自分自身はカウントしません。

完全数を求める

divisor_perfect関数があれば、すぐに計算できます。ここでは10000までの完全数を求めます。

max=10000
for i in range(2, max+1):
   _,total = divisor_perfect(i)
   if  total == i:
       print (i,end=',')
       
 #6,28,496,8128

そんなに多くありません。これ以上は相当大きな数字となり、計算量が多くなるので、これ以上の完全数は次の通りです。

33550336,
8589869056,
137438691328,
2305843008139952128,
2658455991569831744654692615953842176,
191561942608236107294793378084303638130997321548169216,
13164036458569648337239753460458722910223472318386943117783728128,
14474011154664524427946373126085988481573677491474835889066354349131199152128
急速に巨大な数値になります。

完全数の性質

完全数は、1,2,3・・・のように連続する整数の和で計算することができます。

詳しくは、次をご参照ください。

Pythonによる完全数の計算

def sum_up(num):
   total = 0
   for i in range(1,num+1):
       total+=i
   return total    
print(sum_up(3))  
print(sum_up(7))
print(sum_up(31))
print(sum_up(127))
print(sum_up(8191))
print(sum_up(131071))
print(sum_up(524287))

6
28
496
8128
33550336
8589869056
137438691328

全て完全数になります。同様に、奇数の正の整数の3乗の和でも表すことができます。

def sum_up(num):
   total = 0
   for i in range(1,num+1,2):
       total+=i**3
   return total    
print(sum_up(3))  
print(sum_up(7))
print(sum_up(15))
print(sum_up(127))
print(sum_up(511))
print(sum_up(1023))

計算結果は完全数になります。ほかにも面白いことが起こりそうです。上記の計算の3,7,15・・・という数字も意味がありそうです。




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