I have this fairly short code segment that causes ghc to run out of
memory when I use -O2 (even with -H128M). Is this just the large-ish
expression in `discriminant', or have I tickled a bug? If I comment
out `discriminant', it works (without needing to specify a -H).
Code is as follows:
module Testing where
mod0 :: Integral a => a -> a -> a
mod0 x 0 = x
mod0 x y = mod x y
data Curve = EC Int Int Int Int Int
deriving (Eq,Show)
b2 :: Int -> Curve -> Int
b4 :: Int -> Curve -> Int
b6 :: Int -> Curve -> Int
b8 :: Int -> Curve -> Int
b2 p (EC a1 a2 a3 a4 a6) = (a1 `mod0` p * a1 `mod0` p + 4 * a2 `mod0` p) `mod0` p
b4 p (EC a1 a2 a3 a4 a6) = (a1 `mod0` p * a3 `mod0` p + 2 * a4 `mod0` p) `mod0` p
b6 p (EC a1 a2 a3 a4 a6) = (a3 `mod0` p * a3 `mod0` p + 4 * a6 `mod0` p) `mod0` p
b8 p (EC a1 a2 a3 a4 a6) = ( a1 `mod0` p * a1 `mod0` p * a6 `mod0` p
- a1 `mod0` p * a3 `mod0` p * a4 `mod0` p
+ 4 * a2 `mod0` p * a6 `mod0` p
+ a2 `mod0` p * a3 `mod0` p * a3 `mod0` p
- a4 `mod0` p * a4 `mod0` p) `mod0` p
discriminant :: Int -> Curve -> Int
discriminant p curve = (9*!b2p*!b4p*!b6p) -! (b2p*!b2p*!b8p) -! (8*!b4p*!b4p*!b4p)
-! (27*!b6p*!b6p)
where b2p = b2 p curve
b4p = b4 p curve
b6p = b6 p curve
b8p = b8 p curve
(*!) x y = (x * y) `mod0` p
(+!) x y = (x + y) `mod0` p
(-!) x y = (x - y) `mod0` p
infixl 7 *!
infixl 6 +!, -!
(sorry for the long lines).
It compiles fine with just -O.
This is with the released 4.06 ghc from RPM; I haven't got the cvs
source to build yet (make boot dies looking for `happy-inplace').
It's been a good way to test that new dimm I've just bought anyway!
Cheers,
M.