Python Euler项目47查找包含4个因子的所有数字

Python Euler项目47查找包含4个因子的所有数字,python,math,optimization,Python,Math,Optimization,我首先创建一个包含10^6个假值的列表,我要做的是在包含4个不同素数的所有数字的区间内迭代真值 这意味着数字2*2*3*5*7是一个包含4个不同素数的数字 我真的不知道如何创造数字,我甚至不知道如何去想它。我想有4种不同的数字,但在所有可能的不同数量。代码如下: """ Pre do prime list """ sieve = [True] * 1000 sieve[0] = sieve[1] = False def primes(sieve, x): for i in range(x+x

我首先创建一个包含10^6个假值的列表,我要做的是在包含4个不同素数的所有数字的区间内迭代真值

这意味着数字2*2*3*5*7是一个包含4个不同素数的数字

我真的不知道如何创造数字,我甚至不知道如何去想它。我想有4种不同的数字,但在所有可能的不同数量。代码如下:

""" Pre do prime list """

sieve = [True] * 1000
sieve[0] = sieve[1] = False

def primes(sieve, x):
for i in range(x+x, len(sieve), x):
    sieve[i] = False

for x in range(2, int(len(sieve) ** 0.5) + 1):
primes(sieve, x)

PRIMES = list((x for x in range(2, len(sieve)) if sieve[x]))

""" Main """

Numbers = [False] * 10 ** 6

Factors = PRIMES[0] * PRIMES[1] * PRIMES[2] * PRIMES[3]
Numbers[Factors] = True

for prime in PRIMES:
    for prime in PRIMES[1:]:
        for prime in PRIMES[2:]:
            for prime in PRIMES[3:]:

你能用另一种方法来做吗:得到一个根(N)以下的素数列表,然后生成小于N的产品。类似于:

res = {}
for i in range(n):
  for j in range(i,n):
    for k in range(j,n):
      for m in range(k,n):
        prod = p[i] * p[j] * p[k] * p[m]
        if prod < N:
          res[prod] = [p[i], p[j], p[k], p[m]]

我认为最简单的方法是跟踪你为每个数字找到了多少素数因子。您可以对埃拉托什进行筛选,但不是将素数的倍数标记为复合,而是增加素数除以它们的计数。确保使用未优化的循环:一旦选择素数p,增加素数除以p、2*p、3*p等的计数,而不是将p^2、p^2+2*p等标记为复合


另一种可能性是,在进行埃拉托斯坦筛选时,记录每个数字的最小素数因子。这使您可以递归地找到素因子分解,并且可以检查其中哪一个正好有4个素因子

在尝试筛子法之前,我继续这样做。。最后,我意识到我应该使用一个搜索算法,找到两个奇数,4个不同的因子,相差2,然后尝试中间的数和前后的数。如果满足此条件,则问题得到解决

事实上,这个问题和帖子中提到的一样,但通过一些数论,魔术简化为只找到满足问题条件的没有倍数因子的数字

Factors = list([0, 0, 1, 1, 2, 1, 2, 1, 3, 2]) + [0] * 5 * 10 ** 5

for prime in PRIMES:
    Factors[prime] = 1

for number in range(10, 5 * 10 ** 5):
    if Factors[number] == 1:
        continue
    for prime in PRIMES:
        if number % prime == 0:
            Factors[number] = Factors[prime] + Factors[number // prime]
            break

你为什么不强迫它呢?我就是这么做的,而且很管用,很慢。这很有趣,你一定做错了什么。可能没有进行正确的优化?。。。这仍然是一种欺骗,因为我假定知道奇数中最大素因子的值。
Factors = list([0, 0, 1, 1, 2, 1, 2, 1, 3, 2]) + [0] * 5 * 10 ** 5

for prime in PRIMES:
    Factors[prime] = 1

for number in range(10, 5 * 10 ** 5):
    if Factors[number] == 1:
        continue
    for prime in PRIMES:
        if number % prime == 0:
            Factors[number] = Factors[prime] + Factors[number // prime]
            break