Skip to content

Library to provide native, big integer operations in Lua

License

Notifications You must be signed in to change notification settings

empyreuma/bigint.lua

Repository files navigation

bigint.lua is a library that attempts to remove the restrictions on number size built into vanilla Lua. In order to achieve this, all numbers using operations that this library provides must first be passed through the bigint.new(num) function, which converts the number into a table in which every index is a single digit:

bigint.new(132) -> {
    sign: "+",
    digits: { 1.0, 3.0, 2.0 }
}

To simplify the documentation, serialized strings will, from here on out, be referred to as being of the imaginary type "bigint".

Strings can also be passed into this function. If the number to be serialized is already too big to exist in lua (inf), you can pass it as a string:

bigint.new("132") -> {
    sign: "+",
    digits: { 1.0, 3.0, 2.0 }
}

To convert a big back into a number, use the unserialize() function:

big = bigint.new("5880")
bigint.unserialize(big) -> 5880

Bigints can be added or subtracted using normal Lua operators:

bigint.unserialize(bigint.new(1) + bigint.new(2)) -> 3

Currently, only ints are supported. Floats may be added in the future.

Behavior to keep in mind:

  • All operations return a new bigint

Supported frontend operations in bigint.lua:

  • bigint.new(num or string) - Create a new bigint
  • bigint.check(bigint) - Check if a variable's "type" is bigint - can be forced internally on all operations if the "strict" variable in bigint.lua is set to true (default behavior)
  • bigint.abs(bigint) - Create a new, positive bigint with the same digits
  • bigint.unserialize(bigint, output_type, precision) - Convert a bigint into a number or a string. By default, the bigint will be converted into a number. output_type is a string that changes the output of the function. Possible output types are "string" (alias "s"), "human-readable" (alias "human" and "h") and "scientific" (alias "sci"). Precision is an integer that specifies the number of digits to be displayed in human-readable or scientific output.
  • bigint.compare(bigint, bigint, comparison) - Compare two bigints, returning true if the comparison is true. Possible comparisons are "<", ">", "==", ">=", "<=", "~=" and "!=". You can also use the shell versions: "lt", "gt", "eq", "ge", "le" and "ne".
  • bigint.add(bigint, bigint) - Frontend addition, accounting for signs
  • bigint.subtract(bigint, bigint) - Frontend subtraction, accounting for signs
  • bigint.multiply(bigint, bigint) - Frontend multiplication operation that multiplies two multi-digit bigs and accounts for signs
  • bigint.exponentiate(bigint, bigint) - Raise a bigint to a big power (positive integer powers only for now)
  • bigint.divide(bigint, bigint) - Frontend division operation that accounts for signs and translates arguments into their absolute values for use in bigint.divide_raw(), returning a result and remainder
  • bigint.modulus(bigint, bigint) - Frontend for the already frontend bigint.divide() function that only returns the remainder and makes sure that the remainder has the same sign as the dividend, as per C standard

Backend operations (may be useful if you need more speed):

  • bigint.add_raw(bigint, bigint) - Backend addition operation that ignores signs
  • bigint.subtract_raw(bigint, bigint) - Backend subtraction operation that ignores signs
  • bigint.multiply_single(bigint, bigint) - Backend multiplication operation that multiplies a multi-digit big by a single digit and ignores signs
  • bigint.divide_raw(bigint, bigint) - DO NOT USE: Backend division operation that only supports positive integers, returning a result and remainder

Supported methods:

  • bigint:clone() - Return a new bigint with the same sign and digits

Supported operations in bigint-extra.lua:

  • bigint_extra.random(bigint, bigint) - Blum Blum Shub PRNG implementation that takes one, two, or zero arguments. Let R be all possible outputs; by default, arg1 <= R <= arg2. If the second argument is not given: 1 <= R <= arg1. If no arguments are given, 0 <= R <= 1

TODO:

  • bigint.eval - Evaluate an expression, following the order of operations
  • Serialization of scientific notation
  • Maybe some other random number generators

For more detailed documentation, see bigint.lua. The operations appear in the order that they are listed above.

CONTRIBUTIONS:

  • 123eee555 - Logic for human-readable bigint.unserialize output

About

Library to provide native, big integer operations in Lua

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published