素因数分解
昨日は素数をやったので,今日はそれを使って素因数分解をしました.
とりあえず,こんなんです.特に変な事はしてません.
class Integer def prime? return false if self < 2 (2 ... self).each{|x| # 割り切れたら素数じゃない return false if self % x == 0 } true end def factor primes = [] # 素数なら配列に突っ込んで返す return primes.push(self) if self.prime? # 1以下の数なら素因数分解出来ないので空の配列を返す return primes if self < 2 n = self # 2から順番に,素数で割っていく (2 ... n).each{|p| if p.prime? while n % p == 0 primes.push(p) n = n / p end end break if n == 1 } primes end end
実際にirbで試してみます.
> 18.factor => [2, 3, 3] > 256.factor => [2, 2, 2, 2, 2, 2, 2, 2] > 2314521.factor => [3, 3, 3, 11, 7793]
最後のは,変に時間がかかりました.普通に繰り返し処理ってのは重たいもんなんですね.たぶん.こーゆー関数は,コンパイルしてバイナリにしてやらないと処理がキツいかも.柔軟性を考えたら総当たりじゃないといけないからなぁ.ちなみに,ウチの環境では
30923475.factor
が,なかなか帰ってきません.コマンドラインから実行できるfactorなら一瞬なんですけどね.