blob: 92e95f7867de62f52dc22b129a7950048f028273 [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
2/* Long (arbitrary precision) integer object implementation */
3
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00004/* XXX The functional organization of this file is terrible */
5
Guido van Rossumc0b618a1997-05-02 03:12:38 +00006#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00007#include "longintrepr.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00009#include <ctype.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000010
Tim Peters5af4e6c2002-08-12 02:31:19 +000011/* For long multiplication, use the O(N**2) school algorithm unless
12 * both operands contain more than KARATSUBA_CUTOFF digits (this
13 * being an internal Python long digit, in base BASE).
14 */
15#define KARATSUBA_CUTOFF 35
16
Guido van Rossume32e0141992-01-19 16:31:05 +000017#define ABS(x) ((x) < 0 ? -(x) : (x))
18
Tim Peters5af4e6c2002-08-12 02:31:19 +000019#undef MIN
20#undef MAX
21#define MAX(x, y) ((x) < (y) ? (y) : (x))
22#define MIN(x, y) ((x) > (y) ? (y) : (x))
23
Guido van Rossume32e0141992-01-19 16:31:05 +000024/* Forward */
Tim Peters9f688bf2000-07-07 15:53:28 +000025static PyLongObject *long_normalize(PyLongObject *);
26static PyLongObject *mul1(PyLongObject *, wdigit);
27static PyLongObject *muladd1(PyLongObject *, wdigit, wdigit);
Tim Peters212e6142001-07-14 12:23:19 +000028static PyLongObject *divrem1(PyLongObject *, digit, digit *);
Tim Peters9f688bf2000-07-07 15:53:28 +000029static PyObject *long_format(PyObject *aa, int base, int addL);
Guido van Rossume32e0141992-01-19 16:31:05 +000030
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031#define SIGCHECK(PyTryBlock) \
Skip Montanarod581d772002-09-03 20:10:45 +000032 if (--_Py_Ticker < 0) { \
33 _Py_Ticker = _Py_CheckInterval; \
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034 if (PyErr_CheckSignals()) { PyTryBlock; } \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000035 }
36
Guido van Rossumedcc38a1991-05-05 20:09:44 +000037/* Normalize (remove leading zeros from) a long int object.
38 Doesn't attempt to free the storage--in most cases, due to the nature
39 of the algorithms used, this could save at most be one word anyway. */
40
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000042long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000043{
Guido van Rossum4c260ff1992-01-14 18:36:43 +000044 int j = ABS(v->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000045 register int i = j;
Tim Peters5af4e6c2002-08-12 02:31:19 +000046
Guido van Rossumedcc38a1991-05-05 20:09:44 +000047 while (i > 0 && v->ob_digit[i-1] == 0)
48 --i;
49 if (i != j)
Guido van Rossum4c260ff1992-01-14 18:36:43 +000050 v->ob_size = (v->ob_size < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000051 return v;
52}
53
54/* Allocate a new long int object with size digits.
55 Return NULL and set exception if we run out of memory. */
56
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000058_PyLong_New(int size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000059{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000061}
62
Tim Peters64b5ce32001-09-10 20:52:51 +000063PyObject *
64_PyLong_Copy(PyLongObject *src)
65{
66 PyLongObject *result;
67 int i;
68
69 assert(src != NULL);
70 i = src->ob_size;
71 if (i < 0)
72 i = -(i);
73 result = _PyLong_New(i);
74 if (result != NULL) {
Tim Peters5329cdb2002-03-02 04:18:04 +000075 result->ob_size = src->ob_size;
Tim Peters64b5ce32001-09-10 20:52:51 +000076 while (--i >= 0)
77 result->ob_digit[i] = src->ob_digit[i];
78 }
79 return (PyObject *)result;
80}
81
Guido van Rossumedcc38a1991-05-05 20:09:44 +000082/* Create a new long int object from a C long int */
83
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000085PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000086{
Tim Petersce9de2f2001-06-14 04:56:19 +000087 PyLongObject *v;
88 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
89 int ndigits = 0;
90 int negative = 0;
91
92 if (ival < 0) {
93 ival = -ival;
94 negative = 1;
95 }
96
97 /* Count the number of Python digits.
98 We used to pick 5 ("big enough for anything"), but that's a
99 waste of time and space given that 5*15 = 75 bits are rarely
100 needed. */
101 t = (unsigned long)ival;
102 while (t) {
103 ++ndigits;
104 t >>= SHIFT;
105 }
106 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000107 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000108 digit *p = v->ob_digit;
109 v->ob_size = negative ? -ndigits : ndigits;
110 t = (unsigned long)ival;
111 while (t) {
112 *p++ = (digit)(t & MASK);
Guido van Rossum472c04f1996-12-05 21:57:21 +0000113 t >>= SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000114 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000115 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000117}
118
Guido van Rossum53756b11997-01-03 17:14:46 +0000119/* Create a new long int object from a C unsigned long int */
120
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000122PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000123{
Tim Petersce9de2f2001-06-14 04:56:19 +0000124 PyLongObject *v;
125 unsigned long t;
126 int ndigits = 0;
127
128 /* Count the number of Python digits. */
129 t = (unsigned long)ival;
130 while (t) {
131 ++ndigits;
132 t >>= SHIFT;
133 }
134 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000135 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000136 digit *p = v->ob_digit;
137 v->ob_size = ndigits;
138 while (ival) {
139 *p++ = (digit)(ival & MASK);
140 ival >>= SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000141 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000142 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000144}
145
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000146/* Create a new long int object from a C double */
147
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000150{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000152 double frac;
153 int i, ndig, expo, neg;
154 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000155 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000156 PyErr_SetString(PyExc_OverflowError,
157 "cannot convert float infinity to long");
158 return NULL;
159 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000160 if (dval < 0.0) {
161 neg = 1;
162 dval = -dval;
163 }
164 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
165 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000166 return PyLong_FromLong(0L);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000167 ndig = (expo-1) / SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000169 if (v == NULL)
170 return NULL;
171 frac = ldexp(frac, (expo-1) % SHIFT + 1);
172 for (i = ndig; --i >= 0; ) {
173 long bits = (long)frac;
Guido van Rossum2095d241997-04-09 19:41:24 +0000174 v->ob_digit[i] = (digit) bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000175 frac = frac - (double)bits;
176 frac = ldexp(frac, SHIFT);
177 }
178 if (neg)
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000179 v->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000181}
182
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000183/* Get a C long int from a long int object.
184 Returns -1 and sets an error condition if overflow occurs. */
185
186long
Tim Peters9f688bf2000-07-07 15:53:28 +0000187PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000188{
Guido van Rossumf7531811998-05-26 14:33:37 +0000189 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000191 unsigned long x, prev;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000192 int i, sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000193
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 if (vv == NULL || !PyLong_Check(vv)) {
Guido van Rossum7e35d572001-09-15 03:14:32 +0000195 if (vv != NULL && PyInt_Check(vv))
196 return PyInt_AsLong(vv);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000198 return -1;
199 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000201 i = v->ob_size;
202 sign = 1;
203 x = 0;
204 if (i < 0) {
205 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000206 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000207 }
208 while (--i >= 0) {
209 prev = x;
210 x = (x << SHIFT) + v->ob_digit[i];
Guido van Rossumf7531811998-05-26 14:33:37 +0000211 if ((x >> SHIFT) != prev)
212 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000213 }
Guido van Rossumf7531811998-05-26 14:33:37 +0000214 /* Haven't lost any bits, but if the sign bit is set we're in
215 * trouble *unless* this is the min negative number. So,
216 * trouble iff sign bit set && (positive || some bit set other
217 * than the sign bit).
218 */
219 if ((long)x < 0 && (sign > 0 || (x << 1) != 0))
220 goto overflow;
221 return (long)x * sign;
222
223 overflow:
224 PyErr_SetString(PyExc_OverflowError,
Skip Montanarobafedec2001-09-13 19:05:30 +0000225 "long int too large to convert to int");
Guido van Rossumf7531811998-05-26 14:33:37 +0000226 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000227}
228
Guido van Rossumd8c80482002-08-13 00:24:58 +0000229/* Get a C unsigned long int from a long int object.
Guido van Rossum53756b11997-01-03 17:14:46 +0000230 Returns -1 and sets an error condition if overflow occurs. */
231
232unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000233PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000234{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000236 unsigned long x, prev;
237 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000238
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239 if (vv == NULL || !PyLong_Check(vv)) {
240 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000241 return (unsigned long) -1;
242 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 v = (PyLongObject *)vv;
Guido van Rossum53756b11997-01-03 17:14:46 +0000244 i = v->ob_size;
245 x = 0;
246 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000247 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000248 "can't convert negative value to unsigned long");
249 return (unsigned long) -1;
250 }
251 while (--i >= 0) {
252 prev = x;
253 x = (x << SHIFT) + v->ob_digit[i];
254 if ((x >> SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000256 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000257 return (unsigned long) -1;
258 }
259 }
260 return x;
261}
262
Tim Peters5b8132f2003-01-31 15:52:05 +0000263int
264_PyLong_Sign(PyObject *vv)
265{
266 PyLongObject *v = (PyLongObject *)vv;
Tim Petersee1a53c2003-02-02 02:57:53 +0000267 const int ndigits = ABS(v->ob_size);
Tim Peters5b8132f2003-01-31 15:52:05 +0000268
269 assert(v != NULL);
270 assert(PyLong_Check(v));
271 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
272
Tim Petersee1a53c2003-02-02 02:57:53 +0000273 return v->ob_size == 0 ? 0 : (v->ob_size < 0 ? -1 : 1);
Tim Peters5b8132f2003-01-31 15:52:05 +0000274}
275
Tim Petersbaefd9e2003-01-28 20:37:45 +0000276size_t
277_PyLong_NumBits(PyObject *vv)
278{
279 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000280 size_t result = 0;
281 int ndigits = ABS(v->ob_size);
Tim Petersbaefd9e2003-01-28 20:37:45 +0000282
283 assert(v != NULL);
284 assert(PyLong_Check(v));
285 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
286 if (ndigits > 0) {
Tim Petersbaefd9e2003-01-28 20:37:45 +0000287 digit msd = v->ob_digit[ndigits - 1];
288
Tim Peters5b8132f2003-01-31 15:52:05 +0000289 result = (ndigits - 1) * SHIFT;
Tim Peters08a1d9c2003-01-31 21:45:13 +0000290 if (result / SHIFT != (size_t)ndigits - 1)
Tim Petersbaefd9e2003-01-28 20:37:45 +0000291 goto Overflow;
292 do {
293 ++result;
294 if (result == 0)
295 goto Overflow;
296 msd >>= 1;
297 } while (msd);
298 }
299 return result;
300
301Overflow:
302 PyErr_SetString(PyExc_OverflowError, "long has too many bits "
303 "to express in a platform size_t");
304 return (size_t)-1;
305}
306
Tim Peters2a9b3672001-06-11 21:23:58 +0000307PyObject *
308_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
309 int little_endian, int is_signed)
310{
311 const unsigned char* pstartbyte;/* LSB of bytes */
312 int incr; /* direction to move pstartbyte */
313 const unsigned char* pendbyte; /* MSB of bytes */
314 size_t numsignificantbytes; /* number of bytes that matter */
315 size_t ndigits; /* number of Python long digits */
316 PyLongObject* v; /* result */
317 int idigit = 0; /* next free index in v->ob_digit */
318
319 if (n == 0)
320 return PyLong_FromLong(0L);
321
322 if (little_endian) {
323 pstartbyte = bytes;
324 pendbyte = bytes + n - 1;
325 incr = 1;
326 }
327 else {
328 pstartbyte = bytes + n - 1;
329 pendbyte = bytes;
330 incr = -1;
331 }
332
333 if (is_signed)
334 is_signed = *pendbyte >= 0x80;
335
336 /* Compute numsignificantbytes. This consists of finding the most
337 significant byte. Leading 0 bytes are insignficant if the number
338 is positive, and leading 0xff bytes if negative. */
339 {
340 size_t i;
341 const unsigned char* p = pendbyte;
342 const int pincr = -incr; /* search MSB to LSB */
343 const unsigned char insignficant = is_signed ? 0xff : 0x00;
344
345 for (i = 0; i < n; ++i, p += pincr) {
346 if (*p != insignficant)
347 break;
348 }
349 numsignificantbytes = n - i;
350 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
351 actually has 2 significant bytes. OTOH, 0xff0001 ==
352 -0x00ffff, so we wouldn't *need* to bump it there; but we
353 do for 0xffff = -0x0001. To be safe without bothering to
354 check every case, bump it regardless. */
355 if (is_signed && numsignificantbytes < n)
356 ++numsignificantbytes;
357 }
358
359 /* How many Python long digits do we need? We have
360 8*numsignificantbytes bits, and each Python long digit has SHIFT
361 bits, so it's the ceiling of the quotient. */
362 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
363 if (ndigits > (size_t)INT_MAX)
364 return PyErr_NoMemory();
365 v = _PyLong_New((int)ndigits);
366 if (v == NULL)
367 return NULL;
368
369 /* Copy the bits over. The tricky parts are computing 2's-comp on
370 the fly for signed numbers, and dealing with the mismatch between
371 8-bit bytes and (probably) 15-bit Python digits.*/
372 {
373 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000374 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000375 twodigits accum = 0; /* sliding register */
376 unsigned int accumbits = 0; /* number of bits in accum */
377 const unsigned char* p = pstartbyte;
378
379 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000380 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000381 /* Compute correction for 2's comp, if needed. */
382 if (is_signed) {
383 thisbyte = (0xff ^ thisbyte) + carry;
384 carry = thisbyte >> 8;
385 thisbyte &= 0xff;
386 }
387 /* Because we're going LSB to MSB, thisbyte is
388 more significant than what's already in accum,
389 so needs to be prepended to accum. */
390 accum |= thisbyte << accumbits;
391 accumbits += 8;
392 if (accumbits >= SHIFT) {
393 /* There's enough to fill a Python digit. */
394 assert(idigit < (int)ndigits);
395 v->ob_digit[idigit] = (digit)(accum & MASK);
396 ++idigit;
397 accum >>= SHIFT;
398 accumbits -= SHIFT;
399 assert(accumbits < SHIFT);
400 }
401 }
402 assert(accumbits < SHIFT);
403 if (accumbits) {
404 assert(idigit < (int)ndigits);
405 v->ob_digit[idigit] = (digit)accum;
406 ++idigit;
407 }
408 }
409
410 v->ob_size = is_signed ? -idigit : idigit;
411 return (PyObject *)long_normalize(v);
412}
413
414int
415_PyLong_AsByteArray(PyLongObject* v,
416 unsigned char* bytes, size_t n,
417 int little_endian, int is_signed)
418{
419 int i; /* index into v->ob_digit */
420 int ndigits; /* |v->ob_size| */
421 twodigits accum; /* sliding register */
422 unsigned int accumbits; /* # bits in accum */
423 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
424 twodigits carry; /* for computing 2's-comp */
425 size_t j; /* # bytes filled */
426 unsigned char* p; /* pointer to next byte in bytes */
427 int pincr; /* direction to move p */
428
429 assert(v != NULL && PyLong_Check(v));
430
431 if (v->ob_size < 0) {
432 ndigits = -(v->ob_size);
433 if (!is_signed) {
434 PyErr_SetString(PyExc_TypeError,
435 "can't convert negative long to unsigned");
436 return -1;
437 }
438 do_twos_comp = 1;
439 }
440 else {
441 ndigits = v->ob_size;
442 do_twos_comp = 0;
443 }
444
445 if (little_endian) {
446 p = bytes;
447 pincr = 1;
448 }
449 else {
450 p = bytes + n - 1;
451 pincr = -1;
452 }
453
Tim Peters898cf852001-06-13 20:50:08 +0000454 /* Copy over all the Python digits.
455 It's crucial that every Python digit except for the MSD contribute
456 exactly SHIFT bits to the total, so first assert that the long is
457 normalized. */
458 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000459 j = 0;
460 accum = 0;
461 accumbits = 0;
462 carry = do_twos_comp ? 1 : 0;
463 for (i = 0; i < ndigits; ++i) {
464 twodigits thisdigit = v->ob_digit[i];
465 if (do_twos_comp) {
466 thisdigit = (thisdigit ^ MASK) + carry;
467 carry = thisdigit >> SHIFT;
468 thisdigit &= MASK;
469 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000470 /* Because we're going LSB to MSB, thisdigit is more
471 significant than what's already in accum, so needs to be
472 prepended to accum. */
473 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000474 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000475
Tim Petersede05092001-06-14 08:53:38 +0000476 /* The most-significant digit may be (probably is) at least
477 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000478 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000479 /* Count # of sign bits -- they needn't be stored,
480 * although for signed conversion we need later to
481 * make sure at least one sign bit gets stored.
482 * First shift conceptual sign bit to real sign bit.
483 */
484 stwodigits s = (stwodigits)(thisdigit <<
485 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000486 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000487 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000488 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000489 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000490 }
Tim Petersede05092001-06-14 08:53:38 +0000491 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000492 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000493
Tim Peters2a9b3672001-06-11 21:23:58 +0000494 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000495 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000496 if (j >= n)
497 goto Overflow;
498 ++j;
499 *p = (unsigned char)(accum & 0xff);
500 p += pincr;
501 accumbits -= 8;
502 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000503 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000504 }
505
506 /* Store the straggler (if any). */
507 assert(accumbits < 8);
508 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000509 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000510 if (j >= n)
511 goto Overflow;
512 ++j;
513 if (do_twos_comp) {
514 /* Fill leading bits of the byte with sign bits
515 (appropriately pretending that the long had an
516 infinite supply of sign bits). */
517 accum |= (~(twodigits)0) << accumbits;
518 }
519 *p = (unsigned char)(accum & 0xff);
520 p += pincr;
521 }
Tim Peters05607ad2001-06-13 21:01:27 +0000522 else if (j == n && n > 0 && is_signed) {
523 /* The main loop filled the byte array exactly, so the code
524 just above didn't get to ensure there's a sign bit, and the
525 loop below wouldn't add one either. Make sure a sign bit
526 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000527 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000528 int sign_bit_set = msb >= 0x80;
529 assert(accumbits == 0);
530 if (sign_bit_set == do_twos_comp)
531 return 0;
532 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000533 goto Overflow;
534 }
Tim Peters05607ad2001-06-13 21:01:27 +0000535
536 /* Fill remaining bytes with copies of the sign bit. */
537 {
538 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
539 for ( ; j < n; ++j, p += pincr)
540 *p = signbyte;
541 }
542
Tim Peters2a9b3672001-06-11 21:23:58 +0000543 return 0;
544
545Overflow:
546 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
547 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000548
Tim Peters2a9b3672001-06-11 21:23:58 +0000549}
550
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000551double
552_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
553{
554/* NBITS_WANTED should be > the number of bits in a double's precision,
555 but small enough so that 2**NBITS_WANTED is within the normal double
556 range. nbitsneeded is set to 1 less than that because the most-significant
557 Python digit contains at least 1 significant bit, but we don't want to
558 bother counting them (catering to the worst case cheaply).
559
560 57 is one more than VAX-D double precision; I (Tim) don't know of a double
561 format with more precision than that; it's 1 larger so that we add in at
562 least one round bit to stand in for the ignored least-significant bits.
563*/
564#define NBITS_WANTED 57
565 PyLongObject *v;
566 double x;
567 const double multiplier = (double)(1L << SHIFT);
568 int i, sign;
569 int nbitsneeded;
570
571 if (vv == NULL || !PyLong_Check(vv)) {
572 PyErr_BadInternalCall();
573 return -1;
574 }
575 v = (PyLongObject *)vv;
576 i = v->ob_size;
577 sign = 1;
578 if (i < 0) {
579 sign = -1;
580 i = -(i);
581 }
582 else if (i == 0) {
583 *exponent = 0;
584 return 0.0;
585 }
586 --i;
587 x = (double)v->ob_digit[i];
588 nbitsneeded = NBITS_WANTED - 1;
589 /* Invariant: i Python digits remain unaccounted for. */
590 while (i > 0 && nbitsneeded > 0) {
591 --i;
592 x = x * multiplier + (double)v->ob_digit[i];
593 nbitsneeded -= SHIFT;
594 }
595 /* There are i digits we didn't shift in. Pretending they're all
596 zeroes, the true value is x * 2**(i*SHIFT). */
597 *exponent = i;
598 assert(x > 0.0);
599 return x * sign;
600#undef NBITS_WANTED
601}
602
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000603/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000604
605double
Tim Peters9f688bf2000-07-07 15:53:28 +0000606PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000607{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000608 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000609 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000610
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611 if (vv == NULL || !PyLong_Check(vv)) {
612 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000613 return -1;
614 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000615 x = _PyLong_AsScaledDouble(vv, &e);
616 if (x == -1.0 && PyErr_Occurred())
617 return -1.0;
618 if (e > INT_MAX / SHIFT)
619 goto overflow;
620 errno = 0;
621 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000622 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000623 goto overflow;
624 return x;
625
626overflow:
627 PyErr_SetString(PyExc_OverflowError,
628 "long int too large to convert to float");
629 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000630}
631
Guido van Rossum78694d91998-09-18 14:14:13 +0000632/* Create a new long (or int) object from a C pointer */
633
634PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000635PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000636{
Tim Peters70128a12001-06-16 08:48:40 +0000637#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000638 return PyInt_FromLong((long)p);
639#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000640
Tim Peters70128a12001-06-16 08:48:40 +0000641#ifndef HAVE_LONG_LONG
642# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
643#endif
644#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
645# error "PyLong_FromVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
646#endif
647 /* optimize null pointers */
648 if (p == NULL)
649 return PyInt_FromLong(0);
Guido van Rossum78694d91998-09-18 14:14:13 +0000650 return PyLong_FromLongLong((LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000651
652#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000653}
654
655/* Get a C pointer from a long object (or an int object in some cases) */
656
657void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000658PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000659{
660 /* This function will allow int or long objects. If vv is neither,
661 then the PyLong_AsLong*() functions will raise the exception:
662 PyExc_SystemError, "bad argument to internal function"
663 */
Tim Peters70128a12001-06-16 08:48:40 +0000664#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000665 long x;
666
Tim Peters70128a12001-06-16 08:48:40 +0000667 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000668 x = PyInt_AS_LONG(vv);
669 else
670 x = PyLong_AsLong(vv);
671#else
Tim Peters70128a12001-06-16 08:48:40 +0000672
673#ifndef HAVE_LONG_LONG
674# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
675#endif
676#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
677# error "PyLong_AsVoidPtr: sizeof(LONG_LONG) < sizeof(void*)"
678#endif
Guido van Rossum78694d91998-09-18 14:14:13 +0000679 LONG_LONG x;
680
Tim Peters70128a12001-06-16 08:48:40 +0000681 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000682 x = PyInt_AS_LONG(vv);
683 else
684 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000685
686#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000687
688 if (x == -1 && PyErr_Occurred())
689 return NULL;
690 return (void *)x;
691}
692
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000693#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000694
695/* Initial LONG_LONG support by Chris Herborth (chrish@qnx.com), later
696 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000697 */
698
Tim Peterscf37dfc2001-06-14 18:42:50 +0000699#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000700
701/* Create a new long int object from a C LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000702
703PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000704PyLong_FromLongLong(LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000705{
Tim Petersd1a7da62001-06-13 00:35:57 +0000706 LONG_LONG bytes = ival;
707 int one = 1;
708 return _PyLong_FromByteArray(
709 (unsigned char *)&bytes,
710 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000711}
712
Tim Petersd1a7da62001-06-13 00:35:57 +0000713/* Create a new long int object from a C unsigned LONG_LONG int. */
714
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000715PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000716PyLong_FromUnsignedLongLong(unsigned LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000717{
Tim Petersd1a7da62001-06-13 00:35:57 +0000718 unsigned LONG_LONG bytes = ival;
719 int one = 1;
720 return _PyLong_FromByteArray(
721 (unsigned char *)&bytes,
722 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000723}
724
Guido van Rossum3293b071998-08-25 16:07:15 +0000725/* Get a C LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000726 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000727
Guido van Rossum3293b071998-08-25 16:07:15 +0000728LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000729PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000730{
Tim Petersd1a7da62001-06-13 00:35:57 +0000731 LONG_LONG bytes;
732 int one = 1;
733 int res;
734
Tim Petersd38b1c72001-09-30 05:09:37 +0000735 if (vv == NULL) {
736 PyErr_BadInternalCall();
737 return -1;
738 }
739 if (!PyLong_Check(vv)) {
740 if (PyInt_Check(vv))
741 return (LONG_LONG)PyInt_AsLong(vv);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000742 PyErr_BadInternalCall();
743 return -1;
744 }
745
Tim Petersd1a7da62001-06-13 00:35:57 +0000746 res = _PyLong_AsByteArray(
747 (PyLongObject *)vv, (unsigned char *)&bytes,
748 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000749
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000750 /* Plan 9 can't handle LONG_LONG in ? : expressions */
751 if (res < 0)
Jeremy Hyltonc4ad0bc2002-04-23 20:01:20 +0000752 return (LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000753 else
754 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000755}
756
Tim Petersd1a7da62001-06-13 00:35:57 +0000757/* Get a C unsigned LONG_LONG int from a long int object.
758 Return -1 and set an error if overflow occurs. */
759
Guido van Rossum3293b071998-08-25 16:07:15 +0000760unsigned LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000761PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000762{
Tim Petersd1a7da62001-06-13 00:35:57 +0000763 unsigned LONG_LONG bytes;
764 int one = 1;
765 int res;
766
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000767 if (vv == NULL || !PyLong_Check(vv)) {
768 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000769 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000770 }
771
Tim Petersd1a7da62001-06-13 00:35:57 +0000772 res = _PyLong_AsByteArray(
773 (PyLongObject *)vv, (unsigned char *)&bytes,
774 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000775
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000776 /* Plan 9 can't handle LONG_LONG in ? : expressions */
777 if (res < 0)
778 return (unsigned LONG_LONG)res;
779 else
780 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000781}
Tim Petersd1a7da62001-06-13 00:35:57 +0000782
783#undef IS_LITTLE_ENDIAN
784
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000785#endif /* HAVE_LONG_LONG */
786
Neil Schemenauerba872e22001-01-04 01:46:03 +0000787
788static int
789convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +0000790 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000791 *a = (PyLongObject *) v;
792 Py_INCREF(v);
793 }
794 else if (PyInt_Check(v)) {
795 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
796 }
797 else {
798 return 0;
799 }
Tim Peters5af4e6c2002-08-12 02:31:19 +0000800 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000801 *b = (PyLongObject *) w;
802 Py_INCREF(w);
803 }
804 else if (PyInt_Check(w)) {
805 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
806 }
807 else {
808 Py_DECREF(*a);
809 return 0;
810 }
811 return 1;
812}
813
814#define CONVERT_BINOP(v, w, a, b) \
815 if (!convert_binop(v, w, a, b)) { \
816 Py_INCREF(Py_NotImplemented); \
817 return Py_NotImplemented; \
818 }
819
Tim Peters877a2122002-08-12 05:09:36 +0000820/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
821 * is modified in place, by adding y to it. Carries are propagated as far as
822 * x[m-1], and the remaining carry (0 or 1) is returned.
823 */
824static digit
825v_iadd(digit *x, int m, digit *y, int n)
826{
827 int i;
828 digit carry = 0;
829
830 assert(m >= n);
831 for (i = 0; i < n; ++i) {
832 carry += x[i] + y[i];
833 x[i] = carry & MASK;
834 carry >>= SHIFT;
835 assert((carry & 1) == carry);
836 }
837 for (; carry && i < m; ++i) {
838 carry += x[i];
839 x[i] = carry & MASK;
840 carry >>= SHIFT;
841 assert((carry & 1) == carry);
842 }
843 return carry;
844}
845
846/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
847 * is modified in place, by subtracting y from it. Borrows are propagated as
848 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
849 */
850static digit
851v_isub(digit *x, int m, digit *y, int n)
852{
853 int i;
854 digit borrow = 0;
855
856 assert(m >= n);
857 for (i = 0; i < n; ++i) {
858 borrow = x[i] - y[i] - borrow;
859 x[i] = borrow & MASK;
860 borrow >>= SHIFT;
861 borrow &= 1; /* keep only 1 sign bit */
862 }
863 for (; borrow && i < m; ++i) {
864 borrow = x[i] - borrow;
865 x[i] = borrow & MASK;
866 borrow >>= SHIFT;
867 borrow &= 1;
868 }
869 return borrow;
870}
Neil Schemenauerba872e22001-01-04 01:46:03 +0000871
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000872/* Multiply by a single digit, ignoring the sign. */
873
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000875mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000876{
877 return muladd1(a, n, (digit)0);
878}
879
880/* Multiply by a single digit and add a single digit, ignoring the sign. */
881
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000883muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000884{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000885 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000887 twodigits carry = extra;
888 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000889
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000890 if (z == NULL)
891 return NULL;
892 for (i = 0; i < size_a; ++i) {
893 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000894 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000895 carry >>= SHIFT;
896 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000897 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000898 return long_normalize(z);
899}
900
Tim Peters212e6142001-07-14 12:23:19 +0000901/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
902 in pout, and returning the remainder. pin and pout point at the LSD.
903 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
904 long_format, but that should be done with great care since longs are
905 immutable. */
906
907static digit
908inplace_divrem1(digit *pout, digit *pin, int size, digit n)
909{
910 twodigits rem = 0;
911
912 assert(n > 0 && n <= MASK);
913 pin += size;
914 pout += size;
915 while (--size >= 0) {
916 digit hi;
917 rem = (rem << SHIFT) + *--pin;
918 *--pout = hi = (digit)(rem / n);
919 rem -= hi * n;
920 }
921 return (digit)rem;
922}
923
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000924/* Divide a long integer by a digit, returning both the quotient
925 (as function result) and the remainder (through *prem).
926 The sign of a is ignored; n should not be zero. */
927
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000929divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000930{
Tim Peters212e6142001-07-14 12:23:19 +0000931 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000932 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000933
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000934 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000935 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000936 if (z == NULL)
937 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000938 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000939 return long_normalize(z);
940}
941
942/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000943 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000944 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000945
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000946static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000947long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000948{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949 register PyLongObject *a = (PyLongObject *)aa;
950 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000951 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000952 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000953 char *p;
954 int bits;
955 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000956
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000957 if (a == NULL || !PyLong_Check(a)) {
958 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000959 return NULL;
960 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000961 assert(base >= 2 && base <= 36);
Tim Peters5af4e6c2002-08-12 02:31:19 +0000962
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000963 /* Compute a rough upper bound for the length of the string */
964 i = base;
965 bits = 0;
966 while (i > 1) {
967 ++bits;
968 i >>= 1;
969 }
Fred Drake121ee271999-12-23 15:41:28 +0000970 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000972 if (str == NULL)
973 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000975 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000976 if (addL)
977 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000978 if (a->ob_size < 0)
979 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +0000980
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000981 if (a->ob_size == 0) {
982 *--p = '0';
983 }
984 else if ((base & (base - 1)) == 0) {
985 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000986 twodigits accum = 0;
987 int accumbits = 0; /* # of bits in accum */
988 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000989 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000990 while ((i >>= 1) > 1)
991 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000992
993 for (i = 0; i < size_a; ++i) {
Tim Peters0d2d87d2002-08-20 19:00:22 +0000994 accum |= (twodigits)a->ob_digit[i] << accumbits;
Tim Peters586b2e32001-07-15 09:11:14 +0000995 accumbits += SHIFT;
996 assert(accumbits >= basebits);
997 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000998 char cdigit = (char)(accum & (base - 1));
999 cdigit += (cdigit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001000 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001001 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +00001002 accumbits -= basebits;
1003 accum >>= basebits;
1004 } while (i < size_a-1 ? accumbits >= basebits :
1005 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001006 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001007 }
1008 else {
Tim Petersfad225f2001-07-13 02:59:26 +00001009 /* Not 0, and base not a power of 2. Divide repeatedly by
1010 base, but for speed use the highest power of base that
1011 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +00001012 int size = size_a;
1013 digit *pin = a->ob_digit;
1014 PyLongObject *scratch;
1015 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +00001016 digit powbase = base; /* powbase == base ** power */
1017 int power = 1;
1018 for (;;) {
1019 unsigned long newpow = powbase * (unsigned long)base;
1020 if (newpow >> SHIFT) /* doesn't fit in a digit */
1021 break;
1022 powbase = (digit)newpow;
1023 ++power;
1024 }
Tim Peters212e6142001-07-14 12:23:19 +00001025
1026 /* Get a scratch area for repeated division. */
1027 scratch = _PyLong_New(size);
1028 if (scratch == NULL) {
1029 Py_DECREF(str);
1030 return NULL;
1031 }
1032
1033 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001034 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001035 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +00001036 digit rem = inplace_divrem1(scratch->ob_digit,
1037 pin, size, powbase);
1038 pin = scratch->ob_digit; /* no need to use a again */
1039 if (pin[size - 1] == 0)
1040 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001041 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +00001042 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001043 Py_DECREF(str);
1044 return NULL;
1045 })
Tim Peters212e6142001-07-14 12:23:19 +00001046
1047 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001048 assert(ntostore > 0);
1049 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001050 digit nextrem = (digit)(rem / base);
1051 char c = (char)(rem - nextrem * base);
1052 assert(p > PyString_AS_STRING(str));
1053 c += (c < 10) ? '0' : 'A'-10;
1054 *--p = c;
1055 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001056 --ntostore;
1057 /* Termination is a bit delicate: must not
1058 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001059 remaining quotient and rem are both 0. */
1060 } while (ntostore && (size || rem));
1061 } while (size != 0);
1062 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001063 }
1064
Guido van Rossum2c475421992-08-14 15:13:07 +00001065 if (base == 8) {
1066 if (size_a != 0)
1067 *--p = '0';
1068 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001069 else if (base == 16) {
1070 *--p = 'x';
1071 *--p = '0';
1072 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001073 else if (base != 10) {
1074 *--p = '#';
1075 *--p = '0' + base%10;
1076 if (base > 10)
1077 *--p = '0' + base/10;
1078 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001079 if (sign)
1080 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081 if (p != PyString_AS_STRING(str)) {
1082 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001083 assert(p > q);
1084 do {
1085 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001086 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001087 _PyString_Resize((PyObject **)&str,
1088 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001089 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001090 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001091}
1092
Tim Petersbf2674b2003-02-02 07:51:32 +00001093/* *str points to the first digit in a string of base base digits. base
1094 * is a power of 2 (2, 4, 8, 16, or 32). *str is set to point to the first
1095 * non-digit (which may be *str!). A normalized long is returned.
1096 * The point to this routine is that it takes time linear in the number of
1097 * string characters.
1098 */
1099static PyLongObject *
1100long_from_binary_base(char **str, int base)
1101{
1102 char *p = *str;
1103 char *start = p;
1104 int bits_per_char;
1105 int n;
1106 PyLongObject *z;
1107 twodigits accum;
1108 int bits_in_accum;
1109 digit *pdigit;
1110
1111 assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
1112 n = base;
1113 for (bits_per_char = -1; n; ++bits_per_char)
1114 n >>= 1;
1115 /* n <- total # of bits needed, while setting p to end-of-string */
1116 n = 0;
1117 for (;;) {
1118 int k = -1;
1119 char ch = *p;
1120
1121 if (ch <= '9')
1122 k = ch - '0';
1123 else if (ch >= 'a')
1124 k = ch - 'a' + 10;
1125 else if (ch >= 'A')
1126 k = ch - 'A' + 10;
1127 if (k < 0 || k >= base)
1128 break;
1129 n += bits_per_char;
1130 if (n < 0) {
1131 PyErr_SetString(PyExc_ValueError,
1132 "long string too large to convert");
1133 return NULL;
1134 }
1135 ++p;
1136 }
1137 *str = p;
1138 /* n <- # of Python digits needed, = ceiling(n/SHIFT). */
1139 n = (n + SHIFT - 1) / SHIFT;
1140 z = _PyLong_New(n);
1141 if (z == NULL)
1142 return NULL;
1143 /* Read string from right, and fill in long from left; i.e.,
1144 * from least to most significant in both.
1145 */
1146 accum = 0;
1147 bits_in_accum = 0;
1148 pdigit = z->ob_digit;
1149 while (--p >= start) {
1150 unsigned char ch = (unsigned char)*p;
1151 digit k;
1152
1153 if (ch <= '9')
1154 k = ch - '0';
1155 else if (ch >= 'a')
1156 k = ch - 'a' + 10;
1157 else {
1158 assert(ch >= 'A');
1159 k = ch - 'A' + 10;
1160 }
Tim Petersefb96252003-02-02 08:05:32 +00001161 assert(k < base);
Tim Petersbf2674b2003-02-02 07:51:32 +00001162 accum |= k << bits_in_accum;
1163 bits_in_accum += bits_per_char;
1164 if (bits_in_accum >= SHIFT) {
1165 *pdigit++ = (digit)(accum & MASK);
1166 assert(pdigit - z->ob_digit <= n);
1167 accum >>= SHIFT;
1168 bits_in_accum -= SHIFT;
1169 assert(bits_in_accum < SHIFT);
1170 }
1171 }
1172 if (bits_in_accum) {
1173 assert(bits_in_accum <= SHIFT);
1174 *pdigit++ = (digit)accum;
1175 assert(pdigit - z->ob_digit <= n);
1176 }
1177 while (pdigit - z->ob_digit < n)
1178 *pdigit++ = 0;
1179 return long_normalize(z);
1180}
1181
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001182PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001183PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001184{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001185 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001186 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001187 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001188
Guido van Rossum472c04f1996-12-05 21:57:21 +00001189 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001191 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001192 return NULL;
1193 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001194 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001195 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001196 if (*str == '+')
1197 ++str;
1198 else if (*str == '-') {
1199 ++str;
1200 sign = -1;
1201 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001202 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001203 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001204 if (base == 0) {
1205 if (str[0] != '0')
1206 base = 10;
1207 else if (str[1] == 'x' || str[1] == 'X')
1208 base = 16;
1209 else
1210 base = 8;
1211 }
1212 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1213 str += 2;
Guido van Rossume6762971998-06-22 03:54:46 +00001214 start = str;
Tim Petersbf2674b2003-02-02 07:51:32 +00001215 if ((base & (base - 1)) == 0)
1216 z = long_from_binary_base(&str, base);
1217 else {
1218 z = _PyLong_New(0);
1219 for ( ; z != NULL; ++str) {
1220 int k = -1;
1221 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001222
Tim Petersbf2674b2003-02-02 07:51:32 +00001223 if (*str <= '9')
1224 k = *str - '0';
1225 else if (*str >= 'a')
1226 k = *str - 'a' + 10;
1227 else if (*str >= 'A')
1228 k = *str - 'A' + 10;
1229 if (k < 0 || k >= base)
1230 break;
1231 temp = muladd1(z, (digit)base, (digit)k);
1232 Py_DECREF(z);
1233 z = temp;
1234 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001235 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001236 if (z == NULL)
1237 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001238 if (str == start)
1239 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001240 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001241 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001242 if (*str == 'L' || *str == 'l')
1243 str++;
1244 while (*str && isspace(Py_CHARMASK(*str)))
1245 str++;
1246 if (*str != '\0')
1247 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001248 if (pend)
1249 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001250 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001251
1252 onError:
Tim Peters5af4e6c2002-08-12 02:31:19 +00001253 PyErr_Format(PyExc_ValueError,
Guido van Rossum9e896b32000-04-05 20:11:21 +00001254 "invalid literal for long(): %.200s", orig_str);
1255 Py_XDECREF(z);
1256 return NULL;
1257}
1258
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001259#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001260PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001261PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001262{
Walter Dörwald07e14762002-11-06 16:15:14 +00001263 PyObject *result;
1264 char *buffer = PyMem_MALLOC(length+1);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001265
Walter Dörwald07e14762002-11-06 16:15:14 +00001266 if (buffer == NULL)
1267 return NULL;
1268
1269 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
1270 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001271 return NULL;
1272 }
Walter Dörwald07e14762002-11-06 16:15:14 +00001273 result = PyLong_FromString(buffer, NULL, base);
1274 PyMem_FREE(buffer);
1275 return result;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001276}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001277#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001278
Tim Peters9f688bf2000-07-07 15:53:28 +00001279/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001280static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001281 (PyLongObject *, PyLongObject *, PyLongObject **);
1282static PyObject *long_pos(PyLongObject *);
1283static int long_divrem(PyLongObject *, PyLongObject *,
1284 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001285
1286/* Long division with remainder, top-level routine */
1287
Guido van Rossume32e0141992-01-19 16:31:05 +00001288static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001289long_divrem(PyLongObject *a, PyLongObject *b,
1290 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001291{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001292 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001293 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001294
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001295 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001296 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001297 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001298 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001299 }
1300 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001301 (size_a == size_b &&
1302 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001303 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 *pdiv = _PyLong_New(0);
1305 Py_INCREF(a);
1306 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001307 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001308 }
1309 if (size_b == 1) {
1310 digit rem = 0;
1311 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001312 if (z == NULL)
1313 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001314 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001315 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001316 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001317 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001318 if (z == NULL)
1319 return -1;
1320 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001321 /* Set the signs.
1322 The quotient z has the sign of a*b;
1323 the remainder r has the sign of a,
1324 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001325 if ((a->ob_size < 0) != (b->ob_size < 0))
1326 z->ob_size = -(z->ob_size);
1327 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1328 (*prem)->ob_size = -((*prem)->ob_size);
1329 *pdiv = z;
1330 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001331}
1332
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001333/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001334
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001336x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001337{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001338 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001339 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001340 PyLongObject *v = mul1(v1, d);
1341 PyLongObject *w = mul1(w1, d);
1342 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001343 int j, k;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001344
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001345 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 Py_XDECREF(v);
1347 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001348 return NULL;
1349 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001350
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001351 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001352 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001353 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001354
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001355 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001356 a = _PyLong_New(size_v - size_w + 1);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001357
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001358 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1359 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1360 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001361 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001362 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001363
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001364 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001365 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001366 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001367 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001368 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001369 if (vj == w->ob_digit[size_w-1])
1370 q = MASK;
1371 else
1372 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1373 w->ob_digit[size_w-1];
Tim Peters5af4e6c2002-08-12 02:31:19 +00001374
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001375 while (w->ob_digit[size_w-2]*q >
1376 ((
1377 ((twodigits)vj << SHIFT)
1378 + v->ob_digit[j-1]
1379 - q*w->ob_digit[size_w-1]
1380 ) << SHIFT)
1381 + v->ob_digit[j-2])
1382 --q;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001383
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001384 for (i = 0; i < size_w && i+k < size_v; ++i) {
1385 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001386 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001387 carry += v->ob_digit[i+k] - z
1388 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001389 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001390 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1391 carry, SHIFT);
1392 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001393 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001394
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001395 if (i+k < size_v) {
1396 carry += v->ob_digit[i+k];
1397 v->ob_digit[i+k] = 0;
1398 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001399
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001400 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001401 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001402 else {
1403 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001404 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001405 carry = 0;
1406 for (i = 0; i < size_w && i+k < size_v; ++i) {
1407 carry += v->ob_digit[i+k] + w->ob_digit[i];
1408 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001409 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1410 BASE_TWODIGITS_TYPE,
1411 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001412 }
1413 }
1414 } /* for j, k */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001415
Guido van Rossumc206c761995-01-10 15:23:19 +00001416 if (a == NULL)
1417 *prem = NULL;
1418 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001419 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001420 *prem = divrem1(v, d, &d);
1421 /* d receives the (unused) remainder */
1422 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001423 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001424 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001425 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001426 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001427 Py_DECREF(v);
1428 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001429 return a;
1430}
1431
1432/* Methods */
1433
1434static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001435long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001436{
Guido van Rossum9475a232001-10-05 20:51:39 +00001437 v->ob_type->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001438}
1439
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001440static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001441long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001442{
Fred Drake121ee271999-12-23 15:41:28 +00001443 return long_format(v, 10, 1);
1444}
1445
1446static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001447long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001448{
1449 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001450}
1451
1452static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001453long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001454{
1455 int sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001456
Guido van Rossumc6913e71991-11-19 20:26:46 +00001457 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001458 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001459 sign = 0;
1460 else
1461 sign = a->ob_size - b->ob_size;
1462 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001463 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001464 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001465 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1466 ;
1467 if (i < 0)
1468 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001469 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001470 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001471 if (a->ob_size < 0)
1472 sign = -sign;
1473 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001474 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001475 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001476}
1477
Guido van Rossum9bfef441993-03-29 10:43:31 +00001478static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001479long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001480{
1481 long x;
1482 int i, sign;
1483
1484 /* This is designed so that Python ints and longs with the
1485 same value hash to the same value, otherwise comparisons
1486 of mapping keys will turn out weird */
1487 i = v->ob_size;
1488 sign = 1;
1489 x = 0;
1490 if (i < 0) {
1491 sign = -1;
1492 i = -(i);
1493 }
1494 while (--i >= 0) {
1495 /* Force a 32-bit circular shift */
1496 x = ((x << SHIFT) & ~MASK) | ((x >> (32-SHIFT)) & MASK);
1497 x += v->ob_digit[i];
1498 }
1499 x = x * sign;
1500 if (x == -1)
1501 x = -2;
1502 return x;
1503}
1504
1505
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001506/* Add the absolute values of two long integers. */
1507
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001508static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001509x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001510{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001511 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001512 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001513 int i;
1514 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001515
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001516 /* Ensure a is the larger of the two: */
1517 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001518 { PyLongObject *temp = a; a = b; b = temp; }
1519 { int size_temp = size_a;
1520 size_a = size_b;
1521 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001522 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001523 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001524 if (z == NULL)
1525 return NULL;
1526 for (i = 0; i < size_b; ++i) {
1527 carry += a->ob_digit[i] + b->ob_digit[i];
1528 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001529 carry >>= SHIFT;
1530 }
1531 for (; i < size_a; ++i) {
1532 carry += a->ob_digit[i];
1533 z->ob_digit[i] = carry & MASK;
1534 carry >>= SHIFT;
1535 }
1536 z->ob_digit[i] = carry;
1537 return long_normalize(z);
1538}
1539
1540/* Subtract the absolute values of two integers. */
1541
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001542static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001543x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001544{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001545 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001546 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001547 int i;
1548 int sign = 1;
1549 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001550
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001551 /* Ensure a is the larger of the two: */
1552 if (size_a < size_b) {
1553 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001554 { PyLongObject *temp = a; a = b; b = temp; }
1555 { int size_temp = size_a;
1556 size_a = size_b;
1557 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001558 }
1559 else if (size_a == size_b) {
1560 /* Find highest digit where a and b differ: */
1561 i = size_a;
1562 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1563 ;
1564 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001565 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001566 if (a->ob_digit[i] < b->ob_digit[i]) {
1567 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001569 }
1570 size_a = size_b = i+1;
1571 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001572 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001573 if (z == NULL)
1574 return NULL;
1575 for (i = 0; i < size_b; ++i) {
1576 /* The following assumes unsigned arithmetic
1577 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001578 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001579 z->ob_digit[i] = borrow & MASK;
1580 borrow >>= SHIFT;
1581 borrow &= 1; /* Keep only one sign bit */
1582 }
1583 for (; i < size_a; ++i) {
1584 borrow = a->ob_digit[i] - borrow;
1585 z->ob_digit[i] = borrow & MASK;
1586 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001587 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001588 }
1589 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001590 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001591 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001592 return long_normalize(z);
1593}
1594
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001595static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001596long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001597{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001598 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001599
Neil Schemenauerba872e22001-01-04 01:46:03 +00001600 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1601
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001602 if (a->ob_size < 0) {
1603 if (b->ob_size < 0) {
1604 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001605 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001606 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001607 }
1608 else
1609 z = x_sub(b, a);
1610 }
1611 else {
1612 if (b->ob_size < 0)
1613 z = x_sub(a, b);
1614 else
1615 z = x_add(a, b);
1616 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001617 Py_DECREF(a);
1618 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001619 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001620}
1621
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001622static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001623long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001624{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001625 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001626
Neil Schemenauerba872e22001-01-04 01:46:03 +00001627 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1628
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001629 if (a->ob_size < 0) {
1630 if (b->ob_size < 0)
1631 z = x_sub(a, b);
1632 else
1633 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001634 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001635 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001636 }
1637 else {
1638 if (b->ob_size < 0)
1639 z = x_add(a, b);
1640 else
1641 z = x_sub(a, b);
1642 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001643 Py_DECREF(a);
1644 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001645 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001646}
1647
Tim Peters5af4e6c2002-08-12 02:31:19 +00001648/* Grade school multiplication, ignoring the signs.
1649 * Returns the absolute value of the product, or NULL if error.
1650 */
1651static PyLongObject *
1652x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001653{
Tim Peters5af4e6c2002-08-12 02:31:19 +00001654 PyLongObject *z;
1655 int size_a = ABS(a->ob_size);
1656 int size_b = ABS(b->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001657 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001658
Tim Peters5af4e6c2002-08-12 02:31:19 +00001659 z = _PyLong_New(size_a + size_b);
1660 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001661 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001662
1663 memset(z->ob_digit, 0, z->ob_size * sizeof(digit));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001664 for (i = 0; i < size_a; ++i) {
1665 twodigits carry = 0;
1666 twodigits f = a->ob_digit[i];
1667 int j;
Tim Peters115c8882002-08-12 18:25:43 +00001668 digit *pz = z->ob_digit + i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001669
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001670 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001671 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001672 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001673 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001674 for (j = 0; j < size_b; ++j) {
Tim Peters115c8882002-08-12 18:25:43 +00001675 carry += *pz + b->ob_digit[j] * f;
1676 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001677 carry >>= SHIFT;
1678 }
1679 for (; carry != 0; ++j) {
1680 assert(i+j < z->ob_size);
Tim Peters115c8882002-08-12 18:25:43 +00001681 carry += *pz;
1682 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001683 carry >>= SHIFT;
1684 }
1685 }
Tim Peters44121a62002-08-12 06:17:58 +00001686 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001687}
1688
1689/* A helper for Karatsuba multiplication (k_mul).
1690 Takes a long "n" and an integer "size" representing the place to
1691 split, and sets low and high such that abs(n) == (high << size) + low,
1692 viewing the shift as being by digits. The sign bit is ignored, and
1693 the return values are >= 0.
1694 Returns 0 on success, -1 on failure.
1695*/
1696static int
1697kmul_split(PyLongObject *n, int size, PyLongObject **high, PyLongObject **low)
1698{
1699 PyLongObject *hi, *lo;
1700 int size_lo, size_hi;
1701 const int size_n = ABS(n->ob_size);
1702
1703 size_lo = MIN(size_n, size);
1704 size_hi = size_n - size_lo;
1705
1706 if ((hi = _PyLong_New(size_hi)) == NULL)
1707 return -1;
1708 if ((lo = _PyLong_New(size_lo)) == NULL) {
1709 Py_DECREF(hi);
1710 return -1;
1711 }
1712
1713 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
1714 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
1715
1716 *high = long_normalize(hi);
1717 *low = long_normalize(lo);
1718 return 0;
1719}
1720
Tim Peters60004642002-08-12 22:01:34 +00001721static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
1722
Tim Peters5af4e6c2002-08-12 02:31:19 +00001723/* Karatsuba multiplication. Ignores the input signs, and returns the
1724 * absolute value of the product (or NULL if error).
1725 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
1726 */
1727static PyLongObject *
1728k_mul(PyLongObject *a, PyLongObject *b)
1729{
Tim Peters738eda72002-08-12 15:08:20 +00001730 int asize = ABS(a->ob_size);
1731 int bsize = ABS(b->ob_size);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001732 PyLongObject *ah = NULL;
1733 PyLongObject *al = NULL;
1734 PyLongObject *bh = NULL;
1735 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001736 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00001737 PyLongObject *t1, *t2, *t3;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001738 int shift; /* the number of digits we split off */
1739 int i;
Tim Peters738eda72002-08-12 15:08:20 +00001740
Tim Peters5af4e6c2002-08-12 02:31:19 +00001741 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
1742 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
1743 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00001744 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00001745 * By picking X to be a power of 2, "*X" is just shifting, and it's
1746 * been reduced to 3 multiplies on numbers half the size.
1747 */
1748
Tim Petersfc07e562002-08-12 02:54:10 +00001749 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00001750 * is largest.
1751 */
Tim Peters738eda72002-08-12 15:08:20 +00001752 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001753 t1 = a;
1754 a = b;
1755 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00001756
1757 i = asize;
1758 asize = bsize;
1759 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001760 }
1761
1762 /* Use gradeschool math when either number is too small. */
Tim Peters738eda72002-08-12 15:08:20 +00001763 if (asize <= KARATSUBA_CUTOFF) {
Tim Peters738eda72002-08-12 15:08:20 +00001764 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00001765 return _PyLong_New(0);
1766 else
1767 return x_mul(a, b);
1768 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001769
Tim Peters60004642002-08-12 22:01:34 +00001770 /* If a is small compared to b, splitting on b gives a degenerate
1771 * case with ah==0, and Karatsuba may be (even much) less efficient
1772 * than "grade school" then. However, we can still win, by viewing
1773 * b as a string of "big digits", each of width a->ob_size. That
1774 * leads to a sequence of balanced calls to k_mul.
1775 */
1776 if (2 * asize <= bsize)
1777 return k_lopsided_mul(a, b);
1778
Tim Petersd6974a52002-08-13 20:37:51 +00001779 /* Split a & b into hi & lo pieces. */
Tim Peters738eda72002-08-12 15:08:20 +00001780 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001781 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
Tim Petersd6974a52002-08-13 20:37:51 +00001782 assert(ah->ob_size > 0); /* the split isn't degenerate */
1783
Tim Peters5af4e6c2002-08-12 02:31:19 +00001784 if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
1785
Tim Petersd64c1de2002-08-12 17:36:03 +00001786 /* The plan:
1787 * 1. Allocate result space (asize + bsize digits: that's always
1788 * enough).
1789 * 2. Compute ah*bh, and copy into result at 2*shift.
1790 * 3. Compute al*bl, and copy into result at 0. Note that this
1791 * can't overlap with #2.
1792 * 4. Subtract al*bl from the result, starting at shift. This may
1793 * underflow (borrow out of the high digit), but we don't care:
1794 * we're effectively doing unsigned arithmetic mod
1795 * BASE**(sizea + sizeb), and so long as the *final* result fits,
1796 * borrows and carries out of the high digit can be ignored.
1797 * 5. Subtract ah*bh from the result, starting at shift.
1798 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
1799 * at shift.
1800 */
1801
1802 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00001803 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001804 if (ret == NULL) goto fail;
1805#ifdef Py_DEBUG
1806 /* Fill with trash, to catch reference to uninitialized digits. */
1807 memset(ret->ob_digit, 0xDF, ret->ob_size * sizeof(digit));
1808#endif
Tim Peters44121a62002-08-12 06:17:58 +00001809
Tim Petersd64c1de2002-08-12 17:36:03 +00001810 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00001811 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
1812 assert(t1->ob_size >= 0);
1813 assert(2*shift + t1->ob_size <= ret->ob_size);
1814 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
1815 t1->ob_size * sizeof(digit));
1816
1817 /* Zero-out the digits higher than the ah*bh copy. */
1818 i = ret->ob_size - 2*shift - t1->ob_size;
Tim Peters44121a62002-08-12 06:17:58 +00001819 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001820 memset(ret->ob_digit + 2*shift + t1->ob_size, 0,
Tim Peters44121a62002-08-12 06:17:58 +00001821 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001822
Tim Petersd64c1de2002-08-12 17:36:03 +00001823 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001824 if ((t2 = k_mul(al, bl)) == NULL) {
1825 Py_DECREF(t1);
1826 goto fail;
1827 }
1828 assert(t2->ob_size >= 0);
1829 assert(t2->ob_size <= 2*shift); /* no overlap with high digits */
1830 memcpy(ret->ob_digit, t2->ob_digit, t2->ob_size * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001831
1832 /* Zero out remaining digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001833 i = 2*shift - t2->ob_size; /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001834 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001835 memset(ret->ob_digit + t2->ob_size, 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001836
Tim Petersd64c1de2002-08-12 17:36:03 +00001837 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
1838 * because it's fresher in cache.
1839 */
Tim Peters738eda72002-08-12 15:08:20 +00001840 i = ret->ob_size - shift; /* # digits after shift */
Tim Petersd64c1de2002-08-12 17:36:03 +00001841 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, t2->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001842 Py_DECREF(t2);
1843
Tim Petersd64c1de2002-08-12 17:36:03 +00001844 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, t1->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001845 Py_DECREF(t1);
1846
Tim Petersd64c1de2002-08-12 17:36:03 +00001847 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001848 if ((t1 = x_add(ah, al)) == NULL) goto fail;
1849 Py_DECREF(ah);
1850 Py_DECREF(al);
1851 ah = al = NULL;
1852
1853 if ((t2 = x_add(bh, bl)) == NULL) {
1854 Py_DECREF(t1);
1855 goto fail;
1856 }
1857 Py_DECREF(bh);
1858 Py_DECREF(bl);
1859 bh = bl = NULL;
1860
Tim Peters738eda72002-08-12 15:08:20 +00001861 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001862 Py_DECREF(t1);
1863 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00001864 if (t3 == NULL) goto fail;
Tim Peters547607c2002-08-12 19:43:49 +00001865 assert(t3->ob_size >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001866
Tim Petersd6974a52002-08-13 20:37:51 +00001867 /* Add t3. It's not obvious why we can't run out of room here.
1868 * See the (*) comment after this function.
Tim Petersd8b21732002-08-12 19:30:26 +00001869 */
Tim Petersd64c1de2002-08-12 17:36:03 +00001870 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, t3->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001871 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001872
Tim Peters5af4e6c2002-08-12 02:31:19 +00001873 return long_normalize(ret);
1874
1875 fail:
1876 Py_XDECREF(ret);
1877 Py_XDECREF(ah);
1878 Py_XDECREF(al);
1879 Py_XDECREF(bh);
1880 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001881 return NULL;
1882}
1883
Tim Petersd6974a52002-08-13 20:37:51 +00001884/* (*) Why adding t3 can't "run out of room" above.
1885
Tim Petersab86c2b2002-08-15 20:06:00 +00001886Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
1887to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00001888
Tim Petersab86c2b2002-08-15 20:06:00 +000018891. For any integer i, i = c(i/2) + f(i/2). In particular,
1890 bsize = c(bsize/2) + f(bsize/2).
18912. shift = f(bsize/2)
18923. asize <= bsize
18934. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
1894 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00001895
Tim Petersab86c2b2002-08-15 20:06:00 +00001896We allocated asize + bsize result digits, and add t3 into them at an offset
1897of shift. This leaves asize+bsize-shift allocated digit positions for t3
1898to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
1899asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00001900
Tim Petersab86c2b2002-08-15 20:06:00 +00001901bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
1902at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001903
Tim Petersab86c2b2002-08-15 20:06:00 +00001904If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
1905digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
1906most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001907
Tim Petersab86c2b2002-08-15 20:06:00 +00001908The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00001909
Tim Petersab86c2b2002-08-15 20:06:00 +00001910 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00001911
Tim Petersab86c2b2002-08-15 20:06:00 +00001912and we have asize + c(bsize/2) available digit positions. We need to show
1913this is always enough. An instance of c(bsize/2) cancels out in both, so
1914the question reduces to whether asize digits is enough to hold
1915(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
1916then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
1917asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
1918digit is enough to hold 2 bits. This is so since SHIFT=15 >= 2. If
1919asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00001920c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
1921is enough to hold 2 bits. This is so if bsize >= 2, which holds because
1922bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00001923
Tim Peters48d52c02002-08-14 17:07:32 +00001924Note that since there's always enough room for (ah+al)*(bh+bl), and that's
1925clearly >= each of ah*bh and al*bl, there's always enough room to subtract
1926ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00001927*/
1928
Tim Peters60004642002-08-12 22:01:34 +00001929/* b has at least twice the digits of a, and a is big enough that Karatsuba
1930 * would pay off *if* the inputs had balanced sizes. View b as a sequence
1931 * of slices, each with a->ob_size digits, and multiply the slices by a,
1932 * one at a time. This gives k_mul balanced inputs to work with, and is
1933 * also cache-friendly (we compute one double-width slice of the result
1934 * at a time, then move on, never bactracking except for the helpful
1935 * single-width slice overlap between successive partial sums).
1936 */
1937static PyLongObject *
1938k_lopsided_mul(PyLongObject *a, PyLongObject *b)
1939{
1940 const int asize = ABS(a->ob_size);
1941 int bsize = ABS(b->ob_size);
1942 int nbdone; /* # of b digits already multiplied */
1943 PyLongObject *ret;
1944 PyLongObject *bslice = NULL;
1945
1946 assert(asize > KARATSUBA_CUTOFF);
1947 assert(2 * asize <= bsize);
1948
1949 /* Allocate result space, and zero it out. */
1950 ret = _PyLong_New(asize + bsize);
1951 if (ret == NULL)
1952 return NULL;
1953 memset(ret->ob_digit, 0, ret->ob_size * sizeof(digit));
1954
1955 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00001956 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00001957 if (bslice == NULL)
1958 goto fail;
1959
1960 nbdone = 0;
1961 while (bsize > 0) {
1962 PyLongObject *product;
1963 const int nbtouse = MIN(bsize, asize);
1964
1965 /* Multiply the next slice of b by a. */
1966 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
1967 nbtouse * sizeof(digit));
1968 bslice->ob_size = nbtouse;
1969 product = k_mul(a, bslice);
1970 if (product == NULL)
1971 goto fail;
1972
1973 /* Add into result. */
1974 (void)v_iadd(ret->ob_digit + nbdone, ret->ob_size - nbdone,
1975 product->ob_digit, product->ob_size);
1976 Py_DECREF(product);
1977
1978 bsize -= nbtouse;
1979 nbdone += nbtouse;
1980 }
1981
1982 Py_DECREF(bslice);
1983 return long_normalize(ret);
1984
1985 fail:
1986 Py_DECREF(ret);
1987 Py_XDECREF(bslice);
1988 return NULL;
1989}
Tim Peters5af4e6c2002-08-12 02:31:19 +00001990
1991static PyObject *
1992long_mul(PyLongObject *v, PyLongObject *w)
1993{
1994 PyLongObject *a, *b, *z;
1995
1996 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001997 Py_INCREF(Py_NotImplemented);
1998 return Py_NotImplemented;
1999 }
2000
Tim Petersd64c1de2002-08-12 17:36:03 +00002001 z = k_mul(a, b);
Tim Peters9973d742002-08-15 19:41:06 +00002002 /* Negate if exactly one of the inputs is negative. */
2003 if (((a->ob_size ^ b->ob_size) < 0) && z)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002004 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002005 Py_DECREF(a);
2006 Py_DECREF(b);
Tim Peters9973d742002-08-15 19:41:06 +00002007 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002008}
2009
Guido van Rossume32e0141992-01-19 16:31:05 +00002010/* The / and % operators are now defined in terms of divmod().
2011 The expression a mod b has the value a - b*floor(a/b).
2012 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002013 |a| by |b|, with the sign of a. This is also expressed
2014 as a - b*trunc(a/b), if trunc truncates towards zero.
2015 Some examples:
2016 a b a rem b a mod b
2017 13 10 3 3
2018 -13 10 -3 7
2019 13 -10 3 -7
2020 -13 -10 -3 -3
2021 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002022 have different signs. We then subtract one from the 'div'
2023 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002024
Guido van Rossume32e0141992-01-19 16:31:05 +00002025static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00002026l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00002027 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00002028{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002029 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002030
Guido van Rossume32e0141992-01-19 16:31:05 +00002031 if (long_divrem(v, w, &div, &mod) < 0)
2032 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00002033 if ((mod->ob_size < 0 && w->ob_size > 0) ||
2034 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002035 PyLongObject *temp;
2036 PyLongObject *one;
2037 temp = (PyLongObject *) long_add(mod, w);
2038 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00002039 mod = temp;
2040 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002041 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002042 return -1;
2043 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002044 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00002045 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002046 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
2047 Py_DECREF(mod);
2048 Py_DECREF(div);
2049 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00002050 return -1;
2051 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002052 Py_DECREF(one);
2053 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002054 div = temp;
2055 }
2056 *pdiv = div;
2057 *pmod = mod;
2058 return 0;
2059}
2060
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002061static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002062long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002063{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002064 PyLongObject *a, *b, *div, *mod;
2065
2066 CONVERT_BINOP(v, w, &a, &b);
2067
2068 if (l_divmod(a, b, &div, &mod) < 0) {
2069 Py_DECREF(a);
2070 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002071 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002072 }
2073 Py_DECREF(a);
2074 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002075 Py_DECREF(mod);
2076 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00002077}
2078
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002079static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00002080long_classic_div(PyObject *v, PyObject *w)
2081{
2082 PyLongObject *a, *b, *div, *mod;
2083
2084 CONVERT_BINOP(v, w, &a, &b);
2085
2086 if (Py_DivisionWarningFlag &&
2087 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
2088 div = NULL;
2089 else if (l_divmod(a, b, &div, &mod) < 0)
2090 div = NULL;
2091 else
2092 Py_DECREF(mod);
2093
2094 Py_DECREF(a);
2095 Py_DECREF(b);
2096 return (PyObject *)div;
2097}
2098
2099static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00002100long_true_divide(PyObject *v, PyObject *w)
2101{
Tim Peterse2a60002001-09-04 06:17:36 +00002102 PyLongObject *a, *b;
2103 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00002104 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00002105
2106 CONVERT_BINOP(v, w, &a, &b);
2107 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
2108 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00002109 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
2110 Py_DECREF(a);
2111 Py_DECREF(b);
2112 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00002113 return NULL;
2114
2115 if (bd == 0.0) {
2116 PyErr_SetString(PyExc_ZeroDivisionError,
2117 "long division or modulo by zero");
2118 return NULL;
2119 }
2120
2121 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
2122 ad /= bd; /* overflow/underflow impossible here */
2123 aexp -= bexp;
2124 if (aexp > INT_MAX / SHIFT)
2125 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00002126 else if (aexp < -(INT_MAX / SHIFT))
2127 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002128 errno = 0;
2129 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002130 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002131 goto overflow;
2132 return PyFloat_FromDouble(ad);
2133
2134overflow:
2135 PyErr_SetString(PyExc_OverflowError,
2136 "long/long too large for a float");
2137 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002138
Tim Peters20dab9f2001-09-04 05:31:47 +00002139}
2140
2141static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002142long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002143{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002144 PyLongObject *a, *b, *div, *mod;
2145
2146 CONVERT_BINOP(v, w, &a, &b);
2147
2148 if (l_divmod(a, b, &div, &mod) < 0) {
2149 Py_DECREF(a);
2150 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002151 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002152 }
2153 Py_DECREF(a);
2154 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002155 Py_DECREF(div);
2156 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002157}
2158
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002159static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002160long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002161{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002162 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002163 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002164
2165 CONVERT_BINOP(v, w, &a, &b);
2166
2167 if (l_divmod(a, b, &div, &mod) < 0) {
2168 Py_DECREF(a);
2169 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002170 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002171 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002172 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002173 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002174 PyTuple_SetItem(z, 0, (PyObject *) div);
2175 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002176 }
2177 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002178 Py_DECREF(div);
2179 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002180 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002181 Py_DECREF(a);
2182 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002183 return z;
2184}
2185
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002186static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002187long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002188{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002189 PyLongObject *a, *b;
2190 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002191 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002192 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002193
2194 CONVERT_BINOP(v, w, &a, &b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002195 if (PyLong_Check(x) || Py_None == x) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002196 c = x;
2197 Py_INCREF(x);
2198 }
2199 else if (PyInt_Check(x)) {
2200 c = PyLong_FromLong(PyInt_AS_LONG(x));
2201 }
2202 else {
2203 Py_DECREF(a);
2204 Py_DECREF(b);
2205 Py_INCREF(Py_NotImplemented);
2206 return Py_NotImplemented;
2207 }
Tim Peters4c483c42001-09-05 06:24:58 +00002208
2209 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
2210 PyErr_SetString(PyExc_ValueError,
2211 "pow() 3rd argument cannot be 0");
2212 z = NULL;
2213 goto error;
2214 }
2215
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002216 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002217 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002218 Py_DECREF(a);
2219 Py_DECREF(b);
2220 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00002221 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00002222 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
2223 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00002224 return NULL;
2225 }
2226 /* Return a float. This works because we know that
2227 this calls float_pow() which converts its
2228 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002229 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002230 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002231 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002232 for (i = 0; i < size_b; ++i) {
2233 digit bi = b->ob_digit[i];
2234 int j;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002235
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002236 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002237 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002238
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002239 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002240 temp = (PyLongObject *)long_mul(z, a);
2241 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002242 if (c!=Py_None && temp!=NULL) {
2243 if (l_divmod(temp,(PyLongObject *)c,
2244 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002245 Py_DECREF(temp);
2246 z = NULL;
2247 goto error;
2248 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002249 Py_XDECREF(div);
2250 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002251 temp = mod;
2252 }
2253 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002254 if (z == NULL)
2255 break;
2256 }
2257 bi >>= 1;
2258 if (bi == 0 && i+1 == size_b)
2259 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002260 temp = (PyLongObject *)long_mul(a, a);
2261 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002262 if (c!=Py_None && temp!=NULL) {
2263 if (l_divmod(temp, (PyLongObject *)c, &div,
2264 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002265 Py_DECREF(temp);
2266 z = NULL;
2267 goto error;
2268 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002269 Py_XDECREF(div);
2270 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002271 temp = mod;
2272 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002273 a = temp;
2274 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002275 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002276 z = NULL;
2277 break;
2278 }
2279 }
Guido van Rossumc206c761995-01-10 15:23:19 +00002280 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002281 break;
2282 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002283 if (c!=Py_None && z!=NULL) {
2284 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002285 Py_DECREF(z);
2286 z = NULL;
2287 }
2288 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002289 Py_XDECREF(div);
2290 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002291 z = mod;
2292 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002293 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002294 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00002295 Py_XDECREF(a);
2296 Py_DECREF(b);
2297 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002298 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002299}
2300
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002301static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002302long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002303{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002304 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002305 PyLongObject *x;
2306 PyLongObject *w;
2307 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002308 if (w == NULL)
2309 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002310 x = (PyLongObject *) long_add(v, w);
2311 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002312 if (x == NULL)
2313 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00002314 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002315 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002316}
2317
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002318static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002319long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002320{
Tim Peters69c2de32001-09-11 22:31:33 +00002321 if (PyLong_CheckExact(v)) {
2322 Py_INCREF(v);
2323 return (PyObject *)v;
2324 }
2325 else
2326 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002327}
2328
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002329static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002330long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002331{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002332 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002333 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002334 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002335 Py_INCREF(v);
2336 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002337 }
Tim Peters69c2de32001-09-11 22:31:33 +00002338 z = (PyLongObject *)_PyLong_Copy(v);
2339 if (z != NULL)
2340 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002341 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002342}
2343
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002344static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002345long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002346{
2347 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002348 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002349 else
2350 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002351}
2352
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002353static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002354long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002355{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002356 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002357}
2358
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002359static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002360long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002361{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002362 PyLongObject *a, *b;
2363 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002364 long shiftby;
2365 int newsize, wordshift, loshift, hishift, i, j;
2366 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002367
Neil Schemenauerba872e22001-01-04 01:46:03 +00002368 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2369
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002370 if (a->ob_size < 0) {
2371 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002372 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002373 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002374 if (a1 == NULL)
2375 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002376 a2 = (PyLongObject *) long_rshift(a1, b);
2377 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002378 if (a2 == NULL)
2379 goto rshift_error;
2380 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002381 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002382 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002383 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002384
Neil Schemenauerba872e22001-01-04 01:46:03 +00002385 shiftby = PyLong_AsLong((PyObject *)b);
2386 if (shiftby == -1L && PyErr_Occurred())
2387 goto rshift_error;
2388 if (shiftby < 0) {
2389 PyErr_SetString(PyExc_ValueError,
2390 "negative shift count");
2391 goto rshift_error;
2392 }
2393 wordshift = shiftby / SHIFT;
2394 newsize = ABS(a->ob_size) - wordshift;
2395 if (newsize <= 0) {
2396 z = _PyLong_New(0);
2397 Py_DECREF(a);
2398 Py_DECREF(b);
2399 return (PyObject *)z;
2400 }
2401 loshift = shiftby % SHIFT;
2402 hishift = SHIFT - loshift;
2403 lomask = ((digit)1 << hishift) - 1;
2404 himask = MASK ^ lomask;
2405 z = _PyLong_New(newsize);
2406 if (z == NULL)
2407 goto rshift_error;
2408 if (a->ob_size < 0)
2409 z->ob_size = -(z->ob_size);
2410 for (i = 0, j = wordshift; i < newsize; i++, j++) {
2411 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
2412 if (i+1 < newsize)
2413 z->ob_digit[i] |=
2414 (a->ob_digit[j+1] << hishift) & himask;
2415 }
2416 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002417 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002418rshift_error:
2419 Py_DECREF(a);
2420 Py_DECREF(b);
2421 return (PyObject *) z;
2422
Guido van Rossumc6913e71991-11-19 20:26:46 +00002423}
2424
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002425static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002426long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002427{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002428 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002429 PyLongObject *a, *b;
2430 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002431 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002432 int oldsize, newsize, wordshift, remshift, i, j;
2433 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002434
Neil Schemenauerba872e22001-01-04 01:46:03 +00002435 CONVERT_BINOP(v, w, &a, &b);
2436
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002437 shiftby = PyLong_AsLong((PyObject *)b);
2438 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00002439 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002440 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002441 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002442 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002443 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002444 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002445 PyErr_SetString(PyExc_ValueError,
2446 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002447 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002448 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002449 /* wordshift, remshift = divmod(shiftby, SHIFT) */
2450 wordshift = (int)shiftby / SHIFT;
2451 remshift = (int)shiftby - wordshift * SHIFT;
2452
2453 oldsize = ABS(a->ob_size);
2454 newsize = oldsize + wordshift;
2455 if (remshift)
2456 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002457 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002458 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002459 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002460 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002461 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002462 for (i = 0; i < wordshift; i++)
2463 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002464 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002465 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00002466 accum |= (twodigits)a->ob_digit[j] << remshift;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002467 z->ob_digit[i] = (digit)(accum & MASK);
2468 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002469 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002470 if (remshift)
2471 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002472 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002473 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002474 z = long_normalize(z);
2475lshift_error:
2476 Py_DECREF(a);
2477 Py_DECREF(b);
2478 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002479}
2480
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002481
2482/* Bitwise and/xor/or operations */
2483
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002484static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002485long_bitwise(PyLongObject *a,
2486 int op, /* '&', '|', '^' */
2487 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002488{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002489 digit maska, maskb; /* 0 or MASK */
2490 int negz;
2491 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002492 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002493 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002494 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002495 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002496
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002497 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002498 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002499 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002500 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002501 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002502 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002503 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002504 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002505 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002506 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002507 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002508 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002509 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002510 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002511 maskb = 0;
2512 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002513
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002514 negz = 0;
2515 switch (op) {
2516 case '^':
2517 if (maska != maskb) {
2518 maska ^= MASK;
2519 negz = -1;
2520 }
2521 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002522 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002523 if (maska && maskb) {
2524 op = '|';
2525 maska ^= MASK;
2526 maskb ^= MASK;
2527 negz = -1;
2528 }
2529 break;
2530 case '|':
2531 if (maska || maskb) {
2532 op = '&';
2533 maska ^= MASK;
2534 maskb ^= MASK;
2535 negz = -1;
2536 }
2537 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002538 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002539
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002540 /* JRH: The original logic here was to allocate the result value (z)
2541 as the longer of the two operands. However, there are some cases
2542 where the result is guaranteed to be shorter than that: AND of two
2543 positives, OR of two negatives: use the shorter number. AND with
2544 mixed signs: use the positive number. OR with mixed signs: use the
2545 negative number. After the transformations above, op will be '&'
2546 iff one of these cases applies, and mask will be non-0 for operands
2547 whose length should be ignored.
2548 */
2549
2550 size_a = a->ob_size;
2551 size_b = b->ob_size;
2552 size_z = op == '&'
2553 ? (maska
2554 ? size_b
2555 : (maskb ? size_a : MIN(size_a, size_b)))
2556 : MAX(size_a, size_b);
2557 z = _PyLong_New(size_z);
2558 if (a == NULL || b == NULL || z == NULL) {
2559 Py_XDECREF(a);
2560 Py_XDECREF(b);
2561 Py_XDECREF(z);
2562 return NULL;
2563 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002564
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002565 for (i = 0; i < size_z; ++i) {
2566 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2567 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2568 switch (op) {
2569 case '&': z->ob_digit[i] = diga & digb; break;
2570 case '|': z->ob_digit[i] = diga | digb; break;
2571 case '^': z->ob_digit[i] = diga ^ digb; break;
2572 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002573 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002574
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002575 Py_DECREF(a);
2576 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002577 z = long_normalize(z);
2578 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002579 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002580 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002581 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002582 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002583}
2584
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002585static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002586long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002587{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002588 PyLongObject *a, *b;
2589 PyObject *c;
2590 CONVERT_BINOP(v, w, &a, &b);
2591 c = long_bitwise(a, '&', b);
2592 Py_DECREF(a);
2593 Py_DECREF(b);
2594 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002595}
2596
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002597static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002598long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002599{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002600 PyLongObject *a, *b;
2601 PyObject *c;
2602 CONVERT_BINOP(v, w, &a, &b);
2603 c = long_bitwise(a, '^', b);
2604 Py_DECREF(a);
2605 Py_DECREF(b);
2606 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002607}
2608
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002609static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002610long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002611{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002612 PyLongObject *a, *b;
2613 PyObject *c;
2614 CONVERT_BINOP(v, w, &a, &b);
2615 c = long_bitwise(a, '|', b);
2616 Py_DECREF(a);
2617 Py_DECREF(b);
2618 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002619}
2620
Guido van Rossum234f9421993-06-17 12:35:49 +00002621static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002622long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002623{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002624 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002625 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002626 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002627 return 0;
2628 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002629 else if (PyLong_Check(*pw)) {
2630 Py_INCREF(*pv);
2631 Py_INCREF(*pw);
2632 return 0;
2633 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002634 return 1; /* Can't do it */
2635}
2636
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002637static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002638long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002639{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002640 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002641 return v;
2642}
2643
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002644static PyObject *
Walter Dörwaldf1715402002-11-19 20:49:15 +00002645long_int(PyObject *v)
2646{
2647 long x;
2648 x = PyLong_AsLong(v);
2649 if (PyErr_Occurred()) {
2650 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2651 PyErr_Clear();
2652 if (PyLong_CheckExact(v)) {
2653 Py_INCREF(v);
2654 return v;
2655 }
2656 else
2657 return _PyLong_Copy((PyLongObject *)v);
2658 }
2659 else
2660 return NULL;
2661 }
2662 return PyInt_FromLong(x);
2663}
2664
2665static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002666long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002667{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002668 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002669 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002670 if (result == -1.0 && PyErr_Occurred())
2671 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002672 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002673}
2674
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002675static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002676long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002677{
Fred Drake121ee271999-12-23 15:41:28 +00002678 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002679}
2680
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002681static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002682long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002683{
Fred Drake121ee271999-12-23 15:41:28 +00002684 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002685}
Jeremy Hylton938ace62002-07-17 16:30:39 +00002686
2687static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00002688long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002689
Tim Peters6d6c1a32001-08-02 04:15:00 +00002690static PyObject *
2691long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2692{
2693 PyObject *x = NULL;
2694 int base = -909; /* unlikely! */
2695 static char *kwlist[] = {"x", "base", 0};
2696
Guido van Rossumbef14172001-08-29 15:47:46 +00002697 if (type != &PyLong_Type)
2698 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002699 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2700 &x, &base))
2701 return NULL;
2702 if (x == NULL)
2703 return PyLong_FromLong(0L);
2704 if (base == -909)
2705 return PyNumber_Long(x);
2706 else if (PyString_Check(x))
2707 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002708#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002709 else if (PyUnicode_Check(x))
2710 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2711 PyUnicode_GET_SIZE(x),
2712 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002713#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002714 else {
2715 PyErr_SetString(PyExc_TypeError,
2716 "long() can't convert non-string with explicit base");
2717 return NULL;
2718 }
2719}
2720
Guido van Rossumbef14172001-08-29 15:47:46 +00002721/* Wimpy, slow approach to tp_new calls for subtypes of long:
2722 first create a regular long from whatever arguments we got,
2723 then allocate a subtype instance and initialize it from
2724 the regular long. The regular long is then thrown away.
2725*/
2726static PyObject *
2727long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2728{
2729 PyLongObject *tmp, *new;
2730 int i, n;
2731
2732 assert(PyType_IsSubtype(type, &PyLong_Type));
2733 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2734 if (tmp == NULL)
2735 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002736 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002737 n = tmp->ob_size;
2738 if (n < 0)
2739 n = -n;
2740 new = (PyLongObject *)type->tp_alloc(type, n);
2741 if (new == NULL)
2742 return NULL;
2743 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002744 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002745 for (i = 0; i < n; i++)
2746 new->ob_digit[i] = tmp->ob_digit[i];
2747 Py_DECREF(tmp);
2748 return (PyObject *)new;
2749}
2750
Guido van Rossum5d9113d2003-01-29 17:58:45 +00002751static PyObject *
2752long_getnewargs(PyLongObject *v)
2753{
2754 return Py_BuildValue("(N)", _PyLong_Copy(v));
2755}
2756
2757static PyMethodDef long_methods[] = {
2758 {"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
2759 {NULL, NULL} /* sentinel */
2760};
2761
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002762PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002763"long(x[, base]) -> integer\n\
2764\n\
2765Convert a string or number to a long integer, if possible. A floating\n\
2766point argument will be truncated towards zero (this does not include a\n\
2767string representation of a floating point number!) When converting a\n\
2768string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002769converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002770
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002771static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002772 (binaryfunc) long_add, /*nb_add*/
2773 (binaryfunc) long_sub, /*nb_subtract*/
2774 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002775 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002776 (binaryfunc) long_mod, /*nb_remainder*/
2777 (binaryfunc) long_divmod, /*nb_divmod*/
2778 (ternaryfunc) long_pow, /*nb_power*/
2779 (unaryfunc) long_neg, /*nb_negative*/
2780 (unaryfunc) long_pos, /*tp_positive*/
2781 (unaryfunc) long_abs, /*tp_absolute*/
2782 (inquiry) long_nonzero, /*tp_nonzero*/
2783 (unaryfunc) long_invert, /*nb_invert*/
2784 (binaryfunc) long_lshift, /*nb_lshift*/
2785 (binaryfunc) long_rshift, /*nb_rshift*/
2786 (binaryfunc) long_and, /*nb_and*/
2787 (binaryfunc) long_xor, /*nb_xor*/
2788 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002789 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002790 (unaryfunc) long_int, /*nb_int*/
2791 (unaryfunc) long_long, /*nb_long*/
2792 (unaryfunc) long_float, /*nb_float*/
2793 (unaryfunc) long_oct, /*nb_oct*/
2794 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002795 0, /* nb_inplace_add */
2796 0, /* nb_inplace_subtract */
2797 0, /* nb_inplace_multiply */
2798 0, /* nb_inplace_divide */
2799 0, /* nb_inplace_remainder */
2800 0, /* nb_inplace_power */
2801 0, /* nb_inplace_lshift */
2802 0, /* nb_inplace_rshift */
2803 0, /* nb_inplace_and */
2804 0, /* nb_inplace_xor */
2805 0, /* nb_inplace_or */
2806 (binaryfunc)long_div, /* nb_floor_divide */
2807 long_true_divide, /* nb_true_divide */
2808 0, /* nb_inplace_floor_divide */
2809 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002810};
2811
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002812PyTypeObject PyLong_Type = {
2813 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002814 0, /* ob_size */
2815 "long", /* tp_name */
2816 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2817 sizeof(digit), /* tp_itemsize */
2818 (destructor)long_dealloc, /* tp_dealloc */
2819 0, /* tp_print */
2820 0, /* tp_getattr */
2821 0, /* tp_setattr */
2822 (cmpfunc)long_compare, /* tp_compare */
2823 (reprfunc)long_repr, /* tp_repr */
2824 &long_as_number, /* tp_as_number */
2825 0, /* tp_as_sequence */
2826 0, /* tp_as_mapping */
2827 (hashfunc)long_hash, /* tp_hash */
2828 0, /* tp_call */
2829 (reprfunc)long_str, /* tp_str */
2830 PyObject_GenericGetAttr, /* tp_getattro */
2831 0, /* tp_setattro */
2832 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002833 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2834 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002835 long_doc, /* tp_doc */
2836 0, /* tp_traverse */
2837 0, /* tp_clear */
2838 0, /* tp_richcompare */
2839 0, /* tp_weaklistoffset */
2840 0, /* tp_iter */
2841 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00002842 long_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002843 0, /* tp_members */
2844 0, /* tp_getset */
2845 0, /* tp_base */
2846 0, /* tp_dict */
2847 0, /* tp_descr_get */
2848 0, /* tp_descr_set */
2849 0, /* tp_dictoffset */
2850 0, /* tp_init */
2851 0, /* tp_alloc */
2852 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002853 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002854};