因数分解
(夜更かし+寝すぎ)続きで頭いたい今日のこの頃。
本日は数学を少々勉強して参りました。・・・この時期にまだ数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のサブクラスだったとは・・・。不覚。