Список чисел, квадраты которых являются суммой двух квадратов

Я только начал изучать Python и начал делать некоторые проблемы, чтобы помочь buid мои навыки, однако я довольно застрял на этом вопросе.

составьте список, содержащий все положительные целые числа до 1000, квадраты которых могут быть выражены как сумма двух квадратов, (i, e., целые числа p, для которых p^2=m^2+n^2, где m и n-целые числа больше 0.)

подсказки: существует несколько подходов. Возможно, Вам будет полезно иметь список всех квадратных чисел. В оператор может быть полезен.

вот код, который я придумал до сих пор:

    numbers=xrange(1001)
    numbers_squared=[x**2 for x in numbers]
    a=[]

    for x in numbers_squared:
        for b in numbers_squared:
            if (x+b)**.5 <= 1001:
                a.append(x+b)
    print a

проблема, которую я получаю с этим, заключается в том, что Python занимает годы, чтобы сделать эти вычисления (я ждал около десяти минут, и он все еще печатает числа). Любые подсказки о том, как это решить, будут очень оценены.

p.s. Главное - использовать списки. Также подсказки будут более оценены, чем само решение.

Спасибо!

4 ответов


Как насчет понимания списке? вычислить для c в диапазоне (1,1011) для b в диапазоне (1, c) для A в диапазоне (1, b)

следующим образом:

x = [(a,b,c) for c in range(1,1001) for b in range(1, c) for a in range(1,b) if a**2+b**2==c**2]
print x 

я приурочил это, и это занимает 46 секунд, чтобы завершить на моем компьютере


прежде всего, вы не решаете проблему. Вам нужно сделать проверку, чтобы убедиться (x+b)**.5 на самом деле целочисленной. Во-вторых, если вы печатаете числа, вы уже вычислили все числа. Выполнение вышеизложенного сократит время, необходимое для этого шага.


Это может сработать:

def isSumOfSquares(n):
    """return True if n can be expressed as the sum of two squares; False otherwise"""

    for a in xrange(1,n):
        b = n-(a**2)
        if b<=0:
            return False
        elif not math.sqrt(b)%1:
            return True
    return False

answer = [i for i in xrange(1,1001) if isSumOfSquares(i**2)]

Дайте мне знать, если это работает для вас


Я просто ответил на это в другом месте!

import math

def is_triple(hypotenuse):
    """return (a, b, c) if Pythagrean Triple, else None"""
    if hypotenuse < 4:
        return None

    c = hypotenuse ** 2

    for a in xrange(3, hypotenuse):
        b = math.sqrt(c - (a ** 2)) 
        if b == int(b):
            return a, int(b), hypotenuse

    return None

>>> results = [x for x in range(1001) if is_triple(x)]
>>> len(results)
567

проходит почти мгновенно.