packages feed

jackpolynomials-1.2.2.0: src/Math/Algebra/Jack/HypergeoPQ.hs

module Math.Algebra.Jack.HypergeoPQ
  ( hypergeoPQ
  ) where
import           Prelude 
  hiding ( (*), (+), (-), (/), (^), (*>), product, sum, fromIntegral, fromInteger )
import           Algebra.Additive           
import           Algebra.Field              
import           Algebra.Ring
import           Algebra.ToInteger           
import qualified Algebra.Field                  as AlgField
import           Math.Algebra.Jack              ( zonal )

gpochhammer :: AlgField.C a => a -> [Int] -> a -> a
gpochhammer a kappa alpha = product $ map
  (\i -> product $ map
    (\j -> a - (fromIntegral (i - 1)) / alpha + fromIntegral (j - 1))
    [1 .. kappa !! (i - 1)]
  )
  [1 .. length kappa]

hcoeff :: AlgField.C a => [a] -> [a] -> [Int] -> a -> a
hcoeff a b kappa alpha = numerator / denominator / 
  fromIntegral (factorial (sum kappa))
 where
  factorial n = product [1 .. n]
  numerator   = product $ map (\x -> gpochhammer x kappa alpha) a
  denominator = product $ map (\x -> gpochhammer x kappa alpha) b

_allPartitions :: Int -> [[Int]]
_allPartitions m = [] : map reverse (concat ps)
 where
  ps      = [] : map parts [1 .. m]
  parts n = [n] : [ x : p | x <- [1 .. n], p <- ps !! (n - x), x <= p!!0 ]

-- | Inefficient hypergeometric function of a matrix argument (for testing purpose)
hypergeoPQ :: (Eq a, AlgField.C a) => Int -> [a] -> [a] -> [a] -> a
hypergeoPQ m a b x = sum $ map (\kappa -> coeff kappa * zonal x kappa) kappas
 where
  kappas      = filter (\kap -> length kap <= length x) (_allPartitions m)
  coeff kappa = hcoeff a b kappa (fromInteger 2)