| Copyright | (c) 2025 Jared Tobin |
|---|---|
| License | MIT |
| Maintainer | Jared Tobin <jared@ppad.tech> |
| Safe Haskell | None |
| Language | Haskell2010 |
Data.Word.Wider
Description
Wider words, consisting of four Limbs.
Synopsis
- data Wider = Wider !(# Limb, Limb, Limb, Limb #)
- wider :: Word -> Word -> Word -> Word -> Wider
- to :: Integer -> Wider
- from :: Wider -> Integer
- eq_vartime :: Wider -> Wider -> Bool
- cmp :: Wider -> Wider -> Ordering
- cmp# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> Int#
- eq# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> Choice
- lt :: Wider -> Wider -> Choice
- lt# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> Choice
- gt :: Wider -> Wider -> Choice
- gt# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> Choice
- odd# :: (# Limb, Limb, Limb, Limb #) -> Choice
- odd :: Wider -> Choice
- select :: Wider -> Wider -> Choice -> Wider
- select# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> Choice -> (# Limb, Limb, Limb, Limb #)
- shl1 :: Wider -> Wider
- shr1 :: Wider -> Wider
- shl1_c :: Wider -> (# Wider, Choice #)
- shr1_c :: Wider -> (# Wider, Choice #)
- shr_limb :: Wider -> Int -> Wider
- shl_limb :: Wider -> Int -> Wider
- shl1_c# :: (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), Choice #)
- shr1_c# :: (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), Choice #)
- shr_limb# :: (# Limb, Limb, Limb, Limb #) -> Int# -> (# (# Limb, Limb, Limb, Limb #), Limb #)
- shl_limb# :: (# Limb, Limb, Limb, Limb #) -> Int# -> (# (# Limb, Limb, Limb, Limb #), Limb #)
- and :: Wider -> Wider -> Wider
- and_w# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- or :: Wider -> Wider -> Wider
- or_w# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- not :: Wider -> Wider
- not# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- add_o :: Wider -> Wider -> (Wider, Word)
- add_o# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), Limb #)
- add :: Wider -> Wider -> Wider
- add_w# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- add_mod :: Wider -> Wider -> Wider -> Wider
- add_mod# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- sub :: Wider -> Wider -> Wider
- sub_b :: Wider -> Wider -> (Wider, Word)
- sub_b# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), Limb #)
- sub_mod :: Wider -> Wider -> Wider -> Wider
- sub_mod# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- sub_mod_c# :: (# Limb, Limb, Limb, Limb #) -> Limb -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
- mul :: Wider -> Wider -> Wider
- mul_c :: Wider -> Wider -> (Wider, Wider)
- mul_c# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), (# Limb, Limb, Limb, Limb #) #)
- sqr :: Wider -> (Wider, Wider)
- sqr# :: (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), (# Limb, Limb, Limb, Limb #) #)
Four-limb words
Little-endian wider words, consisting of four Limbs.
>>>1 :: Wider1
wider :: Word -> Word -> Word -> Word -> Wider Source #
Construct a Wider word from four Words, provided in
little-endian order.
>>>wider 1 0 0 01
Comparison
eq_vartime :: Wider -> Wider -> Bool Source #
Compare Wider words for equality in variable time.
>>>eq_vartime 1 0False>>>eq_vartime 1 1True
cmp :: Wider -> Wider -> Ordering Source #
Constant-time comparison between Wider words.
>>>cmp 1 2LT>>>cmp 2 1GT>>>cmp 2 2EQ
Parity
Constant-time selection
Return a if c is truthy, otherwise return b.
>>>import qualified Data.Choice as C>>>select 0 1 (C.true# ())1
Bit manipulation
shl1 :: Wider -> Wider Source #
Constant-time 1-bit shift-left.
>>>shl1 12>>>shl1 (2 ^ (255 :: Word))0
shl1_c :: Wider -> (# Wider, Choice #) Source #
Constant-time 1-bit shift-left with carry, with a Choice indicating
whether the highest bit was set.
shr1_c :: Wider -> (# Wider, Choice #) Source #
Constant-time 1-bit shift-right with carry, with a Choice
indicating whether the lowest bit was set.
Shift right by less than the number of bits in a Limb (e.g., by
a maximum of 63 bits on 64-bit architectures). The shift amount is
unchecked.
>>>shr_limb 2 11
Shift left by less than the number of bits in a Limb (e.g., by
a maximum of 63 bits on 64-bit architectures). The shift amount is
unchecked.
>>>shl_limb 2 11>>>shl_limb 1 639223372036854775808
shr_limb# :: (# Limb, Limb, Limb, Limb #) -> Int# -> (# (# Limb, Limb, Limb, Limb #), Limb #) Source #
shl_limb# :: (# Limb, Limb, Limb, Limb #) -> Int# -> (# (# Limb, Limb, Limb, Limb #), Limb #) Source #
and_w# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) Source #
or_w# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) Source #
Binary not.
>>>not 0115792089237316195423570985008687907853269984665640564039457584007913129639935>>>not (not 0)0
Arithmetic
add_o :: Wider -> Wider -> (Wider, Word) Source #
Overflowing addition, computing 'a + b', returning the sum and a carry bit.
>>>add_o 1 1(2,0)>>>add_o 1 (2 ^ (256 :: Word) - 1)(0,1)
Modular addition.
Assumes that the sum is less than twice the modulus; this is not checked.
>>>add_mod 1 1 32>>>add_mod 1 2 30
Borrowing subtraction, computing 'a - b' and returning the difference with a borrow mask.
>>>sub_b 1 1(0,0)>>>sub_b 0 (2 ^ (256 :: Word) - 1)(1,18446744073709551615)
sub_mod :: Wider -> Wider -> Wider -> Wider Source #
Modular subtraction. Computes a - b mod m.
Assumes that the magnitude of the difference is less than the modulus (this is unchecked).
>>>sub_mod 1 1 40>>>sub_mod 2 3 43
Arguments
| :: (# Limb, Limb, Limb, Limb #) | minuend |
| -> Limb | carry bit |
| -> (# Limb, Limb, Limb, Limb #) | subtrahend |
| -> (# Limb, Limb, Limb, Limb #) | modulus |
| -> (# Limb, Limb, Limb, Limb #) | difference |
Modular subtraction with carry. Computes (# a, c #) - b mod m.
mul_c :: Wider -> Wider -> (Wider, Wider) Source #
Widening multiplication.
Returns the low and high Wider words of the product, in that
order.
>>>mul_c 2 3(6,0)>>>mul_c (2 ^ (256 :: Word) - 1) 2(115792089237316195423570985008687907853269984665640564039457584007913129639934,1)
mul_c# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #) -> (# (# Limb, Limb, Limb, Limb #), (# Limb, Limb, Limb, Limb #) #) Source #