Files
mruby-mruby/mrbgems/mruby-bigint
Yukihiro "Matz" Matsumoto 0220ec2b62 mruby-bigint: add balance multiplication for asymmetric operands
When multiplying numbers where one is significantly larger than the other
(at least 2x size difference), split the larger number into chunks matching
the smaller number's size, multiply each chunk, and combine results. This
avoids pathological performance when Toom-3 pads asymmetric operands with
zeros.

Benchmarks show 6-16x speedup for size ratios from 10:1 to 40:1, with no
regression for symmetric cases.

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-15 14:37:18 +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.