module Math.EllipticIntegrals.Carlson
  (carlsonRF, carlsonRF',
  carlsonRD, carlsonRD',
  carlsonRJ, carlsonRJ',
  carlsonRC, carlsonRC',
  carlsonRG, carlsonRG')
  where
import Data.Complex                    ( magnitude, Complex )
import Math.EllipticIntegrals.Internal ( Cplx, toCplx, atanC )

rf_ :: Cplx -> Cplx -> Cplx -> Double -> ((Double,Double,Double), Cplx)
rf_ :: Complex Double
-> Complex Double
-> Complex Double
-> Double
-> ((Double, Double, Double), Complex Double)
rf_ Complex Double
x Complex Double
y Complex Double
z Double
err =
  let a :: Complex Double
a = (Complex Double
xforall a. Num a => a -> a -> a
+Complex Double
yforall a. Num a => a -> a -> a
+Complex Double
z)forall a. Fractional a => a -> a -> a
/Complex Double
3 in
  let delta :: [Double]
delta = forall a b. (a -> b) -> [a] -> [b]
map (\Complex Double
u -> forall a. RealFloat a => Complex a -> a
magnitude(Complex Double
1forall a. Num a => a -> a -> a
-Complex Double
uforall a. Fractional a => a -> a -> a
/Complex Double
a)) [Complex Double
x,Complex Double
y,Complex Double
z] in
  if forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum [Double]
delta forall a. Ord a => a -> a -> Bool
< Double
err
    then (([Double]
delta forall a. [a] -> Int -> a
!! Int
0, [Double]
delta forall a. [a] -> Int -> a
!! Int
1, [Double]
delta forall a. [a] -> Int -> a
!! Int
2), Complex Double
a)
    else
      let (Complex Double
sqrtx, Complex Double
sqrty, Complex Double
sqrtz) = (forall a. Floating a => a -> a
sqrt Complex Double
x, forall a. Floating a => a -> a
sqrt Complex Double
y, forall a. Floating a => a -> a
sqrt Complex Double
z) in
      let lambda :: Complex Double
lambda = Complex Double
sqrtxforall a. Num a => a -> a -> a
*Complex Double
sqrty forall a. Num a => a -> a -> a
+ Complex Double
sqrtyforall a. Num a => a -> a -> a
*Complex Double
sqrtz forall a. Num a => a -> a -> a
+ Complex Double
sqrtzforall a. Num a => a -> a -> a
*Complex Double
sqrtx in
      Complex Double
-> Complex Double
-> Complex Double
-> Double
-> ((Double, Double, Double), Complex Double)
rf_ ((Complex Double
xforall a. Num a => a -> a -> a
+Complex Double
lambda)forall a. Fractional a => a -> a -> a
/Complex Double
4) ((Complex Double
yforall a. Num a => a -> a -> a
+Complex Double
lambda)forall a. Fractional a => a -> a -> a
/Complex Double
4) ((Complex Double
zforall a. Num a => a -> a -> a
+Complex Double
lambda)forall a. Fractional a => a -> a -> a
/Complex Double
4) Double
err

-- | Carlson integral RF.
carlsonRF' :: 
     Double -- ^ bound on the relative error
  -> Complex Double -- ^ first variable
  -> Complex Double -- ^ second variable 
  -> Complex Double -- ^ third variable 
  -> Complex Double
carlsonRF' :: Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRF' Double
err Complex Double
x Complex Double
y Complex Double
z =
  if Int
zeros forall a. Ord a => a -> a -> Bool
> Int
1
    then forall a. HasCallStack => [Char] -> a
error [Char]
"At most one of x, y, z can be 0"
    else
      let ((Double
dx,Double
dy,Double
dz), Complex Double
a) = Complex Double
-> Complex Double
-> Complex Double
-> Double
-> ((Double, Double, Double), Complex Double)
rf_ Complex Double
x Complex Double
y Complex Double
z Double
err in
      let (Double
e2,Double
e3) = (Double
dxforall a. Num a => a -> a -> a
*Double
dy forall a. Num a => a -> a -> a
+ Double
dyforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
dzforall a. Num a => a -> a -> a
*Double
dx, Double
dxforall a. Num a => a -> a -> a
*Double
dyforall a. Num a => a -> a -> a
*Double
dz) in
      Double -> Complex Double
toCplx(Double
1 forall a. Num a => a -> a -> a
- Double
e2forall a. Fractional a => a -> a -> a
/Double
10 forall a. Num a => a -> a -> a
+ Double
e3forall a. Fractional a => a -> a -> a
/Double
14 forall a. Num a => a -> a -> a
+ Double
e2forall a. Num a => a -> a -> a
*Double
e2forall a. Fractional a => a -> a -> a
/Double
24 forall a. Num a => a -> a -> a
- Double
3forall a. Num a => a -> a -> a
*Double
e2forall a. Num a => a -> a -> a
*Double
e3forall a. Fractional a => a -> a -> a
/Double
44 forall a. Num a => a -> a -> a
- Double
5forall a. Num a => a -> a -> a
*Double
e2forall a. Num a => a -> a -> a
*Double
e2forall a. Num a => a -> a -> a
*Double
e2forall a. Fractional a => a -> a -> a
/Double
208 forall a. Num a => a -> a -> a
+
          Double
3forall a. Num a => a -> a -> a
*Double
e3forall a. Num a => a -> a -> a
*Double
e3forall a. Fractional a => a -> a -> a
/Double
104 forall a. Num a => a -> a -> a
+ Double
e2forall a. Num a => a -> a -> a
*Double
e2forall a. Num a => a -> a -> a
*Double
e3forall a. Fractional a => a -> a -> a
/Double
16) forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
sqrt Complex Double
a
  where
    zeros :: Int
zeros = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (forall a b. (a -> b) -> [a] -> [b]
map (\Complex Double
u -> forall a. Enum a => a -> Int
fromEnum (Complex Double
u forall a. Eq a => a -> a -> Bool
== Complex Double
0)) [Complex Double
x,Complex Double
y,Complex Double
z])

-- | Carlson integral RF.
carlsonRF :: 
     Complex Double -- ^ first variable
  -> Complex Double -- ^ second variable 
  -> Complex Double -- ^ third variable 
  -> Complex Double
carlsonRF :: Complex Double
-> Complex Double -> Complex Double -> Complex Double
carlsonRF = Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRF' Double
1e-15

rd_ :: Cplx -> Cplx -> Cplx -> Cplx -> Cplx -> Double ->
       ((Double,Double,Double), Cplx, Cplx, Cplx)
rd_ :: Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Double
-> ((Double, Double, Double), Complex Double, Complex Double,
    Complex Double)
rd_ Complex Double
x Complex Double
y Complex Double
z Complex Double
s Complex Double
fac Double
err =
  let a :: Complex Double
a = (Complex Double
xforall a. Num a => a -> a -> a
+Complex Double
yforall a. Num a => a -> a -> a
+Complex Double
zforall a. Num a => a -> a -> a
+Complex Double
zforall a. Num a => a -> a -> a
+Complex Double
z)forall a. Fractional a => a -> a -> a
/Complex Double
5 in
  let delta :: [Double]
delta = forall a b. (a -> b) -> [a] -> [b]
map (\Complex Double
u -> forall a. RealFloat a => Complex a -> a
magnitude(Complex Double
1forall a. Num a => a -> a -> a
-Complex Double
uforall a. Fractional a => a -> a -> a
/Complex Double
a)) [Complex Double
x,Complex Double
y,Complex Double
z] in
  if forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum [Double]
delta forall a. Ord a => a -> a -> Bool
< Double
err
    then (([Double]
delta forall a. [a] -> Int -> a
!! Int
0, [Double]
delta forall a. [a] -> Int -> a
!! Int
1, [Double]
delta forall a. [a] -> Int -> a
!! Int
2), Complex Double
a, Complex Double
s, Complex Double
fac)
    else
      let (Complex Double
sqrtx, Complex Double
sqrty, Complex Double
sqrtz) = (forall a. Floating a => a -> a
sqrt Complex Double
x, forall a. Floating a => a -> a
sqrt Complex Double
y, forall a. Floating a => a -> a
sqrt Complex Double
z) in
      let lambda :: Complex Double
lambda = Complex Double
sqrtxforall a. Num a => a -> a -> a
*Complex Double
sqrty forall a. Num a => a -> a -> a
+ Complex Double
sqrtyforall a. Num a => a -> a -> a
*Complex Double
sqrtz forall a. Num a => a -> a -> a
+ Complex Double
sqrtzforall a. Num a => a -> a -> a
*Complex Double
sqrtx in
      let s' :: Complex Double
s' = Complex Double
s forall a. Num a => a -> a -> a
+ Complex Double
fac forall a. Fractional a => a -> a -> a
/ (forall a. Floating a => a -> a
sqrt Complex Double
z forall a. Num a => a -> a -> a
* (Complex Double
z forall a. Num a => a -> a -> a
+ Complex Double
lambda)) in
      Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Double
-> ((Double, Double, Double), Complex Double, Complex Double,
    Complex Double)
rd_ ((Complex Double
xforall a. Num a => a -> a -> a
+Complex Double
lambda)forall a. Fractional a => a -> a -> a
/Complex Double
4) ((Complex Double
yforall a. Num a => a -> a -> a
+Complex Double
lambda)forall a. Fractional a => a -> a -> a
/Complex Double
4) ((Complex Double
zforall a. Num a => a -> a -> a
+Complex Double
lambda)forall a. Fractional a => a -> a -> a
/Complex Double
4) Complex Double
s' (Complex Double
facforall a. Fractional a => a -> a -> a
/Complex Double
4) Double
err

