Tripel Pythagoras Primitif

29

( terkait )

Sebuah Pythagoras Tiga adalah daftar (a, b, c)yang memenuhi persamaan a 2 + b 2 = c 2 .

Sebuah primitif Pythagoras Tiga (PPT) adalah salah satu tempat a, bdan csemua coprime (yaitu, pembagi hanya umum antara tiga unsur adalah 1). Misalnya, (3, 4, 5)segitiga kanan adalah Triple Pythagoras Primitif yang terkenal.

Tantangan

  • Input yang diberikan n, output nPPT ke-4. Atau,
  • Input yang diberikan n, output nPPT pertama .

Ada beberapa cara untuk memesan PPT ini untuk membentuk daftar yang tertata dengan baik, untuk menentukan mana yang nke-5. Anda dapat memilih pemesanan yang Anda inginkan, selama Anda dapat membuktikan (secara informal tidak masalah) bahwa algoritma Anda dapat menghasilkan setiap PPT unik yang mungkin. Misalnya, kode Anda tidak boleh menampilkan keduanya (3,4,5)dan (4,3,5)karena itu adalah duplikat dari triple-satu yang sama, tolong.

Demikian pula, apakah kode Anda nol atau satu diindeks baik-baik saja, asalkan Anda menyatakan yang Anda gunakan.

Contohnya

Untuk contoh di bawah ini, saya menggunakan satu-pengindeksan, mengeluarkan nPPT th, dan memesan dengan terkecil c, lalu terkecil a, lalu terkecil b.

n | output
1 | (3, 4, 5)
2 | (5, 12, 13)
5 | (20, 21, 29)
12| (48, 55, 73)

Aturan

  • Input dan output dapat diberikan dalam format apa pun yang nyaman .
  • Dalam kiriman Anda, sebutkan bagaimana entri Anda dipesan, dan apakah entri Anda diindeks 0 atau 1 diindeks.
  • Pemesanan yang Anda pilih tidak dapat membuat duplikat.
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online agar orang lain dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber
Terkait
miles
2
A103606 .
mil
Apa masukan tertinggi yang harus kita dukung? Bisakah kita berasumsi bahwa itu sesuai dengan kemampuan bahasa pilihan kita?
Tn. Xcoder
1
@ Mr.Xcoder Ya; itu adalah asumsi standar yang aman, kecuali jika Anda menggunakannya untuk mengeksploitasi celah (misalnya, bahasa hanya mendukung angka 1-bit) untuk membuat masalah sepele.
AdmBorkBork
2
Saya menemukan jawaban untuk pertanyaan saya: a dan b harus menjadi koprime dan ini cukup proofwiki.org/wiki/…
edc65

Jawaban:

12

Jelly , 27 25 byte

2 byte, terima kasih kepada Jonathan Allan.

²IH;Pµ;ÆḊ
+2ḶḤ‘Œcg/ÐṂÇ€Ṣḣ

Cobalah online!

Menghasilkan ntiga kali lipat indeks pertama [b, a, c], diurutkan dengan meningkatkan blalu a.

Menggunakan algoritma dari Wikipedia :

a = mn, b = (m² - n²) / 2, c = (m² + n²) / 2

Ini menghasilkan semua tiga kali lipat primitif untuk semua pasangan koprime unik bilangan bulat ganjil m > n > 0.

Penjelasan

+2ḶḤ‘Œcg/ÐṂÇ€Ṣḣ    Main link. Argument: n
+2                   Add 2 to n, to get enough results.
  Ḷ                  Get integers [0, 1, ..., n+1].
   Ḥ                 Double to get [0, 2, ..., 2n+2].
    ‘                Increment to get [1, 3, ..., 2n+3].
     Œc              Get all ordered pairs [[1, 3], [1, 5], ..., [2n+1, 2n+3]].
       g/            GCD of each pair.
         ÐṂ          Grab the pairs with minimal GCD (which is 1).
           ǀ        Call the helper link on each pair to get the triples.
             Ṣ       Sort the triples first by a, then by b, then by c.
              ḣ      Get the last n.

²IH;Pµ;ÆḊ    Helper link. Argument: pair [m, n]
²              Square to get [m², n²].
 I             Increments: get [m²-n²].
  H            Halve: get [(m²-n²)/2], i.e. [b].
    P          Product: get mn, i.e. a.
   ;           Append to get [b, a].
     µ         Begin a new monadic chain with argument [b, a].
       ÆḊ      Get the length of the vector, i.e. c.
      ;        Append to get [b, a, c].
