4个版本

1.0.0 2020年6月14日
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 数据结构

MIT/Apache

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

添加了额外的泛型特质DefaultEqHashOrdLowerExp。还添加了迭代器特质SumProduct

实现了所有原始整数类型的新功能TryFrom特质。由于错误地排除了无符号整数类型。

包括了对原始整数类型的新功能,包括镜像方法、powabs

0.1.0(第一个版本)

初始版本包括了大多数标准std::ops运算符。基本功能已经完成,并包含在这个版本中。

1.0.0(撤销初始版本)

这个版本被撤销,因为crate.io上的分类问题(撤销后,我也意识到版本可能不应该已经是1)。

无运行时依赖