| # | |
| # These tests require gmpy and test the limits of the 32-bit build. The | |
| # limits of the 64-bit build are so large that they cannot be tested | |
| # on accessible hardware. | |
| # | |
| import sys | |
| from decimal import * | |
| from gmpy import mpz | |
| _PyHASH_MODULUS = sys.hash_info.modulus | |
| # hash values to use for positive and negative infinities, and nans | |
| _PyHASH_INF = sys.hash_info.inf | |
| _PyHASH_NAN = sys.hash_info.nan | |
| # _PyHASH_10INV is the inverse of 10 modulo the prime _PyHASH_MODULUS | |
| _PyHASH_10INV = pow(10, _PyHASH_MODULUS - 2, _PyHASH_MODULUS) | |
| def xhash(coeff, exp): | |
| sign = 1 | |
| if coeff < 0: | |
| sign = -1 | |
| coeff = -coeff | |
| if exp >= 0: | |
| exp_hash = pow(10, exp, _PyHASH_MODULUS) | |
| else: | |
| exp_hash = pow(_PyHASH_10INV, -exp, _PyHASH_MODULUS) | |
| hash_ = coeff * exp_hash % _PyHASH_MODULUS | |
| ans = hash_ if sign == 1 else -hash_ | |
| return -2 if ans == -1 else ans | |
| x = mpz(10) ** 425000000 - 1 | |
| coeff = int(x) | |
| d = Decimal('9' * 425000000 + 'e-849999999') | |
| h1 = xhash(coeff, -849999999) | |
| h2 = hash(d) | |
| assert h2 == h1 |