This repository has been archived on 2025-04-04. You can view files and clone it, but cannot push or open issues or pull requests.
mathematical-algorithms/app/Main.hs

66 lines
1.9 KiB
Haskell
Raw Permalink Normal View History

2025-03-23 16:56:30 +09:00
module Main (main) where
2025-03-23 17:14:24 +09:00
import Control.Exception
2025-03-23 16:56:30 +09:00
import Poly
2025-03-23 17:14:24 +09:00
import System.Random
import System.TimeIt
2025-03-23 17:35:20 +09:00
import Control.Monad
2025-03-30 00:03:39 +09:00
import PolyFast
2025-03-23 12:04:54 +09:00
main :: IO ()
main = do
2025-03-23 17:14:24 +09:00
do
2025-03-23 17:35:20 +09:00
let f :: Poly Int = makePoly [1, 2, 3]
let g :: Poly Int = makePoly [4, 5]
2025-03-23 17:14:24 +09:00
putStrLn $ "f: " <> show f <> ", g: " <> show g
putStrLn $ "f + g: " <> show (f + g)
putStrLn $ "Naive f * g: " <> show (f * g)
putStrLn $ "Karatsuba f * g: " <> show (normalize $ karatsubaMult f g)
putStrLn ""
2025-03-30 00:19:22 +09:00
experimentFor 512
experimentFor 1024
experimentFor 2048
2025-03-30 00:03:39 +09:00
fastKaratsubaFor 4096
fastKaratsubaFor 8192
fastKaratsubaFor 16384
fastKaratsubaFor 32768
fastKaratsubaFor 65536
2025-03-23 17:14:24 +09:00
where
experimentFor n = do
setStdGen $ mkStdGen 10
2025-03-23 17:35:20 +09:00
let randomPoly size = makePoly <$> replicateM size (randomRIO (-100, 100))
2025-03-23 17:14:24 +09:00
putStrLn $ "Size " <> show n
f :: Poly Int <- randomPoly n
g :: Poly Int <- randomPoly n
putStrLn "naive:"
_ <- timeIt $ evaluate (f * g)
putStrLn "Karatsuba:"
2025-03-23 17:35:20 +09:00
_ <- timeIt $ evaluate (karatsubaMult f g)
2025-03-30 00:19:22 +09:00
putStrLn "Fast Karatsuba:"
_ <- timeIt $ evaluate (karatsuba 0 (+) (-) (*) (unwrapPoly f) (unwrapPoly g))
2025-03-23 17:35:20 +09:00
putStrLn "Finished"
2025-03-30 00:19:22 +09:00
putStrLn ""
2025-03-23 17:35:20 +09:00
karatsubaFor n = do
setStdGen $ mkStdGen 10
let randomPoly size = makePoly <$> replicateM size (randomRIO (-100, 100))
putStrLn $ "Size " <> show n
f :: Poly Int <- randomPoly n
g :: Poly Int <- randomPoly n
putStrLn "Karatsuba:"
_ <- timeIt $ evaluate (karatsubaMult f g)
2025-03-23 17:14:24 +09:00
putStrLn "Finished"
2025-03-30 00:19:22 +09:00
putStrLn ""
2025-03-30 00:03:39 +09:00
fastKaratsubaFor n = do
setStdGen $ mkStdGen 10
let randomPoly size = makePoly <$> replicateM size (randomRIO (-100, 100))
putStrLn $ "Size " <> show n
f :: Poly Int <- randomPoly n
g :: Poly Int <- randomPoly n
putStrLn "Fast Karatsuba:"
_ <- timeIt $ evaluate (karatsuba 0 (+) (-) (*) (unwrapPoly f) (unwrapPoly g))
putStrLn "Finished"
2025-03-30 00:19:22 +09:00
putStrLn ""