Pythonで非常に多くの数字を処理します
-
22-08-2019 - |
質問
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]
これにより、各手に数値が与えられます。これにより、Moduloを介して王が何人の手にあるか、または何人の心があるかがわかります。たとえば、5つ以上のクラブが入っているハンドは、2^5で均等に分割されます。 4人の王との手は、59^4などで均等に分割されます。
問題は、Acadahaskdkhksのような7カードの手のハッシュ値が約62.7クアドリリオンであり、内部で表すのに32ビットをかなり超えるかかることです。このような多数をPythonに保存する方法はありますか?
解決
Pythonは、任意の多数で動作できる「ビグナム」整数タイプをサポートしています。 Python 2.5+では、このタイプが呼び出されます long
とは別にです int
タイプですが、インタープリターはより適切な方を自動的に使用します。 Python 3.0+で、 int
タイプは完全に削除されました。
ただし、これは単なる実装の詳細です。バージョン2.5以上がある限り、標準的な数学操作を実行するだけで、32ビット数学の境界を超える任意の数字は自動的に(および透過的に)ビグノムに変換されます。
すべてのgoryの詳細を見つけることができます PEP 0237.
他のヒント
Pythonサポート arbitrarily意的に 大きい 整数 当然:
例:
>>> 10**1000 100000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000
たとえば、巨大な整数値、FIB(4000000)を入手することもできます。
しかし、それでもそうです いいえ (今のところ)は、任意に大きいものをサポートしています 浮く !!
大きな大きなフロートが必要な場合は、小数点モジュールをチェックしてください。これらの目的に使用する例があります。 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