Каков наилучший способ создания пифагорейских троек?

Я пробовал с этим простым кодом, когда вы просто проверяете все комбинации для a и b, а затем проверяете, является ли квадратный корень c целочисленным, но этот код очень медленный, тогда я попытался с формулой Евклида

a = d*(n^2 - m^2) b = 2*n*m*d c = d*(n^2 + m^2) 

и я написал код, в котором вы сначала найдете n с

 trunc(sqrt(max_value)) //this is in pascal 

и затем вы проверяете каждую комбинацию 0 <m <n, но я получаю повторяющиеся результаты, например, если n равно 7, m равно 5, а d равно 1, а n равно 6, m равно 1, а d равно 2. В обоих случаях вы получаете 24, 70 и 74. Итак, что является хорошим быстрым способом расчета числа пифагорейских троек, я не могу найти способ, также если я добавлю все результаты в массив, а затем проверьте массив для дубликатов, это займет слишком много времени … Если кто-нибудь может мне помочь с кодом, он может быть pascal, c или python, я могу понять все …

2 Solutions collect form web for “Каков наилучший способ создания пифагорейских троек?”

Мне было любопытно, поэтому я решил попробовать это. Я обнаружил, что этот алгоритм довольно легко реализовать в Python и работает довольно быстро:

 import math def pythagorean_triples(n): a, b, c = 1, 3, 0 while c < n: a_ = (a * b) + ac = math.sqrt(a_**2 + b**2) if c == int(c): yield b, a_, int(c) a += 1 b += 2 if __name__ == '__main__': import sys for pt in pythagorean_triples(int(sys.argv[1])): print(pt) 

Попробуйте это, скопировав этот скрипт в python3 pythagorean_triples.py n pythagorean_triples.py и запустив python3 pythagorean_triples.py n где n – максимальное значение c вы хотите создать. (Вы также можете использовать более поздний Python2, если хотите.)

На странице Википедии о трофеях Пифагора мы даем нам подсказку:

Тройка, порожденная формулой Евклида, примитивна тогда и только тогда, когда m и n взаимно просты, а m – n нечетно. Если оба m и n нечетны, то a, b и c будут четными, и поэтому тройка не будет примитивной; однако, деление a, b и c на 2 даст примитивную тройку, если m и n взаимно просты

Если вы ограничиваете m и n взаимно простыми числами и заставляете m – n быть нечетным, вы будете генерировать все примитивные пифагорейские тройки. С этого момента вы должны иметь возможность умножить эти уникальные троицы на факторы d чтобы однозначно генерировать все тройки.

В вашем примере, позволяя n = 7 и m = 5, была проблема, потому что их разница была четной, а генерированная тройка была не примитивной (вы могли разделить все стороны на 2, чтобы получить меньшую тройку)

  • Вызовите C ++ opencv-функции из Python (отправьте cv :: Mat в C ++ dll, использующую opencv)
  • Плохая Linux-память, сопоставленная производительностью файлов с произвольным доступом C ++ и Python
  • Рекомендуемый формат данных для описания правил шахмат
  • Те же элементы перечисления обертывают константы разных типов в SWIG> 2.0.1
  • Принтеры GDB для Qt5
  • Vim запуск ярлыка
  • Может ли кто-нибудь объяснить потоки мне?
  • Что такое PyClass_New эквивалент в Python 3?
  • Передайте массив 2d numpy в c, используя ctypes
  • Вставить код python в C ++ (Windows + minGW + Python 2.7.2 + Eclipse)
  • питон? (условный / тернарный) оператор для присвоений
  • Python - лучший язык программирования в мире.