10 个版本
使用旧的 Rust 2015
0.3.3 | 2017年2月26日 |
---|---|
0.3.2 | 2017年2月24日 |
0.2.5 | 2017年2月23日 |
0.1.1 | 2017年2月18日 |
#500 in 并发
每月 103 下载
23KB
409 行
concurrent_prime_sieve

用于并发生成素数筛选器和集合的工具。
Rust 实现的 Atkin 筛法。
此实现以 O( sqrt(max_num) + section_size ) 的时间复杂度运行,内存使用为 O( section_size )。(其中 section_size = max_num - min_num)
此实现旨在与并行处理、分布式计算任务兼容,或当需要在近似二次大小的范围内获得合理数量的素数时。例如,如果需要在大小为 10^9 的块中找到从大约 10^18 开始的素数。
通过整合 Huon Wilson 的 primal 包(见下文),此包还可以通过并发更快地计算低于所需阈值的所有素数。
使用此算法,无需计算较小的素数或线程间的任何通信,因为每个素数区间都是完全独立计算的。因此,它非常适合分布式系统,并且易于实现。
此包利用 Huon Wilson 的(非常好的)primal 包(位于此处:[https://crates.org.cn/crates/primal](https://crates.org.cn/crates/primal))计算从 0 开始的素数边界情况。这比仅使用此处构建的并发算法要快得多。该算法计算从 0 开始的素数比此实现快约 12 倍。此包利用这一点将找到相同数量素数的时间缩短到 12/(cores+11)。::filter
fn prime_filter(max_num: usize) -> Vec<bool>
生成一个大小为 max_num 的 bool 向量,每个素数索引处的值为
true
,否则为false
。线程数基于检测到的虚拟核心数量。
fn prime_filter_concurrently(max_num: usize, threads: usize) -> Vec<bool>
类似于
fn prime_filter
,但允许自定义线程数。
fn prime_filter_sequentially(max_num: usize) -> Vec<bool>
类似于
fn prime_filter
,但不创建任何新线程。(注意:这只是 primal_sieve::Sieve 的向量转换。)
fn prime_filter_section(min_num:usize, max_num: usize) -> Vec<bool>
类似于
fn prime_filter
,但仅用于 min 和 max 之间的数字,结果以长度为 max-min 的向量返回。
fn prime_filter_section_concurrently(min_num: usize, max_num: usize, threads: usize) -> Vec<bool>
类似于
fn prime_filter_section
,但允许自定义线程数。
fn prime_filter_section_sequentially(min_num: usize, max_num: usize) -> Vec<bool>
类似于
fn prime_filter_section
,但不创建任何新线程。(注意:对于 min_num <= 210,这仅仅是 primal_sieve::Sieve 的向量转换。)
此包利用 Huon Wilson 的(非常好的)primal 包(位于此处:[https://crates.org.cn/crates/primal](https://crates.org.cn/crates/primal))计算从 0 开始的素数边界情况。这比仅使用此处构建的并发算法要快得多。该算法计算从 0 开始的素数比此实现快约 12 倍。此包利用这一点将找到相同数量素数的时间缩短到 12/(cores+11)。::集合
fn primes(max_num: usize) -> Vec<usize>
生成一个严格小于 max_num 的素数向量集合。
线程数基于检测到的虚拟核心数量。
fn primes_concurrently(max_num:usize, threads:usize) -> Vec<usize>
类似于
fn primes
,但允许自定义线程数。
fn primes_sequentially(max_num: usize) -> Vec<usize>
类似于
fn primes
,但不创建任何新线程。(注意:这只是 primal_sieve::SievePrimes 的向量转换。)
fn primes_section(min_num: usize, max_num: usize) -> Vec<usize>
生成一个在 min_num 和 max_num 之间的素数向量集合。
线程数基于检测到的虚拟核心数量。
fn primes_section_concurrently(min_num:usize, max_num:usize, threads:usize) -> Vec<usize>
类似于
fn primes_section
,但允许自定义线程数。
fn primes_section_sequentially(min_num:usize, max_num:usize, threads:usize) -> Vec<usize>
类似于
fn primes_section
,但不创建任何新线程。(注意:对于 min_num <= 210,这仅仅是 primal_sieve::SievePrimes 的向量转换。)
依赖项
~780KB
~13K SLoC