Généralisation de Hardy-Ramanujan

12

1729, connu sous le nom de nombre de Hardy-Ramanujan , est le plus petit entier positif qui peut être exprimé comme la somme de deux cubes d'entiers positifs de deux manières ( 12^3+1^3=10^3+9^3=1729). Étant donné un entier n(comme une entrée sous quelque forme que ce soit naturelle dans la langue de votre choix), trouvez le plus petit entier positif qui peut être exprimé comme la somme de deux entiers positifs élevés à la npuissance e de deux manières uniques. Pas d'utilisation de sources externes. Le moins de personnages gagne.

Notez qu'il s'agit en fait d' un problème non résolu pour n>4. Pour ces chiffres, laissez votre programme s'exécuter à jamais dans la recherche, ou mourrez en essayant! Faites en sorte que si le temps et les ressources sont infinis, le programme résoudrait le problème.

Ben Reich
la source
2
Vous pouvez (?) Vouloir spécifier "la somme de deux entiers positifs élevés à la npuissance e". Sinon, 91(pas 1729) est la solution pour n=3, puisque 6^3+(−5)^3=4^3+3^3=91. J'ai appris cela à partir de votre lien Wikipédia, alors peut-être que votre référence HM rend cela inutile par convention. À votre santé!
Darren Stone
en fait, 1c'est la première solution:1 = cbrt(0.5)^3 + cbrt(0.5)^3 = ...
John Dvorak
Merci pour les suggestions et la modification - je voulais dire 2 entiers positifs!
Ben Reich
1
@JanDvorak, ha, oui. Le garder R EAL!
Darren Stone
Vous dites « trouver le plus petit entier positif » ..., comme il est - mais pour tout n > 4, l'existence de ces chiffres est un problème non résolu . Vous devriez peut-être dire "trouver le plus petit entier positif ( s'il y en a un ) qui" ... Il est possible que les "réponses" soient des boucles non terminantes qui ne trouvent rien.
res

Réponses:

3

APL  45  41

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

Version plus courte mais plus lente de 41 caractères:

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

Vous pouvez l'essayer en ligne , collez simplement la fonction et invoquez-la avec un numéro:

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

(L'algorithme est assez stupide cependant, ne vous attendez pas à ce que l'interprète en ligne calcule n = 4)

La réponse pour n = 2 est 50 = 5² + 5² = 7² + 1² parce que c'est un nombre qui "peut être exprimé comme la somme de deux carrés d'entiers positifs - ne dit pas différent - de deux manières."

Si vous voulez ajouter la clause distincte, changez simplement (v∘.≤v)en (v∘.<v), même nombre de caractères, et n = 2 devient 65:

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

Je bat GolfScript? Ça ne peut pas être !!

Tobia
la source
agréable! Et je voulais dire des entiers distincts, mais je n'ai pas précisé, donc plus de pouvoir pour toi! Retour à la planche à dessin pour le GolfScript ...
Ben Reich
2

Rubis, 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

Passez ncomme argument de ligne de commande. La première ligne stdoutest la solution.

Optimisé pour le code-golf, pas pour les performances. (Fonctionne correctement. Mais lentement. Fait plus de travail que nécessaire.)


Voici un programme C plus long et légèrement plus rapide. Même algorithme correct mais horrible. (J'ai vraiment besoin d'étudier plus de théorie!)

Testé pour 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 version C prend le ndessus stdin. Comme ci-dessus, la première ligne stdoutest la solution.

Darren Stone
la source
1

GolfScript 53

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

L'entrée est le numéro initial sur la pile. Le numéro en haut de la pile à la fin est la réponse. J'expliquerai cela plus en détail lorsque j'en aurai l'occasion.

Par exemple

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

C'est assez lent en ce moment. Il compte également 0(de sorte que 25 est la réponse pour n=2, puisque 25=5^2+0^2=3^2+4^2. Pour ne pas compter 0, ajoutez les 2 caractères (;après le premier,

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

Pour trouver cela 2 f=65, depuis65=8^2+1^2=5^2+6^2

Ben Reich
la source
1

GolfScript (30 caractères)

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

Remarque: c'est assez lent, car il effectue une recherche par force brute plutôt que quelque chose d'élégant comme une file d'attente prioritaire. La chose la plus élégante à ce sujet est la réutilisation Ncomme limite inférieure à partir de laquelle effectuer la recherche: cela est valable car 1^N + 2^N > Npour tous N.

Prend Nsur la pile, laisse le numéro de taxi correspondant sur la pile. Pour prendre Nde stdin, ajoutez ~.

La version ci-dessus le permet x^N + x^N(donc N=2ça donne 50). Pour exiger l'ajout de nombres distincts (donner à la 65place), changez 3en 4. Pour permettre 0^N + x^N(donner 25), retirez le )immédiatement avant N?.

Peter Taylor
la source
0

Mathematica, 58 caractères

Une solution très très lente utilisant la fonction de génération:

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