Uogólnienie liczb Hardy'ego-Ramanujana

12

1729, znany jako liczba Hardy'ego-Ramanujana , jest najmniejszą liczbą całkowitą dodatnią, którą można wyrazić jako sumę dwóch kostek liczb całkowitych dodatnich na dwa sposoby ( 12^3+1^3=10^3+9^3=1729). Biorąc pod uwagę liczbę całkowitą n(jako dane wejściowe w dowolnej formie naturalnej dla wybranego przez ciebie języka) znajdź najmniejszą liczbę całkowitą dodatnią, którą można wyrazić jako sumę dwóch liczb całkowitych dodatnich podniesionych do npotęgi na dwa unikalne sposoby. Bez użycia źródeł zewnętrznych. Wygrywa niewiele postaci.

Należy pamiętać, że jest to rzeczywiście nierozwiązanym problemem dla n>4. W przypadku tych liczb pozwól, aby Twój program działał wiecznie w poszukiwaniu lub zgiń próbując! Zrób tak, aby przy nieskończonym czasie i zasobach program rozwiązał problem.

Ben Reich
źródło
2
Możesz (?) Określić „sumę dwóch dodatnich liczb całkowitych podniesionych do npotęgi”. W przeciwnym razie 91(nie 1729) jest rozwiązaniem n=3, ponieważ 6^3+(−5)^3=4^3+3^3=91. Nauczyłem się tego z twojego linku do Wikipedii, więc może twoje referencje HM sprawiają, że jest to zbędne. Twoje zdrowie!
Darren Stone
w rzeczywistości 1jest to pierwsze rozwiązanie:1 = cbrt(0.5)^3 + cbrt(0.5)^3 = ...
John Dvorak,
Dzięki za sugestie i edycję - miałem na myśli 2 dodatnie liczby całkowite!
Ben Reich,
1
@JanDvorak, ha, tak. Utrzymanie go R EAL!
Darren Stone
Mówisz „ znaleźć najmniejszą liczbą całkowitą dodatnią, że” ..., jakby tam jest jeden - ale dla każdego n > 4, istnienie takich liczb jest nierozwiązanym problemem . Może powinieneś powiedzieć „znajdź najmniejszą dodatnią liczbę całkowitą ( jeśli istnieje ), że”… Możliwe, że „odpowiedzi” to niekończące się pętle, które nic nie znajdują.
res

Odpowiedzi:

3

APL  45  41

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

Krótsza, ale wolniejsza wersja 41 znaków:

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

Możesz wypróbować online , po prostu wklej funkcję i wywołaj ją z numerem:

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

(Algorytm jest jednak dość głupi, nie oczekuj, że interpreter online wyliczy n = 4)

Odpowiedź dla n = 2 to 50 = 5² + 5² = 7² + 1², ponieważ jest to liczba, która „może być wyrażona jako suma dwóch kwadratów liczb całkowitych dodatnich - nie mówi inaczej - na dwa sposoby”.

Jeśli chcesz dodać odrębną klauzulę, po prostu zmień (v∘.≤v)na tę (v∘.<v)samą liczbę znaków, a n = 2 staje się 65:

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

Pokonałem GolfScript? Nie może być !!

Tobia
źródło
ładny! Miałem na myśli różne liczby całkowite, ale nie określiłem, więc więcej mocy dla ciebie! Wróć do tablicy kreślarskiej dla 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

Przekaż njako argument wiersza poleceń. Pierwsza linia stdoutto rozwiązanie.

Zoptymalizowany pod kątem gry w golfa kodu, a nie wydajności. (Działa poprawnie. Ale wolno. Pracuje więcej niż jest to potrzebne.)


Oto dłuższy, nieco szybszy program C. Ten sam poprawny, ale okropny algorytm. (Naprawdę muszę przestudiować więcej teorii!)

Testowany na 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);}}}}}}

Wersja C zaczyna ndziałać stdin. Jak wyżej, pierwszą linią do stdoutjest rozwiązanie.

Darren Stone
źródło
1

GolfScript 53

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

Dane wejściowe to liczba początkowa na stosie. Liczba na górze stosu na końcu jest odpowiedzią. Wyjaśnię to bardziej szczegółowo, kiedy będę miał szansę.

Na przykład

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

To jest teraz dość wolne. Liczy się również 0(tak, że 25 jest odpowiedzią n=2, ponieważ 25=5^2+0^2=3^2+4^2. Aby nie liczyć 0, dodaj 2 znaki (;po pierwszym,

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

Aby to znaleźć 2 f=65, odkąd65=8^2+1^2=5^2+6^2

Ben Reich
źródło
1

GolfScript (30 znaków)

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

Uwaga: jest to dość powolne, ponieważ wykonuje wyszukiwanie z użyciem siły, a nie coś eleganckiego, jak kolejka priorytetowa. Najbardziej elegancką rzeczą jest ponowne użycie Njako dolnej granicy wyszukiwania: jest to ważne, ponieważ 1^N + 2^N > Ndla wszystkich N.

Bierze Nna stos i pozostawia odpowiedni stos taksówek na stosie. Aby wziąć Nze standardowego, przygotuj ~.

Powyższa wersja pozwala x^N + x^N(a więc N=2daje 50). Wymagać dodając różne numery (podając 65zamiast), zmienić 3się 4. Aby pozwolić 0^N + x^N(dawanie 25), usuń )bezpośrednio przed N?.

Peter Taylor
źródło
0

Mathematica, 58 znaków

Bardzo, bardzo wolne rozwiązanie wykorzystujące funkcję generowania:

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