PurkkaKoodari
sumber
Itu penjelasan yang sangat bagus. Terima kasih!
AdmBorkBork
g/Ị$Ðf-> g/ÐṂuntuk menyimpan dua byte (karena gcd minimal adalah 1 dan akan selalu ada setidaknya satu entri seperti itu).
Jonathan Allan
Byte lain juga dapat disimpan (meskipun membuatnya kurang efisien) dengan mengganti +2ḶḤ‘Œcdengan ²Rm2Œc- memo yang tidak akan berfungsi untuk input 1:(
Jonathan Allan
@ JonathanAllan Terima kasih untuk yang minimum. Saya memang mencoba banyak rentang 2-byte, tetapi sayangnya tidak ada yang cukup besar. ( ²ḶḤ‘Œcadalah salah satu yang pertama saya pikirkan.)
PurkkaKoodari
8

MATL , 36 byte

`@:Ut&+wmR&fZd1Mhw/vXutnGE<]GY)t&2|h

Input berbasis 1. Urutan output menjamin bahwa setiap triple muncul tepat sekali. Urutan dijelaskan sebagai berikut. Penjelasannya membutuhkan sedikit menggali cara kerja program.

Kode terus meningkatkan penghitung kdalam satu lingkaran, mulai dari 1. Untuk setiap kitu menghasilkan semua pasangan dengan a = 1,...,k, b = 1,...,k, a < b, dan picks mereka yang memberikan Pythagoras triple denganc <= k . Pasangan diperoleh dalam urutan meningkat b, lalu a.

Setiap pasangan kemudian dibagi dengan gcd-nya. Pasangan yang dihasilkan (mungkin diduplikasi) disusun sebagai matriks dua kolom. Matriks ini digabungkan secara vertikal dengan matriks serupa yang berisi hasil akumulasi yang diperoleh untuk nilai yang lebih kecil dari k. Baris-baris matriks kemudian diduplikasi secara stabil. Ini menghapus dua jenis duplikat:

  1. Pasangan yang telah ditemukan lebih dari satu kali untuk saat ini k(seperti3,4 , yang juga hasil dari 6,8ketika membaginya dengan gcd);

  2. Pasangan yang sudah ditemukan dengan yang lebih kecil k.

Bahkan, setiap iterasi kmenemukan semua pasangan yang sudah ditemukan untuk iterasi sebelumnya. Tetapi mungkin menemukan mereka dalam urutan yang berbeda . Misalnya, k=25akan menemukan triple 7,24,25dan bukan 20,21,29(karena ctidak bisa melebihi k). Nantinya, iterasi k=29akan menemukan keduanya, tetapi dengan 20,21,29 sebelumnya 7,24,25 (pesanan meningkat b, lalu a). Inilah sebabnya, alih-alih menjaga semua pasangan ditemukan untuk yang terbaruk , kami menambahkannya ke yang sebelumnya dan menduplikasi secara stabil. Melakukan hal itu memastikan bahwa urutannya sama untuk setiap input n.

Penjelasan di atas menjamin bahwa setiap triple Pythagoras primitif pada akhirnya akan muncul, dan itu hanya akan muncul sekali. Untuk input n, loop over kselesai ketika setidaknya ntiga kali lipat valid telah diperoleh; dan kemudiann -th triple adalah ouput.

Cobalah online!

Atau gunakan kode yang dimodifikasi ini untuk melihat ntiga kali lipat pertama :

`@:Ut&+wmR&fZd1Mhw/vXutnGE<]G:Y)tU&2sX^h

Cobalah online!

Luis Mendo
sumber
1
Penjelasan yang bagus.
AdmBorkBork
5

Jelly , 19 18 byte

*g/²_/
4*œc3UṢÇÐḟḣ

Program ini mengambil indeks berbasis 1 n dan mencetak pertama n PPTs [c, b, a] agar leksikografis.

Ini adalah solusi O (64 n ) , jadi TIO akan tersedak input 4 dan lebih tinggi. Saya akan berusaha membuatnya lebih cepat.

Cobalah online!

Versi alternatif, O (n 3 ), mungkin valid

