blob: cb18ccbd8774ab3502cb8c68eb90c34818965243 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
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
|