2017-02-13 4 views
0

Comment puis-je calculer et enregistrer 2^74,207,281 − 1 dans un fichier texte?Comment calculer et enregistrer le plus grand nombre premier connu?

Premier problème: j'obtiens des erreurs de mémoire lorsque j'essaie de l'imprimer. Comment puis-je déterminer la quantité de mémoire dont j'ai besoin?

Deuxième problème: Comment puis-je le calculer dans le temps le plus rapide?

+0

Que voulez-vous dire par "calculer"? Pour écrire tous les chiffres de sa représentation décimale dans un fichier texte? Probablement, Python n'est pas approprié pour cette tâche, surtout si vous voulez "le temps le plus rapide". – Wolfram

+0

Ouais, je cherche à tout enregistrer dans un fichier texte. – user2476265

+3

Le travail a déjà été fait pour vous: http://www.mersenne.org/primes/digits/M74207281.zip – mitoRibo

Répondre

5

Ce calcul est assez rapide pour moi, ne donne pas d'erreurs de mémoire et est exacte:

>>> x = 2**74207281 - 1 

depuis:

>>> x > 2**74207281 
False 
>>> x > 2**74207281 - 2 
True 

Il suffit de ne pas essayer de l'imprimer, cela prendre des âges. Essayez d'imprimer de petits gros chiffres pour avoir une idée de combien de temps ...

Oh, vous voulez l'imprimer ...

Le paquet gmpy a un algorithme plus rapide pour ses mise en chaîne numéros:

>>> x = 2**74207281 - 1 
>>> import gmpy 
>>> xx = gmpy.mpz(x) 
>>> s = str(xx) # takes a few seconds. 
>>> len(s) 
22338618 
>>> f = file("/tmp/bigprime.txt","w") 
>>> f.write(s) 
>>> f.close() 

Le fichier résultant a 22 millions de chiffres:

$ wc -c /tmp/bigprime.txt 
22338618 /tmp/bigprime.txt 
+0

Ceci est un nombre de moins de 10MB, cela ne prend pas de temps. Mais cela devrait être fait sur un langage de bas niveau comme C. – Wolfram

+0

Computing 'len (str (2 ** 1000000))' prend une seconde sur ma machine, et j'imagine que l'imprimer prendra quelques secondes. Mais 'len (str (2 ** (10000000)))' (un zéro de plus, mais 3 000 000 chiffres) dépasse ma patience. Pas sûr si python frappe un mur à ce moment-là ... – Spacedman

+0

Belle suggestion à propos de 'gmpy' –

2

La fonction pow() utilisera exponentiation rapide et est presque stant:

>>> import math 
>>> p = pow(2, 74207281) - 1 
>>> math.log10(p) 
22338617.477665834 

Il a ainsi 22338618 chiffres.

+0

Pas besoin d'utiliser pow, juste 'p = 2 ** 74207281-1' fonctionne. Le problème est d'imprimer le numéro, pas de stocker 74207281 dans la mémoire. – Wolfram

+0

Sur ma machine au moins, 'p = 2 ** 74207281-1' est problématique. Il ne semble pas utiliser l'exponentiation en quadrature. –

+0

Étrange: '>>> timeit.timeit (" x = 2 ** 74207281-1 ") \ N 0.013522571996873012' – Wolfram