-- | Carlson integral RD.
carlsonRD' ::
     Double -- ^ bound on the relative error
  -> Complex Double -- ^ first variable
  -> Complex Double -- ^ second variable 
  -> Complex Double -- ^ third variable 
  -> Complex Double
carlsonRD' :: Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRD' Double
err Complex Double
x Complex Double
y Complex Double
z =
  if Int
zeros forall a. Ord a => a -> a -> Bool
> Int
1
    then forall a. HasCallStack => [Char] -> a
error [Char]
"At most one of x, y, z can be 0"
    else
      let ((Double
dx,Double
dy,Double
dz), Complex Double
a, Complex Double
s, Complex Double
fac) = Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Double
-> ((Double, Double, Double), Complex Double, Complex Double,
    Complex Double)
rd_ Complex Double
x Complex Double
y Complex Double
z Complex Double
0 Complex Double
1 Double
err in
      let
        (Double
e2,Double
e3,Double
e4,Double
e5) = (Double
dxforall a. Num a => a -> a -> a
*Double
dy forall a. Num a => a -> a -> a
+ Double
dyforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
3forall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
2forall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dx forall a. Num a => a -> a -> a
+ Double
dxforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
2forall a. Num a => a -> a -> a
*Double
dyforall a. Num a => a -> a -> a
*Double
dz,
          Double
dzforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
dxforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
3forall a. Num a => a -> a -> a
*Double
dxforall a. Num a => a -> a -> a
*Double
dyforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
2forall a. Num a => a -> a -> a
*Double
dyforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
dyforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
2forall a. Num a => a -> a -> a
*Double
dxforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dz,
          Double
dyforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
dxforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
dxforall a. Num a => a -> a -> a
*Double
dyforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dz forall a. Num a => a -> a -> a
+ Double
2forall a. Num a => a -> a -> a
*Double
dxforall a. Num a => a -> a -> a
*Double
dyforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dz,
          Double
dxforall a. Num a => a -> a -> a
*Double
dyforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dzforall a. Num a => a -> a -> a
*Double
dz) in
      Complex Double
