module Data.Array.Repa.Algorithms.Complex
( Complex
, mag
, arg)
where
type Complex
= (Double, Double)
instance Num Complex where
abs x = (mag x, 0)
signum (re, _) = (signum re, 0)
fromInteger n = (fromInteger n, 0.0)
(r, i) + (r', i') = (r+r', i+i')
(r, i) (r', i') = (rr', ii')
(r, i) * (r', i') = (r*r' i*i', r*i' + r'*i)
instance Fractional Complex where
(a, b) / (c, d)
= let den = c^(2 :: Int) + d^(2 :: Int)
re = (a * c + b * d) / den
im = (b * c a * d) / den
in (re, im)
fromRational x = (fromRational x, 0)
mag :: Complex -> Double
mag (r, i) = sqrt (r * r + i * i)
arg :: Complex -> Double
arg (re, im)
= normaliseAngle $ atan2 im re
where normaliseAngle :: Double -> Double
normaliseAngle f
| f < pi
= normaliseAngle (f + 2 * pi)
| f > pi
= normaliseAngle (f 2 * pi)
| otherwise
= f