这段代码的逻辑是什么?它如何快速地工作?

时间:2017-05-28 05:22:21

标签: python prime-factoring

Python的新手,并试图解决挑战,找到大数的素数因子。我很快遇到了一个障碍,其中包含了我想要的逻辑。从广义上讲,我的逻辑是:

  1. 查找给定数字的因子并将其存储在列表中
  2. 从该列表中,评估每个数字以检查是否为素数,以及是否为素数 存储在新列表中
  3. 所以在#2之后,我会得到一个素数列表,它们是原始数字的因子。在我意识到之后卡住了,我将不得不确定第二个列表中元素的组合,这些元素将组成原始数字,因为所有元素虽然是素数,但不能相互相乘以获得原始数字。

    无论如何,经过一段时间的努力,我发现以下代码有助于我试图创建的功能。

    def prime_factors(n):
        # Returns all the prime factors of a positive integer
        factors = []
        d = 2
        while n > 1:
            while n % d == 0: #if no remainder
                factors.append(d)
                n /= d
            d = d + 1
            if d*d > n:
                if n > 1: factors.append(n)
                break
        return factors
    
    pfs = prime_factors(600851475143)
    print(pfs)
    total = sum(pfs)
    

    并提供输出

    [71, 839, 1471, 6857]
    

    需要一些帮助来理解它是如何工作的,以及如何用9位数字这么快。我之前尝试过一些逻辑,这些逻辑要么不起作用,要么我的命令提示符处于挂起状态,试图计算这个大的素因子。

1 个答案:

答案 0 :(得分:2)

您的代码速度很快,因为它使用了素性测试an interesting topic

继续阅读对于新手来说更简单的另一种解决方案,

这个函数将检查给定的整数n是否是素数,当我们将n除以i(初始化为2)时,如果结果为0 ,结果将是 False,因为一个素数只能被 1 或它本身整除,否则,i 将自增(增加)1,如果 i 是最后等于n,结果为True,因为n除以i的结果不等于0。< /p>

def prime(n):
    for i in range(2,n):   # letting i have multiple values starting from 2
        if n % i == 0:     # checking the remainder, if it's 0, then n is not prime,
            return False   # and so False will be returned,
        else:
            i += 1   # if n is still considered prime, i will become 3, then 4, and so on
                     # until it becomes equal to n
    return True      # if so, then n is prime, so True will be returned

这里我们将有一个名为 factors 的空列表,我们将在其中存储质因子,现在看看第 4 行,您会看到:如果 n % i == 0i 是素数,我们将把它添加到我们的名为 factors 的列表中,只有当下面的两个表达式都为真时,我们才会这样做, 如果 n 除以 i 不等于 0 OR/AND i 不是质数 (意思是 prime(i) 返回了 False),我们不会再将 i 添加到我们的列表中,注意这个函数中的 i prime_factors 是一个整数这将被验证为 n 的因数并且也是质数。

def prime_factors(n):
    factors = [] #initializing an empty list that will soon be modified
    for i in range(2,n):
        if (n % i == 0) and (prime(i)): # if i is a factor of n and also i is prime
            factors.append(i)           # the values will be added to our list named factors
    return factors   # this list contains the prime factors values which, we return it

n一个值,然后显示质因数

n = 81210459 # the value of n
pfs = prime_factors(n) # storing our list returned from this function is the variable pfs
print("prime factors of",n,"are:",pfs) # showing the results (this is obvious isn't it :D)

输出:

Prime factors of 81210459 are: [3, 11, 61, 40343]