ghc-bignum-1.3: GHC BigNum library
Copyright (c) Sylvain Henry 2019(c) Herbert Valerio Riedel 2014 BSD3 sylvain@haskus.fr provisional non-portable (GHC Extensions) None Haskell2010

GHC.Num.Integer

Description

The Integer type.

Synopsis

Documentation

data Integer Source #

Arbitrary precision integers. In contrast with fixed-size integral types such as Int, the Integer type represents the entire infinite range of integers.

Integers are stored in a kind of sign-magnitude form, hence do not expect two's complement form when using bit operations.

If the value is small (i.e., fits into an Int), the IS constructor is used. Otherwise IP and IN constructors are used to store a BigNat representing the positive or the negative value magnitude, respectively.

Invariant: IP and IN are used iff the value does not fit in IS.

Constructors

 IS Int# iff value in [minBound::Int, maxBound::Int] range IP ByteArray# iff value in ]maxBound::Int, +inf[ range IN ByteArray# iff value in ]-inf, minBound::Int[ range

Instances

Instances details
 Source # Instance detailsDefined in GHC.Num.Integer Methods Source # Instance detailsDefined in GHC.Num.Integer Methods

Check Integer invariants

Check Integer invariants

Integer Zero

Integer One

Conversion with...

Int

Create an Integer from an Int#

Create an Integer from an Int

Truncates Integer to least-significant Int#

Truncates Integer to least-significant Int#

BigNat

Create a positive Integer from a BigNat

Create a negative Integer from a BigNat

Create an Integer from a sign-bit and a BigNat

Convert an Integer into a sign-bit and a BigNat

Convert an Integer into a BigNat.

Return 0 for negative Integers.

Word

Convert a Word# into an Integer

Convert a Word into an Integer

Create a negative Integer with the given Word magnitude

Create an Integer from a sign and a Word magnitude

Truncate an Integer into a Word

Truncate an Integer into a Word

Natural

Convert a Natural into an Integer

Convert an Integer into a Natural

Return 0 for negative Integers.

Convert an Integer into a Natural

Return absolute value

Convert an Integer into a Natural

Throw an Underflow exception if input is negative.

Int64/Word64

Convert an Int64# into an Integer

Convert a Word64# into an Integer

Convert an Integer into an Int64#

Convert an Integer into a Word64#

Floating-point

Decode a Double# into (# Integer mantissa, Int# exponent #)

