以前の記事の続きとして、せっかくなので友愛数・完全数・婚約数を求めてみたい。
約数関数(再掲)
divisor(n)として約数関数を使うので、再掲しておく。
sympyを使う。
import sympy
def divisor(n):
factors = sympy.factorint(n)
rst = 1
for i,j in factors.iteritems():
rst *= (pow(i,j+1) - 1)/(i-1)
return rst
完全数(かんぜんすう,英: perfect number)とは、自分自身を除く正の約数の和に等しくなる自然数のことである。完全数の最初の3個は 6 (= 1 + 2 + 3)、28 (= 1 + 2 + 4 + 7 + 14)、496 (= 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248) である。「完全数」は「万物は数なり」と考えたピタゴラスが名付けた数の一つであることに由来する[1]が、彼がなぜ「完全」と考えたのかについては何も書き残されていないようである
wikipedia:完全数
max = 100000
rst = []
for n in range(1,max+1):
if divisor(n) == 2*n:
rst.append(n)
rst =
[6, 28, 496, 8128]
友愛数(ゆうあいすう、英: amicable numbers)とは、異なる 2 つの自然数の組で、自分自身を除いた約数の和が、互いに他方と等しくなるような数をいう。親和数(しんわすう)とも呼ばれる。
最小の友愛数の組は (220, 284) である。
220 の自分自身を除いた約数は、1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 で、和は 284 となる。一方、284 の自分自身を除いた約数は、1, 2, 4, 71, 142 で、和は 220 である。
wikipedia:友愛数
max = 100000
rst = []
for n in range(1,max+1):
pair = divisor(n) - n
if n < pair and pair <= max:
if divisor(pair) - pair == n:
rst.append([n,pair])
rst =
[[220, 284],
[1184, 1210],
[2620, 2924],
[5020, 5564],
[6232, 6368],
[10744, 10856],
[12285, 14595],
[17296, 18416],
[63020, 76084],
[66928, 66992],
[67095, 71145],
[69615, 87633],
[79750, 88730]]
婚約数
婚約数(こんやくすう、英: betrothed numbers)とは、異なる 2 つの自然数の組で、1 と自分自身を除いた約数の和が、互いに他方と等しくなるような数をいう。準友愛数(じゅんゆうあいすう、quasi-amicable numbers)とも呼ばれる。
最小の婚約数の組は (48, 75) である。
48 の 1 と自分自身を除いた約数は、2, 3, 4, 6, 8, 12, 16, 24 で、和は 75 となる。一方、75 の 1 と自分自身を除いた約数は、3, 5, 15, 25 で、和は 48 である。
wikipedia:婚約数
max = 100000
rst = []
for n in range(1,max+1):
pair = divisor(n) - n - 1
if n < pair and pair <= max:
if divisor(pair) - pair - 1 == n:
rst.append([n,pair])
rst =
[[48, 75],
[140, 195],
[1050, 1925],
[1575, 1648],
[2024, 2295],
[5775, 6128],
[8892, 16587],
[9504, 20735],
[62744, 75495]]