mirror of
				https://github.com/python/cpython.git
				synced 2025-10-24 18:33:49 +00:00 
			
		
		
		
	
		
			
	
	
		
			43 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			43 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | # | ||
|  | # 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 |