#numbers #bignum #math

nightly framp

James Miller的Ramp的高性能多精度算术库的分支

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

Apache-2.0

320KB
8K SLoC

RAMP - Rust多精度算术

Build Status

文档

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;
}

如你所见,与这些数字一起工作非常简单。

已提供按值和按引用重载的运算符,按值重载会消耗操作数,而按引用重载则不会。按值重载将尝试重用结果的空间(这并不总是可能的)。

还提供了对 i32usize 的重载,这使得在处理较小的数字时可以轻松(且高效)地进行操作。上面的示例实际上使用了 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