Generalizzazione numerica Hardy-Ramanujan


12

1729, noto come il numero Hardy-Ramanujan , è il numero intero positivo più piccolo che può essere espresso come la somma di due cubi di numeri interi positivi in ​​due modi ( 12^3+1^3=10^3+9^3=1729). Dato un numero intero n(come input in qualunque forma è naturale per il tuo linguaggio di scelta) trova il numero intero positivo più piccolo che può essere espresso come la somma di due numeri interi positivi elevati alla npotenza in due modi unici. Nessun uso di fonti esterne. Vince il minor numero di personaggi.

Si noti che questo è in realtà un problema irrisolto per n>4. Per quei numeri, lascia che il tuo programma funzioni per sempre nella ricerca o muori provandoci! Fai in modo che se il tempo e le risorse sono infiniti, il programma risolverà il problema.


2
È possibile (?) Specificare "la somma di due numeri interi positivi elevati alla npotenza". Altrimenti, 91(non 1729) è la soluzione per n=3, poiché 6^3+(−5)^3=4^3+3^3=91. L'ho imparato dal tuo link Wikipedia, quindi forse il tuo riferimento HM lo rende superfluo per convenzione. Saluti!
Darren Stone,

in realtà, 1è la prima soluzione:1 = cbrt(0.5)^3 + cbrt(0.5)^3 = ...
John Dvorak il

Grazie per i suggerimenti e la modifica: intendevo 2 numeri interi positivi!
Ben Reich,

1
@JanDvorak, ah, sì. Keep it It R eal!
Darren Stone,

Dici " trova il numero intero positivo più piccolo che" ..., come se ce ne fosse uno - ma per qualsiasi n > 4, l'esistenza di tali numeri è un problema irrisolto . Forse dovresti dire "trova il numero intero positivo più piccolo ( se ce n'è uno ) che" ... È possibile che le "risposte" siano cicli non terminali che non trovano nulla.
ris

Risposte:


3

 45  APL 41

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

Versione più breve ma più lenta di 41 caratteri:

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

Puoi provarlo online , basta incollare la funzione e invocarla con un numero:

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

(L'algoritmo è piuttosto stupido, non aspettarti che l'interprete online calcoli n = 4)

La risposta per n = 2 è 50 = 5² + 5² = 7² + 1² perché è un numero che "può essere espresso come la somma di due quadrati di numeri interi positivi - non dice diverso - in due modi".

Se vuoi aggiungere la clausola distinta, cambia (v∘.≤v)in (v∘.<v), stesso numero di caratteri e n = 2 diventa 65:

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

Sto battendo GolfScript? Non può essere !!


simpatico! E intendevo numeri interi distinti, ma non l'ho specificato, quindi più potenza per te! Torna al tavolo da disegno per il GolfScript ...
Ben Reich il

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

Passa ncome argomento della riga di comando. La prima linea stdoutè la soluzione.

Ottimizzato per il code-golf, non per le prestazioni. (Funziona correttamente. Ma lento. Fa più lavoro del necessario.)


Ecco un programma C più lungo e leggermente più veloce. Stesso algoritmo corretto ma orribile. (Ho davvero bisogno di studiare più teoria!)

Testato per 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);}}}}}}

La versione C prende nil sopravvento stdin. Come sopra, la prima riga stdoutè la soluzione.


1

GolfScript 53

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

L'input è il numero iniziale nello stack. Il numero in cima alla pila alla fine è la risposta. Lo spiegherò più in dettaglio quando ne avrò la possibilità.

Per esempio

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

Questo è piuttosto lento in questo momento. Conta anche 0(in modo che 25 sia la risposta per n=2, poiché 25=5^2+0^2=3^2+4^2. Per non contare 0, aggiungi i 2 caratteri (;dopo il primo,

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

Per trovarlo 2 f=65, da allora65=8^2+1^2=5^2+6^2


1

GolfScript (30 caratteri)

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

Nota: questo è piuttosto lento, perché esegue una ricerca di forza bruta piuttosto che qualcosa di elegante come una coda prioritaria. La cosa più elegante al riguardo è il riutilizzo Ncome limite inferiore da cui cercare: questo è valido perché 1^N + 2^N > Nper tutti N.

Prende Nin pila, lascia il corrispondente numero di taxi in pila. Per prendere Nda stdin, anteporre ~.

La versione sopra consente x^N + x^N(quindi per N=2esso 50). Per richiedere l'aggiunta di numeri distinti (dare 65invece), cambiare 3in 4. Per consentire 0^N + x^N(dare 25), rimuovere )immediatamente prima N?.


0

Mathematica, 58 caratteri

Una soluzione molto lenta che utilizza la funzione di generazione:

0//.i_/;(D[Sum[x^(n^#),{n,1,i}]^2,{x,i}]/.x->0)/i!<4:>i+1&
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.