3forall a. Num a => a -> a -> a
*Complex Double
s forall a. Num a => a -> a -> a
+ Complex Double
fac forall a. Num a => a -> a -> a
* Double -> Complex Double
toCplx(Double
1 forall a. Num a => a -> a -> a
- Double
3forall a. Num a => a -> a -> a
*Double
e2forall a. Fractional a => a -> a -> a
/Double
14 forall a. Num a => a -> a -> a
+ Double
e3forall a. Fractional a => a -> a -> a
/Double
6 forall a. Num a => a -> a -> a
+ Double
9forall a. Num a => a -> a -> a
*Double
e2forall a. Num a => a -> a -> a
*Double
e2forall a. Fractional a => a -> a -> a
/Double
88 forall a. Num a => a -> a -> a
- Double
3forall a. Num a => a -> a -> a
*Double
e4forall a. Fractional a => a -> a -> a
/Double
22 forall a. Num a => a -> a -> a
- Double
9forall a. Num a => a -> a -> a
*Double
e2forall a. Num a => a -> a -> a
*Double
e3forall a. Fractional a => a -> a -> a
/Double
52 forall a. Num a => a -> a -> a
+
        Double
3forall a. Num a => a -> a -> a
*Double
e5forall a. Fractional a => a -> a -> a
/Double
26 forall a. Num a => a -> a -> a
- Double
e2forall a. Num a => a -> a -> a
*Double
e2forall a. Num a => a -> a -> a
*Double
e2forall a. Fractional a => a -> a -> a
/Double
16 forall a. Num a => a -> a -> a
+ Double
3forall a. Num a => a -> a -> a
*Double
e3forall a. Num a => a -> a -> a
*Double
e3forall a. Fractional a => a -> a -> a
/Double
40 forall a. Num a => a -> a -> a
+ Double
3forall a. Num a => a -> a -> a
*Double
e2forall a. Num a => a -> a -> a
*Double
e4forall a. Fractional a => a -> a -> a
/Double
20 forall a. Num a => a -> a -> a
+ Double
45forall a. Num a => a -> a -> a
*Double
e2forall a. Num a => a -> a -> a
*Double
e2forall a. Num a => a -> a -> a
*Double
e3forall a. Fractional a => a -> a -> a
/Double
272 forall a. Num a => a -> a -> a
-
        Double
9forall a. Num a => a -> a -> a
*(Double
e3forall a. Num a => a -> a -> a
*Double
e4 forall a. Num a => a -> a -> a
+ Double
e2forall a. Num a => a -> a -> a
*Double
e5)forall a. Fractional a => a -> a -> a
/Double
68) forall a. Fractional a => a -> a -> a
/ Complex Double
a forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
sqrt Complex Double
a
  where
    zeros :: Int
