Generalización de números Hardy-Ramanujan

12

1729, conocido como el número Hardy-Ramanujan , es el entero positivo más pequeño que se puede expresar como la suma de dos cubos de enteros positivos de dos maneras ( 12^3+1^3=10^3+9^3=1729). Dado un número entero n(como entrada en cualquier forma que sea natural para su idioma de elección) encuentre el número entero positivo más pequeño que pueda expresarse como la suma de dos enteros positivos elevados a la npotencia th de dos maneras únicas. Sin uso de fuentes externas. Pocos personajes ganan.

Tenga en cuenta que esto es realmente un problema sin resolver para n>4. Para esos números, ¡deje que su programa se ejecute para siempre en la búsqueda, o muera en el intento! Asegúrese de que si se le da tiempo y recursos infinitos, el programa resolverá el problema.

Ben Reich
fuente
2
Es posible que (?) Desee especificar "la suma de dos enteros positivos elevados a la npotencia th". De lo contrario, 91(no 1729) es la solución para n=3, ya que 6^3+(−5)^3=4^3+3^3=91. Aprendí esto de su enlace de Wikipedia, así que tal vez su referencia HM hace que esto sea innecesario por convención. ¡Salud!
Darren Stone
en realidad, 1es la primera solución:1 = cbrt(0.5)^3 + cbrt(0.5)^3 = ...
John Dvorak
Gracias por las sugerencias y la edición. ¡Me refería a 2 enteros positivos!
Ben Reich
1
@ JanDvorak, ja, sí. Manteniéndolo R eal!
Darren Stone
Usted dice " encontrar el número entero positivo más pequeño que" ..., como si no es una - pero para cualquier n > 4, la existencia de estos números es un problema no resuelto . Tal vez deberías decir "encuentra el número entero positivo más pequeño ( si hay uno ) que" ... Es posible que las "respuestas" sean bucles no determinantes que no encuentren nada.
res

Respuestas:

3

APL  45  41

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

Versión más corta pero más lenta de 41 caracteres:

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

Puede probarlo en línea , simplemente pegue la función e invoque con un número:

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

(Sin embargo, el algoritmo es bastante tonto, no espere que el intérprete en línea calcule n = 4)

La respuesta para n = 2 es 50 = 5² + 5² = 7² + 1² porque es un número que "puede expresarse como la suma de dos cuadrados de enteros positivos, no es diferente, de dos maneras".

Si desea agregar la cláusula distinta, simplemente cambie (v∘.≤v)a (v∘.<v), el mismo número de caracteres, y n = 2 se convierte en 65:

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

Estoy superando a GolfScript? No puede ser !!

Tobia
fuente
¡bonito! Y me refería a enteros distintos, pero no lo especifiqué, ¡así que más poder para ti! De vuelta al tablero de dibujo para el GolfScript ...
Ben Reich
2

Rubí, 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

Pase ncomo argumento de línea de comando. La primera línea stdoutes la solución.

Optimizado para el código de golf, no el rendimiento. (Corre correctamente. Pero lento. Hace más trabajo del necesario)


Aquí hay un programa C más largo y ligeramente más rápido. El mismo algoritmo correcto pero horrible. (¡Realmente necesito estudiar más teoría!)

Probado para 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 versión C toma nen stdin. Como arriba, la primera línea stdoutes la solución.

Piedra de Darren
fuente
1

GolfScript 53

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

La entrada es el número inicial en la pila. El número en la parte superior de la pila al final es la respuesta. Explicaré esto con más detalle cuando tenga la oportunidad.

P.ej

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

Esto es bastante lento en este momento. También cuenta 0(de modo que 25 es la respuesta para n=2, desde entonces 25=5^2+0^2=3^2+4^2. Para no contar 0, agregue los 2 caracteres (;después del primero,

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

Para encontrar eso 2 f=65, ya que65=8^2+1^2=5^2+6^2

Ben Reich
fuente
1

GolfScript (30 caracteres)

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

Nota: esto es bastante lento, porque realiza una búsqueda de fuerza bruta en lugar de algo elegante como una cola prioritaria. Lo más elegante es reutilizarlo Ncomo un límite inferior desde el que buscar: esto es válido porque es 1^N + 2^N > Npara todos N.

Toma Nla pila, deja el número de taxi correspondiente en la pila. Para tomar Nde stdin, anteponer ~.

La versión anterior permite x^N + x^N(por N=2lo que da 50). Para requerir agregar números distintos (en 65lugar de dar ), cambie el 3a 4. Para permitir 0^N + x^N(dar 25), retire el )inmediatamente anterior N?.

Peter Taylor
fuente
0

Mathematica, 58 caracteres

Una solución muy muy lenta que utiliza la función de generación:

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