#bignum #big-int #integer-arithmetic

无需std m61-modulus

用于执行61次梅森数模运算的函数。旨在测试大数实现。

2个版本

0.1.1 2023年10月27日
0.1.0 2023年8月31日

#1661 in 数学

MIT/Apache

67KB
1.5K SLoC

m61-modulus

Crates.io docs.rs

用于执行61次梅森数模运算的函数。旨在测试大数实现。

文档

https://www.docs.rs/m61-modulus/

许可

此项目受以下任一许可的许可:

任选其一。


lib.rs:

用于执行61次梅森数模运算的函数。旨在测试大数实现。

用法

此crate附带一个trait M61Reduction和一个类型 [M61]. M61是一个整数,其中所有算术都是在61次梅森数上执行的,2^61 - 1.

use m61_modulus::*;

let x = M61::from(1u64 << 61);
let y = M61::from(1u64);

assert_eq!(x, y);

M61Reduction为无符号整数切片实现,提供了两个函数,用于对2^61 - 1取模,就像它们是大数实现中的数字一样。

use m61_modulus::*;

let x = [1u16, 734u16, 24u16].reduce_m61();
let y = M61::from(1) + M61::from(734 << 16) + M61::from(24u64 << 32);

assert_eq!(x, y);

这些函数是reduce_m61,它是单线程的,以及reduce_m61_parallelized,它可能会创建额外的线程。

此crate附带两个功能

  • nightly,它启用了对AVX512等夜间仅支持的功能的访问。默认禁用。
  • std,它提供了对reduce_m61_parallelized函数的访问,该函数需要Rust标准库。如果禁用,此crate也将能在no-std目标上运行。默认启用。

背景

此crate的设计是为了以低廉的成本验证大数实现(如num-bigint)的结果。通过重复使用模运算执行操作,可以测试结果,而无需使用涉及任意精度算术的更简单但更慢的实现。

对61次梅森数进行算术模运算非常适合此目的

  • 这是一个素数,这意味着在随机输入的情况下,结果分布得很好。
  • 它与下一个2的幂次之差使得计算非常便宜。

依赖项