Afin de résoudre ce problème, j'ai d'abord observé que
Où est le nombre de diviseurs (pas nécessairement premiers) de . Si est le plus petit entier tel que , alors
Maintenant, nous devons choisir telle sorte que soit minimal. Les choix pour sont triviaux - ce ne sont que les nombres premiers dans l'ordre croissant.
Cependant, ma première pensée pour choisir était incorrecte. Je pensais que vous pouviez simplement factoriser , trier les facteurs dans l'ordre décroissant et soustraire 1. La plupart du temps, cela fonctionne bien, par exemple le plus petit entier avec diviseurs est:
Mais ceci est incorrect pour :
Alors que la bonne réponse est:
m = 2 3 3 1 5 1 = 120
Il est donc clair que nous devons parfois fusionner des facteurs. Dans ce cas, car . Mais je ne vois pas exactement une stratégie de fusion claire et directe. Par exemple, on pourrait penser que nous devons toujours fusionner dans le pouvoir, mais ce n'est pas vrai: 2
m = 2 96 3 1 5 1 7 1 11 1 > 2 96 3 3 5 5 1 7 1
Je ne peux pas immédiatement penser à un exemple, mais mon instinct dit que certaines approches gourmandes peuvent échouer si elles fusionnent d'abord les mauvais pouvoirs.
Existe-t-il une stratégie optimale simple pour fusionner ces pouvoirs pour obtenir la bonne réponse?
Addenda. Un algorithme gourmand qui vérifie chaque fusion possible et effectue la meilleure fusion par fusion, échoue sur . La série de fusions un par un est la suivante:
Cependant, la solution optimale est:
la source
Réponses:
Voici une solution, basée sur mes commentaires ci-dessus. Je ne prétends pas que c'est optimal.
L'idée est de considérer , que nous définissons comme "le plus petit entier positif avec exactement diviseurs et facteurs premiers distincts". Nous faisons les observations faciles:n mT(n,m) n m
Et nous avons aussi la récurrence:
Enfin, la quantité que vous recherchez est
À cette fin, voici du code Python, qui correspond à tous les chiffres que vous avez donnés ci-dessus. Notez que cela fonctionne avec les logarithmes pour garder les nombres plus petits: ainsi l'entier réel que vous recherchez est
round(2**smallest(n))
.la source
powerset
for factor_list in powerset(factors)
en quelque chose qui génère chaque diviseur distinct d'n
une seule fois. De cette façon, pour, disons, , si l' on considère des solutions contenant exactement les premiers nombres premiers comme les facteurs premiers distincts, vous ne le faire travail non récursive au lieu de , qui est exponentiel en . 2 k O ( k 2 ) O ( ( 2 kmultiplicative_partitions(24)
ce qui produit (entre autres) les partitions[4, 3, 2]
et[6, 2, 2]
, qui (après avoir inversé l'ordre afin de donner au plus petit facteur premier l'exposant le plus élevé) correspondent aux solutions et , respectivement. L'algorithme de Steve D ne considérera jamais cette dernière solution, car il a déjà déterminé que la sous-solution .Les candidats possibles pour le "plus petit entier avec n diviseurs" sont les entiers de la forme où a ≥ b ≥ c ... et (a + 1) (b + 1) (c + 1) ... = n.2a⋅3b⋅5c...
Vous devez donc trouver toutes les façons d'exprimer n comme le produit d'entiers ≥ 2 dans un ordre non croissant, et calculer et vérifier les candidats correspondants. Par exemple, lorsque n = 16, 16 = 8 · 2 = 4 · 4 = 4 · 2 · 2 = 2 · 2 · 2 · 2, les possibilités sont donc de , , , , et le plus petit est .27⋅3 23⋅33 23⋅3⋅5 2⋅3⋅5⋅7 23⋅3⋅5=120
Si n est le produit de deux nombres premiers p · q, p ≥ q, les seuls candidats sont et , et ce dernier est toujours plus petit .2pq−1 2p−1⋅3q−1
Vous pouvez comprendre une condition où il pourrait y avoir un facteur par exemple, en vérifiant si pour certains x premier qui n'est pas un facteur. Dans l'exemple n = 16, il y a un facteur car .2ab−1 2ab−1>2a−1⋅xb−1 23 23<2⋅7
la source