私は、Python でポーカーのハンドを高速に評価することを検討してきました。このプロセスを高速化する 1 つの方法は、すべてのカードの面とスーツを素数として表し、それらを掛け合わせてハンドを表すことだと考えました。つまり、
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]
これにより、各ハンドに数値が与えられ、モジュロによってハンドにキングが何枚あるか、またはハートが何枚あるかがわかります。たとえば、クラブが 5 枚以上あるハンドは 2^5 で均等に割り切れます。キングが 4 枚あるハンドは 59^4 で均等に割り切れます。
問題は、AcAdAhAsKdKhKs のような 7 枚のカードのハンドには約 62.7 京のハッシュ値があり、これを内部的に表現するには 32 ビットよりかなり多くのビットが必要になることです。このような大きな数値を Python に保存して、算術演算を実行できるようにする方法はあるでしょうか?
ベストアンサー1
Python は、任意の大きな数値を扱うことができる「bignum」整数型をサポートしています。Python 2.5 以降では、この型は と呼ばれlong
、型とは別になっていますint
が、インタープリタは自動的に適切な方を使用します。Python 3.0 以降では、このint
型は完全に削除されました。
ただし、これは単なる実装の詳細です。バージョン 2.5 以上を使用している場合は、標準の数学演算を実行するだけで、32 ビット数学の境界を超える数値は自動的に (透過的に) bignum に変換されます。
詳細は以下をご覧くださいペップ0237。