Posted on 2016/03/30, 10:58 PM By admin22
関数型言語Haskellで、OctaveとSwiftでテストして前回と同様のことをしてみました。
環境: GHC 7.6.3, Haskell for Mac 1.0.3 / Mac 10.10.5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import Control.Monad lsmul :: [Int] -> [Int] ->[[Int]] lsmul [] ys = [] lsmul xs ys = [(map (\n -> n * (head xs)) ys)] ++ (lsmul (tail xs) ys) poly xs ys = foldl (\x -> zipWith (+) x) (take len $ repeat 0) (addz (lsmul xs ys)) where len = length xs + length ys - 1 addz ns = map (\(n, xs) -> (take n $ repeat 0) ++ xs ++ (take (len-n) $ repeat 0)) (zip [0..] ns) loopf n ls = when (n > 0) $ do let xs = foldl (\x -> poly x) [1] [ls, insz(n-1), insz(n-1), insz(n*11-1), insz(n*11-1)] print xs loopf (n-1) xs insz n = [-1] ++ (take n $ repeat 0) ++ [1] main = do loopf 13 [1] |
ghc poly.hs
でコンパイル。
係数の計算は実行速度が遅かったので、13までにしました。
このコードだとOctaveの方が速い。
解の個数はHaskellっぽい手法でシンプルに解を求められます。
./poly
Categories: 未分類 タグ: Haskell