zeros = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (forall a b. (a -> b) -> [a] -> [b]
map (\Complex Double
u -> forall a. Enum a => a -> Int
fromEnum (Complex Double
u forall a. Eq a => a -> a -> Bool
== Complex Double
0)) [Complex Double
x,Complex Double
y,Complex Double
z])

-- | Carlson integral RD.
carlsonRD ::
     Complex Double -- ^ first variable
  -> Complex Double -- ^ second variable 
  -> Complex Double -- ^ third variable 
  -> Complex Double
carlsonRD :: Complex Double
-> Complex Double -> Complex Double -> Complex Double
carlsonRD = Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRD' Double
1e-15

rj_ :: Cplx -> Cplx -> Cplx -> Cplx -> Cplx -> Double -> Cplx -> Int ->
       Double -> [Cplx] -> [Cplx] -> Double -> (Cplx, Int, [Cplx], [Cplx])
rj_ :: Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Double
-> Complex Double
-> Int
-> Double
-> [Complex Double]
-> [Complex Double]
-> Double
-> (Complex Double, Int, [Complex Double], [Complex Double])
rj_ Complex Double
x Complex Double
y Complex Double
z Complex Double
p Complex Double
a Double
maxmagns Complex Double
delta Int
f Double
fac [Complex Double]
d [Complex Double]
e Double
err =
  let q :: Double
q = (Double
4forall a. Fractional a => a -> a -> a
/Double
err)forall a. Floating a => a -> a -> a
**(Double
1forall a. Fractional a => a -> a -> a
/Double
6) forall a. Num a => a -> a -> a
* Double
maxmagns forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
f in
  if forall a. RealFloat a => Complex a -> a
magnitude Complex Double
a forall a. Ord a => a -> a -> Bool
> Double
q
    then (Complex Double
a, Int
f, [Complex Double]
d, [Complex Double]
e)
    else
      let dnew :: Complex Double
dnew = (forall a. Floating a => a -> a
sqrt Complex Double
p forall a. Num a => a -> a -> a
+ forall a. Floating a => a -> a
sqrt Complex Double
x)forall a. Num a => a -> a -> a
*(forall a. Floating a => a -> a
sqrt Complex Double
p forall a. Num a => a -> a -> a
+ forall a. Floating a => a -> a
sqrt Complex Double
y)forall a. Num a => a -> a -> a
*(forall a. Floating a => a -> a
sqrt Complex Double
p forall a. Num a => a -> a -> a
+ forall a. Floating a => a -> a
sqrt Complex Double
z)
          d' :: [Complex Double]
d' = (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
f forall a. Num a => a -> a -> a
* Complex Double
dnew) forall a. a -> [a] -> [a]
: [Complex Double]
d
          e' :: [Complex Double]
e' = (Double -> Complex Double
toCplx Double
fac forall a. Num a => a -> a -> a
* Complex Double
delta forall a. Fractional a => a -> a -> a
/ Complex Double
dnew forall a. Fractional a => a -> a -> a
/ Complex Double
dnew) forall a. a -> [a] -> [a]
: [Complex Double]
e
          lambda :: Complex Double
