4个版本
1.0.0 |
|
---|---|
0.2.2 | 2020年6月18日 |
0.2.1 | 2020年6月15日 |
0.2.0 | 2020年6月15日 |
0.1.0 | 2020年6月14日 |
#1013 in 数据结构
64KB
1K SLoC
LargeInt
一个整数数据类型,其大小(实际上)没有限制。此实现旨在提供一种方便直观地进行计算的方法,用于大于Rust中提供的最大原始整数类型(128位)的数字。它还旨在能够轻松地与现有原始类型集成,以便可以轻松地从LargeInt中添加和减去。LargeInt始终是带符号的,但由于它可以无限增长,因此这并没有什么缺点。
何时使用LargeInt
只有在预计值将超过 u128::MAX
时才应使用LargeInt。我发现这种数据类型的实际有用性很小(因为128位已经提供了非常大的数字),然而,对于可能需要它的人来说,这是一个很好的备用选择。话虽如此,我主要是为了好玩和好奇而构建了这个库。不建议在不属于此情况的情况下使用此类型,因为它将比简单地使用原始类型要慢。
如何使用LargeInt
请参阅示例文件夹以获取使用LargeInt类型的示例。简而言之,初始化后,可以使用与原始类型相同的运算符对数字进行操作(即 +, -, /, *, |, ^, &)。这些操作消耗LargeInt(无法为包含Vecs的类型推导出Copy特性和特征)。因此,如果您不想消耗变量,则在执行操作之前需要将其克隆。
LargeInt可以从字符串(LargeInt::from_str("123")
)或原始的有符号或无符号整数(LargeInt::from(123)
)初始化。
示例
use large_int::large_int::LargeInt;
fn main() {
let mut li = LargeInt::from_str("340282366920938463463374607431768211455").unwrap();
li += 20451;
assert_eq!(li, LargeInt::from_str("340282366920938463463374607431768231906").unwrap());
let smaller = li / 100000000000000000000000000000000_u128;
assert_eq!(smaller, 3402823_u128.into());
let multed = smaller * 3;
assert_eq!(multed, 10208469.into());
let subbed = multed - 20000000;
assert_eq!(subbed, -10208459.into());
}
操作限制
Add和Sub是最简单和成本最低的操作,对于用n个u128值表示的数字,这些操作在O(n)时间内完成(假设要添加的数字的大小 <=_n_)。
乘法和除法操作相对较贵。乘法的时间复杂度为O(nm),其中n是两个数中较大的表示,而m是这两个数中任意一个在二进制表示中1的个数。除法与此类似,但由于操作顺序的重要性,无法优化到1的个数最少。
打印这些数是最昂贵的操作,因为它需要多次加法和乘法来计算十进制表示(与表示中的数字个数一样多)。只有在完全必要的时候才应该打印LargeInts。为了简化这个方法的要求,当打印时它们是可以格式化的。这提供了一种打印科学记数法(例如,123 == 1.23*10^2)的方法。这种格式不进行数字的四舍五入。
移位运算符(即<<和>>)不会改变表示该数的u128值的数量。这意味着左移不会无限左移数字,而是会溢出并丢失。
为了抽象数字的表示,保留了对"op_no_shrink"方法的私有。
除法(/)和取模(%)运算符执行相同的操作,但返回不同的值。如果需要两个值,最好使用"div_with_remainder"方法,该方法返回一个包含结果的元组(result, remainder),而不是分别调用除法和取模,因为这将加倍所需的时间。
变更日志
0.2.2
增加了将原语作为操作的第一/左参数使用的功能。
更改了实现方式,使得任何实现了Into<LargeInt>
(即From<type> for LargeInt
)的类型都可以与LargeInts一起使用。为了支持作为操作的左参数,使用宏reverse_operations
。
0.2.1
修正了对无符号整型类型排除TryFrom
。
此外,将div_with_remainder
方法进行了泛化,使其现在支持原语和其他LargeInt
(以及任何其他实现了Into<LargeInt>
的类型)。
0.2.0
添加了额外的泛型特质Default
、Eq
、Hash
、Ord
、LowerExp
。还添加了迭代器特质Sum
和Product
。
实现了所有原始整数类型的新功能TryFrom
特质。由于错误地排除了无符号整数类型。
包括了对原始整数类型的新功能,包括镜像方法、pow
和abs
。
0.1.0(第一个版本)
初始版本包括了大多数标准std::ops
运算符。基本功能已经完成,并包含在这个版本中。
1.0.0(撤销初始版本)
这个版本被撤销,因为crate.io上的分类问题(撤销后,我也意识到版本可能不应该已经是1)。