Programming

파이썬에서 매우 많은 수의 처리

procodes 2020. 7. 19. 17:20
반응형

파이썬에서 매우 많은 수의 처리


파이썬에서 빠른 포커 핸드 평가를 고려하고 있습니다. 프로세스 속도를 높이는 한 가지 방법은 모든 카드 얼굴과 양복을 소수로 표현하고 손을 표현하기 위해 함께 곱하는 것입니다. 오순절 :

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로 균등하게 나눕니다. 네 왕이있는 손은 59 ^ 4 등으로 균등하게 나눕니다.

문제는 AcAdAhAsKdKhKs와 같은 7 장의 카드 핸드가 약 62.7 조의 해시 값을 가지며 내부적으로 표현하는 데 32 비트 이상이 소요된다는 것입니다. 파이썬에 산술 연산을 수행 할 수있는 많은 수의 파이썬을 저장하는 방법이 있습니까?


파이썬은 "큰 숫자"정수 타입을 지원하는데, 이것은 임의로 많은 수의 숫자를 사용할 수 있습니다. Python 2.5 이상에서는이 유형이 호출 long되고 유형 과 별개 int이지만 인터프리터는 더 적합한 것을 자동으로 사용합니다. Python 3.0 이상에서는 int유형이 완전히 삭제되었습니다.

2.5 이상 버전을 사용하는 한 표준 수학 연산 만 수행하면 32 비트 수학의 경계를 초과하는 숫자는 자동으로 (투명하게) 큰 숫자로 변환됩니다.

모든 까다로운 세부 사항은 PEP 0237 에서 찾을 수 있습니다 .


파이썬은 자연스럽게 임의의정수를 지원합니다 .

예:

>>>10 ** 1000 100000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000

예를 들어 fib (4000000)과 같은 거대한 정수 값을 얻을 수도 있습니다.

그러나 여전히 그것은 (현재) 임의로 큰 플로트를 지원 하지 않습니다 !

하나의 크고 큰 float이 필요한 경우 십진 모듈을 확인하십시오. 이러한 foruns에 대한 사용 예가 있습니다 : OverflowError : (34, 'Result too large')

또 다른 참조 : http://docs.python.org/2/library/decimal.html

속도 향상이 필요한 경우 gmpy 모듈을 사용할 수도 있습니다 (관심이있을 수 있음). 코드에서 큰 숫자 처리

또 다른 참조 : https://code.google.com/p/gmpy/


당신은 그것의 재미를 위해 이것을 할 수 있지만, 그 외에는 좋은 생각이 아닙니다. 내가 생각할 수있는 것은 속도가 빨라지지 않습니다.

  • 카드를 손에 넣는 것은 배열에 액세스하는 것보다 훨씬 비싼 정수 팩터링 작업입니다.

  • 카드를 추가하면 곱셈과 큰 여러 단어로 된 카드 분할이 제거되므로 목록에서 요소를 추가하거나 제거하는 것보다 비용이 많이 듭니다.

  • 손의 실제 숫자 값은 아무 것도 알려주지 않습니다. 소수를 비교하고 포커 규칙을 따라 두 손을 비교해야합니다. 그러한 손에 대한 h1 <h2는 아무것도 의미하지 않습니다.


파이썬은 자연스럽게 임의의 큰 정수를 지원합니다.

In [1]: 59**3*61**4*2*3*5*7*3*5*7
Out[1]: 62702371781194950
In [2]: _ % 61**4
Out[2]: 0

참고 URL : https://stackoverflow.com/questions/538551/handling-very-large-numbers-in-python

반응형