Untuk menemukan triplet ke- n - [c n , b n , a n ] - solusi di atas mengasumsikan bahwa c n ≤ 4 n , yang mudah diverifikasi. Namun, A020882 membuktikan bahwa c n ~ 2πn , jadi ada k sedemikian sehingga c n ≤ kn untuk semua n .

Jika kita dapat mengambil k = 7 , solusi di bawah ini juga valid (dan jauh lebih cepat).

*g/²_/
×7œc3UṢÇÐḟḣ

Cobalah online!

Bagaimana itu bekerja

4*œc3UṢÇÐḟḣ  Main link. Argument: n

4*           Compute 4**n, the n-th power of 4.
  œc3        Take all 3-combinations of the set {1, ..., 4**n}, each sorted in
             ascending order. The triples themselves are sorted lexicographically.
     U       Upend; reverse each triple [a, b, c], yielding [c, b, a].
      Ṣ      Sort the descending triples lexicographically. This ensures that their
             order is independent of n.
       ÇÐḟ   Keep only triples for which the helper link returns a falsy value.
          ḣ  Dyadic head; take the first n triples.


*g/²_/       Helper link. Argument: [c, b, a]

 g/          Reduce [c, b, a] by greatest common divisor, yielding g.
*            Elevate the integers to that power, computing [c**g, b**g, a**g].
   ²         Square, yielding [c**2g, b**2g, a**2g].
    _/       Reduce by subtraction, yielding c**2g - b**2g - a**2g.
             Fermat's Last Theorem assures that this difference will be non-zero
             whenever g > 1, so this yields 0 iff g = 1 and c² = a² = b².
Dennis
sumber
4

JavaScript (ES7), 106 105 103 byte

Menghasilkan PPT ke-N. Hasil 1-diindeks dan dipesan oleh nilai b .

n=>(g=(a,b)=>b?g(b,a%b):a,F=a=>(x=a*a+b*b,c=x**.5|0)*c-x*g(a,g(b,c))||--n?F(a-b?a+1:!++b):[a,b,c])(b=1)

Demo

Arnauld
sumber
4

MATL , 63 byte

3lvi:"t"[HlHllO;aOlOHl]!@Y*2eh]]!XuGY)&*tt[lO;Oa]*ssD2)ED2Xy*ss

Cobalah online!

Pelajaran dalam bermain golf sangat salah. Saya tetap memposting karena saya ingin tahu apakah ada cara untuk bermain golf ini lebih baik.

Saya mendasarkan ini pada halaman Wikipedia ini dalam kombinasi dengan formula Euclid, untuk secara konstruktif menghasilkan semua tiga kali lipat daripada pendekatan coba-coba.

Pertama, pasangan coprime aneh dihasilkan sebagai pohon ternary. Ini dilakukan sebagai perkalian matriks besar, akuntansi untuk sebagian besar jumlah byte. Kemudian, formula Euclid diterapkan, mungkin juga dengan cara byte-wasting. Jika ada yang punya tip untuk dua bagian ini, saya ingin mendengarnya.

Perhatikan bahwa, untuk menyimpan byte, program ini menghasilkan pohon kedalaman yang sama dengan input, bukan log3(n). Juga, anak-anak dihasilkan untuk setiap baris daripada hanya untuk baris terakhir dari pohon, dan kemudian disaring lagi dengan Xu. Begitu banyak untuk pendekatan konstruktif yang efisien.

3lv % Push root node of ternary tree
i:" % Generate a tree of depth of input (WAY too large, but golfy)
t"  % loop over all nodes (golfier than looping over last tree row)
[HlHllO;aOlOHl]! % Matrix to generate three children of current node
@Y* % Multiply with current node to get children
2e  % Reshape to get node pairs
h]] % Append to tree, exit loops
!Xu % Remove duplicates (more efficient to do it before last ] but golfier this way)
GY) % Select n-th odd coprime pair
&*tt % Multiply with it's own transpose to get [m²,m*n;m*n,n²]
[lO;Oa]*ssD % Sum of matrix multiplication = m²-n² to get a
2)ED % Second element doubled for b=2mn
2Xy*ss % Sum of matrix multiplication with identify matrix to get c=m²+n²
Sanchises
sumber
3

Haskell, 65 byte

