我仍然是python的新手,我试图将600851475143中的所有素数放入列表中。但是,我不断在列表中获得随机的数字而不是素数。我不确定我哪里出错了。谢谢你的时间
import math
factors_list = []
prime_factors = []
def number_factors(s):
s = int(math.sqrt(s))
for num in range(2, s):
for i in range(2, num):
if (num % i) == 0:
factors_list.append(num)
else:
prime_factors.append(num)
number_factors(600851475143)
print factors_list
print prime_factors
答案 0 :(得分:2)
目前,每次prime_factor
都会附加到if (num % i) == 0
。因此,例如,如果num=12
(不是素数)和i=5
,则会附加到prime_factor
。
相反,如果它根本没有没有除数,则只应附加,而不是只有一个数字不均匀分配。
我提前警告你,这个问题不仅仅是关于计算素数,而且600851475143是一个非常大的数字。因此,您应该将当前的代码作为学习练习,但是您需要重新考虑完整解决方案的方法。
答案 1 :(得分:1)
这是一个更好的分解 n 的算法。我会用文字描述,所以你可以自己编写代码。
1) Set f = 2. Variable f represents the current trial factor.
2) If f * f > n, then n must be prime, so output n and stop.
3) Divide n by f. If the remainder is 0, then f is a factor of n,
so output f and set n = n / f, then return to Step 2.
4) Since the remainder in the prior step was not 0, set f = f + 1
and return to Step 2.
例如,对于因子13195,首先设置 f = 2;不满足步骤2中的测试,步骤3中的余数为1,所以在步骤4中设置 f = 3并返回步骤2.现在不满足步骤2中的测试,其余的在步骤3中为1,所以在步骤4中设置 f = 4并返回步骤2.现在不满足步骤2中的测试,步骤3中的余数为3,所以在步骤4中设置 f = 5并返回步骤2.
现在不满足步骤2中的测试,但步骤3中的余数为0,因此5是因子13195;输出5,设置 n = 2639,然后返回步骤2.现在不满足步骤2中的测试,步骤3中的余数为4,所以在步骤4中设置 f = 6并返回步骤2.现在不满足步骤2中的测试,步骤3中的余数为5,因此在步骤4中设置 f = 7并返回步骤2。 / p>
现在不满足步骤2中的测试,但步骤3中的余数为0,因此7是因子2639(也是13195);输出7,设置 n = 377,然后返回步骤2.现在不满足步骤2中的测试,步骤3中的余数为6,所以在步骤4中设置 f = 8并返回步骤2.以这种方式继续,直到 f = 13。
现在不满足步骤2中的测试,但步骤3中的余数为0,因此13是因子377(以及2639和13195);输出13,设置 n = 29,然后返回步骤2.这里步骤2 中的测试满足,因为13 * 13 = 169,大于29,所以29是素数,输出它并停止。最终分解为5 * 7 * 13 * 29 = 13195。
600851475143的分解以完全相同的方式工作,但需要更长时间。有更好的方法来计算整数。但是这个算法很简单,对于PE3来说已经足够了。
答案 2 :(得分:0)
对于大数字,这将运行得相当慢。考虑算法试图找到num = 1000000的素数因子的情况。在下一个数字被考虑之前,你的嵌套FOR循环将产生100万次操作!
考虑使用Eratosthones的Sieve来获得所有素数达到某个整数。它不如某些其他Sieves效率高,但易于实现。花一些时间在实施之前阅读筛子背后的理论 - 这将有助于您理解后来的问题。