2 个版本
0.1.1 | 2020 年 3 月 16 日 |
---|---|
0.1.0 | 2020 年 3 月 15 日 |
在 数学 中排名第 1777
18KB
320 行
循环
一个简单、完整且无依赖的模运算库。
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 泛型功能。
-
不同算法的可能功能标志。