Python找到Prime因子

时间:2015-10-21 21:02:05

标签: python python-2.7 prime-factoring

所以我需要使用python程序找到数字的素因子,我能够找到所有因素:

def primeFactors(n):
    list = []
    for x in range(2,n//2):
       if n % x == 0:
           list.append(x)
return list

但是我不明白我是怎么想让程序忽略多个主要因素的因素。

我找到了以下代码:

def primes(n):
divisors = [ d for d in range(2,n//2+1) if n % d == 0 ]
return [ d for d in divisors if \
         all( d % od != 0 for od in divisors if od != d ) ]

但我实际上并不了解它的作用,这是一项作业,所以我不能只复制和粘贴。

所以我想知道是否有人可以引导我朝着我想要做的正确方向前进。此外,我不能使用任何花哨的功能,主要使用内置的东西,如循环和列表和基本数学。我使用的是python 2.7而不是3.0。

2 个答案:

答案 0 :(得分:1)

除数得到所有可能的除数,与你在代码中完成的相同。

返回的值
[ d for d in divisors if \
         all( d % od != 0 for od in divisors if od != d ) ]

如果所有其他可能的除数d不能被任何其他除数整除,则保持除数d。如果传递给它的所有值都为真,则all返回true,all中的表达式只检查给定的除数d是否不是任何其他除数od的除数你的清单。通过这种方式,返回的最终值列表仅包括不是已存在因子的倍数的除数。

答案 1 :(得分:0)

def primes(n):
    divisors = [ d for d in range(2,n//2+1) if n % d == 0 ]
    return [ d for d in divisors if \
         all( d % od != 0 for od in divisors if od != d ) ]

使用一个例子,比如n = 12 除数将是以下列表[2,3,4,6]

现在return部分有点棘手,并且有充分的理由,不应该以这种方式滥用列表理解。

所以让我们把这个部分变成一个实际的循环:

ans = []
for d in divisors:
    for od in divisors:
        if od != d:
            if d % od == 0:
                break
    else: ans.append(d)
return ans

是的,其他地方在正确的位置

继续这个例子,这部分的作用是搜索除数列表,看看它们中的任何一个是否可以被任何其他除数整除。如果是这样,我们会忽略那个,否则我们会保留它。

最终结果是一系列素数因素。

我在评论中也提到过,除数列表也可以使用:

生成
divisors = [2] + [ d for d in xrange(3,int(n**2+1), 2) if n % d == 0]

这种方法很有用,因为它避免包含除2以外的偶数,这是唯一的素数。除数的大小也较小,因为我们只检查一个数字的平方根,该数字的大小小于数字除以2的数字