Trình tự ba Pythagore


33

Một bộ ba Pythagore bao gồm ba số nguyên dương a, b và c, sao cho a 2 + b 2 = c 2 . Một bộ ba như vậy thường được viết (a, b, c), và một ví dụ nổi tiếng là (3, 4, 5). Nếu (a, b, c) là bộ ba số Pythagore, thì (ka, kb, kc) cho bất kỳ số nguyên dương k nào. Một bộ ba Pythagore nguyên thủy là một trong đó a, b và c là nguyên tố cùng nhau .

Sử dụng kiến ​​thức này, chúng ta có thể tạo ra một chuỗi bằng cách xâu chuỗi các độ dài nhỏ nhất của bộ ba, trong đó phần tử tiếp theo trong chuỗi là hypotenuse (số lớn nhất) của bộ ba Pythagore nguyên thủy nhỏ nhất chứa phần tử trước đó là phần tử nhỏ nhất.

Bắt đầu với bộ ba Pythagore nguyên thủy nhỏ nhất (3, 4, 5). Trình tự bắt đầu bằng 3, và cạnh huyền (yếu tố tiếp theo trong chuỗi) là 5. Sau đó tìm bộ ba Pythagore nguyên thủy nhỏ nhất bằng 5một chân và bạn nhận được (5, 12, 13). Vì vậy, trình tự tiếp tục với 13.

Hoặc xuất ra chuỗi mãi mãi hoặc lấy đầu vào số nguyên nvà xuất các nphần tử đầu tiên của chuỗi, bằng 0 hoặc một chỉ mục.

Bạn cần hỗ trợ đầu ra ít nhất thông qua và bao gồm 28455997, nhưng nếu giới hạn của loại dữ liệu bạn đang sử dụng đột nhiên được nâng lên, thì nó sẽ cần phải hoạt động cho giới hạn mới đó. Vì vậy, bạn không thể mã cứng một danh sách các số.

3
5
13
85
157
12325
90733
2449525
28455997
295742792965
171480834409967437
656310093705697045
1616599508725767821225590944157
4461691012090851100342993272805
115366949386695884000892071602798585632943213
12002377162350258332845595301471273220420939451301220405

OEIS A239381

Trình tự tương tự (không xuất ra những cái này!):


Có giới hạn thời gian không?
Loovjo

@Loovjo Không, nhưng bạn nên biết / chứng minh rằng đầu ra của bạn là chính xác. Có một số trình tự tương tự trong đó đầu ra khác nhau sau 12325.
mbomb007

Trình tự tương tự tôi nghĩ về sự khác biệt sau 85... thuật ngữ tiếp theo của nó là 3613(bạn có thể đoán nó là gì không?)
Neil

@Neil Một tìm kiếm nhanh mang lại A053630 , vòng xoắn ốc Pythagore. Mặc dù vậy, tôi đã tham khảo cả hai trong thử thách, bởi vì trong khi thực hiện việc thực hiện, tôi đã vô tình đạt được hai chuỗi đó hoặc tương tự như chúng.
mbomb007

1
Thật vậy, nếu tôi tỉnh táo hơn, tôi có thể tự mình nhìn lên ...
Neil

Câu trả lời:


11

Thạch , 19 byte

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

Đã lưu một byte nhờ @ Dennis bằng cách tái cấu trúc thành một chuỗi vô hạn.

Không có đầu vào và đối số, sau đó xuất chuỗi vô hạn bằng cách in từng thuật ngữ khi nó tính toán chúng. Phương pháp này chậm lại khi các con số trở nên lớn hơn vì nó phụ thuộc vào hệ số nguyên tố.

Hãy thử trực tuyến!

Điều này tính toán thuật ngữ tiếp theo bằng cách tính hệ số công suất chính của thuật ngữ hiện tại. Đối với 12325, đây là {5 2 , 17, 29}. Có một biến thể của công thức Euclid để tính toán bộ ba Pythagore { a , b , c },

công thức

trong đó m > n và bộ ba là iff m nguyên thủy và n là nguyên tố cùng nhau.

