module Math.Combinatorics.Kostka
(
kostkaNumbersWithGivenLambda
, kostkaNumbers
, symbolicKostkaNumbersWithGivenLambda
, symbolicKostkaNumbers
, skewKostkaNumbers
, symbolicSkewKostkaNumbers
) where
import Data.Map.Strict (
Map
)
import qualified Data.Map.Strict as DM
import Math.Algebra.Hspray (
RatioOfQSprays
, unitRatioOfSprays
)
import Math.Algebra.Jack.Internal (
Partition
, _isPartition
, _kostkaNumbers
, _symbolicKostkaNumbers
, _kostkaNumbersWithGivenLambda
, _symbolicKostkaNumbersWithGivenLambda
, isSkewPartition
, skewJackInMSPbasis
, skewSymbolicJackInMSPbasis
)
kostkaNumbersWithGivenLambda ::
Partition
-> Rational
-> Map Partition Rational
kostkaNumbersWithGivenLambda :: Partition -> Rational -> Map Partition Rational
kostkaNumbersWithGivenLambda Partition
lambda Rational
alpha
| Bool -> Bool
not (Partition -> Bool
_isPartition Partition
lambda) =
[Char] -> Map Partition Rational
forall a. HasCallStack => [Char] -> a
error [Char]
"kostkaNumbersWithGivenLambda: invalid integer partition."
| Partition -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Partition
lambda =
Partition -> Rational -> Map Partition Rational
forall k a. k -> a -> Map k a
DM.singleton [] Rational
1
| Bool
otherwise =
Int -> Partition -> Rational -> Char -> Map Partition Rational
forall a. C a => Int -> Partition -> a -> Char -> Map Partition a
_kostkaNumbersWithGivenLambda (Partition -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum Partition
lambda) Partition
lambda Rational
alpha Char
'P'
kostkaNumbers ::
Int
-> Rational
-> Map Partition (Map Partition Rational)
kostkaNumbers :: Int -> Rational -> Map Partition (Map Partition Rational)
kostkaNumbers Int
weight Rational
alpha
| Int
weight Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 =
[Char] -> Map Partition (Map Partition Rational)
forall a. HasCallStack => [Char] -> a
error [Char]
"kostkaNumbers: negative weight."
| Int
weight Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 =
Partition
-> Map Partition Rational -> Map Partition (Map Partition Rational)
forall k a. k -> a -> Map k a
DM.singleton [] (Partition -> Rational -> Map Partition Rational
forall k a. k -> a -> Map k a
DM.singleton [] Rational
1)
| Bool
otherwise =
Int
-> Int
-> Rational
-> Char
-> Map Partition (Map Partition Rational)
forall a.
C a =>
Int -> Int -> a -> Char -> Map Partition (Map Partition a)
_kostkaNumbers Int
weight Int
weight Rational
alpha Char
'P'
symbolicKostkaNumbers ::
Int
-> Map Partition (Map Partition RatioOfQSprays)
symbolicKostkaNumbers :: Int -> Map Partition (Map Partition RatioOfQSprays)
symbolicKostkaNumbers Int
weight
| Int
weight Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 =
[Char] -> Map Partition (Map Partition RatioOfQSprays)
forall a. HasCallStack => [Char] -> a
error [Char]
"symbolicKostkaNumbers: negative weight."
| Int
weight Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 =
Partition
-> Map Partition RatioOfQSprays
-> Map Partition (Map Partition RatioOfQSprays)
forall k a. k -> a -> Map k a
DM.singleton [] (Partition -> RatioOfQSprays -> Map Partition RatioOfQSprays
forall k a. k -> a -> Map k a
DM.singleton [] RatioOfQSprays
forall a. (C a, Eq a) => RatioOfSprays a
unitRatioOfSprays)
| Bool
otherwise =
Int -> Int -> Char -> Map Partition (Map Partition RatioOfQSprays)
forall a.
(Eq a, C a) =>
Int
-> Int -> Char -> Map Partition (Map Partition (RatioOfSprays a))
_symbolicKostkaNumbers Int
weight Int
weight Char
'P'
symbolicKostkaNumbersWithGivenLambda ::
Partition
-> Map Partition RatioOfQSprays
symbolicKostkaNumbersWithGivenLambda :: Partition -> Map Partition RatioOfQSprays
symbolicKostkaNumbersWithGivenLambda Partition
lambda
| Bool -> Bool
not (Partition -> Bool
_isPartition Partition
lambda) =
[Char] -> Map Partition RatioOfQSprays
forall a. HasCallStack => [Char] -> a
error [Char]
"symbolicKostkaNumbersWithGivenLambda: invalid integer partition."
| Partition -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Partition
lambda =
Partition -> RatioOfQSprays -> Map Partition RatioOfQSprays
forall k a. k -> a -> Map k a
DM.singleton [] RatioOfQSprays
forall a. (C a, Eq a) => RatioOfSprays a
unitRatioOfSprays
| Bool
otherwise =
Int -> Partition -> Char -> Map Partition RatioOfQSprays
forall a.
(Eq a, C a) =>
Int -> Partition -> Char -> Map Partition (RatioOfSprays a)
_symbolicKostkaNumbersWithGivenLambda (Partition -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum Partition
lambda) Partition
lambda Char
'P'
skewKostkaNumbers ::
Rational
-> Partition
-> Partition
-> Map Partition Rational
skewKostkaNumbers :: Rational -> Partition -> Partition -> Map Partition Rational
skewKostkaNumbers Rational
alpha Partition
lambda Partition
mu
| Bool -> Bool
not (Partition -> Partition -> Bool
isSkewPartition Partition
lambda Partition
mu) =
[Char] -> Map Partition Rational
forall a. HasCallStack => [Char] -> a
error [Char]
"skewKostkaNumbers: invalid skew partition."
| Bool
otherwise =
((Int, Rational) -> Rational)
-> Map Partition (Int, Rational) -> Map Partition Rational
forall a b k. (a -> b) -> Map k a -> Map k b
DM.map (Int, Rational) -> Rational
forall a b. (a, b) -> b
snd (Rational
-> Char -> Partition -> Partition -> Map Partition (Int, Rational)
forall a.
(Eq a, C a) =>
a -> Char -> Partition -> Partition -> Map Partition (Int, a)
skewJackInMSPbasis Rational
alpha Char
'P' Partition
lambda Partition
mu)
symbolicSkewKostkaNumbers ::
Partition
-> Partition
-> Map Partition RatioOfQSprays
symbolicSkewKostkaNumbers :: Partition -> Partition -> Map Partition RatioOfQSprays
symbolicSkewKostkaNumbers Partition
lambda Partition
mu
| Bool -> Bool
not (Partition -> Partition -> Bool
isSkewPartition Partition
lambda Partition
mu) =
[Char] -> Map Partition RatioOfQSprays
forall a. HasCallStack => [Char] -> a
error [Char]
"symbolicSkewKostkaNumbers: invalid skew partition."
| Bool
otherwise =
((Int, RatioOfQSprays) -> RatioOfQSprays)
-> Map Partition (Int, RatioOfQSprays)
-> Map Partition RatioOfQSprays
forall a b k. (a -> b) -> Map k a -> Map k b
DM.map (Int, RatioOfQSprays) -> RatioOfQSprays
forall a b. (a, b) -> b
snd (Char
-> Partition -> Partition -> Map Partition (Int, RatioOfQSprays)
forall a.
(Eq a, C a) =>
Char
-> Partition -> Partition -> Map Partition (Int, RatioOfSprays a)
skewSymbolicJackInMSPbasis Char
'P' Partition
lambda Partition
mu)