Définition
Un entier positif n
est un nombre pratique (séquence OEIS A005153 ) si tous les entiers positifs plus petits peuvent être représentés comme des sommes de diviseurs distincts de n
.
Par exemple, 18
est un nombre pratique: ses diviseurs sont 1, 2, 3, 6, 9 et 18, et les autres entiers positifs inférieurs à 18 peuvent être formés comme suit:
4 = 1 + 3 5 = 2 + 3 7 = 1 + 6
8 = 2 + 6 10 = 1 + 9 11 = 2 + 9
12 = 3 + 9 = 1 + 2 + 9 = 1 + 2 + 3 + 6
13 = 1 + 3 + 9 14 = 2 + 3 + 9 15 = 6 + 9
16 = 1 + 6 + 9 17 = 2 + 6 + 9
Mais ce 14
n'est pas un nombre pratique: ses diviseurs sont 1, 2, 7 et 14, et il n'y a aucun sous-ensemble de ceux-ci qui s'ajoute à 4, 5, 6, 11, 12 ou 13.
Défi
Écrivez un programme, une fonction ou un verbe qui prend en entrée un entier positif x
et retourne ou imprime le x ème nombre pratique, indexé de 1 pour cohérence avec OEIS. Votre code doit être suffisamment efficace pour pouvoir gérer jusqu'à 250000 entrées en moins de deux minutes sur un ordinateur de bureau raisonnable. (NB mon implémentation de référence en Java gère 250000 en moins de 0,5 seconde, et mon implémentation de référence en Python le gère en 12 secondes).
Cas de test
Input Expected output
1 1
8 18
1000 6500
250000 2764000
1000000 12214770
3000000 39258256
la source
Réponses:
J (99 caractères)
Étant donné que l'énoncé du problème demande un "programme, fonction ou verbe ", quelqu'un a dû faire une soumission J. J les gens remarqueront que je n'ai pas vraiment joué au golf (!) Ou optimisé cela. Comme les autres entrées, j'ai utilisé le théorème de Stewart, mentionné sur le lien OEIS, pour tester si chaque nombre pair est pratique ou non.
Je n'ai pas facilement accès à un "ordinateur de bureau raisonnable" avec J installé. Sur mon netbook de six ans, il
f 250000
calcule en 120,6 secondes, ce qui n'est pas tout à fait en moins de deux minutes, mais probablement sur n'importe quel ordinateur un peu plus raisonnable, cela se termine à temps.la source
Mathematica,
126121 caractèresMerci à Bélisaire.
Utilisation de la formule sur wikipedia.
Exemples:
Il a fallu des années 70 pour calculer
f[250000]
sur mon ordinateur.la source
(i=j=1;While[j<#,If[And@@Thread[#[[;;,1]]<2+Most@DivisorSum[FoldList[#Power@@#2&,1,#],#&]&@FactorInteger@++i],j++]];i)&
Haskell - 329
Exemples:
Voici une petite suite de tests (avant celle ci-dessus):
Résultats des tests après avoir été compilés avec
ghc -O3
:la source
parse error on input `='
. Dois-je utiliser un drapeau ou un autre?asdf.hs
et de l'exécuterghci asdf.hs
, puis à partir de là, vous pourrez accéderf
ghc --make -O3 [filename]
. Vous pouvez également le charger dans ghci avec:l [filename]
mais étant donné les contraintes de temps compilées, c'est probablement le meilleur. :)ghci
charge les fichiers spécifiés dans ses argumentsghc
. Votre ordinateur est plus rapide que le mien, mais il reste à l'intérieur du critère de performance sur mon ordinateur à 98 secondes.Javascript,
306 307282B250k env. 6s sur mon ordinateur portable.
Code non golfé commenté: http://jsfiddle.net/82xb9/3/ maintenant avec un meilleur test sigma et une meilleure condition si (merci commentaires)
Versions de pré-édition: http://jsfiddle.net/82xb9/ http://jsfiddle.net/82xb9/1/
la source
k--;
parreturn k-1
. Bien que cela augmente légèrement votre nombre d'octets, vous pouvez en enregistrer quelques-uns avec des choses comme le remplacementp[i]>=P+2
parp[i]>P+1
(et probablement en supprimant l'appel de fonction interne et en utilisant un à labreak
place).