python中的素数

Posted

技术标签:

【中文标题】python中的素数【英文标题】:Prime factors in python 【发布时间】:2014-05-02 07:32:13 【问题描述】:

我正在使用下面的代码寻找 2500 的质因数,但我的代码目前只打印 2,我不确定为什么会这样。

no = 2500
count = 0
# Finding factors of 2500
for i in range(1,no):
    if no%i == 0:
    # Now that the factors have been found, the prime factors will be determined  
        for x in range(1,no):
            if i%x==0: 
                count = count + 1
            """Checking to see if the factor of 2500, itself only has two factor implying it is prime"""  
                if count == 2:
                    print i

谢谢

【问题讨论】:

算法对我来说意义不大,需要解释一下吗? Python Finding Prime Factors的可能重复 缩进错误,只有在 count==2 时才会打印... 第二个for循环不应该进一步缩进吗? @filmor 我希望它更清楚 【参考方案1】:

使用sieve of eratosthenes首先生成素数列表:

 from math import sqrt
def sieve_of_eratosthenes(n):
    primes = range(3, n + 1, 2) # primes above 2 must be odd so start at three and increase by 2
    for base in xrange(len(primes)):
        if primes[base] is None:
           continue
        if primes[base] >= sqrt(n): # stop at sqrt of n
            break
        for i in xrange(base + (base + 1) * primes[base], len(primes), primes[base]):
            primes[i] = None
    primes.insert(0,2)
    sieve=filter(None, primes)
    return  sieve

def prime_factors(sieve,n):
    p_f = []
    for prime in sieve:
        while n % prime == 0:
            p_f.append(prime)
            n /= prime
    if n > 1:
        p_f.append(n)
    return p_f
sieve = sieve_of_eratosthenes(2500)
print prime_factors(sieve,2500)

【讨论】:

【参考方案2】:

很抱歉,我不太了解您的算法,但如果您有兴趣查找数字的因数,您可以执行以下操作(根据您的算法):

no = 2500
factors = [i for i in range(1,no) if no % i == 0]
count = len(factors)

在本例中,因子将包含以下列表:

[1, 2, 4, 5, 10, 20, 25, 50, 100, 125, 250, 500, 625, 1250]

特别是对于素数,计数将为 1。

编辑:好的,所以我确实误解了这个问题。该列表仅包含分隔符,而不是主要因素...抱歉造成混淆!

【讨论】:

【参考方案3】:

您的计数变量将只有一次 == 2。

n = 2500
prime_factors = []

for p in range(2,n):
    if p*p > n: break
    while n % p == 0:
        prime_factors.append(p)
        n /= p
if n > 1: prime_factors.append(n)

print prime_factors

你得到了 2500 的质因数作为一个列表。 如果您只使用从 2 到 2500 的素数而不是 range(2,n),它会更快。 Wikipedia - Trial division

【讨论】:

以上是关于python中的素数的主要内容,如果未能解决你的问题,请参考以下文章

用python输出100-200间的素数

加快 Python 中的位串/位操作?

Python中的多个元组

在python中操作列表

列表中的素数

实验吧编程 -找素数