Generalização de número de Hardy – Ramanujan

12

1729, conhecido como número de Hardy-Ramanujan , é o menor número inteiro positivo que pode ser expresso como a soma de dois cubos de números inteiros positivos de duas maneiras ( 12^3+1^3=10^3+9^3=1729). Dado um número inteiro n(como entrada de qualquer forma que seja natural para o seu idioma de escolha), encontre o menor número inteiro positivo que pode ser expresso como a soma de dois números inteiros positivos elevados à nquinta potência de duas maneiras únicas. Não há uso de fontes externas. Menos personagens ganham.

Observe que esse é realmente um problema não resolvido para n>4. Para esses números, deixe seu programa rodar para sempre em busca ou morra tentando! Faça com que, se houver tempo e recursos infinitos, o programa resolva o problema.

Ben Reich
fonte
2
Você pode (?) Especificar "a soma de dois números inteiros positivos elevados à npotência th". Caso contrário, 91(não 1729) é a solução para n=3, desde 6^3+(−5)^3=4^3+3^3=91. Eu aprendi isso no seu link da Wikipedia, então talvez a sua referência HM torne isso desnecessário por convenção. Felicidades!
precisa
na verdade, 1é a primeira solução:1 = cbrt(0.5)^3 + cbrt(0.5)^3 = ...
John Dvorak
Obrigado pelas sugestões e edição - eu quis dizer 2 números inteiros positivos!
Ben Reich
1
@JanDvorak, ha, sim. Mantendo- R eal!
Darren Pedra
Você diz " encontrar o menor inteiro positivo que" ..., como se não é um - mas para qualquer n > 4, a existência de tais números é um problema não resolvido . Talvez você deva dizer "encontre o menor número inteiro positivo ( se houver ) que" ... É possível que as "respostas" sejam loops não-determinantes e que não encontrem nada.
res

Respostas:

3

APL  45  41

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

Versão mais curta mas mais lenta de 41 caracteres:

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

Você pode experimentá-lo online , basta colar a função e invocá-la com um número:

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

(O algoritmo é bastante tolo, não espere que o intérprete online calcule n = 4)

A resposta para n = 2 é 50 = 5² + 5² = 7² + 1² porque é um número que "pode ​​ser expresso como a soma de dois quadrados de números inteiros positivos - não diz diferente - de duas maneiras".

Se você deseja adicionar a cláusula distinta, basta mudar (v∘.≤v)para o (v∘.<v)mesmo número de caracteres e n = 2 se torna 65:

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

Estou vencendo o GolfScript? Não pode ser !!

Tobia
fonte
legais! E eu quis dizer números inteiros distintos, mas não especifiquei, portanto, mais poder para você! Voltar à prancheta de desenho para o 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

Passe ncomo argumento da linha de comando. Primeira linha para stdouté a solução.

Otimizado para código-golfe, não desempenho. (Funciona corretamente. Mas lento. Faz mais trabalho do que o necessário.)


Aqui está um programa C um pouco mais rápido. O mesmo algoritmo correto, mas horrível. (Eu realmente preciso estudar mais teoria!)

Testado 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);}}}}}}

A versão C leva nem stdin. Como acima, a primeira linha de stdouté a solução.

Darren Stone
fonte
1

GolfScript 53

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

Entrada é o número inicial na pilha. O número no topo da pilha no final é a resposta. Vou explicar isso com mais detalhes quando tiver uma chance.

Por exemplo

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

Isso é bem lento agora. Também conta 0(para que 25 seja a resposta n=2, pois 25=5^2+0^2=3^2+4^2. Para não contar 0, adicione os 2 caracteres (;após o primeiro,

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

Para descobrir isso 2 f=65, já que65=8^2+1^2=5^2+6^2

Ben Reich
fonte
1

GolfScript (30 caracteres)

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

Nota: isso é bastante lento, porque faz uma busca por força bruta em vez de algo elegante como uma fila de prioridade. A coisa mais elegante é reutilizar Ncomo um limite inferior a partir do qual pesquisar: isso é válido 1^N + 2^N > Npara todos N.

Pega Nna pilha, deixa o número do táxi correspondente na pilha. Para retirar Ndo stdin, faça o prefixo ~.

A versão acima permite x^N + x^N(por N=2isso dá 50). Para exigir a adição de números distintos (fornecendo 65), altere 3para 4. Para permitir 0^N + x^N(dar 25), remova o )imediatamente antes N?.

Peter Taylor
fonte
0

Mathematica, 58 caracteres

Uma solução muito lenta usando a função de geração:

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