Files
mruby-mruby/mrbgems/mruby-bigint
Yukihiro "Matz" Matsumoto ece641c56f mruby-bigint: optimize to_s with 10^k = 2^k * 5^k factorization
use the mathematical identity 10^k = 2^k * 5^k to speed up the
divide-and-conquer decimal string conversion. dividing by 5^k
is faster than dividing by 10^k because 5^k has ~30% fewer bits
(log2(5) ≈ 2.32 vs log2(10) ≈ 3.32). the 2^k component is handled
with fast bit shifts.

benchmarks show 3-8% improvement for large numbers:
- 800K bits: 1.00s -> 0.97s
- 1.6M bits: 3.95s -> 3.84s
- 2.4M bits: 8.79s -> 8.46s

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-12 09:21:32 +09:00
..
2025-05-14 02:01:02 +10:00
2025-06-23 17:07:20 +09:00

mruby-bigint

mruby-bigint is an mrbgem that provides multi-precision integer (BigInt) support for mruby. It allows you to work with integers that are larger than the standard Integer type can handle.

This extension uses fgmp, which is a public domain implementation of a subset of the GNU gmp library by Mark Henderson markh@wimsey.bc.ca. But it's heavily modified to fit with mruby. You can get the original source code from https://github.com/deischi/fgmp.git. You can read the original README for fgmp in README-fgmp.md.

If you want to create your own Multi-precision Integer GEM, see examples/mrbgems/mruby-YOUR-bigint/TODO-HINT.md.

Features

  • Basic arithmetic operations: +, -, *, /, %
  • Power operation: **
  • Modular exponentiation
  • Bitwise operations: &, |, ^, <<, >>
  • Comparison: <=>
  • Conversion to and from strings: to_s, String#to_i (with base)
  • Square root
  • Greatest Common Divisor (GCD) (available if MRB_USE_RATIONAL is defined)

Usage

Here are some simple examples of how to use mruby-bigint:

# Creating BigInts
a = BigInt(12345678901234567890)
b = "98765432109876543210".to_i(10) # Specify base 10 for string conversion

# Arithmetic operations
c = a + b
puts c.to_s # Output: 111111111011111111100

d = a * 2
puts d.to_s # Output: 24691357802469135780

# Comparison
puts a <=> b # Output: -1

fgmp Dependency

mruby-bigint depends on fgmp. For more information about fgmp, please see README-fgmp.md.