## MLton 20241230

# MLtonIntInf

    signature MLTON_INT_INF =
       sig
          type t = IntInf.int

          val areSmall: t * t -> bool
          val gcd: t * t -> t
          val isSmall: t -> bool

          structure BigWord : WORD
          structure SmallInt : INTEGER
          datatype rep =
             Big of BigWord.word vector
           | Small of SmallInt.int
          val rep: t -> rep
          val fromRep : rep -> t option
       end

MLton represents an arbitrary precision integer either as an unboxed word with the bottom bit set to 1 and the top bits representing a small signed integer, or as a pointer to a vector of words, where the first word indicates the sign and the rest are the limbs of a GMP big integer.

- `type t`

  the same as type `IntInf.int`.

- `areSmall (a, b)`

  returns true iff both `a` and `b` are small.

- `gcd (a, b)`

  uses GMP’s fast gcd implementation.

- `isSmall a`

  returns true iff `a` is small.

- `BigWord : WORD`

  representation of a big `IntInf.int` as a vector of words; on 32-bit platforms, `BigWord` is likely to be equivalent to `Word32`, and on 64-bit platforms, `BigWord` is likely to be equivalent to `Word64`.

- `SmallInt : INTEGER`

  representation of a small `IntInf.int` as a signed integer; on 32-bit platforms, `SmallInt` is likely to be equivalent to `Int32`, and on 64-bit platforms, `SmallInt` is likely to be equivalent to `Int64`.

- `datatype rep`

  the underlying representation of an `IntInf.int`.

- `rep i`

  returns the underlying representation of `i`.

- `fromRep r`

  converts from the underlying representation back to an `IntInf.int`. If `fromRep r` is given anything besides the valid result of `rep i` for some `i`, this function call will return `NONE`.