Rust大整数运算库ibig的使用,ibig提供高性能任意精度整数计算和数学运算功能

Rust大整数运算库ibig的使用,ibig提供高性能任意精度整数计算和数学运算功能

ibig是一个具有良好性能的大整数库,实现了高效的纯Rust大整数算术运算。

该库提供了两种整数类型:

  • UBig:用于无符号整数
  • IBig:用于有符号整数

还通过modular模块支持模运算。

示例代码

以下是内容中提供的示例:

use ibig::{ibig, modular::ModuloRing, ubig, UBig};

let a = ubig!(12345678);
let b = ubig!(0x10ff);
let c = ibig!(-azz base 36);
let d: UBig = "15033211231241234523452345345787".parse()?;
let e = 2 * &b + 1;
let f = a * b.pow(10);

assert_eq!(e, ubig!(0x21ff));
assert_eq!(c.to_string(), "-14255");
assert_eq!(
    f.in_radix(16).to_string(),
    "1589bda8effbfc495d8d73c83d8b27f94954e"
);
assert_eq!(
    format!("hello {:#x}", d % ubig!(0xabcd1234134132451345)),
    "hello 0x1a7e7c487267d2658a93"
);

let ring = ModuloRing::new(&ubig!(10000));
let x = ring.from(12345);
let y = ring.from(55443);
assert_eq!(format!("{}", x - y), "6902 (mod 10000)");

完整示例demo

以下是基于上述内容的完整使用示例:

// 引入ibig库
use ibig::{ibig, modular::ModuloRing, ubig, UBig};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建无符号大整数
    let a = ubig!(12345678);
    let b = ubig!(0x10ff);
    
    // 创建有符号大整数(使用36进制)
    let c = ibig!(-azz base 36);
    
    // 从字符串解析大整数
    let d: UBig = "15033211231241234523452345345787".parse()?;
    
    // 基本算术运算
    let e = 2 * &b + 1;
    let f = a * b.pow(10);
    
    // 断言验证结果
    assert_eq!(e, ubig!(0x21ff));
    assert_eq!(c.to_string(), "-14255");
    assert_eq!(
        f.in_radix(16).to_string(),
        "1589bda8effbfc495d8d73c83d8b27f94954e"
    );
    
    // 格式化输出
    println!("d % 0xabcd1234134132451345 = {:#x}", d % ubig!(0xabcd1234134132451345));
    
    // 模运算示例
    let ring = ModuloRing::new(&ubig!(10000));
    let x = ring.from(12345);
    let y = ring.from(55443);
    println!("12345 - 55443 mod 10000 = {}", x - y);
    
    Ok(())
}

可选依赖项

  • std (默认):用于std::error::Error
  • num-traits (默认):整数特性
  • rand (默认):随机数生成
  • serde:序列化和反序列化

许可证

双许可:

  • Apache License, Version 2.0
  • MIT license

贡献

除非您明确声明,否则任何贡献都将按照上述双重许可提交。


1 回复

Rust大整数运算库ibig的使用指南

ibig简介

ibig是Rust语言中的一个高性能任意精度整数运算库,提供了大整数计算和数学运算功能。它支持任意大小的整数运算,解决了原生整数类型(i32, i64等)在位数上的限制问题。

主要特性

  • 任意精度整数运算
  • 高性能实现
  • 支持基本算术运算(加减乘除)
  • 提供高级数学运算功能
  • 良好的Rust生态集成

安装方法

在Cargo.toml中添加依赖:

[dependencies]
ibig = "0.3"

基本使用方法

创建大整数

use ibig::{ibig, IBig};

// 使用宏创建
let a = ibig!(12345678901234567890);
let b = ibig!(-98765432109876543210);

// 从字符串创建
let c: IBig = "123456789012345678901234567890".parse().unwrap();

基本算术运算

use ibig::{ibig, IBig};

let a = ibig!(12345678901234567890);
let b = ibig!(98765432109876543210);

// 加法
let sum = &a + &b;
println!("a + b = {}", sum);  // 111111111011111111100

// 减法
let diff = &b - &a;
println!("b - a = {}", diff);  // 86419753208641975320

// 乘法
let product = &a * &b;
println!("a * b = {}", product);  // 1219326311370217952237463801111263526900

// 除法
let quotient = &b / &a;
println!("b / a = {}", quotient);  // 8

// 取模
let remainder = &b % &a;
println!("b % a = {}", remainder);  // 98765432109876543210 - 8*12345678901234567890 = 0

比较运算

use ibig::ibig;

let x = ibig!(12345678901234567890);
let y = ibig!(98765432109876543210);

println!("x == y: {}", x == y);  // false
println!("x < y: {}", x < y);    // true
println!("x > y: {}", x > y);    // false