lambda = forall a. Floating a => a -> a
sqrt Complex Double
x forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
sqrt Complex Double
y forall a. Num a => a -> a -> a
+ forall a. Floating a => a -> a
sqrt Complex Double
y forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
sqrt Complex Double
z forall a. Num a => a -> a -> a
+ forall a. Floating a => a -> a
sqrt Complex Double
z forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
sqrt Complex Double
x
          x' :: Complex Double
x' = (Complex Double
x forall a. Num a => a -> a -> a
+ Complex Double
lambda) forall a. Fractional a => a -> a -> a
/ Complex Double
4
          y' :: Complex Double
y' = (Complex Double
y forall a. Num a => a -> a -> a
+ Complex Double
lambda) forall a. Fractional a => a -> a -> a
/ Complex Double
4
          z' :: Complex Double
z' = (Complex Double
z forall a. Num a => a -> a -> a
+ Complex Double
lambda) forall a. Fractional a => a -> a -> a
/ Complex Double
4
          p' :: Complex Double
p' = (Complex Double
p forall a. Num a => a -> a -> a
+ Complex Double
lambda) forall a. Fractional a => a -> a -> a
/ Complex Double
4
          a' :: Complex Double
a' = (Complex Double
a forall a. Num a => a -> a -> a
+ Complex Double
lambda) forall a. Fractional a => a -> a -> a
/ Complex Double
4
      in
      Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Double
-> Complex Double
-> Int
-> Double
-> [Complex Double]
-> [Complex Double]
-> Double
-> (Complex Double, Int, [Complex Double], [Complex Double])
rj_ Complex Double
x' Complex Double
y' Complex Double
z' Complex Double
p' Complex Double
a' Double
maxmagns Complex Double
delta (Int
4forall a. Num a => a -> a -> a
*Int
f) (Double
facforall a. Fractional a => a -> a -> a
/Double
64) [Complex Double]
d' [Complex Double]
e' Double
err

-- | Carlson integral RJ.
carlsonRJ' ::
     Double -- ^ bound on the relative error
  -> Complex Double -- ^ first variable
  -> Complex Double -- ^ second variable 
  -> Complex Double -- ^ third variable 
  -> Complex Double -- ^ fourth variable 
  -> Complex Double
carlsonRJ' :: Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRJ' Double
err Complex Double
x Complex Double
y Complex Double
z Complex Double
p =
  if Int
zeros forall a. Ord a => a -> a -> Bool
> Int
1
    then forall a. HasCallStack => [Char] -> a
error [Char]
"At most one of x, y, z, p can be 0"
    else
      let a0 :: Complex Double
a0 = (Complex Double
x forall a. Num a => a -> a -> a
+ Complex Double
y forall a. Num a => a -> a -> a
+ Complex Double
z forall a. Num a => a -> a -> a
+ Complex Double
p forall a. Num a => a -> a -> a
+ Complex Double
p) forall a. Fractional a => a -> a -> a
/ Complex Double
5
          maxmagns :: Double
maxmagns = forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\Complex Double
u -> forall a. RealFloat a => Complex a -> a
magnitude(Complex Double
a0forall a. Num a => a -> a -> a
-Complex Double
u)) [Complex Double
x, Complex Double
y, Complex Double
z, Complex Double
p]
          delta :: Complex Double
delta = (Complex Double
pforall a. Num a => a -> a -> a
-Complex Double
x)forall a. Num a => a -> a -> a
*(Complex Double
pforall a. Num a => a -> a -> a
-Complex Double
y)forall a. Num a => a -> a -> a
*(Complex Double
pforall a. Num a => a -> a -> a
-Complex Double
z)
      in
      let (Complex Double
a, Int
f, [Complex Double]
d, [Complex Double]
e) = Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Double
-> Complex Double
-> Int
-> Double
-> [Complex Double]
-> [Complex Double]
-> Double
-> (Complex Double, Int, [Complex Double], [Complex Double])
rj_ Complex Double
x Complex Double
y Complex Double
z Complex Double
p Complex Double
a0 Double
maxmagns Complex Double
delta Int
1 Double
1 [] [] Double
err
          f' :: Complex Double
f' = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
f
      in
      let x' :: Complex Double
x' = (Complex Double
a0 forall a. Num a => a -> a -> a
- Complex Double
x) forall a. Fractional a => a -> a -> a
/ Complex Double
f' forall a. Fractional a => a -> a -> a
/ Complex Double
a
          y' :: Complex Double
