Rust素数计算库slow_primes的使用,提供高效素数生成、分解和素性测试功能
根据您的要求,我将直接输出内容中的示例,然后提供完整示例DEMO:
示例代码
1. 素数生成
use slow_primes::Primes;
fn main() {
// 创建一个素数生成器,筛选到上限1000
let sieve = Primes::sieve(1000);
// 获取前20个素数
let first_20_primes: Vec<usize> = sieve.primes().take(20).collect();
println!("First 20 primes: {:?}", first_20_primes);
// 获取100到200之间的素数
let primes_between_100_200: Vec<usize> = sieve.primes_from(100).take_while(|&p| p <= 200).collect();
println!("Primes between 100 and 200: {:?}", primes_between_100_200);
}
2. 素性测试
use slow_primes::Primes;
fn main() {
let sieve = Primes::sieve(1000);
// 检查单个数字是否是素数
println!("Is 17 prime? {}", sieve.is_prime(17));
println!("Is 25 prime? {}", sieve.is_prime(25));
// 检查范围内的数字
for n in 10..20 {
println!("{} is prime: {}", n, sieve.is_prime(n));
}
}
3. 因数分解
use slow_primes::Primes;
fn main() {
let sieve = Primes::sieve(1000);
// 分解数字
let factors = sieve.factor(360).unwrap();
println!("Factors of 360: {:?}", factors);
// 分解大数
match sieve.factor(123456789) {
Ok(factors) => println!("Factors of 123456789: {:?}", factors),
Err(e) => println!("Failed to factor: {}", e),
}
}
4. 素数计数函数估算
use slow_primes::estimate_prime_pi;
fn main() {
let n = 1_000_000;
// 估算小于n的素数数量
let (low, high) = estimate_prime_pi(n);
println!("π({}) is between {} and {}", n, low, high);
// 实际计算(需要创建筛)
let sieve = slow_primes::Primes::sieve(n);
let actual = sieve.prime_pi(n);
println!("Actual π({}) = {}", n, actual);
}
完整示例DEMO
use slow_primes::{Primes, estimate_prime_pi};
fn main() {
println!("----- Prime Generation -----");
let sieve = Primes::sieve(1000);
println!("First 10 primes: {:?}", sieve.primes().take(10).collect::<Vec<_>>());
println!("\n----- Primality Testing -----");
println!("Is 19 prime? {}", sieve.is_prime(19));
println!("Is 21 prime? {}", sieve.is_prime(21));
println!("\n----- Factorization -----");
println!("Factors of 28: {:?}", sieve.factor(28).unwrap());
println!("Factors of 123: {:?}", sieve.factor(123).unwrap());
println!("\n----- Prime Counting -----");
let n = 1000;
let (low, high) = estimate_prime_pi(n);
println!("Estimated π({}) between {} and {}", n, low, high);
println!("Actual π({}) = {}", n, sieve.prime_pi(n));
println!("\n----- Prime Number Theorem -----");
for &n in &[100, 1000, 10_000, 100_000] {
let (low, high) = estimate_prime_pi(n);
println!("π({}) ∈ [{}, {}]", n, low, high);
}
}
注意:该库已被primal取代,新项目建议考虑使用primal库。slow_primes对于基本素数操作仍然有效,可以在5秒内筛选出10^9以内的素数。
1 回复
Rust素数计算库slow_primes使用指南
简介
slow_primes
是Rust中一个专注于素数相关计算的库,提供了高效的素数生成、分解和素性测试功能。虽然名字中有"slow",但实际上它提供了相当高效的实现。
安装
在Cargo.toml中添加依赖:
[dependencies]
slow_primes = "0.1"
主要功能
1. 素数生成
use slow_primes::Primes;
fn main() {
// 生成前100个素数
let primes = Primes::sieve(100);
println!("前100个素数: {:?}", primes.primes());
// 生成直到100的所有素数
let primes_up_to_100 = Primes::sieve(100);
println!("直到100的所有素数: {:?}", primes_up_to_100.primes());
}
2. 素性测试
use slow_primes::is_prime;
fn main() {
let num = 104729; // 第10000个素数
if is_prime(num) {
println!("{} 是素数", num);
} else {
println!("{} 不是素数", num);
}
}
3. 因数分解
use slow_primes::factorise;
fn main() {
let num = 123456789;
let factors = factorise(num);
println!("{} 的质因数分解: {:?}", num, factors);
// 输出: 123456789 的质因数分解: [(3, 2), (3607, 1), (3803, 1)]
}
4. 获取第n个素数
use slow_primes::nth_prime;
fn main() {
let n = 1000;
let prime = nth_prime(n);
println!("第{}个素数是: {}", n, prime);
}
5. 素数迭代器
use slow_primes::Primes;
fn main() {
let mut primes = Primes::all();
// 打印前10个素数
for _ in 0..10 {
println!("{}", primes.next().unwrap());
}
}
性能提示
-
对于需要多次素数检查的应用,先创建一个
Primes
实例并重复使用它,比每次都调用独立函数更高效。 -
对于大数分解,可以先检查数是否很小,因为小数的分解有优化路径。
-
素性测试对于非常大的数(>2^64)可能会变慢,这时可以考虑概率性测试。
示例:寻找孪生素数
use slow_primes::Primes;
fn find_twin_primes(limit: usize) {
let primes = Primes::sieve(limit);
let prime_list = primes.primes();
for window in prime_list.windows(2) {
if window[1] - window[0] == 2 {
println!("孪生素数对: ({}, {})", window[0], window[1]);
}
}
}
fn main() {
find_twin_primes(1000);
}
完整示例:素数应用综合演示
use slow_primes::{Primes, is_prime, factorise, nth_prime};
fn main() {
// 1. 素数生成演示
println!("=== 素数生成演示 ===");
let primes = Primes::sieve(100);
println!("前50个素数: {:?}", &primes.primes()[..50]);
// 2. 素性测试演示
println!("\n=== 素性测试演示 ===");
let test_numbers = [2, 15, 17, 100, 104729];
for &num in &test_numbers {
println!("{} 是素数吗? {}", num, is_prime(num));
}
// 3. 因数分解演示
println!("\n=== 因数分解演示 ===");
let numbers_to_factor = [15, 100, 12345];
for &num in &numbers_to_factor {
println!("{} 的质因数分解: {:?}", num, factorise(num));
}
// 4. 获取第n个素数
println!("\n=== 获取第n个素数 ===");
let positions = [1, 10, 100, 1000];
for &n in &positions {
println!("第{}个素数是: {}", n, nth_prime(n));
}
// 5. 寻找孪生素数
println!("\n=== 寻找孪生素数 ===");
find_twin_primes(1000);
}
fn find_twin_primes(limit: usize) {
let primes = Primes::sieve(limit);
let prime_list = primes.primes();
println!("在{}以内的孪生素数对有:", limit);
for window in prime_list.windows(2) {
if window[1] - window[0] == 2 {
println!("({}, {})", window[0], window[1]);
}
}
}
slow_primes
库虽然名称谦虚,但提供了强大而实用的素数相关功能,适合需要素数操作的数学计算和密码学应用。