Пифагора тройной состоит из трех натуральных чисел а, б и в, такое , что 2 + B 2 = с 2 . Такая тройка обычно пишется (a, b, c), и хорошо известным примером является (3, 4, 5). Если (a, b, c) является пифагорейской тройкой, то (ka, kb, kc) так же, как и любое положительное целое число k. Примитивная пифагорейская тройка - это та, в которой a, b и c взаимно просты .
Используя это знание, мы можем создать последовательность, связав воедино наименьшие длины троек, где следующим элементом в последовательности является гипотенуза (наибольшее число) наименьшей примитивной пифагорейской тройки, содержащей предыдущий элемент в качестве наименьшего из его длин.
Начните с самой маленькой примитивной пифагорейской тройки (3, 4, 5). Последовательность начинается с 3
, и гипотенуза (следующий элемент в последовательности) есть 5
. Затем найдите наименьшую примитивную пифагорейскую тройку с 5
ногой, и вы получите (5, 12, 13). Итак, последовательность продолжается 13
.
Либо выведите последовательность навсегда, либо возьмите целочисленный ввод n
и выведите первые n
элементы последовательности, либо ноль, либо один индексированный.
Вы должны поддерживать вывод хотя бы через и включительно 28455997
, но если бы внезапно был увеличен предел используемого вами типа данных, он должен был бы работать для этого нового предела. Таким образом, вы не можете жестко закодировать список номеров.
3
5
13
85
157
12325
90733
2449525
28455997
295742792965
171480834409967437
656310093705697045
1616599508725767821225590944157
4461691012090851100342993272805
115366949386695884000892071602798585632943213
12002377162350258332845595301471273220420939451301220405
Подобные последовательности (не выводите их!):
12325
.85
... ее следующий термин3613
(вы можете догадаться, что это еще?)Ответы:
Желе , 19 байт
Благодаря @ Dennis удалось сохранить байт путем рефакторинга бесконечной последовательности.
Не принимает никаких входных данных и аргументов, затем выводит последовательность бесконечно, печатая каждый член по мере его вычисления. Этот метод замедляется по мере увеличения числа, поскольку он зависит от простой факторизации.
Попробуйте онлайн!
Это вычисляет следующий член путем вычисления факторизации основной мощности текущего члена. Для 12325 это {5 2 , 17, 29}. Существует вариант формулы Евклида для вычисления пифагорейских троек { a , b , c },
где m > n и тройка примитивна тогда и только тогда, когда m и n взаимно просты.
Чтобы вычислить следующий первообразный корень из 12325, найдите m и n , для которых mn = 12325, и выберите m , n, чтобы gcd ( m , n ) = 1. Затем сгенерируйте все пары m , n , создав все подмножества {5 2 , 17, 29} и нахождение произведения каждого из этих подмножеств: {1, 25, 17, 29, 425, 725, 493, 12325}. Затем разделите 12325 на каждое значение и пару так, чтобы каждая пара была m , n . Вычислите формулу для c, используя каждую пару и возьмите минимум, который составляет 90733.
объяснение
источник
o3ṄÆfµṪ,P²SHß
с бесконечным выводом сохраняет байт.Брахилог , 36 байт
Попробуйте онлайн!
Вы должны подождать, пока программа не истечет (1 минута), прежде чем TIO сбросит выход. В REPL SWI-Prolog он печатается, как только находит значение.
Это напечатает последовательность навсегда.
После нескольких минут на офлайновом переводчике SWI-Пролог, я получил
90733
после12325
. Я остановил это после этого момента.Это не полный брутфорс, поскольку он использует ограничения для поиска пифагорейских троек, хотя он явно не оптимизирован для скорости.
объяснение
источник
Perl, 73 байта
Все пифагорейские тройки
a²+b²=c²
удовлетворяютa=r(m²-n²), b=2rmn, c=r(m²+n²)
некоторым целым числамr,m,n
. Когдаr=1
иm,n
взаимно просты с одним делением на 2, тогдаa,b,c
это примитивная тройка, гдеa,b,c
все попарно взаимно просты.Имея это в виду, учитывая некоторые
a
, я использую алгоритм грубой силы для вычисления наименьшего,n
такогоa²-n²
как квадрат, а именноm²
. Тогдаc
равноn²+m²
.источник
n
такойa+n²
квадрат.Python 3, 178 байт
Это в основном просто алгоритм грубой силы, и поэтому он очень медленный. Требуется количество терминов для вывода в качестве входных данных.
Я не уверен на 100% в правильности этого алгоритма, программа проверяет другую ногу до первого квадрата, что, я считаю, достаточно, но я не выполнил математические расчеты.
Попробуйте это на repl.it! (Устаревший) (Пожалуйста, не пытайтесь использовать его для чисел больше 10, это будет очень медленно)
источник
math.gcd
. Также используйтеp+=[...]
вместоp.append(...)
. И<2
вместо==1
. Иif
все это может быть на одной линии.MATL , 27 байт
Это производит первые члены последовательности. Ввод на основе 0.
Код очень неэффективен. Время ожидания компилятора для входных данных больше, чем
5
. Ввод6
занял полторы минуты в автономном режиме (и выдал правильный90733
как 6-й срок).Попробуйте онлайн!
источник
Ракетка 106 байт
Ungolfed:
Тестирование:
Выход версии для гольфа:
Вывод негольфированной версии:
(Ошибка после этого на моей машине)
источник
Wolfram Language (Mathematica) , 74 байта
Попробуйте онлайн!
Wolfram Language (Mathematica) , 74 байта
Попробуйте онлайн!
источник
PHP, 139 байт
Приведенный выше код ломается после 28455997 на 32-битных системах. Если необходимо большее число, оно становится 156 байтов:
источник
Java 8, 133 байта
-25 байт благодаря милям Использование n * n вместо Math.pow (n, 2)
-24 байта благодаря милям Использование циклов for вместо while, изменение типа данных, исключение () из-за порядка операций
Использует тот факт, что
для любой пары целых чисел m> n> 0. Следовательно, C равно A плюс 2 (N) 2 . Приведенная выше функция находит наименьшее значение N, которое удовлетворяет этому соотношению, в то же время делая второй элемент пифагорейской тройки целым числом и большим, чем первый элемент. Затем он устанавливает значение первого элемента для третьего элемента и повторяется с обновленным первым элементом.
Ungolfed:
Идео это!
* Ideone не печатает последний требуемый элемент из-за ограничений по времени, однако, как вы можете видеть через логику программы и версию без гольфа (которая печатает 28455997 как третий элемент предыдущей пифагорейской тройки, а не как первый элемент следующий), значения, с более высоким сроком, печатаются.
источник
n*n
вместоMath.pow(n,2)
?for
циклы, чтобы уменьшить его до 133 байт()->{long b=3,c,n;for(;;){for(n=1;;n++){c=b+2*n*n;double d=Math.sqrt(c*c-b*b);if(d==(int)d&b<d){System.out.println(b);break;}}b=c;}};
Python 3.5, 97 байт
Неверный вывод после
28455997
, из-за ограничений типа данных с плавающей запятой.sqrt
Функция не достаточно хорошо, но если точность волшебным образом увеличилась, было бы работать.Довольно просто понять. Увеличение
c
на два вместо одного сокращает время выполнения пополам, и в любом случае необходимо проверять только нечетные числа, потому что элементы всегда нечетные.Попробуйте онлайн
Программа не может быть запущена на Ideone, потому что Ideone использует Python 3.4
Чтобы выходные данные оставались точными, я должен использовать
decimal
:Попробуйте онлайн
Чтобы оставаться точным до бесконечности, я мог бы сделать что-то ужасное, как это (повышение точности требуется каждой отдельной итерации :
источник
J ,
5447 байтTIO
жадное разделение главных факторов на простые факторы
старый 54 байта TIOисточник
Пари / ГП , 71 байт
Попробуйте онлайн!
источник
APL (NARS), 169 символов, 338 байтов
проверить в порядке до 14 в качестве аргумента q:
это ниже найдет все делители своего аргумента ...
источник
JavaScript (Node.js) , 101 байт
Попробуйте онлайн!
Предложения по игре в гольф приветствуются
источник