38个版本 (7个破坏性更新)
0.8.7 | 2024年6月19日 |
---|---|
0.7.4 | 2024年5月31日 |
0.4.8 | 2023年10月22日 |
151 在 数学
每月73次下载
175KB
1.5K SLoC
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_geq
和sieve_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_prime
和 previous_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
:从 serde
为 Primes
结构体推导出 Serialize
和 Deserialize
特性,以及一些其他特性。
const_assert
:将只涉及 const 泛型的 panic 提升为编译错误。将 crate 的 MSRV 提高到 1.79.0。
许可证
许可证为以下之一
- Apache License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
欢迎贡献!
除非您明确说明,否则您提交给作品包含的任何贡献,根据 Apache-2.0 许可证定义,应如上所述双重许可,不附加任何额外条款或条件。
依赖
~175KB