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());
    }
}

性能提示

  1. 对于需要多次素数检查的应用,先创建一个Primes实例并重复使用它,比每次都调用独立函数更高效。

  2. 对于大数分解,可以先检查数是否很小,因为小数的分解有优化路径。

  3. 素性测试对于非常大的数(>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库虽然名称谦虚,但提供了强大而实用的素数相关功能,适合需要素数操作的数学计算和密码学应用。

回到顶部