blob: f246bd2320f2183648e899f637aaab3150940ca0 [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
Thomas Hellera4ea6032003-04-17 18:55:45 +0000263/* Get a C unsigned long int from a long int object, ignoring the high bits.
264 Returns -1 and sets an error condition if an error occurs. */
265
266unsigned long
267PyLong_AsUnsignedLongMask(PyObject *vv)
268{
269 register PyLongObject *v;
270 unsigned long x;
271 int i, sign;
272
273 if (vv == NULL || !PyLong_Check(vv)) {
274 PyErr_BadInternalCall();
275 return (unsigned long) -1;
276 }
277 v = (PyLongObject *)vv;
278 i = v->ob_size;
279 sign = 1;
280 x = 0;
281 if (i < 0) {
282 sign = -1;
283 i = -i;
284 }
285 while (--i >= 0) {
286 x = (x << SHIFT) + v->ob_digit[i];
287 }
288 return x * sign;
289}
290
Tim Peters5b8132f2003-01-31 15:52:05 +0000291int
292_PyLong_Sign(PyObject *vv)
293{
294 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000295
296 assert(v != NULL);
297 assert(PyLong_Check(v));
Tim Peters5b8132f2003-01-31 15:52:05 +0000298
Tim Petersee1a53c2003-02-02 02:57:53 +0000299 return v->ob_size == 0 ? 0 : (v->ob_size < 0 ? -1 : 1);
Tim Peters5b8132f2003-01-31 15:52:05 +0000300}
301
Tim Petersbaefd9e2003-01-28 20:37:45 +0000302size_t
303_PyLong_NumBits(PyObject *vv)
304{
305 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000306 size_t result = 0;
Guido van Rossum004a65c2003-02-03 15:28:19 +0000307 int ndigits;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000308
309 assert(v != NULL);
310 assert(PyLong_Check(v));
Guido van Rossum004a65c2003-02-03 15:28:19 +0000311 ndigits = ABS(v->ob_size);
Tim Petersbaefd9e2003-01-28 20:37:45 +0000312 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
313 if (ndigits > 0) {
Tim Petersbaefd9e2003-01-28 20:37:45 +0000314 digit msd = v->ob_digit[ndigits - 1];
315
Tim Peters5b8132f2003-01-31 15:52:05 +0000316 result = (ndigits - 1) * SHIFT;
Tim Peters08a1d9c2003-01-31 21:45:13 +0000317 if (result / SHIFT != (size_t)ndigits - 1)
Tim Petersbaefd9e2003-01-28 20:37:45 +0000318 goto Overflow;
319 do {
320 ++result;
321 if (result == 0)
322 goto Overflow;
323 msd >>= 1;
324 } while (msd);
325 }
326 return result;
327
328Overflow:
329 PyErr_SetString(PyExc_OverflowError, "long has too many bits "
330 "to express in a platform size_t");
331 return (size_t)-1;
332}
333
Tim Peters2a9b3672001-06-11 21:23:58 +0000334PyObject *
335_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
336 int little_endian, int is_signed)
337{
338 const unsigned char* pstartbyte;/* LSB of bytes */
339 int incr; /* direction to move pstartbyte */
340 const unsigned char* pendbyte; /* MSB of bytes */
341 size_t numsignificantbytes; /* number of bytes that matter */
342 size_t ndigits; /* number of Python long digits */
343 PyLongObject* v; /* result */
344 int idigit = 0; /* next free index in v->ob_digit */
345
346 if (n == 0)
347 return PyLong_FromLong(0L);
348
349 if (little_endian) {
350 pstartbyte = bytes;
351 pendbyte = bytes + n - 1;
352 incr = 1;
353 }
354 else {
355 pstartbyte = bytes + n - 1;
356 pendbyte = bytes;
357 incr = -1;
358 }
359
360 if (is_signed)
361 is_signed = *pendbyte >= 0x80;
362
363 /* Compute numsignificantbytes. This consists of finding the most
364 significant byte. Leading 0 bytes are insignficant if the number
365 is positive, and leading 0xff bytes if negative. */
366 {
367 size_t i;
368 const unsigned char* p = pendbyte;
369 const int pincr = -incr; /* search MSB to LSB */
370 const unsigned char insignficant = is_signed ? 0xff : 0x00;
371
372 for (i = 0; i < n; ++i, p += pincr) {
373 if (*p != insignficant)
374 break;
375 }
376 numsignificantbytes = n - i;
377 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
378 actually has 2 significant bytes. OTOH, 0xff0001 ==
379 -0x00ffff, so we wouldn't *need* to bump it there; but we
380 do for 0xffff = -0x0001. To be safe without bothering to
381 check every case, bump it regardless. */
382 if (is_signed && numsignificantbytes < n)
383 ++numsignificantbytes;
384 }
385
386 /* How many Python long digits do we need? We have
387 8*numsignificantbytes bits, and each Python long digit has SHIFT
388 bits, so it's the ceiling of the quotient. */
389 ndigits = (numsignificantbytes * 8 + SHIFT - 1) / SHIFT;
390 if (ndigits > (size_t)INT_MAX)
391 return PyErr_NoMemory();
392 v = _PyLong_New((int)ndigits);
393 if (v == NULL)
394 return NULL;
395
396 /* Copy the bits over. The tricky parts are computing 2's-comp on
397 the fly for signed numbers, and dealing with the mismatch between
398 8-bit bytes and (probably) 15-bit Python digits.*/
399 {
400 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000401 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000402 twodigits accum = 0; /* sliding register */
403 unsigned int accumbits = 0; /* number of bits in accum */
404 const unsigned char* p = pstartbyte;
405
406 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000407 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000408 /* Compute correction for 2's comp, if needed. */
409 if (is_signed) {
410 thisbyte = (0xff ^ thisbyte) + carry;
411 carry = thisbyte >> 8;
412 thisbyte &= 0xff;
413 }
414 /* Because we're going LSB to MSB, thisbyte is
415 more significant than what's already in accum,
416 so needs to be prepended to accum. */
417 accum |= thisbyte << accumbits;
418 accumbits += 8;
419 if (accumbits >= SHIFT) {
420 /* There's enough to fill a Python digit. */
421 assert(idigit < (int)ndigits);
422 v->ob_digit[idigit] = (digit)(accum & MASK);
423 ++idigit;
424 accum >>= SHIFT;
425 accumbits -= SHIFT;
426 assert(accumbits < SHIFT);
427 }
428 }
429 assert(accumbits < SHIFT);
430 if (accumbits) {
431 assert(idigit < (int)ndigits);
432 v->ob_digit[idigit] = (digit)accum;
433 ++idigit;
434 }
435 }
436
437 v->ob_size = is_signed ? -idigit : idigit;
438 return (PyObject *)long_normalize(v);
439}
440
441int
442_PyLong_AsByteArray(PyLongObject* v,
443 unsigned char* bytes, size_t n,
444 int little_endian, int is_signed)
445{
446 int i; /* index into v->ob_digit */
447 int ndigits; /* |v->ob_size| */
448 twodigits accum; /* sliding register */
449 unsigned int accumbits; /* # bits in accum */
450 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
451 twodigits carry; /* for computing 2's-comp */
452 size_t j; /* # bytes filled */
453 unsigned char* p; /* pointer to next byte in bytes */
454 int pincr; /* direction to move p */
455
456 assert(v != NULL && PyLong_Check(v));
457
458 if (v->ob_size < 0) {
459 ndigits = -(v->ob_size);
460 if (!is_signed) {
461 PyErr_SetString(PyExc_TypeError,
462 "can't convert negative long to unsigned");
463 return -1;
464 }
465 do_twos_comp = 1;
466 }
467 else {
468 ndigits = v->ob_size;
469 do_twos_comp = 0;
470 }
471
472 if (little_endian) {
473 p = bytes;
474 pincr = 1;
475 }
476 else {
477 p = bytes + n - 1;
478 pincr = -1;
479 }
480
Tim Peters898cf852001-06-13 20:50:08 +0000481 /* Copy over all the Python digits.
482 It's crucial that every Python digit except for the MSD contribute
483 exactly SHIFT bits to the total, so first assert that the long is
484 normalized. */
485 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000486 j = 0;
487 accum = 0;
488 accumbits = 0;
489 carry = do_twos_comp ? 1 : 0;
490 for (i = 0; i < ndigits; ++i) {
491 twodigits thisdigit = v->ob_digit[i];
492 if (do_twos_comp) {
493 thisdigit = (thisdigit ^ MASK) + carry;
494 carry = thisdigit >> SHIFT;
495 thisdigit &= MASK;
496 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000497 /* Because we're going LSB to MSB, thisdigit is more
498 significant than what's already in accum, so needs to be
499 prepended to accum. */
500 accum |= thisdigit << accumbits;
Tim Petersede05092001-06-14 08:53:38 +0000501 accumbits += SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000502
Tim Petersede05092001-06-14 08:53:38 +0000503 /* The most-significant digit may be (probably is) at least
504 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000505 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000506 /* Count # of sign bits -- they needn't be stored,
507 * although for signed conversion we need later to
508 * make sure at least one sign bit gets stored.
509 * First shift conceptual sign bit to real sign bit.
510 */
511 stwodigits s = (stwodigits)(thisdigit <<
512 (8*sizeof(stwodigits) - SHIFT));
Tim Peters7a3bfc32001-06-12 01:22:22 +0000513 unsigned int nsignbits = 0;
Tim Petersede05092001-06-14 08:53:38 +0000514 while ((s < 0) == do_twos_comp && nsignbits < SHIFT) {
Tim Peters7a3bfc32001-06-12 01:22:22 +0000515 ++nsignbits;
Tim Petersede05092001-06-14 08:53:38 +0000516 s <<= 1;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000517 }
Tim Petersede05092001-06-14 08:53:38 +0000518 accumbits -= nsignbits;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000519 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000520
Tim Peters2a9b3672001-06-11 21:23:58 +0000521 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000522 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000523 if (j >= n)
524 goto Overflow;
525 ++j;
526 *p = (unsigned char)(accum & 0xff);
527 p += pincr;
528 accumbits -= 8;
529 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000530 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000531 }
532
533 /* Store the straggler (if any). */
534 assert(accumbits < 8);
535 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000536 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000537 if (j >= n)
538 goto Overflow;
539 ++j;
540 if (do_twos_comp) {
541 /* Fill leading bits of the byte with sign bits
542 (appropriately pretending that the long had an
543 infinite supply of sign bits). */
544 accum |= (~(twodigits)0) << accumbits;
545 }
546 *p = (unsigned char)(accum & 0xff);
547 p += pincr;
548 }
Tim Peters05607ad2001-06-13 21:01:27 +0000549 else if (j == n && n > 0 && is_signed) {
550 /* The main loop filled the byte array exactly, so the code
551 just above didn't get to ensure there's a sign bit, and the
552 loop below wouldn't add one either. Make sure a sign bit
553 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000554 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000555 int sign_bit_set = msb >= 0x80;
556 assert(accumbits == 0);
557 if (sign_bit_set == do_twos_comp)
558 return 0;
559 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000560 goto Overflow;
561 }
Tim Peters05607ad2001-06-13 21:01:27 +0000562
563 /* Fill remaining bytes with copies of the sign bit. */
564 {
565 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
566 for ( ; j < n; ++j, p += pincr)
567 *p = signbyte;
568 }
569
Tim Peters2a9b3672001-06-11 21:23:58 +0000570 return 0;
571
572Overflow:
573 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
574 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000575
Tim Peters2a9b3672001-06-11 21:23:58 +0000576}
577
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000578double
579_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
580{
581/* NBITS_WANTED should be > the number of bits in a double's precision,
582 but small enough so that 2**NBITS_WANTED is within the normal double
583 range. nbitsneeded is set to 1 less than that because the most-significant
584 Python digit contains at least 1 significant bit, but we don't want to
585 bother counting them (catering to the worst case cheaply).
586
587 57 is one more than VAX-D double precision; I (Tim) don't know of a double
588 format with more precision than that; it's 1 larger so that we add in at
589 least one round bit to stand in for the ignored least-significant bits.
590*/
591#define NBITS_WANTED 57
592 PyLongObject *v;
593 double x;
594 const double multiplier = (double)(1L << SHIFT);
595 int i, sign;
596 int nbitsneeded;
597
598 if (vv == NULL || !PyLong_Check(vv)) {
599 PyErr_BadInternalCall();
600 return -1;
601 }
602 v = (PyLongObject *)vv;
603 i = v->ob_size;
604 sign = 1;
605 if (i < 0) {
606 sign = -1;
607 i = -(i);
608 }
609 else if (i == 0) {
610 *exponent = 0;
611 return 0.0;
612 }
613 --i;
614 x = (double)v->ob_digit[i];
615 nbitsneeded = NBITS_WANTED - 1;
616 /* Invariant: i Python digits remain unaccounted for. */
617 while (i > 0 && nbitsneeded > 0) {
618 --i;
619 x = x * multiplier + (double)v->ob_digit[i];
620 nbitsneeded -= SHIFT;
621 }
622 /* There are i digits we didn't shift in. Pretending they're all
623 zeroes, the true value is x * 2**(i*SHIFT). */
624 *exponent = i;
625 assert(x > 0.0);
626 return x * sign;
627#undef NBITS_WANTED
628}
629
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000630/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000631
632double
Tim Peters9f688bf2000-07-07 15:53:28 +0000633PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000634{
Tim Peters9fffa3e2001-09-04 05:14:19 +0000635 int e;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000636 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000637
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 if (vv == NULL || !PyLong_Check(vv)) {
639 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000640 return -1;
641 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000642 x = _PyLong_AsScaledDouble(vv, &e);
643 if (x == -1.0 && PyErr_Occurred())
644 return -1.0;
645 if (e > INT_MAX / SHIFT)
646 goto overflow;
647 errno = 0;
648 x = ldexp(x, e * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000649 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000650 goto overflow;
651 return x;
652
653overflow:
654 PyErr_SetString(PyExc_OverflowError,
655 "long int too large to convert to float");
656 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000657}
658
Guido van Rossum78694d91998-09-18 14:14:13 +0000659/* Create a new long (or int) object from a C pointer */
660
661PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000662PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000663{
Tim Peters70128a12001-06-16 08:48:40 +0000664#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000665 return PyInt_FromLong((long)p);
666#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000667
Tim Peters70128a12001-06-16 08:48:40 +0000668#ifndef HAVE_LONG_LONG
669# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
670#endif
671#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000672# error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000673#endif
674 /* optimize null pointers */
675 if (p == NULL)
676 return PyInt_FromLong(0);
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000677 return PyLong_FromLongLong((PY_LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000678
679#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000680}
681
682/* Get a C pointer from a long object (or an int object in some cases) */
683
684void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000685PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000686{
687 /* This function will allow int or long objects. If vv is neither,
688 then the PyLong_AsLong*() functions will raise the exception:
689 PyExc_SystemError, "bad argument to internal function"
690 */
Tim Peters70128a12001-06-16 08:48:40 +0000691#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000692 long x;
693
Tim Peters70128a12001-06-16 08:48:40 +0000694 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000695 x = PyInt_AS_LONG(vv);
696 else
697 x = PyLong_AsLong(vv);
698#else
Tim Peters70128a12001-06-16 08:48:40 +0000699
700#ifndef HAVE_LONG_LONG
701# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
702#endif
703#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000704# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000705#endif
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000706 PY_LONG_LONG x;
Guido van Rossum78694d91998-09-18 14:14:13 +0000707
Tim Peters70128a12001-06-16 08:48:40 +0000708 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000709 x = PyInt_AS_LONG(vv);
710 else
711 x = PyLong_AsLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000712
713#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000714
715 if (x == -1 && PyErr_Occurred())
716 return NULL;
717 return (void *)x;
718}
719
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000720#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000721
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000722/* Initial PY_LONG_LONG support by Chris Herborth (chrish@qnx.com), later
Tim Petersd1a7da62001-06-13 00:35:57 +0000723 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000724 */
725
Tim Peterscf37dfc2001-06-14 18:42:50 +0000726#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000727
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000728/* Create a new long int object from a C PY_LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000729
730PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000731PyLong_FromLongLong(PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000732{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000733 PY_LONG_LONG bytes = ival;
Tim Petersd1a7da62001-06-13 00:35:57 +0000734 int one = 1;
735 return _PyLong_FromByteArray(
736 (unsigned char *)&bytes,
737 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000738}
739
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000740/* Create a new long int object from a C unsigned PY_LONG_LONG int. */
Tim Petersd1a7da62001-06-13 00:35:57 +0000741
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000742PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000743PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000744{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000745 unsigned PY_LONG_LONG bytes = ival;
Tim Petersd1a7da62001-06-13 00:35:57 +0000746 int one = 1;
747 return _PyLong_FromByteArray(
748 (unsigned char *)&bytes,
749 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000750}
751
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000752/* Get a C PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000753 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000754
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000755PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000756PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000757{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000758 PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +0000759 int one = 1;
760 int res;
761
Tim Petersd38b1c72001-09-30 05:09:37 +0000762 if (vv == NULL) {
763 PyErr_BadInternalCall();
764 return -1;
765 }
766 if (!PyLong_Check(vv)) {
767 if (PyInt_Check(vv))
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000768 return (PY_LONG_LONG)PyInt_AsLong(vv);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000769 PyErr_BadInternalCall();
770 return -1;
771 }
772
Tim Petersd1a7da62001-06-13 00:35:57 +0000773 res = _PyLong_AsByteArray(
774 (PyLongObject *)vv, (unsigned char *)&bytes,
775 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000776
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000777 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000778 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000779 return (PY_LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000780 else
781 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000782}
783
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000784/* Get a C unsigned PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000785 Return -1 and set an error if overflow occurs. */
786
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000787unsigned PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000788PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000789{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000790 unsigned PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +0000791 int one = 1;
792 int res;
793
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000794 if (vv == NULL || !PyLong_Check(vv)) {
795 PyErr_BadInternalCall();
Tim Petersd1a7da62001-06-13 00:35:57 +0000796 return -1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000797 }
798
Tim Petersd1a7da62001-06-13 00:35:57 +0000799 res = _PyLong_AsByteArray(
800 (PyLongObject *)vv, (unsigned char *)&bytes,
801 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000802
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000803 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000804 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000805 return (unsigned PY_LONG_LONG)res;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000806 else
807 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000808}
Tim Petersd1a7da62001-06-13 00:35:57 +0000809
Thomas Hellera4ea6032003-04-17 18:55:45 +0000810/* Get a C unsigned long int from a long int object, ignoring the high bits.
811 Returns -1 and sets an error condition if an error occurs. */
812
813unsigned PY_LONG_LONG
814PyLong_AsUnsignedLongLongMask(PyObject *vv)
815{
816 register PyLongObject *v;
817 unsigned PY_LONG_LONG x;
818 int i, sign;
819
820 if (vv == NULL || !PyLong_Check(vv)) {
821 PyErr_BadInternalCall();
822 return (unsigned long) -1;
823 }
824 v = (PyLongObject *)vv;
825 i = v->ob_size;
826 sign = 1;
827 x = 0;
828 if (i < 0) {
829 sign = -1;
830 i = -i;
831 }
832 while (--i >= 0) {
833 x = (x << SHIFT) + v->ob_digit[i];
834 }
835 return x * sign;
836}
Tim Petersd1a7da62001-06-13 00:35:57 +0000837#undef IS_LITTLE_ENDIAN
838
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000839#endif /* HAVE_LONG_LONG */
840
Neil Schemenauerba872e22001-01-04 01:46:03 +0000841
842static int
843convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +0000844 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000845 *a = (PyLongObject *) v;
846 Py_INCREF(v);
847 }
848 else if (PyInt_Check(v)) {
849 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
850 }
851 else {
852 return 0;
853 }
Tim Peters5af4e6c2002-08-12 02:31:19 +0000854 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +0000855 *b = (PyLongObject *) w;
856 Py_INCREF(w);
857 }
858 else if (PyInt_Check(w)) {
859 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
860 }
861 else {
862 Py_DECREF(*a);
863 return 0;
864 }
865 return 1;
866}
867
868#define CONVERT_BINOP(v, w, a, b) \
869 if (!convert_binop(v, w, a, b)) { \
870 Py_INCREF(Py_NotImplemented); \
871 return Py_NotImplemented; \
872 }
873
Tim Peters877a2122002-08-12 05:09:36 +0000874/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
875 * is modified in place, by adding y to it. Carries are propagated as far as
876 * x[m-1], and the remaining carry (0 or 1) is returned.
877 */
878static digit
879v_iadd(digit *x, int m, digit *y, int n)
880{
881 int i;
882 digit carry = 0;
883
884 assert(m >= n);
885 for (i = 0; i < n; ++i) {
886 carry += x[i] + y[i];
887 x[i] = carry & MASK;
888 carry >>= SHIFT;
889 assert((carry & 1) == carry);
890 }
891 for (; carry && i < m; ++i) {
892 carry += x[i];
893 x[i] = carry & MASK;
894 carry >>= SHIFT;
895 assert((carry & 1) == carry);
896 }
897 return carry;
898}
899
900/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
901 * is modified in place, by subtracting y from it. Borrows are propagated as
902 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
903 */
904static digit
905v_isub(digit *x, int m, digit *y, int n)
906{
907 int i;
908 digit borrow = 0;
909
910 assert(m >= n);
911 for (i = 0; i < n; ++i) {
912 borrow = x[i] - y[i] - borrow;
913 x[i] = borrow & MASK;
914 borrow >>= SHIFT;
915 borrow &= 1; /* keep only 1 sign bit */
916 }
917 for (; borrow && i < m; ++i) {
918 borrow = x[i] - borrow;
919 x[i] = borrow & MASK;
920 borrow >>= SHIFT;
921 borrow &= 1;
922 }
923 return borrow;
924}
Neil Schemenauerba872e22001-01-04 01:46:03 +0000925
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000926/* Multiply by a single digit, ignoring the sign. */
927
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000928static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000929mul1(PyLongObject *a, wdigit n)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000930{
931 return muladd1(a, n, (digit)0);
932}
933
934/* Multiply by a single digit and add a single digit, ignoring the sign. */
935
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000936static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000937muladd1(PyLongObject *a, wdigit n, wdigit extra)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000938{
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000939 int size_a = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 PyLongObject *z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000941 twodigits carry = extra;
942 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000943
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000944 if (z == NULL)
945 return NULL;
946 for (i = 0; i < size_a; ++i) {
947 carry += (twodigits)a->ob_digit[i] * n;
Guido van Rossum2095d241997-04-09 19:41:24 +0000948 z->ob_digit[i] = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000949 carry >>= SHIFT;
950 }
Guido van Rossum2095d241997-04-09 19:41:24 +0000951 z->ob_digit[i] = (digit) carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000952 return long_normalize(z);
953}
954
Tim Peters212e6142001-07-14 12:23:19 +0000955/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
956 in pout, and returning the remainder. pin and pout point at the LSD.
957 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
958 long_format, but that should be done with great care since longs are
959 immutable. */
960
961static digit
962inplace_divrem1(digit *pout, digit *pin, int size, digit n)
963{
964 twodigits rem = 0;
965
966 assert(n > 0 && n <= MASK);
967 pin += size;
968 pout += size;
969 while (--size >= 0) {
970 digit hi;
971 rem = (rem << SHIFT) + *--pin;
972 *--pout = hi = (digit)(rem / n);
973 rem -= hi * n;
974 }
975 return (digit)rem;
976}
977
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000978/* Divide a long integer by a digit, returning both the quotient
979 (as function result) and the remainder (through *prem).
980 The sign of a is ignored; n should not be zero. */
981
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +0000983divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000984{
Tim Peters212e6142001-07-14 12:23:19 +0000985 const int size = ABS(a->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000986 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000987
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000988 assert(n > 0 && n <= MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000990 if (z == NULL)
991 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +0000992 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000993 return long_normalize(z);
994}
995
996/* Convert a long int object to a string, using a given conversion base.
Guido van Rossum3d3037d1991-10-24 14:55:57 +0000997 Return a string object.
Fred Drake121ee271999-12-23 15:41:28 +0000998 If base is 8 or 16, add the proper prefix '0' or '0x'. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000999
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001000static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001001long_format(PyObject *aa, int base, int addL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001002{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 register PyLongObject *a = (PyLongObject *)aa;
1004 PyStringObject *str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001005 int i;
Tim Peters212e6142001-07-14 12:23:19 +00001006 const int size_a = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001007 char *p;
1008 int bits;
1009 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +00001010
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001011 if (a == NULL || !PyLong_Check(a)) {
1012 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +00001013 return NULL;
1014 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001015 assert(base >= 2 && base <= 36);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001016
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001017 /* Compute a rough upper bound for the length of the string */
1018 i = base;
1019 bits = 0;
1020 while (i > 1) {
1021 ++bits;
1022 i >>= 1;
1023 }
Fred Drake121ee271999-12-23 15:41:28 +00001024 i = 5 + (addL ? 1 : 0) + (size_a*SHIFT + bits-1) / bits;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001026 if (str == NULL)
1027 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001028 p = PyString_AS_STRING(str) + i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001029 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +00001030 if (addL)
1031 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001032 if (a->ob_size < 0)
1033 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +00001034
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001035 if (a->ob_size == 0) {
1036 *--p = '0';
1037 }
1038 else if ((base & (base - 1)) == 0) {
1039 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +00001040 twodigits accum = 0;
1041 int accumbits = 0; /* # of bits in accum */
1042 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001043 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +00001044 while ((i >>= 1) > 1)
1045 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +00001046
1047 for (i = 0; i < size_a; ++i) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00001048 accum |= (twodigits)a->ob_digit[i] << accumbits;
Tim Peters586b2e32001-07-15 09:11:14 +00001049 accumbits += SHIFT;
1050 assert(accumbits >= basebits);
1051 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001052 char cdigit = (char)(accum & (base - 1));
1053 cdigit += (cdigit < 10) ? '0' : 'A'-10;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001054 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001055 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +00001056 accumbits -= basebits;
1057 accum >>= basebits;
1058 } while (i < size_a-1 ? accumbits >= basebits :
1059 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001060 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001061 }
1062 else {
Tim Petersfad225f2001-07-13 02:59:26 +00001063 /* Not 0, and base not a power of 2. Divide repeatedly by
1064 base, but for speed use the highest power of base that
1065 fits in a digit. */
Tim Peters212e6142001-07-14 12:23:19 +00001066 int size = size_a;
1067 digit *pin = a->ob_digit;
1068 PyLongObject *scratch;
1069 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +00001070 digit powbase = base; /* powbase == base ** power */
1071 int power = 1;
1072 for (;;) {
1073 unsigned long newpow = powbase * (unsigned long)base;
1074 if (newpow >> SHIFT) /* doesn't fit in a digit */
1075 break;
1076 powbase = (digit)newpow;
1077 ++power;
1078 }
Tim Peters212e6142001-07-14 12:23:19 +00001079
1080 /* Get a scratch area for repeated division. */
1081 scratch = _PyLong_New(size);
1082 if (scratch == NULL) {
1083 Py_DECREF(str);
1084 return NULL;
1085 }
1086
1087 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001088 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001089 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +00001090 digit rem = inplace_divrem1(scratch->ob_digit,
1091 pin, size, powbase);
1092 pin = scratch->ob_digit; /* no need to use a again */
1093 if (pin[size - 1] == 0)
1094 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001095 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +00001096 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001097 Py_DECREF(str);
1098 return NULL;
1099 })
Tim Peters212e6142001-07-14 12:23:19 +00001100
1101 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001102 assert(ntostore > 0);
1103 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001104 digit nextrem = (digit)(rem / base);
1105 char c = (char)(rem - nextrem * base);
1106 assert(p > PyString_AS_STRING(str));
1107 c += (c < 10) ? '0' : 'A'-10;
1108 *--p = c;
1109 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001110 --ntostore;
1111 /* Termination is a bit delicate: must not
1112 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001113 remaining quotient and rem are both 0. */
1114 } while (ntostore && (size || rem));
1115 } while (size != 0);
1116 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001117 }
1118
Guido van Rossum2c475421992-08-14 15:13:07 +00001119 if (base == 8) {
1120 if (size_a != 0)
1121 *--p = '0';
1122 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001123 else if (base == 16) {
1124 *--p = 'x';
1125 *--p = '0';
1126 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001127 else if (base != 10) {
1128 *--p = '#';
1129 *--p = '0' + base%10;
1130 if (base > 10)
1131 *--p = '0' + base/10;
1132 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001133 if (sign)
1134 *--p = sign;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001135 if (p != PyString_AS_STRING(str)) {
1136 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001137 assert(p > q);
1138 do {
1139 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001140 q--;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001141 _PyString_Resize((PyObject **)&str,
1142 (int) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001143 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001144 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001145}
1146
Tim Petersbf2674b2003-02-02 07:51:32 +00001147/* *str points to the first digit in a string of base base digits. base
1148 * is a power of 2 (2, 4, 8, 16, or 32). *str is set to point to the first
1149 * non-digit (which may be *str!). A normalized long is returned.
1150 * The point to this routine is that it takes time linear in the number of
1151 * string characters.
1152 */
1153static PyLongObject *
1154long_from_binary_base(char **str, int base)
1155{
1156 char *p = *str;
1157 char *start = p;
1158 int bits_per_char;
1159 int n;
1160 PyLongObject *z;
1161 twodigits accum;
1162 int bits_in_accum;
1163 digit *pdigit;
1164
1165 assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
1166 n = base;
1167 for (bits_per_char = -1; n; ++bits_per_char)
1168 n >>= 1;
1169 /* n <- total # of bits needed, while setting p to end-of-string */
1170 n = 0;
1171 for (;;) {
1172 int k = -1;
1173 char ch = *p;
1174
1175 if (ch <= '9')
1176 k = ch - '0';
1177 else if (ch >= 'a')
1178 k = ch - 'a' + 10;
1179 else if (ch >= 'A')
1180 k = ch - 'A' + 10;
1181 if (k < 0 || k >= base)
1182 break;
Tim Petersbf2674b2003-02-02 07:51:32 +00001183 ++p;
1184 }
1185 *str = p;
Tim Peters1a3b19a2003-02-02 17:33:53 +00001186 n = (p - start) * bits_per_char;
1187 if (n / bits_per_char != p - start) {
1188 PyErr_SetString(PyExc_ValueError,
1189 "long string too large to convert");
1190 return NULL;
1191 }
Tim Petersbf2674b2003-02-02 07:51:32 +00001192 /* n <- # of Python digits needed, = ceiling(n/SHIFT). */
1193 n = (n + SHIFT - 1) / SHIFT;
1194 z = _PyLong_New(n);
1195 if (z == NULL)
1196 return NULL;
1197 /* Read string from right, and fill in long from left; i.e.,
1198 * from least to most significant in both.
1199 */
1200 accum = 0;
1201 bits_in_accum = 0;
1202 pdigit = z->ob_digit;
1203 while (--p >= start) {
Tim Petersc7bc0b92003-05-05 20:39:43 +00001204 int k;
1205 char ch = *p;
Tim Petersbf2674b2003-02-02 07:51:32 +00001206
1207 if (ch <= '9')
1208 k = ch - '0';
1209 else if (ch >= 'a')
1210 k = ch - 'a' + 10;
1211 else {
1212 assert(ch >= 'A');
1213 k = ch - 'A' + 10;
1214 }
Tim Petersc7bc0b92003-05-05 20:39:43 +00001215 assert(k >= 0 && k < base);
1216 accum |= (twodigits)(k << bits_in_accum);
Tim Petersbf2674b2003-02-02 07:51:32 +00001217 bits_in_accum += bits_per_char;
1218 if (bits_in_accum >= SHIFT) {
1219 *pdigit++ = (digit)(accum & MASK);
1220 assert(pdigit - z->ob_digit <= n);
1221 accum >>= SHIFT;
1222 bits_in_accum -= SHIFT;
1223 assert(bits_in_accum < SHIFT);
1224 }
1225 }
1226 if (bits_in_accum) {
1227 assert(bits_in_accum <= SHIFT);
1228 *pdigit++ = (digit)accum;
1229 assert(pdigit - z->ob_digit <= n);
1230 }
1231 while (pdigit - z->ob_digit < n)
1232 *pdigit++ = 0;
1233 return long_normalize(z);
1234}
1235
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001237PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001238{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001239 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001240 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001241 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001242
Guido van Rossum472c04f1996-12-05 21:57:21 +00001243 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001244 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001245 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001246 return NULL;
1247 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001248 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001249 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001250 if (*str == '+')
1251 ++str;
1252 else if (*str == '-') {
1253 ++str;
1254 sign = -1;
1255 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001256 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001257 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001258 if (base == 0) {
1259 if (str[0] != '0')
1260 base = 10;
1261 else if (str[1] == 'x' || str[1] == 'X')
1262 base = 16;
1263 else
1264 base = 8;
1265 }
1266 if (base == 16 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
1267 str += 2;
Guido van Rossume6762971998-06-22 03:54:46 +00001268 start = str;
Tim Petersbf2674b2003-02-02 07:51:32 +00001269 if ((base & (base - 1)) == 0)
1270 z = long_from_binary_base(&str, base);
1271 else {
1272 z = _PyLong_New(0);
1273 for ( ; z != NULL; ++str) {
1274 int k = -1;
1275 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001276
Tim Petersbf2674b2003-02-02 07:51:32 +00001277 if (*str <= '9')
1278 k = *str - '0';
1279 else if (*str >= 'a')
1280 k = *str - 'a' + 10;
1281 else if (*str >= 'A')
1282 k = *str - 'A' + 10;
1283 if (k < 0 || k >= base)
1284 break;
1285 temp = muladd1(z, (digit)base, (digit)k);
1286 Py_DECREF(z);
1287 z = temp;
1288 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001289 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001290 if (z == NULL)
1291 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001292 if (str == start)
1293 goto onError;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001294 if (sign < 0 && z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001295 z->ob_size = -(z->ob_size);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001296 if (*str == 'L' || *str == 'l')
1297 str++;
1298 while (*str && isspace(Py_CHARMASK(*str)))
1299 str++;
1300 if (*str != '\0')
1301 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001302 if (pend)
1303 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001305
1306 onError:
Tim Peters5af4e6c2002-08-12 02:31:19 +00001307 PyErr_Format(PyExc_ValueError,
Guido van Rossum9e896b32000-04-05 20:11:21 +00001308 "invalid literal for long(): %.200s", orig_str);
1309 Py_XDECREF(z);
1310 return NULL;
1311}
1312
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001313#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001314PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001315PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001316{
Walter Dörwald07e14762002-11-06 16:15:14 +00001317 PyObject *result;
1318 char *buffer = PyMem_MALLOC(length+1);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001319
Walter Dörwald07e14762002-11-06 16:15:14 +00001320 if (buffer == NULL)
1321 return NULL;
1322
1323 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
1324 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001325 return NULL;
1326 }
Walter Dörwald07e14762002-11-06 16:15:14 +00001327 result = PyLong_FromString(buffer, NULL, base);
1328 PyMem_FREE(buffer);
1329 return result;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001330}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001331#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001332
Tim Peters9f688bf2000-07-07 15:53:28 +00001333/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001334static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001335 (PyLongObject *, PyLongObject *, PyLongObject **);
1336static PyObject *long_pos(PyLongObject *);
1337static int long_divrem(PyLongObject *, PyLongObject *,
1338 PyLongObject **, PyLongObject **);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001339
1340/* Long division with remainder, top-level routine */
1341
Guido van Rossume32e0141992-01-19 16:31:05 +00001342static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001343long_divrem(PyLongObject *a, PyLongObject *b,
1344 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001345{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001346 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001347 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001348
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001349 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001350 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001351 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001352 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001353 }
1354 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001355 (size_a == size_b &&
1356 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001357 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001358 *pdiv = _PyLong_New(0);
1359 Py_INCREF(a);
1360 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001361 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001362 }
1363 if (size_b == 1) {
1364 digit rem = 0;
1365 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001366 if (z == NULL)
1367 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001368 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001369 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001370 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001371 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001372 if (z == NULL)
1373 return -1;
1374 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001375 /* Set the signs.
1376 The quotient z has the sign of a*b;
1377 the remainder r has the sign of a,
1378 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001379 if ((a->ob_size < 0) != (b->ob_size < 0))
1380 z->ob_size = -(z->ob_size);
1381 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1382 (*prem)->ob_size = -((*prem)->ob_size);
1383 *pdiv = z;
1384 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001385}
1386
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001387/* Unsigned long division with remainder -- the algorithm */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001388
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001390x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001391{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001392 int size_v = ABS(v1->ob_size), size_w = ABS(w1->ob_size);
Guido van Rossum2095d241997-04-09 19:41:24 +00001393 digit d = (digit) ((twodigits)BASE / (w1->ob_digit[size_w-1] + 1));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394 PyLongObject *v = mul1(v1, d);
1395 PyLongObject *w = mul1(w1, d);
1396 PyLongObject *a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001397 int j, k;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001398
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001399 if (v == NULL || w == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001400 Py_XDECREF(v);
1401 Py_XDECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001402 return NULL;
1403 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001404
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001405 assert(size_v >= size_w && size_w > 1); /* Assert checks by div() */
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001406 assert(v->ob_refcnt == 1); /* Since v will be used as accumulator! */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001407 assert(size_w == ABS(w->ob_size)); /* That's how d was calculated */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001408
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001409 size_v = ABS(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001410 a = _PyLong_New(size_v - size_w + 1);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001411
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001412 for (j = size_v, k = a->ob_size-1; a != NULL && k >= 0; --j, --k) {
1413 digit vj = (j >= size_v) ? 0 : v->ob_digit[j];
1414 twodigits q;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001415 stwodigits carry = 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001416 int i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001417
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001418 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001419 Py_DECREF(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001420 a = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001421 break;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001422 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001423 if (vj == w->ob_digit[size_w-1])
1424 q = MASK;
1425 else
1426 q = (((twodigits)vj << SHIFT) + v->ob_digit[j-1]) /
1427 w->ob_digit[size_w-1];
Tim Peters5af4e6c2002-08-12 02:31:19 +00001428
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001429 while (w->ob_digit[size_w-2]*q >
1430 ((
1431 ((twodigits)vj << SHIFT)
1432 + v->ob_digit[j-1]
1433 - q*w->ob_digit[size_w-1]
1434 ) << SHIFT)
1435 + v->ob_digit[j-2])
1436 --q;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001437
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001438 for (i = 0; i < size_w && i+k < size_v; ++i) {
1439 twodigits z = w->ob_digit[i] * q;
Guido van Rossum2095d241997-04-09 19:41:24 +00001440 digit zz = (digit) (z >> SHIFT);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441 carry += v->ob_digit[i+k] - z
1442 + ((twodigits)zz << SHIFT);
Jeremy Hyltonfc61f9a2003-05-01 21:31:53 +00001443 v->ob_digit[i+k] = (digit)(carry & MASK);
Tim Peters7d3a5112000-07-08 04:17:21 +00001444 carry = Py_ARITHMETIC_RIGHT_SHIFT(BASE_TWODIGITS_TYPE,
1445 carry, SHIFT);
1446 carry -= zz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001447 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001448
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001449 if (i+k < size_v) {
1450 carry += v->ob_digit[i+k];
1451 v->ob_digit[i+k] = 0;
1452 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001453
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001454 if (carry == 0)
Guido van Rossum2095d241997-04-09 19:41:24 +00001455 a->ob_digit[k] = (digit) q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001456 else {
1457 assert(carry == -1);
Guido van Rossum2095d241997-04-09 19:41:24 +00001458 a->ob_digit[k] = (digit) q-1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001459 carry = 0;
1460 for (i = 0; i < size_w && i+k < size_v; ++i) {
1461 carry += v->ob_digit[i+k] + w->ob_digit[i];
Jeremy Hyltonfc61f9a2003-05-01 21:31:53 +00001462 v->ob_digit[i+k] = (digit)(carry & MASK);
Tim Peters7d3a5112000-07-08 04:17:21 +00001463 carry = Py_ARITHMETIC_RIGHT_SHIFT(
1464 BASE_TWODIGITS_TYPE,
1465 carry, SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001466 }
1467 }
1468 } /* for j, k */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001469
Guido van Rossumc206c761995-01-10 15:23:19 +00001470 if (a == NULL)
1471 *prem = NULL;
1472 else {
Guido van Rossumc6913e71991-11-19 20:26:46 +00001473 a = long_normalize(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001474 *prem = divrem1(v, d, &d);
1475 /* d receives the (unused) remainder */
1476 if (*prem == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001477 Py_DECREF(a);
Guido van Rossume32e0141992-01-19 16:31:05 +00001478 a = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00001479 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001480 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001481 Py_DECREF(v);
1482 Py_DECREF(w);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001483 return a;
1484}
1485
1486/* Methods */
1487
1488static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001489long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001490{
Guido van Rossum9475a232001-10-05 20:51:39 +00001491 v->ob_type->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001492}
1493
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001494static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001495long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001496{
Fred Drake121ee271999-12-23 15:41:28 +00001497 return long_format(v, 10, 1);
1498}
1499
1500static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001501long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001502{
1503 return long_format(v, 10, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001504}
1505
1506static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001507long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001508{
1509 int sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001510
Guido van Rossumc6913e71991-11-19 20:26:46 +00001511 if (a->ob_size != b->ob_size) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001512 if (ABS(a->ob_size) == 0 && ABS(b->ob_size) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00001513 sign = 0;
1514 else
1515 sign = a->ob_size - b->ob_size;
1516 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001517 else {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001518 int i = ABS(a->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001519 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1520 ;
1521 if (i < 0)
1522 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001523 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001524 sign = (int)a->ob_digit[i] - (int)b->ob_digit[i];
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001525 if (a->ob_size < 0)
1526 sign = -sign;
1527 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001528 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001529 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001530}
1531
Guido van Rossum9bfef441993-03-29 10:43:31 +00001532static long
Tim Peters9f688bf2000-07-07 15:53:28 +00001533long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001534{
1535 long x;
1536 int i, sign;
1537
1538 /* This is designed so that Python ints and longs with the
1539 same value hash to the same value, otherwise comparisons
1540 of mapping keys will turn out weird */
1541 i = v->ob_size;
1542 sign = 1;
1543 x = 0;
1544 if (i < 0) {
1545 sign = -1;
1546 i = -(i);
1547 }
Neal Norwitzd5a65a72003-02-23 23:11:41 +00001548#define LONG_BIT_SHIFT (8*sizeof(long) - SHIFT)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001549 while (--i >= 0) {
Neal Norwitzd5a65a72003-02-23 23:11:41 +00001550 /* Force a native long #-bits (32 or 64) circular shift */
1551 x = ((x << SHIFT) & ~MASK) | ((x >> LONG_BIT_SHIFT) & MASK);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001552 x += v->ob_digit[i];
1553 }
Neal Norwitzd5a65a72003-02-23 23:11:41 +00001554#undef LONG_BIT_SHIFT
Guido van Rossum9bfef441993-03-29 10:43:31 +00001555 x = x * sign;
1556 if (x == -1)
1557 x = -2;
1558 return x;
1559}
1560
1561
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001562/* Add the absolute values of two long integers. */
1563
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001564static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001565x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001566{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001567 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001568 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001569 int i;
1570 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001571
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001572 /* Ensure a is the larger of the two: */
1573 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001574 { PyLongObject *temp = a; a = b; b = temp; }
1575 { int size_temp = size_a;
1576 size_a = size_b;
1577 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001578 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001579 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001580 if (z == NULL)
1581 return NULL;
1582 for (i = 0; i < size_b; ++i) {
1583 carry += a->ob_digit[i] + b->ob_digit[i];
1584 z->ob_digit[i] = carry & MASK;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001585 carry >>= SHIFT;
1586 }
1587 for (; i < size_a; ++i) {
1588 carry += a->ob_digit[i];
1589 z->ob_digit[i] = carry & MASK;
1590 carry >>= SHIFT;
1591 }
1592 z->ob_digit[i] = carry;
1593 return long_normalize(z);
1594}
1595
1596/* Subtract the absolute values of two integers. */
1597
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001598static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001599x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001600{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001601 int size_a = ABS(a->ob_size), size_b = ABS(b->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001602 PyLongObject *z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001603 int i;
1604 int sign = 1;
1605 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00001606
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001607 /* Ensure a is the larger of the two: */
1608 if (size_a < size_b) {
1609 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001610 { PyLongObject *temp = a; a = b; b = temp; }
1611 { int size_temp = size_a;
1612 size_a = size_b;
1613 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001614 }
1615 else if (size_a == size_b) {
1616 /* Find highest digit where a and b differ: */
1617 i = size_a;
1618 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
1619 ;
1620 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001621 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001622 if (a->ob_digit[i] < b->ob_digit[i]) {
1623 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001624 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001625 }
1626 size_a = size_b = i+1;
1627 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001628 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001629 if (z == NULL)
1630 return NULL;
1631 for (i = 0; i < size_b; ++i) {
1632 /* The following assumes unsigned arithmetic
1633 works module 2**N for some N>SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001634 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001635 z->ob_digit[i] = borrow & MASK;
1636 borrow >>= SHIFT;
1637 borrow &= 1; /* Keep only one sign bit */
1638 }
1639 for (; i < size_a; ++i) {
1640 borrow = a->ob_digit[i] - borrow;
1641 z->ob_digit[i] = borrow & MASK;
1642 borrow >>= SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00001643 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001644 }
1645 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001646 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001647 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001648 return long_normalize(z);
1649}
1650
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001651static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001652long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001653{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001654 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00001655
Neil Schemenauerba872e22001-01-04 01:46:03 +00001656 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1657
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001658 if (a->ob_size < 0) {
1659 if (b->ob_size < 0) {
1660 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001661 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001662 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001663 }
1664 else
1665 z = x_sub(b, a);
1666 }
1667 else {
1668 if (b->ob_size < 0)
1669 z = x_sub(a, b);
1670 else
1671 z = x_add(a, b);
1672 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001673 Py_DECREF(a);
1674 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001675 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001676}
1677
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001678static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00001679long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001680{
Neil Schemenauerba872e22001-01-04 01:46:03 +00001681 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001682
Neil Schemenauerba872e22001-01-04 01:46:03 +00001683 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
1684
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001685 if (a->ob_size < 0) {
1686 if (b->ob_size < 0)
1687 z = x_sub(a, b);
1688 else
1689 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00001690 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001691 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001692 }
1693 else {
1694 if (b->ob_size < 0)
1695 z = x_add(a, b);
1696 else
1697 z = x_sub(a, b);
1698 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00001699 Py_DECREF(a);
1700 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001701 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001702}
1703
Tim Peters5af4e6c2002-08-12 02:31:19 +00001704/* Grade school multiplication, ignoring the signs.
1705 * Returns the absolute value of the product, or NULL if error.
1706 */
1707static PyLongObject *
1708x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00001709{
Tim Peters5af4e6c2002-08-12 02:31:19 +00001710 PyLongObject *z;
1711 int size_a = ABS(a->ob_size);
1712 int size_b = ABS(b->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001713 int i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00001714
Tim Peters5af4e6c2002-08-12 02:31:19 +00001715 z = _PyLong_New(size_a + size_b);
1716 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001717 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001718
1719 memset(z->ob_digit, 0, z->ob_size * sizeof(digit));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001720 for (i = 0; i < size_a; ++i) {
1721 twodigits carry = 0;
1722 twodigits f = a->ob_digit[i];
1723 int j;
Tim Peters115c8882002-08-12 18:25:43 +00001724 digit *pz = z->ob_digit + i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001725
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001726 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001727 Py_DECREF(z);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001728 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001729 })
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001730 for (j = 0; j < size_b; ++j) {
Tim Peters115c8882002-08-12 18:25:43 +00001731 carry += *pz + b->ob_digit[j] * f;
1732 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001733 carry >>= SHIFT;
1734 }
1735 for (; carry != 0; ++j) {
1736 assert(i+j < z->ob_size);
Tim Peters115c8882002-08-12 18:25:43 +00001737 carry += *pz;
1738 *pz++ = (digit) (carry & MASK);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001739 carry >>= SHIFT;
1740 }
1741 }
Tim Peters44121a62002-08-12 06:17:58 +00001742 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001743}
1744
1745/* A helper for Karatsuba multiplication (k_mul).
1746 Takes a long "n" and an integer "size" representing the place to
1747 split, and sets low and high such that abs(n) == (high << size) + low,
1748 viewing the shift as being by digits. The sign bit is ignored, and
1749 the return values are >= 0.
1750 Returns 0 on success, -1 on failure.
1751*/
1752static int
1753kmul_split(PyLongObject *n, int size, PyLongObject **high, PyLongObject **low)
1754{
1755 PyLongObject *hi, *lo;
1756 int size_lo, size_hi;
1757 const int size_n = ABS(n->ob_size);
1758
1759 size_lo = MIN(size_n, size);
1760 size_hi = size_n - size_lo;
1761
1762 if ((hi = _PyLong_New(size_hi)) == NULL)
1763 return -1;
1764 if ((lo = _PyLong_New(size_lo)) == NULL) {
1765 Py_DECREF(hi);
1766 return -1;
1767 }
1768
1769 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
1770 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
1771
1772 *high = long_normalize(hi);
1773 *low = long_normalize(lo);
1774 return 0;
1775}
1776
Tim Peters60004642002-08-12 22:01:34 +00001777static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
1778
Tim Peters5af4e6c2002-08-12 02:31:19 +00001779/* Karatsuba multiplication. Ignores the input signs, and returns the
1780 * absolute value of the product (or NULL if error).
1781 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
1782 */
1783static PyLongObject *
1784k_mul(PyLongObject *a, PyLongObject *b)
1785{
Tim Peters738eda72002-08-12 15:08:20 +00001786 int asize = ABS(a->ob_size);
1787 int bsize = ABS(b->ob_size);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001788 PyLongObject *ah = NULL;
1789 PyLongObject *al = NULL;
1790 PyLongObject *bh = NULL;
1791 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001792 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00001793 PyLongObject *t1, *t2, *t3;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001794 int shift; /* the number of digits we split off */
1795 int i;
Tim Peters738eda72002-08-12 15:08:20 +00001796
Tim Peters5af4e6c2002-08-12 02:31:19 +00001797 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
1798 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
1799 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00001800 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00001801 * By picking X to be a power of 2, "*X" is just shifting, and it's
1802 * been reduced to 3 multiplies on numbers half the size.
1803 */
1804
Tim Petersfc07e562002-08-12 02:54:10 +00001805 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00001806 * is largest.
1807 */
Tim Peters738eda72002-08-12 15:08:20 +00001808 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001809 t1 = a;
1810 a = b;
1811 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00001812
1813 i = asize;
1814 asize = bsize;
1815 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001816 }
1817
1818 /* Use gradeschool math when either number is too small. */
Tim Peters738eda72002-08-12 15:08:20 +00001819 if (asize <= KARATSUBA_CUTOFF) {
Tim Peters738eda72002-08-12 15:08:20 +00001820 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00001821 return _PyLong_New(0);
1822 else
1823 return x_mul(a, b);
1824 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001825
Tim Peters60004642002-08-12 22:01:34 +00001826 /* If a is small compared to b, splitting on b gives a degenerate
1827 * case with ah==0, and Karatsuba may be (even much) less efficient
1828 * than "grade school" then. However, we can still win, by viewing
1829 * b as a string of "big digits", each of width a->ob_size. That
1830 * leads to a sequence of balanced calls to k_mul.
1831 */
1832 if (2 * asize <= bsize)
1833 return k_lopsided_mul(a, b);
1834
Tim Petersd6974a52002-08-13 20:37:51 +00001835 /* Split a & b into hi & lo pieces. */
Tim Peters738eda72002-08-12 15:08:20 +00001836 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001837 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
Tim Petersd6974a52002-08-13 20:37:51 +00001838 assert(ah->ob_size > 0); /* the split isn't degenerate */
1839
Tim Peters5af4e6c2002-08-12 02:31:19 +00001840 if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
1841
Tim Petersd64c1de2002-08-12 17:36:03 +00001842 /* The plan:
1843 * 1. Allocate result space (asize + bsize digits: that's always
1844 * enough).
1845 * 2. Compute ah*bh, and copy into result at 2*shift.
1846 * 3. Compute al*bl, and copy into result at 0. Note that this
1847 * can't overlap with #2.
1848 * 4. Subtract al*bl from the result, starting at shift. This may
1849 * underflow (borrow out of the high digit), but we don't care:
1850 * we're effectively doing unsigned arithmetic mod
1851 * BASE**(sizea + sizeb), and so long as the *final* result fits,
1852 * borrows and carries out of the high digit can be ignored.
1853 * 5. Subtract ah*bh from the result, starting at shift.
1854 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
1855 * at shift.
1856 */
1857
1858 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00001859 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001860 if (ret == NULL) goto fail;
1861#ifdef Py_DEBUG
1862 /* Fill with trash, to catch reference to uninitialized digits. */
1863 memset(ret->ob_digit, 0xDF, ret->ob_size * sizeof(digit));
1864#endif
Tim Peters44121a62002-08-12 06:17:58 +00001865
Tim Petersd64c1de2002-08-12 17:36:03 +00001866 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00001867 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
1868 assert(t1->ob_size >= 0);
1869 assert(2*shift + t1->ob_size <= ret->ob_size);
1870 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
1871 t1->ob_size * sizeof(digit));
1872
1873 /* Zero-out the digits higher than the ah*bh copy. */
1874 i = ret->ob_size - 2*shift - t1->ob_size;
Tim Peters44121a62002-08-12 06:17:58 +00001875 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001876 memset(ret->ob_digit + 2*shift + t1->ob_size, 0,
Tim Peters44121a62002-08-12 06:17:58 +00001877 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001878
Tim Petersd64c1de2002-08-12 17:36:03 +00001879 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001880 if ((t2 = k_mul(al, bl)) == NULL) {
1881 Py_DECREF(t1);
1882 goto fail;
1883 }
1884 assert(t2->ob_size >= 0);
1885 assert(t2->ob_size <= 2*shift); /* no overlap with high digits */
1886 memcpy(ret->ob_digit, t2->ob_digit, t2->ob_size * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001887
1888 /* Zero out remaining digits. */
Tim Peters738eda72002-08-12 15:08:20 +00001889 i = 2*shift - t2->ob_size; /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001890 if (i)
Tim Peters738eda72002-08-12 15:08:20 +00001891 memset(ret->ob_digit + t2->ob_size, 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001892
Tim Petersd64c1de2002-08-12 17:36:03 +00001893 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
1894 * because it's fresher in cache.
1895 */
Tim Peters738eda72002-08-12 15:08:20 +00001896 i = ret->ob_size - shift; /* # digits after shift */
Tim Petersd64c1de2002-08-12 17:36:03 +00001897 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, t2->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001898 Py_DECREF(t2);
1899
Tim Petersd64c1de2002-08-12 17:36:03 +00001900 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, t1->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001901 Py_DECREF(t1);
1902
Tim Petersd64c1de2002-08-12 17:36:03 +00001903 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001904 if ((t1 = x_add(ah, al)) == NULL) goto fail;
1905 Py_DECREF(ah);
1906 Py_DECREF(al);
1907 ah = al = NULL;
1908
1909 if ((t2 = x_add(bh, bl)) == NULL) {
1910 Py_DECREF(t1);
1911 goto fail;
1912 }
1913 Py_DECREF(bh);
1914 Py_DECREF(bl);
1915 bh = bl = NULL;
1916
Tim Peters738eda72002-08-12 15:08:20 +00001917 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001918 Py_DECREF(t1);
1919 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00001920 if (t3 == NULL) goto fail;
Tim Peters547607c2002-08-12 19:43:49 +00001921 assert(t3->ob_size >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001922
Tim Petersd6974a52002-08-13 20:37:51 +00001923 /* Add t3. It's not obvious why we can't run out of room here.
1924 * See the (*) comment after this function.
Tim Petersd8b21732002-08-12 19:30:26 +00001925 */
Tim Petersd64c1de2002-08-12 17:36:03 +00001926 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, t3->ob_size);
Tim Peters738eda72002-08-12 15:08:20 +00001927 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001928
Tim Peters5af4e6c2002-08-12 02:31:19 +00001929 return long_normalize(ret);
1930
1931 fail:
1932 Py_XDECREF(ret);
1933 Py_XDECREF(ah);
1934 Py_XDECREF(al);
1935 Py_XDECREF(bh);
1936 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001937 return NULL;
1938}
1939
Tim Petersd6974a52002-08-13 20:37:51 +00001940/* (*) Why adding t3 can't "run out of room" above.
1941
Tim Petersab86c2b2002-08-15 20:06:00 +00001942Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
1943to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00001944
Tim Petersab86c2b2002-08-15 20:06:00 +000019451. For any integer i, i = c(i/2) + f(i/2). In particular,
1946 bsize = c(bsize/2) + f(bsize/2).
19472. shift = f(bsize/2)
19483. asize <= bsize
19494. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
1950 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00001951
Tim Petersab86c2b2002-08-15 20:06:00 +00001952We allocated asize + bsize result digits, and add t3 into them at an offset
1953of shift. This leaves asize+bsize-shift allocated digit positions for t3
1954to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
1955asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00001956
Tim Petersab86c2b2002-08-15 20:06:00 +00001957bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
1958at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001959
Tim Petersab86c2b2002-08-15 20:06:00 +00001960If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
1961digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
1962most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00001963
Tim Petersab86c2b2002-08-15 20:06:00 +00001964The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00001965
Tim Petersab86c2b2002-08-15 20:06:00 +00001966 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00001967
Tim Petersab86c2b2002-08-15 20:06:00 +00001968and we have asize + c(bsize/2) available digit positions. We need to show
1969this is always enough. An instance of c(bsize/2) cancels out in both, so
1970the question reduces to whether asize digits is enough to hold
1971(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
1972then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
1973asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
1974digit is enough to hold 2 bits. This is so since SHIFT=15 >= 2. If
1975asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00001976c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
1977is enough to hold 2 bits. This is so if bsize >= 2, which holds because
1978bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00001979
Tim Peters48d52c02002-08-14 17:07:32 +00001980Note that since there's always enough room for (ah+al)*(bh+bl), and that's
1981clearly >= each of ah*bh and al*bl, there's always enough room to subtract
1982ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00001983*/
1984
Tim Peters60004642002-08-12 22:01:34 +00001985/* b has at least twice the digits of a, and a is big enough that Karatsuba
1986 * would pay off *if* the inputs had balanced sizes. View b as a sequence
1987 * of slices, each with a->ob_size digits, and multiply the slices by a,
1988 * one at a time. This gives k_mul balanced inputs to work with, and is
1989 * also cache-friendly (we compute one double-width slice of the result
1990 * at a time, then move on, never bactracking except for the helpful
1991 * single-width slice overlap between successive partial sums).
1992 */
1993static PyLongObject *
1994k_lopsided_mul(PyLongObject *a, PyLongObject *b)
1995{
1996 const int asize = ABS(a->ob_size);
1997 int bsize = ABS(b->ob_size);
1998 int nbdone; /* # of b digits already multiplied */
1999 PyLongObject *ret;
2000 PyLongObject *bslice = NULL;
2001
2002 assert(asize > KARATSUBA_CUTOFF);
2003 assert(2 * asize <= bsize);
2004
2005 /* Allocate result space, and zero it out. */
2006 ret = _PyLong_New(asize + bsize);
2007 if (ret == NULL)
2008 return NULL;
2009 memset(ret->ob_digit, 0, ret->ob_size * sizeof(digit));
2010
2011 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00002012 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00002013 if (bslice == NULL)
2014 goto fail;
2015
2016 nbdone = 0;
2017 while (bsize > 0) {
2018 PyLongObject *product;
2019 const int nbtouse = MIN(bsize, asize);
2020
2021 /* Multiply the next slice of b by a. */
2022 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
2023 nbtouse * sizeof(digit));
2024 bslice->ob_size = nbtouse;
2025 product = k_mul(a, bslice);
2026 if (product == NULL)
2027 goto fail;
2028
2029 /* Add into result. */
2030 (void)v_iadd(ret->ob_digit + nbdone, ret->ob_size - nbdone,
2031 product->ob_digit, product->ob_size);
2032 Py_DECREF(product);
2033
2034 bsize -= nbtouse;
2035 nbdone += nbtouse;
2036 }
2037
2038 Py_DECREF(bslice);
2039 return long_normalize(ret);
2040
2041 fail:
2042 Py_DECREF(ret);
2043 Py_XDECREF(bslice);
2044 return NULL;
2045}
Tim Peters5af4e6c2002-08-12 02:31:19 +00002046
2047static PyObject *
2048long_mul(PyLongObject *v, PyLongObject *w)
2049{
2050 PyLongObject *a, *b, *z;
2051
2052 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002053 Py_INCREF(Py_NotImplemented);
2054 return Py_NotImplemented;
2055 }
2056
Tim Petersd64c1de2002-08-12 17:36:03 +00002057 z = k_mul(a, b);
Tim Peters9973d742002-08-15 19:41:06 +00002058 /* Negate if exactly one of the inputs is negative. */
2059 if (((a->ob_size ^ b->ob_size) < 0) && z)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002060 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002061 Py_DECREF(a);
2062 Py_DECREF(b);
Tim Peters9973d742002-08-15 19:41:06 +00002063 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002064}
2065
Guido van Rossume32e0141992-01-19 16:31:05 +00002066/* The / and % operators are now defined in terms of divmod().
2067 The expression a mod b has the value a - b*floor(a/b).
2068 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002069 |a| by |b|, with the sign of a. This is also expressed
2070 as a - b*trunc(a/b), if trunc truncates towards zero.
2071 Some examples:
2072 a b a rem b a mod b
2073 13 10 3 3
2074 -13 10 -3 7
2075 13 -10 3 -7
2076 -13 -10 -3 -3
2077 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002078 have different signs. We then subtract one from the 'div'
2079 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002080
Guido van Rossume32e0141992-01-19 16:31:05 +00002081static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00002082l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00002083 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00002084{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002085 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002086
Guido van Rossume32e0141992-01-19 16:31:05 +00002087 if (long_divrem(v, w, &div, &mod) < 0)
2088 return -1;
Guido van Rossum472c04f1996-12-05 21:57:21 +00002089 if ((mod->ob_size < 0 && w->ob_size > 0) ||
2090 (mod->ob_size > 0 && w->ob_size < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002091 PyLongObject *temp;
2092 PyLongObject *one;
2093 temp = (PyLongObject *) long_add(mod, w);
2094 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00002095 mod = temp;
2096 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002097 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002098 return -1;
2099 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002100 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00002101 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002102 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
2103 Py_DECREF(mod);
2104 Py_DECREF(div);
2105 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00002106 return -1;
2107 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002108 Py_DECREF(one);
2109 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002110 div = temp;
2111 }
2112 *pdiv = div;
2113 *pmod = mod;
2114 return 0;
2115}
2116
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002117static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002118long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002119{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002120 PyLongObject *a, *b, *div, *mod;
2121
2122 CONVERT_BINOP(v, w, &a, &b);
2123
2124 if (l_divmod(a, b, &div, &mod) < 0) {
2125 Py_DECREF(a);
2126 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002127 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002128 }
2129 Py_DECREF(a);
2130 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002131 Py_DECREF(mod);
2132 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00002133}
2134
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002135static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00002136long_classic_div(PyObject *v, PyObject *w)
2137{
2138 PyLongObject *a, *b, *div, *mod;
2139
2140 CONVERT_BINOP(v, w, &a, &b);
2141
2142 if (Py_DivisionWarningFlag &&
2143 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
2144 div = NULL;
2145 else if (l_divmod(a, b, &div, &mod) < 0)
2146 div = NULL;
2147 else
2148 Py_DECREF(mod);
2149
2150 Py_DECREF(a);
2151 Py_DECREF(b);
2152 return (PyObject *)div;
2153}
2154
2155static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00002156long_true_divide(PyObject *v, PyObject *w)
2157{
Tim Peterse2a60002001-09-04 06:17:36 +00002158 PyLongObject *a, *b;
2159 double ad, bd;
Tim Peters6f97e492001-11-04 23:09:40 +00002160 int aexp, bexp, failed;
Tim Peterse2a60002001-09-04 06:17:36 +00002161
2162 CONVERT_BINOP(v, w, &a, &b);
2163 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
2164 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00002165 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
2166 Py_DECREF(a);
2167 Py_DECREF(b);
2168 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00002169 return NULL;
2170
2171 if (bd == 0.0) {
2172 PyErr_SetString(PyExc_ZeroDivisionError,
2173 "long division or modulo by zero");
2174 return NULL;
2175 }
2176
2177 /* True value is very close to ad/bd * 2**(SHIFT*(aexp-bexp)) */
2178 ad /= bd; /* overflow/underflow impossible here */
2179 aexp -= bexp;
2180 if (aexp > INT_MAX / SHIFT)
2181 goto overflow;
Tim Peterse56ed9b2001-09-06 21:59:14 +00002182 else if (aexp < -(INT_MAX / SHIFT))
2183 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002184 errno = 0;
2185 ad = ldexp(ad, aexp * SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002186 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002187 goto overflow;
2188 return PyFloat_FromDouble(ad);
2189
2190overflow:
2191 PyErr_SetString(PyExc_OverflowError,
2192 "long/long too large for a float");
2193 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002194
Tim Peters20dab9f2001-09-04 05:31:47 +00002195}
2196
2197static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002198long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002199{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002200 PyLongObject *a, *b, *div, *mod;
2201
2202 CONVERT_BINOP(v, w, &a, &b);
2203
2204 if (l_divmod(a, b, &div, &mod) < 0) {
2205 Py_DECREF(a);
2206 Py_DECREF(b);
Guido van Rossume32e0141992-01-19 16:31:05 +00002207 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002208 }
2209 Py_DECREF(a);
2210 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002211 Py_DECREF(div);
2212 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002213}
2214
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002215static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002216long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002217{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002218 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002219 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002220
2221 CONVERT_BINOP(v, w, &a, &b);
2222
2223 if (l_divmod(a, b, &div, &mod) < 0) {
2224 Py_DECREF(a);
2225 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002226 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002227 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002228 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002229 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002230 PyTuple_SetItem(z, 0, (PyObject *) div);
2231 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002232 }
2233 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002234 Py_DECREF(div);
2235 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002236 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002237 Py_DECREF(a);
2238 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002239 return z;
2240}
2241
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002242static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002243long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002244{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002245 PyLongObject *a, *b;
2246 PyObject *c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002247 PyLongObject *z, *div, *mod;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002248 int size_b, i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002249
2250 CONVERT_BINOP(v, w, &a, &b);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002251 if (PyLong_Check(x) || Py_None == x) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002252 c = x;
2253 Py_INCREF(x);
2254 }
2255 else if (PyInt_Check(x)) {
2256 c = PyLong_FromLong(PyInt_AS_LONG(x));
2257 }
2258 else {
2259 Py_DECREF(a);
2260 Py_DECREF(b);
2261 Py_INCREF(Py_NotImplemented);
2262 return Py_NotImplemented;
2263 }
Tim Peters4c483c42001-09-05 06:24:58 +00002264
2265 if (c != Py_None && ((PyLongObject *)c)->ob_size == 0) {
2266 PyErr_SetString(PyExc_ValueError,
2267 "pow() 3rd argument cannot be 0");
2268 z = NULL;
2269 goto error;
2270 }
2271
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002272 size_b = b->ob_size;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002273 if (size_b < 0) {
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002274 Py_DECREF(a);
2275 Py_DECREF(b);
2276 Py_DECREF(c);
Tim Peters32f453e2001-09-03 08:35:41 +00002277 if (x != Py_None) {
Tim Peters4c483c42001-09-05 06:24:58 +00002278 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
2279 "cannot be negative when 3rd argument specified");
Tim Peters32f453e2001-09-03 08:35:41 +00002280 return NULL;
2281 }
2282 /* Return a float. This works because we know that
2283 this calls float_pow() which converts its
2284 arguments to double. */
Guido van Rossum0ec9aba2001-07-12 11:21:17 +00002285 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002286 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002287 z = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002288 for (i = 0; i < size_b; ++i) {
2289 digit bi = b->ob_digit[i];
2290 int j;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002291
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002292 for (j = 0; j < SHIFT; ++j) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002293 PyLongObject *temp;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002294
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002295 if (bi & 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002296 temp = (PyLongObject *)long_mul(z, a);
2297 Py_DECREF(z);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002298 if (c!=Py_None && temp!=NULL) {
2299 if (l_divmod(temp,(PyLongObject *)c,
2300 &div,&mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002301 Py_DECREF(temp);
2302 z = NULL;
2303 goto error;
2304 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002305 Py_XDECREF(div);
2306 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002307 temp = mod;
2308 }
2309 z = temp;
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002310 if (z == NULL)
2311 break;
2312 }
2313 bi >>= 1;
2314 if (bi == 0 && i+1 == size_b)
2315 break;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002316 temp = (PyLongObject *)long_mul(a, a);
2317 Py_DECREF(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002318 if (c!=Py_None && temp!=NULL) {
2319 if (l_divmod(temp, (PyLongObject *)c, &div,
2320 &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002321 Py_DECREF(temp);
2322 z = NULL;
2323 goto error;
2324 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002325 Py_XDECREF(div);
2326 Py_DECREF(temp);
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002327 temp = mod;
2328 }
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002329 a = temp;
2330 if (a == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002331 Py_DECREF(z);
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002332 z = NULL;
2333 break;
2334 }
2335 }
Guido van Rossumc206c761995-01-10 15:23:19 +00002336 if (a == NULL || z == NULL)
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00002337 break;
2338 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002339 if (c!=Py_None && z!=NULL) {
2340 if (l_divmod(z, (PyLongObject *)c, &div, &mod) < 0) {
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002341 Py_DECREF(z);
2342 z = NULL;
2343 }
2344 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002345 Py_XDECREF(div);
2346 Py_DECREF(z);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002347 z = mod;
2348 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002349 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002350 error:
Neil Schemenauerba872e22001-01-04 01:46:03 +00002351 Py_XDECREF(a);
2352 Py_DECREF(b);
2353 Py_DECREF(c);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002354 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002355}
2356
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002357static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002358long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002359{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002360 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002361 PyLongObject *x;
2362 PyLongObject *w;
2363 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002364 if (w == NULL)
2365 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002366 x = (PyLongObject *) long_add(v, w);
2367 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002368 if (x == NULL)
2369 return NULL;
Tim Peters40c397d2001-09-11 23:24:22 +00002370 x->ob_size = -(x->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002371 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002372}
2373
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002374static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002375long_pos(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002376{
Tim Peters69c2de32001-09-11 22:31:33 +00002377 if (PyLong_CheckExact(v)) {
2378 Py_INCREF(v);
2379 return (PyObject *)v;
2380 }
2381 else
2382 return _PyLong_Copy(v);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002383}
2384
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002385static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002386long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002387{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002388 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002389 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002390 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002391 Py_INCREF(v);
2392 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002393 }
Tim Peters69c2de32001-09-11 22:31:33 +00002394 z = (PyLongObject *)_PyLong_Copy(v);
2395 if (z != NULL)
2396 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002397 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002398}
2399
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002400static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002401long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002402{
2403 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002404 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00002405 else
2406 return long_pos(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002407}
2408
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002409static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002410long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002411{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002412 return ABS(v->ob_size) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002413}
2414
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002415static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002416long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002417{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002418 PyLongObject *a, *b;
2419 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002420 long shiftby;
2421 int newsize, wordshift, loshift, hishift, i, j;
2422 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002423
Neil Schemenauerba872e22001-01-04 01:46:03 +00002424 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2425
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002426 if (a->ob_size < 0) {
2427 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002428 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002429 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002430 if (a1 == NULL)
2431 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002432 a2 = (PyLongObject *) long_rshift(a1, b);
2433 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002434 if (a2 == NULL)
2435 goto rshift_error;
2436 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002437 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002438 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002439 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002440
Neil Schemenauerba872e22001-01-04 01:46:03 +00002441 shiftby = PyLong_AsLong((PyObject *)b);
2442 if (shiftby == -1L && PyErr_Occurred())
2443 goto rshift_error;
2444 if (shiftby < 0) {
2445 PyErr_SetString(PyExc_ValueError,
2446 "negative shift count");
2447 goto rshift_error;
2448 }
2449 wordshift = shiftby / SHIFT;
2450 newsize = ABS(a->ob_size) - wordshift;
2451 if (newsize <= 0) {
2452 z = _PyLong_New(0);
2453 Py_DECREF(a);
2454 Py_DECREF(b);
2455 return (PyObject *)z;
2456 }
2457 loshift = shiftby % SHIFT;
2458 hishift = SHIFT - loshift;
2459 lomask = ((digit)1 << hishift) - 1;
2460 himask = MASK ^ lomask;
2461 z = _PyLong_New(newsize);
2462 if (z == NULL)
2463 goto rshift_error;
2464 if (a->ob_size < 0)
2465 z->ob_size = -(z->ob_size);
2466 for (i = 0, j = wordshift; i < newsize; i++, j++) {
2467 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
2468 if (i+1 < newsize)
2469 z->ob_digit[i] |=
2470 (a->ob_digit[j+1] << hishift) & himask;
2471 }
2472 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002473 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002474rshift_error:
2475 Py_DECREF(a);
2476 Py_DECREF(b);
2477 return (PyObject *) z;
2478
Guido van Rossumc6913e71991-11-19 20:26:46 +00002479}
2480
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002481static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002482long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002483{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002484 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002485 PyLongObject *a, *b;
2486 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002487 long shiftby;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002488 int oldsize, newsize, wordshift, remshift, i, j;
2489 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002490
Neil Schemenauerba872e22001-01-04 01:46:03 +00002491 CONVERT_BINOP(v, w, &a, &b);
2492
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002493 shiftby = PyLong_AsLong((PyObject *)b);
2494 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00002495 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002496 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002497 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002498 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002499 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002500 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002501 PyErr_SetString(PyExc_ValueError,
2502 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00002503 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002504 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002505 /* wordshift, remshift = divmod(shiftby, SHIFT) */
2506 wordshift = (int)shiftby / SHIFT;
2507 remshift = (int)shiftby - wordshift * SHIFT;
2508
2509 oldsize = ABS(a->ob_size);
2510 newsize = oldsize + wordshift;
2511 if (remshift)
2512 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002513 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002514 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002515 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002516 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002517 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002518 for (i = 0; i < wordshift; i++)
2519 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002520 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002521 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00002522 accum |= (twodigits)a->ob_digit[j] << remshift;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002523 z->ob_digit[i] = (digit)(accum & MASK);
2524 accum >>= SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002525 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002526 if (remshift)
2527 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002528 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00002529 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002530 z = long_normalize(z);
2531lshift_error:
2532 Py_DECREF(a);
2533 Py_DECREF(b);
2534 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002535}
2536
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002537
2538/* Bitwise and/xor/or operations */
2539
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002540static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002541long_bitwise(PyLongObject *a,
2542 int op, /* '&', '|', '^' */
2543 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002544{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002545 digit maska, maskb; /* 0 or MASK */
2546 int negz;
2547 int size_a, size_b, size_z;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002548 PyLongObject *z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002549 int i;
Guido van Rossum8b27d921992-03-27 17:27:05 +00002550 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002551 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002552
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002553 if (a->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002554 a = (PyLongObject *) long_invert(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002555 maska = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002556 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002557 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002558 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002559 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002560 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002561 if (b->ob_size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002562 b = (PyLongObject *) long_invert(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002563 maskb = MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002564 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002565 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002566 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002567 maskb = 0;
2568 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002569
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002570 negz = 0;
2571 switch (op) {
2572 case '^':
2573 if (maska != maskb) {
2574 maska ^= MASK;
2575 negz = -1;
2576 }
2577 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002578 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002579 if (maska && maskb) {
2580 op = '|';
2581 maska ^= MASK;
2582 maskb ^= MASK;
2583 negz = -1;
2584 }
2585 break;
2586 case '|':
2587 if (maska || maskb) {
2588 op = '&';
2589 maska ^= MASK;
2590 maskb ^= MASK;
2591 negz = -1;
2592 }
2593 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002594 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002595
Guido van Rossumbd3a5271998-08-11 15:04:47 +00002596 /* JRH: The original logic here was to allocate the result value (z)
2597 as the longer of the two operands. However, there are some cases
2598 where the result is guaranteed to be shorter than that: AND of two
2599 positives, OR of two negatives: use the shorter number. AND with
2600 mixed signs: use the positive number. OR with mixed signs: use the
2601 negative number. After the transformations above, op will be '&'
2602 iff one of these cases applies, and mask will be non-0 for operands
2603 whose length should be ignored.
2604 */
2605
2606 size_a = a->ob_size;
2607 size_b = b->ob_size;
2608 size_z = op == '&'
2609 ? (maska
2610 ? size_b
2611 : (maskb ? size_a : MIN(size_a, size_b)))
2612 : MAX(size_a, size_b);
2613 z = _PyLong_New(size_z);
2614 if (a == NULL || b == NULL || z == NULL) {
2615 Py_XDECREF(a);
2616 Py_XDECREF(b);
2617 Py_XDECREF(z);
2618 return NULL;
2619 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002620
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002621 for (i = 0; i < size_z; ++i) {
2622 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
2623 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
2624 switch (op) {
2625 case '&': z->ob_digit[i] = diga & digb; break;
2626 case '|': z->ob_digit[i] = diga | digb; break;
2627 case '^': z->ob_digit[i] = diga ^ digb; break;
2628 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00002629 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002630
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002631 Py_DECREF(a);
2632 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002633 z = long_normalize(z);
2634 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002635 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002636 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002637 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002638 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002639}
2640
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002641static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002642long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002643{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002644 PyLongObject *a, *b;
2645 PyObject *c;
2646 CONVERT_BINOP(v, w, &a, &b);
2647 c = long_bitwise(a, '&', b);
2648 Py_DECREF(a);
2649 Py_DECREF(b);
2650 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002651}
2652
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002653static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002654long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002655{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002656 PyLongObject *a, *b;
2657 PyObject *c;
2658 CONVERT_BINOP(v, w, &a, &b);
2659 c = long_bitwise(a, '^', b);
2660 Py_DECREF(a);
2661 Py_DECREF(b);
2662 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00002663}
2664
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002665static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002666long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002667{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002668 PyLongObject *a, *b;
2669 PyObject *c;
2670 CONVERT_BINOP(v, w, &a, &b);
2671 c = long_bitwise(a, '|', b);
2672 Py_DECREF(a);
2673 Py_DECREF(b);
2674 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002675}
2676
Guido van Rossum234f9421993-06-17 12:35:49 +00002677static int
Tim Peters9f688bf2000-07-07 15:53:28 +00002678long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00002679{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002680 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00002681 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002682 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002683 return 0;
2684 }
Guido van Rossum1952e382001-09-19 01:25:16 +00002685 else if (PyLong_Check(*pw)) {
2686 Py_INCREF(*pv);
2687 Py_INCREF(*pw);
2688 return 0;
2689 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00002690 return 1; /* Can't do it */
2691}
2692
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002693static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002694long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002695{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002696 Py_INCREF(v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002697 return v;
2698}
2699
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002700static PyObject *
Walter Dörwaldf1715402002-11-19 20:49:15 +00002701long_int(PyObject *v)
2702{
2703 long x;
2704 x = PyLong_AsLong(v);
2705 if (PyErr_Occurred()) {
2706 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
2707 PyErr_Clear();
2708 if (PyLong_CheckExact(v)) {
2709 Py_INCREF(v);
2710 return v;
2711 }
2712 else
2713 return _PyLong_Copy((PyLongObject *)v);
2714 }
2715 else
2716 return NULL;
2717 }
2718 return PyInt_FromLong(x);
2719}
2720
2721static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002722long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002723{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00002724 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002725 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00002726 if (result == -1.0 && PyErr_Occurred())
2727 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002728 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002729}
2730
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002731static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002732long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002733{
Fred Drake121ee271999-12-23 15:41:28 +00002734 return long_format(v, 8, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002735}
2736
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002737static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002738long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002739{
Fred Drake121ee271999-12-23 15:41:28 +00002740 return long_format(v, 16, 1);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002741}
Jeremy Hylton938ace62002-07-17 16:30:39 +00002742
2743static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00002744long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00002745
Tim Peters6d6c1a32001-08-02 04:15:00 +00002746static PyObject *
2747long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2748{
2749 PyObject *x = NULL;
2750 int base = -909; /* unlikely! */
2751 static char *kwlist[] = {"x", "base", 0};
2752
Guido van Rossumbef14172001-08-29 15:47:46 +00002753 if (type != &PyLong_Type)
2754 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002755 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
2756 &x, &base))
2757 return NULL;
2758 if (x == NULL)
2759 return PyLong_FromLong(0L);
2760 if (base == -909)
2761 return PyNumber_Long(x);
2762 else if (PyString_Check(x))
2763 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002764#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00002765 else if (PyUnicode_Check(x))
2766 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
2767 PyUnicode_GET_SIZE(x),
2768 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002769#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00002770 else {
2771 PyErr_SetString(PyExc_TypeError,
2772 "long() can't convert non-string with explicit base");
2773 return NULL;
2774 }
2775}
2776
Guido van Rossumbef14172001-08-29 15:47:46 +00002777/* Wimpy, slow approach to tp_new calls for subtypes of long:
2778 first create a regular long from whatever arguments we got,
2779 then allocate a subtype instance and initialize it from
2780 the regular long. The regular long is then thrown away.
2781*/
2782static PyObject *
2783long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2784{
2785 PyLongObject *tmp, *new;
2786 int i, n;
2787
2788 assert(PyType_IsSubtype(type, &PyLong_Type));
2789 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
2790 if (tmp == NULL)
2791 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00002792 assert(PyLong_CheckExact(tmp));
Guido van Rossumbef14172001-08-29 15:47:46 +00002793 n = tmp->ob_size;
2794 if (n < 0)
2795 n = -n;
2796 new = (PyLongObject *)type->tp_alloc(type, n);
Raymond Hettingerf4667932003-06-28 20:04:25 +00002797 if (new == NULL) {
2798 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00002799 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00002800 }
Guido van Rossumbef14172001-08-29 15:47:46 +00002801 assert(PyLong_Check(new));
Guido van Rossum13228a62001-08-30 15:54:44 +00002802 new->ob_size = tmp->ob_size;
Guido van Rossumbef14172001-08-29 15:47:46 +00002803 for (i = 0; i < n; i++)
2804 new->ob_digit[i] = tmp->ob_digit[i];
2805 Py_DECREF(tmp);
2806 return (PyObject *)new;
2807}
2808
Guido van Rossum5d9113d2003-01-29 17:58:45 +00002809static PyObject *
2810long_getnewargs(PyLongObject *v)
2811{
2812 return Py_BuildValue("(N)", _PyLong_Copy(v));
2813}
2814
2815static PyMethodDef long_methods[] = {
2816 {"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
2817 {NULL, NULL} /* sentinel */
2818};
2819
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002820PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002821"long(x[, base]) -> integer\n\
2822\n\
2823Convert a string or number to a long integer, if possible. A floating\n\
2824point argument will be truncated towards zero (this does not include a\n\
2825string representation of a floating point number!) When converting a\n\
2826string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002827converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002828
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002829static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00002830 (binaryfunc) long_add, /*nb_add*/
2831 (binaryfunc) long_sub, /*nb_subtract*/
2832 (binaryfunc) long_mul, /*nb_multiply*/
Guido van Rossum393661d2001-08-31 17:40:15 +00002833 (binaryfunc) long_classic_div, /*nb_divide*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002834 (binaryfunc) long_mod, /*nb_remainder*/
2835 (binaryfunc) long_divmod, /*nb_divmod*/
2836 (ternaryfunc) long_pow, /*nb_power*/
2837 (unaryfunc) long_neg, /*nb_negative*/
2838 (unaryfunc) long_pos, /*tp_positive*/
2839 (unaryfunc) long_abs, /*tp_absolute*/
2840 (inquiry) long_nonzero, /*tp_nonzero*/
2841 (unaryfunc) long_invert, /*nb_invert*/
2842 (binaryfunc) long_lshift, /*nb_lshift*/
2843 (binaryfunc) long_rshift, /*nb_rshift*/
2844 (binaryfunc) long_and, /*nb_and*/
2845 (binaryfunc) long_xor, /*nb_xor*/
2846 (binaryfunc) long_or, /*nb_or*/
Tim Peters9ace6bc2000-07-08 00:32:04 +00002847 (coercion) long_coerce, /*nb_coerce*/
Tim Peters9f688bf2000-07-07 15:53:28 +00002848 (unaryfunc) long_int, /*nb_int*/
2849 (unaryfunc) long_long, /*nb_long*/
2850 (unaryfunc) long_float, /*nb_float*/
2851 (unaryfunc) long_oct, /*nb_oct*/
2852 (unaryfunc) long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00002853 0, /* nb_inplace_add */
2854 0, /* nb_inplace_subtract */
2855 0, /* nb_inplace_multiply */
2856 0, /* nb_inplace_divide */
2857 0, /* nb_inplace_remainder */
2858 0, /* nb_inplace_power */
2859 0, /* nb_inplace_lshift */
2860 0, /* nb_inplace_rshift */
2861 0, /* nb_inplace_and */
2862 0, /* nb_inplace_xor */
2863 0, /* nb_inplace_or */
2864 (binaryfunc)long_div, /* nb_floor_divide */
2865 long_true_divide, /* nb_true_divide */
2866 0, /* nb_inplace_floor_divide */
2867 0, /* nb_inplace_true_divide */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002868};
2869
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002870PyTypeObject PyLong_Type = {
2871 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002872 0, /* ob_size */
2873 "long", /* tp_name */
2874 sizeof(PyLongObject) - sizeof(digit), /* tp_basicsize */
2875 sizeof(digit), /* tp_itemsize */
2876 (destructor)long_dealloc, /* tp_dealloc */
2877 0, /* tp_print */
2878 0, /* tp_getattr */
2879 0, /* tp_setattr */
2880 (cmpfunc)long_compare, /* tp_compare */
2881 (reprfunc)long_repr, /* tp_repr */
2882 &long_as_number, /* tp_as_number */
2883 0, /* tp_as_sequence */
2884 0, /* tp_as_mapping */
2885 (hashfunc)long_hash, /* tp_hash */
2886 0, /* tp_call */
2887 (reprfunc)long_str, /* tp_str */
2888 PyObject_GenericGetAttr, /* tp_getattro */
2889 0, /* tp_setattro */
2890 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00002891 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
2892 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002893 long_doc, /* tp_doc */
2894 0, /* tp_traverse */
2895 0, /* tp_clear */
2896 0, /* tp_richcompare */
2897 0, /* tp_weaklistoffset */
2898 0, /* tp_iter */
2899 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00002900 long_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002901 0, /* tp_members */
2902 0, /* tp_getset */
2903 0, /* tp_base */
2904 0, /* tp_dict */
2905 0, /* tp_descr_get */
2906 0, /* tp_descr_set */
2907 0, /* tp_dictoffset */
2908 0, /* tp_init */
2909 0, /* tp_alloc */
2910 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002911 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002912};