Để tính gốc nguyên thủy tiếp theo từ 12325, hãy tìm mn sao cho mn = 12325 và chọn m , n sao cho gcd ( m , n ) = 1. Sau đó tạo tất cả các cặp m , n bằng cách tạo tất cả các tập con của {5 2 , 17, 29} và tìm sản phẩm của từng tập hợp con đó là {1, 25, 17, 29, 425, 725, 493, 12325}. Sau đó chia 12325 cho mỗi giá trị và cặp sao cho mỗi cặp là m , n . Tính công thức cho c bằng cách sử dụng mỗi cặp và lấy mức tối thiểu là 90733.

  • Phương pháp trước đó đã thất bại trong việc xác định thuật ngữ tiếp theo sau 228044970321525477033478437478485683098735674620405573717049066152557390539189785244849203205. Phương pháp trước đó đã chọn giá trị cuối cùng là lựa chọn cuối cùng. Phương pháp mới chậm hơn nhưng sẽ luôn hoạt động vì nó kiểm tra tất cả các cặp coprimes để tìm ra cạnh huyền tối thiểu.

Giải trình

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

Wow, điều này thực sự nhanh chóng!
mbomb007

1
o3ṄÆfµṪ,P²SHßvới đầu ra vô hạn tiết kiệm một byte.
Dennis

5

Brachylog , 36 byte

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

Hãy thử trực tuyến!

Bạn phải đợi chương trình hết thời gian (1 phút) trước khi TIO tuôn ra đầu ra. Trong REPL của SWI-Prolog, bản in này ngay khi tìm thấy giá trị.

Điều này sẽ in trình tự mãi mãi.

Sau vài phút trên trình thông dịch ngoại tuyến của SWI-Prolog, tôi đã nhận được 90733sau 12325. Tôi đã dừng nó sau thời điểm này.

Điều này không hoàn toàn bruteforce vì nó sử dụng các ràng buộc để tìm bộ ba pythagore, mặc dù nó rõ ràng không được tối ưu hóa cho tốc độ.

Giải trình

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 byte

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

Tất cả các bộ ba Pythagore a²+b²=c²đáp ứng a=r(m²-n²), b=2rmn, c=r(m²+n²)cho một số số nguyên r,m,n. Khi r=1m,nlà nguyên tố cùng nhau với chính xác một số chia hết cho 2, thì đó a,b,clà một bộ ba nguyên thủy, trong đó a,b,ctất cả đều là cặp song phương.

Với ý nghĩ này, được đưa ra một số a, tôi sử dụng thuật toán brute-force để tính toán nhỏ nhất nnhư a²-n²một hình vuông, cụ thể là . Sau đó, cbằng n²+m².


Typo có thể trong lời giải thích của bạn: bạn tìm kiếm na+n²là một hình vuông.
Neil

2

Python 3, 178 byte

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)

Đây về cơ bản chỉ là một thuật toán vũ phu, và do đó rất chậm. Nó lấy số lượng các điều khoản để đầu ra làm đầu vào.

Tôi không chắc chắn 100% về tính chính xác của thuật toán này, chương trình kiểm tra chân kia cho đến bình phương đầu tiên, điều mà tôi tin là đủ, nhưng tôi đã không làm được phép toán.

Hãy thử nó trên repl.it! (Đã lỗi thời) (Vui lòng không thử với số lớn hơn 10, sẽ rất chậm)


Bạn có thể chuyển sang Python 3.5 và sử dụng math.gcd. Ngoài ra, sử dụng p+=[...]thay vì p.append(...). Và <2thay vì ==1. Và iftất cả có thể trên một dòng.
mbomb007

1
Bạn vẫn có thể thực hiện 2 cải tiến cuối cùng mà tôi đề xuất.
mbomb007


Loovjo, bạn sẽ đánh golf mã của mình bằng cách sử dụng các đề xuất hay không?
mbomb007

2

MATL , 27 byte

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

Điều này tạo ra các điều khoản đầu tiên của chuỗi. Đầu vào là 0 dựa trên.

