Пифагорейская тройка с python - PullRequest
1 голос
/ 13 апреля 2020

Я хочу получить число 'n' и вывести Пифагорейскую тройку , общее количество которых равно 'n'.

Например, для n = 12 мой результат равен 3, 4, 5 (12 = 3 + 4 + 5).

Я пишу код ниже, но для больших чисел требуется много времени. пожалуйста, помогите мне улучшить его.

a = int(input())
done = False
for i in range(int(a/4)+1,2,-1):
    if done:
        break
    for j in range(i+1,int(a/2)+1):
        k = a-(i+j)
        if k <= j:
            break
        if i**2 + j**2 == k**2:
            print(i,j,k)
            done = True
            break
if done == False:
    print('Impossible')

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Этот код может помочь вам

limits = int(input())
c, m = 0, 2

# Limiting c would limit  
# all a, b and c 
while c < limits : 

    # Now loop on n from 1 to m-1 
    for n in range(1, m) : 
        a = m * m - n * n 
        b = 2 * m * n 
        c = m * m + n * n 

        # if c is greater than 
        # limit then break it 
        if c > limits : 
            break

        if a+b+c == limits:
            print(a, b, c) 

    m = m + 1

>> 12
>> 3 4 5
0 голосов
/ 13 апреля 2020

Я использовал модуль joblib для распараллеливания вашего кода, хотя я не проверял, есть ли ускорение для очень больших n; дайте мне знать:

from joblib import Parallel, delayed

done = False

def triple(a):
    global done 
    for i in range(int(a/4)+1,2,-1):
        if done:
            break
        for j in range(i+1,int(a/2)+1):
            k = a-(i+j)
            if k <= j:
                break
            if i**2 + j**2 == k**2:
                print(i,j,k)
                done = True
                break

    if done == False:
        print('Impossible')


if __name__ == '__main__':
    a = int(input("n:"))
    Parallel(n_jobs=-1, backend="threading")(map(delayed(triple),  [a])) 
0 голосов
/ 13 апреля 2020

Чтобы сгенерировать пифагорейский триплет с заданной суммой, вы можете запустить два цикла, где первый l oop начинается с i = 1 to n/3, второй l oop начинается с j = i+1 to n/2. Во втором l oop мы проверяем, равен ли (n – i – j) i * i + j * j.

n = int(input()
for i in range(1, int(n / 3) + 1): 
    for j in range(i + 1, int(n / 2) + 1): 
        k = n - i - j 
        if (i * i + j * j == k * k): 
            print(i, j, k) 
...