【问题标题】:Looking for counterexample in this python prime factors program在这个 python 素数程序中寻找反例
【发布时间】:2018-10-09 21:34:51
【问题描述】:

我拼凑了这个脚本来输出整数 n 的素数分解。在脚本的最后,我将当前的主要因素列表相乘,包括多重性,并检查它是否等于n;如果不是,我将该乘积除以,如果它是素数,则附加商。

我已经测试了大量的数字,并且每次都有效,但从数学上讲我不知道为什么。我不应该循环检查range (sqrt(n), n) 中的剩余素数吗?在那个范围内不能有一个有两个素数的整数吗?如果有,我还没有找到一个例子。我是 python 新手,所以另一种解释是我不理解我自己的代码,并且它以某种方式循环给我。

from math import sqrt
n = int(input("Let's factor a number:"))

def isPrime(x):
    for i in range(2,int(sqrt(x)+1)):
        if x%i==0:
            return False
    return True

m = int(sqrt(n)+1)
i = 1
factors = []
while(1 < m):
    if (n % (m**i) == 0 and isPrime(m) == True):
        factors.append(m)
    else:
        m -= 1
        i = 1
        continue
    i += 1

prod = 1
for i in factors:
    prod *= i

if prod == n:
    print(factors)
elif isPrime(n/prod) == True:
    factors.append(int(n/prod))
    print(factors)

【问题讨论】:

  • 如果整数n[sqrt(n) ... n]中有一个因子k,那么n/k也将是一个因子,它在[1 ... sqrt(n)]的范围内,所以检查上面的任何内容sqrt(n) 一旦您检查了以下所有内容,就不需要了。

标签: python primes


【解决方案1】:

不,您不需要这样的循环。 n 只能有一个质因数 > sqrt(n)。假设相反:至少有两个。 i, j > sqrt(n)。在这种情况下,i*j 必须 > sqrt(n)*sqrt(n),这就是你的矛盾。

一旦您找到所有小于sqrt(n) 的因数,任何剩余的量都是素数,并且是唯一大于sqrt(n) 的因数。

【讨论】:

  • 谢谢!这既精彩又明显。我应该更仔细地考虑一下。
  • 您可以在线搜索分解算法。 Sieve of Eratosthenes 是一个不错的起点。你也可以找到更清晰的代码来帮助你学习。
猜你喜欢
  • 1970-01-01
  • 2015-06-19
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多