2015年7月19日日曜日

150719

Ruby


Aliquot sequence(1)

オンライン整数列大辞典の
A000203(http://oeis.org/A000203/list)、
A003023(http://oeis.org/A003023/list)
と比較し、答え合わせしてみる。

# Catalanの予想が正しいと仮定
require 'prime'

def power(a, n)
  return 1 if n == 0
  k = power(a, n >> 1)
  k *= k
  return k if n & 1 == 0
  return k * a
end

def sigma(i)
  sum = 1
  pq = i.prime_division
  pq.each{|a, n| sum *= (power(a, n + 1) - 1) / (a - 1)}
  sum
end

def aliquot(i)
  a_ary = []
  j = sigma(i) - i
  while !a_ary.include?(j) && !(j == 0)
    a_ary.push(j)
    j = sigma(j) - j
  end
  return a_ary.size if a_ary.include?(i) || j == 0
  return a_ary.size + 1
end

def A000203(n)
  (1..n).map{|i| sigma(i)}
end
ary = A000203(70)

# OEIS A000203のデータ
ary0 =
[1,3,4,7,6,12,8,15,13,18,12,28,14,24,24,31,18,39,
 20,42,32,36,24,60,31,42,40,56,30,72,32,63,48,54,
 48,91,38,60,56,90,42,96,44,84,78,72,48,124,57,93,
 72,98,54,120,72,120,80,90,60,168,62,96,104,127,84,
 144,68,126,96,144]
# 一致の確認
p ary == ary0

def A003023(n)
  (1..n).map{|i| aliquot(i)}
end
ary = A003023(102)

# OEIS A003023のデータ
ary0 =
[0,1,1,2,1,1,1,2,3,3,1,6,1,4,4,5,1,3,1,6,2,5,1,4,
 2,6,2,1,1,14,1,2,5,7,2,3,1,6,2,3,1,13,1,4,6,7,1,5,
 3,2,3,8,1,12,2,4,2,3,1,10,1,8,2,3,2,11,1,4,3,5,1,
 8,1,4,4,4,2,10,1,6,4,5,1,5,2,8,6,6,1,9,3,5,3,3,3,
 8,1,2,3,4,1,17]
# 一致の確認
p ary == ary0

# 完全数のとき
p aliquot(6)     # [6]より1
# 友愛数のとき
p aliquot(220)   # [284, 220]より2
# 社交数のとき
p aliquot(12496) # [14288, 15472, 14536, 14264, 12496]より5

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。