-- |-- Module : Math.Sym.Stat-- Copyright : (c) Anders Claesson 2012, 2013-- License : BSD-style-- Maintainer : Anders Claesson <anders.claesson@gmail.com>-- -- Common permutation statistics. Please contact the maintainer if you-- feel that there is a statistic that is missing; even better, send a-- patch or make a pull request.-- -- To avoid name clashes this module is best imported @qualified@;-- e.g.-- -- > import qualified Math.Sym.Stat as S-- -- For any permutation statistic @f@, below, it holds that @f w == f-- (st w)@, and therefore the explanations below will be done on-- standard permutations for convenience.moduleMath.Sym.Stat(asc-- ascents,des-- descents,exc-- excedances,fp-- fixed points,cyc-- cycles,inv-- inversions,maj-- the major index,comaj-- the co-major index,peak-- peaks,vall-- valleys,dasc-- double ascents,ddes-- double descents,lmin-- left-to-right minima,lmax-- left-to-right maxima,rmin-- right-to-left minima,rmax-- right-to-left maxima,head-- the first element,last-- the last element,lir-- left-most increasing run,ldr-- left-most decreasing run,rir-- right-most increasing run,rdr-- right-most decreasing run,comp-- components,scomp-- skew components,ep-- rank a la Elizalde & Pak,dim-- dimension,asc0-- small ascents,des0-- small descents,shad-- shadow)whereimportPreludehiding(head,last)importMath.Sym(Perm,toVector,st,shadow)importMath.Sym.Internal(Perm0)importqualifiedMath.Sym.InternalasI(asc,des,exc,fp,cyc,inv,maj,comaj,peak,vall,dasc,ddes,lmin,lmax,rmin,rmax,head,last,lir,ldr,rir,rdr,comp,scomp,ep,dim,asc0,des0)liftStat::Perma=>(Perm0->b)->a->bliftStatf=f.toVector-- | The number of ascents. An /ascent/ in @w@ is an index @i@ such-- that @w[i] \< w[i+1]@.asc::Perma=>a->Intasc=liftStatI.asc-- | The number of descents. A /descent/ in @w@ is an index @i@ such-- that @w[i] > w[i+1]@.des::Perma=>a->Intdes=liftStatI.des-- | The number of /excedances/: positions @i@ such that @w[i] > i@.exc::Perma=>a->Intexc=liftStatI.exc-- | The number of /fixed points/: positions @i@ such that @w[i] == i@.fp::Perma=>a->Intfp=liftStatI.fp-- | The number of /cycles/: orbits of the permutation when viewed as a function.cyc::Perma=>a->Intcyc=liftStatI.cyc-- | The number of /inversions/: pairs @\(i,j\)@ such that @i \< j@ and @w[i] > w[j]@.inv::Perma=>a->Intinv=liftStatI.inv-- | /The major index/ is the sum of descents.maj::Perma=>a->Intmaj=liftStatI.maj-- | /The co-major index/ is the sum of descents.comaj::Perma=>a->Intcomaj=liftStatI.comaj-- | The number of /peaks/: positions @i@ such that @w[i-1] \< w[i]@ and @w[i] \> w[i+1]@.peak::Perma=>a->Intpeak=liftStatI.peak-- | The number of /valleys/: positions @i@ such that @w[i-1] \> w[i]@ and @w[i] \< w[i+1]@.vall::Perma=>a->Intvall=liftStatI.vall-- | The number of /double ascents/: positions @i@ such that @w[i-1] \< w[i] \< w[i+1]@.dasc::Perma=>a->Intdasc=liftStatI.dasc-- | The number of /double descents/: positions @i@ such that @w[i-1] \> w[i] \> w[i+1]@.ddes::Perma=>a->Intddes=liftStatI.ddes-- | The number of /left-to-right minima/: positions @i@ such that @w[i] \< w[j]@ for all @j \< i@.lmin::Perma=>a->Intlmin=liftStatI.lmin-- | The number of /left-to-right maxima/: positions @i@ such that @w[i] \> w[j]@ for all @j \< i@.lmax::Perma=>a->Intlmax=liftStatI.lmax-- | The number of /right-to-left minima/: positions @i@ such that @w[i] \< w[j]@ for all @j \> i@.rmin::Perma=>a->Intrmin=liftStatI.rmin-- | The number of /right-to-left maxima/: positions @i@ such that @w[i] \> w[j]@ for all @j \> i@.rmax::Perma=>a->Intrmax=liftStatI.rmax-- | The first (left-most) element in the standardization. E.g., @head \"231\" = head (fromList [1,2,0]) = 1@.head::Perma=>a->Inthead=liftStatI.head-- | The last (right-most) element in the standardization. E.g., @last \"231\" = last (fromList [1,2,0]) = 0@.last::Perma=>a->Intlast=liftStatI.last-- | Length of the left-most increasing run: largest @i@ such that-- @w[0] \< w[1] \< ... \< w[i-1]@.lir::Perma=>a->Intlir=liftStatI.lir-- | Length of the left-most decreasing run: largest @i@ such that-- @w[0] \> w[1] \> ... \> w[i-1]@.ldr::Perma=>a->Intldr=liftStatI.ldr-- | Length of the right-most increasing run: largest @i@ such that-- @w[n-i] \< ... \< w[n-2] \< w[n-1]@.rir::Perma=>a->Intrir=liftStatI.rir-- | Length of the right-most decreasing run: largest @i@ such that-- @w[n-i] \> ... \> w[n-2] \> w[n-1]@.rdr::Perma=>a->Intrdr=liftStatI.rdr-- | The number of components. E.g., @[2,0,3,1,4,6,7,5]@ has three-- components: @[2,0,3,1]@, @[4]@ and @[6,7,5]@.comp::Perma=>a->Intcomp=liftStatI.comp-- | The number of skew components. E.g., @[5,7,4,6,3,1,0,2]@ has three-- skew components: @[5,7,4,6]@, @[3]@ and @[1,0,2]@.scomp::Perma=>a->Intscomp=liftStatI.scomp-- | The rank as defined by Elizalde and Pak [Bijections for-- refined restricted permutations, /J. Comb. Theory, Ser. A/, 2004]:-- -- > maximum [ k | k <- [0..n-1], w[i] >= k for all i < k ]-- ep::Perma=>a->Intep=liftStatI.ep-- | The dimension of a permutation is defined as the largest-- non-fixed-point, or zero if all points are fixed.dim::Perma=>a->Intdim=liftStatI.dim-- | The number of small ascents. A /small ascent/ in @w@ is an index-- @i@ such that @w[i] + 1 == w[i+1]@.asc0::Perma=>a->Intasc0=liftStatI.asc0-- | The number of small descents. A /small descent/ in @w@ is an-- index @i@ such that @w[i] == w[i+1] + 1@.des0::Perma=>a->Intdes0=liftStatI.des0-- | The size of the shadow of @w@. That is, the number of different-- one point deletions of @w@.shad::Perma=>a->Intshad=length.shadow.return.st