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]
이것은 각각의 손에 숫자 값을 줄 것입니다. 모듈로를 통해 손에 얼마나 많은 왕이 있는지 또는 하트가 몇 개인지 알 수 있습니다.예를 들어, 다섯 개 이상의 곤봉이 있는 손은 2^5로 균등하게 나뉘고, 네 명의 왕이 있는 손은 59^4로 균등하게 나누었습니다.
문제는 AcAdAhAsKdKhKs와 같은 7개의 카드 핸드가 약 62.7,000조의 해시 값을 가지고 있으며, 이는 내부적으로 표현하는 데 32비트 이상이 필요하다는 것입니다.그렇게 큰 숫자를 파이썬에 저장하여 산술 연산을 수행할 수 있는 방법이 있습니까?
Python은 임의로 큰 숫자로 작동할 수 있는 "bignum" 정수 유형을 지원합니다.Python 2.5+에서는 이 유형을long그리고 그것과 분리되어 있습니다.int하지만 인터프리터는 더 적절한 것을 자동으로 사용합니다.Python 3.0+에서는int유형이 완전히 삭제되었습니다.
버전 2.5 이상이 설치되어 있는 한 표준 수학 연산을 수행하면 32비트 수학의 경계를 초과하는 숫자는 자동으로 (투명하게) 빅넘으로 변환됩니다.
PEP 0237에서 모든 세부 사항을 확인할 수 있습니다.
Python은 임의의 큰 정수를 자연스럽게 지원합니다.
예:
>>> 10**1000
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
예를 들어 큰 정수 값인 fib(4000000)를 얻을 수도 있습니다.
하지만 여전히 (현재로서는) 임의로 큰 플로트를 지원하지 않습니다!!
크고 큰 플로트가 필요한 경우 십진수 모듈을 확인합니다.이 사이트의 사용 예는 다음과 같습니다.OverflowError: (34, '결과가 너무 큼')
다른 기준: 9.4. 소수점 — 소수점 고정 및 부동 소수점 산술
속도 향상이 필요한 경우 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
파이썬 통역사가 처리해 드릴 겁니다.작업(+, -, *, /)을 수행하기만 하면 정상적으로 작동합니다.
그int값은 무제한입니다.
나눗셈을 할 때는 조심하세요.은 기적으로할다변환로됩니다으음으로 바뀝니다.float,그렇지만float이처럼 큰 숫자는 지원하지 않습니다.다음과 같은 오류 메시지가 표시되는 경우float이처럼 큰 숫자를 지원하지 않습니다. 즉, 백분율이 너무 커서 저장할 수 없음을 의미합니다.float디비전(floor division)을 //).
는 "점수뒤에오모소무을다시니합점수든는소다무니시합▁be▁it▁will을"가 됩니다. 이렇게 하면 결과는 다음과 같습니다.int그래서 당신은 큰 숫자의 결과를 얻을 수 있습니다.
>>>10//3
3
>>>10//4
2
왜 이런 일을 하려고 합니까?만약 당신이 딕터 목록 대신에 하나의 인코딩된 값으로 손을 저장해야 한다면 소수의 곱 대신 비트 문자열을 사용하세요.곱셈 및 소수 인수 분해가 느립니다.
각 카드를 2의 거듭제곱(1, 2, 4, 8, 16 등)으로 인코딩합니다.은 추가수있다니습할카드가 있는 할 수 .hand |= card은 당은카드확수있다니습인할로 카드를 할 수 .if hand & card > 0.
언급URL : https://stackoverflow.com/questions/538551/handling-very-large-numbers-in-python
'codememo' 카테고리의 다른 글
| ASP.NET 5 MVC 6(vNext)에서 ID에 대한 암호 규칙을 정의하려면 어떻게 해야 합니까? (0) | 2023.06.17 |
|---|---|
| ( )=>반응의 차이는 무엇입니까?FC 및 ( )=>JSX.요소 (0) | 2023.06.17 |
| 단순 대화상자로 Python에서 파일 선택 (0) | 2023.06.17 |
| TokenRefresh()의 Firebase가 호출되지 않았습니다. (0) | 2023.06.17 |
| 상대 경로(리팩터링 메서드)에서 절대 URL 가져오기 (0) | 2023.06.17 |