4 个版本
0.0.3 | 2023 年 7 月 18 日 |
---|---|
0.0.2 | 2023 年 7 月 5 日 |
0.0.1 | 2023 年 7 月 3 日 |
0.0.0 | 2023 年 6 月 29 日 |
#472 in 数学
34KB
539 行
Stella
Stella 是一款用 Rust 编写的软件,用于查找 素数 k-重数(也称为 素数星座)。目前,它只是一个功能非常有限的低效原型。目前提供为实验性的 Rust Crate;我们假设您已经熟悉这种编程语言。
其中一个目标是要使其可用于 Riecoin 矿工,并可能超越 rieMiner(Stella 可以被视为 rieMiner 的 Rust 版本),并打破世界纪录。即使 Rust 实现效率较低,但改进的代码可读性可能有助于尝试新的优化,然后可以将其实现并移植回 rieMiner。
另一个目标将是帮助 Riecoin 和喜欢破解数字的开发者理解挖掘算法的工作原理。rieMiner 是之前 Riecoin 挖掘机的合并和重大重构,已有多年历史,这使得理解其代码变得困难,尤其是由于之前开发者的文档和解释基本上不存在。Stella 是从头开始编写的,并且以更模块化的方式编写,这可以大大帮助未来开发者的学习过程。
Stella Crate 使用方法
由于这是一款原型软件,很多使用说明可能在将来会发生变化。
Stella 接口依赖于 Rug 的 Integer 结构,因此为了使用该 Crate,请在您的 Cargo.toml
中添加以下内容
rug = "^1.19.2"
stella = "0.0.3"
可选地,您可以在源文件中使用以下导入,以下假设您已经那样做了。
use rug::Integer;
use stella::Stella;
Stella 实例
一个 Stella
实例将处理可定制的素数星座搜索,通过以下方式创建它
let mut stella = Stella::new();
参数
现在,实例必须通过一个名为 Params
的结构进行配置,使用 set_params
方法。以下是该结构的字段
workers: usize
:用于搜索的工作进程数。将其设置为0
或省略它以自动检测机器中的线程数;constellation_pattern: Vec<isize>
:要筛选的星座类型,作为逗号分隔的(累计)偏移量。将其设置为空向量或省略以使用默认模式0, 2, 6, 8, 12, 18, 20
;prime_table_limit
:用于搜索素数星座的素数表将包含给定数字以内的素数。将其设置为0
或省略以使用默认限制16777216
;primorial_number
:筛选过程中的素数积数。它应该是一个实际素数积数比工作目标小几个数量级的值。将其设置为0
或省略以使用默认值120
;primorial_offset
:筛选过程中从素数积数倍数中使用的偏移量。将其设置为0
或省略以自动选择与模式关联的硬编码的一个;sieve_size
:筛选中素数积数因子表的位大小。如果需要,将向下舍入到机器字大小的前一个倍数。将其设置为0
或省略以使用默认大小2^25;
要省略参数,请使用..Default::default()
。选定的参数应适合将由Stella实例处理的工作。以下是一个配置示例,与上述参数兼容,
stella.set_params(stella::Params {
workers: 8,
constellation_pattern: vec![0, 2, 6, 8, 12, 18, 20, 26],
prime_table_limit: 10000000,
primorial_number: 100,
sieve_size: 10000000,
..Default::default() // Use this if you don't want to set some parameters (like primorial_offset here)
});
初始化
使用set_params
设置了适当的参数后,必须用以下方式初始化Stella实例:
stella.init();
启动工作者
使用以下方式启动工作者
stella.start_workers();
这会启动分离的工作线程,一旦向实例添加了一些有效的工作,它们将寻找素数星座。由于工作者是分离的线程,库用户还必须运行主线程。为了添加工作,查看统计信息以及处理Stella实例找到的结果,请阅读下面的章节。
工作
可以使用名为Params
的结构和add_job
方法将工作提交给Stella实例。以下是该结构的字段
id: usize
:作业的唯一标识符;clear_previous_jobs: bool
:是否清除Stella实例中的活动作业;pattern: Vec<isize>
:输出目标模式,可能不同于我们正在筛选的模式,但不能更长;target_min: Integer
:基数素数的下限;target_max: Integer
:基数素数的上限;k_min: usize
:目标模式中必须有多少个数是素数,才能输出元组;pattern_min: Vec<bool>
:一个向量,其大小必须与目标模式相同。True 表示在此位置上元组的数字必须是素数,而 false 允许它不是素数,以便输出元组。
所有字段都必须设置。add_job
方法进行一些基本合理性检查,并返回包含可能的警告或错误的字符串的几个向量。如果有错误,Stella 实例会忽略该工作。以下是该方法和结构的使用示例。
let (warnings, errors) = stella.add_job(stella::Job {
id: 1,
clear_previous_jobs: true,
pattern: vec![0, 2, 6, 8, 12, 18, 20],
target_min: Integer::from(1) << 1024,
target_max: (Integer::from(1) << 1024) + (Integer::from(1) << 768),
k_min: 5,
pattern_min: vec![true ; 7]
});
统计信息
初始化 Stella 实例后,您可以使用 stats
方法访问一些相关统计信息。它包含以下字段
prime_table_size: usize
:素数表中素数的数量;prime_table_generation_time: f64
:生成此素数表所需的时间(以秒为单位);modular_inverses_generation_time: f64
:生成模逆数表所需的时间(以秒为单位);search_start_instant: Instant
:启动工作者的瞬间;sieving_duration: f64
:用于筛法的 CPU 时间(以秒为单位);candidates_generated: usize
:在此期间生成的候选者数量;testing_duration: f64
:用于测试候选者的 CPU 时间(以秒为单位);tuple_counts: Vec<usize>
:找到的元组数量(索引是与计数关联的元组长度)。
输出
当 Stella 实例找到满足工作条件的结果时,它将内部推送到队列。使用 pop_output
方法,您可以从队列中检索输出并“消耗”它。它表示为包含以下字段的 Output
结构。
n: Integer
:元组的基本数字;pattern: Vec<isize>
:目标模式中数字为素数的偏移量;id: usize
:与此输出关联的工作 ID;worker_id: usize
:找到结果的工作者的内部 ID。
示例程序
在 GitHub 仓库中提供了一个示例程序,可以按照以下方式运行。
git clone https://github.com/Pttn/Stella.git
cd Stella
cargo build --release
您可以通过检查 main.rs
源文件来查看 Stella Crate 的具体使用示例。
开发者和许可证
此作品根据 MIT 许可证发布。
贡献
请随意创建一个 pull request,我将对其进行审查。通过为 Stella 贡献,您同意将您的代码置于 MIT 许可证之下。
欢迎向 Riecoin 项目捐款
- Riecoin: ric1pv3mxn0d5g59n6w6qkxdmavw767wgwqpg499xssqfkjfu5gjt0wjqkffwja
- Bitcoin: bc1pv3mxn0d5g59n6w6qkxdmavw767wgwqpg499xssqfkjfu5gjt0wjqej6g08
资源
依赖项
~2.5MB
~47K SLoC