module Math.EllipticIntegrals.Internal
  where
import Data.Complex ( realPart, Complex(..) )

type Cplx = Complex Double

toCplx :: Double -> Cplx
toCplx :: Double -> Cplx
toCplx Double
x = Double
x forall a. a -> a -> Complex a
:+ Double
0.0

getPhiK :: Cplx -> (Cplx, Int)
getPhiK :: Cplx -> (Cplx, Int)
getPhiK Cplx
phi
  | forall a. Complex a -> a
realPart Cplx
phi forall a. Ord a => a -> a -> Bool
> forall a. Floating a => a
piforall a. Fractional a => a -> a -> a
/Double
2 =
    forall a. (a -> Bool) -> (a -> a) -> a -> a
until (\(Cplx
x,Int
_) -> forall a. Complex a -> a
realPart Cplx
x forall a. Ord a => a -> a -> Bool
<= forall a. Floating a => a
piforall a. Fractional a => a -> a -> a
/Double
2) (\(Cplx
x,Int
k) -> (Cplx
xforall a. Num a => a -> a -> a
-forall a. Floating a => a
pi,Int
kforall a. Num a => a -> a -> a
+Int
1)) (Cplx
phi,Int
0)
  | forall a. Complex a -> a
realPart Cplx
phi forall a. Ord a => a -> a -> Bool
< -forall a. Floating a => a
piforall a. Fractional a => a -> a -> a
/Double
2 =
    forall a. (a -> Bool) -> (a -> a) -> a -> a
until (\(Cplx
x,Int
_) -> forall a. Complex a -> a
realPart Cplx
x forall a. Ord a => a -> a -> Bool
>= -forall a. Floating a => a
piforall a. Fractional a => a -> a -> a
/Double
2) (\(Cplx
x,Int
k) -> (Cplx
xforall a. Num a => a -> a -> a
+forall a. Floating a => a
pi,Int
kforall a. Num a => a -> a -> a
-Int
1)) (Cplx
phi,Int
0)
  | Bool
otherwise = (Cplx
phi,Int
0)

atanC :: Cplx -> Cplx
atanC :: Cplx -> Cplx
atanC Cplx
z = Cplx
i forall a. Num a => a -> a -> a
* (forall a. Floating a => a -> a
log(Cplx
1forall a. Num a => a -> a -> a
-Cplx
iforall a. Num a => a -> a -> a
*Cplx
z) forall a. Num a => a -> a -> a
- forall a. Floating a => a -> a
log(Cplx
1forall a. Num a => a -> a -> a
+Cplx
iforall a. Num a => a -> a -> a
*Cplx
z)) forall a. Fractional a => a -> a -> a
/ Cplx
2
  where
    i :: Cplx
i = Double
0.0 forall a. a -> a -> Complex a
:+ Double
1.0