Manipulation de très grands nombres en Python

j'ai pensé à l'évaluation rapide des mains de poker en Python. Il m'est venu à l'esprit qu'une façon d'accélérer le processus serait de représenter tous les visages et les combinaisons de cartes comme des nombres premiers et de les multiplier ensemble pour représenter les mains. À whit:

class PokerCard:
    faces = '23456789TJQKA'
    suits = 'cdhs'
    facePrimes = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 53, 59, 61]
    suitPrimes = [2, 3, 5, 7]

et

    def HashVal(self):
      return PokerCard.facePrimes[self.cardFace] * PokerCard.suitPrimes[self.cardSuit]

cela donnerait à chaque main une valeur numérique qui, grâce à modulo pourrait me dire combien de rois sont dans la main ou combien de cœurs. Par exemple, tout à la main avec cinq clubs ou plus dedans il se diviserait également par 2^5; n'importe quelle main avec quatre rois se diviserait également par 59^4, etc.

le problème est qu'une main à sept cartes comme Acadihaskdkhks a une valeur de hachage d'environ 62,7 quadrillions, ce qui prendrait beaucoup plus de 32 bits pour représenter à l'intérieur. Y a-t-il un moyen de stocker de tels nombres en Python qui me permettra d'effectuer des opérations arithmétiques dessus?

92
demandé sur Tshepang 2009-02-11 23:13:45

4 réponses

Python supporte un type entier "bignum" qui peut fonctionner avec des nombres arbitrairement grands. En Python 2.5+, ce type est appelé long et est séparé du type int , mais l'interpréteur utilisera automatiquement celui qui est le plus approprié. Dans Python 3.0+, le type int a été complètement abandonné.

C'est juste un détail de mise en œuvre, cependant - aussi longtemps que vous avez la version 2.5 ou mieux, juste effectuer des opérations mathématiques standard et tout nombre qui dépasse les limites de 32 bits sera automatiquement (et de façon transparente) converti en bignum.

vous pouvez trouver tous les détails sanglants dans PEP 0237 .

127
répondu Ben Blank 2009-02-12 00:18:20

python supporte arbitrairement grand entiers naturellement:

exemple:

>>> 10**1000 100000000000000000000000000000000000000000000000000000000000000000000000000000 Zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero Zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero Zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero Zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero Zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero Zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero Zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero Zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero Zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero Zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero Zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero zero 00000000000000000000000000000000000000000000000000000000000000000

Vous pourriez même obtenir, par exemple, d'une immense valeur entière, fib (4000000).

mais tout de même il ne pas (pour l'instant) soutient une grande flotteur !!

Si vous avez besoin d'un grand, grand, float, puis vérifier sur le décimal Module. Il y a des exemples d'utilisation sur ces foruns: OverflowError: (34, 'résultat trop grand')

autre référence: http://docs.python.org/2/library/decimal.html

vous pouvez même utiliser le module gmpy si vous avez besoin d'une accélération (ce qui est susceptible d'être de votre intérêt): manipulation de grands nombres en code

autre référence: https://code.google.com/p/gmpy /

41
répondu Nuno Aniceto 2017-05-23 12:17:55

on pourrait faire ça pour le plaisir, mais d'autres que ce n'est pas une bonne idée. Il ne serait pas accélérer tout ce que je peux penser.

  • obtenir les cartes dans une main sera une opération de factoring entier qui est beaucoup plus cher que juste l'accès à un tableau.

  • ajouter des cartes serait la multiplication, et la suppression de la division des cartes, à la fois de grands nombres multi-mots, qui sont plus coûteux opérations que d'ajouter ou de supprimer des éléments de listes.

  • La valeur numérique d'une part vous dira rien. Vous aurez besoin de prendre en compte les primes et de suivre les règles de Poker pour comparer deux mains. h1 < h2 pour de telles mains ne signifie rien.

28
répondu 2009-02-11 21:07:15

python supporte arbitrairement de grands nombres entiers naturellement:

In [1]: 59**3*61**4*2*3*5*7*3*5*7
Out[1]: 62702371781194950
In [2]: _ % 61**4
Out[2]: 0
18
répondu Autoplectic 2009-02-11 20:18:04