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 在 算法
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