y' = (Complex Double
a0 forall a. Num a => a -> a -> a
- Complex Double
y) forall a. Fractional a => a -> a -> a
/ Complex Double
f' forall a. Fractional a => a -> a -> a
/ Complex Double
a
          z' :: Complex Double
z' = (Complex Double
a0 forall a. Num a => a -> a -> a
- Complex Double
z) forall a. Fractional a => a -> a -> a
/ Complex Double
f' forall a. Fractional a => a -> a -> a
/ Complex Double
a
          p' :: Complex Double
p' = -(Complex Double
x'forall a. Num a => a -> a -> a
+Complex Double
y'forall a. Num a => a -> a -> a
+Complex Double
z') forall a. Fractional a => a -> a -> a
/ Complex Double
2
          e2 :: Complex Double
e2 = Complex Double
x'forall a. Num a => a -> a -> a
*Complex Double
y' forall a. Num a => a -> a -> a
+ Complex Double
x'forall a. Num a => a -> a -> a
*Complex Double
z' forall a. Num a => a -> a -> a
+ Complex Double
y'forall a. Num a => a -> a -> a
*Complex Double
z' forall a. Num a => a -> a -> a
- Complex Double
3forall a. Num a => a -> a -> a
*Complex Double
p'forall a. Num a => a -> a -> a
*Complex Double
p'
          e3 :: Complex Double
e3 = Complex Double
x'forall a. Num a => a -> a -> a
*Complex Double
y'forall a. Num a => a -> a -> a
*Complex Double
z' forall a. Num a => a -> a -> a
+ Complex Double
2forall a. Num a => a -> a -> a
*Complex Double
e2forall a. Num a => a -> a -> a
*Complex Double
p' forall a. Num a => a -> a -> a
+ Complex Double
4forall a. Num a => a -> a -> a
*Complex Double
p'forall a. Num a => a -> a -> a
*Complex Double
p'forall a. Num a => a -> a -> a
*Complex Double
p'
          e4 :: Complex Double
e4 = Complex Double
p'forall a. Num a => a -> a -> a
*(Complex Double
2forall a. Num a => a -> a -> a
*Complex Double
x'forall a. Num a => a -> a -> a
*Complex Double
y'forall a. Num a => a -> a -> a
*Complex Double
z' forall a. Num a => a -> a -> a
+ Complex Double
e2forall a. Num a => a -> a -> a
*Complex Double
p' forall a. Num a => a -> a -> a
+ Complex Double
3forall a. Num a => a -> a -> a
*Complex Double
p'forall a. Num a => a -> a -> a
*Complex Double
p'forall a. Num a => a -> a -> a
*Complex Double
p')
          e5 :: Complex Double
e5 = Complex Double
x'forall a. Num a => a -> a -> a
*Complex Double
y'forall a. Num a => a -> a -> a
*Complex Double
z'forall a. Num a => a -> a -> a
*Complex Double
p'forall a. Num a => a -> a -> a
*Complex Double
p'
          h :: [Complex Double]
h = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\Complex Double
u Complex Double
v -> Complex Double -> Complex Double
atanx_over_x(forall a. Floating a => a -> a
sqrt Complex Double
u) forall a. Fractional a => a -> a -> a
/ Complex Double
v) [Complex Double]
e [Complex Double]
d
      in
      (Complex Double
1 forall a. Num a => a -> a -> a
- Complex Double
3forall a. Num a => a -> a -> a
*Complex Double
e2forall a. Fractional a => a -> a -> a
/Complex Double
14 forall a. Num a => a -> a -> a
+ Complex Double
e3forall a. Fractional a => a -> a -> a
/Complex Double
6 forall a. Num a => a -> a -> a
+ Complex Double
9forall a. Num a => a -> a -> a
*Complex Double
e2forall a. Num a => a -> a -> a
*Complex Double
e2forall a. Fractional a => a -> a -> a
/Complex Double
88 forall a. Num a => a -> a -> a
- Complex Double
3forall a. Num a => a -> a -> a
*Complex Double
e4forall a. Fractional a => a -> a -> a
/Complex Double
22 forall a. Num a => a -> a -> a
- Complex Double
9forall a. Num a => a -> a -> a
*Complex Double
e2forall a. Num a => a -> a -> a
*Complex Double
e3forall a. Fractional a => a -> a -> a
/Complex Double
52 forall a. Num a => a -> a -> a
+ Complex Double
3forall a. Num a => a -> a -> a
*Complex Double
e5forall a. Fractional a => a -> a -> a
/Complex Double
26) forall a. Fractional a => a -> a -> a
/
        Complex Double