Mã này rất không hiệu quả. Trình biên dịch trực tuyến hết thời gian cho đầu vào lớn hơn 5. Đầu vào 6mất một phút rưỡi ngoại tuyến (và tạo ra chính xác 90733như thuật ngữ thứ 6).

Hãy thử trực tuyến!

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

Vợt 106 byte

(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)))))

Ung dung:

(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))))))

Kiểm tra:

(f)

Đầu ra của phiên bản golf:

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

Đầu ra của phiên bản chưa được chỉnh sửa:

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

(Lỗi sau này trên máy của tôi)


Các mã golf chỉ in ra thôi miên trình tự. Các phiên bản Ungolfed cho thấy cả ba để làm rõ các bộ ba không được đề cập trong câu hỏi.
rnso


1

PHP, 139 byte

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++);

Đoạn mã trên bị phá vỡ sau 28455997 trên các hệ thống 32 bit. Nếu cần số cao hơn, nó trở thành 156 byte:

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 byte

-25 bytes nhờ dặm Sử dụng n * n thay vì Math.pow (n, 2)

-24 bytes nhờ dặm Sử dụng cho vòng lặp thay vì thời gian, thay đổi kiểu dữ liệu, loại bỏ () do thứ tự của các hoạt động

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

Sử dụng thực tế là

Quan hệ

với mọi cặp số nguyên m> n> 0. Do đó, C bằng A cộng 2 (N) 2 . Hàm trên tìm giá trị nhỏ nhất của N thỏa mãn mối quan hệ này, đồng thời làm cho phần tử thứ hai của bộ ba Pythagore trở thành số nguyên và lớn hơn phần tử thứ nhất. Sau đó, nó đặt giá trị của phần tử đầu tiên thành phần tử thứ ba và lặp lại với phần tử đầu tiên được cập nhật.

Ung dung:

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;
    }
}

Nghĩa là nó!

* Ideone không in phần tử được yêu cầu cuối cùng do giới hạn thời gian, tuy nhiên như bạn có thể thấy thông qua logic của chương trình và phiên bản không mã hóa (in ra 28455997 là phần tử thứ ba của bộ ba Pythagore trước đó chứ không phải là phần tử đầu tiên của tiếp theo), các giá trị, với giới hạn thời gian cao hơn, được in.


Bạn không thể sử dụng n*nthay vì Math.pow(n,2)?
dặm

Tôi không biết tại sao tôi không nghĩ về điều đó ... Tôi sẽ thêm nó ngay lập tức. Cảm ơn bạn @miles
Mario Ishac

Tôi cạo một số chi tiết bằng cách sử dụng forvòng lặp để có được nó xuống 133 byte()->{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;}};
dặm

1

Python 3.5, 97 byte

Đầu ra sai sau 28455997, vì các giới hạn của kiểu dữ liệu dấu phẩy động. Cácsqrt chức năng không phải là đủ tốt, nhưng nếu chính xác được tăng lên một cách kỳ diệu, nó muốn làm việc.

Khá đơn giản để hiểu. Tăng cthêm hai thay vì một lần cắt thời gian chạy làm đôi và chỉ cần kiểm tra các số lẻ, bởi vì các phần tử luôn là số lẻ.

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

Dùng thử trực tuyến

Chương trình không thể chạy trên Ideone, vì Ideone sử dụng Python 3.4


Để đầu ra được chính xác lâu hơn, tôi phải sử dụng 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

Dùng thử trực tuyến

Để giữ chính xác vô thời hạn, tôi có thể làm một cái gì đó kinh khủng như thế này (tăng độ chính xác cần thiết cho mỗi lần lặp :

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

J , 54 47 byte

-:@+/@:*:@((*/:~)/)@,.&1@x:@(^/)@(2&p:)^:(<12)3

TIO

tham lam phân chia các yếu tố chính thành các yếu tố đồng thời

TIO 54 byte cũ



1

APL (NARS), 169 ký tự, 338 byte

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}

kiểm tra ok cho đến khi 14 là đối số của 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
  ∧

Điều này dưới đây sẽ tìm thấy tất cả các ước của đối số của nó ...

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.