我目前正在尝试使用python解决第三个Euler项目,该问题正在尝试查找数字中最大的素数。我使用的方法本质上是强制使用小于要讨论的整数的整数来遍历我的方式,检查它是否为所述整数的因数,然后检查其是否为质数。但是,由于某种原因,我的代码似乎无法正常工作。
我尝试使用创建一个遍历每个整数(i)小于给定整数(n)的函数,并且如果i被n整除,则该函数将继续检查i是否为素数经历每个小于或等于i(x)的整数。如果x是i的因数,则将该值添加到定义为(a)的零整数。之后,如果a最终等于i + 1,则表示该因子为质数,因为唯一可整除的数字本身就是1。代码如下:
def primefactor(n):
for i in range(1, n+1): #goes through each integer less than n
if n % i == 0: #checks if integer is a factor
for x in range(1, i+1): #another loop to check if the factor is prime
a = 0
primenumbers = []
if i % x == 0:
a += x
if a == i + 1:
primenumbers.append(i)
print(primenumbers)
primefactor(13195)
我期望输出的结果是打印出该数字的所有素数的列表,在这种情况下为[5, 7, 13, 29]
,但是我得到的只是一个空列表,{{ 1}}
答案 0 :(得分:0)
此问题与代码有关,是您每次使用primenumbers
将primenumbers = []
分配给一个空列表。
此外,如果您不想对其进行暴力破解,那么解决此类问题的一种好方法就是用Google搜索诸如Formula for primes之类的公式,您会发现:
根据威尔逊定理,
n+1
是质数,当且仅当n! mod(n + 1) = n
。
因此您可以执行以下操作:
# This is just used as caching to make it faster
# it is not needed.
from functools import lru_cache
from math import factorial
@lru_cache()
def isprime(x):
n = x - 1
if n == factorial(n) % (n + 1):
return True
else:
return False
def primefactor(n):
primenumbers = []
for i in range(1, n + 1): #goes through each integer less than n
if n % i == 0: #checks if integer is a factor
isprime(i) and primenumbers.append(i)
print(primenumbers)
primefactor(13195)
输出:
[1, 5, 7, 13, 29]
还有比这快得多的解决方案,它可以处理从0到n
的所有数字:
Algorithm to find Largest prime factor of a number