Safe Haskell | None |
---|---|
Language | Haskell2010 |
Provides the ModN
type for modular arithmetic.
Since: 0.1
Synopsis
- newtype ModN (n :: Nat) a where
- UnsafeModN a
- pattern MkModN :: a -> ModN n a
- mkModN :: forall (n :: Nat) a. (Integral a, KnownNat n, MaybeUpperBounded a, Typeable a) => a -> Either String (ModN n a)
- unsafeModN :: forall (n :: Nat) a. (HasCallStack, Integral a, KnownNat n, MaybeUpperBounded a, Typeable a) => a -> ModN n a
- reallyUnsafeModN :: forall (n :: Nat) a. (Integral a, KnownNat n) => a -> ModN n a
- errMsg :: String -> String -> String
Type
newtype ModN (n :: Nat) a Source #
Newtype wrapper that represents \( \mathbb{Z}/n\mathbb{Z} \).
ModN
is a Ring
i.e. supports addition, subtraction,
and multiplication.
When constructing a
we must verify that the type ModN
n aa
is large
enough to accommodate n
, hence the possible failure.
Examples
>>>
import Data.Text.Display (display)
>>>
display $ unsafeModN @7 10
"3 (mod 7)"
Since: 0.1
pattern MkModN :: a -> ModN n a | Bidirectional pattern synonym for Since: 0.1 |
Instances
Creation
mkModN :: forall (n :: Nat) a. (Integral a, KnownNat n, MaybeUpperBounded a, Typeable a) => a -> Either String (ModN n a) Source #
Constructor for ModN
.
Examples
>>>
mkModN @5 7
Right (MkModN 2 (mod 5))
>>>
mkModN @10 7
Right (MkModN 7 (mod 10))
>>>
mkModN @128 (9 :: Int8)
Left "Type 'Int8' has a maximum size of 127. This is not large enough to safely implement mod 128."
Since: 0.1
unsafeModN :: forall (n :: Nat) a. (HasCallStack, Integral a, KnownNat n, MaybeUpperBounded a, Typeable a) => a -> ModN n a Source #
Variant of mkModN
that throws an error when type a
is not
large enough to fit n
.
WARNING: Partial
Examples
>>>
unsafeModN @7 12
MkModN 5 (mod 7)
Since: 0.1
reallyUnsafeModN :: forall (n :: Nat) a. (Integral a, KnownNat n) => a -> ModN n a Source #
This function reduces the argument modulo p
but does not check
that n
fits within a. Note that correct behavior requires this, so this
is dangerous. This is intended only for when we absolutely know n
fits in
a
and the check is undesirable for performance reasons. Exercise extreme
caution.
Since: 0.1