Python Trouver Les Facteurs Premiers
Deux partie de la question...
1) en Essayant de déterminer le plus grand facteur premier de 600851475143, trouvé ce programme en ligne qui semble fonctionner, le problème est que je vais avoir un moment difficile essayer de comprendre comment il fonctionne exactement (je comprends les bases de ce que le programme fait)...aussi, si vous pourrait jeter quelque lumière sur la méthode, vous savez peut-être de trouver le premier (peut-être sans le tester chaque numéro) et comment vous la méthode fonctionne.
Le code que j'ai trouvé en ligne pour le premier facteur de
n = 600851475143
i = 2
while i * i < n:
while n % i == 0:
n = n / i
i = i + 1
print (n)
#takes about ~0.01secs
2) Pourquoi le code est beaucoup plus rapide que ce code (le code est juste pour tester la vitesse et n'a pas d'autre but réel que cela)
i = 1
while i < 100:
i += 1
#takes about ~3secs
- vous dites que ce dernier prend 3 secondes pour effectuer une itération de 1 à 100?
- im aussi surpris que vous
- 2ème on prend
15.3 us
sur mon système. - comment mesurez-vous le temps?
- en utilisant le module avant et après le code
- Comment avez-vous trouver le temps nécessaire pour l'exécution du code? À l'aide de timeit.Minuterie pour 1000 fois: 0.8454189409967512 pour les anciens de la fonction 0.011901747959200293 pour plus tard (seulement i+=1)
- nous = micro-secondes?
- se sentait-il comme il a fallu 3 secondes pour s'exécuter?
- avant j'ai utilisé le module, ça a pris au moins 2-3 secondes, mais quand je mets juste une impression('démarrer'...'done') avant et après, il le fait en une fraction de seconde de toute façon, pourriez-vous s'il vous plaît répondre à la première partie de la question
- Pour les nombres premiers générateur de look here
- voici l'article de wikipédia sur les tests de primalité en.wikipedia.org/wiki/Primality_test
- Très questions connexes: stackoverflow.com/questions/14138053/..., stackoverflow.com/questions/14618677/..., stackoverflow.com/questions/13503320/euler-project-3-in-python, stackoverflow.com/questions/12999706/...
- Projet Euler, Problème 3?
- Connexes: stackoverflow.com/questions/28248638/...
- Salut! Je voulais vous demander si vous pouvez me dire comment obtenir tous les facteurs premiers?
Vous devez vous connecter pour publier un commentaire.
Cette question a été le premier lien qui est apparu quand j'ai googlé
"python prime factorization"
.Comme l'a souligné @quangpn88, cet algorithme est mal (!) pour des carrés parfaits comme
n = 4, 9, 16, ...
Cependant, @quangpn88 du correctif ne fonctionne pas non plus, car il donnera des résultats erronés si le plus grand facteur premier se produit 3 fois ou plus, par exemple,n = 2*2*2 = 8
oun = 2*3*3*3 = 54
.Je crois que correcte, la force brute de l'algorithme en Python est:
Ne pas l'utiliser dans le code de performance, mais c'est OK pour les tests rapides avec modérément grands nombres:
Si la factorisation en nombres premiers est recherché, c'est la force brute de l'algorithme:
max
appeler si vous voulez tourner à l'intérieurwhile
en un simpleif (n%i==0): n //= i; else: i+=1
.i = 2
et ensuite utiliseri += 2
dei = 3
sur. Mais je vais l'y laisser. J'étais juste inquiète de ce que le premier lien sur Google a donné un mauvais algorithme...i += 2
au lieu de 1, et de commencer aveci = 3
au lieu de 2. Ne sais pas comment beaucoup de différence en termes de performances qui le ferait.n //= i
? J'ai pensé//
est le plancher de la division, dans ce cas, il doit être équivalent à/
. Est//
plus vite que/
?Ok. Donc, vous l'avez dit vous comprenez les bases, mais vous ne savez pas EXACTEMENT comment il fonctionne. Tout d'abord, c'est une excellente réponse au Projet d'Euler question, il provient. J'ai fait beaucoup de recherches sur ce problème et c'est de loin la réponse la plus simple.
Pour les besoins de l'explication, je vais laisser
n = 20
. Pour exécuter le Projet réel d'Euler problème, laissezn = 600851475143
.Cette explication utilise deux
while
boucles. La chose la plus importante à retenir à propos dewhile
boucles est qu'elles utilisent jusqu'à ce qu'ils ne sont plustrue
.La boucle externe précise que, bien que
i * i
n'est pas plus grand quen
(parce que le plus grand facteur premier ne sera jamais plus grand que la racine carrée den
), ajouter1
ài
après la boucle s'exécute.La boucle interne précise que, bien que
i
divise de manière égalen
, remplacern
avecn
divisé pari
. Cette boucle s'exécute en continu jusqu'à ce qu'il n'est plus vrai. Pourn=20
eti=2
,n
est remplacé par10
, puis de nouveau par5
. Parce que2
ne divisent en5
, la boucle s'arrête avecn=5
et la boucle externe, les finitions, la production dei+1=3
.Enfin, parce que
3
carré est plus grand que5
, la boucle externe n'est plustrue
et imprime le résultat den
.Merci pour ce détachement. J'ai regardé le code pour toujours avant de se rendre compte exactement comment il a travaillé. Espérons-le, c'est ce que vous cherchez dans une réponse. Si non, laissez-moi savoir et je peux l'expliquer davantage.
n=4
? Cela semble comme il l'aurait fait imprimer 4 en tant que premiern
est le plus grand facteur de l'origine nombre (si l'on remplace l'intérieurwhile
avec unif
:if n%i==0: n=n/i else: i=i+1
).On dirait les gens sont en train de faire le Projet Euler chose où vous code la solution vous-même. Pour tout le monde qui veut faire un travail, il y a le primefac module qui fait de très grands nombres très rapidement:
Pour le premier numéro de génération, j'ai toujours utiliser
Crible d'Eratosthène
:Vous pouvez utiliser De Miller-Rabin test de primalité pour vérifier si un nombre est premier ou pas. Vous pouvez trouver ses implémentations de Python ici.
Toujours utiliser
timeit
module pour le temps de votre code, le 2ème prend juste15us
:gmpy2
a aussi un rapide de Miller-Rabin mise en œuvreN'est pas plus grand facteur premier de 27 est de 3 ??
Le code ci-dessus pourrait être le plus rapide,mais il échoue le 27 droit ?
27 = 3*3*3
Le code ci-dessus renvoie 1
Autant que je sache.....1 est ni le premier ni composite
Je pense, c'est le meilleur code
Le code n'est pas correct à 100. Il doit vérifier les cas i * i = n:
Je pense qu'il devrait être:
n = 8
). Voir ma réponse pour un correctif.Une autre façon de faire:
exemple de sortie :
python test.py 68
[2, 2, 17]
Mon code:
Qui j'ai comparé le code le plus de voix, qui a été très rapide
TESTS, (remarque, j'ai ajouté un compte dans chaque boucle pour tester l'optimisation)
Je l'ai trouver ce code peut être modifié facilement pour obtenir le (facteur le plus important) ou tout ce qui est nécessaire. Je suis ouvert à toutes questions, mon objectif est d'améliorer ce beaucoup plus, aussi bien pour les grands nombres premiers et de facteurs.
Dans le cas où vous souhaitez utiliser numpy voici une façon de créer un tableau de tous les nombres premiers ne sont pas plus grand que n:
[ i for i in np.arange(2,n+1) if 0 not in np.array([i] * (i-2) ) % np.arange(2,i)]
Vous ne devriez pas en boucle jusqu'à la racine carrée du nombre! Il peut être bon de temps en temps, mais pas toujours!
Plus grand facteur premier de 10 est 5, ce qui est plus grand que la sqrt(10) (3.16, aprox).
Plus grand facteur premier de 33 est de 11, ce qui est plus grand que la sqrt(33) (5.5,74, aprox).
Vous êtes à la confusion ce avec la bienséance qui stipule que, si un nombre est un facteur plus grand que son sqrt, il doit avoir au moins un autre un autre facteur premier plus petit que sa racine carrée. Donc, à vous de tester si un nombre est premier, vous avez seulement besoin de tester jusqu'à sa racine carrée.
Ci-dessous sont deux façons de générer des facteurs premiers d'un nombre donné de manière efficace:
Une autre façon qui saute même après 2 est manipulé:
je suis sûr que c'est le pire de la logique mais c'est toutes les connaissances que j'ai dans .py
ce programme permettra d'obtenir un nombre à l'utilisateur et imprime tous les facteurs de nombres qui sont le premier comme pour le 12, il donnera à 2,3