【问题标题】:Calculating successive prime factorizations计算连续的素数分解
【发布时间】:2015-11-18 14:57:51
【问题描述】:

每个人都知道因式分解很难。但是如果我想计算从 2 到 N 的每个数字的素数分解呢?如果我们已经计算了 [2, n-1] 中每个数的素因数分解,并且如果一个数 n 有一个小的素因数,那么计算 n 的因式分解就很容易,因为大约 73% 的数可以被任何一个整除2、3 或 5。当然,在某些情况下,例如当 n 是大小相似的两个素数的乘积时,仍然很困难,但平均而言,我们可能期望这个问题相当容易,因为我们应该只有找到一个数的一个因式,将我们的问题简化为我们之前解决过的两个问题(即因式分解 d 和 n/d)。

我问是因为我有兴趣找到平方和 r(n) (http://mathworld.wolfram.com/SumofSquaresFunction.html) 的总和,因为 n 的范围从 0 到 N。这会计算圆中整数点的数量。正如在 Wolfram Mathworld 页面上可以看到的,r(n) 有一个根据 n 的素数分解的公式。

到目前为止,我采取了两种方法:

1) 统计满足 x^2 + y^2 = n 的点的个数,其中 0

2) 计算 n 的素数分解(每次独立),并使用此信息计算 r(n)。

在实验上,2) 似乎更快,但与第一种方法相比,它不能很好地扩展,第一种方法速度较慢,但​​速度并没有那么慢。我有兴趣计算 40 位 N 的 R(N) = r(n) 从 1 到 N 的总和。

另一种选择是使用诸如埃拉托色尼筛法之类的东西来生成直到 N 的所有素数,然后以各种方式组合它们,以计算从 2 到 N 的所有数字的素数分解,并使用相同的公式之前。

有没有人知道这些选项中哪一个最有效? 1) 是最容易实现的,开始时很慢,但可能会很好地扩展。 2) 开始很快,不能很好地扩展,快速寻找因子肯定更难实现,但如果修改为使用先前分解的记忆,或者使用上面提到的一些素数生成技术,可能会做得很好。

即使 1) 是最快的,我仍然有兴趣学习生成从 0 到 N 的所有素因数分解的最快方法。

【问题讨论】:

  • 您可以使用改进的筛子来分解您的数字范围。我不知道它是否是最快的,但它绝对很简单。但是存储 10^40 个数字的所有质因数听起来不是一个好主意。

标签: algorithm performance primes prime-factoring


【解决方案1】:

可以修改埃拉托色尼筛法以计算从 2 到 N 的所有数字的因式分解。不要仅仅标记素数的倍数,而是跟踪每个倍数,因为它从列表中选出一个数字。我在my blog给出了一个完整的解决方案代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2015-12-01
    • 2017-11-13
    • 2022-01-19
    • 2017-12-26
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多