struct

BigInt

Inherits Comparable / Comparable / Comparable / Comparable / Int / Comparable / Comparable / Comparable / Number / Comparable / Steppable / Comparable / Value / Object

A BigInt can represent arbitrarily large integers.

It is implemented under the hood with GMP.

NOTE: To use BigInt, you must explicitly import it with require "big"

Constructors

from_digits(digits : Enumerable(Int), base : Int = 10) : self

Returns a number for given digits and base. The digits are expected as an Enumerable with the least significant digit as the first element.

base must not be less than 2.

All digits must be within 0...base.

Source
new(str : String, base : Int32 = 10)

Creates a BigInt with the value denoted by str in the given base.

Raises ArgumentError if the string doesn't denote a valid integer.

require "big"

BigInt.new("123456789123456789123456789123456789") # => 123456789123456789123456789123456789
BigInt.new("123_456_789_123_456_789_123_456_789")  # => 123456789123456789123456789
BigInt.new("1234567890ABCDEF", base: 16)           # => 1311768467294899695
Source
new(num : Int::Primitive) : self

Creates a BigInt from the given num.

Source
new(num : Float::Primitive)

Returns a read-only Slice of the limbs that make up this integer, which is effectively abs.digits(2 ** N) where N is the number of bits in LibGMP::MpLimb, except that an empty Slice is returned for zero.

This assumes GMP wasn't built with its experimental nails support: https://gmplib.org/manual/Low_002dlevel-Functions

num must be finite.

Source
new(num : BigFloat) : self

Returns a read-only Slice of the limbs that make up this integer, which is effectively abs.digits(2 ** N) where N is the number of bits in LibGMP::MpLimb, except that an empty Slice is returned for zero.

This assumes GMP wasn't built with its experimental nails support: https://gmplib.org/manual/Low_002dlevel-Functions

Source
new(num : BigDecimal) : self

Returns a read-only Slice of the limbs that make up this integer, which is effectively abs.digits(2 ** N) where N is the number of bits in LibGMP::MpLimb, except that an empty Slice is returned for zero.

This assumes GMP wasn't built with its experimental nails support: https://gmplib.org/manual/Low_002dlevel-Functions

Source
new(num : BigRational) : self

Returns a read-only Slice of the limbs that make up this integer, which is effectively abs.digits(2 ** N) where N is the number of bits in LibGMP::MpLimb, except that an empty Slice is returned for zero.

This assumes GMP wasn't built with its experimental nails support: https://gmplib.org/manual/Low_002dlevel-Functions

Source
new(num : BigInt) : self

Returns num. Useful for generic code that does T.new(...) with T being a Number.

Source
new(pull : JSON::PullParser) : self
Source
new

Creates a BigInt with the value zero.

require "big"

BigInt.new # => 0
Source

Class methods

from_json_object_key?(key : String) : BigInt | Nil
Source

Instance methods

%(other : Int) : BigInt

Returns self modulo other.

This uses floored division.

See Int#/ for more details.

Source
&(other : BigInt) : BigInt
Source
&(other : Int) : BigInt
Source
&*(other) : BigInt
Source
&+(other) : BigInt
Source
&-(other) : BigInt
Source
*(other : BigInt) : BigInt
Source
*(other : Int) : BigInt
Source
**(other : Int) : BigInt

Returns the value of raising self to the power of exponent.

Raises ArgumentError if exponent is negative: if this is needed, either use a float base or a float exponent.

Raises OverflowError in case of overflow.

2 ** 3  # => 8
2 ** 0  # => 1
2 ** -1 # ArgumentError
Source
+(other : BigInt) : BigInt
Source
+(other : Int) : BigInt
Source
-(other : BigInt) : BigInt
Source
-(other : Int) : BigInt
Source
/(other : BigInt) : BigFloat
Source
/(other : Int8) : BigFloat
Source
/(other : UInt8) : BigFloat
Source
/(other : Int16) : BigFloat
Source
/(other : UInt16) : BigFloat
Source
/(other : Int32) : BigFloat
Source
/(other : UInt32) : BigFloat
Source
/(other : Int64) : BigFloat
Source
/(other : UInt64) : BigFloat
Source
/(other : Int128) : BigFloat
Source
/(other : UInt128) : BigFloat
Source
/(other : Float32) : BigFloat
Source
/(other : Float64) : BigFloat
Source
//(other : Int) : BigInt
Source
<<(other : Int) : BigInt

Returns the result of shifting this number's bits count positions to the left.

  • If count is greater than the number of bits of this integer, returns 0
  • If count is negative, a right shift is performed
8000 << 1  # => 16000
8000 << 2  # => 32000
8000 << 32 # => 0
8000 << -1 # => 4000
Source
<=>(other : BigInt)
Source
<=>(other : Int)
Source
<=>(other : Float::Primitive) : Int32 | Nil
Source
>>(other : Int) : BigInt

Returns the result of shifting this number's bits count positions to the right. Also known as arithmetic right shift.

  • If count is greater than the number of bits of this integer, returns 0
  • If count is negative, a left shift is performed
8000 >> 1  # => 4000
8000 >> 2  # => 2000
8000 >> 32 # => 0
8000 >> -1 # => 16000

-8000 >> 1 # => -4000
Source
^(other : BigInt) : BigInt
Source
^(other : Int) : BigInt
Source
|(other : BigInt) : BigInt
Source
|(other : Int) : BigInt
Source
abs

Returns the absolute value of this number.

123.abs  # => 123
-123.abs # => 123
Source
bit(bit : Int) : Int32
Source
bit_length

Returns the number of bits of this int value.

“The number of bits” means that the bit position of the highest bit which is different to the sign bit. (The bit position of the bit 2**n is n+1.) If there is no such bit (zero or minus one), zero is returned.

