module Numeric.Functions.Theta (
qpar,
theta1,
theta2,
theta3,
theta4
) where
import Data.Complex
import Control.Exception
theta1 :: (RealFloat a) => Integer -> Complex a -> Complex a -> Complex a
theta1 n q u = (* 2) . sum $ map (theta1_arg q u) [0..n]
theta1_arg :: (RealFloat a) => Complex a -> Complex a -> Integer -> Complex a
theta1_arg q u nn = (signfun nn) * (qfun2 q nn) * (sinfun u (2 * nn + 1))
theta2 :: (RealFloat a) => Integer -> Complex a -> Complex a -> Complex a
theta2 n q u = (* 2) . sum $ map (theta2_arg q u) [0..n]
theta2_arg :: (RealFloat a) => Complex a -> Complex a -> Integer -> Complex a
theta2_arg q u nn = (qfun2 q nn) * (cosfun u (2 * nn + 1))
theta3 :: (RealFloat a) => Integer -> Complex a -> Complex a -> Complex a
theta3 n q u = (+ 1) . (* 2) . sum $ map (theta3_arg q u) [1..n]
theta3_arg :: (RealFloat a) => Complex a -> Complex a -> Integer -> Complex a
theta3_arg q u nn = (qfun1 q nn) * (cosfun u (2 * nn))
theta4 :: (RealFloat a) => Integer -> Complex a -> Complex a -> Complex a
theta4 n q u = (+ 1) . (* 2) . sum $ map (theta4_arg q u) [1..n]
theta4_arg :: (RealFloat a) => Complex a -> Complex a -> Integer -> Complex a
theta4_arg q u nn = (signfun nn) * (qfun1 q nn) * (cosfun u (2 * nn))
qpar :: RealFloat a => a -> Complex a
qpar tau
| tau > 0 = exp $ (pi :+ 0) * (0 :+ tau) * (0 :+ 1)
| otherwise = throw $ ErrorCall "tau should be > 0 !"
signfun :: (RealFloat a) => Integer -> Complex a
signfun nn
| odd nn = ((1) :+ 0)
| otherwise = (1 :+ 0)
sinfun :: (RealFloat a) => Complex a -> Integer -> Complex a
sinfun u n = sin $ u * fromInteger n
qfun2 :: (RealFloat a) => Complex a -> Integer -> Complex a
qfun2 q n = q ** (0.5 + fromInteger n) ** 2
cosfun :: (RealFloat a) => Complex a -> Integer -> Complex a
cosfun u n = cos $ u * fromInteger n
qfun1 :: (RealFloat a) => Complex a -> Integer -> Complex a
qfun1 q n = q ** (fromInteger n) ** 2