#prime #numbers #constellation #called #modular #finds

bin+lib stella

Stella 是一款查找素数 k-重数(也称为素数星座)的软件

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 数学

MITLGPL-3.0+

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