blob: e02bce46108acfd247e312c57b8a07e470eb1d59 [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 Peters5b8132f2003-01-31 15:52:05 +0000267
268 assert(v != NULL);
269 assert(PyLong_Check(v));
Tim Peters5b8132f2003-01-31 15:52:05 +0000270
Tim Petersee1a53c2003-02-02 02:57:53 +0000271 return v->ob_size == 0 ? 0 : (v->ob_size < 0 ? -1 : 1);
Tim Peters5b8132f2003-01-31 15:52:05 +0000272}
273
Tim Petersbaefd9e2003-01-28 20:37:45 +0000274size_t
275_PyLong_NumBits(PyObject *vv)
276{
277 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000278 size_t result = 0;
Guido van Rossum004a65c2003-02-03 15:28:19 +0000279 int ndigits;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000280
281 assert(v != NULL);
282 assert(PyLong_Check(v));
Guido van Rossum004a65c2003-02-03 15:28:19 +0000283 ndigits = ABS(v->ob_size);
Tim Petersbaefd9e2003-01-28 20:37:45 +0000284 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
285 if (ndigits > 0) {
Tim Petersbaefd9e2003-01-28 20:37:45 +0000286 digit msd = v->ob_digit[ndigits - 1];
287
Tim Peters5b8132f2003-01-31 15:52:05 +0000288 result = (ndigits - 1) * SHIFT;
Tim Peters08a1d9c2003-01-31 21:45:13 +0000289 if (result / SHIFT != (size_t)ndigits - 1)
Tim Petersbaefd9e2003-01-28 20:37:45 +0000290 goto Overflow;
291 do {
292 ++result;
293 if (result == 0)
294 goto Overflow;
295 msd >>= 1;
296 } while (msd);
297 }
298 return result;
299
300Overflow:
301 PyErr_SetString(PyExc_OverflowError, "long has too many bits "
302 "to express in a platform size_t");
303 return (size_t)-1;
304}
305
Tim Peters2a9b3672001-06-11 21:23:58 +0000306PyObject *
307_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
308 int little_endian, int is_signed)
309{
310 const unsigned char* pstartbyte;/* LSB of bytes */
311 int incr; /* direction to move pstartbyte */
312 const unsigned char* pendbyte; /* MSB of bytes */
313 size_t numsignificantbytes; /* number of bytes that matter */
314 size_t ndigits; /* number of Python long digits */
315 PyLongObject* v; /* result */
316 int idigit = 0; /* next free index in v->ob_digit */
317
318 if (n == 0)
319 return PyLong_FromLong(0L);
320
321 if (little_endian) {
322 pstartbyte = bytes;
323 pendbyte = bytes + n - 1;
324 incr = 1;
325 }
326 else {
327 pstartbyte = bytes + n - 1;
328 pendbyte = bytes;
329 incr = -1;
330 }
331
332 if (is_signed)
333 is_signed = *pendbyte >= 0x80;
334
335 /* Compute numsignificantbytes. This consists of finding the most
336 significant byte. Leading 0 bytes are insignficant if the number
337 is positive, and leading 0xff bytes if negative. */
338 {
339 size_t i;
340 const unsigned char* p = pendbyte;
341 const int pincr = -incr; /* search MSB to LSB */
342 const unsigned char insignficant = is_signed ? 0xff : 0x00;
343
344 for (i = 0; i < n; ++i, p += pincr) {
345 if (*p != insignficant)
346 break;
347 }
348 numsignificantbytes = n - i;
349 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
350 actually has 2 significant bytes. OTOH, 0xff0001 ==
351 -0x00ffff, so we wouldn't *need* to bump it there; but we
352 do for 0xffff = -0x0001. To be safe without bothering to
353 check every case, bump it regardless. */
354 if (is_signed && numsignificantbytes < n)
355 ++numsignificantbytes;
356 }
357
358 /* How many Python long digits do we need? We have
359 8*numsignificantbytes bits, and each Python long digit has SHIFT
360 bits, so it's the ceiling of the quotient. */
361 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
362 if (ndigits > (size_t)INT_MAX)
363 return PyErr_NoMemory();
364 v = _PyLong_New((int)ndigits);
365 if (v == NULL)
366 return NULL;
367
368 /* Copy the bits over. The tricky parts are computing 2's-comp on
369 the fly for signed numbers, and dealing with the mismatch between
370 8-bit bytes and (probably) 15-bit Python digits.*/
371 {
372 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000373 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000374 twodigits accum = 0; /* sliding register */
375 unsigned int accumbits = 0; /* number of bits in accum */
376 const unsigned char* p = pstartbyte;
377
378 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000379 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000380 /* Compute correction for 2's comp, if needed. */
381 if (is_signed) {
382 thisbyte = (0xff ^ thisbyte) + carry;
383 carry = thisbyte >> 8;
384 thisbyte &= 0xff;
385 }
386 /* Because we're going LSB to MSB, thisbyte is
387 more significant than what's already in accum,
388 so needs to be prepended to accum. */
389 accum |= thisbyte << accumbits;
390 accumbits += 8;
391 if (accumbits >= SHIFT) {
392 /* There's enough to fill a Python digit. */
393 assert(idigit < (int)ndigits);
394 v->ob_digit[idigit] = (digit)(accum & MASK);
395 ++idigit;
396 accum >>= SHIFT;
397 accumbits -= SHIFT;
398 assert(accumbits < SHIFT);
399 }
400 }
401 assert(accumbits < SHIFT);
402 if (accumbits) {
403 assert(idigit < (int)ndigits);
404 v->ob_digit[idigit] = (digit)accum;
405 ++idigit;
406 }
407 }
408
409 v->ob_size = is_signed ? -idigit : idigit;
410 return (PyObject *)long_normalize(v);
411}
412
413int
414_PyLong_AsByteArray(PyLongObject* v,
415 unsigned char* bytes, size_t n,
416 int little_endian, int is_signed)
417{
418 int i; /* index into v->ob_digit */
419 int ndigits; /* |v->ob_size| */
420 twodigits accum; /* sliding register */
421 unsigned int accumbits; /* # bits in accum */
422 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
423 twodigits carry; /* for computing 2's-comp */
424 size_t j; /* # bytes filled */
425 unsigned char* p; /* pointer to next byte in bytes */
426 int pincr; /* direction to move p */
427
428 assert(v != NULL && PyLong_Check(v));
429
430 if (v->ob_size < 0) {
431 ndigits = -(v->ob_size);
432 if (!is_signed) {
433 PyErr_SetString(PyExc_TypeError,
434 "can't convert negative long to unsigned");
435 return -1;
436 }
437 do_twos_comp = 1;
438 }
439 else {
440 ndigits = v->ob_size;
441 do_twos_comp = 0;
442 }
443
444 if (little_endian) {
445 p = bytes;
446 pincr = 1;
447 }
448 else {
449 p = bytes + n - 1;
450 pincr = -1;
451 }
452
Tim Peters898cf852001-06-13 20:50:08 +0000453 /* Copy over all the Python digits.
454 It's crucial that every Python digit except for the MSD contribute
455 exactly SHIFT bits to the total, so first assert that the long is
456 normalized. */
457 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000458 j = 0;
459 accum = 0;
460 accumbits = 0;
461 carry = do_twos_comp ? 1 : 0;
462 for (i = 0; i < ndigits; ++i) {
463 twodigits thisdigit = v->ob_digit[i];
464 if (do_twos_comp) {
465 thisdigit = (thisdigit ^ MASK) + carry;
466 carry = thisdigit >> SHIFT;
467 thisdigit &= MASK;
468 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000469 /* Because we're going LSB to MSB, thisdigit is more
470 significant than what's already in accum, so needs to be
471 prepended to accum. */
472 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000473 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000474
Tim Petersede05092001-06-14 08:53:38 +0000475 /* The most-significant digit may be (probably is) at least
476 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000477 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000478 /* Count # of sign bits -- they needn't be stored,
479 * although for signed conversion we need later to
480 * make sure at least one sign bit gets stored.
481 * First shift conceptual sign bit to real sign bit.
482 */
483 stwodigits s = (stwodigits)(thisdigit <<
484 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000485 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000486 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000487 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000488 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000489 }
Tim Petersede05092001-06-14 08:53:38 +0000490 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000491 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000492
Tim Peters2a9b3672001-06-11 21:23:58 +0000493 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000494 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000495 if (j >= n)
496 goto Overflow;
497 ++j;
498 *p = (unsigned char)(accum & 0xff);
499 p += pincr;
500 accumbits -= 8;
501 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000502 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000503 }
504
505 /* Store the straggler (if any). */
506 assert(accumbits < 8);
507 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000508 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000509 if (j >= n)
510 goto Overflow;
511 ++j;
512 if (do_twos_comp) {
513 /* Fill leading bits of the byte with sign bits
514 (appropriately pretending that the long had an
515 infinite supply of sign bits). */
516 accum |= (~(twodigits)0) << accumbits;
517 }
518 *p = (unsigned char)(accum & 0xff);
519 p += pincr;
520 }
Tim Peters05607ad2001-06-13 21:01:27 +0000521 else if (j == n && n > 0 && is_signed) {
522 /* The main loop filled the byte array exactly, so the code
523 just above didn't get to ensure there's a sign bit, and the
524 loop below wouldn't add one either. Make sure a sign bit
525 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000526 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000527 int sign_bit_set = msb >= 0x80;
528 assert(accumbits == 0);
529 if (sign_bit_set == do_twos_comp)
530 return 0;
531 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000532 goto Overflow;
533 }
Tim Peters05607ad2001-06-13 21:01:27 +0000534
535 /* Fill remaining bytes with copies of the sign bit. */
536 {
537 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
538 for ( ; j < n; ++j, p += pincr)
539 *p = signbyte;
540 }
541
Tim Peters2a9b3672001-06-11 21:23:58 +0000542 return 0;
543
544Overflow:
545 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
546 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000547
Tim Peters2a9b3672001-06-11 21:23:58 +0000548}
549
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000550double
551_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
552{
553/* NBITS_WANTED should be > the number of bits in a double's precision,
554 but small enough so that 2**NBITS_WANTED is within the normal double
555 range. nbitsneeded is set to 1 less than that because the most-significant
556 Python digit contains at least 1 significant bit, but we don't want to
557 bother counting them (catering to the worst case cheaply).
558
559 57 is one more than VAX-D double precision; I (Tim) don't know of a double
560 format with more precision than that; it's 1 larger so that we add in at
561 least one round bit to stand in for the ignored least-significant bits.
562*/
563#define NBITS_WANTED 57
564 PyLongObject *v;
565 double x;
566 const double multiplier = (double)(1L << SHIFT);
567 int i, sign;
568 int nbitsneeded;
569
570 if (vv == NULL || !PyLong_Check(vv)) {
571 PyErr_BadInternalCall();
572 return -1;
573 }
574 v = (PyLongObject *)vv;
575 i = v->ob_size;
576 sign = 1;
577 if (i < 0) {
578 sign = -1;
579 i = -(i);
580 }
581 else if (i == 0) {
582 *exponent = 0;
583 return 0.0;
584 }
585 --i;
586 x = (double)v->ob_digit[i];
587 nbitsneeded = NBITS_WANTED - 1;
588 /* Invariant: i Python digits remain unaccounted for. */
589 while (i > 0 && nbitsneeded > 0) {
590 --i;
591 x = x * multiplier + (double)v->ob_digit[i];
592 nbitsneeded -= SHIFT;
593 }
594 /* There are i digits we didn't shift in. Pretending they're all
595 zeroes, the true value is x * 2**(i*SHIFT). */
596 *exponent = i;
597 assert(x > 0.0);
598 return x * sign;
599#undef NBITS_WANTED
600}
601
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000602/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000603
604double
Tim Peters9f688bf2000-07-07 15:53:28 +0000605PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000606{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000607 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000608 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000609
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 if (vv == NULL || !PyLong_Check(vv)) {
611 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000612 return -1;
613 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000614 x = _PyLong_AsScaledDouble(vv, &e);
615 if (x == -1.0 && PyErr_Occurred())
616 return -1.0;
617 if (e > INT_MAX / SHIFT)
618 goto overflow;
619 errno = 0;
620 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000621 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000622 goto overflow;
623 return x;
624
625overflow:
626 PyErr_SetString(PyExc_OverflowError,
627 "long int too large to convert to float");
628 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000629}
630
Guido van Rossum78694d91998-09-18 14:14:13 +0000631/* Create a new long (or int) object from a C pointer */
632
633PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000634PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000635{
Tim Peters70128a12001-06-16 08:48:40 +0000636#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000637 return PyInt_FromLong((long)p);
638#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000639
Tim Peters70128a12001-06-16 08:48:40 +0000640#ifndef HAVE_LONG_LONG
641# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
642#endif
643#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000644# error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000645#endif
646 /* optimize null pointers */
647 if (p == NULL)
648 return PyInt_FromLong(0);
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000649 return PyLong_FromLongLong((PY_LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000650
651#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000652}
653
654/* Get a C pointer from a long object (or an int object in some cases) */
655
656void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000657PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000658{
659 /* This function will allow int or long objects. If vv is neither,
660 then the PyLong_AsLong*() functions will raise the exception:
661 PyExc_SystemError, "bad argument to internal function"
662 */
Tim Peters70128a12001-06-16 08:48:40 +0000663#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000664 long x;
665
Tim Peters70128a12001-06-16 08:48:40 +0000666 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000667 x = PyInt_AS_LONG(vv);
668 else
669 x = PyLong_AsLong(vv);
670#else
Tim Peters70128a12001-06-16 08:48:40 +0000671
672#ifndef HAVE_LONG_LONG
673# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
674#endif
675#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000676# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000677#endif
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000678 PY_LONG_LONG x;
Guido van Rossum78694d91998-09-18 14:14:13 +0000679
Tim Peters70128a12001-06-16 08:48:40 +0000680 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000681 x = PyInt_AS_LONG(vv);
682 else
683 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000684
685#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000686
687 if (x == -1 && PyErr_Occurred())
688 return NULL;
689 return (void *)x;
690}
691
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000692#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000693
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000694/* Initial PY_LONG_LONG support by Chris Herborth (chrish@qnx.com), later
Tim Petersd1a7da62001-06-13 00:35:57 +0000695 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000696 */
697
Tim Peterscf37dfc2001-06-14 18:42:50 +0000698#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000699
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000700/* Create a new long int object from a C PY_LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000701
702PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000703PyLong_FromLongLong(PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000704{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000705 PY_LONG_LONG bytes = ival;
Tim Petersd1a7da62001-06-13 00:35:57 +0000706 int one = 1;
707 return _PyLong_FromByteArray(
708 (unsigned char *)&bytes,
709 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000710}
711
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000712/* Create a new long int object from a C unsigned PY_LONG_LONG int. */
Tim Petersd1a7da62001-06-13 00:35:57 +0000713
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000714PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000715PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000716{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000717 unsigned PY_LONG_LONG bytes = ival;
Tim Petersd1a7da62001-06-13 00:35:57 +0000718 int one = 1;
719 return _PyLong_FromByteArray(
720 (unsigned char *)&bytes,
721 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000722}
723
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000724/* Get a C PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000725 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000726
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000727PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000728PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000729{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000730 PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +0000731 int one = 1;
732 int res;
733
Tim Petersd38b1c72001-09-30 05:09:37 +0000734 if (vv == NULL) {
735 PyErr_BadInternalCall();
736 return -1;
737 }
738 if (!PyLong_Check(vv)) {
739 if (PyInt_Check(vv))
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000740 return (PY_LONG_LONG)PyInt_AsLong(vv);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000741 PyErr_BadInternalCall();
742 return -1;
743 }
744
Tim Petersd1a7da62001-06-13 00:35:57 +0000745 res = _PyLong_AsByteArray(
746 (PyLongObject *)vv, (unsigned char *)&bytes,
747 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000748
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000749 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000750 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000751 return (PY_LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000752 else
753 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000754}
755
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000756/* Get a C unsigned PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000757 Return -1 and set an error if overflow occurs. */
758
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000759unsigned PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000760PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000761{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000762 unsigned PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +0000763 int one = 1;
764 int res;
765
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000766 if (vv == NULL || !PyLong_Check(vv)) {
767 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000768 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000769 }
770
Tim Petersd1a7da62001-06-13 00:35:57 +0000771 res = _PyLong_AsByteArray(
772 (PyLongObject *)vv, (unsigned char *)&bytes,
773 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000774
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000775 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000776 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000777 return (unsigned PY_LONG_LONG)res;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000778 else
779 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000780}
Tim Petersd1a7da62001-06-13 00:35:57 +0000781
782#undef IS_LITTLE_ENDIAN
783
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000784#endif /* HAVE_LONG_LONG */
785
Neil Schemenauerba872e22001-01-04 01:46:03 +0000786
787static int
788convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +0000789 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000790 *a = (PyLongObject *) v;
791 Py_INCREF(v);
792 }
793 else if (PyInt_Check(v)) {
794 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
795 }
796 else {
797 return 0;
798 }
Tim Peters5af4e6c2002-08-12 02:31:19 +0000799 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000800 *b = (PyLongObject *) w;
801 Py_INCREF(w);
802 }
803 else if (PyInt_Check(w)) {
804 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
805 }
806 else {
807 Py_DECREF(*a);
808 return 0;
809 }
810 return 1;
811}
812
813#define CONVERT_BINOP(v, w, a, b) \
814 if (!convert_binop(v, w, a, b)) { \
815 Py_INCREF(Py_NotImplemented); \
816 return Py_NotImplemented; \
817 }
818
Tim Peters877a2122002-08-12 05:09:36 +0000819/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
820 * is modified in place, by adding y to it. Carries are propagated as far as
821 * x[m-1], and the remaining carry (0 or 1) is returned.
822 */
823static digit
824v_iadd(digit *x, int m, digit *y, int n)
825{
826 int i;
827 digit carry = 0;
828
829 assert(m >= n);
830 for (i = 0; i < n; ++i) {
831 carry += x[i] + y[i];
832 x[i] = carry & MASK;
833 carry >>= SHIFT;
834 assert((carry & 1) == carry);
835 }
836 for (; carry && i < m; ++i) {
837 carry += x[i];
838 x[i] = carry & MASK;
839 carry >>= SHIFT;
840 assert((carry & 1) == carry);
841 }
842 return carry;
843}
844
845/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
846 * is modified in place, by subtracting y from it. Borrows are propagated as
847 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
848 */
849static digit
850v_isub(digit *x, int m, digit *y, int n)
851{
852 int i;
853 digit borrow = 0;
854
855 assert(m >= n);
856 for (i = 0; i < n; ++i) {
857 borrow = x[i] - y[i] - borrow;
858 x[i] = borrow & MASK;
859 borrow >>= SHIFT;
860 borrow &= 1; /* keep only 1 sign bit */
861 }
862 for (; borrow && i < m; ++i) {
863 borrow = x[i] - borrow;
864 x[i] = borrow & MASK;
865 borrow >>= SHIFT;
866 borrow &= 1;
867 }
868 return borrow;
869}
Neil Schemenauerba872e22001-01-04 01:46:03 +0000870
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000871/* Multiply by a single digit, ignoring the sign. */
872
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000873static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000874mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000875{
876 return muladd1(a, n, (digit)0);
877}
878
879/* Multiply by a single digit and add a single digit, ignoring the sign. */
880
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000881static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000882muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000883{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000884 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000885 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000886 twodigits carry = extra;
887 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000888
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000889 if (z == NULL)
890 return NULL;
891 for (i = 0; i < size_a; ++i) {
892 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000893 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000894 carry >>= SHIFT;
895 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000896 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000897 return long_normalize(z);
898}
899
Tim Peters212e6142001-07-14 12:23:19 +0000900/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
901 in pout, and returning the remainder. pin and pout point at the LSD.
902 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
903 long_format, but that should be done with great care since longs are
904 immutable. */
905
906static digit
907inplace_divrem1(digit *pout, digit *pin, int size, digit n)
908{
909 twodigits rem = 0;
910
911 assert(n > 0 && n <= MASK);
912 pin += size;
913 pout += size;
914 while (--size >= 0) {
915 digit hi;
916 rem = (rem << SHIFT) + *--pin;
917 *--pout = hi = (digit)(rem / n);
918 rem -= hi * n;
919 }
920 return (digit)rem;
921}
922
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000923/* Divide a long integer by a digit, returning both the quotient
924 (as function result) and the remainder (through *prem).
925 The sign of a is ignored; n should not be zero. */
926
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000928divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000929{
Tim Peters212e6142001-07-14 12:23:19 +0000930 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000931 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000932
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000933 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000934 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000935 if (z == NULL)
936 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000937 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000938 return long_normalize(z);
939}
940
941/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000942 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000943 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000944
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000946long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000947{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 register PyLongObject *a = (PyLongObject *)aa;
949 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000950 int i;
Tim Peters212e6142001-07-14 12:23:19 +0000951 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000952 char *p;
953 int bits;
954 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +0000955
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000956 if (a == NULL || !PyLong_Check(a)) {
957 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +0000958 return NULL;
959 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000960 assert(base >= 2 && base <= 36);
Tim Peters5af4e6c2002-08-12 02:31:19 +0000961
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000962 /* Compute a rough upper bound for the length of the string */
963 i = base;
964 bits = 0;
965 while (i > 1) {
966 ++bits;
967 i >>= 1;
968 }
Fred Drake121ee271999-12-23 15:41:28 +0000969 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000971 if (str == NULL)
972 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000973 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000974 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +0000975 if (addL)
976 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000977 if (a->ob_size < 0)
978 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +0000979
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000980 if (a->ob_size == 0) {
981 *--p = '0';
982 }
983 else if ((base & (base - 1)) == 0) {
984 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +0000985 twodigits accum = 0;
986 int accumbits = 0; /* # of bits in accum */
987 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000988 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +0000989 while ((i >>= 1) > 1)
990 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +0000991
992 for (i = 0; i < size_a; ++i) {
Tim Peters0d2d87d2002-08-20 19:00:22 +0000993 accum |= (twodigits)a->ob_digit[i] << accumbits;
Tim Peters586b2e32001-07-15 09:11:14 +0000994 accumbits += SHIFT;
995 assert(accumbits >= basebits);
996 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +0000997 char cdigit = (char)(accum & (base - 1));
998 cdigit += (cdigit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +0000999 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001000 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +00001001 accumbits -= basebits;
1002 accum >>= basebits;
1003 } while (i < size_a-1 ? accumbits >= basebits :
1004 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001005 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001006 }
1007 else {
Tim Petersfad225f2001-07-13 02:59:26 +00001008 /* Not 0, and base not a power of 2. Divide repeatedly by
1009 base, but for speed use the highest power of base that
1010 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +00001011 int size = size_a;
1012 digit *pin = a->ob_digit;
1013 PyLongObject *scratch;
1014 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +00001015 digit powbase = base; /* powbase == base ** power */
1016 int power = 1;
1017 for (;;) {
1018 unsigned long newpow = powbase * (unsigned long)base;
1019 if (newpow >> SHIFT) /* doesn't fit in a digit */
1020 break;
1021 powbase = (digit)newpow;
1022 ++power;
1023 }
Tim Peters212e6142001-07-14 12:23:19 +00001024
1025 /* Get a scratch area for repeated division. */
1026 scratch = _PyLong_New(size);
1027 if (scratch == NULL) {
1028 Py_DECREF(str);
1029 return NULL;
1030 }
1031
1032 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001033 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001034 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +00001035 digit rem = inplace_divrem1(scratch->ob_digit,
1036 pin, size, powbase);
1037 pin = scratch->ob_digit; /* no need to use a again */
1038 if (pin[size - 1] == 0)
1039 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001040 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +00001041 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001042 Py_DECREF(str);
1043 return NULL;
1044 })
Tim Peters212e6142001-07-14 12:23:19 +00001045
1046 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001047 assert(ntostore > 0);
1048 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001049 digit nextrem = (digit)(rem / base);
1050 char c = (char)(rem - nextrem * base);
1051 assert(p > PyString_AS_STRING(str));
1052 c += (c < 10) ? '0' : 'A'-10;
1053 *--p = c;
1054 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001055 --ntostore;
1056 /* Termination is a bit delicate: must not
1057 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001058 remaining quotient and rem are both 0. */
1059 } while (ntostore && (size || rem));
1060 } while (size != 0);
1061 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001062 }
1063
Guido van Rossum2c475421992-08-14 15:13:07 +00001064 if (base == 8) {
1065 if (size_a != 0)
1066 *--p = '0';
1067 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001068 else if (base == 16) {
1069 *--p = 'x';
1070 *--p = '0';
1071 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001072 else if (base != 10) {
1073 *--p = '#';
1074 *--p = '0' + base%10;
1075 if (base > 10)
1076 *--p = '0' + base/10;
1077 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001078 if (sign)
1079 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080 if (p != PyString_AS_STRING(str)) {
1081 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001082 assert(p > q);
1083 do {
1084 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001085 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 _PyString_Resize((PyObject **)&str,
1087 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001088 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001089 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001090}
1091
Tim Petersbf2674b2003-02-02 07:51:32 +00001092/* *str points to the first digit in a string of base base digits. base
1093 * is a power of 2 (2, 4, 8, 16, or 32). *str is set to point to the first
1094 * non-digit (which may be *str!). A normalized long is returned.
1095 * The point to this routine is that it takes time linear in the number of
1096 * string characters.
1097 */
1098static PyLongObject *
1099long_from_binary_base(char **str, int base)
1100{
1101 char *p = *str;
1102 char *start = p;
1103 int bits_per_char;
1104 int n;
1105 PyLongObject *z;
1106 twodigits accum;
1107 int bits_in_accum;
1108 digit *pdigit;
1109
1110 assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
1111 n = base;
1112 for (bits_per_char = -1; n; ++bits_per_char)
1113 n >>= 1;
1114 /* n <- total # of bits needed, while setting p to end-of-string */
1115 n = 0;
1116 for (;;) {
1117 int k = -1;
1118 char ch = *p;
1119
1120 if (ch <= '9')
1121 k = ch - '0';
1122 else if (ch >= 'a')
1123 k = ch - 'a' + 10;
1124 else if (ch >= 'A')
1125 k = ch - 'A' + 10;
1126 if (k < 0 || k >= base)
1127 break;
Tim Petersbf2674b2003-02-02 07:51:32 +00001128 ++p;
1129 }
1130 *str = p;
Tim Peters1a3b19a2003-02-02 17:33:53 +00001131 n = (p - start) * bits_per_char;
1132 if (n / bits_per_char != p - start) {
1133 PyErr_SetString(PyExc_ValueError,
1134 "long string too large to convert");
1135 return NULL;
1136 }
Tim Petersbf2674b2003-02-02 07:51:32 +00001137 /* n <- # of Python digits needed, = ceiling(n/SHIFT). */
1138 n = (n + SHIFT - 1) / SHIFT;
1139 z = _PyLong_New(n);
1140 if (z == NULL)
1141 return NULL;
1142 /* Read string from right, and fill in long from left; i.e.,
1143 * from least to most significant in both.
1144 */
1145 accum = 0;
1146 bits_in_accum = 0;
1147 pdigit = z->ob_digit;
1148 while (--p >= start) {
1149 unsigned char ch = (unsigned char)*p;
1150 digit k;
1151
1152 if (ch <= '9')
1153 k = ch - '0';
1154 else if (ch >= 'a')
1155 k = ch - 'a' + 10;
1156 else {
1157 assert(ch >= 'A');
1158 k = ch - 'A' + 10;
1159 }
Tim Petersefb96252003-02-02 08:05:32 +00001160 assert(k < base);
Tim Petersbf2674b2003-02-02 07:51:32 +00001161 accum |= k << bits_in_accum;
1162 bits_in_accum += bits_per_char;
1163 if (bits_in_accum >= SHIFT) {
1164 *pdigit++ = (digit)(accum & MASK);
1165 assert(pdigit - z->ob_digit <= n);
1166 accum >>= SHIFT;
1167 bits_in_accum -= SHIFT;
1168 assert(bits_in_accum < SHIFT);
1169 }
1170 }
1171 if (bits_in_accum) {
1172 assert(bits_in_accum <= SHIFT);
1173 *pdigit++ = (digit)accum;
1174 assert(pdigit - z->ob_digit <= n);
1175 }
1176 while (pdigit - z->ob_digit < n)
1177 *pdigit++ = 0;
1178 return long_normalize(z);
1179}
1180
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001181PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001182PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001183{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001184 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001185 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001186 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001187
Guido van Rossum472c04f1996-12-05 21:57:21 +00001188 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001189 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001190 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001191 return NULL;
1192 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001193 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001194 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001195 if (*str == '+')
1196 ++str;
1197 else if (*str == '-') {
1198 ++str;
1199 sign = -1;
1200 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001201 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001202 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001203 if (base == 0) {
1204 if (str[0] != '0')
1205 base = 10;
1206 else if (str[1] == 'x' || str[1] == 'X')
1207 base = 16;
1208 else
1209 base = 8;
1210 }
1211 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1212 str += 2;
Guido van Rossume6762971998-06-22 03:54:46 +00001213 start = str;
Tim Petersbf2674b2003-02-02 07:51:32 +00001214 if ((base & (base - 1)) == 0)
1215 z = long_from_binary_base(&str, base);
1216 else {
1217 z = _PyLong_New(0);
1218 for ( ; z != NULL; ++str) {
1219 int k = -1;
1220 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001221
Tim Petersbf2674b2003-02-02 07:51:32 +00001222 if (*str <= '9')
1223 k = *str - '0';
1224 else if (*str >= 'a')
1225 k = *str - 'a' + 10;
1226 else if (*str >= 'A')
1227 k = *str - 'A' + 10;
1228 if (k < 0 || k >= base)
1229 break;
1230 temp = muladd1(z, (digit)base, (digit)k);
1231 Py_DECREF(z);
1232 z = temp;
1233 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001234 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001235 if (z == NULL)
1236 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001237 if (str == start)
1238 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001239 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001240 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001241 if (*str == 'L' || *str == 'l')
1242 str++;
1243 while (*str && isspace(Py_CHARMASK(*str)))
1244 str++;
1245 if (*str != '\0')
1246 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001247 if (pend)
1248 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001249 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001250
1251 onError:
Tim Peters5af4e6c2002-08-12 02:31:19 +00001252 PyErr_Format(PyExc_ValueError,
Guido van Rossum9e896b32000-04-05 20:11:21 +00001253 "invalid literal for long(): %.200s", orig_str);
1254 Py_XDECREF(z);
1255 return NULL;
1256}
1257
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001258#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001259PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001260PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001261{
Walter Dörwald07e14762002-11-06 16:15:14 +00001262 PyObject *result;
1263 char *buffer = PyMem_MALLOC(length+1);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001264
Walter Dörwald07e14762002-11-06 16:15:14 +00001265 if (buffer == NULL)
1266 return NULL;
1267
1268 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
1269 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001270 return NULL;
1271 }
Walter Dörwald07e14762002-11-06 16:15:14 +00001272 result = PyLong_FromString(buffer, NULL, base);
1273 PyMem_FREE(buffer);
1274 return result;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001275}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001276#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001277
Tim Peters9f688bf2000-07-07 15:53:28 +00001278/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001279static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001280 (PyLongObject *, PyLongObject *, PyLongObject **);
1281static PyObject *long_pos(PyLongObject *);
1282static int long_divrem(PyLongObject *, PyLongObject *,
1283 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001284
1285/* Long division with remainder, top-level routine */
1286
Guido van Rossume32e0141992-01-19 16:31:05 +00001287static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001288long_divrem(PyLongObject *a, PyLongObject *b,
1289 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001290{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001291 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001293
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001294 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001295 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001296 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001297 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001298 }
1299 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001300 (size_a == size_b &&
1301 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001302 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001303 *pdiv = _PyLong_New(0);
1304 Py_INCREF(a);
1305 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001306 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001307 }
1308 if (size_b == 1) {
1309 digit rem = 0;
1310 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001311 if (z == NULL)
1312 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001313 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001314 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001315 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001316 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001317 if (z == NULL)
1318 return -1;
1319 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001320 /* Set the signs.
1321 The quotient z has the sign of a*b;
1322 the remainder r has the sign of a,
1323 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001324 if ((a->ob_size < 0) != (b->ob_size < 0))
1325 z->ob_size = -(z->ob_size);
1326 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1327 (*prem)->ob_size = -((*prem)->ob_size);
1328 *pdiv = z;
1329 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001330}
1331
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001332/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001333
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001335x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001336{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001337 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001338 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 PyLongObject *v = mul1(v1, d);
1340 PyLongObject *w = mul1(w1, d);
1341 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001342 int j, k;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001343
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001344 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001345 Py_XDECREF(v);
1346 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001347 return NULL;
1348 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001349
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001350 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001351 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001352 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001353
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001354 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001355 a = _PyLong_New(size_v - size_w + 1);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001356
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001357 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1358 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1359 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001360 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001361 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001362
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001363 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001364 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001365 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001366 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001367 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001368 if (vj == w->ob_digit[size_w-1])
1369 q = MASK;
1370 else
1371 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1372 w->ob_digit[size_w-1];
Tim Peters5af4e6c2002-08-12 02:31:19 +00001373
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001374 while (w->ob_digit[size_w-2]*q >
1375 ((
1376 ((twodigits)vj << SHIFT)
1377 + v->ob_digit[j-1]
1378 - q*w->ob_digit[size_w-1]
1379 ) << SHIFT)
1380 + v->ob_digit[j-2])
1381 --q;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001382
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001383 for (i = 0; i < size_w && i+k < size_v; ++i) {
1384 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001385 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001386 carry += v->ob_digit[i+k] - z
1387 + ((twodigits)zz << SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001388 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001389 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1390 carry, SHIFT);
1391 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001392 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001393
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001394 if (i+k < size_v) {
1395 carry += v->ob_digit[i+k];
1396 v->ob_digit[i+k] = 0;
1397 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001398
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001399 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001400 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001401 else {
1402 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001403 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001404 carry = 0;
1405 for (i = 0; i < size_w && i+k < size_v; ++i) {
1406 carry += v->ob_digit[i+k] + w->ob_digit[i];
1407 v->ob_digit[i+k] = carry & MASK;
Tim Peters7d3a5112000-07-08 04:17:21 +00001408 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1409 BASE_TWODIGITS_TYPE,
1410 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001411 }
1412 }
1413 } /* for j, k */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001414
Guido van Rossumc206c761995-01-10 15:23:19 +00001415 if (a == NULL)
1416 *prem = NULL;
1417 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001418 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001419 *prem = divrem1(v, d, &d);
1420 /* d receives the (unused) remainder */
1421 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001422 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001423 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001424 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001425 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001426 Py_DECREF(v);
1427 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001428 return a;
1429}
1430
1431/* Methods */
1432
1433static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001434long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001435{
Guido van Rossum9475a232001-10-05 20:51:39 +00001436 v->ob_type->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001437}
1438
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001439static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001440long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001441{
Fred Drake121ee271999-12-23 15:41:28 +00001442 return long_format(v, 10, 1);
1443}
1444
1445static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001446long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001447{
1448 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001449}
1450
1451static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001452long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001453{
1454 int sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001455
Guido van Rossumc6913e71991-11-19 20:26:46 +00001456 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001457 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001458 sign = 0;
1459 else
1460 sign = a->ob_size - b->ob_size;
1461 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001462 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001463 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001464 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1465 ;
1466 if (i < 0)
1467 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001468 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001469 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001470 if (a->ob_size < 0)
1471 sign = -sign;
1472 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001473 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001474 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001475}
1476
Guido van Rossum9bfef441993-03-29 10:43:31 +00001477static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001478long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001479{
1480 long x;
1481 int i, sign;
1482
1483 /* This is designed so that Python ints and longs with the
1484 same value hash to the same value, otherwise comparisons
1485 of mapping keys will turn out weird */
1486 i = v->ob_size;
1487 sign = 1;
1488 x = 0;
1489 if (i < 0) {
1490 sign = -1;
1491 i = -(i);
1492 }
Neal Norwitzd5a65a72003-02-23 23:11:41 +00001493#define LONG_BIT_SHIFT (8*sizeof(long) - SHIFT)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001494 while (--i >= 0) {
Neal Norwitzd5a65a72003-02-23 23:11:41 +00001495 /* Force a native long #-bits (32 or 64) circular shift */
1496 x = ((x << SHIFT) & ~MASK) | ((x >> LONG_BIT_SHIFT) & MASK);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001497 x += v->ob_digit[i];
1498 }
Neal Norwitzd5a65a72003-02-23 23:11:41 +00001499#undef LONG_BIT_SHIFT
Guido van Rossum9bfef441993-03-29 10:43:31 +00001500 x = x * sign;
1501 if (x == -1)
1502 x = -2;
1503 return x;
1504}
1505
1506
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001507/* Add the absolute values of two long integers. */
1508
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001509static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001510x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001511{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001512 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001513 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001514 int i;
1515 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001516
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001517 /* Ensure a is the larger of the two: */
1518 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001519 { PyLongObject *temp = a; a = b; b = temp; }
1520 { int size_temp = size_a;
1521 size_a = size_b;
1522 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001523 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001524 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001525 if (z == NULL)
1526 return NULL;
1527 for (i = 0; i < size_b; ++i) {
1528 carry += a->ob_digit[i] + b->ob_digit[i];
1529 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001530 carry >>= SHIFT;
1531 }
1532 for (; i < size_a; ++i) {
1533 carry += a->ob_digit[i];
1534 z->ob_digit[i] = carry & MASK;
1535 carry >>= SHIFT;
1536 }
1537 z->ob_digit[i] = carry;
1538 return long_normalize(z);
1539}
1540
1541/* Subtract the absolute values of two integers. */
1542
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001543static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001544x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001545{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001546 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001547 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001548 int i;
1549 int sign = 1;
1550 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001551
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001552 /* Ensure a is the larger of the two: */
1553 if (size_a < size_b) {
1554 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001555 { PyLongObject *temp = a; a = b; b = temp; }
1556 { int size_temp = size_a;
1557 size_a = size_b;
1558 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001559 }
1560 else if (size_a == size_b) {
1561 /* Find highest digit where a and b differ: */
1562 i = size_a;
1563 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1564 ;
1565 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001566 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001567 if (a->ob_digit[i] < b->ob_digit[i]) {
1568 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001569 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001570 }
1571 size_a = size_b = i+1;
1572 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001573 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001574 if (z == NULL)
1575 return NULL;
1576 for (i = 0; i < size_b; ++i) {
1577 /* The following assumes unsigned arithmetic
1578 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001579 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001580 z->ob_digit[i] = borrow & MASK;
1581 borrow >>= SHIFT;
1582 borrow &= 1; /* Keep only one sign bit */
1583 }
1584 for (; i < size_a; ++i) {
1585 borrow = a->ob_digit[i] - borrow;
1586 z->ob_digit[i] = borrow & MASK;
1587 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001588 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001589 }
1590 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001591 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001592 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001593 return long_normalize(z);
1594}
1595
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001596static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001597long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001598{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001599 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001600
Neil Schemenauerba872e22001-01-04 01:46:03 +00001601 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1602
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001603 if (a->ob_size < 0) {
1604 if (b->ob_size < 0) {
1605 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001606 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001607 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001608 }
1609 else
1610 z = x_sub(b, a);
1611 }
1612 else {
1613 if (b->ob_size < 0)
1614 z = x_sub(a, b);
1615 else
1616 z = x_add(a, b);
1617 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001618 Py_DECREF(a);
1619 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001620 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001621}
1622
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001623static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001624long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001625{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001626 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001627
Neil Schemenauerba872e22001-01-04 01:46:03 +00001628 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1629
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001630 if (a->ob_size < 0) {
1631 if (b->ob_size < 0)
1632 z = x_sub(a, b);
1633 else
1634 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001635 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001636 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001637 }
1638 else {
1639 if (b->ob_size < 0)
1640 z = x_add(a, b);
1641 else
1642 z = x_sub(a, b);
1643 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001644 Py_DECREF(a);
1645 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001646 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001647}
1648
Tim Peters5af4e6c2002-08-12 02:31:19 +00001649/* Grade school multiplication, ignoring the signs.
1650 * Returns the absolute value of the product, or NULL if error.
1651 */
1652static PyLongObject *
1653x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001654{
Tim Peters5af4e6c2002-08-12 02:31:19 +00001655 PyLongObject *z;
1656 int size_a = ABS(a->ob_size);
1657 int size_b = ABS(b->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001658 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001659
Tim Peters5af4e6c2002-08-12 02:31:19 +00001660 z = _PyLong_New(size_a + size_b);
1661 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001662 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001663
1664 memset(z->ob_digit, 0, z->ob_size * sizeof(digit));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001665 for (i = 0; i < size_a; ++i) {
1666 twodigits carry = 0;
1667 twodigits f = a->ob_digit[i];
1668 int j;
Tim Peters115c8882002-08-12 18:25:43 +00001669 digit *pz = z->ob_digit + i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001670
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001671 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001672 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001673 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001674 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001675 for (j = 0; j < size_b; ++j) {
Tim Peters115c8882002-08-12 18:25:43 +00001676 carry += *pz + b->ob_digit[j] * f;
1677 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001678 carry >>= SHIFT;
1679 }
1680 for (; carry != 0; ++j) {
1681 assert(i+j < z->ob_size);
Tim Peters115c8882002-08-12 18:25:43 +00001682 carry += *pz;
1683 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001684 carry >>= SHIFT;
1685 }
1686 }
Tim Peters44121a62002-08-12 06:17:58 +00001687 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001688}
1689
1690/* A helper for Karatsuba multiplication (k_mul).
1691 Takes a long "n" and an integer "size" representing the place to
1692 split, and sets low and high such that abs(n) == (high << size) + low,
1693 viewing the shift as being by digits. The sign bit is ignored, and
1694 the return values are >= 0.
1695 Returns 0 on success, -1 on failure.
1696*/
1697static int
1698kmul_split(PyLongObject *n, int size, PyLongObject **high, PyLongObject **low)
1699{
1700 PyLongObject *hi, *lo;
1701 int size_lo, size_hi;
1702 const int size_n = ABS(n->ob_size);
1703
1704 size_lo = MIN(size_n, size);
1705 size_hi = size_n - size_lo;
1706
1707 if ((hi = _PyLong_New(size_hi)) == NULL)
1708 return -1;
1709 if ((lo = _PyLong_New(size_lo)) == NULL) {
1710 Py_DECREF(hi);
1711 return -1;
1712 }
1713
1714 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
1715 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
1716
1717 *high = long_normalize(hi);
1718 *low = long_normalize(lo);
1719 return 0;
1720}
1721
Tim Peters60004642002-08-12 22:01:34 +00001722static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
1723
Tim Peters5af4e6c2002-08-12 02:31:19 +00001724/* Karatsuba multiplication. Ignores the input signs, and returns the
1725 * absolute value of the product (or NULL if error).
1726 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
1727 */
1728static PyLongObject *
1729k_mul(PyLongObject *a, PyLongObject *b)
1730{
Tim Peters738eda72002-08-12 15:08:20 +00001731 int asize = ABS(a->ob_size);
1732 int bsize = ABS(b->ob_size);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001733 PyLongObject *ah = NULL;
1734 PyLongObject *al = NULL;
1735 PyLongObject *bh = NULL;
1736 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001737 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00001738 PyLongObject *t1, *t2, *t3;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001739 int shift; /* the number of digits we split off */
1740 int i;
Tim Peters738eda72002-08-12 15:08:20 +00001741
Tim Peters5af4e6c2002-08-12 02:31:19 +00001742 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
1743 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
1744 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00001745 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00001746 * By picking X to be a power of 2, "*X" is just shifting, and it's
1747 * been reduced to 3 multiplies on numbers half the size.
1748 */
1749
Tim Petersfc07e562002-08-12 02:54:10 +00001750 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00001751 * is largest.
1752 */
Tim Peters738eda72002-08-12 15:08:20 +00001753 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001754 t1 = a;
1755 a = b;
1756 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00001757
1758 i = asize;
1759 asize = bsize;
1760 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001761 }
1762
1763 /* Use gradeschool math when either number is too small. */
Tim Peters738eda72002-08-12 15:08:20 +00001764 if (asize <= KARATSUBA_CUTOFF) {
Tim Peters738eda72002-08-12 15:08:20 +00001765 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00001766 return _PyLong_New(0);
1767 else
1768 return x_mul(a, b);
1769 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001770
Tim Peters60004642002-08-12 22:01:34 +00001771 /* If a is small compared to b, splitting on b gives a degenerate
1772 * case with ah==0, and Karatsuba may be (even much) less efficient
1773 * than "grade school" then. However, we can still win, by viewing
1774 * b as a string of "big digits", each of width a->ob_size. That
1775 * leads to a sequence of balanced calls to k_mul.
1776 */
1777 if (2 * asize <= bsize)
1778 return k_lopsided_mul(a, b);
1779
Tim Petersd6974a52002-08-13 20:37:51 +00001780 /* Split a & b into hi & lo pieces. */
Tim Peters738eda72002-08-12 15:08:20 +00001781 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001782 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
Tim Petersd6974a52002-08-13 20:37:51 +00001783 assert(ah->ob_size > 0); /* the split isn't degenerate */
1784
Tim Peters5af4e6c2002-08-12 02:31:19 +00001785 if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
1786
Tim Petersd64c1de2002-08-12 17:36:03 +00001787 /* The plan:
1788 * 1. Allocate result space (asize + bsize digits: that's always
1789 * enough).
1790 * 2. Compute ah*bh, and copy into result at 2*shift.
1791 * 3. Compute al*bl, and copy into result at 0. Note that this
1792 * can't overlap with #2.
1793 * 4. Subtract al*bl from the result, starting at shift. This may
1794 * underflow (borrow out of the high digit), but we don't care:
1795 * we're effectively doing unsigned arithmetic mod
1796 * BASE**(sizea + sizeb), and so long as the *final* result fits,
1797 * borrows and carries out of the high digit can be ignored.
1798 * 5. Subtract ah*bh from the result, starting at shift.
1799 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
1800 * at shift.
1801 */
1802
1803 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00001804 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001805 if (ret == NULL) goto fail;
1806#ifdef Py_DEBUG
1807 /* Fill with trash, to catch reference to uninitialized digits. */
1808 memset(ret->ob_digit, 0xDF, ret->ob_size * sizeof(digit));
1809#endif
Tim Peters44121a62002-08-12 06:17:58 +00001810
Tim Petersd64c1de2002-08-12 17:36:03 +00001811 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00001812 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
1813 assert(t1->ob_size >= 0);
1814 assert(2*shift + t1->ob_size <= ret->ob_size);
1815 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
1816 t1->ob_size * sizeof(digit));
1817
1818 /* Zero-out the digits higher than the ah*bh copy. */
1819 i = ret->ob_size - 2*shift - t1->ob_size;
Tim Peters44121a62002-08-12 06:17:58 +00001820 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001821 memset(ret->ob_digit + 2*shift + t1->ob_size, 0,
Tim Peters44121a62002-08-12 06:17:58 +00001822 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001823
Tim Petersd64c1de2002-08-12 17:36:03 +00001824 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001825 if ((t2 = k_mul(al, bl)) == NULL) {
1826 Py_DECREF(t1);
1827 goto fail;
1828 }
1829 assert(t2->ob_size >= 0);
1830 assert(t2->ob_size <= 2*shift); /* no overlap with high digits */
1831 memcpy(ret->ob_digit, t2->ob_digit, t2->ob_size * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001832
1833 /* Zero out remaining digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001834 i = 2*shift - t2->ob_size; /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001835 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001836 memset(ret->ob_digit + t2->ob_size, 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001837
Tim Petersd64c1de2002-08-12 17:36:03 +00001838 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
1839 * because it's fresher in cache.
1840 */
Tim Peters738eda72002-08-12 15:08:20 +00001841 i = ret->ob_size - shift; /* # digits after shift */
Tim Petersd64c1de2002-08-12 17:36:03 +00001842 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, t2->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001843 Py_DECREF(t2);
1844
Tim Petersd64c1de2002-08-12 17:36:03 +00001845 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, t1->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001846 Py_DECREF(t1);
1847
Tim Petersd64c1de2002-08-12 17:36:03 +00001848 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001849 if ((t1 = x_add(ah, al)) == NULL) goto fail;
1850 Py_DECREF(ah);
1851 Py_DECREF(al);
1852 ah = al = NULL;
1853
1854 if ((t2 = x_add(bh, bl)) == NULL) {
1855 Py_DECREF(t1);
1856 goto fail;
1857 }
1858 Py_DECREF(bh);
1859 Py_DECREF(bl);
1860 bh = bl = NULL;
1861
Tim Peters738eda72002-08-12 15:08:20 +00001862 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001863 Py_DECREF(t1);
1864 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00001865 if (t3 == NULL) goto fail;
Tim Peters547607c2002-08-12 19:43:49 +00001866 assert(t3->ob_size >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001867
Tim Petersd6974a52002-08-13 20:37:51 +00001868 /* Add t3. It's not obvious why we can't run out of room here.
1869 * See the (*) comment after this function.
Tim Petersd8b21732002-08-12 19:30:26 +00001870 */
Tim Petersd64c1de2002-08-12 17:36:03 +00001871 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, t3->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001872 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001873
Tim Peters5af4e6c2002-08-12 02:31:19 +00001874 return long_normalize(ret);
1875
1876 fail:
1877 Py_XDECREF(ret);
1878 Py_XDECREF(ah);
1879 Py_XDECREF(al);
1880 Py_XDECREF(bh);
1881 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001882 return NULL;
1883}
1884
Tim Petersd6974a52002-08-13 20:37:51 +00001885/* (*) Why adding t3 can't "run out of room" above.
1886
Tim Petersab86c2b2002-08-15 20:06:00 +00001887Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
1888to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00001889
Tim Petersab86c2b2002-08-15 20:06:00 +000018901. For any integer i, i = c(i/2) + f(i/2). In particular,
1891 bsize = c(bsize/2) + f(bsize/2).
18922. shift = f(bsize/2)
18933. asize <= bsize
18944. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
1895 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00001896
Tim Petersab86c2b2002-08-15 20:06:00 +00001897We allocated asize + bsize result digits, and add t3 into them at an offset
1898of shift. This leaves asize+bsize-shift allocated digit positions for t3
1899to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
1900asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00001901
Tim Petersab86c2b2002-08-15 20:06:00 +00001902bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
1903at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001904
Tim Petersab86c2b2002-08-15 20:06:00 +00001905If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
1906digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
1907most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001908
Tim Petersab86c2b2002-08-15 20:06:00 +00001909The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00001910
Tim Petersab86c2b2002-08-15 20:06:00 +00001911 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00001912
Tim Petersab86c2b2002-08-15 20:06:00 +00001913and we have asize + c(bsize/2) available digit positions. We need to show
1914this is always enough. An instance of c(bsize/2) cancels out in both, so
1915the question reduces to whether asize digits is enough to hold
1916(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
1917then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
1918asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
1919digit is enough to hold 2 bits. This is so since SHIFT=15 >= 2. If
1920asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00001921c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
1922is enough to hold 2 bits. This is so if bsize >= 2, which holds because
1923bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00001924
Tim Peters48d52c02002-08-14 17:07:32 +00001925Note that since there's always enough room for (ah+al)*(bh+bl), and that's
1926clearly >= each of ah*bh and al*bl, there's always enough room to subtract
1927ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00001928*/
1929
Tim Peters60004642002-08-12 22:01:34 +00001930/* b has at least twice the digits of a, and a is big enough that Karatsuba
1931 * would pay off *if* the inputs had balanced sizes. View b as a sequence
1932 * of slices, each with a->ob_size digits, and multiply the slices by a,
1933 * one at a time. This gives k_mul balanced inputs to work with, and is
1934 * also cache-friendly (we compute one double-width slice of the result
1935 * at a time, then move on, never bactracking except for the helpful
1936 * single-width slice overlap between successive partial sums).
1937 */
1938static PyLongObject *
1939k_lopsided_mul(PyLongObject *a, PyLongObject *b)
1940{
1941 const int asize = ABS(a->ob_size);
1942 int bsize = ABS(b->ob_size);
1943 int nbdone; /* # of b digits already multiplied */
1944 PyLongObject *ret;
1945 PyLongObject *bslice = NULL;
1946
1947 assert(asize > KARATSUBA_CUTOFF);
1948 assert(2 * asize <= bsize);
1949
1950 /* Allocate result space, and zero it out. */
1951 ret = _PyLong_New(asize + bsize);
1952 if (ret == NULL)
1953 return NULL;
1954 memset(ret->ob_digit, 0, ret->ob_size * sizeof(digit));
1955
1956 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00001957 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00001958 if (bslice == NULL)
1959 goto fail;
1960
1961 nbdone = 0;
1962 while (bsize > 0) {
1963 PyLongObject *product;
1964 const int nbtouse = MIN(bsize, asize);
1965
1966 /* Multiply the next slice of b by a. */
1967 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
1968 nbtouse * sizeof(digit));
1969 bslice->ob_size = nbtouse;
1970 product = k_mul(a, bslice);
1971 if (product == NULL)
1972 goto fail;
1973
1974 /* Add into result. */
1975 (void)v_iadd(ret->ob_digit + nbdone, ret->ob_size - nbdone,
1976 product->ob_digit, product->ob_size);
1977 Py_DECREF(product);
1978
1979 bsize -= nbtouse;
1980 nbdone += nbtouse;
1981 }
1982
1983 Py_DECREF(bslice);
1984 return long_normalize(ret);
1985
1986 fail:
1987 Py_DECREF(ret);
1988 Py_XDECREF(bslice);
1989 return NULL;
1990}
Tim Peters5af4e6c2002-08-12 02:31:19 +00001991
1992static PyObject *
1993long_mul(PyLongObject *v, PyLongObject *w)
1994{
1995 PyLongObject *a, *b, *z;
1996
1997 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001998 Py_INCREF(Py_NotImplemented);
1999 return Py_NotImplemented;
2000 }
2001
Tim Petersd64c1de2002-08-12 17:36:03 +00002002 z = k_mul(a, b);
Tim Peters9973d742002-08-15 19:41:06 +00002003 /* Negate if exactly one of the inputs is negative. */
2004 if (((a->ob_size ^ b->ob_size) < 0) && z)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002005 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002006 Py_DECREF(a);
2007 Py_DECREF(b);
Tim Peters9973d742002-08-15 19:41:06 +00002008 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002009}
2010
Guido van Rossume32e0141992-01-19 16:31:05 +00002011/* The / and % operators are now defined in terms of divmod().
2012 The expression a mod b has the value a - b*floor(a/b).
2013 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002014 |a| by |b|, with the sign of a. This is also expressed
2015 as a - b*trunc(a/b), if trunc truncates towards zero.
2016 Some examples:
2017 a b a rem b a mod b
2018 13 10 3 3
2019 -13 10 -3 7
2020 13 -10 3 -7
2021 -13 -10 -3 -3
2022 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002023 have different signs. We then subtract one from the 'div'
2024 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002025
Guido van Rossume32e0141992-01-19 16:31:05 +00002026static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00002027l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00002028 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00002029{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002030 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002031
Guido van Rossume32e0141992-01-19 16:31:05 +00002032 if (long_divrem(v, w, &div, &mod) < 0)
2033 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00002034 if ((mod->ob_size < 0 && w->ob_size > 0) ||
2035 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002036 PyLongObject *temp;
2037 PyLongObject *one;
2038 temp = (PyLongObject *) long_add(mod, w);
2039 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00002040 mod = temp;
2041 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002042 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002043 return -1;
2044 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002045 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00002046 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002047 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
2048 Py_DECREF(mod);
2049 Py_DECREF(div);
2050 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00002051 return -1;
2052 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002053 Py_DECREF(one);
2054 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002055 div = temp;
2056 }
2057 *pdiv = div;
2058 *pmod = mod;
2059 return 0;
2060}
2061
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002062static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002063long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002064{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002065 PyLongObject *a, *b, *div, *mod;
2066
2067 CONVERT_BINOP(v, w, &a, &b);
2068
2069 if (l_divmod(a, b, &div, &mod) < 0) {
2070 Py_DECREF(a);
2071 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002072 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002073 }
2074 Py_DECREF(a);
2075 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002076 Py_DECREF(mod);
2077 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00002078}
2079
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002080static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00002081long_classic_div(PyObject *v, PyObject *w)
2082{
2083 PyLongObject *a, *b, *div, *mod;
2084
2085 CONVERT_BINOP(v, w, &a, &b);
2086
2087 if (Py_DivisionWarningFlag &&
2088 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
2089 div = NULL;
2090 else if (l_divmod(a, b, &div, &mod) < 0)
2091 div = NULL;
2092 else
2093 Py_DECREF(mod);
2094
2095 Py_DECREF(a);
2096 Py_DECREF(b);
2097 return (PyObject *)div;
2098}
2099
2100static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00002101long_true_divide(PyObject *v, PyObject *w)
2102{
Tim Peterse2a60002001-09-04 06:17:36 +00002103 PyLongObject *a, *b;
2104 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00002105 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00002106
2107 CONVERT_BINOP(v, w, &a, &b);
2108 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
2109 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00002110 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
2111 Py_DECREF(a);
2112 Py_DECREF(b);
2113 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00002114 return NULL;
2115
2116 if (bd == 0.0) {
2117 PyErr_SetString(PyExc_ZeroDivisionError,
2118 "long division or modulo by zero");
2119 return NULL;
2120 }
2121
2122 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
2123 ad /= bd; /* overflow/underflow impossible here */
2124 aexp -= bexp;
2125 if (aexp > INT_MAX / SHIFT)
2126 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00002127 else if (aexp < -(INT_MAX / SHIFT))
2128 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002129 errno = 0;
2130 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002131 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002132 goto overflow;
2133 return PyFloat_FromDouble(ad);
2134
2135overflow:
2136 PyErr_SetString(PyExc_OverflowError,
2137 "long/long too large for a float");
2138 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002139
Tim Peters20dab9f2001-09-04 05:31:47 +00002140}
2141
2142static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002143long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002144{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002145 PyLongObject *a, *b, *div, *mod;
2146
2147 CONVERT_BINOP(v, w, &a, &b);
2148
2149 if (l_divmod(a, b, &div, &mod) < 0) {
2150 Py_DECREF(a);
2151 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002152 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002153 }
2154 Py_DECREF(a);
2155 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002156 Py_DECREF(div);
2157 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002158}
2159
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002160static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002161long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002162{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002163 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002164 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002165
2166 CONVERT_BINOP(v, w, &a, &b);
2167
2168 if (l_divmod(a, b, &div, &mod) < 0) {
2169 Py_DECREF(a);
2170 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002171 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002172 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002173 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002174 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002175 PyTuple_SetItem(z, 0, (PyObject *) div);
2176 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002177 }
2178 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002179 Py_DECREF(div);
2180 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002181 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002182 Py_DECREF(a);
2183 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002184 return z;
2185}
2186
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002187static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002188long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002189{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002190 PyLongObject *a, *b;
2191 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002192 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002193 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002194
2195 CONVERT_BINOP(v, w, &a, &b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002196 if (PyLong_Check(x) || Py_None == x) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002197 c = x;
2198 Py_INCREF(x);
2199 }
2200 else if (PyInt_Check(x)) {
2201 c = PyLong_FromLong(PyInt_AS_LONG(x));
2202 }
2203 else {
2204 Py_DECREF(a);
2205 Py_DECREF(b);
2206 Py_INCREF(Py_NotImplemented);
2207 return Py_NotImplemented;
2208 }
Tim Peters4c483c42001-09-05 06:24:58 +00002209
2210 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
2211 PyErr_SetString(PyExc_ValueError,
2212 "pow() 3rd argument cannot be 0");
2213 z = NULL;
2214 goto error;
2215 }
2216
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002217 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002218 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002219 Py_DECREF(a);
2220 Py_DECREF(b);
2221 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00002222 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00002223 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
2224 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00002225 return NULL;
2226 }
2227 /* Return a float. This works because we know that
2228 this calls float_pow() which converts its
2229 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002230 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002231 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002232 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002233 for (i = 0; i < size_b; ++i) {
2234 digit bi = b->ob_digit[i];
2235 int j;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002236
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002237 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002238 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002239
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002240 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002241 temp = (PyLongObject *)long_mul(z, a);
2242 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002243 if (c!=Py_None && temp!=NULL) {
2244 if (l_divmod(temp,(PyLongObject *)c,
2245 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002246 Py_DECREF(temp);
2247 z = NULL;
2248 goto error;
2249 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002250 Py_XDECREF(div);
2251 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002252 temp = mod;
2253 }
2254 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002255 if (z == NULL)
2256 break;
2257 }
2258 bi >>= 1;
2259 if (bi == 0 && i+1 == size_b)
2260 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002261 temp = (PyLongObject *)long_mul(a, a);
2262 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002263 if (c!=Py_None && temp!=NULL) {
2264 if (l_divmod(temp, (PyLongObject *)c, &div,
2265 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002266 Py_DECREF(temp);
2267 z = NULL;
2268 goto error;
2269 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002270 Py_XDECREF(div);
2271 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002272 temp = mod;
2273 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002274 a = temp;
2275 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002276 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002277 z = NULL;
2278 break;
2279 }
2280 }
Guido van Rossumc206c761995-01-10 15:23:19 +00002281 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002282 break;
2283 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002284 if (c!=Py_None && z!=NULL) {
2285 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002286 Py_DECREF(z);
2287 z = NULL;
2288 }
2289 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002290 Py_XDECREF(div);
2291 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002292 z = mod;
2293 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002294 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002295 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00002296 Py_XDECREF(a);
2297 Py_DECREF(b);
2298 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002299 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002300}
2301
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002302static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002303long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002304{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002305 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002306 PyLongObject *x;
2307 PyLongObject *w;
2308 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002309 if (w == NULL)
2310 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002311 x = (PyLongObject *) long_add(v, w);
2312 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002313 if (x == NULL)
2314 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00002315 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002316 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002317}
2318
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002319static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002320long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002321{
Tim Peters69c2de32001-09-11 22:31:33 +00002322 if (PyLong_CheckExact(v)) {
2323 Py_INCREF(v);
2324 return (PyObject *)v;
2325 }
2326 else
2327 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002328}
2329
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002330static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002331long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002332{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002333 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002334 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002335 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002336 Py_INCREF(v);
2337 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002338 }
Tim Peters69c2de32001-09-11 22:31:33 +00002339 z = (PyLongObject *)_PyLong_Copy(v);
2340 if (z != NULL)
2341 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002342 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002343}
2344
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002345static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002346long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002347{
2348 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002349 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002350 else
2351 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002352}
2353
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002354static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002355long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002356{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002357 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002358}
2359
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002360static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002361long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002362{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002363 PyLongObject *a, *b;
2364 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002365 long shiftby;
2366 int newsize, wordshift, loshift, hishift, i, j;
2367 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002368
Neil Schemenauerba872e22001-01-04 01:46:03 +00002369 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2370
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002371 if (a->ob_size < 0) {
2372 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002373 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002374 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002375 if (a1 == NULL)
2376 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002377 a2 = (PyLongObject *) long_rshift(a1, b);
2378 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002379 if (a2 == NULL)
2380 goto rshift_error;
2381 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002382 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002383 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002384 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002385
Neil Schemenauerba872e22001-01-04 01:46:03 +00002386 shiftby = PyLong_AsLong((PyObject *)b);
2387 if (shiftby == -1L && PyErr_Occurred())
2388 goto rshift_error;
2389 if (shiftby < 0) {
2390 PyErr_SetString(PyExc_ValueError,
2391 "negative shift count");
2392 goto rshift_error;
2393 }
2394 wordshift = shiftby / SHIFT;
2395 newsize = ABS(a->ob_size) - wordshift;
2396 if (newsize <= 0) {
2397 z = _PyLong_New(0);
2398 Py_DECREF(a);
2399 Py_DECREF(b);
2400 return (PyObject *)z;
2401 }
2402 loshift = shiftby % SHIFT;
2403 hishift = SHIFT - loshift;
2404 lomask = ((digit)1 << hishift) - 1;
2405 himask = MASK ^ lomask;
2406 z = _PyLong_New(newsize);
2407 if (z == NULL)
2408 goto rshift_error;
2409 if (a->ob_size < 0)
2410 z->ob_size = -(z->ob_size);
2411 for (i = 0, j = wordshift; i < newsize; i++, j++) {
2412 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
2413 if (i+1 < newsize)
2414 z->ob_digit[i] |=
2415 (a->ob_digit[j+1] << hishift) & himask;
2416 }
2417 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002418 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002419rshift_error:
2420 Py_DECREF(a);
2421 Py_DECREF(b);
2422 return (PyObject *) z;
2423
Guido van Rossumc6913e71991-11-19 20:26:46 +00002424}
2425
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002426static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002427long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002428{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002429 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002430 PyLongObject *a, *b;
2431 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002432 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002433 int oldsize, newsize, wordshift, remshift, i, j;
2434 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002435
Neil Schemenauerba872e22001-01-04 01:46:03 +00002436 CONVERT_BINOP(v, w, &a, &b);
2437
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002438 shiftby = PyLong_AsLong((PyObject *)b);
2439 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00002440 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002441 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002442 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002443 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002444 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002445 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002446 PyErr_SetString(PyExc_ValueError,
2447 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002448 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002449 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002450 /* wordshift, remshift = divmod(shiftby, SHIFT) */
2451 wordshift = (int)shiftby / SHIFT;
2452 remshift = (int)shiftby - wordshift * SHIFT;
2453
2454 oldsize = ABS(a->ob_size);
2455 newsize = oldsize + wordshift;
2456 if (remshift)
2457 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002458 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002459 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002460 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002461 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002462 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002463 for (i = 0; i < wordshift; i++)
2464 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002465 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002466 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00002467 accum |= (twodigits)a->ob_digit[j] << remshift;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002468 z->ob_digit[i] = (digit)(accum & MASK);
2469 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002470 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002471 if (remshift)
2472 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002473 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002474 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002475 z = long_normalize(z);
2476lshift_error:
2477 Py_DECREF(a);
2478 Py_DECREF(b);
2479 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002480}
2481
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002482
2483/* Bitwise and/xor/or operations */
2484
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002485static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002486long_bitwise(PyLongObject *a,
2487 int op, /* '&', '|', '^' */
2488 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002489{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002490 digit maska, maskb; /* 0 or MASK */
2491 int negz;
2492 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002493 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002494 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002495 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002496 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002497
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002498 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002499 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002500 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002501 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002502 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002503 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002504 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002505 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002506 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002507 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002508 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002509 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002510 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002511 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002512 maskb = 0;
2513 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002514
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002515 negz = 0;
2516 switch (op) {
2517 case '^':
2518 if (maska != maskb) {
2519 maska ^= MASK;
2520 negz = -1;
2521 }
2522 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002523 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002524 if (maska && maskb) {
2525 op = '|';
2526 maska ^= MASK;
2527 maskb ^= MASK;
2528 negz = -1;
2529 }
2530 break;
2531 case '|':
2532 if (maska || maskb) {
2533 op = '&';
2534 maska ^= MASK;
2535 maskb ^= MASK;
2536 negz = -1;
2537 }
2538 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002539 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002540
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002541 /* JRH: The original logic here was to allocate the result value (z)
2542 as the longer of the two operands. However, there are some cases
2543 where the result is guaranteed to be shorter than that: AND of two
2544 positives, OR of two negatives: use the shorter number. AND with
2545 mixed signs: use the positive number. OR with mixed signs: use the
2546 negative number. After the transformations above, op will be '&'
2547 iff one of these cases applies, and mask will be non-0 for operands
2548 whose length should be ignored.
2549 */
2550
2551 size_a = a->ob_size;
2552 size_b = b->ob_size;
2553 size_z = op == '&'
2554 ? (maska
2555 ? size_b
2556 : (maskb ? size_a : MIN(size_a, size_b)))
2557 : MAX(size_a, size_b);
2558 z = _PyLong_New(size_z);
2559 if (a == NULL || b == NULL || z == NULL) {
2560 Py_XDECREF(a);
2561 Py_XDECREF(b);
2562 Py_XDECREF(z);
2563 return NULL;
2564 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002565
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002566 for (i = 0; i < size_z; ++i) {
2567 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2568 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2569 switch (op) {
2570 case '&': z->ob_digit[i] = diga & digb; break;
2571 case '|': z->ob_digit[i] = diga | digb; break;
2572 case '^': z->ob_digit[i] = diga ^ digb; break;
2573 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002574 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002575
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002576 Py_DECREF(a);
2577 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002578 z = long_normalize(z);
2579 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002580 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002581 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002582 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002583 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002584}
2585
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002586static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002587long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002588{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002589 PyLongObject *a, *b;
2590 PyObject *c;
2591 CONVERT_BINOP(v, w, &a, &b);
2592 c = long_bitwise(a, '&', b);
2593 Py_DECREF(a);
2594 Py_DECREF(b);
2595 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002596}
2597
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002598static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002599long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002600{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002601 PyLongObject *a, *b;
2602 PyObject *c;
2603 CONVERT_BINOP(v, w, &a, &b);
2604 c = long_bitwise(a, '^', b);
2605 Py_DECREF(a);
2606 Py_DECREF(b);
2607 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002608}
2609
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002610static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002611long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002612{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002613 PyLongObject *a, *b;
2614 PyObject *c;
2615 CONVERT_BINOP(v, w, &a, &b);
2616 c = long_bitwise(a, '|', b);
2617 Py_DECREF(a);
2618 Py_DECREF(b);
2619 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002620}
2621
Guido van Rossum234f9421993-06-17 12:35:49 +00002622static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002623long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002624{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002625 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002626 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002627 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002628 return 0;
2629 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002630 else if (PyLong_Check(*pw)) {
2631 Py_INCREF(*pv);
2632 Py_INCREF(*pw);
2633 return 0;
2634 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002635 return 1; /* Can't do it */
2636}
2637
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002638static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002639long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002640{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002641 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002642 return v;
2643}
2644
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002645static PyObject *
Walter Dörwaldf1715402002-11-19 20:49:15 +00002646long_int(PyObject *v)
2647{
2648 long x;
2649 x = PyLong_AsLong(v);
2650 if (PyErr_Occurred()) {
2651 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2652 PyErr_Clear();
2653 if (PyLong_CheckExact(v)) {
2654 Py_INCREF(v);
2655 return v;
2656 }
2657 else
2658 return _PyLong_Copy((PyLongObject *)v);
2659 }
2660 else
2661 return NULL;
2662 }
2663 return PyInt_FromLong(x);
2664}
2665
2666static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002667long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002668{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002669 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002670 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002671 if (result == -1.0 && PyErr_Occurred())
2672 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002673 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002674}
2675
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002676static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002677long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002678{
Fred Drake121ee271999-12-23 15:41:28 +00002679 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002680}
2681
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002682static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002683long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002684{
Fred Drake121ee271999-12-23 15:41:28 +00002685 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002686}
Jeremy Hylton938ace62002-07-17 16:30:39 +00002687
2688static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00002689long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002690
Tim Peters6d6c1a32001-08-02 04:15:00 +00002691static PyObject *
2692long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2693{
2694 PyObject *x = NULL;
2695 int base = -909; /* unlikely! */
2696 static char *kwlist[] = {"x", "base", 0};
2697
Guido van Rossumbef14172001-08-29 15:47:46 +00002698 if (type != &PyLong_Type)
2699 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002700 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2701 &x, &base))
2702 return NULL;
2703 if (x == NULL)
2704 return PyLong_FromLong(0L);
2705 if (base == -909)
2706 return PyNumber_Long(x);
2707 else if (PyString_Check(x))
2708 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002709#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002710 else if (PyUnicode_Check(x))
2711 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2712 PyUnicode_GET_SIZE(x),
2713 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002714#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002715 else {
2716 PyErr_SetString(PyExc_TypeError,
2717 "long() can't convert non-string with explicit base");
2718 return NULL;
2719 }
2720}
2721
Guido van Rossumbef14172001-08-29 15:47:46 +00002722/* Wimpy, slow approach to tp_new calls for subtypes of long:
2723 first create a regular long from whatever arguments we got,
2724 then allocate a subtype instance and initialize it from
2725 the regular long. The regular long is then thrown away.
2726*/
2727static PyObject *
2728long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2729{
2730 PyLongObject *tmp, *new;
2731 int i, n;
2732
2733 assert(PyType_IsSubtype(type, &PyLong_Type));
2734 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2735 if (tmp == NULL)
2736 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002737 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002738 n = tmp->ob_size;
2739 if (n < 0)
2740 n = -n;
2741 new = (PyLongObject *)type->tp_alloc(type, n);
2742 if (new == NULL)
2743 return NULL;
2744 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002745 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002746 for (i = 0; i < n; i++)
2747 new->ob_digit[i] = tmp->ob_digit[i];
2748 Py_DECREF(tmp);
2749 return (PyObject *)new;
2750}
2751
Guido van Rossum5d9113d2003-01-29 17:58:45 +00002752static PyObject *
2753long_getnewargs(PyLongObject *v)
2754{
2755 return Py_BuildValue("(N)", _PyLong_Copy(v));
2756}
2757
2758static PyMethodDef long_methods[] = {
2759 {"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
2760 {NULL, NULL} /* sentinel */
2761};
2762
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002763PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002764"long(x[, base]) -> integer\n\
2765\n\
2766Convert a string or number to a long integer, if possible. A floating\n\
2767point argument will be truncated towards zero (this does not include a\n\
2768string representation of a floating point number!) When converting a\n\
2769string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002770converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002771
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002772static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002773 (binaryfunc) long_add, /*nb_add*/
2774 (binaryfunc) long_sub, /*nb_subtract*/
2775 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002776 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002777 (binaryfunc) long_mod, /*nb_remainder*/
2778 (binaryfunc) long_divmod, /*nb_divmod*/
2779 (ternaryfunc) long_pow, /*nb_power*/
2780 (unaryfunc) long_neg, /*nb_negative*/
2781 (unaryfunc) long_pos, /*tp_positive*/
2782 (unaryfunc) long_abs, /*tp_absolute*/
2783 (inquiry) long_nonzero, /*tp_nonzero*/
2784 (unaryfunc) long_invert, /*nb_invert*/
2785 (binaryfunc) long_lshift, /*nb_lshift*/
2786 (binaryfunc) long_rshift, /*nb_rshift*/
2787 (binaryfunc) long_and, /*nb_and*/
2788 (binaryfunc) long_xor, /*nb_xor*/
2789 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002790 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002791 (unaryfunc) long_int, /*nb_int*/
2792 (unaryfunc) long_long, /*nb_long*/
2793 (unaryfunc) long_float, /*nb_float*/
2794 (unaryfunc) long_oct, /*nb_oct*/
2795 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002796 0, /* nb_inplace_add */
2797 0, /* nb_inplace_subtract */
2798 0, /* nb_inplace_multiply */
2799 0, /* nb_inplace_divide */
2800 0, /* nb_inplace_remainder */
2801 0, /* nb_inplace_power */
2802 0, /* nb_inplace_lshift */
2803 0, /* nb_inplace_rshift */
2804 0, /* nb_inplace_and */
2805 0, /* nb_inplace_xor */
2806 0, /* nb_inplace_or */
2807 (binaryfunc)long_div, /* nb_floor_divide */
2808 long_true_divide, /* nb_true_divide */
2809 0, /* nb_inplace_floor_divide */
2810 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002811};
2812
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002813PyTypeObject PyLong_Type = {
2814 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002815 0, /* ob_size */
2816 "long", /* tp_name */
2817 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2818 sizeof(digit), /* tp_itemsize */
2819 (destructor)long_dealloc, /* tp_dealloc */
2820 0, /* tp_print */
2821 0, /* tp_getattr */
2822 0, /* tp_setattr */
2823 (cmpfunc)long_compare, /* tp_compare */
2824 (reprfunc)long_repr, /* tp_repr */
2825 &long_as_number, /* tp_as_number */
2826 0, /* tp_as_sequence */
2827 0, /* tp_as_mapping */
2828 (hashfunc)long_hash, /* tp_hash */
2829 0, /* tp_call */
2830 (reprfunc)long_str, /* tp_str */
2831 PyObject_GenericGetAttr, /* tp_getattro */
2832 0, /* tp_setattro */
2833 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002834 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2835 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002836 long_doc, /* tp_doc */
2837 0, /* tp_traverse */
2838 0, /* tp_clear */
2839 0, /* tp_richcompare */
2840 0, /* tp_weaklistoffset */
2841 0, /* tp_iter */
2842 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00002843 long_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002844 0, /* tp_members */
2845 0, /* tp_getset */
2846 0, /* tp_base */
2847 0, /* tp_dict */
2848 0, /* tp_descr_get */
2849 0, /* tp_descr_set */
2850 0, /* tp_dictoffset */
2851 0, /* tp_init */
2852 0, /* tp_alloc */
2853 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002854 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002855};