{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ConstraintKinds #-}
#ifndef O_LIQUID
#endif
#if __GLASGOW_HASKELL__ == 810
{-# OPTIONS_GHC -funfolding-keeness-factor=1 -funfolding-use-threshold=80 #-}
#endif
module Posit.Cl3.JonesCalculus
(
hpv, vpv,
dpv, apv,
rpv, lpv,
jv,
hpm, vpm,
dpm, apm,
rpm, lpm,
jm,
hpmRot,
qwp, hwp,
qwpRot, hwpRot,
wp,
wpRot,
refl,
#ifndef O_NO_RANDOM
randJonesVec,
randOrthogonalJonesVec,
#endif
factorize
) where
import Posit.Cl3 ( Cl3( R, V3, I)
, dag
, bar
, toR
, toV3
, toC
, project
, randUnitV3 )
import Posit.Internal.PositC
#ifndef O_NO_RANDOM
import System.Random (RandomGen)
#endif
e0 :: PositC es => Cl3 es
e0 :: forall (es :: ES). PositC es => Cl3 es
e0 = Posit es -> Cl3 es
forall (es :: ES). PositC es => Posit es -> Cl3 es
R Posit es
1
e1 :: PositC es => Cl3 es
e1 :: forall (es :: ES). PositC es => Cl3 es
e1 = Posit es -> Posit es -> Posit es -> Cl3 es
forall (es :: ES).
PositC es =>
Posit es -> Posit es -> Posit es -> Cl3 es
V3 Posit es
1 Posit es
0 Posit es
0
e2 :: PositC es => Cl3 es
e2 :: forall (es :: ES). PositC es => Cl3 es
e2 = Posit es -> Posit es -> Posit es -> Cl3 es
forall (es :: ES).
PositC es =>
Posit es -> Posit es -> Posit es -> Cl3 es
V3 Posit es
0 Posit es
1 Posit es
0
e3 :: PositC es => Cl3 es
e3 :: forall (es :: ES). PositC es => Cl3 es
e3 = Posit es -> Posit es -> Posit es -> Cl3 es
forall (es :: ES).
PositC es =>
Posit es -> Posit es -> Posit es -> Cl3 es
V3 Posit es
0 Posit es
0 Posit es
1
i :: PositC es => Cl3 es
i :: forall (es :: ES). PositC es => Cl3 es
i = Posit es -> Cl3 es
forall (es :: ES). PositC es => Posit es -> Cl3 es
I Posit es
1
p1 :: PositF es => Cl3 es
p1 :: forall (es :: ES). PositF es => Cl3 es
p1 = Cl3 es
0.5 Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* (Cl3 es
forall (es :: ES). PositC es => Cl3 es
e0 Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
+ Cl3 es
forall (es :: ES). PositC es => Cl3 es
e1)
p2 :: PositF es => Cl3 es
p2 :: forall (es :: ES). PositF es => Cl3 es
p2 = Cl3 es
0.5 Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* (Cl3 es
forall (es :: ES). PositC es => Cl3 es
e0 Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
+ Cl3 es
forall (es :: ES). PositC es => Cl3 es
e2)
p3 :: PositF es => Cl3 es
p3 :: forall (es :: ES). PositF es => Cl3 es
p3 = Cl3 es
0.5 Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* (Cl3 es
forall (es :: ES). PositC es => Cl3 es
e0 Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
+ Cl3 es
forall (es :: ES). PositC es => Cl3 es
e3)
hpv :: PositF es => Cl3 es
hpv :: forall (es :: ES). PositF es => Cl3 es
hpv = Cl3 es -> Cl3 es
forall a. Num a => a -> a
signum (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall a b. (a -> b) -> a -> b
$ Cl3 es
forall (es :: ES). PositC es => Cl3 es
e0 Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositF es => Cl3 es
p3
vpv :: PositF es => Cl3 es
vpv :: forall (es :: ES). PositF es => Cl3 es
vpv = Cl3 es -> Cl3 es
forall a. Num a => a -> a
signum (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall a b. (a -> b) -> a -> b
$ Cl3 es -> Cl3 es
forall a. Floating a => a -> a
exp ((-Cl3 es
forall (es :: ES). PositC es => Cl3 es
iCl3 es -> Cl3 es -> Cl3 es
forall a. Fractional a => a -> a -> a
/Cl3 es
2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall a. Floating a => a
pi Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositC es => Cl3 es
e2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositF es => Cl3 es
p3
dpv :: PositF es => Cl3 es
dpv :: forall (es :: ES). PositF es => Cl3 es
dpv = Cl3 es -> Cl3 es
forall a. Num a => a -> a
signum (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall a b. (a -> b) -> a -> b
$ Cl3 es -> Cl3 es
forall a. Floating a => a -> a
exp ((-Cl3 es
forall (es :: ES). PositC es => Cl3 es
iCl3 es -> Cl3 es -> Cl3 es
forall a. Fractional a => a -> a -> a
/Cl3 es
2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* (Cl3 es
forall a. Floating a => a
piCl3 es -> Cl3 es -> Cl3 es
forall a. Fractional a => a -> a -> a
/Cl3 es
2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositC es => Cl3 es
e2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositF es => Cl3 es
p3
apv :: PositF es => Cl3 es
apv :: forall (es :: ES). PositF es => Cl3 es
apv = Cl3 es -> Cl3 es
forall a. Num a => a -> a
signum (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall a b. (a -> b) -> a -> b
$ Cl3 es -> Cl3 es
forall a. Floating a => a -> a
exp ((-Cl3 es
forall (es :: ES). PositC es => Cl3 es
iCl3 es -> Cl3 es -> Cl3 es
forall a. Fractional a => a -> a -> a
/Cl3 es
2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* (Cl3 es
forall a. Floating a => a
piCl3 es -> Cl3 es -> Cl3 es
forall a. Fractional a => a -> a -> a
/Cl3 es
2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* (-Cl3 es
forall (es :: ES). PositC es => Cl3 es
e2)) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositF es => Cl3 es
p3
rpv :: PositF es => Cl3 es
rpv :: forall (es :: ES). PositF es => Cl3 es
rpv = Cl3 es -> Cl3 es
forall a. Num a => a -> a
signum (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall a b. (a -> b) -> a -> b
$ Cl3 es -> Cl3 es
forall a. Floating a => a -> a
exp ((-Cl3 es
forall (es :: ES). PositC es => Cl3 es
iCl3 es -> Cl3 es -> Cl3 es
forall a. Fractional a => a -> a -> a
/Cl3 es
2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* (Cl3 es
forall a. Floating a => a
piCl3 es -> Cl3 es -> Cl3 es
forall a. Fractional a => a -> a -> a
/Cl3 es
2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* (-Cl3 es
forall (es :: ES). PositC es => Cl3 es
e1)) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositF es => Cl3 es
p3
lpv :: PositF es => Cl3 es
lpv :: forall (es :: ES). PositF es => Cl3 es
lpv = Cl3 es -> Cl3 es
forall a. Num a => a -> a
signum (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall a b. (a -> b) -> a -> b
$ Cl3 es -> Cl3 es
forall a. Floating a => a -> a
exp ((-Cl3 es
forall (es :: ES). PositC es => Cl3 es
iCl3 es -> Cl3 es -> Cl3 es
forall a. Fractional a => a -> a -> a
/Cl3 es
2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* (Cl3 es
forall a. Floating a => a
piCl3 es -> Cl3 es -> Cl3 es
forall a. Fractional a => a -> a -> a
/Cl3 es
2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositC es => Cl3 es
e1) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositF es => Cl3 es
p3
jv :: Cl3 es -> Cl3 es
jv (Cl3 es -> Cl3 es
forall a. Num a => a -> a
signum(Cl3 es -> Cl3 es) -> (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toV3 -> Cl3 es
v) | Cl3 es
v Cl3 es -> Cl3 es -> Bool
forall a. Eq a => a -> a -> Bool
== Cl3 es
forall (es :: ES). PositC es => Cl3 es
e3 = Cl3 es
forall (es :: ES). PositF es => Cl3 es
hpv
| Cl3 es
v Cl3 es -> Cl3 es -> Bool
forall a. Eq a => a -> a -> Bool
== -Cl3 es
forall (es :: ES). PositC es => Cl3 es
e3 = Cl3 es
forall (es :: ES). PositF es => Cl3 es
vpv
| Bool
otherwise = Cl3 es -> Cl3 es
forall a. Num a => a -> a
signum (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall a b. (a -> b) -> a -> b
$ Cl3 es -> Cl3 es
forall a. Floating a => a -> a
sqrt (Cl3 es
forall (es :: ES). PositC es => Cl3 es
e3 Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
v) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositF es => Cl3 es
p3
hpm :: PositF es => Cl3 es
hpm :: forall (es :: ES). PositF es => Cl3 es
hpm = Cl3 es
forall (es :: ES). PositF es => Cl3 es
p3
vpm :: PositF es => Cl3 es
vpm :: forall (es :: ES). PositF es => Cl3 es
vpm = Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
bar Cl3 es
forall (es :: ES). PositF es => Cl3 es
p3
dpm :: PositF es => Cl3 es
dpm :: forall (es :: ES). PositF es => Cl3 es
dpm = Cl3 es
forall (es :: ES). PositF es => Cl3 es
p1
apm :: PositF es => Cl3 es
apm :: forall (es :: ES). PositF es => Cl3 es
apm = Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
bar Cl3 es
forall (es :: ES). PositF es => Cl3 es
p1
rpm :: PositF es => Cl3 es
rpm :: forall (es :: ES). PositF es => Cl3 es
rpm = Cl3 es
forall (es :: ES). PositF es => Cl3 es
p2
lpm :: PositF es => Cl3 es
lpm :: forall (es :: ES). PositF es => Cl3 es
lpm = Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
bar Cl3 es
forall (es :: ES). PositF es => Cl3 es
p2
jm :: Cl3 es -> Cl3 es
jm (Cl3 es -> Cl3 es
forall a. Num a => a -> a
signum(Cl3 es -> Cl3 es) -> (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toV3 -> Cl3 es
v) = Cl3 es -> Cl3 es
forall (es :: ES). PositF es => Cl3 es -> Cl3 es
project Cl3 es
v
rot :: Cl3 es -> Cl3 es -> Cl3 es
rot (Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toR -> Cl3 es
theta) (Cl3 es -> Cl3 es
forall a. Num a => a -> a
signum(Cl3 es -> Cl3 es) -> (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toV3 -> Cl3 es
axis) = Cl3 es -> Cl3 es
forall a. Floating a => a -> a
exp (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall a b. (a -> b) -> a -> b
$ (-Cl3 es
forall (es :: ES). PositC es => Cl3 es
iCl3 es -> Cl3 es -> Cl3 es
forall a. Fractional a => a -> a -> a
/Cl3 es
2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
theta Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
axis
rotIsh :: Cl3 es -> Cl3 es
rotIsh (Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toR -> Cl3 es
theta) = Cl3 es -> Cl3 es -> Cl3 es
forall {es :: ES}.
(PositC es, PositC (Next es), PositC (Prev es)) =>
Cl3 es -> Cl3 es -> Cl3 es
rot (Cl3 es
2Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
*Cl3 es
theta) Cl3 es
forall (es :: ES). PositC es => Cl3 es
e2
hpmRot :: Cl3 es -> Cl3 es
hpmRot (Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toR -> Cl3 es
theta) =
let roted :: Cl3 es
roted = Cl3 es -> Cl3 es
forall {es :: ES}.
(PositC es, PositC (Next es), PositC (Prev es)) =>
Cl3 es -> Cl3 es
rotIsh Cl3 es
theta
in Cl3 es
roted Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositF es => Cl3 es
hpm Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
dag Cl3 es
roted
qwp :: PositF es => Cl3 es
qwp :: forall (es :: ES). PositF es => Cl3 es
qwp = Cl3 es
forall (es :: ES). PositF es => Cl3 es
p3 Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
- Cl3 es
forall (es :: ES). PositC es => Cl3 es
i Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
bar Cl3 es
forall (es :: ES). PositF es => Cl3 es
p3
qwpRot :: Cl3 es -> Cl3 es
qwpRot (Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toR -> Cl3 es
theta) =
let roted :: Cl3 es
roted = Cl3 es -> Cl3 es
forall {es :: ES}.
(PositC es, PositC (Next es), PositC (Prev es)) =>
Cl3 es -> Cl3 es
rotIsh Cl3 es
theta
in Cl3 es
roted Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositF es => Cl3 es
qwp Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
dag Cl3 es
roted
hwp :: PositF es => Cl3 es
hwp :: forall (es :: ES). PositF es => Cl3 es
hwp = Cl3 es
forall (es :: ES). PositC es => Cl3 es
e3
hwpRot :: Cl3 es -> Cl3 es
hwpRot (Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toR -> Cl3 es
theta) =
let roted :: Cl3 es
roted = Cl3 es -> Cl3 es
forall {es :: ES}.
(PositC es, PositC (Next es), PositC (Prev es)) =>
Cl3 es -> Cl3 es
rotIsh Cl3 es
theta
in Cl3 es
roted Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositF es => Cl3 es
hwp Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
dag Cl3 es
roted
wp :: Cl3 es -> Cl3 es
wp (Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toR -> Cl3 es
phi) = Cl3 es -> Cl3 es
forall a. Floating a => a -> a
exp (Cl3 es -> Cl3 es) -> Cl3 es -> Cl3 es
forall a b. (a -> b) -> a -> b
$ (Cl3 es
forall (es :: ES). PositC es => Cl3 es
iCl3 es -> Cl3 es -> Cl3 es
forall a. Fractional a => a -> a -> a
/Cl3 es
2) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
phi Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
forall (es :: ES). PositC es => Cl3 es
e3
wpRot :: Cl3 es -> Cl3 es -> Cl3 es
wpRot (Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toR -> Cl3 es
phi) (Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toR -> Cl3 es
theta) =
let roted :: Cl3 es
roted = Cl3 es -> Cl3 es
forall {es :: ES}.
(PositC es, PositC (Next es), PositC (Prev es)) =>
Cl3 es -> Cl3 es
rotIsh Cl3 es
theta
in Cl3 es
roted Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es -> Cl3 es
forall {es :: ES}.
(PositC es, PositC (Next es), PositC (Prev es)) =>
Cl3 es -> Cl3 es
wp Cl3 es
phi Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
dag Cl3 es
roted
refl :: PositF es => Cl3 es
refl :: forall (es :: ES). PositF es => Cl3 es
refl = Cl3 es
forall (es :: ES). PositC es => Cl3 es
e3
factorize :: PositF es => Cl3 es -> (Cl3 es, Cl3 es, Cl3 es)
factorize :: forall (es :: ES). PositF es => Cl3 es -> (Cl3 es, Cl3 es, Cl3 es)
factorize Cl3 es
jonesVec =
let c :: Cl3 es
c = Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
toC Cl3 es
jonesVec
jonesVec' :: Cl3 es
jonesVec' = Cl3 es -> Cl3 es
forall a. Fractional a => a -> a
recip Cl3 es
c Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
jonesVec
ampC :: Cl3 es
ampC = Cl3 es -> Cl3 es
forall a. Num a => a -> a
abs Cl3 es
c
ampJonesVec' :: Cl3 es
ampJonesVec' = Cl3 es -> Cl3 es
forall a. Num a => a -> a
abs Cl3 es
jonesVec'
normJonesVec :: Cl3 es
normJonesVec = Cl3 es -> Cl3 es
forall a. Fractional a => a -> a
recip Cl3 es
ampJonesVec' Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
jonesVec'
amp :: Cl3 es
amp = Cl3 es
ampC Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
ampJonesVec'
normC :: Cl3 es
normC = Cl3 es -> Cl3 es
forall a. Fractional a => a -> a
recip Cl3 es
ampC Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es
c
phi :: Cl3 es
phi = Cl3 es
2 Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* (-Cl3 es
forall (es :: ES). PositC es => Cl3 es
i) Cl3 es -> Cl3 es -> Cl3 es
forall a. Num a => a -> a -> a
* Cl3 es -> Cl3 es
forall a. Floating a => a -> a
log Cl3 es
normC
in (Cl3 es
amp, Cl3 es
phi, Cl3 es
normJonesVec)
#ifndef O_NO_RANDOM
randJonesVec :: (PositF es, RandomGen g) => g -> (Cl3 es, g)
randJonesVec :: forall (es :: ES) g. (PositF es, RandomGen g) => g -> (Cl3 es, g)
randJonesVec g
g =
let (Cl3 es
v3, g
g') = g -> (Cl3 es, g)
forall (es :: ES) g. (PositF es, RandomGen g) => g -> (Cl3 es, g)
randUnitV3 g
g
in (Cl3 es -> Cl3 es
forall {es :: ES}.
(PositC es, PositC (Next es), PositC (Prev es)) =>
Cl3 es -> Cl3 es
jv Cl3 es
v3,g
g')
randOrthogonalJonesVec :: (PositF es, RandomGen g) => g -> ((Cl3 es, Cl3 es), g)
randOrthogonalJonesVec :: forall (es :: ES) g.
(PositF es, RandomGen g) =>
g -> ((Cl3 es, Cl3 es), g)
randOrthogonalJonesVec g
g =
let (Cl3 es
v3, g
g') = g -> (Cl3 es, g)
forall (es :: ES) g. (PositF es, RandomGen g) => g -> (Cl3 es, g)
randUnitV3 g
g
in ((Cl3 es -> Cl3 es
forall {es :: ES}.
(PositC es, PositC (Next es), PositC (Prev es)) =>
Cl3 es -> Cl3 es
jv Cl3 es
v3, Cl3 es -> Cl3 es
forall {es :: ES}.
(PositC es, PositC (Next es), PositC (Prev es)) =>
Cl3 es -> Cl3 es
jv (Cl3 es -> Cl3 es
forall (es :: ES). PositC es => Cl3 es -> Cl3 es
bar Cl3 es
v3)),g
g')
#endif