4个版本
使用旧的Rust 2015
0.3.7 | 2017年6月6日 |
---|---|
0.3.6 | 2017年1月17日 |
0.3.5 | 2017年1月17日 |
0.3.4 | 2017年1月17日 |
#1106 in 算法
用于 paillier
320KB
8K SLoC
RAMP - Rust多精度算术
Ramp是一个高性能的多精度(也称为“大数”)库,用于处理超出常规处理能力的数字。使用非常简单,你几乎可以用它们像常规数字一样。
示例
extern crate framp as ramp;
use ramp::Int;
// Calculates n!
fn factorial(n: usize) -> Int {
let mut a = Int::from(1);
for i in 2..n {
a *= i;
}
return a * n;
}
如你所见,与这些数字一起工作非常简单。
已提供按值和按引用重载的运算符,按值重载会消耗操作数,而按引用重载则不会。按值重载将尝试重用结果的空间(这并不总是可能的)。
还提供了对 i32
和 usize
的重载,这使得在处理较小的数字时可以轻松(且高效)地进行操作。上面的示例实际上使用了 usize
重载,这意味着永远不会分配多个 Int
。
注意 由于使用不稳定的功能(特别是内联汇编),Ramp只能使用 rustc
的nightly构建来编译。
为什么还需要另一个库?
num
包提供了一些可以使用的大数类型,那么为什么使用Ramp呢?Ramp专注于多精度算术,而 num
是一个通用数值库,恰好提供了一些多精度算术。
如果你无法使用不稳定的功能或只想使用少量功能,应该使用 num
。当需要高性能和额外功能时,应使用Ramp。
整体设计
Ramp分为两个主要部分:高级代码和低级代码。你应该使用高级代码,但真正的操作是在低级代码中完成的。
低级例程(在 ll
中)主要是与原始指针一起工作的不安全函数,其中一些例程使用内联汇编实现,以访问处理器特定的功能。
肢体
Ramp中经常使用术语“肢体”。这是一个从GMP借用的术语,是Ramp所使用底数的一个“数字”。由于底数等于 2^word_size,这些“数字”非常大,因此使用“肢体”这个词。
未来工作
当前斜率非常粗糙且不完整。大致来说,斜率旨在提供三种类型:整数、有理数和浮点数。整数(Int
)已提供且基本完整,有理数已提供并具有基本实现。浮点数尚未实现。
在底层例程中,有一些操作,特别是乘法和除法,目前使用最简单的可行算法实现。虽然这对相对较小的数字来说足够了,但较大的数字应使用更好的算法。
依赖项
~0.7–1MB
~15K SLoC