整数を2数の積に分ける/約数を求める

例えば 48 は、2 * 24, 3 * 16, 4 * 12, 6 * 8 に分けられますね。これを Ruby の Integer#divide2 メソッドとして実装しました。ペアを配列に格納して返します(そのようなペアがなければ、空の配列を返します)。引数に true を取れば、自明な 1 * 48 のようなペアも含みます。

class Integer
  def divide2(include1=false)
    ar = []
    s = include1 ? 1 : 2 
    for i in s..(self ** 0.5)
      ar.push([i, self / i]) if (self % i).zero?
    end
    ar
  end
end

p 48.divide2          #=>[[2, 24], [3, 16], [4, 12], [6, 8]]
p 15.divide2(true)    #=>[[1, 15], [3, 5]]

これを使って、与えられた自然数のすべての約数が求められます。Integer#divisors_int メソッドです。

class Integer
  def divisors_int
    divide2(true).flatten.uniq.sort
  end
end

p 150.divisors_int    #=>[1, 2, 3, 5, 6, 10, 15, 25, 30, 50, 75, 150]
p 87656797765.divisors_int
#=>[1, 5, 63533, 275941, 317665, 1379705, 17531359553, 87656797765]

Ruby に約数を求めるメソッドがないのにはちょっと驚きました。たいていのものは揃っているので。