Піфагорійська потрійна послідовність


33

Піфагора потрійний складається з трьох натуральних чисел а, б і в, таке , що 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

OEIS A239381

Подібні послідовності (не виводити їх!):


Чи є обмеження в часі?
Loovjo

@Loovjo Ні, але ви повинні знати / доводити, що ваш результат правильний. Є кілька подібних послідовностей, де вихід відрізняється після 12325.
mbomb007

Подібна послідовність, про яку я думаю, відрізняється після 85... наступний її термін 3613(ви можете здогадатися, що це ще?)
Ніл

@Neil Швидкий пошук дає A053630 , піфагорійську спіраль. Хоча я посилався на ці два у виклику, тому що, працюючи над тим, щоб здійснити свою реалізацію, я випадково дійшов до цих двох послідовностей або подібних до них.
mbomb007

1
Дійсно, якби я був більше неспаний, я міг би просто заглянути сам ...
Ніл

Відповіді:


11

Желе , 19 байт

o3ṄÆF*/€ŒPP€²+Ṛ$HṂß

Збережено байт завдяки @ Dennis шляхом рефакторингу на нескінченну послідовність.

Не приймає введення та аргументів, а потім виводить послідовність нескінченно, друкуючи кожен термін у міру їх обчислення. Цей метод сповільнюється, коли числа збільшуються, оскільки це залежить від простої факторизації.

Спробуйте в Інтернеті!

Це обчислює наступний член, обчислюючи основну коефіцієнт потужності поточного терміну. Для 12325 це {5 2 , 17, 29}. Існує варіант формули Евкліда для обчислення піфагорійських трійки { a , b , c },

formula

де m > n і трійка є первісною, iff 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.

  • Попередній метод не зміг визначити наступний термін після 228034970321525477033478437478475683098735674620405573717049066152557390539189785244849203205. У попередньому методі було вибрано останнє значення як фактор, коли правильним вибором був 3-ий і останній праймери. Новий метод повільніше, але завжди буде працювати, оскільки він перевіряє всі пари копрімесів, щоб знайти мінімальну гіпотенузу.

Пояснення

o3ṄÆF*/€ŒPP€²+Ṛ$HṂß  Main link. Input: 0 if none, else an integer P
o3                   Logical OR with 3, returns P if non-zero else 3
  Ṅ                  Println and pass the value
   ÆF                Factor into [prime, exponent] pairs
     */€             Reduce each pair using exponentation to get the prime powers
        ŒP           Powerset of those
          P€         Product of each
            ²        Square each
               $     Monadic chain
             +         Add vectorized with
              Ṛ        the reverse
                H    Halve
                 Ṃ   Minimum
                  ß  Call recursively on this value

Ого, це справді швидко!
mbomb007

1
o3ṄÆfµṪ,P²SHßз нескінченним виходом економить байт.
Денніс

5

Брахілог , 36 байт

