因数分解

(夜更かし+寝すぎ)続きで頭いたい今日のこの頃。
本日は数学を少々勉強して参りました。・・・この時期にまだ数I終わってないなんて・・・やれやれ、先が思いやれる。

しかし因数分解って難しいすね。中にはホントに解けるのかっ?って問題が・・・。
高3の頃、みんな難しいと嘆いていた数列の方がよっぽど楽だったぞ、これ。
(因みに数列はちょっと得意だった。かも。)
やはり場数を踏まないと。こういうのは慣れ?ですからねぇ。


他に話題無いし、Haskellの勉強ということで、二次方程式因数分解をするプログラムを書く。
(因みに、上で言ってる難しい因数分解ってのはこれのことじゃないです。一応。)


split x = split' x (negate x') x' where
    x' = floor $ sqrt $ realToFrac $ abs x
    split' x y z
        | y > z        = []
        | y == 0       =                split' x (y+1) z
        | mod x y == 0 = (div x y, y) : split' x (y+1) z
        | otherwise    =                split' x (y+1) z

answer ac adBc bd =
    [(a, b, c, d) | (a, c) <- (split ac), (b, d) <- (split bd),
       (a*d + b*c) == adBc || (c*d + b*a) == adBc]

main = print $ answer 12 38 16

実行結果:
[(-4,-8,-3,-2),(-6,-16,-2,-1),(6,16,2,1),(4,8,3,2)]

ついでに、問題を作成するPerlコマンドライン。(WinNT)


perl -Minteger -e"$a=rand(100);$b=rand(100);$c=rand(100);$d=rand(100);print(join(' ',$a*$c,$a*$d+$b*$c,$b*$d));"


流石はHaskell。こんなに楽に書けるとは。
整数を浮動小数点数に変換する方法(realToFrac)が分からなくて2時間悩んだけど(泣)
realToFracっていかにも整数取らなさそうな名前じゃないですか・・・。IntegralがRealのサブクラスだったとは・・・。不覚。