fix bug in partitions function

This commit is contained in:
sheaf 2023-01-23 02:01:03 +01:00
parent dd503df126
commit 86874882e4

View file

@ -5,8 +5,6 @@
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -ddump-splices -ddump-to-file #-}
module Math.Monomial
( Mon(..)
, MonomialBasis(..), Deg, Vars
@ -188,27 +186,30 @@ partitions :: forall k n
. Word -- ^ number of parts
-> Mon k n -- ^ monomial to sum to
-> [ [ ( Mon k n, Word ) ] ]
partitions n_parts0 mon0 = go n_parts0 mon0 mon0
partitions n_parts0 mon0 = go n_parts0 Nothing mon0
where
go :: Word -> Mon k n -> Mon k n -> [ [ ( Mon k n , Word ) ] ]
go :: Word -> Maybe ( Mon k n ) -> Mon k n -> [ [ ( Mon k n , Word ) ] ]
go 0 _ mon
| isZeroMonomial mon
= [ [] ]
| otherwise
= []
go 1 maxSub mon
go 1 mbMaxMon mon
| isZeroMonomial mon
|| mon >= maxSub
|| case mbMaxMon of { Just maxMon -> mon >= maxMon ; _ -> False }
= []
| otherwise
= [ [ ( mon, 1 ) ] ]
go n_parts maxSub mon
go n_parts mbMaxMon mon
= [ ( part, l ) : parts
| ( part, l_max ) <- subs mon
, not ( isZeroMonomial part ) -- parts must be non-empty
, part < maxSub -- use a total ordering on monomials to ensure uniqueness
-- use a total ordering on monomials to ensure uniqueness
, case mbMaxMon of
Just maxMon -> part < maxMon
Nothing -> True
, l <- [ 1 .. min n_parts l_max ]
, parts <- go ( n_parts - l ) part ( subPart l mon part )
, parts <- go ( n_parts - l ) ( Just part ) ( subPart l mon part )
]
subPart :: Word -> Mon k n -> Mon k n -> Mon k n