3{@wB:?>:^a+~^=C:B:?:{$pd}ac#d,C:1&}

Спробуйте в Інтернеті!

Вам потрібно зачекати, поки програма вимкне час (1 хвилина), перш ніж TIO змине висновок. У REPL SWI-Prolog це друкується, як тільки воно знаходить значення.

Це буде друкувати послідовність назавжди.

Через декілька хвилин перекладача SWI-Prolog в автономному режимі я отримав 90733після 12325. Я зупинив це після цього моменту.

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

Пояснення

3{                                 }    Call this predicate with 3 as Input
  @w                                    Write the Input followed by a line break
    B:?>                                B > Input
           +                            The sum...
        :^a                             ...of Input^2 with B^2...
            ~^                          ...must equal a number which is itself a square
              =C                        Assign a fitting value to that number and call it C
               C:B:?:{$pd}a             Get the lists of prime factors of C, B and Input
                                          without duplicates
                           c#d,         Concatenate into a single list; all values must be
                                          different
                               C:1&     Call recursively with C as Input

4

Perl, 73 байти

for($_=3;$_<1e9;$_=$a**2+$b**2){$a++until($b=($_+$a**2)**.5)==($b|0);say}

Усі піфагорійські трійки 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²є квадратом, а саме . Тоді, cдорівнює n²+m².


Можливий помилковий друк у вашому поясненні: ви шукаєте nтаке, що a+n²є квадратом.
Ніл

2

Пітон 3, 178 байт

from math import*
p,n=[3,5],int(input())
while len(p)<n:
 for i in range(p[-1],p[-1]**2):
  v=sqrt(i**2+p[-1]**2)
  if v==int(v)and gcd(i,p[-1])==1:
   p+=[int(v)];break
print(p)

Це в основному просто алгоритм грубої сили, і, отже, дуже повільний. Необхідна кількість термінів, що виводяться як вхідні дані.

Я не на 100% впевнений у правильності цього алгоритму, програма перевіряє наявність іншої ноги до першого рівня в квадраті, що, на мою думку, достатньо, але я не зробив математики.

Спробуйте на repl.it! (Застаріло) (Не намагайтеся це використовувати для чисел, більших за 10, це буде дуже повільно)


Ви можете перейти на Python 3.5 і використовувати math.gcd. Також використовуйте p+=[...]замість p.append(...). І <2замість цього ==1. І все ifможе бути в одному рядку.
mbomb007

1
Ви все ще можете зробити останні два вдосконалення, які я запропонував.
mbomb007


Loovjo, ти будеш гольф коду, використовуючи пропозиції чи ні?
mbomb007

2

MATL , 27 байт

Ii:"`I@Yyt1\~?3MZdZdq]}6MXI

Це створює перші умови послідовності. Введення на основі 0.

Код дуже неефективний. Час очікування в Інтернет-компіляторі більше, ніж введення 5. Введення 6пішло півтори хвилини в режимі офлайн (і видало правильне 90733як 6-й термін).

Спробуйте в Інтернеті!

I            % Push 3 (predefined value of clipboard I)
i            % Input n
:"           % For each (i.e. execute n times)
  `          %   Do...while
    I        %     Push clipboard I. This is the latest term of the sequence
    @        %     Push iteration index, starting at 1
    Yy       %     Hypotenuse of those two values
    t1\      %     Duplicate. Decimal part
    ~?       %     If it is zero: we may have found the next term. But we still
             %     need to test for co-primality
      3M     %       Push the two inputs of the latest call to the hypotenuse 
             %       function. The stack now contains the hypotenuse and the
             %       two legs
      ZdZd   %       Call GCD twice, to obtain the GCD of those three numbers
      q      %       Subtract 1. If the three numbers were co-prime this gives
             %       0, so the do...while loop will be exited (but the "finally" 
             %       part will be executed first). If they were not co-prime  
             %       this gives non-zero, so the do...while loop proceeds 
             %       with the next iteration
    ]        %     End if
             %     If the decimal part was non-zero: the duplicate of the 
             %     hypotenuse that is now on the top of the stack will be used
             %     as the (do...while) loop condition. Since it is non-zero, 
             %     the loop will proceed with the next iteration
  }          %   Finally (i.e. execute before exiting the do...while loop)
    6M       %     Push the second input to the hypotenuse function, which is
             %     the new term of the sequence
    XI       %     Copy this new term into clipboard I
             %   Implicitly end do...while
             % Implicitly end for each
             % Implicitly display the stack, containing the sequence terms

2

Ракетка 106 байт

(let p((h 3))(println h)(let p2((i 1))(define g(sqrt(+(* h h)(* i i))))(if(integer? g)(p g)(p2(add1 i)))))

Безголівки:

(define (f)
  (let loop ((h 3))
    (let loop2 ((i 1))
      (define g (sqrt (+(* h h) (* i i))))
      (if (not(integer? g))
          (loop2 (add1 i))
          (begin (printf "~a ~a ~a~n" h i g)
                 (loop g))))))

Тестування:

(f)

Вихід версії для гольфу:

3
5
13
85
157
12325
12461
106285
276341
339709
10363909
17238541

Вихід у версії без заготівлі:

3 4 5
5 12 13
13 84 85
85 132 157
157 12324 12325
12325 1836 12461
12461 105552 106285
106285 255084 276341
276341 197580 339709
339709 10358340 10363909
10363909 13775220 17238541

(Помилка після цього на моїй машині)


Код для гольфу друкує лише гіпотенузу послідовності. Версії без вогню показують усі три для уточнення трійки, про які не йдеться.
rnso


1

PHP, 139 байт

for($k=3;$i=$k,print("$k\n");)for($j=$i+1;($k=sqrt($m=$i*$i+$j*$j))>(int)$k||gmp_intval(gmp_gcd(gmp_gcd((int)$i,(int)$j),(int)$k))>1;$j++);

Вищевказаний код порушується після 28455997 в 32-бітних системах. Якщо потрібні більші числа, це стає 156 байт:

for($k=3;$i=$k,print("$k\n");)for($j=$i+1;!gmp_perfect_square($m=bcadd(bcpow($i,2),bcpow($j,2)))||gmp_intval(gmp_gcd(gmp_gcd($i,$j),$k=bcsqrt($m)))>1;$j++);

1

Java 8, 133 байт

-25 байт завдяки милям Використовуючи n * n замість Math.pow (n, 2)

-24 байти завдяки милі Використовуючи для циклів замість того часу, змінюючи тип даних, виключаючи () завдяки порядку операцій

()->{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;}};

Використовує той факт, що

Відношення

для будь-якої пари цілих чисел m> n> 0. Тому C дорівнює A плюс 2 (N) 2 . Вищенаведена функція знаходить найменше значення N, яке задовольняє це співвідношення, роблячи другий елемент піфагорійського потрійного цілим і більшим, ніж перший елемент. Потім він встановлює значення першого елемента третьому елементу і повторюється з оновленим першим елементом.

Безголівки:

void printPythagoreanTriples() {
    long firstElement = 3, thirdElement, n;
    while (true) {
        for (n = 1; ; n++) {
            thirdElement = firstElement + (2 * n * n);
            double secondElement = Math.sqrt(thirdElement * thirdElement - firstElement * firstElement);
            if (secondElement == (int) secondElement && firstElement < secondElement) {
                System.out.println("Found Pythagorean Triple [" +
                        firstElement + ", " +
                        secondElement + ", " +
                        thirdElement + "]");
                break;
            }
        }
        firstElement = thirdElement;
    }
}

Ідей це!

* Ідеон не друкує останній необхідний елемент через часові обмеження, однак, як ви бачите за логікою програми та неперевершеною версією (яка друкує 28455997 як третій елемент попередньої піфагорійської трійки, а не перший елемент наступне), значення з більшим часовим обмеженням друкуються.


Ви не можете використовувати n*nзамість цього Math.pow(n,2)?
милі

Я не знаю, чому я не думав про це ... Я додам це відразу. Дякую @miles
Mario Ishac

Я поголив ще трохи, використовуючи 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;}};
миль

1

Python 3,5, 97 байт

Неправильний вихід після 28455997, через обмеження типу даних з плаваючою комою. ThesqrtФункція не досить добре, але якщо точність чарівним чином збільшилася, було б працювати.

Досить простий для розуміння. Збільшенняc на два замість одного скорочує вдвічі час виконання, і все одно потрібно перевіряти лише непарні числа, оскільки елементи завжди непарні.

import math
c=a=3
while 1:
	c+=2;b=(c*c-a*a)**.5;i=int(b)
	if math.gcd(a,i)<2<a<b==i:print(a);a=c

Спробуйте в Інтернеті

Програму не можна запустити на Ideone, оскільки Ideone використовує Python 3.4


Щоб вихід залишався точним довше, мені доведеться використовувати decimal:

import math
from decimal import*
c=a=3
while 1:
	c+=2;b=Decimal(c*c-a*a).sqrt();i=int(b)
	if i==b>a>2>math.gcd(a,i):print(a);a=c

Спробуйте в Інтернеті

Щоб залишатися точним нескінченно, я міг би зробити щось таке жахливе (збільшення точності вимагало кожної ітерації :

import math
from decimal import*
c=a=3
while 1:
	c+=2;b=Decimal(c*c-a*a).sqrt();i=int(b);getcontext().prec+=1
	if i==b>a>2>math.gcd(a,i):print(a);a=c



1

APL (NARS), 169 символів, 338 байт

h←{{(m n)←⍵⋄(mm nn)←⍵*2⋄(2÷⍨nn+mm),(2÷⍨nn-mm),m×n}a⊃⍨b⍳⌊/b←{⍵[2]}¨a←a/⍨{(≤/⍵)∧1=∨/⍵}¨a←(w÷a),¨a←∪×/¨{k←≢b←1,π⍵⋄∪{b[⍵]}¨↑∪/101 1‼k k}w←⍵}⋄p←{⍺=1:⍵⋄⍵,(⍺-1)∇↑h ⍵}⋄q←{⍵p 3x}

перевірити нормально до 14 як аргумент q:

  q 1
3 
  q 2
3 5 
  q 10
3 5 13 85 157 12325 90733 2449525 28455997 295742792965 
  q 12
3 5 13 85 157 12325 90733 2449525 28455997 295742792965 171480834409967437 656310093705697045 
  q 13
3 5 13 85 157 12325 90733 2449525 28455997 295742792965 171480834409967437 656310093705697045 
  1616599508725767821225590944157 
  q 14
NONCE ERROR
  q 14
  ∧

це нижче знайде всіх роздільників його аргументу ...

∪×/¨{k←≢b←1,π⍵⋄∪{b[⍵]}¨↑∪/101 1‼k k}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.