f' forall a. Fractional a => a -> a -> a
/ Complex Double
a forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
sqrt Complex Double
a forall a. Num a => a -> a -> a
+ Complex Double
6 forall a. Num a => a -> a -> a
* forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Complex Double]
h
  where
    zeros :: Int
zeros = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (forall a b. (a -> b) -> [a] -> [b]
map (\Complex Double
u -> forall a. Enum a => a -> Int
fromEnum (Complex Double
u forall a. Eq a => a -> a -> Bool
== Complex Double
0)) [Complex Double
x,Complex Double
y,Complex Double
z,Complex Double
p])
    atanx_over_x :: Complex Double -> Complex Double
atanx_over_x Complex Double
w = if Complex Double
w forall a. Eq a => a -> a -> Bool
== Complex Double
0 then Complex Double
1 else Complex Double -> Complex Double
atanC Complex Double
w forall a. Fractional a => a -> a -> a
/ Complex Double
w

-- | Carlson integral RJ.
carlsonRJ ::
     Complex Double -- ^ first variable
  -> Complex Double -- ^ second variable 
  -> Complex Double -- ^ third variable 
  -> Complex Double -- ^ fourth variable 
  -> Complex Double
carlsonRJ :: Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRJ = Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRJ' Double
1e-15


rc_ :: Cplx -> Cplx -> Cplx -> Double -> Int -> Double -> (Cplx, Int)
rc_ :: Complex Double
-> Complex Double
-> Complex Double
-> Double
-> Int
-> Double
-> (Complex Double, Int)
rc_ Complex Double
x Complex Double
y Complex Double
a Double
magn Int
f Double
err =
  let q :: Double
q = (Double
1forall a. Fractional a => a -> a -> a
/Double
3forall a. Fractional a => a -> a -> a
/Double
err)forall a. Floating a => a -> a -> a
**(Double
1forall a. Fractional a => a -> a -> a
/Double
8) forall a. Num a => a -> a -> a
* Double
magn forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
f in
  if forall a. RealFloat a => Complex a -> a
magnitude Complex Double
a forall a. Ord a => a -> a -> Bool
> Double
q
    then (Complex Double
a, Int
f)
    else
      let lambda :: Complex Double
lambda = Complex Double
2 forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
sqrt Complex Double
x forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
sqrt Complex Double
y forall a. Num a => a -> a -> a
+ Complex Double
y
          a' :: Complex Double
a' = (Complex Double
a forall a. Num a => a -> a -> a
+ Complex Double
lambda) forall a. Fractional a => a -> a -> a
/ Complex Double
4
          x' :: Complex Double
x' = (Complex Double
x forall a. Num a => a -> a -> a
+ Complex Double
lambda) forall a. Fractional a => a -> a -> a
/ Complex Double
4
          y' :: Complex Double
y' = (Complex Double
y forall a. Num a => a -> a -> a
+ Complex Double
lambda) forall a. Fractional a => a -> a -> a
/ Complex Double
4
      in
      Complex Double
-> Complex Double
-> Complex Double
-> Double
-> Int
-> Double
-> (Complex Double, Int)
rc_ Complex Double
x' Complex Double
y' Complex Double
a' Double
magn (Int
4forall a. Num a => a -> a -> a
*Int
f) Double
err

-- | Carlson integral RC.
carlsonRC' ::
     Double -- ^ bound on the relative error
  -> Complex Double -- ^ first variable
  -> Complex Double -- ^ second variable 
  -> Complex Double
carlsonRC' :: Double -> Complex Double -> Complex Double -> Complex Double
carlsonRC' Double
err Complex Double
x Complex Double
y =
  if Complex Double
y forall a. Eq a => a -> a -> Bool
== Complex Double
0
    then forall a. HasCallStack => [Char] -> a
error [Char]
"y cannot be 0"
    else
      let a0 :: Complex Double
a0 = (Complex Double
x forall a. Num a => a -> a -> a
+ Complex Double
y forall a. Num a => a -> a -> a
+ Complex Double
y) forall a. Fractional a => a -> a -> a
/ Complex Double
3
          magn :: Double
