具有素数列表的高效素数分解算法

Posted

技术标签:

【中文标题】具有素数列表的高效素数分解算法【英文标题】:Efficient Prime Factorization Algorithm with List of Prime Numbers 【发布时间】:2020-03-17 11:07:31 【问题描述】:

我正在尝试实现一种有效的算法,它可以找到给定数字 n 的素数分解。我还有一个至少为 n 的所有素数的列表。

一个例子:如果我有一个数字 n = 50,结果应该是:2,5,5。

到目前为止我的想法:

    检查是否 n == 1,如果为真则返回 1 检查是否 n == 2,如果为真则返回 2

如果 1. 和 2. 都为假:

    尽可能频繁地将 n 除以 2,然后将 2 添加到结果向量中 尝试在素数列表中找到(可能除以 2)n。 如果 n 在列表中,将其添加到结果中并返回结果。 在列表中找到最大的素数,它小于 n。 除以第 6 步中找到的素数。如果可以进行无休除法,请将素数添加到结果中。 检查是否 n==1,如果为真则返回结果 重复步骤 5-9。

该算法是否有效或您有什么改进的想法?

【问题讨论】:

好的,你的算法听起来很合理。现在有什么问题? 1 不是质数。 如果您已经拥有直到n 的列表,您就已经知道n 是否是素数。你的意思是列表到n/2/sqrt(n)/其他一些m < n 对不起,我应该说得更清楚。我不确定该算法是否真的有效,以及我是否正确使用了素数列表。 不,所有素数的列表一直到 n。但关键是不知道 n 是否是素数,而是得到素数分解/因式分解。例如。 6 = 2 * 3。 【参考方案1】:

您提出的算法效率低下。您不应该除以最大的剩余素数,而是除以最小的素数。如果最小的平方比剩下的大,那么剩下的就是素数。

您现有的算法平均需要O(n/log(n)) 部门。我的改进使它改为O(sqrt(n)/log(n))。这仍然不是一个特别有效的分解算法。不过几百万也没问题。

【讨论】:

谢谢,我想这就足够了。既然你提到了它,我就想起了平方规则。

以上是关于具有素数列表的高效素数分解算法的主要内容,如果未能解决你的问题,请参考以下文章

算法设计-枚举分治素数约数质因数分解

蛮力,单线程素数分解

快速素数分解模块

LightOJ1356 最大独立集 HK算法 素数分解

比较分解时间得到素数

数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429