#prime #random #ramp #num

梯形质数

使用ramp和简单接口生成大质数和合数的Rust库

5 个版本 (3 个重大更新)

0.4.1 2020年5月13日
0.4.0 2020年5月13日
0.3.0 2020年5月10日
0.2.0 2020年3月22日
0.1.0 2019年11月19日

#1561 in 数学

MIT/Apache

27KB
233

ramp-primes:大随机合数和质数生成器

Crates.io Crates.io Build Status

此crate提供了一个简单易用的API,用于在Rust中生成大整数,包括但不限于质数

它充分利用了RAMP crate,该crate通过内联汇编提供高性能大整数,并为用户提供了一个高级、简单易用的接口,同时还包括了允许完全控制大整数的底层组件。

由于使用了ramp和内联汇编,此crate需要使用nightly工具链

用法

将以下内容添加到您的cargo.toml

ramp-primes= "0.4.0"

ramp= "0.5"

如果您还没有安装,请安装nightly工具链,因为它只能在nightly分支上运行,然后将其设置为默认工具链。

rustuptoolchain install nightly

rustupdefault nightly

质数生成示例

use ramp_primes::Generator;

fn main(){
  // Generates two primes (p,q) both of 512 bits
  let p = Generator::new_prime(512);
  let q = Generator::new_prime(512);
  
  // Generates the modulus n from p and q
  let n = p * q;
}

安全质数生成示例

use ramp_primes::Generator;

fn main(){
    // Outputs a Large Prime with 64 bits using [(n-1)/2]
    let p = Generator::safe_prime(64);
}

随机数生成示例

use ramp_primes::Generator;

fn main(){
  // Creates a Large Integer of 1024 bits
  let x = Generator::new_uint(1024);
  
  // Prints out the randomly generated number
  println!("x: {}",x);
}

质数生成设计

此crate的质数生成和部分代码基于Snips-AI的Medium博客关于质数生成

尝试保守地判断一个数是否为质数。该数经过生成阶段和3次测试以确定其是否为质数

生成阶段

  1. 将一个参数传递给生成函数,该参数指示质数的位数。

  2. 操作系统通过rand crate使用用户空间CSPRNG对种子进行初始化,以生成随机数。

  3. 生成一个无符号整数,直到它通过质数测试,并在发送到测试之前,将最低有效位(LSB)更改为0以指示其为奇数,并将最高有效位(MSB)更改为1以确保其为指定位长。

  4. 该数被发送到进行三个测试

质数测试

数字经过多次测试以确定它们是合数还是质数。

  1. 使用包含前2048个质数的数组来检查数字是否可以被数组中的任何质数整除。

  2. 执行费马小定理

  3. Miller-Rabin素性测试,这是官方RSA文档和NIST推荐的生成素数的黄金标准,使用16次迭代进行,与苹果加密系统使用的相同。

如果数字通过这些测试,则它被认为有很高的可能性是素数。您可以在Wolfram Alpha上自由验证它们,只需输入素数即可。

安全素数

通过检查(p-1)/2是否是使用上述测试确定的素数来生成安全素数。

许可证

根据您的选择,许可如下:

  • Apache License,版本2.0

  • MIT许可证

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交并包含在作品中的任何贡献,将按照上述方式双重许可,没有任何额外的条款或条件。

依赖项

~1.5MB
~26K SLoC