Rubyでは、このInteger#lcm
メソッドを使用して、2つの数値の最小公倍数を取得できることを知っています。例えば:
10.lcm(15)
# => 30
特定の配列内のすべての整数の最小公倍数を取得するための効率的な(またはコアまたはstdlibに組み込まれている)方法はありますか?例えば:
[5, 3, 10, 2, 20].lcm
# => 60
Rubyでは、このInteger#lcm
メソッドを使用して、2つの数値の最小公倍数を取得できることを知っています。例えば:
10.lcm(15)
# => 30
特定の配列内のすべての整数の最小公倍数を取得するための効率的な(またはコアまたはstdlibに組み込まれている)方法はありますか?例えば:
[5, 3, 10, 2, 20].lcm
# => 60
2つのオペランドをとる操作は、コレクションを折りたたむことで繰り返し適用できます:Enumerable#inject/reduce。空の場合をカバーするために、最初の引数として、最小公分母用の操作の単位元を渡します。1
[5, 3, 10, 2, 20].reduce(1) { |acc, n| acc.lcm(n) } # => 60
これは次のように書くこともできます:
[5, 3, 10, 2, 20].reduce(1, :lcm)
toklandの答えに加えて、メソッドが整数#lcm
の配列に作用するようにしたい場合は、インスタンスメソッドをArrayクラスに追加できます。
class Array
def lcm
self.reduce(1, :lcm)
end
end
puts 10.lcm(15)
# => 30
puts [5,3,10,2,20].lcm
# => 60
(この方法は、実行時にクラスを拡張するため、モンキーパッチと呼ばれます。ただし、この方法に眉をひそめる人もいます。)
[5,3,10,2,20].reduce(&:lcm)