#int #大整数 #数字

big-int

一个简单的库,用于任意精度、任意基数的算术运算,支持从2到u64::MAX的任意基数的任意大整数

25个稳定版本 (6个主要版本)

7.0.0 2024年1月4日
6.0.3 2024年1月4日
5.0.1 2024年1月2日
4.0.1 2024年1月1日
1.0.5 2023年12月25日

#326算法

MIT许可证

135KB
2.5K SLoC

BigInt

一个简单的库,用于任意精度、任意基数的算术运算,支持从2到u64::MAX的任意大整数。

use big_int::prelude::*;

let mut a: Loose<10> = "9000000000000000000000000000000000000000".parse().unwrap();
a /= 13.into();
assert_eq!(a, "692307692307692307692307692307692307692".parse().unwrap());

let mut b: Loose<16> = a.convert();
assert_eq!(b, "208D59C8D8669EDC306F76344EC4EC4EC".parse().unwrap());
b >>= 16.into();

let c: Loose<2> = b.convert();
assert_eq!(c, "100000100011010101100111001000110110000110011010011110110111000011".parse().unwrap());

let mut d: Tight<256> = c.convert();
d += vec![15, 90, 0].into();
assert_eq!(d, vec![2, 8, 213, 156, 141, 134, 121, 71, 195].into());

let e: Tight<10> = d.convert();
assert_eq!(format!("{e}"), "37530075201422313411".to_string());

此软件包包含五个主要的大整数实现

  • LooseBytes<BASE> - 表示每个数字的每个位的一个8位字节的集合。略微内存效率低下,但性能开销最小。能够表示从2到256的任何基数。
  • LooseShorts<BASE> - 表示每个数字的每个位的16位短值的集合。相对内存效率低下,但性能开销最小。能够表示从2到65536的任何基数。
  • LooseWords<BASE> - 表示每个数字的每个位的32位字值的集合。相当内存效率低下,但性能开销最小。能够表示从2到2^32的任何基数。
  • Loose<BASE> - 表示每个数字的每个位的64位整数的集合。非常内存效率低下,但性能开销最小。能够表示从2到2^64的任何基数。
  • Tight<BASE> - 表示每个数字的每个位的紧密打包位的集合。最大内存效率,能够表示从2到2^64的任何基数。然而,额外的间接引用增加了某些性能开销。

整数支持大多数基本的算术运算,包括加法、减法、乘法、除法、指数、对数、n次方根和左右移位。值得注意的是,移位作用于相关数字的BASE,通过BASE的幂次增加或减少大小,而不是2的幂次。

依赖关系

~290–750KB
~18K SLoC