#prime #const #const-generics

无std const-primes

在const上下文中处理素数。素数生成、素性检验、素数计数等。

38个版本 (7个破坏性更新)

0.8.7 2024年6月19日
0.7.4 2024年5月31日
0.4.8 2023年10月22日

151数学

Download history 170/week @ 2024-05-05 245/week @ 2024-05-12 202/week @ 2024-05-19 581/week @ 2024-05-26 481/week @ 2024-06-02 317/week @ 2024-06-09 554/week @ 2024-06-16 14/week @ 2024-06-23 8/week @ 2024-07-21 65/week @ 2024-07-28

每月73次下载

MIT/Apache

175KB
1.5K SLoC

Latest Version docs.rs (with version) Build Status codecov

const-primes

在const上下文中生成和操作素数。

这个crate允许你在编译时预计算素数,将它们存储在二进制文件中,稍后用于相关计算,或者在const函数中检查一个数是否为素数。

#![no_std]兼容,目前支持Rust版本1.67.1或更高版本,尽管启用功能标志可能会增加这个范围。

示例:在编译时生成素数

使用函数primes在编译时生成素数数组,该函数使用埃拉托斯特尼筛法

use const_primes::primes;

const PRIMES: [u32; 10] = primes();

assert_eq!(PRIMES[5], 13);
assert_eq!(PRIMES, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]);

Primes结构体是素数数组的包装,可以用作相关计算中素数的缓存。

// The first 100 primes
const CACHE: Primes<100> = Primes::new();

// Primality testing
const CHECK_42: Option<bool> = CACHE.is_prime(42);
const CHECK_541: Option<bool> = CACHE.is_prime(541);
assert_eq!(CHECK_42, Some(false));
assert_eq!(CHECK_541, Some(true));

// Prime counting
const PRIMES_LEQ_100: Option<usize> = CACHE.count_primes_leq(100);
assert_eq!(PRIMES_LEQ_100, Some(25));

// Prime factorization:
assert_eq!(CACHE.prime_factorization(3072).collect(), &[(2, 10), (3, 1)])

// If questions are asked about numbers
// outside the cache it returns None
assert!(CACHE.is_prime(1000).is_none());
assert!(CACHE.count_primes_leq(1000).is_none());

示例:素性检验

使用is_prime测试给定的数是否为素数

use const_primes::is_prime;

const CHECK: bool = is_prime(18_446_744_073_709_551_557);

assert!(CHECK);

示例:筛法

使用sieve筛选数字范围以确定其素性

use const_primes::sieve;

const PRIME_STATUS: [bool; 10] = sieve();

//                        0      1      2     3     4      5     6      7     8      9
assert_eq!(PRIME_STATUS, [false, false, true, true, false, true, false, true, false, false]);

示例:生成5000000031之后的三个素数

该crate还提供素数生成和筛法函数,可以用于处理不始于零的范围,例如primes_geqsieve_lt。这些函数可以使用大筛法计算大素数,但不需要返回整个筛子,只需请求的数字。它们最方便地通过宏primes_segment!sieve_segment!使用,这些宏会自动计算特定计算所需的筛子大小。

计算大于或等于5000000031的3个素数

use const_primes::{primes_segment, GenerationError};

const N: usize = 3;
const PRIMES_GEQ: Result<[u64; N], GenerationError> = primes_segment!(N; >= 5_000_000_031);

assert_eq!(PRIMES_GEQ, Ok([5_000_000_039, 5_000_000_059, 5_000_000_063]));

示例:找到下一个或上一个素数

使用 next_primeprevious_prime 查找下一个或上一个素数,如果存在并且可以用 u64 表示。

use const_primes::{previous_prime, next_prime};

const NEXT: Option<u64> = next_prime(25);
const PREV: Option<u64> = previous_prime(25);
const NO_SUCH: Option<u64> = previous_prime(2);
const TOO_BIG: Option<u64> = next_prime(u64::MAX);

assert_eq!(NEXT, Some(29));
assert_eq!(PREV, Some(23));
assert_eq!(NO_SUCH, None);
assert_eq!(TOO_BIG, None);

还有更多功能!

功能标志

std:实现了标准库中的 Error 特性用于错误类型。
serde:从 serdePrimes 结构体推导出 SerializeDeserialize 特性,以及一些其他特性。
const_assert:将只涉及 const 泛型的 panic 提升为编译错误。将 crate 的 MSRV 提高到 1.79.0。

许可证

许可证为以下之一

任选其一。

贡献

欢迎贡献!

除非您明确说明,否则您提交给作品包含的任何贡献,根据 Apache-2.0 许可证定义,应如上所述双重许可,不附加任何额外条款或条件。

依赖

~175KB