mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +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
							 |