Encode (# Integer mantissa, Int# exponent #) into a Double#

Encode (Integer mantissa, Int exponent) into a Double

Encode (# Integer mantissa, Int# exponent #) into a Float#

TODO: Not sure if it's worth to write Float optimized versions here

Addr#

integerToAddr# :: Integer -> Addr# -> Bool# -> State# s -> (# State# s, Word# #) Source #

Write an Integer (without sign) to addr in base-256 representation and return the number of bytes written.

The endianness is selected with the Bool# parameter: write most significant byte first (big-endian) if 1# or least significant byte first (little-endian) if 0#.

Write an Integer (without sign) to addr in base-256 representation and return the number of bytes written.

The endianness is selected with the Bool# parameter: write most significant byte first (big-endian) if 1# or least significant byte first (little-endian) if 0#.

integerFromAddr# :: Word# -> Addr# -> Bool# -> State# s -> (# State# s, Integer #) Source #

Read an Integer (without sign) in base-256 representation from an Addr#.

The size is given in bytes.

The endianness is selected with the Bool# parameter: most significant byte first (big-endian) if 1# or least significant byte first (little-endian) if 0#.

Null higher limbs are automatically trimed.

Read an Integer (without sign) in base-256 representation from an Addr#.

The size is given in bytes.

The endianness is selected with the Bool# parameter: most significant byte first (big-endian) if 1# or least significant byte first (little-endian) if 0#.

Null higher limbs are automatically trimed.

Limbs

Convert a list of Word into an Integer

integerToMutableByteArray# :: Integer -> MutableByteArray# s -> Word# -> Bool# -> State# s -> (# State# s, Word# #) Source #

Write an Integer (without sign) in base-256 representation and return the number of bytes written.

The endianness is selected with the Bool# parameter: most significant byte first (big-endian) if 1# or least significant byte first (little-endian) if 0#.

Write an Integer (without sign) in base-256 representation and return the number of bytes written.

The endianness is selected with the Bool# parameter: most significant byte first (big-endian) if 1# or least significant byte first (little-endian) if 0#.

integerFromByteArray# :: Word# -> ByteArray# -> Word# -> Bool# -> State# s -> (# State# s, Integer #) Source #

Read an Integer (without sign) in base-256 representation from a ByteArray#.

The size is given in bytes.

The endianness is selected with the Bool# parameter: most significant byte first (big-endian) if 1# or least significant byte first (little-endian) if 0#.

Null higher limbs are automatically trimed.

Read an Integer (without sign) in base-256 representation from a ByteArray#.

The size is given in bytes.

The endianness is selected with the Bool# parameter: most significant byte first (big-endian) if 1# or least significant byte first (little-endian) if 0#.

Null higher limbs are automatically trimed.

Predicates

Negative predicate

Negative predicate

Zero predicate

One predicate

Comparison

Not-equal predicate.

Equal predicate.

Lower-or-equal predicate.

Lower predicate.

Greater predicate.

Greater-or-equal predicate.

Equal predicate.

Not-equal predicate.

Greater predicate.

Lower-or-equal predicate.

Lower predicate.

Greater-or-equal predicate.

Compare two Integer

Arithmetic

Subtract one Integer from another.

Add two Integers

Multiply two Integers

Negate Integer.

One edge-case issue to take into account is that Int's range is not symmetric around 0. I.e. minBound+maxBound = -1

IP is used iff n > maxBound::Int IN is used iff n < minBound::Int

Compute absolute value of an Integer

Return -1, 0, and 1 depending on whether argument is negative, zero, or positive, respectively

Return -1#, 0#, and 1# depending on whether argument is negative, zero, or positive, respectively

Simultaneous integerQuot and integerRem.

Divisor must be non-zero otherwise the GHC runtime will terminate with a division-by-zero fault.

Simultaneous integerQuot and integerRem.

Divisor must be non-zero otherwise the GHC runtime will terminate with a division-by-zero fault.

Simultaneous integerDiv and integerMod.

Divisor must be non-zero otherwise the GHC runtime will terminate with a division-by-zero fault.

Simultaneous integerDiv and integerMod.

Divisor must be non-zero otherwise the GHC runtime will terminate with a division-by-zero fault.

Compute greatest common divisor.

Compute least common multiple.

Square a Integer

Base 2 logarithm (floor)

For numbers <= 0, return 0

Base 2 logarithm (floor)

For numbers <= 0, return 0

Logarithm (floor) for an arbitrary base

For numbers <= 0, return 0

Logarithm (floor) for an arbitrary base

For numbers <= 0, return 0

Logarithm (floor) for an arbitrary base

For numbers <= 0, return 0

Logarithm (floor) for an arbitrary base

For numbers <= 0, return 0

integerIsPowerOf2# :: Integer -> (# (# #) | Word# #) Source #

Indicate if the value is a power of two and which one

Get the extended GCD of two integers.

integerGcde# a b returns (# g,x,y #) where * ax + by = g = |gcd a b|

Get the extended GCD of two integers.

integerGcde a b returns (g,x,y) where * ax + by = g = |gcd a b|

integerRecipMod# :: Integer -> Natural -> (# Natural | () #) Source #

Computes the modular inverse.

I.e. y = integerRecipMod# x m = x^(-1) mod m

with 0 < y < |m|

integerPowMod# :: Integer -> Integer -> Natural -> (# Natural | () #) Source #

Computes the modular exponentiation.

I.e. y = integer_powmod b e m = b^e mod m

with 0 <= y < abs m

If e is negative, we use integerRecipMod# to try to find a modular multiplicative inverse (which may not exist).

Bit operations

Count number of set bits. For negative arguments returns the negated population count of the absolute value.

Positive Integer for which only n-th bit is set

Integer for which only n-th bit is set

Test if n-th bit is set.

Fake 2's complement for negative values (might be slow)

Test if n-th bit is set. For negative Integers it tests the n-th bit of the negated argument.

Fake 2's complement for negative values (might be slow)

Shift-right operation

Fake 2's complement for negative values (might be slow)

Shift-right operation

Fake 2's complement for negative values (might be slow)

Shift-left operation

Shift-left operation

Remember that bits are stored in sign-magnitude form, hence the behavior of negative Integers is different from negative Int's behavior.

Bitwise OR operation

Fake 2's complement for negative values (might be slow)

Bitwise XOR operation

Fake 2's complement for negative values (might be slow)

Bitwise AND operation

Fake 2's complement for negative values (might be slow)

Binary complement of the

Miscellaneous

Compute the number of digits of the Integer (without the sign) in the given base.

base must be > 1