blob: 91edf62b7a52aecea2e572a9a137b3a762d18ed0 [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003/* Long (arbitrary precision) integer object implementation */
4
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00005/* XXX The functional organization of this file is terrible */
6
Guido van Rossumc0b618a1997-05-02 03:12:38 +00007#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00008#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00009
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000010#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000011
Tim Peters5af4e6c2002-08-12 02:31:19 +000012/* For long multiplication, use the O(N**2) school algorithm unless
13 * both operands contain more than KARATSUBA_CUTOFF digits (this
Christian Heimes7f39c9f2008-01-25 12:18:43 +000014 * being an internal Python long digit, in base PyLong_BASE).
Tim Peters5af4e6c2002-08-12 02:31:19 +000015 */
Tim Peters0973b992004-08-29 22:16:50 +000016#define KARATSUBA_CUTOFF 70
17#define KARATSUBA_SQUARE_CUTOFF (2 * KARATSUBA_CUTOFF)
Tim Peters5af4e6c2002-08-12 02:31:19 +000018
Tim Peters47e52ee2004-08-30 02:44:38 +000019/* For exponentiation, use the binary left-to-right algorithm
20 * unless the exponent contains more than FIVEARY_CUTOFF digits.
21 * In that case, do 5 bits at a time. The potential drawback is that
22 * a table of 2**5 intermediate results is computed.
23 */
24#define FIVEARY_CUTOFF 8
25
Guido van Rossume32e0141992-01-19 16:31:05 +000026#define ABS(x) ((x) < 0 ? -(x) : (x))
27
Tim Peters5af4e6c2002-08-12 02:31:19 +000028#undef MIN
29#undef MAX
30#define MAX(x, y) ((x) < (y) ? (y) : (x))
31#define MIN(x, y) ((x) > (y) ? (y) : (x))
32
Guido van Rossume32e0141992-01-19 16:31:05 +000033/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000034static PyLongObject *long_normalize(PyLongObject *);
35static PyLongObject *mul1(PyLongObject *, wdigit);
36static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000037static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Guido van Rossume32e0141992-01-19 16:31:05 +000038
Guido van Rossumc0b618a1997-05-02 03:12:38 +000039#define SIGCHECK(PyTryBlock) \
Skip Montanarod581d772002-09-03 20:10:45 +000040 if (--_Py_Ticker < 0) { \
41 _Py_Ticker = _Py_CheckInterval; \
Tim Petersd89fc222006-05-25 22:28:46 +000042 if (PyErr_CheckSignals()) PyTryBlock \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000043 }
44
Guido van Rossumedcc38a1991-05-05 20:09:44 +000045/* Normalize (remove leading zeros from) a long int object.
46 Doesn't attempt to free the storage--in most cases, due to the nature
47 of the algorithms used, this could save at most be one word anyway. */
48
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000050long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000051{
Christian Heimese93237d2007-12-19 02:37:44 +000052 Py_ssize_t j = ABS(Py_SIZE(v));
Martin v. Löwis18e16552006-02-15 17:27:45 +000053 Py_ssize_t i = j;
Tim Peters5af4e6c2002-08-12 02:31:19 +000054
Guido van Rossumedcc38a1991-05-05 20:09:44 +000055 while (i > 0 && v->ob_digit[i-1] == 0)
56 --i;
57 if (i != j)
Christian Heimese93237d2007-12-19 02:37:44 +000058 Py_SIZE(v) = (Py_SIZE(v) < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000059 return v;
60}
61
62/* Allocate a new long int object with size digits.
63 Return NULL and set exception if we run out of memory. */
64
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065PyLongObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000066_PyLong_New(Py_ssize_t size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000067{
Neal Norwitzc6a989a2006-05-10 06:57:58 +000068 if (size > PY_SSIZE_T_MAX) {
Martin v. Löwis18e16552006-02-15 17:27:45 +000069 PyErr_NoMemory();
70 return NULL;
71 }
Christian Heimes4956d2b2008-01-18 19:12:56 +000072 /* coverity[ampersand_in_size] */
Neal Norwitze7d8be82008-07-31 17:17:14 +000073 /* XXX(nnorwitz): This can overflow --
74 PyObject_NEW_VAR / _PyObject_VAR_SIZE need to detect overflow */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000076}
77
Tim Peters64b5ce32001-09-10 20:52:51 +000078PyObject *
79_PyLong_Copy(PyLongObject *src)
80{
81 PyLongObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +000082 Py_ssize_t i;
Tim Peters64b5ce32001-09-10 20:52:51 +000083
84 assert(src != NULL);
85 i = src->ob_size;
86 if (i < 0)
87 i = -(i);
88 result = _PyLong_New(i);
89 if (result != NULL) {
Tim Peters5329cdb2002-03-02 04:18:04 +000090 result->ob_size = src->ob_size;
Tim Peters64b5ce32001-09-10 20:52:51 +000091 while (--i >= 0)
92 result->ob_digit[i] = src->ob_digit[i];
93 }
94 return (PyObject *)result;
95}
96
Guido van Rossumedcc38a1991-05-05 20:09:44 +000097/* Create a new long int object from a C long int */
98
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000100PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000101{
Tim Petersce9de2f2001-06-14 04:56:19 +0000102 PyLongObject *v;
Mark Dickinson27a63252008-04-15 20:51:18 +0000103 unsigned long abs_ival;
Tim Petersce9de2f2001-06-14 04:56:19 +0000104 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
105 int ndigits = 0;
106 int negative = 0;
107
108 if (ival < 0) {
Mark Dickinson27a63252008-04-15 20:51:18 +0000109 /* if LONG_MIN == -LONG_MAX-1 (true on most platforms) then
110 ANSI C says that the result of -ival is undefined when ival
111 == LONG_MIN. Hence the following workaround. */
112 abs_ival = (unsigned long)(-1-ival) + 1;
Tim Petersce9de2f2001-06-14 04:56:19 +0000113 negative = 1;
114 }
Mark Dickinson27a63252008-04-15 20:51:18 +0000115 else {
116 abs_ival = (unsigned long)ival;
117 }
Tim Petersce9de2f2001-06-14 04:56:19 +0000118
119 /* Count the number of Python digits.
120 We used to pick 5 ("big enough for anything"), but that's a
121 waste of time and space given that 5*15 = 75 bits are rarely
122 needed. */
Mark Dickinson27a63252008-04-15 20:51:18 +0000123 t = abs_ival;
Tim Petersce9de2f2001-06-14 04:56:19 +0000124 while (t) {
125 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000126 t >>= PyLong_SHIFT;
Tim Petersce9de2f2001-06-14 04:56:19 +0000127 }
128 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000129 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000130 digit *p = v->ob_digit;
131 v->ob_size = negative ? -ndigits : ndigits;
Mark Dickinson27a63252008-04-15 20:51:18 +0000132 t = abs_ival;
Tim Petersce9de2f2001-06-14 04:56:19 +0000133 while (t) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000134 *p++ = (digit)(t & PyLong_MASK);
135 t >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000136 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000137 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000139}
140
Guido van Rossum53756b11997-01-03 17:14:46 +0000141/* Create a new long int object from a C unsigned long int */
142
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000144PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000145{
Tim Petersce9de2f2001-06-14 04:56:19 +0000146 PyLongObject *v;
147 unsigned long t;
148 int ndigits = 0;
149
150 /* Count the number of Python digits. */
151 t = (unsigned long)ival;
152 while (t) {
153 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000154 t >>= PyLong_SHIFT;
Tim Petersce9de2f2001-06-14 04:56:19 +0000155 }
156 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000157 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000158 digit *p = v->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +0000159 Py_SIZE(v) = ndigits;
Tim Petersce9de2f2001-06-14 04:56:19 +0000160 while (ival) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000161 *p++ = (digit)(ival & PyLong_MASK);
162 ival >>= PyLong_SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000163 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000164 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000166}
167
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000168/* Create a new long int object from a C double */
169
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000172{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000174 double frac;
175 int i, ndig, expo, neg;
176 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000177 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000178 PyErr_SetString(PyExc_OverflowError,
Mark Dickinsonb6467572008-08-04 21:30:09 +0000179 "cannot convert float infinity to integer");
Guido van Rossum1a23c241999-09-27 17:11:52 +0000180 return NULL;
181 }
Christian Heimes8267d1d2008-01-04 00:37:34 +0000182 if (Py_IS_NAN(dval)) {
Mark Dickinsonb6467572008-08-04 21:30:09 +0000183 PyErr_SetString(PyExc_ValueError,
184 "cannot convert float NaN to integer");
185 return NULL;
Christian Heimes8267d1d2008-01-04 00:37:34 +0000186 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000187 if (dval < 0.0) {
188 neg = 1;
189 dval = -dval;
190 }
191 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
192 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 return PyLong_FromLong(0L);
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000194 ndig = (expo-1) / PyLong_SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000196 if (v == NULL)
197 return NULL;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000198 frac = ldexp(frac, (expo-1) % PyLong_SHIFT + 1);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000199 for (i = ndig; --i >= 0; ) {
200 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000201 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000202 frac = frac - (double)bits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000203 frac = ldexp(frac, PyLong_SHIFT);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000204 }
205 if (neg)
Christian Heimese93237d2007-12-19 02:37:44 +0000206 Py_SIZE(v) = -(Py_SIZE(v));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000208}
209
Armin Rigo7ccbca92006-10-04 12:17:45 +0000210/* Checking for overflow in PyLong_AsLong is a PITA since C doesn't define
211 * anything about what happens when a signed integer operation overflows,
212 * and some compilers think they're doing you a favor by being "clever"
213 * then. The bit pattern for the largest postive signed long is
214 * (unsigned long)LONG_MAX, and for the smallest negative signed long
215 * it is abs(LONG_MIN), which we could write -(unsigned long)LONG_MIN.
216 * However, some other compilers warn about applying unary minus to an
217 * unsigned operand. Hence the weird "0-".
218 */
219#define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN)
220#define PY_ABS_SSIZE_T_MIN (0-(size_t)PY_SSIZE_T_MIN)
221
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000222/* Get a C long int from a long int object.
223 Returns -1 and sets an error condition if overflow occurs. */
224
225long
Tim Peters9f688bf2000-07-07 15:53:28 +0000226PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000227{
Guido van Rossumf7531811998-05-26 14:33:37 +0000228 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000230 unsigned long x, prev;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000231 Py_ssize_t i;
232 int sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000233
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 if (vv == NULL || !PyLong_Check(vv)) {
Guido van Rossum7e35d572001-09-15 03:14:32 +0000235 if (vv != NULL && PyInt_Check(vv))
236 return PyInt_AsLong(vv);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000238 return -1;
239 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000241 i = v->ob_size;
242 sign = 1;
243 x = 0;
244 if (i < 0) {
245 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000246 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000247 }
248 while (--i >= 0) {
249 prev = x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000250 x = (x << PyLong_SHIFT) + v->ob_digit[i];
251 if ((x >> PyLong_SHIFT) != prev)
Guido van Rossumf7531811998-05-26 14:33:37 +0000252 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000253 }
Armin Rigo7ccbca92006-10-04 12:17:45 +0000254 /* Haven't lost any bits, but casting to long requires extra care
255 * (see comment above).
256 */
257 if (x <= (unsigned long)LONG_MAX) {
258 return (long)x * sign;
259 }
260 else if (sign < 0 && x == PY_ABS_LONG_MIN) {
261 return LONG_MIN;
262 }
263 /* else overflow */
Guido van Rossumf7531811998-05-26 14:33:37 +0000264
265 overflow:
266 PyErr_SetString(PyExc_OverflowError,
Skip Montanarobafedec2001-09-13 19:05:30 +0000267 "long int too large to convert to int");
Guido van Rossumf7531811998-05-26 14:33:37 +0000268 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000269}
270
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000271/* Get a Py_ssize_t from a long int object.
272 Returns -1 and sets an error condition if overflow occurs. */
273
274Py_ssize_t
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000275PyLong_AsSsize_t(PyObject *vv) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000276 register PyLongObject *v;
277 size_t x, prev;
278 Py_ssize_t i;
279 int sign;
280
281 if (vv == NULL || !PyLong_Check(vv)) {
282 PyErr_BadInternalCall();
283 return -1;
284 }
285 v = (PyLongObject *)vv;
286 i = v->ob_size;
287 sign = 1;
288 x = 0;
289 if (i < 0) {
290 sign = -1;
291 i = -(i);
292 }
293 while (--i >= 0) {
294 prev = x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000295 x = (x << PyLong_SHIFT) + v->ob_digit[i];
296 if ((x >> PyLong_SHIFT) != prev)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000297 goto overflow;
298 }
Armin Rigo7ccbca92006-10-04 12:17:45 +0000299 /* Haven't lost any bits, but casting to a signed type requires
300 * extra care (see comment above).
Martin v. Löwis18e16552006-02-15 17:27:45 +0000301 */
Armin Rigo7ccbca92006-10-04 12:17:45 +0000302 if (x <= (size_t)PY_SSIZE_T_MAX) {
303 return (Py_ssize_t)x * sign;
304 }
305 else if (sign < 0 && x == PY_ABS_SSIZE_T_MIN) {
306 return PY_SSIZE_T_MIN;
307 }
308 /* else overflow */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000309
310 overflow:
311 PyErr_SetString(PyExc_OverflowError,
312 "long int too large to convert to int");
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000313 return -1;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000314}
315
Guido van Rossumd8c80482002-08-13 00:24:58 +0000316/* Get a C unsigned long int from a long int object.
Guido van Rossum53756b11997-01-03 17:14:46 +0000317 Returns -1 and sets an error condition if overflow occurs. */
318
319unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000320PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000321{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000323 unsigned long x, prev;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324 Py_ssize_t i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000325
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326 if (vv == NULL || !PyLong_Check(vv)) {
Martin v. Löwis729d47d2004-09-20 06:17:46 +0000327 if (vv != NULL && PyInt_Check(vv)) {
328 long val = PyInt_AsLong(vv);
329 if (val < 0) {
330 PyErr_SetString(PyExc_OverflowError,
331 "can't convert negative value to unsigned long");
332 return (unsigned long) -1;
333 }
334 return val;
335 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000337 return (unsigned long) -1;
338 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 v = (PyLongObject *)vv;
Christian Heimese93237d2007-12-19 02:37:44 +0000340 i = Py_SIZE(v);
Guido van Rossum53756b11997-01-03 17:14:46 +0000341 x = 0;
342 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000344 "can't convert negative value to unsigned long");
345 return (unsigned long) -1;
346 }
347 while (--i >= 0) {
348 prev = x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000349 x = (x << PyLong_SHIFT) + v->ob_digit[i];
350 if ((x >> PyLong_SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000352 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000353 return (unsigned long) -1;
354 }
355 }
356 return x;
357}
358
Thomas Hellera4ea6032003-04-17 18:55:45 +0000359/* Get a C unsigned long int from a long int object, ignoring the high bits.
360 Returns -1 and sets an error condition if an error occurs. */
361
362unsigned long
363PyLong_AsUnsignedLongMask(PyObject *vv)
364{
365 register PyLongObject *v;
366 unsigned long x;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000367 Py_ssize_t i;
368 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000369
370 if (vv == NULL || !PyLong_Check(vv)) {
Martin v. Löwis729d47d2004-09-20 06:17:46 +0000371 if (vv != NULL && PyInt_Check(vv))
372 return PyInt_AsUnsignedLongMask(vv);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000373 PyErr_BadInternalCall();
374 return (unsigned long) -1;
375 }
376 v = (PyLongObject *)vv;
377 i = v->ob_size;
378 sign = 1;
379 x = 0;
380 if (i < 0) {
381 sign = -1;
382 i = -i;
383 }
384 while (--i >= 0) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000385 x = (x << PyLong_SHIFT) + v->ob_digit[i];
Thomas Hellera4ea6032003-04-17 18:55:45 +0000386 }
387 return x * sign;
388}
389
Tim Peters5b8132f2003-01-31 15:52:05 +0000390int
391_PyLong_Sign(PyObject *vv)
392{
393 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000394
395 assert(v != NULL);
396 assert(PyLong_Check(v));
Tim Peters5b8132f2003-01-31 15:52:05 +0000397
Christian Heimese93237d2007-12-19 02:37:44 +0000398 return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1);
Tim Peters5b8132f2003-01-31 15:52:05 +0000399}
400
Tim Petersbaefd9e2003-01-28 20:37:45 +0000401size_t
402_PyLong_NumBits(PyObject *vv)
403{
404 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000405 size_t result = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000406 Py_ssize_t ndigits;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000407
408 assert(v != NULL);
409 assert(PyLong_Check(v));
Christian Heimese93237d2007-12-19 02:37:44 +0000410 ndigits = ABS(Py_SIZE(v));
Tim Petersbaefd9e2003-01-28 20:37:45 +0000411 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
412 if (ndigits > 0) {
Tim Petersbaefd9e2003-01-28 20:37:45 +0000413 digit msd = v->ob_digit[ndigits - 1];
414
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000415 result = (ndigits - 1) * PyLong_SHIFT;
416 if (result / PyLong_SHIFT != (size_t)(ndigits - 1))
Tim Petersbaefd9e2003-01-28 20:37:45 +0000417 goto Overflow;
418 do {
419 ++result;
420 if (result == 0)
421 goto Overflow;
422 msd >>= 1;
423 } while (msd);
424 }
425 return result;
426
427Overflow:
428 PyErr_SetString(PyExc_OverflowError, "long has too many bits "
429 "to express in a platform size_t");
430 return (size_t)-1;
431}
432
Tim Peters2a9b3672001-06-11 21:23:58 +0000433PyObject *
434_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
435 int little_endian, int is_signed)
436{
437 const unsigned char* pstartbyte;/* LSB of bytes */
438 int incr; /* direction to move pstartbyte */
439 const unsigned char* pendbyte; /* MSB of bytes */
440 size_t numsignificantbytes; /* number of bytes that matter */
441 size_t ndigits; /* number of Python long digits */
442 PyLongObject* v; /* result */
443 int idigit = 0; /* next free index in v->ob_digit */
444
445 if (n == 0)
446 return PyLong_FromLong(0L);
447
448 if (little_endian) {
449 pstartbyte = bytes;
450 pendbyte = bytes + n - 1;
451 incr = 1;
452 }
453 else {
454 pstartbyte = bytes + n - 1;
455 pendbyte = bytes;
456 incr = -1;
457 }
458
459 if (is_signed)
460 is_signed = *pendbyte >= 0x80;
461
462 /* Compute numsignificantbytes. This consists of finding the most
463 significant byte. Leading 0 bytes are insignficant if the number
464 is positive, and leading 0xff bytes if negative. */
465 {
466 size_t i;
467 const unsigned char* p = pendbyte;
468 const int pincr = -incr; /* search MSB to LSB */
469 const unsigned char insignficant = is_signed ? 0xff : 0x00;
470
471 for (i = 0; i < n; ++i, p += pincr) {
472 if (*p != insignficant)
473 break;
474 }
475 numsignificantbytes = n - i;
476 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
477 actually has 2 significant bytes. OTOH, 0xff0001 ==
478 -0x00ffff, so we wouldn't *need* to bump it there; but we
479 do for 0xffff = -0x0001. To be safe without bothering to
480 check every case, bump it regardless. */
481 if (is_signed && numsignificantbytes < n)
482 ++numsignificantbytes;
483 }
484
485 /* How many Python long digits do we need? We have
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000486 8*numsignificantbytes bits, and each Python long digit has PyLong_SHIFT
Tim Peters2a9b3672001-06-11 21:23:58 +0000487 bits, so it's the ceiling of the quotient. */
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000488 ndigits = (numsignificantbytes * 8 + PyLong_SHIFT - 1) / PyLong_SHIFT;
Tim Peters2a9b3672001-06-11 21:23:58 +0000489 if (ndigits > (size_t)INT_MAX)
490 return PyErr_NoMemory();
491 v = _PyLong_New((int)ndigits);
492 if (v == NULL)
493 return NULL;
494
495 /* Copy the bits over. The tricky parts are computing 2's-comp on
496 the fly for signed numbers, and dealing with the mismatch between
497 8-bit bytes and (probably) 15-bit Python digits.*/
498 {
499 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000500 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000501 twodigits accum = 0; /* sliding register */
502 unsigned int accumbits = 0; /* number of bits in accum */
503 const unsigned char* p = pstartbyte;
504
505 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000506 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000507 /* Compute correction for 2's comp, if needed. */
508 if (is_signed) {
509 thisbyte = (0xff ^ thisbyte) + carry;
510 carry = thisbyte >> 8;
511 thisbyte &= 0xff;
512 }
513 /* Because we're going LSB to MSB, thisbyte is
514 more significant than what's already in accum,
515 so needs to be prepended to accum. */
Mark Dickinson76eb7892009-01-24 15:42:34 +0000516 accum |= (twodigits)thisbyte << accumbits;
Tim Peters2a9b3672001-06-11 21:23:58 +0000517 accumbits += 8;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000518 if (accumbits >= PyLong_SHIFT) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000519 /* There's enough to fill a Python digit. */
520 assert(idigit < (int)ndigits);
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000521 v->ob_digit[idigit] = (digit)(accum & PyLong_MASK);
Tim Peters2a9b3672001-06-11 21:23:58 +0000522 ++idigit;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000523 accum >>= PyLong_SHIFT;
524 accumbits -= PyLong_SHIFT;
525 assert(accumbits < PyLong_SHIFT);
Tim Peters2a9b3672001-06-11 21:23:58 +0000526 }
527 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000528 assert(accumbits < PyLong_SHIFT);
Tim Peters2a9b3672001-06-11 21:23:58 +0000529 if (accumbits) {
530 assert(idigit < (int)ndigits);
531 v->ob_digit[idigit] = (digit)accum;
532 ++idigit;
533 }
534 }
535
Christian Heimese93237d2007-12-19 02:37:44 +0000536 Py_SIZE(v) = is_signed ? -idigit : idigit;
Tim Peters2a9b3672001-06-11 21:23:58 +0000537 return (PyObject *)long_normalize(v);
538}
539
540int
541_PyLong_AsByteArray(PyLongObject* v,
542 unsigned char* bytes, size_t n,
543 int little_endian, int is_signed)
544{
Mark Dickinson76eb7892009-01-24 15:42:34 +0000545 Py_ssize_t i; /* index into v->ob_digit */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000546 Py_ssize_t ndigits; /* |v->ob_size| */
Tim Peters2a9b3672001-06-11 21:23:58 +0000547 twodigits accum; /* sliding register */
548 unsigned int accumbits; /* # bits in accum */
549 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
Mark Dickinsone72bab32009-01-25 22:20:39 +0000550 digit carry; /* for computing 2's-comp */
Tim Peters2a9b3672001-06-11 21:23:58 +0000551 size_t j; /* # bytes filled */
552 unsigned char* p; /* pointer to next byte in bytes */
553 int pincr; /* direction to move p */
554
555 assert(v != NULL && PyLong_Check(v));
556
Christian Heimese93237d2007-12-19 02:37:44 +0000557 if (Py_SIZE(v) < 0) {
558 ndigits = -(Py_SIZE(v));
Tim Peters2a9b3672001-06-11 21:23:58 +0000559 if (!is_signed) {
560 PyErr_SetString(PyExc_TypeError,
561 "can't convert negative long to unsigned");
562 return -1;
563 }
564 do_twos_comp = 1;
565 }
566 else {
Christian Heimese93237d2007-12-19 02:37:44 +0000567 ndigits = Py_SIZE(v);
Tim Peters2a9b3672001-06-11 21:23:58 +0000568 do_twos_comp = 0;
569 }
570
571 if (little_endian) {
572 p = bytes;
573 pincr = 1;
574 }
575 else {
576 p = bytes + n - 1;
577 pincr = -1;
578 }
579
Tim Peters898cf852001-06-13 20:50:08 +0000580 /* Copy over all the Python digits.
581 It's crucial that every Python digit except for the MSD contribute
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000582 exactly PyLong_SHIFT bits to the total, so first assert that the long is
Tim Peters898cf852001-06-13 20:50:08 +0000583 normalized. */
584 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000585 j = 0;
586 accum = 0;
587 accumbits = 0;
588 carry = do_twos_comp ? 1 : 0;
589 for (i = 0; i < ndigits; ++i) {
Mark Dickinson76eb7892009-01-24 15:42:34 +0000590 digit thisdigit = v->ob_digit[i];
Tim Peters2a9b3672001-06-11 21:23:58 +0000591 if (do_twos_comp) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000592 thisdigit = (thisdigit ^ PyLong_MASK) + carry;
593 carry = thisdigit >> PyLong_SHIFT;
594 thisdigit &= PyLong_MASK;
Tim Peters2a9b3672001-06-11 21:23:58 +0000595 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000596 /* Because we're going LSB to MSB, thisdigit is more
597 significant than what's already in accum, so needs to be
598 prepended to accum. */
Mark Dickinson76eb7892009-01-24 15:42:34 +0000599 accum |= (twodigits)thisdigit << accumbits;
Tim Peters8bc84b42001-06-12 19:17:03 +0000600
Tim Petersede05092001-06-14 08:53:38 +0000601 /* The most-significant digit may be (probably is) at least
602 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000603 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000604 /* Count # of sign bits -- they needn't be stored,
605 * although for signed conversion we need later to
Mark Dickinson76eb7892009-01-24 15:42:34 +0000606 * make sure at least one sign bit gets stored. */
607 digit s = do_twos_comp ? thisdigit ^ PyLong_MASK :
608 thisdigit;
609 while (s != 0) {
610 s >>= 1;
611 accumbits++;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000612 }
Tim Peters7a3bfc32001-06-12 01:22:22 +0000613 }
Mark Dickinson76eb7892009-01-24 15:42:34 +0000614 else
615 accumbits += PyLong_SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000616
Tim Peters2a9b3672001-06-11 21:23:58 +0000617 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000618 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000619 if (j >= n)
620 goto Overflow;
621 ++j;
622 *p = (unsigned char)(accum & 0xff);
623 p += pincr;
624 accumbits -= 8;
625 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000626 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000627 }
628
629 /* Store the straggler (if any). */
630 assert(accumbits < 8);
631 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000632 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000633 if (j >= n)
634 goto Overflow;
635 ++j;
636 if (do_twos_comp) {
637 /* Fill leading bits of the byte with sign bits
638 (appropriately pretending that the long had an
639 infinite supply of sign bits). */
640 accum |= (~(twodigits)0) << accumbits;
641 }
642 *p = (unsigned char)(accum & 0xff);
643 p += pincr;
644 }
Tim Peters05607ad2001-06-13 21:01:27 +0000645 else if (j == n && n > 0 && is_signed) {
646 /* The main loop filled the byte array exactly, so the code
647 just above didn't get to ensure there's a sign bit, and the
648 loop below wouldn't add one either. Make sure a sign bit
649 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000650 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000651 int sign_bit_set = msb >= 0x80;
652 assert(accumbits == 0);
653 if (sign_bit_set == do_twos_comp)
654 return 0;
655 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000656 goto Overflow;
657 }
Tim Peters05607ad2001-06-13 21:01:27 +0000658
659 /* Fill remaining bytes with copies of the sign bit. */
660 {
661 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
662 for ( ; j < n; ++j, p += pincr)
663 *p = signbyte;
664 }
665
Tim Peters2a9b3672001-06-11 21:23:58 +0000666 return 0;
667
668Overflow:
669 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
670 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000671
Tim Peters2a9b3672001-06-11 21:23:58 +0000672}
673
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000674double
675_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
676{
677/* NBITS_WANTED should be > the number of bits in a double's precision,
678 but small enough so that 2**NBITS_WANTED is within the normal double
679 range. nbitsneeded is set to 1 less than that because the most-significant
680 Python digit contains at least 1 significant bit, but we don't want to
681 bother counting them (catering to the worst case cheaply).
682
683 57 is one more than VAX-D double precision; I (Tim) don't know of a double
684 format with more precision than that; it's 1 larger so that we add in at
685 least one round bit to stand in for the ignored least-significant bits.
686*/
687#define NBITS_WANTED 57
688 PyLongObject *v;
689 double x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000690 const double multiplier = (double)(1L << PyLong_SHIFT);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000691 Py_ssize_t i;
692 int sign;
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000693 int nbitsneeded;
694
695 if (vv == NULL || !PyLong_Check(vv)) {
696 PyErr_BadInternalCall();
697 return -1;
698 }
699 v = (PyLongObject *)vv;
Christian Heimese93237d2007-12-19 02:37:44 +0000700 i = Py_SIZE(v);
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000701 sign = 1;
702 if (i < 0) {
703 sign = -1;
704 i = -(i);
705 }
706 else if (i == 0) {
707 *exponent = 0;
708 return 0.0;
709 }
710 --i;
711 x = (double)v->ob_digit[i];
712 nbitsneeded = NBITS_WANTED - 1;
713 /* Invariant: i Python digits remain unaccounted for. */
714 while (i > 0 && nbitsneeded > 0) {
715 --i;
716 x = x * multiplier + (double)v->ob_digit[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000717 nbitsneeded -= PyLong_SHIFT;
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000718 }
719 /* There are i digits we didn't shift in. Pretending they're all
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000720 zeroes, the true value is x * 2**(i*PyLong_SHIFT). */
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000721 *exponent = i;
722 assert(x > 0.0);
723 return x * sign;
724#undef NBITS_WANTED
725}
726
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000727/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000728
729double
Tim Peters9f688bf2000-07-07 15:53:28 +0000730PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000731{
Thomas Wouters553489a2006-02-01 21:32:04 +0000732 int e = -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000733 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000734
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 if (vv == NULL || !PyLong_Check(vv)) {
736 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000737 return -1;
738 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000739 x = _PyLong_AsScaledDouble(vv, &e);
740 if (x == -1.0 && PyErr_Occurred())
741 return -1.0;
Thomas Wouters553489a2006-02-01 21:32:04 +0000742 /* 'e' initialized to -1 to silence gcc-4.0.x, but it should be
743 set correctly after a successful _PyLong_AsScaledDouble() call */
744 assert(e >= 0);
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000745 if (e > INT_MAX / PyLong_SHIFT)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000746 goto overflow;
747 errno = 0;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000748 x = ldexp(x, e * PyLong_SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000749 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000750 goto overflow;
751 return x;
752
753overflow:
754 PyErr_SetString(PyExc_OverflowError,
755 "long int too large to convert to float");
756 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000757}
758
Guido van Rossum78694d91998-09-18 14:14:13 +0000759/* Create a new long (or int) object from a C pointer */
760
761PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000762PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000763{
Tim Peters70128a12001-06-16 08:48:40 +0000764#if SIZEOF_VOID_P <= SIZEOF_LONG
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000765 if ((long)p < 0)
766 return PyLong_FromUnsignedLong((unsigned long)p);
Guido van Rossum78694d91998-09-18 14:14:13 +0000767 return PyInt_FromLong((long)p);
768#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000769
Tim Peters70128a12001-06-16 08:48:40 +0000770#ifndef HAVE_LONG_LONG
771# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
772#endif
773#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000774# error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000775#endif
776 /* optimize null pointers */
777 if (p == NULL)
778 return PyInt_FromLong(0);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000779 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000780
781#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000782}
783
784/* Get a C pointer from a long object (or an int object in some cases) */
785
786void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000787PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000788{
789 /* This function will allow int or long objects. If vv is neither,
790 then the PyLong_AsLong*() functions will raise the exception:
791 PyExc_SystemError, "bad argument to internal function"
792 */
Tim Peters70128a12001-06-16 08:48:40 +0000793#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000794 long x;
795
Tim Peters70128a12001-06-16 08:48:40 +0000796 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000797 x = PyInt_AS_LONG(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000798 else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
Guido van Rossum78694d91998-09-18 14:14:13 +0000799 x = PyLong_AsLong(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000800 else
801 x = PyLong_AsUnsignedLong(vv);
Guido van Rossum78694d91998-09-18 14:14:13 +0000802#else
Tim Peters70128a12001-06-16 08:48:40 +0000803
804#ifndef HAVE_LONG_LONG
805# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
806#endif
807#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000808# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000809#endif
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000810 PY_LONG_LONG x;
Guido van Rossum78694d91998-09-18 14:14:13 +0000811
Tim Peters70128a12001-06-16 08:48:40 +0000812 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000813 x = PyInt_AS_LONG(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000814 else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
Guido van Rossum78694d91998-09-18 14:14:13 +0000815 x = PyLong_AsLongLong(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000816 else
817 x = PyLong_AsUnsignedLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000818
819#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000820
821 if (x == -1 && PyErr_Occurred())
822 return NULL;
823 return (void *)x;
824}
825
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000826#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000827
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000828/* Initial PY_LONG_LONG support by Chris Herborth (chrish@qnx.com), later
Tim Petersd1a7da62001-06-13 00:35:57 +0000829 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000830 */
831
Tim Peterscf37dfc2001-06-14 18:42:50 +0000832#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000833
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000834/* Create a new long int object from a C PY_LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000835
836PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000837PyLong_FromLongLong(PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000838{
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000839 PyLongObject *v;
Mark Dickinson27a63252008-04-15 20:51:18 +0000840 unsigned PY_LONG_LONG abs_ival;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000841 unsigned PY_LONG_LONG t; /* unsigned so >> doesn't propagate sign bit */
842 int ndigits = 0;
843 int negative = 0;
844
845 if (ival < 0) {
Mark Dickinson27a63252008-04-15 20:51:18 +0000846 /* avoid signed overflow on negation; see comments
847 in PyLong_FromLong above. */
848 abs_ival = (unsigned PY_LONG_LONG)(-1-ival) + 1;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000849 negative = 1;
850 }
Mark Dickinson27a63252008-04-15 20:51:18 +0000851 else {
852 abs_ival = (unsigned PY_LONG_LONG)ival;
853 }
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000854
855 /* Count the number of Python digits.
856 We used to pick 5 ("big enough for anything"), but that's a
857 waste of time and space given that 5*15 = 75 bits are rarely
858 needed. */
Mark Dickinson27a63252008-04-15 20:51:18 +0000859 t = abs_ival;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000860 while (t) {
861 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000862 t >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000863 }
864 v = _PyLong_New(ndigits);
865 if (v != NULL) {
866 digit *p = v->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +0000867 Py_SIZE(v) = negative ? -ndigits : ndigits;
Mark Dickinson27a63252008-04-15 20:51:18 +0000868 t = abs_ival;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000869 while (t) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000870 *p++ = (digit)(t & PyLong_MASK);
871 t >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000872 }
873 }
874 return (PyObject *)v;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000875}
876
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000877/* Create a new long int object from a C unsigned PY_LONG_LONG int. */
Tim Petersd1a7da62001-06-13 00:35:57 +0000878
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000879PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000880PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000881{
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000882 PyLongObject *v;
883 unsigned PY_LONG_LONG t;
884 int ndigits = 0;
885
886 /* Count the number of Python digits. */
887 t = (unsigned PY_LONG_LONG)ival;
888 while (t) {
889 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000890 t >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000891 }
892 v = _PyLong_New(ndigits);
893 if (v != NULL) {
894 digit *p = v->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +0000895 Py_SIZE(v) = ndigits;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000896 while (ival) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000897 *p++ = (digit)(ival & PyLong_MASK);
898 ival >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000899 }
900 }
901 return (PyObject *)v;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000902}
903
Martin v. Löwis18e16552006-02-15 17:27:45 +0000904/* Create a new long int object from a C Py_ssize_t. */
905
906PyObject *
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000907PyLong_FromSsize_t(Py_ssize_t ival)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000908{
909 Py_ssize_t bytes = ival;
910 int one = 1;
911 return _PyLong_FromByteArray(
912 (unsigned char *)&bytes,
Kristján Valur Jónssonf0303942007-05-03 20:27:03 +0000913 SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 1);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000914}
915
916/* Create a new long int object from a C size_t. */
917
918PyObject *
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000919PyLong_FromSize_t(size_t ival)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000920{
921 size_t bytes = ival;
922 int one = 1;
923 return _PyLong_FromByteArray(
924 (unsigned char *)&bytes,
925 SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0);
926}
927
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000928/* Get a C PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000929 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000930
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000931PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000932PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000933{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000934 PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +0000935 int one = 1;
936 int res;
937
Tim Petersd38b1c72001-09-30 05:09:37 +0000938 if (vv == NULL) {
939 PyErr_BadInternalCall();
940 return -1;
941 }
942 if (!PyLong_Check(vv)) {
Martin v. Löwis6ce7ed22005-03-03 12:26:35 +0000943 PyNumberMethods *nb;
944 PyObject *io;
Tim Petersd38b1c72001-09-30 05:09:37 +0000945 if (PyInt_Check(vv))
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000946 return (PY_LONG_LONG)PyInt_AsLong(vv);
Martin v. Löwis6ce7ed22005-03-03 12:26:35 +0000947 if ((nb = vv->ob_type->tp_as_number) == NULL ||
948 nb->nb_int == NULL) {
949 PyErr_SetString(PyExc_TypeError, "an integer is required");
950 return -1;
951 }
952 io = (*nb->nb_int) (vv);
953 if (io == NULL)
954 return -1;
955 if (PyInt_Check(io)) {
956 bytes = PyInt_AsLong(io);
957 Py_DECREF(io);
958 return bytes;
959 }
960 if (PyLong_Check(io)) {
961 bytes = PyLong_AsLongLong(io);
962 Py_DECREF(io);
963 return bytes;
964 }
965 Py_DECREF(io);
966 PyErr_SetString(PyExc_TypeError, "integer conversion failed");
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000967 return -1;
968 }
969
Tim Petersd1a7da62001-06-13 00:35:57 +0000970 res = _PyLong_AsByteArray(
971 (PyLongObject *)vv, (unsigned char *)&bytes,
972 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000973
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000974 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000975 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000976 return (PY_LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000977 else
978 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000979}
980
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000981/* Get a C unsigned PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000982 Return -1 and set an error if overflow occurs. */
983
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000984unsigned PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000985PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000986{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000987 unsigned PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +0000988 int one = 1;
989 int res;
990
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000991 if (vv == NULL || !PyLong_Check(vv)) {
992 PyErr_BadInternalCall();
Skip Montanaro429433b2006-04-18 00:35:43 +0000993 return (unsigned PY_LONG_LONG)-1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000994 }
995
Tim Petersd1a7da62001-06-13 00:35:57 +0000996 res = _PyLong_AsByteArray(
997 (PyLongObject *)vv, (unsigned char *)&bytes,
998 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000999
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001000 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +00001001 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001002 return (unsigned PY_LONG_LONG)res;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +00001003 else
1004 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001005}
Tim Petersd1a7da62001-06-13 00:35:57 +00001006
Thomas Hellera4ea6032003-04-17 18:55:45 +00001007/* Get a C unsigned long int from a long int object, ignoring the high bits.
1008 Returns -1 and sets an error condition if an error occurs. */
1009
1010unsigned PY_LONG_LONG
1011PyLong_AsUnsignedLongLongMask(PyObject *vv)
1012{
1013 register PyLongObject *v;
1014 unsigned PY_LONG_LONG x;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001015 Py_ssize_t i;
1016 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001017
1018 if (vv == NULL || !PyLong_Check(vv)) {
1019 PyErr_BadInternalCall();
1020 return (unsigned long) -1;
1021 }
1022 v = (PyLongObject *)vv;
1023 i = v->ob_size;
1024 sign = 1;
1025 x = 0;
1026 if (i < 0) {
1027 sign = -1;
1028 i = -i;
1029 }
1030 while (--i >= 0) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001031 x = (x << PyLong_SHIFT) + v->ob_digit[i];
Thomas Hellera4ea6032003-04-17 18:55:45 +00001032 }
1033 return x * sign;
1034}
Tim Petersd1a7da62001-06-13 00:35:57 +00001035#undef IS_LITTLE_ENDIAN
1036
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001037#endif /* HAVE_LONG_LONG */
1038
Neil Schemenauerba872e22001-01-04 01:46:03 +00001039
1040static int
1041convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001042 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001043 *a = (PyLongObject *) v;
1044 Py_INCREF(v);
1045 }
1046 else if (PyInt_Check(v)) {
1047 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
1048 }
1049 else {
1050 return 0;
1051 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001052 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001053 *b = (PyLongObject *) w;
1054 Py_INCREF(w);
1055 }
1056 else if (PyInt_Check(w)) {
1057 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
1058 }
1059 else {
1060 Py_DECREF(*a);
1061 return 0;
1062 }
1063 return 1;
1064}
1065
1066#define CONVERT_BINOP(v, w, a, b) \
1067 if (!convert_binop(v, w, a, b)) { \
1068 Py_INCREF(Py_NotImplemented); \
1069 return Py_NotImplemented; \
1070 }
1071
Tim Peters877a2122002-08-12 05:09:36 +00001072/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
1073 * is modified in place, by adding y to it. Carries are propagated as far as
1074 * x[m-1], and the remaining carry (0 or 1) is returned.
1075 */
1076static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001077v_iadd(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
Tim Peters877a2122002-08-12 05:09:36 +00001078{
Mark Dickinson76eb7892009-01-24 15:42:34 +00001079 Py_ssize_t i;
Tim Peters877a2122002-08-12 05:09:36 +00001080 digit carry = 0;
1081
1082 assert(m >= n);
1083 for (i = 0; i < n; ++i) {
1084 carry += x[i] + y[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001085 x[i] = carry & PyLong_MASK;
1086 carry >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001087 assert((carry & 1) == carry);
1088 }
1089 for (; carry && i < m; ++i) {
1090 carry += x[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001091 x[i] = carry & PyLong_MASK;
1092 carry >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001093 assert((carry & 1) == carry);
1094 }
1095 return carry;
1096}
1097
1098/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
1099 * is modified in place, by subtracting y from it. Borrows are propagated as
1100 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
1101 */
1102static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001103v_isub(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
Tim Peters877a2122002-08-12 05:09:36 +00001104{
Mark Dickinson76eb7892009-01-24 15:42:34 +00001105 Py_ssize_t i;
Tim Peters877a2122002-08-12 05:09:36 +00001106 digit borrow = 0;
1107
1108 assert(m >= n);
1109 for (i = 0; i < n; ++i) {
1110 borrow = x[i] - y[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001111 x[i] = borrow & PyLong_MASK;
1112 borrow >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001113 borrow &= 1; /* keep only 1 sign bit */
1114 }
1115 for (; borrow && i < m; ++i) {
1116 borrow = x[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001117 x[i] = borrow & PyLong_MASK;
1118 borrow >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001119 borrow &= 1;
1120 }
1121 return borrow;
1122}
Neil Schemenauerba872e22001-01-04 01:46:03 +00001123
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001124/* Multiply by a single digit, ignoring the sign. */
1125
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001126static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001127mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001128{
1129 return muladd1(a, n, (digit)0);
1130}
1131
1132/* Multiply by a single digit and add a single digit, ignoring the sign. */
1133
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001134static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001135muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001136{
Christian Heimese93237d2007-12-19 02:37:44 +00001137 Py_ssize_t size_a = ABS(Py_SIZE(a));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001138 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001139 twodigits carry = extra;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001140 Py_ssize_t i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001141
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001142 if (z == NULL)
1143 return NULL;
1144 for (i = 0; i < size_a; ++i) {
1145 carry += (twodigits)a->ob_digit[i] * n;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001146 z->ob_digit[i] = (digit) (carry & PyLong_MASK);
1147 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001148 }
Guido van Rossum2095d241997-04-09 19:41:24 +00001149 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001150 return long_normalize(z);
1151}
1152
Tim Peters212e6142001-07-14 12:23:19 +00001153/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
1154 in pout, and returning the remainder. pin and pout point at the LSD.
1155 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
Eric Smith5e527eb2008-02-10 01:36:53 +00001156 _PyLong_Format, but that should be done with great care since longs are
Tim Peters212e6142001-07-14 12:23:19 +00001157 immutable. */
1158
1159static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001160inplace_divrem1(digit *pout, digit *pin, Py_ssize_t size, digit n)
Tim Peters212e6142001-07-14 12:23:19 +00001161{
1162 twodigits rem = 0;
1163
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001164 assert(n > 0 && n <= PyLong_MASK);
Tim Peters212e6142001-07-14 12:23:19 +00001165 pin += size;
1166 pout += size;
1167 while (--size >= 0) {
1168 digit hi;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001169 rem = (rem << PyLong_SHIFT) + *--pin;
Tim Peters212e6142001-07-14 12:23:19 +00001170 *--pout = hi = (digit)(rem / n);
Mark Dickinson76eb7892009-01-24 15:42:34 +00001171 rem -= (twodigits)hi * n;
Tim Peters212e6142001-07-14 12:23:19 +00001172 }
1173 return (digit)rem;
1174}
1175
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001176/* Divide a long integer by a digit, returning both the quotient
1177 (as function result) and the remainder (through *prem).
1178 The sign of a is ignored; n should not be zero. */
1179
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001180static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +00001181divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001182{
Christian Heimese93237d2007-12-19 02:37:44 +00001183 const Py_ssize_t size = ABS(Py_SIZE(a));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001184 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001185
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001186 assert(n > 0 && n <= PyLong_MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001188 if (z == NULL)
1189 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +00001190 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001191 return long_normalize(z);
1192}
1193
Eric Smith5e527eb2008-02-10 01:36:53 +00001194/* Convert the long to a string object with given base,
1195 appending a base prefix of 0[box] if base is 2, 8 or 16.
1196 Add a trailing "L" if addL is non-zero.
1197 If newstyle is zero, then use the pre-2.6 behavior of octal having
1198 a leading "0", instead of the prefix "0o" */
1199PyAPI_FUNC(PyObject *)
1200_PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001201{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001202 register PyLongObject *a = (PyLongObject *)aa;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001203 PyStringObject *str;
Mark Dickinson429e34a2009-09-13 11:59:41 +00001204 Py_ssize_t i, sz;
Neal Norwitzc09efa82006-07-23 07:53:14 +00001205 Py_ssize_t size_a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001206 char *p;
1207 int bits;
1208 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +00001209
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001210 if (a == NULL || !PyLong_Check(a)) {
1211 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +00001212 return NULL;
1213 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001214 assert(base >= 2 && base <= 36);
Christian Heimese93237d2007-12-19 02:37:44 +00001215 size_a = ABS(Py_SIZE(a));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001216
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001217 /* Compute a rough upper bound for the length of the string */
1218 i = base;
1219 bits = 0;
1220 while (i > 1) {
1221 ++bits;
1222 i >>= 1;
1223 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001224 i = 5 + (addL ? 1 : 0);
Mark Dickinson429e34a2009-09-13 11:59:41 +00001225 /* ensure we don't get signed overflow in sz calculation */
1226 if (size_a > (PY_SSIZE_T_MAX - i) / PyLong_SHIFT) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00001227 PyErr_SetString(PyExc_OverflowError,
1228 "long is too large to format");
1229 return NULL;
1230 }
Mark Dickinson429e34a2009-09-13 11:59:41 +00001231 sz = i + 1 + (size_a * PyLong_SHIFT - 1) / bits;
1232 assert(sz >= 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001233 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001234 if (str == NULL)
1235 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001236 p = PyString_AS_STRING(str) + sz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001237 *p = '\0';
Mark Dickinson429e34a2009-09-13 11:59:41 +00001238 if (addL)
1239 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001240 if (a->ob_size < 0)
1241 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +00001242
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001243 if (a->ob_size == 0) {
1244 *--p = '0';
1245 }
1246 else if ((base & (base - 1)) == 0) {
1247 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +00001248 twodigits accum = 0;
1249 int accumbits = 0; /* # of bits in accum */
1250 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001251 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +00001252 while ((i >>= 1) > 1)
1253 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +00001254
1255 for (i = 0; i < size_a; ++i) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00001256 accum |= (twodigits)a->ob_digit[i] << accumbits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001257 accumbits += PyLong_SHIFT;
Tim Peters586b2e32001-07-15 09:11:14 +00001258 assert(accumbits >= basebits);
1259 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001260 char cdigit = (char)(accum & (base - 1));
Raymond Hettinger3296e692005-06-29 23:29:56 +00001261 cdigit += (cdigit < 10) ? '0' : 'a'-10;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001262 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001263 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +00001264 accumbits -= basebits;
1265 accum >>= basebits;
1266 } while (i < size_a-1 ? accumbits >= basebits :
Mark Dickinson429e34a2009-09-13 11:59:41 +00001267 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001268 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001269 }
1270 else {
Tim Petersfad225f2001-07-13 02:59:26 +00001271 /* Not 0, and base not a power of 2. Divide repeatedly by
1272 base, but for speed use the highest power of base that
1273 fits in a digit. */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001274 Py_ssize_t size = size_a;
Tim Peters212e6142001-07-14 12:23:19 +00001275 digit *pin = a->ob_digit;
1276 PyLongObject *scratch;
1277 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +00001278 digit powbase = base; /* powbase == base ** power */
1279 int power = 1;
1280 for (;;) {
1281 unsigned long newpow = powbase * (unsigned long)base;
Mark Dickinson429e34a2009-09-13 11:59:41 +00001282 if (newpow >> PyLong_SHIFT)
1283 /* doesn't fit in a digit */
Tim Petersfad225f2001-07-13 02:59:26 +00001284 break;
1285 powbase = (digit)newpow;
1286 ++power;
1287 }
Tim Peters212e6142001-07-14 12:23:19 +00001288
1289 /* Get a scratch area for repeated division. */
1290 scratch = _PyLong_New(size);
1291 if (scratch == NULL) {
1292 Py_DECREF(str);
1293 return NULL;
1294 }
1295
1296 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001297 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001298 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +00001299 digit rem = inplace_divrem1(scratch->ob_digit,
1300 pin, size, powbase);
1301 pin = scratch->ob_digit; /* no need to use a again */
1302 if (pin[size - 1] == 0)
1303 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001304 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +00001305 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001306 Py_DECREF(str);
1307 return NULL;
1308 })
Tim Peters212e6142001-07-14 12:23:19 +00001309
1310 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001311 assert(ntostore > 0);
1312 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001313 digit nextrem = (digit)(rem / base);
1314 char c = (char)(rem - nextrem * base);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001315 assert(p > PyString_AS_STRING(str));
Raymond Hettinger3296e692005-06-29 23:29:56 +00001316 c += (c < 10) ? '0' : 'a'-10;
Tim Petersfad225f2001-07-13 02:59:26 +00001317 *--p = c;
1318 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001319 --ntostore;
1320 /* Termination is a bit delicate: must not
1321 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001322 remaining quotient and rem are both 0. */
1323 } while (ntostore && (size || rem));
1324 } while (size != 0);
1325 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001326 }
1327
Eric Smith5e527eb2008-02-10 01:36:53 +00001328 if (base == 2) {
1329 *--p = 'b';
1330 *--p = '0';
1331 }
1332 else if (base == 8) {
Mark Dickinson429e34a2009-09-13 11:59:41 +00001333 if (newstyle) {
Eric Smith5e527eb2008-02-10 01:36:53 +00001334 *--p = 'o';
Guido van Rossum2c475421992-08-14 15:13:07 +00001335 *--p = '0';
Eric Smith5e527eb2008-02-10 01:36:53 +00001336 }
1337 else
1338 if (size_a != 0)
1339 *--p = '0';
Guido van Rossum2c475421992-08-14 15:13:07 +00001340 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001341 else if (base == 16) {
1342 *--p = 'x';
1343 *--p = '0';
1344 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001345 else if (base != 10) {
1346 *--p = '#';
1347 *--p = '0' + base%10;
1348 if (base > 10)
1349 *--p = '0' + base/10;
1350 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001351 if (sign)
1352 *--p = sign;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001353 if (p != PyString_AS_STRING(str)) {
1354 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001355 assert(p > q);
1356 do {
1357 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001358 q--;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001359 _PyString_Resize((PyObject **)&str,
1360 (Py_ssize_t) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001361 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001362 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001363}
1364
Tim Petersda53afa2006-05-25 17:34:03 +00001365/* Table of digit values for 8-bit string -> integer conversion.
1366 * '0' maps to 0, ..., '9' maps to 9.
1367 * 'a' and 'A' map to 10, ..., 'z' and 'Z' map to 35.
1368 * All other indices map to 37.
1369 * Note that when converting a base B string, a char c is a legitimate
1370 * base B digit iff _PyLong_DigitValue[Py_CHARMASK(c)] < B.
1371 */
1372int _PyLong_DigitValue[256] = {
Tim Peters696cf432006-05-24 21:10:40 +00001373 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1374 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1375 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1376 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 37, 37, 37, 37, 37, 37,
1377 37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1378 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
1379 37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1380 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
1381 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1382 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1383 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1384 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1385 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1386 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1387 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1388 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
Tim Peters696cf432006-05-24 21:10:40 +00001389};
1390
1391/* *str points to the first digit in a string of base `base` digits. base
Tim Petersbf2674b2003-02-02 07:51:32 +00001392 * is a power of 2 (2, 4, 8, 16, or 32). *str is set to point to the first
1393 * non-digit (which may be *str!). A normalized long is returned.
1394 * The point to this routine is that it takes time linear in the number of
1395 * string characters.
1396 */
1397static PyLongObject *
1398long_from_binary_base(char **str, int base)
1399{
1400 char *p = *str;
1401 char *start = p;
1402 int bits_per_char;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001403 Py_ssize_t n;
Tim Petersbf2674b2003-02-02 07:51:32 +00001404 PyLongObject *z;
1405 twodigits accum;
1406 int bits_in_accum;
1407 digit *pdigit;
1408
1409 assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
1410 n = base;
1411 for (bits_per_char = -1; n; ++bits_per_char)
1412 n >>= 1;
1413 /* n <- total # of bits needed, while setting p to end-of-string */
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001414 while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base)
Tim Petersbf2674b2003-02-02 07:51:32 +00001415 ++p;
Tim Petersbf2674b2003-02-02 07:51:32 +00001416 *str = p;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001417 /* n <- # of Python digits needed, = ceiling(n/PyLong_SHIFT). */
1418 n = (p - start) * bits_per_char + PyLong_SHIFT - 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001419 if (n / bits_per_char < p - start) {
Tim Peters1a3b19a2003-02-02 17:33:53 +00001420 PyErr_SetString(PyExc_ValueError,
1421 "long string too large to convert");
1422 return NULL;
1423 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001424 n = n / PyLong_SHIFT;
Tim Petersbf2674b2003-02-02 07:51:32 +00001425 z = _PyLong_New(n);
1426 if (z == NULL)
1427 return NULL;
1428 /* Read string from right, and fill in long from left; i.e.,
1429 * from least to most significant in both.
1430 */
1431 accum = 0;
1432 bits_in_accum = 0;
1433 pdigit = z->ob_digit;
1434 while (--p >= start) {
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001435 int k = _PyLong_DigitValue[Py_CHARMASK(*p)];
Tim Petersc7bc0b92003-05-05 20:39:43 +00001436 assert(k >= 0 && k < base);
Mark Dickinson76eb7892009-01-24 15:42:34 +00001437 accum |= (twodigits)k << bits_in_accum;
Tim Petersbf2674b2003-02-02 07:51:32 +00001438 bits_in_accum += bits_per_char;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001439 if (bits_in_accum >= PyLong_SHIFT) {
1440 *pdigit++ = (digit)(accum & PyLong_MASK);
Mark Dickinson76eb7892009-01-24 15:42:34 +00001441 assert(pdigit - z->ob_digit <= n);
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001442 accum >>= PyLong_SHIFT;
1443 bits_in_accum -= PyLong_SHIFT;
1444 assert(bits_in_accum < PyLong_SHIFT);
Tim Petersbf2674b2003-02-02 07:51:32 +00001445 }
1446 }
1447 if (bits_in_accum) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001448 assert(bits_in_accum <= PyLong_SHIFT);
Tim Petersbf2674b2003-02-02 07:51:32 +00001449 *pdigit++ = (digit)accum;
Mark Dickinson76eb7892009-01-24 15:42:34 +00001450 assert(pdigit - z->ob_digit <= n);
Tim Petersbf2674b2003-02-02 07:51:32 +00001451 }
1452 while (pdigit - z->ob_digit < n)
1453 *pdigit++ = 0;
1454 return long_normalize(z);
1455}
1456
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001457PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001458PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001459{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001460 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001461 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001462 PyLongObject *z;
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001463 PyObject *strobj, *strrepr;
1464 Py_ssize_t slen;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001465
Guido van Rossum472c04f1996-12-05 21:57:21 +00001466 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001467 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001468 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001469 return NULL;
1470 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001471 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001472 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001473 if (*str == '+')
1474 ++str;
1475 else if (*str == '-') {
1476 ++str;
1477 sign = -1;
1478 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001479 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001480 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001481 if (base == 0) {
Eric Smith9ff19b52008-03-17 17:32:20 +00001482 /* No base given. Deduce the base from the contents
1483 of the string */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001484 if (str[0] != '0')
1485 base = 10;
1486 else if (str[1] == 'x' || str[1] == 'X')
1487 base = 16;
Eric Smith9ff19b52008-03-17 17:32:20 +00001488 else if (str[1] == 'o' || str[1] == 'O')
1489 base = 8;
1490 else if (str[1] == 'b' || str[1] == 'B')
1491 base = 2;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001492 else
Eric Smith9ff19b52008-03-17 17:32:20 +00001493 /* "old" (C-style) octal literal, still valid in
1494 2.x, although illegal in 3.x */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001495 base = 8;
1496 }
Eric Smith9ff19b52008-03-17 17:32:20 +00001497 /* Whether or not we were deducing the base, skip leading chars
1498 as needed */
1499 if (str[0] == '0' &&
1500 ((base == 16 && (str[1] == 'x' || str[1] == 'X')) ||
1501 (base == 8 && (str[1] == 'o' || str[1] == 'O')) ||
1502 (base == 2 && (str[1] == 'b' || str[1] == 'B'))))
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001503 str += 2;
Tim Peters696cf432006-05-24 21:10:40 +00001504
Guido van Rossume6762971998-06-22 03:54:46 +00001505 start = str;
Tim Petersbf2674b2003-02-02 07:51:32 +00001506 if ((base & (base - 1)) == 0)
1507 z = long_from_binary_base(&str, base);
1508 else {
Tim Peters696cf432006-05-24 21:10:40 +00001509/***
1510Binary bases can be converted in time linear in the number of digits, because
1511Python's representation base is binary. Other bases (including decimal!) use
1512the simple quadratic-time algorithm below, complicated by some speed tricks.
Tim Peters5af4e6c2002-08-12 02:31:19 +00001513
Tim Peters696cf432006-05-24 21:10:40 +00001514First some math: the largest integer that can be expressed in N base-B digits
1515is B**N-1. Consequently, if we have an N-digit input in base B, the worst-
1516case number of Python digits needed to hold it is the smallest integer n s.t.
1517
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001518 PyLong_BASE**n-1 >= B**N-1 [or, adding 1 to both sides]
1519 PyLong_BASE**n >= B**N [taking logs to base PyLong_BASE]
1520 n >= log(B**N)/log(PyLong_BASE) = N * log(B)/log(PyLong_BASE)
Tim Peters696cf432006-05-24 21:10:40 +00001521
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001522The static array log_base_PyLong_BASE[base] == log(base)/log(PyLong_BASE) so we can compute
Tim Peters696cf432006-05-24 21:10:40 +00001523this quickly. A Python long with that much space is reserved near the start,
1524and the result is computed into it.
1525
1526The input string is actually treated as being in base base**i (i.e., i digits
1527are processed at a time), where two more static arrays hold:
1528
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001529 convwidth_base[base] = the largest integer i such that base**i <= PyLong_BASE
Tim Peters696cf432006-05-24 21:10:40 +00001530 convmultmax_base[base] = base ** convwidth_base[base]
1531
1532The first of these is the largest i such that i consecutive input digits
1533must fit in a single Python digit. The second is effectively the input
1534base we're really using.
1535
1536Viewing the input as a sequence <c0, c1, ..., c_n-1> of digits in base
1537convmultmax_base[base], the result is "simply"
1538
1539 (((c0*B + c1)*B + c2)*B + c3)*B + ... ))) + c_n-1
1540
1541where B = convmultmax_base[base].
Tim Peters9faa3ed2006-05-30 15:53:34 +00001542
1543Error analysis: as above, the number of Python digits `n` needed is worst-
1544case
1545
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001546 n >= N * log(B)/log(PyLong_BASE)
Tim Peters9faa3ed2006-05-30 15:53:34 +00001547
1548where `N` is the number of input digits in base `B`. This is computed via
1549
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001550 size_z = (Py_ssize_t)((scan - str) * log_base_PyLong_BASE[base]) + 1;
Tim Peters9faa3ed2006-05-30 15:53:34 +00001551
1552below. Two numeric concerns are how much space this can waste, and whether
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001553the computed result can be too small. To be concrete, assume PyLong_BASE = 2**15,
Tim Peters9faa3ed2006-05-30 15:53:34 +00001554which is the default (and it's unlikely anyone changes that).
1555
1556Waste isn't a problem: provided the first input digit isn't 0, the difference
1557between the worst-case input with N digits and the smallest input with N
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001558digits is about a factor of B, but B is small compared to PyLong_BASE so at most
Tim Peters9faa3ed2006-05-30 15:53:34 +00001559one allocated Python digit can remain unused on that count. If
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001560N*log(B)/log(PyLong_BASE) is mathematically an exact integer, then truncating that
Tim Peters9faa3ed2006-05-30 15:53:34 +00001561and adding 1 returns a result 1 larger than necessary. However, that can't
1562happen: whenever B is a power of 2, long_from_binary_base() is called
1563instead, and it's impossible for B**i to be an integer power of 2**15 when
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001564B is not a power of 2 (i.e., it's impossible for N*log(B)/log(PyLong_BASE) to be
Tim Peters9faa3ed2006-05-30 15:53:34 +00001565an exact integer when B is not a power of 2, since B**i has a prime factor
1566other than 2 in that case, but (2**15)**j's only prime factor is 2).
1567
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001568The computed result can be too small if the true value of N*log(B)/log(PyLong_BASE)
Tim Peters9faa3ed2006-05-30 15:53:34 +00001569is a little bit larger than an exact integer, but due to roundoff errors (in
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001570computing log(B), log(PyLong_BASE), their quotient, and/or multiplying that by N)
Tim Peters9faa3ed2006-05-30 15:53:34 +00001571yields a numeric result a little less than that integer. Unfortunately, "how
1572close can a transcendental function get to an integer over some range?"
1573questions are generally theoretically intractable. Computer analysis via
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001574continued fractions is practical: expand log(B)/log(PyLong_BASE) via continued
Tim Peters9faa3ed2006-05-30 15:53:34 +00001575fractions, giving a sequence i/j of "the best" rational approximations. Then
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001576j*log(B)/log(PyLong_BASE) is approximately equal to (the integer) i. This shows that
Tim Peters9faa3ed2006-05-30 15:53:34 +00001577we can get very close to being in trouble, but very rarely. For example,
157876573 is a denominator in one of the continued-fraction approximations to
1579log(10)/log(2**15), and indeed:
1580
1581 >>> log(10)/log(2**15)*76573
1582 16958.000000654003
1583
1584is very close to an integer. If we were working with IEEE single-precision,
1585rounding errors could kill us. Finding worst cases in IEEE double-precision
1586requires better-than-double-precision log() functions, and Tim didn't bother.
1587Instead the code checks to see whether the allocated space is enough as each
1588new Python digit is added, and copies the whole thing to a larger long if not.
1589This should happen extremely rarely, and in fact I don't have a test case
1590that triggers it(!). Instead the code was tested by artificially allocating
1591just 1 digit at the start, so that the copying code was exercised for every
1592digit beyond the first.
Tim Peters696cf432006-05-24 21:10:40 +00001593***/
1594 register twodigits c; /* current input character */
1595 Py_ssize_t size_z;
1596 int i;
1597 int convwidth;
1598 twodigits convmultmax, convmult;
1599 digit *pz, *pzstop;
1600 char* scan;
1601
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001602 static double log_base_PyLong_BASE[37] = {0.0e0,};
Tim Peters696cf432006-05-24 21:10:40 +00001603 static int convwidth_base[37] = {0,};
1604 static twodigits convmultmax_base[37] = {0,};
1605
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001606 if (log_base_PyLong_BASE[base] == 0.0) {
Tim Peters696cf432006-05-24 21:10:40 +00001607 twodigits convmax = base;
1608 int i = 1;
1609
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001610 log_base_PyLong_BASE[base] = log((double)base) /
1611 log((double)PyLong_BASE);
Tim Peters696cf432006-05-24 21:10:40 +00001612 for (;;) {
1613 twodigits next = convmax * base;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001614 if (next > PyLong_BASE)
Tim Peters696cf432006-05-24 21:10:40 +00001615 break;
1616 convmax = next;
1617 ++i;
1618 }
1619 convmultmax_base[base] = convmax;
1620 assert(i > 0);
1621 convwidth_base[base] = i;
1622 }
1623
1624 /* Find length of the string of numeric characters. */
1625 scan = str;
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001626 while (_PyLong_DigitValue[Py_CHARMASK(*scan)] < base)
Tim Peters696cf432006-05-24 21:10:40 +00001627 ++scan;
1628
1629 /* Create a long object that can contain the largest possible
1630 * integer with this base and length. Note that there's no
1631 * need to initialize z->ob_digit -- no slot is read up before
1632 * being stored into.
1633 */
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001634 size_z = (Py_ssize_t)((scan - str) * log_base_PyLong_BASE[base]) + 1;
Tim Peters9faa3ed2006-05-30 15:53:34 +00001635 /* Uncomment next line to test exceedingly rare copy code */
1636 /* size_z = 1; */
Tim Peters696cf432006-05-24 21:10:40 +00001637 assert(size_z > 0);
1638 z = _PyLong_New(size_z);
1639 if (z == NULL)
1640 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001641 Py_SIZE(z) = 0;
Tim Peters696cf432006-05-24 21:10:40 +00001642
1643 /* `convwidth` consecutive input digits are treated as a single
1644 * digit in base `convmultmax`.
1645 */
1646 convwidth = convwidth_base[base];
1647 convmultmax = convmultmax_base[base];
1648
1649 /* Work ;-) */
1650 while (str < scan) {
1651 /* grab up to convwidth digits from the input string */
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001652 c = (digit)_PyLong_DigitValue[Py_CHARMASK(*str++)];
Tim Peters696cf432006-05-24 21:10:40 +00001653 for (i = 1; i < convwidth && str != scan; ++i, ++str) {
1654 c = (twodigits)(c * base +
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001655 _PyLong_DigitValue[Py_CHARMASK(*str)]);
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001656 assert(c < PyLong_BASE);
Tim Peters696cf432006-05-24 21:10:40 +00001657 }
1658
1659 convmult = convmultmax;
1660 /* Calculate the shift only if we couldn't get
1661 * convwidth digits.
1662 */
1663 if (i != convwidth) {
1664 convmult = base;
1665 for ( ; i > 1; --i)
1666 convmult *= base;
1667 }
1668
1669 /* Multiply z by convmult, and add c. */
1670 pz = z->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +00001671 pzstop = pz + Py_SIZE(z);
Tim Peters696cf432006-05-24 21:10:40 +00001672 for (; pz < pzstop; ++pz) {
1673 c += (twodigits)*pz * convmult;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001674 *pz = (digit)(c & PyLong_MASK);
1675 c >>= PyLong_SHIFT;
Tim Peters696cf432006-05-24 21:10:40 +00001676 }
1677 /* carry off the current end? */
1678 if (c) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001679 assert(c < PyLong_BASE);
Christian Heimese93237d2007-12-19 02:37:44 +00001680 if (Py_SIZE(z) < size_z) {
Tim Peters9faa3ed2006-05-30 15:53:34 +00001681 *pz = (digit)c;
Christian Heimese93237d2007-12-19 02:37:44 +00001682 ++Py_SIZE(z);
Tim Peters9faa3ed2006-05-30 15:53:34 +00001683 }
1684 else {
1685 PyLongObject *tmp;
1686 /* Extremely rare. Get more space. */
Christian Heimese93237d2007-12-19 02:37:44 +00001687 assert(Py_SIZE(z) == size_z);
Tim Peters9faa3ed2006-05-30 15:53:34 +00001688 tmp = _PyLong_New(size_z + 1);
1689 if (tmp == NULL) {
1690 Py_DECREF(z);
1691 return NULL;
1692 }
1693 memcpy(tmp->ob_digit,
1694 z->ob_digit,
1695 sizeof(digit) * size_z);
1696 Py_DECREF(z);
1697 z = tmp;
1698 z->ob_digit[size_z] = (digit)c;
1699 ++size_z;
1700 }
Tim Peters696cf432006-05-24 21:10:40 +00001701 }
Tim Petersbf2674b2003-02-02 07:51:32 +00001702 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001703 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001704 if (z == NULL)
1705 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001706 if (str == start)
1707 goto onError;
Tim Peters696cf432006-05-24 21:10:40 +00001708 if (sign < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001709 Py_SIZE(z) = -(Py_SIZE(z));
Guido van Rossum9e896b32000-04-05 20:11:21 +00001710 if (*str == 'L' || *str == 'l')
1711 str++;
1712 while (*str && isspace(Py_CHARMASK(*str)))
1713 str++;
1714 if (*str != '\0')
1715 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001716 if (pend)
1717 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001718 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001719
1720 onError:
Guido van Rossum9e896b32000-04-05 20:11:21 +00001721 Py_XDECREF(z);
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001722 slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001723 strobj = PyString_FromStringAndSize(orig_str, slen);
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001724 if (strobj == NULL)
1725 return NULL;
1726 strrepr = PyObject_Repr(strobj);
1727 Py_DECREF(strobj);
1728 if (strrepr == NULL)
1729 return NULL;
1730 PyErr_Format(PyExc_ValueError,
1731 "invalid literal for long() with base %d: %s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001732 base, PyString_AS_STRING(strrepr));
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001733 Py_DECREF(strrepr);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001734 return NULL;
1735}
1736
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001737#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001738PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001739PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001740{
Walter Dörwald07e14762002-11-06 16:15:14 +00001741 PyObject *result;
Anthony Baxter377be112006-04-11 06:54:30 +00001742 char *buffer = (char *)PyMem_MALLOC(length+1);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001743
Walter Dörwald07e14762002-11-06 16:15:14 +00001744 if (buffer == NULL)
1745 return NULL;
1746
1747 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
1748 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001749 return NULL;
1750 }
Walter Dörwald07e14762002-11-06 16:15:14 +00001751 result = PyLong_FromString(buffer, NULL, base);
1752 PyMem_FREE(buffer);
1753 return result;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001754}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001755#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001756
Tim Peters9f688bf2000-07-07 15:53:28 +00001757/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001758static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001759 (PyLongObject *, PyLongObject *, PyLongObject **);
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001760static PyObject *long_long(PyObject *v);
Tim Peters9f688bf2000-07-07 15:53:28 +00001761static int long_divrem(PyLongObject *, PyLongObject *,
1762 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001763
1764/* Long division with remainder, top-level routine */
1765
Guido van Rossume32e0141992-01-19 16:31:05 +00001766static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001767long_divrem(PyLongObject *a, PyLongObject *b,
1768 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001769{
Christian Heimese93237d2007-12-19 02:37:44 +00001770 Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001771 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001772
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001773 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001774 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001775 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001776 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001777 }
1778 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001779 (size_a == size_b &&
1780 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001781 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001782 *pdiv = _PyLong_New(0);
Georg Brandlc02e1312007-04-11 17:16:24 +00001783 if (*pdiv == NULL)
1784 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001785 Py_INCREF(a);
1786 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001787 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001788 }
1789 if (size_b == 1) {
1790 digit rem = 0;
1791 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001792 if (z == NULL)
1793 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001794 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Georg Brandlc02e1312007-04-11 17:16:24 +00001795 if (*prem == NULL) {
1796 Py_DECREF(z);
1797 return -1;
1798 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001799 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001800 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001801 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001802 if (z == NULL)
1803 return -1;
1804 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001805 /* Set the signs.
1806 The quotient z has the sign of a*b;
1807 the remainder r has the sign of a,
1808 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001809 if ((a->ob_size < 0) != (b->ob_size < 0))
1810 z->ob_size = -(z->ob_size);
1811 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1812 (*prem)->ob_size = -((*prem)->ob_size);
1813 *pdiv = z;
1814 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001815}
1816
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001817/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001818
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001819static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001820x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001821{
Christian Heimese93237d2007-12-19 02:37:44 +00001822 Py_ssize_t size_v = ABS(Py_SIZE(v1)), size_w = ABS(Py_SIZE(w1));
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001823 digit d = (digit) ((twodigits)PyLong_BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001824 PyLongObject *v = mul1(v1, d);
1825 PyLongObject *w = mul1(w1, d);
1826 PyLongObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001827 Py_ssize_t j, k;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001828
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001829 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001830 Py_XDECREF(v);
1831 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001832 return NULL;
1833 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001834
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001835 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Christian Heimese93237d2007-12-19 02:37:44 +00001836 assert(Py_REFCNT(v) == 1); /* Since v will be used as accumulator! */
1837 assert(size_w == ABS(Py_SIZE(w))); /* That's how d was calculated */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001838
Christian Heimese93237d2007-12-19 02:37:44 +00001839 size_v = ABS(Py_SIZE(v));
Neal Norwitzc6a989a2006-05-10 06:57:58 +00001840 k = size_v - size_w;
1841 a = _PyLong_New(k + 1);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001842
Neal Norwitzc6a989a2006-05-10 06:57:58 +00001843 for (j = size_v; a != NULL && k >= 0; --j, --k) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001844 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1845 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001846 stwodigits carry = 0;
Mark Dickinson76eb7892009-01-24 15:42:34 +00001847 Py_ssize_t i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001848
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001849 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001850 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001851 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001852 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001853 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001854 if (vj == w->ob_digit[size_w-1])
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001855 q = PyLong_MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001856 else
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001857 q = (((twodigits)vj << PyLong_SHIFT) + v->ob_digit[j-1]) /
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001858 w->ob_digit[size_w-1];
Tim Peters5af4e6c2002-08-12 02:31:19 +00001859
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001860 while (w->ob_digit[size_w-2]*q >
1861 ((
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001862 ((twodigits)vj << PyLong_SHIFT)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001863 + v->ob_digit[j-1]
1864 - q*w->ob_digit[size_w-1]
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001865 ) << PyLong_SHIFT)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001866 + v->ob_digit[j-2])
1867 --q;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001868
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001869 for (i = 0; i < size_w && i+k < size_v; ++i) {
1870 twodigits z = w->ob_digit[i] * q;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001871 digit zz = (digit) (z >> PyLong_SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001872 carry += v->ob_digit[i+k] - z
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001873 + ((twodigits)zz << PyLong_SHIFT);
1874 v->ob_digit[i+k] = (digit)(carry & PyLong_MASK);
Mark Dickinsonb47fac42009-03-20 23:33:19 +00001875 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001876 carry, PyLong_SHIFT);
Tim Peters7d3a5112000-07-08 04:17:21 +00001877 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001878 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001879
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001880 if (i+k < size_v) {
1881 carry += v->ob_digit[i+k];
1882 v->ob_digit[i+k] = 0;
1883 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001884
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001885 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001886 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001887 else {
1888 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001889 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001890 carry = 0;
1891 for (i = 0; i < size_w && i+k < size_v; ++i) {
1892 carry += v->ob_digit[i+k] + w->ob_digit[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001893 v->ob_digit[i+k] = (digit)(carry & PyLong_MASK);
Tim Peters7d3a5112000-07-08 04:17:21 +00001894 carry = Py_ARITHMETIC_RIGHT_SHIFT(
Mark Dickinsonb47fac42009-03-20 23:33:19 +00001895 BASE_TWODIGITS_TYPE,
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001896 carry, PyLong_SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001897 }
1898 }
1899 } /* for j, k */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001900
Guido van Rossumc206c761995-01-10 15:23:19 +00001901 if (a == NULL)
1902 *prem = NULL;
1903 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001904 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001905 *prem = divrem1(v, d, &d);
1906 /* d receives the (unused) remainder */
1907 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001908 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001909 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001910 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001911 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001912 Py_DECREF(v);
1913 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001914 return a;
1915}
1916
1917/* Methods */
1918
1919static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001920long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001921{
Christian Heimese93237d2007-12-19 02:37:44 +00001922 Py_TYPE(v)->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001923}
1924
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001925static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001926long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001927{
Eric Smith5e527eb2008-02-10 01:36:53 +00001928 return _PyLong_Format(v, 10, 1, 0);
Fred Drake121ee271999-12-23 15:41:28 +00001929}
1930
1931static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001932long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001933{
Eric Smith5e527eb2008-02-10 01:36:53 +00001934 return _PyLong_Format(v, 10, 0, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001935}
1936
1937static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001938long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001939{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001940 Py_ssize_t sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001941
Christian Heimese93237d2007-12-19 02:37:44 +00001942 if (Py_SIZE(a) != Py_SIZE(b)) {
1943 if (ABS(Py_SIZE(a)) == 0 && ABS(Py_SIZE(b)) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001944 sign = 0;
1945 else
Christian Heimese93237d2007-12-19 02:37:44 +00001946 sign = Py_SIZE(a) - Py_SIZE(b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001947 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001948 else {
Christian Heimese93237d2007-12-19 02:37:44 +00001949 Py_ssize_t i = ABS(Py_SIZE(a));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001950 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1951 ;
1952 if (i < 0)
1953 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001954 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001955 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Christian Heimese93237d2007-12-19 02:37:44 +00001956 if (Py_SIZE(a) < 0)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001957 sign = -sign;
1958 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001959 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001960 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001961}
1962
Guido van Rossum9bfef441993-03-29 10:43:31 +00001963static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001964long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001965{
Mark Dickinson24058542009-01-26 21:43:42 +00001966 unsigned long x;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001967 Py_ssize_t i;
1968 int sign;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001969
1970 /* This is designed so that Python ints and longs with the
1971 same value hash to the same value, otherwise comparisons
1972 of mapping keys will turn out weird */
1973 i = v->ob_size;
1974 sign = 1;
1975 x = 0;
1976 if (i < 0) {
1977 sign = -1;
1978 i = -(i);
1979 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001980#define LONG_BIT_PyLong_SHIFT (8*sizeof(long) - PyLong_SHIFT)
Mark Dickinson24058542009-01-26 21:43:42 +00001981 /* The following loop produces a C unsigned long x such that x is
1982 congruent to the absolute value of v modulo ULONG_MAX. The
Facundo Batistad544df72007-09-19 15:10:06 +00001983 resulting x is nonzero if and only if v is. */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001984 while (--i >= 0) {
Neal Norwitzd5a65a72003-02-23 23:11:41 +00001985 /* Force a native long #-bits (32 or 64) circular shift */
Mark Dickinson24058542009-01-26 21:43:42 +00001986 x = ((x << PyLong_SHIFT) & ~PyLong_MASK) |
1987 ((x >> LONG_BIT_PyLong_SHIFT) & PyLong_MASK);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001988 x += v->ob_digit[i];
Mark Dickinson24058542009-01-26 21:43:42 +00001989 /* If the addition above overflowed we compensate by
1990 incrementing. This preserves the value modulo
1991 ULONG_MAX. */
1992 if (x < v->ob_digit[i])
Facundo Batistad544df72007-09-19 15:10:06 +00001993 x++;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001994 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001995#undef LONG_BIT_PyLong_SHIFT
Guido van Rossum9bfef441993-03-29 10:43:31 +00001996 x = x * sign;
1997 if (x == -1)
1998 x = -2;
1999 return x;
2000}
2001
2002
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002003/* Add the absolute values of two long integers. */
2004
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002005static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002006x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002007{
Christian Heimese93237d2007-12-19 02:37:44 +00002008 Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002009 PyLongObject *z;
Mark Dickinson76eb7892009-01-24 15:42:34 +00002010 Py_ssize_t i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002011 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00002012
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002013 /* Ensure a is the larger of the two: */
2014 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002015 { PyLongObject *temp = a; a = b; b = temp; }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002016 { Py_ssize_t size_temp = size_a;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002017 size_a = size_b;
2018 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002019 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002020 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002021 if (z == NULL)
2022 return NULL;
2023 for (i = 0; i < size_b; ++i) {
2024 carry += a->ob_digit[i] + b->ob_digit[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002025 z->ob_digit[i] = carry & PyLong_MASK;
2026 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002027 }
2028 for (; i < size_a; ++i) {
2029 carry += a->ob_digit[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002030 z->ob_digit[i] = carry & PyLong_MASK;
2031 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002032 }
2033 z->ob_digit[i] = carry;
2034 return long_normalize(z);
2035}
2036
2037/* Subtract the absolute values of two integers. */
2038
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002039static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002040x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002041{
Christian Heimese93237d2007-12-19 02:37:44 +00002042 Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002043 PyLongObject *z;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002044 Py_ssize_t i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002045 int sign = 1;
2046 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00002047
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002048 /* Ensure a is the larger of the two: */
2049 if (size_a < size_b) {
2050 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002051 { PyLongObject *temp = a; a = b; b = temp; }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002052 { Py_ssize_t size_temp = size_a;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002053 size_a = size_b;
2054 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002055 }
2056 else if (size_a == size_b) {
2057 /* Find highest digit where a and b differ: */
2058 i = size_a;
2059 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
2060 ;
2061 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002062 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002063 if (a->ob_digit[i] < b->ob_digit[i]) {
2064 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002065 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002066 }
2067 size_a = size_b = i+1;
2068 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002069 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002070 if (z == NULL)
2071 return NULL;
2072 for (i = 0; i < size_b; ++i) {
2073 /* The following assumes unsigned arithmetic
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002074 works module 2**N for some N>PyLong_SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002075 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002076 z->ob_digit[i] = borrow & PyLong_MASK;
2077 borrow >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002078 borrow &= 1; /* Keep only one sign bit */
2079 }
2080 for (; i < size_a; ++i) {
2081 borrow = a->ob_digit[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002082 z->ob_digit[i] = borrow & PyLong_MASK;
2083 borrow >>= PyLong_SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00002084 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002085 }
2086 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002087 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002088 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002089 return long_normalize(z);
2090}
2091
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002092static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002093long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002094{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002095 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002096
Neil Schemenauerba872e22001-01-04 01:46:03 +00002097 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2098
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002099 if (a->ob_size < 0) {
2100 if (b->ob_size < 0) {
2101 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002102 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002103 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002104 }
2105 else
2106 z = x_sub(b, a);
2107 }
2108 else {
2109 if (b->ob_size < 0)
2110 z = x_sub(a, b);
2111 else
2112 z = x_add(a, b);
2113 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002114 Py_DECREF(a);
2115 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002116 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002117}
2118
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002119static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002120long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002121{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002122 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002123
Neil Schemenauerba872e22001-01-04 01:46:03 +00002124 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2125
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002126 if (a->ob_size < 0) {
2127 if (b->ob_size < 0)
2128 z = x_sub(a, b);
2129 else
2130 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002131 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002132 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002133 }
2134 else {
2135 if (b->ob_size < 0)
2136 z = x_add(a, b);
2137 else
2138 z = x_sub(a, b);
2139 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002140 Py_DECREF(a);
2141 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002142 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002143}
2144
Tim Peters5af4e6c2002-08-12 02:31:19 +00002145/* Grade school multiplication, ignoring the signs.
2146 * Returns the absolute value of the product, or NULL if error.
2147 */
2148static PyLongObject *
2149x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002150{
Tim Peters5af4e6c2002-08-12 02:31:19 +00002151 PyLongObject *z;
Christian Heimese93237d2007-12-19 02:37:44 +00002152 Py_ssize_t size_a = ABS(Py_SIZE(a));
2153 Py_ssize_t size_b = ABS(Py_SIZE(b));
Martin v. Löwis18e16552006-02-15 17:27:45 +00002154 Py_ssize_t i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002155
Tim Peters5af4e6c2002-08-12 02:31:19 +00002156 z = _PyLong_New(size_a + size_b);
2157 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002158 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002159
Christian Heimese93237d2007-12-19 02:37:44 +00002160 memset(z->ob_digit, 0, Py_SIZE(z) * sizeof(digit));
Tim Peters0973b992004-08-29 22:16:50 +00002161 if (a == b) {
2162 /* Efficient squaring per HAC, Algorithm 14.16:
2163 * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
2164 * Gives slightly less than a 2x speedup when a == b,
2165 * via exploiting that each entry in the multiplication
2166 * pyramid appears twice (except for the size_a squares).
2167 */
2168 for (i = 0; i < size_a; ++i) {
2169 twodigits carry;
2170 twodigits f = a->ob_digit[i];
2171 digit *pz = z->ob_digit + (i << 1);
2172 digit *pa = a->ob_digit + i + 1;
2173 digit *paend = a->ob_digit + size_a;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002174
Tim Peters0973b992004-08-29 22:16:50 +00002175 SIGCHECK({
2176 Py_DECREF(z);
2177 return NULL;
2178 })
2179
2180 carry = *pz + f * f;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002181 *pz++ = (digit)(carry & PyLong_MASK);
2182 carry >>= PyLong_SHIFT;
2183 assert(carry <= PyLong_MASK);
Tim Peters0973b992004-08-29 22:16:50 +00002184
2185 /* Now f is added in twice in each column of the
2186 * pyramid it appears. Same as adding f<<1 once.
2187 */
2188 f <<= 1;
2189 while (pa < paend) {
2190 carry += *pz + *pa++ * f;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002191 *pz++ = (digit)(carry & PyLong_MASK);
2192 carry >>= PyLong_SHIFT;
2193 assert(carry <= (PyLong_MASK << 1));
Tim Peters0973b992004-08-29 22:16:50 +00002194 }
2195 if (carry) {
2196 carry += *pz;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002197 *pz++ = (digit)(carry & PyLong_MASK);
2198 carry >>= PyLong_SHIFT;
Tim Peters0973b992004-08-29 22:16:50 +00002199 }
2200 if (carry)
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002201 *pz += (digit)(carry & PyLong_MASK);
2202 assert((carry >> PyLong_SHIFT) == 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002203 }
Tim Peters0973b992004-08-29 22:16:50 +00002204 }
2205 else { /* a is not the same as b -- gradeschool long mult */
2206 for (i = 0; i < size_a; ++i) {
2207 twodigits carry = 0;
2208 twodigits f = a->ob_digit[i];
2209 digit *pz = z->ob_digit + i;
2210 digit *pb = b->ob_digit;
2211 digit *pbend = b->ob_digit + size_b;
2212
2213 SIGCHECK({
2214 Py_DECREF(z);
2215 return NULL;
2216 })
2217
2218 while (pb < pbend) {
2219 carry += *pz + *pb++ * f;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002220 *pz++ = (digit)(carry & PyLong_MASK);
2221 carry >>= PyLong_SHIFT;
2222 assert(carry <= PyLong_MASK);
Tim Peters0973b992004-08-29 22:16:50 +00002223 }
2224 if (carry)
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002225 *pz += (digit)(carry & PyLong_MASK);
2226 assert((carry >> PyLong_SHIFT) == 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002227 }
2228 }
Tim Peters44121a62002-08-12 06:17:58 +00002229 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002230}
2231
2232/* A helper for Karatsuba multiplication (k_mul).
2233 Takes a long "n" and an integer "size" representing the place to
2234 split, and sets low and high such that abs(n) == (high << size) + low,
2235 viewing the shift as being by digits. The sign bit is ignored, and
2236 the return values are >= 0.
2237 Returns 0 on success, -1 on failure.
2238*/
2239static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002240kmul_split(PyLongObject *n, Py_ssize_t size, PyLongObject **high, PyLongObject **low)
Tim Peters5af4e6c2002-08-12 02:31:19 +00002241{
2242 PyLongObject *hi, *lo;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002243 Py_ssize_t size_lo, size_hi;
Christian Heimese93237d2007-12-19 02:37:44 +00002244 const Py_ssize_t size_n = ABS(Py_SIZE(n));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002245
2246 size_lo = MIN(size_n, size);
2247 size_hi = size_n - size_lo;
2248
2249 if ((hi = _PyLong_New(size_hi)) == NULL)
2250 return -1;
2251 if ((lo = _PyLong_New(size_lo)) == NULL) {
2252 Py_DECREF(hi);
2253 return -1;
2254 }
2255
2256 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
2257 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
2258
2259 *high = long_normalize(hi);
2260 *low = long_normalize(lo);
2261 return 0;
2262}
2263
Tim Peters60004642002-08-12 22:01:34 +00002264static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
2265
Tim Peters5af4e6c2002-08-12 02:31:19 +00002266/* Karatsuba multiplication. Ignores the input signs, and returns the
2267 * absolute value of the product (or NULL if error).
2268 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
2269 */
2270static PyLongObject *
2271k_mul(PyLongObject *a, PyLongObject *b)
2272{
Christian Heimese93237d2007-12-19 02:37:44 +00002273 Py_ssize_t asize = ABS(Py_SIZE(a));
2274 Py_ssize_t bsize = ABS(Py_SIZE(b));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002275 PyLongObject *ah = NULL;
2276 PyLongObject *al = NULL;
2277 PyLongObject *bh = NULL;
2278 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002279 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00002280 PyLongObject *t1, *t2, *t3;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002281 Py_ssize_t shift; /* the number of digits we split off */
2282 Py_ssize_t i;
Tim Peters738eda72002-08-12 15:08:20 +00002283
Tim Peters5af4e6c2002-08-12 02:31:19 +00002284 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
2285 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
2286 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00002287 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00002288 * By picking X to be a power of 2, "*X" is just shifting, and it's
2289 * been reduced to 3 multiplies on numbers half the size.
2290 */
2291
Tim Petersfc07e562002-08-12 02:54:10 +00002292 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00002293 * is largest.
2294 */
Tim Peters738eda72002-08-12 15:08:20 +00002295 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002296 t1 = a;
2297 a = b;
2298 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00002299
2300 i = asize;
2301 asize = bsize;
2302 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002303 }
2304
2305 /* Use gradeschool math when either number is too small. */
Tim Peters0973b992004-08-29 22:16:50 +00002306 i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF;
2307 if (asize <= i) {
Tim Peters738eda72002-08-12 15:08:20 +00002308 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00002309 return _PyLong_New(0);
2310 else
2311 return x_mul(a, b);
2312 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002313
Tim Peters60004642002-08-12 22:01:34 +00002314 /* If a is small compared to b, splitting on b gives a degenerate
2315 * case with ah==0, and Karatsuba may be (even much) less efficient
2316 * than "grade school" then. However, we can still win, by viewing
2317 * b as a string of "big digits", each of width a->ob_size. That
2318 * leads to a sequence of balanced calls to k_mul.
2319 */
2320 if (2 * asize <= bsize)
2321 return k_lopsided_mul(a, b);
2322
Tim Petersd6974a52002-08-13 20:37:51 +00002323 /* Split a & b into hi & lo pieces. */
Tim Peters738eda72002-08-12 15:08:20 +00002324 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002325 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
Christian Heimese93237d2007-12-19 02:37:44 +00002326 assert(Py_SIZE(ah) > 0); /* the split isn't degenerate */
Tim Petersd6974a52002-08-13 20:37:51 +00002327
Tim Peters0973b992004-08-29 22:16:50 +00002328 if (a == b) {
2329 bh = ah;
2330 bl = al;
2331 Py_INCREF(bh);
2332 Py_INCREF(bl);
2333 }
2334 else if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002335
Tim Petersd64c1de2002-08-12 17:36:03 +00002336 /* The plan:
2337 * 1. Allocate result space (asize + bsize digits: that's always
2338 * enough).
2339 * 2. Compute ah*bh, and copy into result at 2*shift.
2340 * 3. Compute al*bl, and copy into result at 0. Note that this
2341 * can't overlap with #2.
2342 * 4. Subtract al*bl from the result, starting at shift. This may
2343 * underflow (borrow out of the high digit), but we don't care:
2344 * we're effectively doing unsigned arithmetic mod
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002345 * PyLong_BASE**(sizea + sizeb), and so long as the *final* result fits,
Tim Petersd64c1de2002-08-12 17:36:03 +00002346 * borrows and carries out of the high digit can be ignored.
2347 * 5. Subtract ah*bh from the result, starting at shift.
2348 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
2349 * at shift.
2350 */
2351
2352 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00002353 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002354 if (ret == NULL) goto fail;
2355#ifdef Py_DEBUG
2356 /* Fill with trash, to catch reference to uninitialized digits. */
Christian Heimese93237d2007-12-19 02:37:44 +00002357 memset(ret->ob_digit, 0xDF, Py_SIZE(ret) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002358#endif
Tim Peters44121a62002-08-12 06:17:58 +00002359
Tim Petersd64c1de2002-08-12 17:36:03 +00002360 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00002361 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
Christian Heimese93237d2007-12-19 02:37:44 +00002362 assert(Py_SIZE(t1) >= 0);
2363 assert(2*shift + Py_SIZE(t1) <= Py_SIZE(ret));
Tim Peters738eda72002-08-12 15:08:20 +00002364 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
Christian Heimese93237d2007-12-19 02:37:44 +00002365 Py_SIZE(t1) * sizeof(digit));
Tim Peters738eda72002-08-12 15:08:20 +00002366
2367 /* Zero-out the digits higher than the ah*bh copy. */
Christian Heimese93237d2007-12-19 02:37:44 +00002368 i = Py_SIZE(ret) - 2*shift - Py_SIZE(t1);
Tim Peters44121a62002-08-12 06:17:58 +00002369 if (i)
Christian Heimese93237d2007-12-19 02:37:44 +00002370 memset(ret->ob_digit + 2*shift + Py_SIZE(t1), 0,
Tim Peters44121a62002-08-12 06:17:58 +00002371 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002372
Tim Petersd64c1de2002-08-12 17:36:03 +00002373 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00002374 if ((t2 = k_mul(al, bl)) == NULL) {
2375 Py_DECREF(t1);
2376 goto fail;
2377 }
Christian Heimese93237d2007-12-19 02:37:44 +00002378 assert(Py_SIZE(t2) >= 0);
2379 assert(Py_SIZE(t2) <= 2*shift); /* no overlap with high digits */
2380 memcpy(ret->ob_digit, t2->ob_digit, Py_SIZE(t2) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002381
2382 /* Zero out remaining digits. */
Christian Heimese93237d2007-12-19 02:37:44 +00002383 i = 2*shift - Py_SIZE(t2); /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002384 if (i)
Christian Heimese93237d2007-12-19 02:37:44 +00002385 memset(ret->ob_digit + Py_SIZE(t2), 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002386
Tim Petersd64c1de2002-08-12 17:36:03 +00002387 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
2388 * because it's fresher in cache.
2389 */
Christian Heimese93237d2007-12-19 02:37:44 +00002390 i = Py_SIZE(ret) - shift; /* # digits after shift */
2391 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, Py_SIZE(t2));
Tim Peters738eda72002-08-12 15:08:20 +00002392 Py_DECREF(t2);
2393
Christian Heimese93237d2007-12-19 02:37:44 +00002394 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, Py_SIZE(t1));
Tim Peters738eda72002-08-12 15:08:20 +00002395 Py_DECREF(t1);
2396
Tim Petersd64c1de2002-08-12 17:36:03 +00002397 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002398 if ((t1 = x_add(ah, al)) == NULL) goto fail;
2399 Py_DECREF(ah);
2400 Py_DECREF(al);
2401 ah = al = NULL;
2402
Tim Peters0973b992004-08-29 22:16:50 +00002403 if (a == b) {
2404 t2 = t1;
2405 Py_INCREF(t2);
2406 }
2407 else if ((t2 = x_add(bh, bl)) == NULL) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002408 Py_DECREF(t1);
2409 goto fail;
2410 }
2411 Py_DECREF(bh);
2412 Py_DECREF(bl);
2413 bh = bl = NULL;
2414
Tim Peters738eda72002-08-12 15:08:20 +00002415 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002416 Py_DECREF(t1);
2417 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00002418 if (t3 == NULL) goto fail;
Christian Heimese93237d2007-12-19 02:37:44 +00002419 assert(Py_SIZE(t3) >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002420
Tim Petersd6974a52002-08-13 20:37:51 +00002421 /* Add t3. It's not obvious why we can't run out of room here.
2422 * See the (*) comment after this function.
Tim Petersd8b21732002-08-12 19:30:26 +00002423 */
Christian Heimese93237d2007-12-19 02:37:44 +00002424 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, Py_SIZE(t3));
Tim Peters738eda72002-08-12 15:08:20 +00002425 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002426
Tim Peters5af4e6c2002-08-12 02:31:19 +00002427 return long_normalize(ret);
2428
2429 fail:
2430 Py_XDECREF(ret);
2431 Py_XDECREF(ah);
2432 Py_XDECREF(al);
2433 Py_XDECREF(bh);
2434 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002435 return NULL;
2436}
2437
Tim Petersd6974a52002-08-13 20:37:51 +00002438/* (*) Why adding t3 can't "run out of room" above.
2439
Tim Petersab86c2b2002-08-15 20:06:00 +00002440Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
2441to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00002442
Tim Petersab86c2b2002-08-15 20:06:00 +000024431. For any integer i, i = c(i/2) + f(i/2). In particular,
2444 bsize = c(bsize/2) + f(bsize/2).
24452. shift = f(bsize/2)
24463. asize <= bsize
24474. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
2448 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00002449
Tim Petersab86c2b2002-08-15 20:06:00 +00002450We allocated asize + bsize result digits, and add t3 into them at an offset
2451of shift. This leaves asize+bsize-shift allocated digit positions for t3
2452to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
2453asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00002454
Tim Petersab86c2b2002-08-15 20:06:00 +00002455bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
2456at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00002457
Tim Petersab86c2b2002-08-15 20:06:00 +00002458If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
2459digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
2460most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00002461
Tim Petersab86c2b2002-08-15 20:06:00 +00002462The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00002463
Tim Petersab86c2b2002-08-15 20:06:00 +00002464 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00002465
Tim Petersab86c2b2002-08-15 20:06:00 +00002466and we have asize + c(bsize/2) available digit positions. We need to show
2467this is always enough. An instance of c(bsize/2) cancels out in both, so
2468the question reduces to whether asize digits is enough to hold
2469(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
2470then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
2471asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002472digit is enough to hold 2 bits. This is so since PyLong_SHIFT=15 >= 2. If
Tim Petersab86c2b2002-08-15 20:06:00 +00002473asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00002474c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
2475is enough to hold 2 bits. This is so if bsize >= 2, which holds because
2476bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00002477
Tim Peters48d52c02002-08-14 17:07:32 +00002478Note that since there's always enough room for (ah+al)*(bh+bl), and that's
2479clearly >= each of ah*bh and al*bl, there's always enough room to subtract
2480ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00002481*/
2482
Tim Peters60004642002-08-12 22:01:34 +00002483/* b has at least twice the digits of a, and a is big enough that Karatsuba
2484 * would pay off *if* the inputs had balanced sizes. View b as a sequence
2485 * of slices, each with a->ob_size digits, and multiply the slices by a,
2486 * one at a time. This gives k_mul balanced inputs to work with, and is
2487 * also cache-friendly (we compute one double-width slice of the result
2488 * at a time, then move on, never bactracking except for the helpful
2489 * single-width slice overlap between successive partial sums).
2490 */
2491static PyLongObject *
2492k_lopsided_mul(PyLongObject *a, PyLongObject *b)
2493{
Christian Heimese93237d2007-12-19 02:37:44 +00002494 const Py_ssize_t asize = ABS(Py_SIZE(a));
2495 Py_ssize_t bsize = ABS(Py_SIZE(b));
Martin v. Löwis18e16552006-02-15 17:27:45 +00002496 Py_ssize_t nbdone; /* # of b digits already multiplied */
Tim Peters60004642002-08-12 22:01:34 +00002497 PyLongObject *ret;
2498 PyLongObject *bslice = NULL;
2499
2500 assert(asize > KARATSUBA_CUTOFF);
2501 assert(2 * asize <= bsize);
2502
2503 /* Allocate result space, and zero it out. */
2504 ret = _PyLong_New(asize + bsize);
2505 if (ret == NULL)
2506 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00002507 memset(ret->ob_digit, 0, Py_SIZE(ret) * sizeof(digit));
Tim Peters60004642002-08-12 22:01:34 +00002508
2509 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00002510 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00002511 if (bslice == NULL)
2512 goto fail;
2513
2514 nbdone = 0;
2515 while (bsize > 0) {
2516 PyLongObject *product;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002517 const Py_ssize_t nbtouse = MIN(bsize, asize);
Tim Peters60004642002-08-12 22:01:34 +00002518
2519 /* Multiply the next slice of b by a. */
2520 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
2521 nbtouse * sizeof(digit));
Christian Heimese93237d2007-12-19 02:37:44 +00002522 Py_SIZE(bslice) = nbtouse;
Tim Peters60004642002-08-12 22:01:34 +00002523 product = k_mul(a, bslice);
2524 if (product == NULL)
2525 goto fail;
2526
2527 /* Add into result. */
Christian Heimese93237d2007-12-19 02:37:44 +00002528 (void)v_iadd(ret->ob_digit + nbdone, Py_SIZE(ret) - nbdone,
2529 product->ob_digit, Py_SIZE(product));
Tim Peters60004642002-08-12 22:01:34 +00002530 Py_DECREF(product);
2531
2532 bsize -= nbtouse;
2533 nbdone += nbtouse;
2534 }
2535
2536 Py_DECREF(bslice);
2537 return long_normalize(ret);
2538
2539 fail:
2540 Py_DECREF(ret);
2541 Py_XDECREF(bslice);
2542 return NULL;
2543}
Tim Peters5af4e6c2002-08-12 02:31:19 +00002544
2545static PyObject *
2546long_mul(PyLongObject *v, PyLongObject *w)
2547{
2548 PyLongObject *a, *b, *z;
2549
2550 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002551 Py_INCREF(Py_NotImplemented);
2552 return Py_NotImplemented;
2553 }
2554
Tim Petersd64c1de2002-08-12 17:36:03 +00002555 z = k_mul(a, b);
Tim Peters9973d742002-08-15 19:41:06 +00002556 /* Negate if exactly one of the inputs is negative. */
2557 if (((a->ob_size ^ b->ob_size) < 0) && z)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002558 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002559 Py_DECREF(a);
2560 Py_DECREF(b);
Tim Peters9973d742002-08-15 19:41:06 +00002561 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002562}
2563
Guido van Rossume32e0141992-01-19 16:31:05 +00002564/* The / and % operators are now defined in terms of divmod().
2565 The expression a mod b has the value a - b*floor(a/b).
2566 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002567 |a| by |b|, with the sign of a. This is also expressed
2568 as a - b*trunc(a/b), if trunc truncates towards zero.
2569 Some examples:
2570 a b a rem b a mod b
2571 13 10 3 3
2572 -13 10 -3 7
2573 13 -10 3 -7
2574 -13 -10 -3 -3
2575 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002576 have different signs. We then subtract one from the 'div'
2577 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002578
Tim Peters47e52ee2004-08-30 02:44:38 +00002579/* Compute
2580 * *pdiv, *pmod = divmod(v, w)
2581 * NULL can be passed for pdiv or pmod, in which case that part of
2582 * the result is simply thrown away. The caller owns a reference to
2583 * each of these it requests (does not pass NULL for).
2584 */
Guido van Rossume32e0141992-01-19 16:31:05 +00002585static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00002586l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00002587 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00002588{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002589 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002590
Guido van Rossume32e0141992-01-19 16:31:05 +00002591 if (long_divrem(v, w, &div, &mod) < 0)
2592 return -1;
Christian Heimese93237d2007-12-19 02:37:44 +00002593 if ((Py_SIZE(mod) < 0 && Py_SIZE(w) > 0) ||
2594 (Py_SIZE(mod) > 0 && Py_SIZE(w) < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002595 PyLongObject *temp;
2596 PyLongObject *one;
2597 temp = (PyLongObject *) long_add(mod, w);
2598 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00002599 mod = temp;
2600 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002601 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002602 return -1;
2603 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002604 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00002605 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002606 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
2607 Py_DECREF(mod);
2608 Py_DECREF(div);
2609 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00002610 return -1;
2611 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002612 Py_DECREF(one);
2613 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002614 div = temp;
2615 }
Tim Peters47e52ee2004-08-30 02:44:38 +00002616 if (pdiv != NULL)
2617 *pdiv = div;
2618 else
2619 Py_DECREF(div);
2620
2621 if (pmod != NULL)
2622 *pmod = mod;
2623 else
2624 Py_DECREF(mod);
2625
Guido van Rossume32e0141992-01-19 16:31:05 +00002626 return 0;
2627}
2628
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002629static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002630long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002631{
Tim Peters47e52ee2004-08-30 02:44:38 +00002632 PyLongObject *a, *b, *div;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002633
2634 CONVERT_BINOP(v, w, &a, &b);
Tim Peters47e52ee2004-08-30 02:44:38 +00002635 if (l_divmod(a, b, &div, NULL) < 0)
2636 div = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002637 Py_DECREF(a);
2638 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002639 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00002640}
2641
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002642static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00002643long_classic_div(PyObject *v, PyObject *w)
2644{
Tim Peters47e52ee2004-08-30 02:44:38 +00002645 PyLongObject *a, *b, *div;
Guido van Rossum393661d2001-08-31 17:40:15 +00002646
2647 CONVERT_BINOP(v, w, &a, &b);
Guido van Rossum393661d2001-08-31 17:40:15 +00002648 if (Py_DivisionWarningFlag &&
2649 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
2650 div = NULL;
Tim Peters47e52ee2004-08-30 02:44:38 +00002651 else if (l_divmod(a, b, &div, NULL) < 0)
Guido van Rossum393661d2001-08-31 17:40:15 +00002652 div = NULL;
Guido van Rossum393661d2001-08-31 17:40:15 +00002653 Py_DECREF(a);
2654 Py_DECREF(b);
2655 return (PyObject *)div;
2656}
2657
2658static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00002659long_true_divide(PyObject *v, PyObject *w)
2660{
Tim Peterse2a60002001-09-04 06:17:36 +00002661 PyLongObject *a, *b;
2662 double ad, bd;
Thomas Wouters553489a2006-02-01 21:32:04 +00002663 int failed, aexp = -1, bexp = -1;
Tim Peterse2a60002001-09-04 06:17:36 +00002664
2665 CONVERT_BINOP(v, w, &a, &b);
2666 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
2667 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00002668 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
2669 Py_DECREF(a);
2670 Py_DECREF(b);
2671 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00002672 return NULL;
Thomas Wouters553489a2006-02-01 21:32:04 +00002673 /* 'aexp' and 'bexp' were initialized to -1 to silence gcc-4.0.x,
2674 but should really be set correctly after sucessful calls to
2675 _PyLong_AsScaledDouble() */
2676 assert(aexp >= 0 && bexp >= 0);
Tim Peterse2a60002001-09-04 06:17:36 +00002677
2678 if (bd == 0.0) {
2679 PyErr_SetString(PyExc_ZeroDivisionError,
2680 "long division or modulo by zero");
2681 return NULL;
2682 }
2683
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002684 /* True value is very close to ad/bd * 2**(PyLong_SHIFT*(aexp-bexp)) */
Tim Peterse2a60002001-09-04 06:17:36 +00002685 ad /= bd; /* overflow/underflow impossible here */
2686 aexp -= bexp;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002687 if (aexp > INT_MAX / PyLong_SHIFT)
Tim Peterse2a60002001-09-04 06:17:36 +00002688 goto overflow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002689 else if (aexp < -(INT_MAX / PyLong_SHIFT))
Tim Peterse56ed9b2001-09-06 21:59:14 +00002690 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002691 errno = 0;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002692 ad = ldexp(ad, aexp * PyLong_SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002693 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002694 goto overflow;
2695 return PyFloat_FromDouble(ad);
2696
2697overflow:
2698 PyErr_SetString(PyExc_OverflowError,
2699 "long/long too large for a float");
2700 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002701
Tim Peters20dab9f2001-09-04 05:31:47 +00002702}
2703
2704static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002705long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002706{
Tim Peters47e52ee2004-08-30 02:44:38 +00002707 PyLongObject *a, *b, *mod;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002708
2709 CONVERT_BINOP(v, w, &a, &b);
2710
Tim Peters47e52ee2004-08-30 02:44:38 +00002711 if (l_divmod(a, b, NULL, &mod) < 0)
2712 mod = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002713 Py_DECREF(a);
2714 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002715 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002716}
2717
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002718static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002719long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002720{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002721 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002722 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002723
2724 CONVERT_BINOP(v, w, &a, &b);
2725
2726 if (l_divmod(a, b, &div, &mod) < 0) {
2727 Py_DECREF(a);
2728 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002729 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002730 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002731 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002732 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002733 PyTuple_SetItem(z, 0, (PyObject *) div);
2734 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002735 }
2736 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002737 Py_DECREF(div);
2738 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002739 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002740 Py_DECREF(a);
2741 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002742 return z;
2743}
2744
Tim Peters47e52ee2004-08-30 02:44:38 +00002745/* pow(v, w, x) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002746static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002747long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002748{
Tim Peters47e52ee2004-08-30 02:44:38 +00002749 PyLongObject *a, *b, *c; /* a,b,c = v,w,x */
2750 int negativeOutput = 0; /* if x<0 return negative output */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002751
Tim Peters47e52ee2004-08-30 02:44:38 +00002752 PyLongObject *z = NULL; /* accumulated result */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002753 Py_ssize_t i, j, k; /* counters */
Tim Peters47e52ee2004-08-30 02:44:38 +00002754 PyLongObject *temp = NULL;
2755
2756 /* 5-ary values. If the exponent is large enough, table is
2757 * precomputed so that table[i] == a**i % c for i in range(32).
2758 */
2759 PyLongObject *table[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2760 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
2761
2762 /* a, b, c = v, w, x */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002763 CONVERT_BINOP(v, w, &a, &b);
Tim Peters47e52ee2004-08-30 02:44:38 +00002764 if (PyLong_Check(x)) {
2765 c = (PyLongObject *)x;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002766 Py_INCREF(x);
2767 }
Tim Petersde7990b2005-07-17 23:45:23 +00002768 else if (PyInt_Check(x)) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002769 c = (PyLongObject *)PyLong_FromLong(PyInt_AS_LONG(x));
Tim Petersde7990b2005-07-17 23:45:23 +00002770 if (c == NULL)
2771 goto Error;
2772 }
Tim Peters47e52ee2004-08-30 02:44:38 +00002773 else if (x == Py_None)
2774 c = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002775 else {
2776 Py_DECREF(a);
2777 Py_DECREF(b);
2778 Py_INCREF(Py_NotImplemented);
2779 return Py_NotImplemented;
2780 }
Tim Peters4c483c42001-09-05 06:24:58 +00002781
Christian Heimese93237d2007-12-19 02:37:44 +00002782 if (Py_SIZE(b) < 0) { /* if exponent is negative */
Tim Peters47e52ee2004-08-30 02:44:38 +00002783 if (c) {
Tim Peters4c483c42001-09-05 06:24:58 +00002784 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
Tim Peters47e52ee2004-08-30 02:44:38 +00002785 "cannot be negative when 3rd argument specified");
Tim Peterscd97da32004-08-30 02:58:59 +00002786 goto Error;
Tim Peters32f453e2001-09-03 08:35:41 +00002787 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002788 else {
Tim Peters47e52ee2004-08-30 02:44:38 +00002789 /* else return a float. This works because we know
2790 that this calls float_pow() which converts its
2791 arguments to double. */
2792 Py_DECREF(a);
2793 Py_DECREF(b);
2794 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002795 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002796 }
Tim Peters47e52ee2004-08-30 02:44:38 +00002797
2798 if (c) {
2799 /* if modulus == 0:
2800 raise ValueError() */
Christian Heimese93237d2007-12-19 02:37:44 +00002801 if (Py_SIZE(c) == 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002802 PyErr_SetString(PyExc_ValueError,
2803 "pow() 3rd argument cannot be 0");
Tim Peterscd97da32004-08-30 02:58:59 +00002804 goto Error;
Tim Peters47e52ee2004-08-30 02:44:38 +00002805 }
2806
2807 /* if modulus < 0:
2808 negativeOutput = True
2809 modulus = -modulus */
Christian Heimese93237d2007-12-19 02:37:44 +00002810 if (Py_SIZE(c) < 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002811 negativeOutput = 1;
2812 temp = (PyLongObject *)_PyLong_Copy(c);
2813 if (temp == NULL)
2814 goto Error;
2815 Py_DECREF(c);
2816 c = temp;
2817 temp = NULL;
2818 c->ob_size = - c->ob_size;
2819 }
2820
2821 /* if modulus == 1:
2822 return 0 */
Christian Heimese93237d2007-12-19 02:37:44 +00002823 if ((Py_SIZE(c) == 1) && (c->ob_digit[0] == 1)) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002824 z = (PyLongObject *)PyLong_FromLong(0L);
2825 goto Done;
2826 }
2827
2828 /* if base < 0:
2829 base = base % modulus
2830 Having the base positive just makes things easier. */
Christian Heimese93237d2007-12-19 02:37:44 +00002831 if (Py_SIZE(a) < 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002832 if (l_divmod(a, c, NULL, &temp) < 0)
Tim Peterscd97da32004-08-30 02:58:59 +00002833 goto Error;
Tim Peters47e52ee2004-08-30 02:44:38 +00002834 Py_DECREF(a);
2835 a = temp;
2836 temp = NULL;
2837 }
2838 }
2839
2840 /* At this point a, b, and c are guaranteed non-negative UNLESS
2841 c is NULL, in which case a may be negative. */
2842
2843 z = (PyLongObject *)PyLong_FromLong(1L);
2844 if (z == NULL)
2845 goto Error;
2846
2847 /* Perform a modular reduction, X = X % c, but leave X alone if c
2848 * is NULL.
2849 */
2850#define REDUCE(X) \
2851 if (c != NULL) { \
2852 if (l_divmod(X, c, NULL, &temp) < 0) \
2853 goto Error; \
2854 Py_XDECREF(X); \
2855 X = temp; \
2856 temp = NULL; \
2857 }
2858
2859 /* Multiply two values, then reduce the result:
2860 result = X*Y % c. If c is NULL, skip the mod. */
2861#define MULT(X, Y, result) \
2862{ \
2863 temp = (PyLongObject *)long_mul(X, Y); \
2864 if (temp == NULL) \
2865 goto Error; \
2866 Py_XDECREF(result); \
2867 result = temp; \
2868 temp = NULL; \
2869 REDUCE(result) \
2870}
2871
Christian Heimese93237d2007-12-19 02:37:44 +00002872 if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002873 /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
2874 /* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf */
Christian Heimese93237d2007-12-19 02:37:44 +00002875 for (i = Py_SIZE(b) - 1; i >= 0; --i) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002876 digit bi = b->ob_digit[i];
2877
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002878 for (j = 1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002879 MULT(z, z, z)
2880 if (bi & j)
2881 MULT(z, a, z)
2882 }
2883 }
2884 }
2885 else {
2886 /* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */
2887 Py_INCREF(z); /* still holds 1L */
2888 table[0] = z;
2889 for (i = 1; i < 32; ++i)
2890 MULT(table[i-1], a, table[i])
2891
Christian Heimese93237d2007-12-19 02:37:44 +00002892 for (i = Py_SIZE(b) - 1; i >= 0; --i) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002893 const digit bi = b->ob_digit[i];
2894
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002895 for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002896 const int index = (bi >> j) & 0x1f;
2897 for (k = 0; k < 5; ++k)
2898 MULT(z, z, z)
2899 if (index)
2900 MULT(z, table[index], z)
2901 }
2902 }
2903 }
2904
Christian Heimese93237d2007-12-19 02:37:44 +00002905 if (negativeOutput && (Py_SIZE(z) != 0)) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002906 temp = (PyLongObject *)long_sub(z, c);
2907 if (temp == NULL)
2908 goto Error;
2909 Py_DECREF(z);
2910 z = temp;
2911 temp = NULL;
2912 }
2913 goto Done;
2914
2915 Error:
2916 if (z != NULL) {
2917 Py_DECREF(z);
2918 z = NULL;
2919 }
2920 /* fall through */
2921 Done:
Christian Heimese93237d2007-12-19 02:37:44 +00002922 if (Py_SIZE(b) > FIVEARY_CUTOFF) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002923 for (i = 0; i < 32; ++i)
2924 Py_XDECREF(table[i]);
2925 }
Tim Petersde7990b2005-07-17 23:45:23 +00002926 Py_DECREF(a);
2927 Py_DECREF(b);
2928 Py_XDECREF(c);
2929 Py_XDECREF(temp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002930 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002931}
2932
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002933static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002934long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002935{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002936 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002937 PyLongObject *x;
2938 PyLongObject *w;
2939 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002940 if (w == NULL)
2941 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002942 x = (PyLongObject *) long_add(v, w);
2943 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002944 if (x == NULL)
2945 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00002946 Py_SIZE(x) = -(Py_SIZE(x));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002947 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002948}
2949
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002950static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002951long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002952{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002953 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002954 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002955 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002956 Py_INCREF(v);
2957 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002958 }
Tim Peters69c2de32001-09-11 22:31:33 +00002959 z = (PyLongObject *)_PyLong_Copy(v);
2960 if (z != NULL)
2961 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002962 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002963}
2964
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002965static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002966long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002967{
2968 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002969 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002970 else
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00002971 return long_long((PyObject *)v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002972}
2973
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002974static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002975long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002976{
Christian Heimese93237d2007-12-19 02:37:44 +00002977 return ABS(Py_SIZE(v)) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002978}
2979
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002980static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002981long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002982{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002983 PyLongObject *a, *b;
2984 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002985 long shiftby;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002986 Py_ssize_t newsize, wordshift, loshift, hishift, i, j;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002987 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002988
Neil Schemenauerba872e22001-01-04 01:46:03 +00002989 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2990
Christian Heimese93237d2007-12-19 02:37:44 +00002991 if (Py_SIZE(a) < 0) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002992 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002993 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002994 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002995 if (a1 == NULL)
2996 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002997 a2 = (PyLongObject *) long_rshift(a1, b);
2998 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002999 if (a2 == NULL)
3000 goto rshift_error;
3001 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003002 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003003 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00003004 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00003005
Neil Schemenauerba872e22001-01-04 01:46:03 +00003006 shiftby = PyLong_AsLong((PyObject *)b);
3007 if (shiftby == -1L && PyErr_Occurred())
3008 goto rshift_error;
3009 if (shiftby < 0) {
3010 PyErr_SetString(PyExc_ValueError,
3011 "negative shift count");
3012 goto rshift_error;
3013 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003014 wordshift = shiftby / PyLong_SHIFT;
Christian Heimese93237d2007-12-19 02:37:44 +00003015 newsize = ABS(Py_SIZE(a)) - wordshift;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003016 if (newsize <= 0) {
3017 z = _PyLong_New(0);
3018 Py_DECREF(a);
3019 Py_DECREF(b);
3020 return (PyObject *)z;
3021 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003022 loshift = shiftby % PyLong_SHIFT;
3023 hishift = PyLong_SHIFT - loshift;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003024 lomask = ((digit)1 << hishift) - 1;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003025 himask = PyLong_MASK ^ lomask;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003026 z = _PyLong_New(newsize);
3027 if (z == NULL)
3028 goto rshift_error;
Christian Heimese93237d2007-12-19 02:37:44 +00003029 if (Py_SIZE(a) < 0)
3030 Py_SIZE(z) = -(Py_SIZE(z));
Neil Schemenauerba872e22001-01-04 01:46:03 +00003031 for (i = 0, j = wordshift; i < newsize; i++, j++) {
3032 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
3033 if (i+1 < newsize)
3034 z->ob_digit[i] |=
3035 (a->ob_digit[j+1] << hishift) & himask;
3036 }
3037 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003038 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00003039rshift_error:
3040 Py_DECREF(a);
3041 Py_DECREF(b);
3042 return (PyObject *) z;
3043
Guido van Rossumc6913e71991-11-19 20:26:46 +00003044}
3045
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003046static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003047long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003048{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003049 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00003050 PyLongObject *a, *b;
3051 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003052 long shiftby;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003053 Py_ssize_t oldsize, newsize, wordshift, remshift, i, j;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003054 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003055
Neil Schemenauerba872e22001-01-04 01:46:03 +00003056 CONVERT_BINOP(v, w, &a, &b);
3057
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003058 shiftby = PyLong_AsLong((PyObject *)b);
3059 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00003060 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003061 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003062 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00003063 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003064 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003065 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003066 PyErr_SetString(PyExc_ValueError,
3067 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00003068 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003069 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003070 /* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
3071 wordshift = (int)shiftby / PyLong_SHIFT;
3072 remshift = (int)shiftby - wordshift * PyLong_SHIFT;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003073
3074 oldsize = ABS(a->ob_size);
3075 newsize = oldsize + wordshift;
3076 if (remshift)
3077 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003078 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003079 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00003080 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003081 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003082 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003083 for (i = 0; i < wordshift; i++)
3084 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003085 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003086 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00003087 accum |= (twodigits)a->ob_digit[j] << remshift;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003088 z->ob_digit[i] = (digit)(accum & PyLong_MASK);
3089 accum >>= PyLong_SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003090 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003091 if (remshift)
3092 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003093 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003094 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003095 z = long_normalize(z);
3096lshift_error:
3097 Py_DECREF(a);
3098 Py_DECREF(b);
3099 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003100}
3101
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003102
3103/* Bitwise and/xor/or operations */
3104
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003105static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003106long_bitwise(PyLongObject *a,
3107 int op, /* '&', '|', '^' */
3108 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003109{
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003110 digit maska, maskb; /* 0 or PyLong_MASK */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003111 int negz;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003112 Py_ssize_t size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003113 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003114 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00003115 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003116 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003117
Christian Heimese93237d2007-12-19 02:37:44 +00003118 if (Py_SIZE(a) < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003119 a = (PyLongObject *) long_invert(a);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003120 if (a == NULL)
3121 return NULL;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003122 maska = PyLong_MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003123 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003124 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003125 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003126 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00003127 }
Christian Heimese93237d2007-12-19 02:37:44 +00003128 if (Py_SIZE(b) < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003129 b = (PyLongObject *) long_invert(b);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003130 if (b == NULL) {
3131 Py_DECREF(a);
3132 return NULL;
3133 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003134 maskb = PyLong_MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003135 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003136 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003137 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003138 maskb = 0;
3139 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003140
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003141 negz = 0;
3142 switch (op) {
3143 case '^':
3144 if (maska != maskb) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003145 maska ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003146 negz = -1;
3147 }
3148 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00003149 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003150 if (maska && maskb) {
3151 op = '|';
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003152 maska ^= PyLong_MASK;
3153 maskb ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003154 negz = -1;
3155 }
3156 break;
3157 case '|':
3158 if (maska || maskb) {
3159 op = '&';
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003160 maska ^= PyLong_MASK;
3161 maskb ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003162 negz = -1;
3163 }
3164 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003165 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003166
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003167 /* JRH: The original logic here was to allocate the result value (z)
3168 as the longer of the two operands. However, there are some cases
3169 where the result is guaranteed to be shorter than that: AND of two
3170 positives, OR of two negatives: use the shorter number. AND with
3171 mixed signs: use the positive number. OR with mixed signs: use the
3172 negative number. After the transformations above, op will be '&'
3173 iff one of these cases applies, and mask will be non-0 for operands
3174 whose length should be ignored.
3175 */
3176
Christian Heimese93237d2007-12-19 02:37:44 +00003177 size_a = Py_SIZE(a);
3178 size_b = Py_SIZE(b);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003179 size_z = op == '&'
3180 ? (maska
3181 ? size_b
3182 : (maskb ? size_a : MIN(size_a, size_b)))
3183 : MAX(size_a, size_b);
3184 z = _PyLong_New(size_z);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003185 if (z == NULL) {
Neal Norwitzef02b9e2006-07-16 02:00:32 +00003186 Py_DECREF(a);
3187 Py_DECREF(b);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003188 return NULL;
3189 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003190
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003191 for (i = 0; i < size_z; ++i) {
3192 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
3193 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
3194 switch (op) {
3195 case '&': z->ob_digit[i] = diga & digb; break;
3196 case '|': z->ob_digit[i] = diga | digb; break;
3197 case '^': z->ob_digit[i] = diga ^ digb; break;
3198 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00003199 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003200
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003201 Py_DECREF(a);
3202 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003203 z = long_normalize(z);
3204 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003205 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003206 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003207 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003208 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003209}
3210
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003211static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003212long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003213{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003214 PyLongObject *a, *b;
3215 PyObject *c;
3216 CONVERT_BINOP(v, w, &a, &b);
3217 c = long_bitwise(a, '&', b);
3218 Py_DECREF(a);
3219 Py_DECREF(b);
3220 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003221}
3222
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003223static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003224long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003225{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003226 PyLongObject *a, *b;
3227 PyObject *c;
3228 CONVERT_BINOP(v, w, &a, &b);
3229 c = long_bitwise(a, '^', b);
3230 Py_DECREF(a);
3231 Py_DECREF(b);
3232 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003233}
3234
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003235static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003236long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003237{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003238 PyLongObject *a, *b;
3239 PyObject *c;
3240 CONVERT_BINOP(v, w, &a, &b);
3241 c = long_bitwise(a, '|', b);
3242 Py_DECREF(a);
3243 Py_DECREF(b);
3244 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00003245}
3246
Guido van Rossum234f9421993-06-17 12:35:49 +00003247static int
Tim Peters9f688bf2000-07-07 15:53:28 +00003248long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00003249{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003250 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00003251 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Georg Brandlc02e1312007-04-11 17:16:24 +00003252 if (*pw == NULL)
3253 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003254 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00003255 return 0;
3256 }
Guido van Rossum1952e382001-09-19 01:25:16 +00003257 else if (PyLong_Check(*pw)) {
3258 Py_INCREF(*pv);
3259 Py_INCREF(*pw);
3260 return 0;
3261 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00003262 return 1; /* Can't do it */
3263}
3264
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003265static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003266long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003267{
Brett Cannonc3647ac2005-04-26 03:45:26 +00003268 if (PyLong_CheckExact(v))
3269 Py_INCREF(v);
3270 else
3271 v = _PyLong_Copy((PyLongObject *)v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003272 return v;
3273}
3274
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003275static PyObject *
Walter Dörwaldf1715402002-11-19 20:49:15 +00003276long_int(PyObject *v)
3277{
3278 long x;
3279 x = PyLong_AsLong(v);
3280 if (PyErr_Occurred()) {
3281 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
3282 PyErr_Clear();
3283 if (PyLong_CheckExact(v)) {
3284 Py_INCREF(v);
3285 return v;
3286 }
3287 else
3288 return _PyLong_Copy((PyLongObject *)v);
3289 }
3290 else
3291 return NULL;
3292 }
3293 return PyInt_FromLong(x);
3294}
3295
3296static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003297long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003298{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00003299 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003300 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00003301 if (result == -1.0 && PyErr_Occurred())
3302 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003303 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003304}
3305
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003306static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003307long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003308{
Eric Smith5e527eb2008-02-10 01:36:53 +00003309 return _PyLong_Format(v, 8, 1, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003310}
3311
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003312static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003313long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003314{
Eric Smith5e527eb2008-02-10 01:36:53 +00003315 return _PyLong_Format(v, 16, 1, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003316}
Jeremy Hylton938ace62002-07-17 16:30:39 +00003317
3318static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00003319long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003320
Tim Peters6d6c1a32001-08-02 04:15:00 +00003321static PyObject *
3322long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3323{
3324 PyObject *x = NULL;
3325 int base = -909; /* unlikely! */
Martin v. Löwis15e62742006-02-27 16:46:16 +00003326 static char *kwlist[] = {"x", "base", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00003327
Guido van Rossumbef14172001-08-29 15:47:46 +00003328 if (type != &PyLong_Type)
3329 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003330 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
3331 &x, &base))
3332 return NULL;
3333 if (x == NULL)
3334 return PyLong_FromLong(0L);
3335 if (base == -909)
3336 return PyNumber_Long(x);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003337 else if (PyString_Check(x)) {
Georg Brandl00cd8182007-03-06 18:41:12 +00003338 /* Since PyLong_FromString doesn't have a length parameter,
3339 * check here for possible NULs in the string. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003340 char *string = PyString_AS_STRING(x);
3341 if (strlen(string) != PyString_Size(x)) {
Georg Brandl00cd8182007-03-06 18:41:12 +00003342 /* create a repr() of the input string,
3343 * just like PyLong_FromString does. */
3344 PyObject *srepr;
3345 srepr = PyObject_Repr(x);
3346 if (srepr == NULL)
3347 return NULL;
3348 PyErr_Format(PyExc_ValueError,
3349 "invalid literal for long() with base %d: %s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003350 base, PyString_AS_STRING(srepr));
Georg Brandl00cd8182007-03-06 18:41:12 +00003351 Py_DECREF(srepr);
3352 return NULL;
3353 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003354 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Georg Brandl00cd8182007-03-06 18:41:12 +00003355 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003356#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00003357 else if (PyUnicode_Check(x))
3358 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
3359 PyUnicode_GET_SIZE(x),
3360 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003361#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003362 else {
3363 PyErr_SetString(PyExc_TypeError,
3364 "long() can't convert non-string with explicit base");
3365 return NULL;
3366 }
3367}
3368
Guido van Rossumbef14172001-08-29 15:47:46 +00003369/* Wimpy, slow approach to tp_new calls for subtypes of long:
3370 first create a regular long from whatever arguments we got,
3371 then allocate a subtype instance and initialize it from
3372 the regular long. The regular long is then thrown away.
3373*/
3374static PyObject *
3375long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3376{
Anthony Baxter377be112006-04-11 06:54:30 +00003377 PyLongObject *tmp, *newobj;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003378 Py_ssize_t i, n;
Guido van Rossumbef14172001-08-29 15:47:46 +00003379
3380 assert(PyType_IsSubtype(type, &PyLong_Type));
3381 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
3382 if (tmp == NULL)
3383 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00003384 assert(PyLong_CheckExact(tmp));
Christian Heimese93237d2007-12-19 02:37:44 +00003385 n = Py_SIZE(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003386 if (n < 0)
3387 n = -n;
Anthony Baxter377be112006-04-11 06:54:30 +00003388 newobj = (PyLongObject *)type->tp_alloc(type, n);
3389 if (newobj == NULL) {
Raymond Hettingerf4667932003-06-28 20:04:25 +00003390 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003391 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00003392 }
Anthony Baxter377be112006-04-11 06:54:30 +00003393 assert(PyLong_Check(newobj));
Christian Heimese93237d2007-12-19 02:37:44 +00003394 Py_SIZE(newobj) = Py_SIZE(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003395 for (i = 0; i < n; i++)
Anthony Baxter377be112006-04-11 06:54:30 +00003396 newobj->ob_digit[i] = tmp->ob_digit[i];
Guido van Rossumbef14172001-08-29 15:47:46 +00003397 Py_DECREF(tmp);
Anthony Baxter377be112006-04-11 06:54:30 +00003398 return (PyObject *)newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00003399}
3400
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003401static PyObject *
3402long_getnewargs(PyLongObject *v)
3403{
3404 return Py_BuildValue("(N)", _PyLong_Copy(v));
3405}
3406
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003407static PyObject *
3408long_getN(PyLongObject *v, void *context) {
Jeffrey Yasskin5de250e2008-03-18 01:09:59 +00003409 return PyLong_FromLong((Py_intptr_t)context);
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003410}
3411
Eric Smitha9f7d622008-02-17 19:46:49 +00003412static PyObject *
3413long__format__(PyObject *self, PyObject *args)
3414{
3415 PyObject *format_spec;
3416
3417 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
3418 return NULL;
Christian Heimes593daf52008-05-26 12:51:38 +00003419 if (PyBytes_Check(format_spec))
Eric Smithdc13b792008-05-30 18:10:04 +00003420 return _PyLong_FormatAdvanced(self,
3421 PyBytes_AS_STRING(format_spec),
3422 PyBytes_GET_SIZE(format_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00003423 if (PyUnicode_Check(format_spec)) {
3424 /* Convert format_spec to a str */
Eric Smithdc13b792008-05-30 18:10:04 +00003425 PyObject *result;
3426 PyObject *str_spec = PyObject_Str(format_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00003427
Eric Smithdc13b792008-05-30 18:10:04 +00003428 if (str_spec == NULL)
3429 return NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +00003430
Eric Smithdc13b792008-05-30 18:10:04 +00003431 result = _PyLong_FormatAdvanced(self,
3432 PyBytes_AS_STRING(str_spec),
3433 PyBytes_GET_SIZE(str_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00003434
Eric Smithdc13b792008-05-30 18:10:04 +00003435 Py_DECREF(str_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00003436 return result;
3437 }
3438 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
3439 return NULL;
3440}
3441
Robert Schuppenies51df0642008-06-01 16:16:17 +00003442static PyObject *
3443long_sizeof(PyLongObject *v)
3444{
3445 Py_ssize_t res;
3446
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00003447 res = v->ob_type->tp_basicsize;
Robert Schuppenies51df0642008-06-01 16:16:17 +00003448 if (v->ob_size != 0)
Robert Schuppenies9be2ec12008-07-10 15:24:04 +00003449 res += abs(v->ob_size) * sizeof(digit);
Robert Schuppenies51df0642008-06-01 16:16:17 +00003450 return PyInt_FromSsize_t(res);
3451}
3452
Christian Heimes6f341092008-04-18 23:13:07 +00003453#if 0
3454static PyObject *
3455long_is_finite(PyObject *v)
3456{
3457 Py_RETURN_TRUE;
3458}
3459#endif
3460
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003461static PyMethodDef long_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003462 {"conjugate", (PyCFunction)long_long, METH_NOARGS,
3463 "Returns self, the complex conjugate of any long."},
Christian Heimes6f341092008-04-18 23:13:07 +00003464#if 0
3465 {"is_finite", (PyCFunction)long_is_finite, METH_NOARGS,
3466 "Returns always True."},
3467#endif
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003468 {"__trunc__", (PyCFunction)long_long, METH_NOARGS,
3469 "Truncating an Integral returns itself."},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003470 {"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
Eric Smitha9f7d622008-02-17 19:46:49 +00003471 {"__format__", (PyCFunction)long__format__, METH_VARARGS},
Robert Schuppenies51df0642008-06-01 16:16:17 +00003472 {"__sizeof__", (PyCFunction)long_sizeof, METH_NOARGS,
Georg Brandl7a6de8b2008-06-01 16:42:16 +00003473 "Returns size in memory, in bytes"},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003474 {NULL, NULL} /* sentinel */
3475};
3476
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003477static PyGetSetDef long_getset[] = {
3478 {"real",
3479 (getter)long_long, (setter)NULL,
3480 "the real part of a complex number",
3481 NULL},
3482 {"imag",
3483 (getter)long_getN, (setter)NULL,
3484 "the imaginary part of a complex number",
3485 (void*)0},
3486 {"numerator",
3487 (getter)long_long, (setter)NULL,
3488 "the numerator of a rational number in lowest terms",
3489 NULL},
3490 {"denominator",
3491 (getter)long_getN, (setter)NULL,
3492 "the denominator of a rational number in lowest terms",
3493 (void*)1},
3494 {NULL} /* Sentinel */
3495};
3496
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003497PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00003498"long(x[, base]) -> integer\n\
3499\n\
3500Convert a string or number to a long integer, if possible. A floating\n\
3501point argument will be truncated towards zero (this does not include a\n\
3502string representation of a floating point number!) When converting a\n\
3503string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003504converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00003505
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003506static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00003507 (binaryfunc) long_add, /*nb_add*/
3508 (binaryfunc) long_sub, /*nb_subtract*/
3509 (binaryfunc) long_mul, /*nb_multiply*/
Georg Brandl347b3002006-03-30 11:57:00 +00003510 long_classic_div, /*nb_divide*/
3511 long_mod, /*nb_remainder*/
3512 long_divmod, /*nb_divmod*/
3513 long_pow, /*nb_power*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003514 (unaryfunc) long_neg, /*nb_negative*/
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003515 (unaryfunc) long_long, /*tp_positive*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003516 (unaryfunc) long_abs, /*tp_absolute*/
3517 (inquiry) long_nonzero, /*tp_nonzero*/
3518 (unaryfunc) long_invert, /*nb_invert*/
Georg Brandl347b3002006-03-30 11:57:00 +00003519 long_lshift, /*nb_lshift*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003520 (binaryfunc) long_rshift, /*nb_rshift*/
Georg Brandl347b3002006-03-30 11:57:00 +00003521 long_and, /*nb_and*/
3522 long_xor, /*nb_xor*/
3523 long_or, /*nb_or*/
3524 long_coerce, /*nb_coerce*/
3525 long_int, /*nb_int*/
3526 long_long, /*nb_long*/
3527 long_float, /*nb_float*/
3528 long_oct, /*nb_oct*/
3529 long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00003530 0, /* nb_inplace_add */
3531 0, /* nb_inplace_subtract */
3532 0, /* nb_inplace_multiply */
3533 0, /* nb_inplace_divide */
3534 0, /* nb_inplace_remainder */
3535 0, /* nb_inplace_power */
3536 0, /* nb_inplace_lshift */
3537 0, /* nb_inplace_rshift */
3538 0, /* nb_inplace_and */
3539 0, /* nb_inplace_xor */
3540 0, /* nb_inplace_or */
Georg Brandl347b3002006-03-30 11:57:00 +00003541 long_div, /* nb_floor_divide */
Guido van Rossum4668b002001-08-08 05:00:18 +00003542 long_true_divide, /* nb_true_divide */
3543 0, /* nb_inplace_floor_divide */
3544 0, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003545 long_long, /* nb_index */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003546};
3547
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003548PyTypeObject PyLong_Type = {
3549 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003550 0, /* ob_size */
3551 "long", /* tp_name */
3552 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
3553 sizeof(digit), /* tp_itemsize */
Georg Brandl347b3002006-03-30 11:57:00 +00003554 long_dealloc, /* tp_dealloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003555 0, /* tp_print */
3556 0, /* tp_getattr */
3557 0, /* tp_setattr */
3558 (cmpfunc)long_compare, /* tp_compare */
Georg Brandl347b3002006-03-30 11:57:00 +00003559 long_repr, /* tp_repr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003560 &long_as_number, /* tp_as_number */
3561 0, /* tp_as_sequence */
3562 0, /* tp_as_mapping */
3563 (hashfunc)long_hash, /* tp_hash */
3564 0, /* tp_call */
Georg Brandl347b3002006-03-30 11:57:00 +00003565 long_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003566 PyObject_GenericGetAttr, /* tp_getattro */
3567 0, /* tp_setattro */
3568 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00003569 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00003570 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003571 long_doc, /* tp_doc */
3572 0, /* tp_traverse */
3573 0, /* tp_clear */
3574 0, /* tp_richcompare */
3575 0, /* tp_weaklistoffset */
3576 0, /* tp_iter */
3577 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003578 long_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003579 0, /* tp_members */
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003580 long_getset, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003581 0, /* tp_base */
3582 0, /* tp_dict */
3583 0, /* tp_descr_get */
3584 0, /* tp_descr_set */
3585 0, /* tp_dictoffset */
3586 0, /* tp_init */
3587 0, /* tp_alloc */
3588 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00003589 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003590};