Copyright | (c) 2017-2022 Andrew Lelechenko |
---|---|
License | MIT |
Maintainer | Andrew Lelechenko <andrew.lelechenko@gmail.com> |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Data.Mod.Word
Description
Modular arithmetic, promoting moduli to the type level, with an emphasis on performance. Originally part of the arithmoi package.
This module supports only moduli, which fit into Word
.
Use the (slower) Data.Mod module for handling arbitrary-sized moduli.
Documentation
This data type represents integers modulo m, equipped with useful instances.
For example, 3 :: Mod
10 stands for the class of integers
congruent to \( 3 \bmod 10 \colon \ldots {−17}, −7, 3, 13, 23 \ldots \)
>>>
:set -XDataKinds
>>>
3 + 8 :: Mod 10 -- 3 + 8 = 11 ≡ 1 (mod 10)
1
Note: Mod
0 has no inhabitants, eventhough \( \mathbb{Z}/0\mathbb{Z} \) is technically isomorphic to \( \mathbb{Z} \).
Instances
Vector Vector (Mod m) Source # | No validation checks are performed; reading untrusted data may corrupt internal invariants. |
Defined in Data.Mod.Word Methods basicUnsafeFreeze :: Mutable Vector s (Mod m) -> ST s (Vector (Mod m)) Source # basicUnsafeThaw :: Vector (Mod m) -> ST s (Mutable Vector s (Mod m)) Source # basicLength :: Vector (Mod m) -> Int Source # basicUnsafeSlice :: Int -> Int -> Vector (Mod m) -> Vector (Mod m) Source # basicUnsafeIndexM :: Vector (Mod m) -> Int -> Box (Mod m) Source # basicUnsafeCopy :: Mutable Vector s (Mod m) -> Vector (Mod m) -> ST s () Source # | |
MVector MVector (Mod m) Source # | No validation checks are performed; reading untrusted data may corrupt internal invariants. |
Defined in Data.Mod.Word Methods basicLength :: MVector s (Mod m) -> Int Source # basicUnsafeSlice :: Int -> Int -> MVector s (Mod m) -> MVector s (Mod m) Source # basicOverlaps :: MVector s (Mod m) -> MVector s (Mod m) -> Bool Source # basicUnsafeNew :: Int -> ST s (MVector s (Mod m)) Source # basicInitialize :: MVector s (Mod m) -> ST s () Source # basicUnsafeReplicate :: Int -> Mod m -> ST s (MVector s (Mod m)) Source # basicUnsafeRead :: MVector s (Mod m) -> Int -> ST s (Mod m) Source # basicUnsafeWrite :: MVector s (Mod m) -> Int -> Mod m -> ST s () Source # basicClear :: MVector s (Mod m) -> ST s () Source # basicSet :: MVector s (Mod m) -> Mod m -> ST s () Source # basicUnsafeCopy :: MVector s (Mod m) -> MVector s (Mod m) -> ST s () Source # basicUnsafeMove :: MVector s (Mod m) -> MVector s (Mod m) -> ST s () Source # basicUnsafeGrow :: MVector s (Mod m) -> Int -> ST s (MVector s (Mod m)) Source # | |
Storable (Mod m) Source # | No validation checks are performed; reading untrusted data may corrupt internal invariants. |
Defined in Data.Mod.Word Methods sizeOf :: Mod m -> Int Source # alignment :: Mod m -> Int Source # peekElemOff :: Ptr (Mod m) -> Int -> IO (Mod m) Source # pokeElemOff :: Ptr (Mod m) -> Int -> Mod m -> IO () Source # peekByteOff :: Ptr b -> Int -> IO (Mod m) Source # pokeByteOff :: Ptr b -> Int -> Mod m -> IO () Source # | |
KnownNat m => Bounded (Mod m) Source # | |
KnownNat m => Enum (Mod m) Source # | |
Defined in Data.Mod.Word Methods succ :: Mod m -> Mod m Source # pred :: Mod m -> Mod m Source # toEnum :: Int -> Mod m Source # fromEnum :: Mod m -> Int Source # enumFrom :: Mod m -> [Mod m] Source # enumFromThen :: Mod m -> Mod m -> [Mod m] Source # enumFromTo :: Mod m -> Mod m -> [Mod m] Source # enumFromThenTo :: Mod m -> Mod m -> Mod m -> [Mod m] Source # | |
Generic (Mod m) Source # | |
KnownNat m => Num (Mod m) Source # | |
KnownNat m => Read (Mod m) Source # | Wrapping behaviour, similar to
the existing |
KnownNat m => Fractional (Mod m) Source # | Division by a residue, which is not
coprime
with the modulus, throws |
KnownNat m => Real (Mod m) Source # | |
Defined in Data.Mod.Word Methods toRational :: Mod m -> Rational Source # | |
Show (Mod m) Source # | |
NFData (Mod m) Source # | |
Defined in Data.Mod.Word | |
Eq (Mod m) Source # | |
Ord (Mod m) Source # | |
Defined in Data.Mod.Word | |
Prim (Mod m) Source # | No validation checks are performed; reading untrusted data may corrupt internal invariants. |
Defined in Data.Mod.Word Methods sizeOf# :: Mod m -> Int# Source # alignment# :: Mod m -> Int# Source # indexByteArray# :: ByteArray# -> Int# -> Mod m Source # readByteArray# :: MutableByteArray# s -> Int# -> State# s -> (# State# s, Mod m #) Source # writeByteArray# :: MutableByteArray# s -> Int# -> Mod m -> State# s -> State# s Source # setByteArray# :: MutableByteArray# s -> Int# -> Int# -> Mod m -> State# s -> State# s Source # indexOffAddr# :: Addr# -> Int# -> Mod m Source # readOffAddr# :: Addr# -> Int# -> State# s -> (# State# s, Mod m #) Source # writeOffAddr# :: Addr# -> Int# -> Mod m -> State# s -> State# s Source # setOffAddr# :: Addr# -> Int# -> Int# -> Mod m -> State# s -> State# s Source # | |
KnownNat m => Euclidean (Mod m) Source # |
The instance is lawful only for
prime |
KnownNat m => Field (Mod m) Source # |
The instance is lawful only for
prime |
Defined in Data.Mod.Word | |
KnownNat m => GcdDomain (Mod m) Source # |
The instance is lawful only for
prime |
KnownNat m => Ring (Mod m) Source # | |
KnownNat m => Semiring (Mod m) Source # | |
Unbox (Mod m) Source # | No validation checks are performed; reading untrusted data may corrupt internal invariants. |
Defined in Data.Mod.Word | |
newtype MVector s (Mod m) Source # | |
type Rep (Mod m) Source # | |
Defined in Data.Mod.Word | |
newtype Vector (Mod m) Source # | |
unMod :: Mod m -> Word Source #
The canonical representative of the residue class, always between 0 and \( m - 1 \) (inclusively).
>>>
:set -XDataKinds
>>>
-1 :: Mod 10
9
(^%) :: (KnownNat m, Integral a) => Mod m -> a -> Mod m infixr 8 Source #
Drop-in replacement for ^
with a bit better performance.
Negative powers are allowed, but may throw DivideByZero
, if an argument
is not coprime with the modulus.
>>>
:set -XDataKinds
>>>
3 ^% 4 :: Mod 10 -- 3 ^ 4 = 81 ≡ 1 (mod 10)
1>>>
3 ^% (-1) :: Mod 10 -- 3 * 7 = 21 ≡ 1 (mod 10)
7>>>
4 ^% (-1) :: Mod 10 -- 4 and 10 are not coprime
(*** Exception: divide by zero