在Python中处理非常大的数字
我一直在考虑用Python进行快速的扑克手评估。 我想到一种加速这个过程的方法就是把所有的牌面和代表作为素数,并把它们放在一起代表手牌。 白衣:
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]
和
def HashVal(self): return PokerCard.facePrimes[self.cardFace] * PokerCard.suitPrimes[self.cardSuit]
这会给每只手一个数字值,通过模数可以告诉我手中有多less个国王,或者多less颗心。 例如,任何有5个或更多的俱乐部的手均匀分配2 ^ 5; 任何有四位君王的手将会以59 ^ 4等分。
问题是像AcAdAhAsKdKhKs这样的七张牌的牌的散列值大约为62.7万亿次,这将花费比32比特大得多的内部代表。 有没有办法在Python中存储这么大的数字,这将允许我对它执行算术运算?
Python支持可以使用任意大数字的“bignum”整数types。 在Python 2.5+中,这个types被称为long
types,并且与int
types是分开的,但是解释器会自动使用哪个更合适。 在Python 3.0+中, int
types已经完全删除。
这只是一个实现细节 – 只要你有2.5或更高的版本,只要执行标准的math运算,任何超过32位math边界的数字都将自动(透明地)转换成一个bignum。
你可以在PEP 0237find所有的血腥细节。
python自然支持任意大的整数 :
例:
>>> 10 ** 1000 100000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000 00000000000000000000000000
你甚至可以得到,例如一个巨大的整数值,fib(4000000)。
但是现在还不支持任意大的浮动 !
如果你需要一个大的,大的浮点数,然后检查十进制模块。 有这些foruns使用的例子: OverflowError:(34,“结果太大”)
另一个参考: http : //docs.python.org/2/library/decimal.html
你甚至可以使用gmpy模块,如果你需要加速(这可能是你感兴趣的): 在代码中处理大数字
另一个参考: https : //code.google.com/p/gmpy/
你可以这样做的乐趣,但除此之外,这不是一个好主意。 它不会加速我能想到的任何事情。
-
手中拿到牌将是一个整数分解操作,比访问一个数组要昂贵得多。
-
添加卡将是乘法,并且除去卡分割,这些都是大的多字数字,这是比从列表中添加或移除元素更昂贵的操作。
-
一只手的实际数值将告诉你什么。 您将需要考虑素数,并遵循扑克规则来比较两只手。 对于这样的手h1 <h2没有任何意义。
python自然支持任意大的整数:
In [1]: 59**3*61**4*2*3*5*7*3*5*7 Out[1]: 62702371781194950 In [2]: _ % 61**4 Out[2]: 0