Sebuah Pythagoras tiga terdiri dari tiga bilangan bulat positif a, b, dan c, seperti bahwa 2 + b 2 = c 2 . Triple seperti itu umumnya ditulis (a, b, c), dan contoh yang terkenal adalah (3, 4, 5). Jika (a, b, c) adalah triple Pythagoras, maka demikian juga (ka, kb, kc) untuk setiap bilangan bulat positif k. Triple Pythagoras primitif adalah yang memiliki a, b dan c adalah koprime .
Dengan menggunakan pengetahuan ini, kita dapat membuat urutan dengan merantai bersama panjang setidaknya tiga kali lipat, di mana elemen berikutnya dalam urutan adalah hypotenuse (jumlah terbesar) dari triple Pythagoras primitif terkecil yang mengandung elemen sebelumnya sebagai yang terkecil dari panjangnya.
Mulailah dengan triple Pythagoras primitif terkecil (3, 4, 5). Urutan dimulai dengan 3
, dan sisi miring (elemen berikutnya dalam urutan) adalah 5
. Kemudian temukan triple Pythagoras primitif terkecil dengan 5
kaki, dan Anda dapatkan (5, 12, 13). Jadi urutannya berlanjut 13
.
Entah output urutan selamanya, atau mengambil input integer n
dan output n
elemen pertama dari urutan tersebut, baik nol atau satu diindeks.
Anda perlu mendukung output setidaknya melalui dan termasuk 28455997
, tetapi jika batas tipe data yang Anda gunakan tiba-tiba dinaikkan, itu perlu bekerja untuk batas baru itu. Jadi Anda tidak bisa membuat kode dari daftar angka.
3
5
13
85
157
12325
90733
2449525
28455997
295742792965
171480834409967437
656310093705697045
1616599508725767821225590944157
4461691012090851100342993272805
115366949386695884000892071602798585632943213
12002377162350258332845595301471273220420939451301220405
Urutan serupa (jangan tampilkan ini!):
12325
.85
... istilah berikutnya adalah3613
(dapatkah Anda menebak apa yang belum?)Jawaban:
Jelly , 19 byte
Menyimpan satu byte berkat @ Dennis dengan refactoring ke urutan yang tak terbatas.
Tidak mengambil input dan argumen, kemudian mengeluarkan urutan tanpa batas dengan mencetak setiap istilah saat dihitung. Metode ini melambat karena jumlahnya menjadi lebih besar karena tergantung pada faktorisasi prima.
Cobalah online!
Ini menghitung istilah berikutnya dengan menghitung faktorisasi daya utama dari istilah saat ini. Untuk 12325, ini adalah {5 2 , 17, 29}. Ada varian rumus Euclid untuk menghitung tripel Pythagoras { a , b , c },
di mana m > n dan triple adalah iff primitif m dan n adalah coprime.
Untuk menghitung akar primitif berikutnya dari 12325, temukan m dan n sedemikian sehingga mn = 12325 dan pilih m , n sehingga gcd ( m , n ) = 1. Kemudian hasilkan semua pasangan m , n dengan membuat semua himpunan bagian dari {5 2 , 17, 29} dan menemukan produk dari masing-masing himpunan bagian yang adalah {1, 25, 17, 29, 425, 725, 493, 12325}. Kemudian bagi 12325 dengan masing-masing nilai dan pasangan sehingga setiap pasangan adalah m , n . Hitung rumus untuk c menggunakan setiap pasangan dan ambil minimum yaitu 90733.
Penjelasan
sumber
o3ṄÆfµṪ,P²SHß
dengan output tak terbatas menghemat satu byte.Brachylog , 36 byte
Cobalah online!
Anda harus menunggu waktu tunggu program (1 menit) sebelum TIO mengeluarkan output. Dalam REPL SWI-Prolog ini mencetak segera setelah menemukan nilai.
Ini akan mencetak urutan selamanya.
Setelah beberapa menit menggunakan penerjemah offline SWI-Prolog, saya memperolehnya
90733
setelah itu12325
. Saya menghentikannya setelah titik ini.Ini bukan bruteforce lengkap karena menggunakan kendala untuk menemukan tripel pythagoras, meskipun jelas tidak dioptimalkan untuk kecepatan.
Penjelasan
sumber
Perl, 73 byte
Semua Tripel Pythagoras
a²+b²=c²
memuaskana=r(m²-n²), b=2rmn, c=r(m²+n²)
untuk beberapa bilangan bulatr,m,n
. Kapanr=1
danm,n
adalah coprime dengan tepat satu yang dapat dibagi 2, makaa,b,c
merupakan triple primitif, di manaa,b,c
semua coprime berpasangan.Dengan pemikiran ini, mengingat beberapa
a
, saya menggunakan algoritma brute-force untuk menghitung terkeciln
sepertia²-n²
persegi, yaitum²
. Kemudian,c
sama dengann²+m²
.sumber
n
yanga+n²
kotak.Python 3, 178 byte
Ini pada dasarnya hanya algoritma brute force, dan karenanya sangat lambat. Dibutuhkan jumlah istilah untuk output sebagai input.
Saya tidak 100% yakin tentang kebenaran dari algoritma ini, program memeriksa untuk kaki lainnya hingga kaki pertama kuadrat, yang saya percaya sudah cukup, tetapi saya belum melakukan perhitungan.
Cobalah di repl.it! ( Sudah kedaluwarsa) (Tolong jangan coba-coba untuk nomor yang lebih besar dari 10, itu akan sangat lambat)
sumber
math.gcd
. Juga, gunakanp+=[...]
bukanp.append(...)
. Dan<2
bukannya==1
. Danif
semuanya bisa dalam satu baris.MATL , 27 byte
Ini menghasilkan istilah pertama dari urutan. Input berbasis 0.
Kode ini sangat tidak efisien. Kompiler online habis waktu untuk input yang lebih besar dari
5
. Input6
mengambil satu setengah menit offline (dan menghasilkan yang benar90733
sebagai istilah ke-6).Cobalah online!
sumber
Racket 106 byte
Tidak Disatukan:
Pengujian:
Output dari versi golf:
Output dari versi yang tidak dikoleksi:
(Kesalahan setelah ini di komputer saya)
sumber
Bahasa Wolfram (Mathematica) , 74 byte
Cobalah online!
Bahasa Wolfram (Mathematica) , 74 byte
Cobalah online!
sumber
PHP, 139 byte
Kode di atas rusak setelah 28455997 pada sistem 32-bit. Jika diperlukan angka yang lebih tinggi, itu menjadi 156 byte:
sumber
Java 8, 133 Bytes
-25 byte berkat mil Menggunakan n * n bukan Math.pow (n, 2)
-24 byte berkat mil Menggunakan untuk loop bukan sementara, mengubah tipe data, menghilangkan () karena urutan operasi
Menggunakan fakta itu
untuk setiap pasangan bilangan bulat m> n> 0. Karena itu, C sama dengan A plus 2 (N) 2 . Fungsi di atas menemukan nilai N paling kecil yang memenuhi hubungan ini, sementara membuat elemen kedua dari tiga Pythagoras menjadi bilangan bulat dan lebih besar dari elemen pertama. Kemudian ia menetapkan nilai elemen pertama ke elemen ketiga dan mengulangi dengan elemen pertama yang diperbarui.
Tidak Disatukan:
Ide itu!
* Ideone tidak mencetak elemen yang diperlukan terakhir karena batasan waktu, namun seperti yang Anda lihat melalui logika program dan versi yang tidak diklik (yang mencetak 28455997 sebagai elemen ketiga dari triple Pythagoras sebelumnya daripada elemen pertama dari selanjutnya), nilainya, dengan batas waktu yang lebih tinggi, dicetak.
sumber
n*n
bukanMath.pow(n,2)
?for
loop untuk turun ke 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;}};
Python 3.5, 97 byte
Keluaran yang salah setelah
28455997
, karena batas tipe data floating point. Thesqrt
Fungsi tidak cukup baik, tetapi jika presisi itu ajaib meningkat, itu akan bekerja.Cukup mudah dimengerti. Bertambah
c
dua bukannya satu memotong runtime menjadi dua, dan hanya angka ganjil yang perlu diperiksa, karena elemen selalu aneh.Cobalah online
Program tidak dapat dijalankan di Ideone, karena Ideone menggunakan Python 3.4
Agar output tetap akurat lebih lama, saya harus menggunakan
decimal
:Cobalah online
Agar tetap akurat tanpa batas waktu, saya dapat melakukan sesuatu yang mengerikan seperti ini (meningkatkan presisi yang dibutuhkan setiap iterasi tunggal :
sumber
J ,
5447 byteTIO
perpecahan serakah faktor prima menjadi faktor koprime
54 byte TIOsumber
Pari / GP , 71 byte
Cobalah online!
sumber
APL (NARS), 169 karakter, 338 byte
uji ok sampai 14 sebagai argumen q:
ini di bawah ini akan menemukan semua pembagi argumennya ...
sumber
JavaScript (Node.js) , 101 byte
Cobalah online!
Saran untuk bermain golf dipersilakan
sumber