([(a,b,c)|c<-[5..],b<-[1..c],gcd c b<2,a<-[1..b],a^2+b^2==c^2]!!)

Pengindeksan berbasis 0. Untuk yang diberikan c, bberjalan ke atas cdan ake atas b, jadi c > b > aselalu berlaku.

Cobalah online!

nimi
sumber
3

Python, 67 50 48 46 Bytes

Menggunakan rumus yang ditemukan di wikipedia,

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

di mana m>n>0dan mdan nadalah coprimes dan aneh. Ini kodenya

lambda n:[3+2*n,~-(3+2*n)**2-1/2,-~(3+2*n)**2/2]

-17 byte terima kasih kepada @Martin Ender

Cobalah secara Online

Bekerja dengan selalu memiliki nilai nvariabel dalam persamaan menjadi 1, yang berarti bahwa mhanya ada nilai ganjil lainnya, dalam hal ini, di 3+2*nmana nadalah jumlah triple Pythagoras primitif. Ini memungkinkan kita untuk mengasumsikan nilai 1 untuk semua nnilai.

Professor_Joykill
sumber
Selamat datang di PPCG! Fungsi yang tidak disebutkan namanya baik-baik saja, jadi Anda tidak perlu menetapkan lambda untuk a(dan jika Anda melakukannya, Anda bisa menyingkirkan dua ruang di sana). Saya juga tidak yakin mengapa Anda di printsana, Anda bisa mengembalikan nilai dari lambda itu sendiri.
Martin Ender
"Anda dapat membuktikan (secara informal tidak masalah) bahwa algoritma Anda dapat menghasilkan setiap PPT unik yang mungkin". Tetapi metode ini hanya menghasilkan yang mana sisi miringnya 1 lebih panjang dari satu kaki. Itu tidak pernah menghasilkan 8,15,17, misalnya.
Rosie F
2

Sekam , 18 byte

↑üOf§=F⌋ȯ¬Ḟ-m□ΠR3N

Cobalah online!

-4 byte terima kasih kepada Zgarb, dengan inspirasi dari Dennis

Pendekatan brute force super-lambat, tidak akan bekerja pada TIO untuk input yang lebih besar dari 1. Anda dapat mencoba versi yang lebih mudah dikelola, terbatas pada a, b≤200 di sini

Penjelasan

↑üOf§=F⌋ȯ¬Ḟ-m□ΠR3N
              ΠR3N   Get all triples of natural numbers
   f                 Keep only those triples where
      F⌋                their GCD
    §=                  is equal to
        ȯ¬Ḟ-m□          the logical negation of c²-b²-a²
 üO                  Remove duplicates by their sorted version
↑                    Get the first <input> values of this sequence
Leo
sumber
20 byte dengan menggabungkan peta dan filter, bahkan lebih lambat.
Zgarb
@ Zgarb terima kasih! Saya berhasil membuat byte tambahan :)
Leo
18 byte dengan trik pengurangan dari jawaban Dennis's Jelly.
Zgarb
@ Zgarb bagus! Meskipun aku punya keraguan: mungkinkah ada dua kali lipat yang berbeda dengan yang sama c? dalam hal ini solusi ini perlu diperbaiki
Leo
Hmm, sebenarnya ada banyak tiga kali lipat dengan yang sama c. Solusi 18-byte ini (yang menggunakan tipuan lain dari Dennis) berfungsi apa pun.
Zgarb
1

Mathematica, 89 byte

menggunakan Solve yang dipesan oleh c

