10000までの完全数を列挙せよ

エラトステネスの篩もよいけれど、別の問題もやろうよ。ということで「完全数」です。

def perfect(n = 100, &block)
  sum = Array.new(n + 1, 1)
  (2..n).each do |i|
    if i == sum[i]
      block.call(i)
    end
    k = i + i
    while k <= n
      sum[k] += i
      k += i
    end
  end
  sum
end

perfect(10000) do |k|
  print "#{k}, "
end
#=> 6, 28, 496, 8128,

あらら? エラトステネスの篩とほぼ同じになっちゃった♪

追記:おお、Danさんが反応してくださいました。感謝です♪