Project Eulerで使った階乗/約数/過剰数/不足数/完全数/友愛数(親和数)のまとめ

Project Eulerで使ったメソッドをまとめてみました
特にProject Eulerやっている人には便利だと思うのでぜひ使ってみてください。
(コレを使ったらほとんど答えになるので、自分で正解出した後でこんなやり方もあるんだ程度で。。←ツッコミどころ満載です)

require 'mathn'

class Integer
	# 階乗
	def fact
		(1..self).inject(:*)
	end
	# 約数
	def divisor
		array = []
		self.prime_division.each do |a|
			a[1].times do
				array.push(a[0])
			end
		end
		d = [1, self]
		1.upto(array.size - 1) do |n|
			array.combination(n).to_a.each do |c|
				d.push(c.inject(:*))
			end
		end
		d.uniq.sort
	end
	# 約数の和(自分自身を除く)
	def divisor_sum
		self.divisor.inject(:+) - self
	end
	# 完全数
	def perfect?
		self == self.divisor_sum
	end
	# 友愛数
	def amicable?
		!self.perfect? && self == self.divisor_sum.divisor_sum
	end
	# 過剰数
	def abundant?
		self < self.divisor_sum
	end
	# 不足数
	def deficient?
		self > self.divisor_sum
	end
end

使い方

p 6.fact
p 6.divisor
p 6.divisor_sum
p 6.perfect?
p 284.amicable?
p 12.abundant?
p 10.deficient?

出力

720
[1, 2, 3, 6]
6
true
true
true
true