欧拉工程46解决方案给出了错误答案以及正确答案

时间:2019-05-23 14:51:45

标签: python math

我为PE #46写了一个解决方案,给出了两个答案:57(错误)和5777(正确)。而且我真的很想找出原因!我知道这不是最有效的代码,但是如果我能理解这一点,我可以努力使其更快。我的is_prime()函数是我为#7编写的函数,用于解决其他一些问题,所以我知道(嗯,我有信心;))问题不存在,但我将其包括在此处为了完整性。

from math import sqrt


def is_prime(x):
    if x % 2 == 0:
        return x == 2
    if x % 3 == 0:
        return x == 3

    step = 4
    m = int(sqrt(x)) + 1
    i = 5

    while i < m:
        if x % i == 0:
            return False
        step = 6 - step
        i += step

    return True


def is_composite(n):
    for x in range(2, n):
        for y in range(x, n):
            if x * y == n:
                return True
    return False


def test(n):
    for p in range(3, n):
        if is_prime(p):
            for t in range(1, p // 2):
                if p + (2 * t**2) == n:
                    return True
    return False


# currently this gives 57 (wrong) and also 5777 (right)                                                                                                                                                                                       
i = 33
while True:
    if is_composite(i):
        if not test(i):
            print(i)
    i += 2

有什么想法吗?

编辑:这是上面链接中的问题的全文:

  

克里斯蒂安·戈德巴赫(Christian Goldbach)提出,每个奇数复合数字都可以写为素数和平方的两倍之和。

     

9 = 7 + 2×1 ^ 2

     

15 = 7 + 2×2 ^ 2

     

21 = 3 + 2×3 ^ 2

     

25 = 7 + 2×3 ^ 2

     

27 = 19 + 2×2 ^ 2

     

33 = 31 + 2×1 ^ 2

     

事实证明该猜想是错误的。

     

不能写为素数和平方的两倍的最小奇数复合物是什么?

0 个答案:

没有答案