cdef extern from *: ctypedef long long int128_t "__int128_t" ctypedef unsigned long long uint128_t "__uint128_t" def bigint(x): print(str(x).rstrip('L')) def unsigned_conversion(x): """ >>> bigint(unsigned_conversion(0)) 0 >>> bigint(unsigned_conversion(2)) 2 >>> unsigned_conversion(-2) # doctest: +ELLIPSIS Traceback (most recent call last): OverflowError: can't convert negative value to ...uint128_t >>> unsigned_conversion(-2**120) # doctest: +ELLIPSIS Traceback (most recent call last): OverflowError: can't convert negative value to ...uint128_t >>> unsigned_conversion(-2**127) # doctest: +ELLIPSIS Traceback (most recent call last): OverflowError: can't convert negative value to ...uint128_t >>> unsigned_conversion(-2**128) # doctest: +ELLIPSIS Traceback (most recent call last): OverflowError: can't convert negative value to ...uint128_t >>> bigint(unsigned_conversion(2**20)) 1048576 >>> bigint(unsigned_conversion(2**30-1)) 1073741823 >>> bigint(unsigned_conversion(2**30)) 1073741824 >>> bigint(unsigned_conversion(2**30+1)) 1073741825 >>> bigint(2**60) 1152921504606846976 >>> bigint(unsigned_conversion(2**60-1)) 1152921504606846975 >>> bigint(unsigned_conversion(2**60)) 1152921504606846976 >>> bigint(unsigned_conversion(2**60+1)) 1152921504606846977 >>> bigint(2**64) 18446744073709551616 >>> bigint(unsigned_conversion(2**64)) 18446744073709551616 >>> bigint(2**120) 1329227995784915872903807060280344576 >>> bigint(unsigned_conversion(2**120)) 1329227995784915872903807060280344576 >>> bigint(2**128-1) 340282366920938463463374607431768211455 >>> bigint(unsigned_conversion(2**128-1)) 340282366920938463463374607431768211455 >>> bigint(unsigned_conversion(2**128)) # doctest: +ELLIPSIS Traceback (most recent call last): OverflowError: ... too big to convert """ cdef uint128_t n = x return n def signed_conversion(x): """ >>> bigint(signed_conversion(0)) 0 >>> bigint(signed_conversion(2)) 2 >>> bigint(signed_conversion(-2)) -2 >>> bigint(signed_conversion(2**20)) 1048576 >>> bigint(signed_conversion(2**32)) 4294967296 >>> bigint(2**64) 18446744073709551616 >>> bigint(signed_conversion(2**64)) 18446744073709551616 >>> bigint(signed_conversion(-2**64)) -18446744073709551616 >>> bigint(2**118) 332306998946228968225951765070086144 >>> bigint(signed_conversion(2**118)) 332306998946228968225951765070086144 >>> bigint(signed_conversion(-2**118)) -332306998946228968225951765070086144 >>> bigint(2**120) 1329227995784915872903807060280344576 >>> bigint(signed_conversion(2**120)) 1329227995784915872903807060280344576 >>> bigint(signed_conversion(-2**120)) -1329227995784915872903807060280344576 >>> bigint(2**127-1) 170141183460469231731687303715884105727 >>> bigint(signed_conversion(2**127-2)) 170141183460469231731687303715884105726 >>> bigint(signed_conversion(2**127-1)) 170141183460469231731687303715884105727 >>> bigint(signed_conversion(2**127)) # doctest: +ELLIPSIS Traceback (most recent call last): OverflowError: ... too big to convert >>> bigint(signed_conversion(-2**127)) -170141183460469231731687303715884105728 >>> bigint(signed_conversion(-2**127-1)) # doctest: +ELLIPSIS Traceback (most recent call last): OverflowError: ... too big to convert """ cdef int128_t n = x return n