幂运算

use ibig::{ibig, IBig};

let base = ibig!(2);
let exponent = 100;
let power = base.pow(exponent);
println!("2^100 = {}", power);  // 1267650600228229401496703205376

位运算

use ibig::ibig;

let a = ibig!(0b1100);
let b = ibig!(0b1010);

println!("AND: {:b}", &a & &b);  // 1000
println!("OR: {:b}", &a | &b);   // 1110
println!("XOR: {:b}", &a ^ &b);  // 0110
println!("NOT a: {:b}", !&a);    // ...11111111111111111111111111110011 (无限位)

数学函数

use ibig::{ibig, IBig};

let n = ibig!(100);
let k = ibig!(5);

// 阶乘
let factorial = n.factorial();
println!("100! has {} digits", factorial.to_string().len());

// 组合数
let combinations = IBig::binomial(&n, &k);
println!("C(100,5) = {}", combinations);  // 75287520

// GCD (最大公约数)
let gcd = IBig::gcd(&ibig!(48), &ibig!(18));
println!("GCD(48,18) = {}", gcd);  // 6

转换到原生类型

use ibig::ibig;

let big_num = ibig!(12345678901234567890);

// 尝试转换为u64
if let Ok(num) = big_num.try_into::<u64>() {
    println!("Converted to u64: {}", num);
} else {
    println!("Number too large for u64");
}

性能建议

  1. 尽量重用已分配的IBig值而不是频繁创建新值
  2. 对于循环中的操作,考虑使用&引用避免所有权转移
  3. 对于已知不会溢出的中间计算,可以先使用原生类型再转换为IBig

与其他库的比较

ibig相比Rust的其他大整数库(num-bigint等)有更好的性能表现,特别是在乘法运算和位运算方面。它的API设计也更加简洁直观。

总结

ibig为Rust提供了高效、易用的任意精度整数运算能力,适用于密码学、科学计算、金融计算等需要处理超大整数的场景。通过简单的API即可完成复杂的数学运算,是Rust生态中值得关注的大整数计算解决方案。

完整示例代码

use ibig::{ibig, IBig};

fn main() {
    // 创建大整数示例
    println!("=== 创建大整数 ===");
    let num1 = ibig!(12345678901234567890);
    let num2 = ibig!(-98765432109876543210);
    let num3: IBig = "123456789012345678901234567890".parse().unwrap();
    println!("num1 = {}", num1);
    println!("num2 = {}", num2);
    println!("num3 = {}", num3);

    // 算术运算示例
    println!("\n=== 算术运算 ===");
    let sum = &num1 + &num3;
    let diff = &num3 - &num1;
    let product = &num1 * &num2;
    let quotient = &num3 / &num1;
    let remainder = &num3 % &num1;
    
    println!("num1 + num3 = {}", sum);
    println!("num3 - num1 = {}", diff);
    println!("num1 * num2 = {}", product);
    println!("num3 / num1 = {}", quotient);
    println!("num3 % num1 = {}", remainder);

    // 比较运算示例
    println!("\n=== 比较运算 ===");
    println!("num1 == num2: {}", num1 == num2);
    println!("num1 < num2: {}", num1 < num2);
    println!("num1 > num2: {}", num1 > num2);

    // 幂运算示例
    println!("\n=== 幂运算 ===");
    let base = ibig!(3);
    let exponent = 50;
    let power = base.pow(exponent);
    println!("3^50 = {}", power);

    // 位运算示例
    println!("\n=== 位运算 ===");
    let a = ibig!(0b1100);
    let b = ibig!(0b1010);
    println!("AND: {:b}", &a & &b);
    println!("OR: {:b}", &a | &b);
    println!("XOR: {:b}", &a ^ &b);
    println!("NOT a: {:b}", !&a);

    // 数学函数示例
    println!("\n=== 数学函数 ===");
    let n = ibig!(10);
    let k = ibig!(3);
    println!("10! = {}", n.factorial());
    println!("C(10,3) = {}", IBig::binomial(&n, &k));
    println!("GCD(48,18) = {}", IBig::gcd(&ibig!(48), &ibig!(18)));

    // 类型转换示例
    println!("\n=== 类型转换 ===");
    match num1.try_into::<u64>() {
        Ok(val) => println!("转换为u64成功: {}", val),
        Err(_) => println!("数字太大无法转换为u64")
    };
}

这个完整示例演示了ibig库的主要功能,包括:

  1. 多种方式创建大整数
  2. 基本算术运算
  3. 比较运算
  4. 幂运算
  5. 位运算
  6. 数学函数(阶乘、组合数、GCD)
  7. 类型转换

每个部分都有清晰的注释和输出,可以直接运行查看结果。

回到顶部