每个人都知道分解很难。但是如果我想计算从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页面可以看出,根据n的素因子分解,存在r(n)的公式。
到目前为止,我采取了两种方法:
1)计算满足x ^ 2 + y ^ 2 = n的点数,其中0 2)计算n的素数因子分解(独立地,每次),并用这个信息计算r(n)。 实验上,2)似乎更快,但与第一种方法相比,它不能很好地扩展,第一种方法较慢,但不会慢得多。我有兴趣计算R(N)=从n到n的r(n)之和为40位N. 另一个选择是使用像Eratosthenes筛子这样的东西来生成高达N的所有素数,然后以各种方式组合它们,以计算从2到N的所有数字的主要因子分解,并使用相同的公式之前。 有没有人有任何想法哪些选项最有效? 1)是最容易实现的,开始很慢,但可能很好地扩展。 2)快速启动,不能很好地扩展,快速的因子查找肯定更难以实现,但如果修改为使用先前分解的记忆,或者使用如上所述的一些主要生成技术,则可以做得很好。 / p>
即使1)是最快的,我仍然有兴趣学习从0到N生成所有素数因子的最快方法。
答案 0 :(得分:3)
可以修改Eratosthenes的筛子以计算从2到N的所有数字的因子分解。不是仅仅标记素数的倍数,而是在从列表中敲击数字时跟踪每个数。我在my blog处提供了代码的完整解决方案。