Copyright | (c) 2019 Andrew Lelechenko |
---|---|
License | MIT |
Maintainer | Andrew Lelechenko <andrew.lelechenko@gmail.com> |
Safe Haskell | None |
Language | Haskell2010 |
Math.NumberTheory.Moduli.Singleton
Description
Singleton data types.
Synopsis
- data SFactors a (m :: Nat)
- sfactors :: forall a (m :: Nat). (Ord a, UniqueFactorisation a, KnownNat m) => SFactors a m
- someSFactors :: (Ord a, Num a) => [(Prime a, Word)] -> Some (SFactors a)
- unSFactors :: SFactors a m -> [(Prime a, Word)]
- proofFromSFactors :: forall a (m :: Nat). Integral a => SFactors a m -> () :- KnownNat m
- data CyclicGroup a (m :: Nat)
- cyclicGroup :: forall a (m :: Nat). (Integral a, UniqueFactorisation a, KnownNat m) => Maybe (CyclicGroup a m)
- cyclicGroupFromFactors :: (Eq a, Num a) => [(Prime a, Word)] -> Maybe (Some (CyclicGroup a))
- cyclicGroupFromModulo :: (Integral a, UniqueFactorisation a) => a -> Maybe (Some (CyclicGroup a))
- proofFromCyclicGroup :: forall a (m :: Nat). Integral a => CyclicGroup a m -> () :- KnownNat m
- pattern CG2 :: CyclicGroup a m
- pattern CG4 :: CyclicGroup a m
- pattern CGOddPrimePower :: Prime a -> Word -> CyclicGroup a m
- pattern CGDoubleOddPrimePower :: Prime a -> Word -> CyclicGroup a m
- cyclicGroupToSFactors :: forall a (m :: Nat). Num a => CyclicGroup a m -> SFactors a m
- sfactorsToCyclicGroup :: forall a (m :: Nat). (Eq a, Num a) => SFactors a m -> Maybe (CyclicGroup a m)
- data Some (a :: Nat -> Type) where
SFactors singleton
data SFactors a (m :: Nat) Source #
This singleton data type establishes a correspondence
between a modulo m
on type level
and its factorisation on term level.
Instances
sfactors :: forall a (m :: Nat). (Ord a, UniqueFactorisation a, KnownNat m) => SFactors a m Source #
Create a singleton from a type-level positive modulo m
,
passed in a constraint.
>>>
:set -XDataKinds
>>>
sfactors :: SFactors Integer 13
SFactors {unSFactors = [(Prime 13,1)]}
someSFactors :: (Ord a, Num a) => [(Prime a, Word)] -> Some (SFactors a) Source #
Create a singleton from factors of m
.
Factors must be distinct, as in output of factorise
.
>>>
import Math.NumberTheory.Primes
>>>
someSFactors (factorise 98)
SFactors {unSFactors = [(Prime 2,1),(Prime 7,2)]}
proofFromSFactors :: forall a (m :: Nat). Integral a => SFactors a m -> () :- KnownNat m Source #
Convert a singleton to a proof that m
is known. Usage example:
toModulo :: SFactors Integer m -> Natural toModulo t = case proofFromSFactors t of Sub Dict -> natVal t
CyclicGroup singleton
data CyclicGroup a (m :: Nat) Source #
This singleton data type establishes a correspondence
between a modulo m
on type level
and a cyclic group of the same order on term level.
Instances
Show a => Show (Some (CyclicGroup a)) Source # | |||||
Defined in Math.NumberTheory.Moduli.Singleton | |||||
NFData a => NFData (Some (CyclicGroup a)) Source # | |||||
Defined in Math.NumberTheory.Moduli.Singleton Methods rnf :: Some (CyclicGroup a) -> () # | |||||
Eq a => Eq (Some (CyclicGroup a)) Source # | |||||
Defined in Math.NumberTheory.Moduli.Singleton Methods (==) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # (/=) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # | |||||
Ord a => Ord (Some (CyclicGroup a)) Source # | |||||
Defined in Math.NumberTheory.Moduli.Singleton Methods compare :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Ordering # (<) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # (<=) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # (>) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # (>=) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # max :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Some (CyclicGroup a) # min :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Some (CyclicGroup a) # | |||||
Generic (CyclicGroup a m) Source # | |||||
Defined in Math.NumberTheory.Moduli.Singleton Associated Types
Methods from :: CyclicGroup a m -> Rep (CyclicGroup a m) x # to :: Rep (CyclicGroup a m) x -> CyclicGroup a m # | |||||
Show a => Show (CyclicGroup a m) Source # | |||||
Defined in Math.NumberTheory.Moduli.Singleton Methods showsPrec :: Int -> CyclicGroup a m -> ShowS # show :: CyclicGroup a m -> String # showList :: [CyclicGroup a m] -> ShowS # | |||||
NFData a => NFData (CyclicGroup a m) Source # | |||||
Defined in Math.NumberTheory.Moduli.Singleton Methods rnf :: CyclicGroup a m -> () # | |||||
Eq (CyclicGroup a m) Source # | |||||
Defined in Math.NumberTheory.Moduli.Singleton Methods (==) :: CyclicGroup a m -> CyclicGroup a m -> Bool # (/=) :: CyclicGroup a m -> CyclicGroup a m -> Bool # | |||||
Ord (CyclicGroup a m) Source # | |||||
Defined in Math.NumberTheory.Moduli.Singleton Methods compare :: CyclicGroup a m -> CyclicGroup a m -> Ordering # (<) :: CyclicGroup a m -> CyclicGroup a m -> Bool # (<=) :: CyclicGroup a m -> CyclicGroup a m -> Bool # (>) :: CyclicGroup a m -> CyclicGroup a m -> Bool # (>=) :: CyclicGroup a m -> CyclicGroup a m -> Bool # max :: CyclicGroup a m -> CyclicGroup a m -> CyclicGroup a m # min :: CyclicGroup a m -> CyclicGroup a m -> CyclicGroup a m # | |||||
type Rep (CyclicGroup a m) Source # | |||||
Defined in Math.NumberTheory.Moduli.Singleton type Rep (CyclicGroup a m) = D1 ('MetaData "CyclicGroup" "Math.NumberTheory.Moduli.Singleton" "arithmoi-0.13.1.0-5MRf044X2KZHoWPk5IpIma" 'False) ((C1 ('MetaCons "CG2'" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "CG4'" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "CGOddPrimePower'" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Prime a)) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)) :+: C1 ('MetaCons "CGDoubleOddPrimePower'" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Prime a)) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word)))) |
cyclicGroup :: forall a (m :: Nat). (Integral a, UniqueFactorisation a, KnownNat m) => Maybe (CyclicGroup a m) Source #
Create a singleton from a type-level positive modulo m
,
passed in a constraint.
>>>
:set -XDataKinds
>>>
import Data.Maybe
>>>
cyclicGroup :: Maybe (CyclicGroup Integer 169)
Just (CGOddPrimePower' (Prime 13) 2)
>>>
:set -XTypeOperators -XNoStarIsType
>>>
import GHC.TypeNats
>>>
sfactorsToCyclicGroup (sfactors :: SFactors Integer 4)
Just CG4'>>>
sfactorsToCyclicGroup (sfactors :: SFactors Integer (2 * 13 ^ 3))
Just (CGDoubleOddPrimePower' (Prime 13) 3)>>>
sfactorsToCyclicGroup (sfactors :: SFactors Integer (4 * 13))
Nothing
cyclicGroupFromFactors :: (Eq a, Num a) => [(Prime a, Word)] -> Maybe (Some (CyclicGroup a)) Source #
Create a singleton from factors.
Factors must be distinct, as in output of factorise
.
cyclicGroupFromModulo :: (Integral a, UniqueFactorisation a) => a -> Maybe (Some (CyclicGroup a)) Source #
Similar to cyclicGroupFromFactors
. factorise
,
but much faster, because it
but performes only one primality test instead of full
factorisation.
proofFromCyclicGroup :: forall a (m :: Nat). Integral a => CyclicGroup a m -> () :- KnownNat m Source #
Convert a cyclic group to a proof that m
is known. Usage example:
toModulo :: CyclicGroup Integer m -> Natural toModulo t = case proofFromCyclicGroup t of Sub Dict -> natVal t
pattern CG2 :: CyclicGroup a m Source #
Unidirectional pattern for residues modulo 2.
pattern CG4 :: CyclicGroup a m Source #
Unidirectional pattern for residues modulo 4.
pattern CGOddPrimePower :: Prime a -> Word -> CyclicGroup a m Source #
Unidirectional pattern for residues modulo p
^k
for odd prime p
.
pattern CGDoubleOddPrimePower :: Prime a -> Word -> CyclicGroup a m Source #
Unidirectional pattern for residues modulo 2p
^k
for odd prime p
.
SFactors <=> CyclicGroup
cyclicGroupToSFactors :: forall a (m :: Nat). Num a => CyclicGroup a m -> SFactors a m Source #
Invert sfactorsToCyclicGroup
.
>>>
import Data.Maybe
>>>
cyclicGroupToSFactors (fromJust (sfactorsToCyclicGroup (sfactors :: SFactors Integer 4)))
SFactors {unSFactors = [(Prime 2,2)]}
sfactorsToCyclicGroup :: forall a (m :: Nat). (Eq a, Num a) => SFactors a m -> Maybe (CyclicGroup a m) Source #
Check whether a multiplicative group of residues, characterized by its modulo, is cyclic and, if yes, return its form.
>>>
:set -XTypeOperators -XNoStarIsType
>>>
import GHC.TypeNats
>>>
sfactorsToCyclicGroup (sfactors :: SFactors Integer 4)
Just CG4'>>>
sfactorsToCyclicGroup (sfactors :: SFactors Integer (2 * 13 ^ 3))
Just (CGDoubleOddPrimePower' (Prime 13) 3)>>>
sfactorsToCyclicGroup (sfactors :: SFactors Integer (4 * 13))
Nothing
Some wrapper
data Some (a :: Nat -> Type) where Source #
Wrapper to hide an unknown type-level natural.
Instances
Show a => Show (Some (CyclicGroup a)) Source # | |
Defined in Math.NumberTheory.Moduli.Singleton | |
Show a => Show (Some (SFactors a)) Source # | |
NFData a => NFData (Some (CyclicGroup a)) Source # | |
Defined in Math.NumberTheory.Moduli.Singleton Methods rnf :: Some (CyclicGroup a) -> () # | |
NFData a => NFData (Some (SFactors a)) Source # | |
Defined in Math.NumberTheory.Moduli.Singleton | |
Eq a => Eq (Some (CyclicGroup a)) Source # | |
Defined in Math.NumberTheory.Moduli.Singleton Methods (==) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # (/=) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # | |
Ord a => Eq (Some (SFactors a)) Source # | |
Ord a => Ord (Some (CyclicGroup a)) Source # | |
Defined in Math.NumberTheory.Moduli.Singleton Methods compare :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Ordering # (<) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # (<=) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # (>) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # (>=) :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Bool # max :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Some (CyclicGroup a) # min :: Some (CyclicGroup a) -> Some (CyclicGroup a) -> Some (CyclicGroup a) # | |
Ord a => Ord (Some (SFactors a)) Source # | |
Defined in Math.NumberTheory.Moduli.Singleton Methods compare :: Some (SFactors a) -> Some (SFactors a) -> Ordering # (<) :: Some (SFactors a) -> Some (SFactors a) -> Bool # (<=) :: Some (SFactors a) -> Some (SFactors a) -> Bool # (>) :: Some (SFactors a) -> Some (SFactors a) -> Bool # (>=) :: Some (SFactors a) -> Some (SFactors a) -> Bool # max :: Some (SFactors a) -> Some (SFactors a) -> Some (SFactors a) # min :: Some (SFactors a) -> Some (SFactors a) -> Some (SFactors a) # |