#模运算 # # #算术 #

nightly 循环

简单、完整且无依赖的模运算

2 个版本

0.1.1 2020 年 3 月 16 日
0.1.0 2020 年 3 月 15 日

数学 中排名第 1777

GPL-3.0 许可证

18KB
320

循环

Crates.io Crates.io Crates.io Build Status

一个简单、完整且无依赖的模运算库。


lib.rs:

一个用于泛型循环群、整数环和素域的简单库。循环库不提供单一代数运算,如模幂运算或模除法,而是提供类型安全的环值整数,其工作方式符合您的预期。

由于它依赖于 const 泛型和编译时计算进行素性检验,循环库目前只能使用 nightly 工具链进行构建。

示例

使用循环库非常简单:该库提供了一个宏,res!,它接受一个无符号整数并生成其余数类。

use cyclic::res;
const N: u32 = 7;

let r = res![3; N];
assert_eq!(r.0, 3);

let s = res![11; N];
assert_eq!(s.0, 4);

assert_eq!(r + s, res![0; N]);
assert_eq!(r - s, res![6; N]);
assert_eq!(r * s, res![5; N]);
assert_eq!(r / s, res![6; N]);

assert_eq!(res![2; 3].pow(1_000_000), res![1; 3])

另一方面,以下代码将无法编译

use cyclic::res;
let r = res![1; 6] + res![4; 12];

在合数阶环中进行除法操作将导致 panic

use cyclic::res;
let r = res![2; 4] / res![3; 4];

模数的素性是在编译时检查的,因此这不会产生运行时成本。

包功能标志

  • composite_order_division:启用此功能将抑制在非素数阶环中除法时的 panic。这成为程序员的职责,记住只有与模数互质的元素才有明确定义的逆元。

包状态

这个包是全新的,尽管在狭义上它是“功能完整的”,但仍有一些事情要做。

  • 该包目前只能在 nightly 上构建。
  • 目前,Modular 类型是对模数泛型化的,但不是整数类型,它被限制为必须是 u32。这是主要的遗留问题,我将很快纠正。
  • 该包应该支持 no_std

我还想对这个包进行一些其他改进

  • 大乘积的 Montgomery 乘法

  • 在合数阶环中尝试除法时的编译时错误。我认为这个更改非常重要,但它正在等待一些尚未存在的 const 泛型功能。

  • 不同算法的可能功能标志。

无运行时依赖