magn = forall a. RealFloat a => Complex a -> a
magnitude(Complex Double
a0forall a. Num a => a -> a -> a
-Complex Double
x)
      in
      let (Complex Double
a, Int
f) = Complex Double
-> Complex Double
-> Complex Double
-> Double
-> Int
-> Double
-> (Complex Double, Int)
rc_ Complex Double
x Complex Double
y Complex Double
a0 Double
magn Int
1 Double
err
          f' :: Complex Double
f' = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
f
      in
      let s :: Complex Double
s = (Complex Double
y forall a. Num a => a -> a -> a
- Complex Double
a0) forall a. Fractional a => a -> a -> a
/ Complex Double
f' forall a. Fractional a => a -> a -> a
/ Complex Double
a in
      (Complex Double
1 forall a. Num a => a -> a -> a
+ Complex Double
3forall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Fractional a => a -> a -> a
/Complex Double
10 forall a. Num a => a -> a -> a
+ Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Fractional a => a -> a -> a
/Complex Double
7 forall a. Num a => a -> a -> a
+ Complex Double
3forall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Fractional a => a -> a -> a
/Complex Double
8 forall a. Num a => a -> a -> a
+ Complex Double
9forall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Fractional a => a -> a -> a
/Complex Double
22 forall a. Num a => a -> a -> a
+
        Complex Double
159forall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Fractional a => a -> a -> a
/Complex Double
208 forall a. Num a => a -> a -> a
+ Complex Double
9forall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Num a => a -> a -> a
*Complex Double
sforall a. Fractional a => a -> a -> a
/Complex Double
8) forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
sqrt Complex Double
a

-- | Carlson integral RC.
carlsonRC ::
     Complex Double -- ^ first variable
  -> Complex Double -- ^ second variable 
  -> Complex Double
carlsonRC :: Complex Double -> Complex Double -> Complex Double
carlsonRC = Double -> Complex Double -> Complex Double -> Complex Double
carlsonRC' Double
1e-15


-- | Carlson integral RG.
carlsonRG' ::
     Double -- ^ bound on the relative error passed to `CarlsonRD'`
  -> Complex Double -- ^ first variable
  -> Complex Double -- ^ second variable 
  -> Complex Double -- ^ third variable 
  -> Complex Double
carlsonRG' :: Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRG' Double
err Complex Double
x Complex Double
y Complex Double
z =
  if Int
zeros forall a. Ord a => a -> a -> Bool
> Int
1
    then forall a. Floating a => a -> a
sqrt(Complex Double
xforall a. Num a => a -> a -> a
+Complex Double
yforall a. Num a => a -> a -> a
+Complex Double
z) forall a. Fractional a => a -> a -> a
/ Complex Double
2
    else
      if Complex Double
z forall a. Eq a => a -> a -> Bool
== Complex Double
0
        then Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRG' Double
err Complex Double
z Complex Double
x Complex Double
y
        else
          (Complex Double
z forall a. Num a => a -> a -> a
* Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRF' Double
err Complex Double
x Complex Double
y Complex Double
z forall a. Num a => a -> a -> a
-
            (Complex Double
xforall a. Num a => a -> a -> a
-Complex Double
z) forall a. Num a => a -> a -> a
* (Complex Double
yforall a. Num a => a -> a -> a
-Complex Double
z) forall a. Num a => a -> a -> a
* Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRD' Double
err Complex Double
x Complex Double
y Complex Double
z forall a. Fractional a => a -> a -> a
/ Complex Double
3 forall a. Num a => a -> a -> a
+
            forall a. Floating a => a -> a
sqrt Complex Double
x forall a. Num a => a -> a -> a
* forall a. Floating a => a -> a
sqrt Complex Double
y forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
sqrt Complex Double
z) forall a. Fractional a => a -> a -> a
/ Complex Double
2
  where
    zeros :: Int
zeros = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (forall a b. (a -> b) -> [a] -> [b]
map (\Complex Double
u -> forall a. Enum a => a -> Int
fromEnum (Complex Double
u forall a. Eq a => a -> a -> Bool
== Complex Double
0)) [Complex Double
x,Complex Double
y,Complex Double
z])

-- | Carlson integral RG.
carlsonRG ::
     Complex Double -- ^ first variable
  -> Complex Double -- ^ second variable 
  -> Complex Double -- ^ third variable 
  -> Complex Double
carlsonRG :: Complex Double
-> Complex Double -> Complex Double -> Complex Double
carlsonRG = Double
-> Complex Double
-> Complex Double
-> Complex Double
-> Complex Double
carlsonRG' Double
1e-15