module Math.Algebra.Jack.GPochhammer where
import Math.Algebra.Jack (zonal)

gpochhammer :: Fractional a => a -> [Int] -> a -> a
gpochhammer :: forall a. Fractional a => a -> [Int] -> a -> a
gpochhammer a
a [Int]
kappa a
alpha =
  forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product forall a b. (a -> b) -> a -> b
$
    forall a b. (a -> b) -> [a] -> [b]
map (\Int
i -> forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product forall a b. (a -> b) -> a -> b
$
                 forall a b. (a -> b) -> [a] -> [b]
map (\Int
j -> a
a forall a. Num a => a -> a -> a
- (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i forall a. Num a => a -> a -> a
- a
1)forall a. Fractional a => a -> a -> a
/a
alpha forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
j forall a. Num a => a -> a -> a
-a
1)
                     [Int
1 .. [Int]
kappa forall a. [a] -> Int -> a
!! (Int
iforall a. Num a => a -> a -> a
-Int
1)])
        [Int
1 .. forall (t :: * -> *) a. Foldable t => t a -> Int
length [Int]
kappa]

hcoeff :: Fractional a => [a] -> [a] -> [Int] -> a -> a
hcoeff :: forall a. Fractional a => [a] -> [a] -> [Int] -> a -> a
hcoeff [a]
a [a]
b [Int]
kappa a
alpha =
  a
numerator forall a. Fractional a => a -> a -> a
/ a
denominator forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall {a}. (Num a, Enum a) => a -> a
factorial (forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Int]
kappa))
  where
    factorial :: a -> a
factorial a
n = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product [a
1 .. a
n]
    numerator :: a
numerator = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\a
x -> forall a. Fractional a => a -> [Int] -> a -> a
gpochhammer a
x [Int]
kappa a
alpha) [a]
a
    denominator :: a
denominator = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\a
x -> forall a. Fractional a => a -> [Int] -> a -> a
gpochhammer a
x [Int]
kappa a
alpha) [a]
b

testHypergeo :: Double
testHypergeo :: Double
testHypergeo =
  let a :: [Double]
a = [Double
2,Double
3] in
  let b :: [Double]
b = [Double
4] in
  let coeff :: [Int] -> Double
coeff [Int]
kappa = forall a. Fractional a => [a] -> [a] -> [Int] -> a -> a
hcoeff [Double]
a [Double]
b [Int]
kappa Double
2 in
  let kappas :: [[Int]]
kappas = [[], [Int
1], [Int
1,Int
1], [Int
2]] in
  let x :: [Double]
x = [Double
5,Double
6] in
  forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\[Int]
kappa -> [Int] -> Double
coeff [Int]
kappa forall a. Num a => a -> a -> a
* forall a. (Fractional a, Ord a) => [a] -> [Int] -> a
zonal [Double]
x [Int]
kappa) [[Int]]
kappas

_allPartitions :: Int -> [[Int]]
_allPartitions :: Int -> [[Int]]
_allPartitions Int
m = forall a. [a] -> a
last [[[Int]]]
ps 
  where
    ps :: [[[Int]]]
ps = [] forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map Int -> [[Int]]
parts [Int
1..Int
m]
    parts :: Int -> [[Int]]
parts Int
n = [Int
n] forall a. a -> [a] -> [a]
: [Int
x forall a. a -> [a] -> [a]
: [Int]
p | Int
x <- [Int
1..Int
n], [Int]
p <- [[[Int]]]
ps forall a. [a] -> Int -> a
!! (Int
n forall a. Num a => a -> a -> a
- Int
x), Int
x forall a. Ord a => a -> a -> Bool
<= forall a. [a] -> a
head [Int]
p]

hypergeoPQ :: (Fractional a, Ord a) => Int -> [a] -> [a] -> [a] -> a
hypergeoPQ :: forall a. (Fractional a, Ord a) => Int -> [a] -> [a] -> [a] -> a
hypergeoPQ Int
m [a]
a [a]
b [a]
x =
  forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\[Int]
kappa -> [Int] -> a
coeff [Int]
kappa forall a. Num a => a -> a -> a
* forall a. (Fractional a, Ord a) => [a] -> [Int] -> a
zonal [a]
x [Int]
kappa) [[Int]]
kappas
  where
  kappas :: [[Int]]
kappas = forall a. (a -> Bool) -> [a] -> [a]
filter (\[Int]
kap -> forall (t :: * -> *) a. Foldable t => t a -> Int
length [Int]
kap forall a. Ord a => a -> a -> Bool
<= forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
x) (Int -> [[Int]]
_allPartitions Int
m)
  coeff :: [Int] -> a
coeff [Int]
kappa = forall a. Fractional a => [a] -> [a] -> [Int] -> a -> a
hcoeff [a]
a [a]
b [Int]
kappa a
2