피타고라스 트리플 시퀀스


33

피타고라스 트리플 세 양의 정수하는 예 A, B 및 C로 구성 2 + B 2 C = 2 . 이러한 트리플은 일반적으로 쓰여지고 (a, b, c) 잘 알려진 예는 (3, 4, 5)입니다. (a, b, c)가 피타고라스 트리플 인 경우 양의 정수 k에 대한 (ka, kb, kc)도 같습니다. 원시 피타고라스의 삼중 항은 a, b 및 c가 동일 프라임 입니다.

이 지식을 사용하여 최소 길이의 트리플을 함께 연결하여 시퀀스를 만들 수 있습니다. 시퀀스의 다음 요소는 이전 요소를 길이의 가장 작은 요소로 포함하는 가장 작은 원시 피타고라스 트리플의 빗변 (최대)입니다.

가장 작은 원시 피타고라스 트리플 (3, 4, 5)로 시작하십시오. 시퀀스는로 시작 3하고 빗변 (시퀀스의 다음 요소)은 5입니다. 그런 다음 5다리가 있는 가장 작은 원시 피타고라스 트리플을 찾으면 (5, 12, 13)을 얻습니다. 따라서 순서는로 계속됩니다 13.

시퀀스를 영원히 출력하거나 정수 입력 을 사용하여 시퀀스 n의 첫 번째 n요소 (0 또는 1)를 출력하십시오 .

적어도를 통해 포함하여 출력을 지원해야 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

@Neil 빠른 검색으로 피타고라스의 나선 인 A053630이 나옵니다 . 구현을 위해 작업하는 동안 실수로 두 시퀀스 또는 이와 유사한 시퀀스에 도달했기 때문에 도전 과제에서 두 가지를 참조했습니다.
mbomb007

1
실제로, 내가 더 깨어 났을 때 나는 그것을 스스로 찾아 볼 수 있었다.
Neil

답변:


11

젤리 , 19 바이트

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

무한 시퀀스로 리팩토링하여 @ Dennis 덕분에 바이트를 절약했습니다 .

입력과 인수를 취하지 않고 계산할 때 각 항을 인쇄하여 순서를 무한대로 출력합니다. 이 방법은 소인수 분해에 의존하므로 숫자가 커질수록 속도가 느려집니다.

온라인으로 사용해보십시오!

현재 항의 주요 역률을 계산하여 다음 항을 계산합니다. 12325의 경우, 이것은 {5 2 , 17, 29}입니다. 피타고라스의 삼중 항 { a , b , c } 계산을위한 유클리드 공식의 변형이 있습니다 .

formula

여기서 m > n 이고 트리플은 프리미티브입니다. iff mn 은 coprime입니다.

12325에서 다음 기본 루트를 계산하려면 mn = 12325가 되도록 mn을 찾고 gcd ( m , n ) = 1이 되도록 m , n을 선택하십시오 . 그런 다음 {5 2 의 모든 서브 세트를 작성 하여 m , n 의 모든 쌍을 생성하십시오. , 17, 29} 및 {1, 25, 17, 29, 425, 725, 493, 12325} 인 각 하위 집합의 곱을 찾습니다. 그런 다음 12325를 각 값과 쌍으로 나눠 각 쌍이 m , n 이되도록합니다 . 각 쌍을 사용하여 c에 대한 공식을 계산하고 최소값은 90733입니다.

  • 이전 방법은 228034970321525477033478437478475683098735674620405573717049066152557390539189785244849203205 이후 다음 항을 결정하는 데 실패했습니다. 이전 방법은 올바른 선택이 3 번째 및 마지막 소수 일 때 요인으로 마지막 값을 선택했습니다. 새로운 방법은 속도는 느리지 만 최소한의 빗변을 찾기 위해 모든 쌍의 coprimes를 테스트하므로 항상 작동합니다.

설명

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ß무한 출력으로 바이트를 저장합니다.
Dennis

5

Brachylog , 36 바이트

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

온라인으로 사용해보십시오!

TIO가 출력을 플러시하기 전에 프로그램 시간이 초과 될 때까지 기다려야합니다 (1 분). SWI-Prolog의 REPL에서는 값을 찾 자마자 인쇄합니다.

시퀀스가 영원히 인쇄됩니다.

오프라인 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

펄, 73 바이트

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

모든 피타고라스 트리플 은 정수를 a²+b²=c²만족시킵니다 . 경우 와 (2)에 의한 정확히 하나의 존재로 나누어 서로 소이며, 다음 여기서 원시적 인 트리플 모든 페어의 서로 소이다.a=r(m²-n²), b=2rmn, c=r(m²+n²)r,m,nr=1m,na,b,ca,b,c

어떤 주어진 염두에,로 a, 나는 작은 계산하는 무차별 알고리즘을 사용 n그러한 a²-n²즉, 사각형입니다 . 이어서, c동일하다 n²+m².


당신의 설명에서 가능한 오타 : 당신이 검색 n하는 등의 a+n²정사각형이다.
Neil

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
내가 제안한 마지막 2 가지 개선 사항을 계속 수행 할 수 있습니다.
mbomb007


Loovjo, 제안을 사용하여 코드를 골프화 하시겠습니까?
mbomb007

2

MATL , 27 바이트

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

시퀀스의 첫 번째 항이 생성됩니다. 입력은 0을 기준으로합니다.

코드는 매우 비효율적입니다. 온라인 컴파일러가보다 큰 입력 시간을 초과했습니다 5. 입력 6은 오프라인으로 1 분 반이 걸렸습니다 ( 907336 번째 용어로 맞습니다 ).

온라인으로 사용해보십시오!

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

ungolfed 버전의 출력 :

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

(내 컴퓨터 에서이 후 오류)


골프 코드는 시퀀스의 빗변 만 인쇄합니다. Ungolfed 버전은 문제에서 언급되지 않은 세 개의 트리플렛을 명확히하기 위해 세 가지를 모두 보여줍니다.
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++);

위 코드는 32 비트 시스템에서 28455997 이후에 중단됩니다. 더 높은 숫자가 필요한 경우 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

자바 8, 133 바이트

마일로 인한 -25 바이트 Math.pow (n, 2) 대신 n * n 사용

마일 당 -24 바이트 덕분 에 while 대신 루프 사용, 데이터 유형 변경, 작업 순서로 인한 () 제거

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

무시 했어!

* 프로그램의 논리와 ungolfed 버전 (28455997을 첫 번째 요소가 아닌 이전 피타고라스 트리플의 세 번째 요소로 인쇄 함)을 통해 볼 수 있듯이, 이데 오네는 시간 제한으로 인해 마지막 필수 요소를 인쇄하지 않습니다. 다음)에는 시간 제한이 더 높은 값이 인쇄됩니다.


n*n대신 사용할 수 Math.pow(n,2)없습니까?
마일

왜 그런 생각을하지 않았는지 모르겠습니다. 바로 추가하겠습니다. @miles 감사합니다
Mario Ishac

내가 사용 떨어져 좀 더 면도 for133 바이트로 내려받을 루프()->{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

파이썬 3.5, 97 바이트

28455997부동 소수점 데이터 유형의 한계로 인해 이후 에 출력이 잘못되었습니다 . 이 sqrt기능은 충분하지 않지만 정밀도가 마술처럼 증가하면 효과가 있습니다.

이해하기 매우 간단합니다. 증가 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은 Python 3.4를 사용하기 때문에 Ideone에서 프로그램을 실행할 수 없습니다.


출력을 더 오래 유지하려면 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}

q의 인수로 14까지 OK를 테스트하십시오.

  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}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.