module Math.Algebra.Combinatorics
(
kostkaNumbers
, symbolicKostkaNumbers
, skewKostkaNumbers
, symbolicSkewKostkaNumbers
, semiStandardTableauxWithGivenShapeAndWeight
, skewTableauxWithGivenShapeAndWeight
, skewGelfandTsetlinPatterns
) where
import qualified Data.Foldable as DF
import Data.Map.Strict (
Map
)
import qualified Data.Map.Strict as DM
import Data.Tuple.Extra (
second
)
import Math.Algebra.Hspray (
RatioOfQSprays
, unitRatioOfSprays
)
import Math.Algebra.Jack.Internal (
Partition
, _isPartition
, _kostkaNumbers
, _symbolicKostkaNumbers
, isSkewPartition
, skewJackInMSPbasis
, skewSymbolicJackInMSPbasis
, _skewGelfandTsetlinPatterns
, _skewTableauxWithGivenShapeAndWeight
, _semiStandardTableauxWithGivenShapeAndWeight
)
import Math.Combinat.Tableaux.Skew (
SkewTableau (..)
)
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'
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)
skewGelfandTsetlinPatterns ::
Partition
-> Partition
-> [Int]
-> [[Partition]]
skewGelfandTsetlinPatterns :: Partition -> Partition -> Partition -> [[Partition]]
skewGelfandTsetlinPatterns Partition
lambda Partition
mu Partition
weight
| Bool -> Bool
not (Partition -> Partition -> Bool
isSkewPartition Partition
lambda Partition
mu) =
[Char] -> [[Partition]]
forall a. HasCallStack => [Char] -> a
error [Char]
"skewGelfandTsetlinPatterns: invalid skew partition."
| Bool
otherwise =
([Seq Int] -> [Partition]) -> [[Seq Int]] -> [[Partition]]
forall a b. (a -> b) -> [a] -> [b]
map ((Seq Int -> Partition) -> [Seq Int] -> [Partition]
forall a b. (a -> b) -> [a] -> [b]
map Seq Int -> Partition
forall a. Seq a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
DF.toList) (Partition -> Partition -> Partition -> [[Seq Int]]
_skewGelfandTsetlinPatterns Partition
lambda Partition
mu Partition
weight)
skewTableauxWithGivenShapeAndWeight ::
Partition
-> Partition
-> [Int]
-> [SkewTableau Int]
skewTableauxWithGivenShapeAndWeight :: Partition -> Partition -> Partition -> [SkewTableau Int]
skewTableauxWithGivenShapeAndWeight Partition
lambda Partition
mu Partition
weight
| Bool -> Bool
not (Partition -> Partition -> Bool
isSkewPartition Partition
lambda Partition
mu) =
[Char] -> [SkewTableau Int]
forall a. HasCallStack => [Char] -> a
error [Char]
"skewTableauxWithGivenShapeAndWeight: invalid skew partition."
| Bool
otherwise =
([(Int, Seq Int)] -> SkewTableau Int)
-> [[(Int, Seq Int)]] -> [SkewTableau Int]
forall a b. (a -> b) -> [a] -> [b]
map ([(Int, Partition)] -> SkewTableau Int
forall a. [(Int, [a])] -> SkewTableau a
SkewTableau ([(Int, Partition)] -> SkewTableau Int)
-> ([(Int, Seq Int)] -> [(Int, Partition)])
-> [(Int, Seq Int)]
-> SkewTableau Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (((Int, Seq Int) -> (Int, Partition))
-> [(Int, Seq Int)] -> [(Int, Partition)]
forall a b. (a -> b) -> [a] -> [b]
map ((Seq Int -> Partition) -> (Int, Seq Int) -> (Int, Partition)
forall b b' a. (b -> b') -> (a, b) -> (a, b')
second Seq Int -> Partition
forall a. Seq a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
DF.toList)))
(Partition -> Partition -> Partition -> [[(Int, Seq Int)]]
_skewTableauxWithGivenShapeAndWeight Partition
lambda Partition
mu Partition
weight)
semiStandardTableauxWithGivenShapeAndWeight ::
Partition
-> [Int]
-> [[[Int]]]
semiStandardTableauxWithGivenShapeAndWeight :: Partition -> Partition -> [[Partition]]
semiStandardTableauxWithGivenShapeAndWeight Partition
lambda Partition
weight
| Bool -> Bool
not (Partition -> Bool
_isPartition Partition
lambda) =
[Char] -> [[Partition]]
forall a. HasCallStack => [Char] -> a
error [Char]
"semiStandardTableauxWithGivenShapeAndWeight: invalid partition."
| (Int -> Bool) -> Partition -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0) Partition
weight =
[]
| Bool
otherwise =
([Seq Int] -> [Partition]) -> [[Seq Int]] -> [[Partition]]
forall a b. (a -> b) -> [a] -> [b]
map ((Seq Int -> Partition) -> [Seq Int] -> [Partition]
forall a b. (a -> b) -> [a] -> [b]
map Seq Int -> Partition
forall a. Seq a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
DF.toList)
(Partition -> Partition -> [[Seq Int]]
_semiStandardTableauxWithGivenShapeAndWeight Partition
lambda Partition
weight)