Generalisasi angka Hardy – Ramanujan

12

1729, dikenal sebagai angka Hardy-Ramanujan , adalah bilangan bulat positif terkecil yang dapat dinyatakan sebagai jumlah dua kubus bilangan bulat positif dalam dua cara ( 12^3+1^3=10^3+9^3=1729). Diberikan bilangan bulat n(sebagai input dalam bentuk apa pun yang alami untuk bahasa pilihan Anda) temukan bilangan bulat positif terkecil yang dapat dinyatakan sebagai jumlah dari dua bilangan bulat positif yang dinaikkan ke ndaya ke-dua dengan dua cara unik. Tidak menggunakan sumber eksternal. Karakter yang paling sedikit menang.

Perhatikan bahwa ini sebenarnya masalah yang belum terpecahkan untuk n>4. Untuk angka-angka itu, biarkan program Anda berjalan selamanya dalam pencarian, atau mati saat mencoba! Buat agar jika diberi waktu dan sumber daya tak terbatas, program akan menyelesaikan masalah.

Ben Reich
sumber
2
Anda mungkin (?) Ingin menentukan "jumlah dari dua bilangan bulat positif dinaikkan ke nkekuatan th". Kalau tidak, 91(tidak 1729) adalah solusi untuk n=3, karena 6^3+(−5)^3=4^3+3^3=91. Saya belajar ini dari tautan Wikipedia Anda jadi mungkin referensi HM Anda membuat ini tidak perlu dengan konvensi. Bersulang!
Darren Stone
sebenarnya, 1adalah solusi pertama:1 = cbrt(0.5)^3 + cbrt(0.5)^3 = ...
John Dvorak
Terima kasih atas saran dan sunting - maksud saya 2 bilangan bulat positif!
Ben Reich
1
@ JanDvorak, ha, ya. Menjaga R Bit!
Darren Stone
Anda mengatakan " menemukan bilangan bulat positif terkecil yang" ..., seolah-olah ada adalah satu - tetapi untuk setiap n > 4, keberadaan nomor tersebut adalah masalah yang belum terpecahkan . Mungkin Anda harus mengatakan "menemukan bilangan bulat positif terkecil ( jika ada ) bahwa" ... Mungkin "jawaban" adalah loop nonterminating yang tidak menemukan apa pun.
res

Jawaban:

3

APL  45  41

{⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1}

Versi 41 karakter yang lebih pendek namun lebih lambat:

{⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⍺:⍺⋄⍵∇⍨⍺+1}

Anda dapat mencobanya secara online , cukup tempelkan fungsinya dan aktifkan dengan nomor:

      {⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 2
50
      {⍺←1⋄2≤+/,⍺=(v∘.≤v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 3
1729

(Algoritma ini cukup bodoh, jangan berharap penerjemah online menghitung n = 4)

Jawaban untuk n = 2 adalah 50 = 5² + 5² = 7² + 1² karena angka yang "dapat dinyatakan sebagai jumlah dari dua kuadrat dari bilangan bulat positif — tidak mengatakan berbeda - dalam dua cara."

Jika Anda ingin menambahkan klausa yang berbeda, cukup ubah (v∘.≤v)menjadi (v∘.<v), jumlah karakter yang sama, dan n = 2 menjadi 65:

      {⍺←1⋄2≤+/,⍺=(v∘.<v)×∘.+⍨⍵*⍨v←⍳⌊⍺*.5:⍺⋄⍵∇⍨⍺+1} 2
65

Saya mengalahkan GolfScript? Tidak mungkin !!

Tobia
sumber
bagus! Dan maksud saya adalah bilangan bulat yang berbeda, tapi saya tidak menentukan, jadi lebih banyak kekuatan untuk Anda! Kembali ke papan gambar untuk GolfScript ...
Ben Reich
2

Ruby, 132

n=$*[r=0].to_i;while r+=1
r.times{|a|r.times{|b|next if
a**n+b**n!=r;r.times{|c|r.times{|d|puts(r)if
c**n+d**n==r&&a!=c&&a!=d}}}}end

Lulus nsebagai argumen baris perintah. Baris pertama stdoutadalah solusinya.

Dioptimalkan untuk kode-golf, bukan kinerja. (Berjalan dengan benar. Tetapi lambat. Melakukan lebih banyak pekerjaan daripada yang diperlukan.)


Ini adalah program C yang lebih lama, sedikit lebih cepat. Algoritma yang benar tapi mengerikan sama. (Saya benar-benar perlu belajar lebih banyak teori!)

Diuji untuk n= 2, n= 3.

C, 234

#include<stdio.h>#include<math.h>
r,a,b,c,d;main(n){scanf("%d",&n);while(++r){for(a=0;a<r;++a){for(b=a;b<r;++b){if(pow(a,n)+pow(b,n)!=r)continue;for(c=a+1;c<r;++c){for(d=0;d<r;++d){if(pow(c,n)+pow(d,n)==r&&a!=d)printf("%d\n",r);}}}}}}

Versi C mengambil ndi stdin. Seperti di atas, baris pertama stdoutadalah solusinya.

Darren Stone
sumber
1

GolfScript 53

1\.{;\).,{}@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)

Input adalah nomor awal pada tumpukan. Angka di atas tumpukan di akhir adalah jawabannya. Saya akan menjelaskan ini secara lebih rinci ketika saya mendapat kesempatan.

Misalnya

{1\.{;\).,@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)}:f
2 f -> 25 
3 f -> 1729

Ini sangat lambat sekarang. Itu juga menghitung 0(sehingga 25 adalah jawaban untuk n=2, karena 25=5^2+0^2=3^2+4^2. Agar tidak menghitung 0, tambahkan 2 karakter (;setelah yang pertama,

1\.{;\).,(;{}@.@\{?}+%.`{\{+}+%~}+%$.`{\{=}+,,4=}+,.!}do)

Untuk menemukan itu 2 f=65, sejak65=8^2+1^2=5^2+6^2

Ben Reich
sumber
1

GolfScript (30 karakter)

:N{).,{)N?}%:P{1$\-P?)},,3<}do

Catatan: ini sangat lambat, karena melakukan pencarian kasar daripada sesuatu yang elegan seperti antrian prioritas. Hal yang paling elegan tentang itu adalah menggunakan kembali Nsebagai batas bawah untuk mencari: ini berlaku karena 1^N + 2^N > Nuntuk semua N.

Mengambil Ntumpukan, meninggalkan nomor taksi yang sesuai di tumpukan. Untuk mengambil Ndari stdin, tambahkan ~.

Versi di atas memungkinkan x^N + x^N(jadi untuk N=2memberi 50). Untuk meminta penambahan nomor yang berbeda ( 65ganti memberi ), ubah 3ke 4. Untuk mengizinkan 0^N + x^N(memberi 25), hapus )segera sebelum N?.

Peter Taylor
sumber
0

Mathematica, 58 karakter

Solusi yang sangat sangat lambat menggunakan fungsi menghasilkan:

0//.i_/;(D[Sum[x^(n^#),{n,1,i}]^2,{x,i}]/.x->0)/i!<4:>i+1&
alephalpha
sumber