2017-07-07 2 views
-1

Récemment, j'ai essayé d'implémenter les 15 tests d'aléa décrits dans le NIST SP800-22. Comme une vérification de ma mise en œuvre de la fonction, j'ai exécuté les exemples que le document NIST fournit pour chacun de ses tests. Certains de ces tests nécessitent des chaînes de bits très longues (jusqu'à un million de bits). Par exemple, sur l'un des exemples, l'entrée est "les 100 000 premiers bits de et". Cela soulève la question suivante: comment générer une représentation en bits d'une valeur flottante qui dépasse la précision disponible pour les nombres à virgule flottante en Python?Codage des constantes flottantes comme des chaînes binaires extrêmement longues

J'ai trouvé des articles convertir les entiers en chaînes binaires (le bac() fonction), et la conversion de fractions en virgule flottante en binaire (division répétée par 2 (lent!) et limitée par une précision en virgule flottante). J'ai envisagé de le construire itérativement en utilisant $ e = \ sum_ {n = 0}^{\ infty} \ frac {2n + 2} {(2n + 1)!} $, En calculant la valeur de la portion suivante, en convertissant à une représentation binaire, et en l'ajoutant d'une manière ou d'une autre à la représentation cumulative (en réfléchissant toujours à la façon de le faire). Cependant, j'ai atteint le même mur en descendant ce chemin: la précision des valeurs en virgule flottante alors que je vais plus loin sur cette somme.

Est-ce que quelqu'un a des suggestions sur la création de chaînes de bits arbitrairement longues à partir de valeurs flottantes arbitrairement précises? PS: De plus, y a-t-il un moyen de rendre correctement mon équation mathématique Markdown ci-dessus? :-)

Répondre

0

Je gère la bibliothèque gmpy2 et prend en charge l'arithmétique binaire de précision arbitraire. Voici un exemple de génération des 100 premiers bits de e.

>>> import gmpy2 
>>> gmpy2.get_context().precision=100 
>>> gmpy2.exp(1).digits(2)[0] 
'101011011111100001010100010110001010001010111011010010101001101010101 
1111101110001010110001000000010' 
+0

Merci beaucoup! –