SortBy[{a,b,c}/.Solve[a^2+b^2==c^2&&GCD[a,b]==1&&0<a<b<c<9#,{a,b,c},Integers],Last][[#]]&

Mathematica, 124 byte

(s={};Table[If[IntegerQ[c=Sqrt[a^2+b^2]]&&GCD[a,b]==1,AppendTo[s,{a,b,c}]],{a,9#},{b,9#}];SortBy[Union[Sort/@s],Last][[#]])&
J42161217
sumber
1

R (+ angka), 88 byte

n=scan();while(all(nrow(T)<n))T=numbers::pythagorean_triples(5,5+(F<-F+1));T[n,3:5]

Untuk menggunakan builtin untuk menghasilkan angka, dibutuhkan jumlah byte yang mengejutkan untuk mendapatkan yang kita inginkan. Builtin mengambil dua argumen c1dan c2, dan mengembalikan triplet yang ada c >= c1 & c <= c2. Ini membuatnya sedikit mengganggu untuk sampai ke ntriplet -th. Ini hanya akan terus meningkatkan c21 pada satu waktu sampai output cukup baris.

JAD
sumber
1

PHP , 273 Bytes

function t($n){$x=[];for($c=3;;$c++)for($b=2;$b<$c;$b++)for($a=2;$a<$b;$a++)if(d($a,$b,$c)&&$a**2+$b**2==$c**2){$x[]=[$a,$b,$c];if(--$n==0)return $x;}}function d($a,$b,$c){for($i=2;$i<$a;$i++)if($a%$i==0&&$b%$i==0||$a%$i==0&&$c%$i==0||$b%$i==0&&$c%$i==0)return 0;return 1;}
  • t($n) mengembalikan array [a, b, c] dengan pemesanan a < b < c
  • Mengembalikan indeks berbasis nol

Cobalah online! (kode juga dapat dibaca di sana)

Mic1780
sumber
1

C, 158 byte

Saya percaya ini adalah pengiriman pertama saya di sini, jadi Anda mungkin bisa melakukan yang lebih baik.

#include<stdio.h>
void f(n){int i=0,j=3,k,l;while(1){for(k=1;k<j;k++){for(l=k;l<j;l++){if(j*j==k*k+l*l)i++;if(i==n){printf("%d %d %d",j,k,l);return;}}}j++;};}

Dan versi yang tidak dipisahkan:

#include <stdio.h>

void f(n)
{
  int i=0, j=3, k, l;
  while (1) {
    for (k=1; k<j; k++) {
      for (l=k; l<j; l++) {
        if (j*j==k*k+l*l)
          i++;
        if (i==n) {
          printf("%d %d %d\n", j, k, l);
          return;
        }
      }
    }
    j++;
  };
}

void main()
{
  int i;

  scanf("%d", &i);

  f(i);
  printf("\n");
}

Untuk a 2 + b 2 = c 2 , urutannya meningkat c kemudian meningkat a .

Tidak mungkin ada dua kali PPT yang sama dengan b pada leas a dalam algoritma ini.

Tsathoggua
sumber
Selamat datang di PPCG!
JAD
1

Jelly , 27 25 byte

⁽0(ḃs
Ɠḃd2Ḥ’×€Ç
3r5DṭÇæ×/

Ini adalah implementasi dari pendekatan pohon dari jawaban Haskell @ AndersKaseorg , dengan urutan cabang yang berbeda. Program ini menggunakan pengindeksan berbasis 0 dan mengambil input dari STDIN.

Cobalah online!

Latar Belakang

Seperti disebutkan di halaman Wikipedia Tree of Pythagoras triples primitif , setiap PPT dapat diperoleh dengan berulang kali mengalikan vektor baris (3, 4, 5) dengan matriks dengan properti tertentu.

Di setiap iterasi, hasil sebelumnya dapat dikalikan dengan salah satu A , B , atau C , yang dapat dipilih sebagai berikut.

matriks

Ketika A , B , dan C diperbaiki, setiap PPT dapat diperoleh dengan cara yang unik.

Bagaimana itu bekerja

3r5DṭÇæ×/  Main link. No arguments.

3          Set the argument and the return value to 3.
 r5        Create a range from 3 to 5, i.e., [3, 4, 5].
   D       Decimal; convert each integer to base 10, yielding [[3], [4], [5]].
     Ç     Call the second helper link with argument 3.
    ṭ      Tack; append [[3], [4], [5]] to the result.
      æ×/  Reduce by matrix multiplication.
Ɠḃd2Ḥ’×€Ç  Second helper link. Argument: 3

Ɠ          Read and evaluate one line of input, yielding an integer n.
 ḃ         Convert n to bijective base 3.
  d2       Divmod 2; map each digit d to [d/2, d%2].
    Ḥ      Unhalve; multiply the results by 2.
     ’     Decrement the doubled results.
           The previous four atoms apply the following mapping to the digits.
               1 -> [0, 1] -> [0, 2] -> [-1,  1]
               2 -> [1, 0] -> [2, 0] -> [ 1, -1]
               3 -> [1, 1] -> [2, 2] -> [ 1,  1]
        Ç  Call the helper link with argument 3, yielding the following 2D array.
               [[ 1,  2,  2],
                [ 2,  1,  2],
                [ 2,  2,  3]]
      ×€   Multiply each [-1,  1], [ 1, -1], and [ 1,  1] by that matrix, using
           vectorizing multiplication (not matrix multiplication), yielding one 
           of the following three 2D arrays.

               [[-1,  2,  2],    [[ 1, -2,  2],    [[ 1,  2,  2],
                [-2,  1,  2],     [ 2, -1,  2],     [ 2,  1,  2],
                [-2,  2,  3]]     [ 2, -2,  3]]     [ 2,  2,  3]]
⁽0(ḃs      First helper link. Argument: 3

⁽0(        Numeric literal; yield 13041.
   ḃ       Convert 13041 to bijective base 3, yielding [1, 2, 2, 2, 1, 2, 2, 2, 3].
    s      Split the result into chunks of length 3, yielding the aforementioned
           2D array.
Dennis
sumber
1

APL (NARS), 90 karakter, 180 byte

{a⊃⍨⍵⊃⍋↑¨a←{⍵[⍋⍵]}¨a/⍨{1=∨/⍵}¨a←{(-/k),(×/2,⍵),+/k←⍵*2}¨a/⍨{>/⍵}¨a←,a∘.,a←⍳(⌊2⍟2+⍵)×9+⌊√⍵}

jika argumen fungsi di atas adalah ⍵, fungsi di atas akan mengembalikan elemen indeks ⍵ (1 berbasis) dari array memiliki elemen tripel Pythagoras (a, b, c) di mana a <= b <= c dan array itu adalah urutan pertama untuk a, (sisi lebih pendek), kemudian untuk b (sisi lain bukan sisi miring). Akan ada sesuatu yang salah karena tidak terlihat di mana saya memesan untuk b juga ... test:

  f←{a⊃⍨⍵⊃⍋↑¨a←{⍵[⍋⍵]}¨a/⍨{1=∨/⍵}¨a←{(-/k),(×/2,⍵),+/k←⍵*2}¨a/⍨{>/⍵}¨a←,a∘.,a←⍳(⌊2⍟2+⍵)×9+⌊√⍵}
  f¨1..10
3 4 5  5 12 13  7 24 25  8 15 17  9 40 41  11 60 61  12 35 37  13 84 85  15 112 113  16 63 65  

itu terkait dengan http://oeis.org/A020884 dan http://oeis.org/A020884/b020884.txt

A020884: Memerintahkan kaki pendek segitiga Pythagoras primitif.

  ↑¨f¨1..23
3 5 7 8 9 11 12 13 15 16 17 19 20 20 21 23 24 25 27 28 28 29 31 
  f 999
716 128163 128165 
  f 1000
717 28556 28565 

Saya tidak tahu apakah itu benar, sepertinya berfungsi memberikan hasil yang benar dari sisi pertama segitiga sampai 1000 tetapi saya tidak tahu untuk yang tersisa, dan mungkin bisa beberapa triple tidak benar juga <1000.

RosLuP
sumber
0

JavaScript, 101 byte

Dengan rumus Euclid, semua tiga kali lipat Pythagoras primitif dapat dihasilkan dari bilangan bulat mdan ndengan m>n>0, m+naneh gcd(m,n)==1( Wikipedia )

Fungsi ini menghitung semua m,npasangan bertambah m mulai dari m=2dan menurun ndengan 2 mulai dari m-1(jadi itu m+naneh)

c=>eval("g=(a,b)=>b?g(b,a%b):a;for(m=2,n=1;c-=g(m,n)<2;(n-=2)>0||(n=m++));[m*m-n*n,2*m*n,m*m+n*n]")

Kurang golf

c => {
  g = (a,b) => b ? g(b,a%b) : a;
  for( m = 2, n = 1; 
       g(m,n) < 2 ? --c : c; 
       (n -= 2) > 0 || (n = m++))
    /* empty for body */;
  return [m*m - n*n, 2*m*n, m*m + n*n]
}

Uji

F=
c=>eval("g=(a,b)=>b?g(b,a%b):a;for(m=2,n=1;c-=g(m,n)<2;(n-=2)>0||(n=m++));[m*m-n*n,2*m*n,m*m+n*n]")

for(i=1;i<=50;i++) console.log(i+' '+F(i))

edc65
sumber