I.e. This method returns ceil(log2(self < 0 ? -self : self + 1)).

0.bit_length # => 0
1.bit_length # => 1
2.bit_length # => 2
3.bit_length # => 2
4.bit_length # => 3
5.bit_length # => 3

# The above is the same as
0b0.bit_length   # => 0
0b1.bit_length   # => 1
0b10.bit_length  # => 2
0b11.bit_length  # => 2
0b100.bit_length # => 3
0b101.bit_length # => 3
Source
clone
Source
digits(base = 10) : Array(Int32)

Returns the digits of a number in a given base. The digits are returned as an array with the least significant digit as the first array element.

12345.digits      # => [5, 4, 3, 2, 1]
12345.digits(7)   # => [4, 6, 6, 0, 5]
12345.digits(100) # => [45, 23, 1]

-12345.digits(7) # => ArgumentError
Source
divisible_by?(number : BigInt) : Bool
Source
divisible_by?(number : Int) : Bool
Source
divmod(number : Int) : Tuple(BigInt, BigInt)
Source
factorial
Source
gcd(other : BigInt) : BigInt

Returns the greatest common divisor of self and other.

Source
gcd(other : Int) : Int

Returns the greatest common divisor of self and other.

Source
lcm(other : BigInt) : BigInt

Returns the least common multiple of self and other.

Source
lcm(other : Int) : BigInt

Returns the least common multiple of self and other.

Source
popcount

Counts 1-bits in the binary representation of this integer.

5.popcount   # => 2
-15.popcount # => 29
Source
remainder(other : Int) : BigInt

Returns self remainder other.

This uses truncated division.

See Int#tdiv for more details.

Source
tdiv(other : Int) : BigInt

Divides self by other using truncated division.

In truncated division, given two integers x and y:

  • q = x.tdiv(y) is rounded toward zero
  • r = x.remainder(y) has the sign of x
  • x == q*y + r

For example:

 x     y     x / y     x % y
 5     3       1         2
-5     3      -1        -2
 5    -3      -1         2
-5    -3       1        -2

Raises if other is 0, or if other is -1 and self is signed and is the minimum value for that integer type.

Source
to_big_d

Converts self to BigDecimal.

require "big"
123456789012345678.to_big_d
Source
to_big_f
Source
to_big_i

Returns a BigInt representing this integer.

require "big"

123.to_big_i
Source
to_big_r

Returns a BigRational representing this integer.

require "big"

123.to_big_r
Source
to_f
Source
to_f!
Source
to_f32
Source
to_f32!
Source
to_f64
Source
to_f64!
Source
to_i
Source
to_i!
Source
to_i128
Source
to_i128!
Source
to_i16
Source
to_i16!
Source
to_i32
Source
to_i32!
Source
to_i64
Source
to_i64!
Source
to_i8
Source
to_i8!
Source
to_json(json : JSON::Builder) : Nil
Source
to_json_object_key
Source
to_s(io : IO, base : Int = 10, *, precision : Int = 1, upcase : Bool = false) : Nil

Appends a string representation of this integer to the given io.

base specifies the radix of the written string, and must be either 62 or a number between 2 and 36. By default, digits above 9 are represented by ASCII lowercase letters (a for 10, b for 11, etc.), but uppercase letters may be used if upcase is true, unless base 62 is used. In that case, lowercase letters are used for 10 to 35, and uppercase ones for 36 to 61, and upcase must be false.

precision specifies the minimum number of digits in the written string. If there are fewer digits than this number, the string is left-padded by zeros. If self and precision are both zero, returns an empty string.

Source
to_s(base : Int = 10, *, precision : Int = 1, upcase : Bool = false) : String

Returns a string representation of this integer.

base specifies the radix of the returned string, and must be either 62 or a number between 2 and 36. By default, digits above 9 are represented by ASCII lowercase letters (a for 10, b for 11, etc.), but uppercase letters may be used if upcase is true, unless base 62 is used. In that case, lowercase letters are used for 10 to 35, and uppercase ones for 36 to 61, and upcase must be false.

precision specifies the minimum number of digits in the returned string. If there are fewer digits than this number, the string is left-padded by zeros. If self and precision are both zero, returns an empty string.

1234.to_s                   # => "1234"
1234.to_s(2)                # => "10011010010"
1234.to_s(16)               # => "4d2"
1234.to_s(16, upcase: true) # => "4D2"
1234.to_s(36)               # => "ya"
1234.to_s(62)               # => "jU"
1234.to_s(precision: 2)     # => "1234"
1234.to_s(precision: 6)     # => "001234"
Source
to_u
Source
to_u!
Source
to_u128
Source
to_u128!
Source
to_u16
Source
to_u16!
Source
to_u32
Source
to_u32!
Source
to_u64
Source
to_u64!
Source
to_u8
Source
to_u8!
Source
to_unsafe
Source
trailing_zeros_count

Returns the number of trailing 0-bits.

Source
unsafe_floored_div(other : BigInt) : BigInt
Source
unsafe_floored_div(other : Int) : BigInt
Source
unsafe_floored_divmod(number : BigInt) : Tuple(BigInt, BigInt)
Source
unsafe_floored_divmod(number : Int) : Tuple(BigInt, BigInt)
Source
unsafe_floored_mod(other : BigInt) : BigInt
Source
unsafe_floored_mod(other : Int) : BigInt
Source
unsafe_truncated_div(other : BigInt) : BigInt
Source
unsafe_truncated_div(other : Int) : BigInt
Source
unsafe_truncated_divmod(number : BigInt) : Tuple(BigInt, BigInt)
Source
unsafe_truncated_divmod(number : Int)
Source
unsafe_truncated_mod(other : BigInt) : BigInt
Source
unsafe_truncated_mod(other : Int) : BigInt
Source