blob: c172b0f9c3e837f207c881b8326e000f5fb2d963 [file] [log] [blame]
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003/* Long (arbitrary precision) integer object implementation */
4
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00005/* XXX The functional organization of this file is terrible */
6
Guido van Rossumc0b618a1997-05-02 03:12:38 +00007#include "Python.h"
Guido van Rossumedcc38a1991-05-05 20:09:44 +00008#include "longintrepr.h"
Mark Dickinsonefc82f72009-03-20 15:51:55 +00009#include "structseq.h"
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010
Guido van Rossumeb1fafc1994-08-29 12:47:19 +000011#include <ctype.h>
Mark Dickinson2ffb26f2009-02-15 10:13:41 +000012#include <stddef.h>
Guido van Rossumedcc38a1991-05-05 20:09:44 +000013
Tim Peters5af4e6c2002-08-12 02:31:19 +000014/* For long multiplication, use the O(N**2) school algorithm unless
15 * both operands contain more than KARATSUBA_CUTOFF digits (this
Christian Heimes7f39c9f2008-01-25 12:18:43 +000016 * being an internal Python long digit, in base PyLong_BASE).
Tim Peters5af4e6c2002-08-12 02:31:19 +000017 */
Tim Peters0973b992004-08-29 22:16:50 +000018#define KARATSUBA_CUTOFF 70
19#define KARATSUBA_SQUARE_CUTOFF (2 * KARATSUBA_CUTOFF)
Tim Peters5af4e6c2002-08-12 02:31:19 +000020
Tim Peters47e52ee2004-08-30 02:44:38 +000021/* For exponentiation, use the binary left-to-right algorithm
22 * unless the exponent contains more than FIVEARY_CUTOFF digits.
23 * In that case, do 5 bits at a time. The potential drawback is that
24 * a table of 2**5 intermediate results is computed.
25 */
26#define FIVEARY_CUTOFF 8
27
Guido van Rossume32e0141992-01-19 16:31:05 +000028#define ABS(x) ((x) < 0 ? -(x) : (x))
29
Tim Peters5af4e6c2002-08-12 02:31:19 +000030#undef MIN
31#undef MAX
32#define MAX(x, y) ((x) < (y) ? (y) : (x))
33#define MIN(x, y) ((x) > (y) ? (y) : (x))
34
Guido van Rossumc0b618a1997-05-02 03:12:38 +000035#define SIGCHECK(PyTryBlock) \
Skip Montanarod581d772002-09-03 20:10:45 +000036 if (--_Py_Ticker < 0) { \
37 _Py_Ticker = _Py_CheckInterval; \
Tim Petersd89fc222006-05-25 22:28:46 +000038 if (PyErr_CheckSignals()) PyTryBlock \
Guido van Rossum23d6f0e1991-05-14 12:06:49 +000039 }
40
Guido van Rossumedcc38a1991-05-05 20:09:44 +000041/* Normalize (remove leading zeros from) a long int object.
42 Doesn't attempt to free the storage--in most cases, due to the nature
43 of the algorithms used, this could save at most be one word anyway. */
44
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +000046long_normalize(register PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000047{
Christian Heimese93237d2007-12-19 02:37:44 +000048 Py_ssize_t j = ABS(Py_SIZE(v));
Martin v. Löwis18e16552006-02-15 17:27:45 +000049 Py_ssize_t i = j;
Tim Peters5af4e6c2002-08-12 02:31:19 +000050
Guido van Rossumedcc38a1991-05-05 20:09:44 +000051 while (i > 0 && v->ob_digit[i-1] == 0)
52 --i;
53 if (i != j)
Christian Heimese93237d2007-12-19 02:37:44 +000054 Py_SIZE(v) = (Py_SIZE(v) < 0) ? -(i) : i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +000055 return v;
56}
57
58/* Allocate a new long int object with size digits.
59 Return NULL and set exception if we run out of memory. */
60
Mark Dickinson2ffb26f2009-02-15 10:13:41 +000061#define MAX_LONG_DIGITS \
62 ((PY_SSIZE_T_MAX - offsetof(PyLongObject, ob_digit))/sizeof(digit))
63
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064PyLongObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000065_PyLong_New(Py_ssize_t size)
Guido van Rossumedcc38a1991-05-05 20:09:44 +000066{
Mark Dickinsonbcf6b182009-02-15 15:48:39 +000067 if (size > (Py_ssize_t)MAX_LONG_DIGITS) {
Mark Dickinson2ffb26f2009-02-15 10:13:41 +000068 PyErr_SetString(PyExc_OverflowError,
69 "too many digits in integer");
Martin v. Löwis18e16552006-02-15 17:27:45 +000070 return NULL;
71 }
Christian Heimes4956d2b2008-01-18 19:12:56 +000072 /* coverity[ampersand_in_size] */
Mark Dickinson2ffb26f2009-02-15 10:13:41 +000073 /* XXX(nnorwitz): PyObject_NEW_VAR / _PyObject_VAR_SIZE need to detect
74 overflow */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +000076}
77
Tim Peters64b5ce32001-09-10 20:52:51 +000078PyObject *
79_PyLong_Copy(PyLongObject *src)
80{
81 PyLongObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +000082 Py_ssize_t i;
Tim Peters64b5ce32001-09-10 20:52:51 +000083
84 assert(src != NULL);
85 i = src->ob_size;
86 if (i < 0)
87 i = -(i);
88 result = _PyLong_New(i);
89 if (result != NULL) {
Tim Peters5329cdb2002-03-02 04:18:04 +000090 result->ob_size = src->ob_size;
Tim Peters64b5ce32001-09-10 20:52:51 +000091 while (--i >= 0)
92 result->ob_digit[i] = src->ob_digit[i];
93 }
94 return (PyObject *)result;
95}
96
Guido van Rossumedcc38a1991-05-05 20:09:44 +000097/* Create a new long int object from a C long int */
98
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000100PyLong_FromLong(long ival)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000101{
Tim Petersce9de2f2001-06-14 04:56:19 +0000102 PyLongObject *v;
Mark Dickinson27a63252008-04-15 20:51:18 +0000103 unsigned long abs_ival;
Tim Petersce9de2f2001-06-14 04:56:19 +0000104 unsigned long t; /* unsigned so >> doesn't propagate sign bit */
105 int ndigits = 0;
106 int negative = 0;
107
108 if (ival < 0) {
Mark Dickinson27a63252008-04-15 20:51:18 +0000109 /* if LONG_MIN == -LONG_MAX-1 (true on most platforms) then
110 ANSI C says that the result of -ival is undefined when ival
111 == LONG_MIN. Hence the following workaround. */
112 abs_ival = (unsigned long)(-1-ival) + 1;
Tim Petersce9de2f2001-06-14 04:56:19 +0000113 negative = 1;
114 }
Mark Dickinson27a63252008-04-15 20:51:18 +0000115 else {
116 abs_ival = (unsigned long)ival;
117 }
Tim Petersce9de2f2001-06-14 04:56:19 +0000118
119 /* Count the number of Python digits.
120 We used to pick 5 ("big enough for anything"), but that's a
121 waste of time and space given that 5*15 = 75 bits are rarely
122 needed. */
Mark Dickinson27a63252008-04-15 20:51:18 +0000123 t = abs_ival;
Tim Petersce9de2f2001-06-14 04:56:19 +0000124 while (t) {
125 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000126 t >>= PyLong_SHIFT;
Tim Petersce9de2f2001-06-14 04:56:19 +0000127 }
128 v = _PyLong_New(ndigits);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000129 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000130 digit *p = v->ob_digit;
131 v->ob_size = negative ? -ndigits : ndigits;
Mark Dickinson27a63252008-04-15 20:51:18 +0000132 t = abs_ival;
Tim Petersce9de2f2001-06-14 04:56:19 +0000133 while (t) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000134 *p++ = (digit)(t & PyLong_MASK);
135 t >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000136 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000137 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 return (PyObject *)v;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000139}
140
Guido van Rossum53756b11997-01-03 17:14:46 +0000141/* Create a new long int object from a C unsigned long int */
142
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000144PyLong_FromUnsignedLong(unsigned long ival)
Guido van Rossum53756b11997-01-03 17:14:46 +0000145{
Tim Petersce9de2f2001-06-14 04:56:19 +0000146 PyLongObject *v;
147 unsigned long t;
148 int ndigits = 0;
149
150 /* Count the number of Python digits. */
151 t = (unsigned long)ival;
152 while (t) {
153 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000154 t >>= PyLong_SHIFT;
Tim Petersce9de2f2001-06-14 04:56:19 +0000155 }
156 v = _PyLong_New(ndigits);
Guido van Rossum53756b11997-01-03 17:14:46 +0000157 if (v != NULL) {
Tim Petersce9de2f2001-06-14 04:56:19 +0000158 digit *p = v->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +0000159 Py_SIZE(v) = ndigits;
Tim Petersce9de2f2001-06-14 04:56:19 +0000160 while (ival) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000161 *p++ = (digit)(ival & PyLong_MASK);
162 ival >>= PyLong_SHIFT;
Guido van Rossum53756b11997-01-03 17:14:46 +0000163 }
Guido van Rossum53756b11997-01-03 17:14:46 +0000164 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 return (PyObject *)v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000166}
167
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000168/* Create a new long int object from a C double */
169
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170PyObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171PyLong_FromDouble(double dval)
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000172{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 PyLongObject *v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000174 double frac;
175 int i, ndig, expo, neg;
176 neg = 0;
Tim Peters39dce292000-08-15 03:34:48 +0000177 if (Py_IS_INFINITY(dval)) {
Guido van Rossum1a23c241999-09-27 17:11:52 +0000178 PyErr_SetString(PyExc_OverflowError,
Mark Dickinsonb6467572008-08-04 21:30:09 +0000179 "cannot convert float infinity to integer");
Guido van Rossum1a23c241999-09-27 17:11:52 +0000180 return NULL;
181 }
Christian Heimes8267d1d2008-01-04 00:37:34 +0000182 if (Py_IS_NAN(dval)) {
Mark Dickinsonb6467572008-08-04 21:30:09 +0000183 PyErr_SetString(PyExc_ValueError,
184 "cannot convert float NaN to integer");
185 return NULL;
Christian Heimes8267d1d2008-01-04 00:37:34 +0000186 }
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000187 if (dval < 0.0) {
188 neg = 1;
189 dval = -dval;
190 }
191 frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
192 if (expo <= 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 return PyLong_FromLong(0L);
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000194 ndig = (expo-1) / PyLong_SHIFT + 1; /* Number of 'digits' in result */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 v = _PyLong_New(ndig);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000196 if (v == NULL)
197 return NULL;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000198 frac = ldexp(frac, (expo-1) % PyLong_SHIFT + 1);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000199 for (i = ndig; --i >= 0; ) {
Mark Dickinson2ffb26f2009-02-15 10:13:41 +0000200 digit bits = (digit)frac;
201 v->ob_digit[i] = bits;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000202 frac = frac - (double)bits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000203 frac = ldexp(frac, PyLong_SHIFT);
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000204 }
205 if (neg)
Christian Heimese93237d2007-12-19 02:37:44 +0000206 Py_SIZE(v) = -(Py_SIZE(v));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 return (PyObject *)v;
Guido van Rossum149e9ea1991-06-03 10:58:24 +0000208}
209
Armin Rigo7ccbca92006-10-04 12:17:45 +0000210/* Checking for overflow in PyLong_AsLong is a PITA since C doesn't define
211 * anything about what happens when a signed integer operation overflows,
212 * and some compilers think they're doing you a favor by being "clever"
213 * then. The bit pattern for the largest postive signed long is
214 * (unsigned long)LONG_MAX, and for the smallest negative signed long
215 * it is abs(LONG_MIN), which we could write -(unsigned long)LONG_MIN.
216 * However, some other compilers warn about applying unary minus to an
217 * unsigned operand. Hence the weird "0-".
218 */
219#define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN)
220#define PY_ABS_SSIZE_T_MIN (0-(size_t)PY_SSIZE_T_MIN)
221
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000222/* Get a C long int from a long int object.
223 Returns -1 and sets an error condition if overflow occurs. */
224
225long
Tim Peters9f688bf2000-07-07 15:53:28 +0000226PyLong_AsLong(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000227{
Guido van Rossumf7531811998-05-26 14:33:37 +0000228 /* This version by Tim Peters */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 register PyLongObject *v;
Guido van Rossumf7531811998-05-26 14:33:37 +0000230 unsigned long x, prev;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000231 Py_ssize_t i;
232 int sign;
Guido van Rossumf7531811998-05-26 14:33:37 +0000233
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 if (vv == NULL || !PyLong_Check(vv)) {
Guido van Rossum7e35d572001-09-15 03:14:32 +0000235 if (vv != NULL && PyInt_Check(vv))
236 return PyInt_AsLong(vv);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000238 return -1;
239 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 v = (PyLongObject *)vv;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000241 i = v->ob_size;
242 sign = 1;
243 x = 0;
244 if (i < 0) {
245 sign = -1;
Guido van Rossum4c260ff1992-01-14 18:36:43 +0000246 i = -(i);
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000247 }
248 while (--i >= 0) {
249 prev = x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000250 x = (x << PyLong_SHIFT) + v->ob_digit[i];
251 if ((x >> PyLong_SHIFT) != prev)
Guido van Rossumf7531811998-05-26 14:33:37 +0000252 goto overflow;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000253 }
Armin Rigo7ccbca92006-10-04 12:17:45 +0000254 /* Haven't lost any bits, but casting to long requires extra care
255 * (see comment above).
256 */
257 if (x <= (unsigned long)LONG_MAX) {
258 return (long)x * sign;
259 }
260 else if (sign < 0 && x == PY_ABS_LONG_MIN) {
261 return LONG_MIN;
262 }
263 /* else overflow */
Guido van Rossumf7531811998-05-26 14:33:37 +0000264
265 overflow:
266 PyErr_SetString(PyExc_OverflowError,
Skip Montanarobafedec2001-09-13 19:05:30 +0000267 "long int too large to convert to int");
Guido van Rossumf7531811998-05-26 14:33:37 +0000268 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000269}
270
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000271/* Get a Py_ssize_t from a long int object.
272 Returns -1 and sets an error condition if overflow occurs. */
273
274Py_ssize_t
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000275PyLong_AsSsize_t(PyObject *vv) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000276 register PyLongObject *v;
277 size_t x, prev;
278 Py_ssize_t i;
279 int sign;
280
281 if (vv == NULL || !PyLong_Check(vv)) {
282 PyErr_BadInternalCall();
283 return -1;
284 }
285 v = (PyLongObject *)vv;
286 i = v->ob_size;
287 sign = 1;
288 x = 0;
289 if (i < 0) {
290 sign = -1;
291 i = -(i);
292 }
293 while (--i >= 0) {
294 prev = x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000295 x = (x << PyLong_SHIFT) + v->ob_digit[i];
296 if ((x >> PyLong_SHIFT) != prev)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000297 goto overflow;
298 }
Armin Rigo7ccbca92006-10-04 12:17:45 +0000299 /* Haven't lost any bits, but casting to a signed type requires
300 * extra care (see comment above).
Martin v. Löwis18e16552006-02-15 17:27:45 +0000301 */
Armin Rigo7ccbca92006-10-04 12:17:45 +0000302 if (x <= (size_t)PY_SSIZE_T_MAX) {
303 return (Py_ssize_t)x * sign;
304 }
305 else if (sign < 0 && x == PY_ABS_SSIZE_T_MIN) {
306 return PY_SSIZE_T_MIN;
307 }
308 /* else overflow */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000309
310 overflow:
311 PyErr_SetString(PyExc_OverflowError,
312 "long int too large to convert to int");
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000313 return -1;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000314}
315
Guido van Rossumd8c80482002-08-13 00:24:58 +0000316/* Get a C unsigned long int from a long int object.
Guido van Rossum53756b11997-01-03 17:14:46 +0000317 Returns -1 and sets an error condition if overflow occurs. */
318
319unsigned long
Tim Peters9f688bf2000-07-07 15:53:28 +0000320PyLong_AsUnsignedLong(PyObject *vv)
Guido van Rossum53756b11997-01-03 17:14:46 +0000321{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 register PyLongObject *v;
Guido van Rossum53756b11997-01-03 17:14:46 +0000323 unsigned long x, prev;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324 Py_ssize_t i;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000325
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326 if (vv == NULL || !PyLong_Check(vv)) {
Martin v. Löwis729d47d2004-09-20 06:17:46 +0000327 if (vv != NULL && PyInt_Check(vv)) {
328 long val = PyInt_AsLong(vv);
329 if (val < 0) {
330 PyErr_SetString(PyExc_OverflowError,
331 "can't convert negative value to unsigned long");
332 return (unsigned long) -1;
333 }
334 return val;
335 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336 PyErr_BadInternalCall();
Guido van Rossum53756b11997-01-03 17:14:46 +0000337 return (unsigned long) -1;
338 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 v = (PyLongObject *)vv;
Christian Heimese93237d2007-12-19 02:37:44 +0000340 i = Py_SIZE(v);
Guido van Rossum53756b11997-01-03 17:14:46 +0000341 x = 0;
342 if (i < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum53756b11997-01-03 17:14:46 +0000344 "can't convert negative value to unsigned long");
345 return (unsigned long) -1;
346 }
347 while (--i >= 0) {
348 prev = x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000349 x = (x << PyLong_SHIFT) + v->ob_digit[i];
350 if ((x >> PyLong_SHIFT) != prev) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +0000352 "long int too large to convert");
Guido van Rossum53756b11997-01-03 17:14:46 +0000353 return (unsigned long) -1;
354 }
355 }
356 return x;
357}
358
Thomas Hellera4ea6032003-04-17 18:55:45 +0000359/* Get a C unsigned long int from a long int object, ignoring the high bits.
360 Returns -1 and sets an error condition if an error occurs. */
361
362unsigned long
363PyLong_AsUnsignedLongMask(PyObject *vv)
364{
365 register PyLongObject *v;
366 unsigned long x;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000367 Py_ssize_t i;
368 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +0000369
370 if (vv == NULL || !PyLong_Check(vv)) {
Martin v. Löwis729d47d2004-09-20 06:17:46 +0000371 if (vv != NULL && PyInt_Check(vv))
372 return PyInt_AsUnsignedLongMask(vv);
Thomas Hellera4ea6032003-04-17 18:55:45 +0000373 PyErr_BadInternalCall();
374 return (unsigned long) -1;
375 }
376 v = (PyLongObject *)vv;
377 i = v->ob_size;
378 sign = 1;
379 x = 0;
380 if (i < 0) {
381 sign = -1;
382 i = -i;
383 }
384 while (--i >= 0) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000385 x = (x << PyLong_SHIFT) + v->ob_digit[i];
Thomas Hellera4ea6032003-04-17 18:55:45 +0000386 }
387 return x * sign;
388}
389
Tim Peters5b8132f2003-01-31 15:52:05 +0000390int
391_PyLong_Sign(PyObject *vv)
392{
393 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000394
395 assert(v != NULL);
396 assert(PyLong_Check(v));
Tim Peters5b8132f2003-01-31 15:52:05 +0000397
Christian Heimese93237d2007-12-19 02:37:44 +0000398 return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1);
Tim Peters5b8132f2003-01-31 15:52:05 +0000399}
400
Tim Petersbaefd9e2003-01-28 20:37:45 +0000401size_t
402_PyLong_NumBits(PyObject *vv)
403{
404 PyLongObject *v = (PyLongObject *)vv;
Tim Peters5b8132f2003-01-31 15:52:05 +0000405 size_t result = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000406 Py_ssize_t ndigits;
Tim Petersbaefd9e2003-01-28 20:37:45 +0000407
408 assert(v != NULL);
409 assert(PyLong_Check(v));
Christian Heimese93237d2007-12-19 02:37:44 +0000410 ndigits = ABS(Py_SIZE(v));
Tim Petersbaefd9e2003-01-28 20:37:45 +0000411 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
412 if (ndigits > 0) {
Tim Petersbaefd9e2003-01-28 20:37:45 +0000413 digit msd = v->ob_digit[ndigits - 1];
414
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000415 result = (ndigits - 1) * PyLong_SHIFT;
416 if (result / PyLong_SHIFT != (size_t)(ndigits - 1))
Tim Petersbaefd9e2003-01-28 20:37:45 +0000417 goto Overflow;
418 do {
419 ++result;
420 if (result == 0)
421 goto Overflow;
422 msd >>= 1;
423 } while (msd);
424 }
425 return result;
426
427Overflow:
428 PyErr_SetString(PyExc_OverflowError, "long has too many bits "
429 "to express in a platform size_t");
430 return (size_t)-1;
431}
432
Tim Peters2a9b3672001-06-11 21:23:58 +0000433PyObject *
434_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
435 int little_endian, int is_signed)
436{
437 const unsigned char* pstartbyte;/* LSB of bytes */
438 int incr; /* direction to move pstartbyte */
439 const unsigned char* pendbyte; /* MSB of bytes */
440 size_t numsignificantbytes; /* number of bytes that matter */
Mark Dickinson2ffb26f2009-02-15 10:13:41 +0000441 Py_ssize_t ndigits; /* number of Python long digits */
Tim Peters2a9b3672001-06-11 21:23:58 +0000442 PyLongObject* v; /* result */
Mark Dickinson2ffb26f2009-02-15 10:13:41 +0000443 Py_ssize_t idigit = 0; /* next free index in v->ob_digit */
Tim Peters2a9b3672001-06-11 21:23:58 +0000444
445 if (n == 0)
446 return PyLong_FromLong(0L);
447
448 if (little_endian) {
449 pstartbyte = bytes;
450 pendbyte = bytes + n - 1;
451 incr = 1;
452 }
453 else {
454 pstartbyte = bytes + n - 1;
455 pendbyte = bytes;
456 incr = -1;
457 }
458
459 if (is_signed)
460 is_signed = *pendbyte >= 0x80;
461
462 /* Compute numsignificantbytes. This consists of finding the most
463 significant byte. Leading 0 bytes are insignficant if the number
464 is positive, and leading 0xff bytes if negative. */
465 {
466 size_t i;
467 const unsigned char* p = pendbyte;
468 const int pincr = -incr; /* search MSB to LSB */
469 const unsigned char insignficant = is_signed ? 0xff : 0x00;
470
471 for (i = 0; i < n; ++i, p += pincr) {
472 if (*p != insignficant)
473 break;
474 }
475 numsignificantbytes = n - i;
476 /* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
477 actually has 2 significant bytes. OTOH, 0xff0001 ==
478 -0x00ffff, so we wouldn't *need* to bump it there; but we
479 do for 0xffff = -0x0001. To be safe without bothering to
480 check every case, bump it regardless. */
481 if (is_signed && numsignificantbytes < n)
482 ++numsignificantbytes;
483 }
484
485 /* How many Python long digits do we need? We have
Mark Dickinson2ffb26f2009-02-15 10:13:41 +0000486 8*numsignificantbytes bits, and each Python long digit has
487 PyLong_SHIFT bits, so it's the ceiling of the quotient. */
488 /* catch overflow before it happens */
489 if (numsignificantbytes > (PY_SSIZE_T_MAX - PyLong_SHIFT) / 8) {
490 PyErr_SetString(PyExc_OverflowError,
491 "byte array too long to convert to int");
492 return NULL;
493 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000494 ndigits = (numsignificantbytes * 8 + PyLong_SHIFT - 1) / PyLong_SHIFT;
Mark Dickinson2ffb26f2009-02-15 10:13:41 +0000495 v = _PyLong_New(ndigits);
Tim Peters2a9b3672001-06-11 21:23:58 +0000496 if (v == NULL)
497 return NULL;
498
499 /* Copy the bits over. The tricky parts are computing 2's-comp on
500 the fly for signed numbers, and dealing with the mismatch between
501 8-bit bytes and (probably) 15-bit Python digits.*/
502 {
503 size_t i;
Tim Petersf251d062001-06-13 21:09:15 +0000504 twodigits carry = 1; /* for 2's-comp calculation */
Tim Peters2a9b3672001-06-11 21:23:58 +0000505 twodigits accum = 0; /* sliding register */
506 unsigned int accumbits = 0; /* number of bits in accum */
507 const unsigned char* p = pstartbyte;
508
509 for (i = 0; i < numsignificantbytes; ++i, p += incr) {
Tim Peters8bc84b42001-06-12 19:17:03 +0000510 twodigits thisbyte = *p;
Tim Peters2a9b3672001-06-11 21:23:58 +0000511 /* Compute correction for 2's comp, if needed. */
512 if (is_signed) {
513 thisbyte = (0xff ^ thisbyte) + carry;
514 carry = thisbyte >> 8;
515 thisbyte &= 0xff;
516 }
517 /* Because we're going LSB to MSB, thisbyte is
518 more significant than what's already in accum,
519 so needs to be prepended to accum. */
Mark Dickinsonff84aa82009-01-24 15:27:44 +0000520 accum |= (twodigits)thisbyte << accumbits;
Tim Peters2a9b3672001-06-11 21:23:58 +0000521 accumbits += 8;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000522 if (accumbits >= PyLong_SHIFT) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000523 /* There's enough to fill a Python digit. */
Mark Dickinson2ffb26f2009-02-15 10:13:41 +0000524 assert(idigit < ndigits);
525 v->ob_digit[idigit] = (digit)(accum &
526 PyLong_MASK);
Tim Peters2a9b3672001-06-11 21:23:58 +0000527 ++idigit;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000528 accum >>= PyLong_SHIFT;
529 accumbits -= PyLong_SHIFT;
530 assert(accumbits < PyLong_SHIFT);
Tim Peters2a9b3672001-06-11 21:23:58 +0000531 }
532 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000533 assert(accumbits < PyLong_SHIFT);
Tim Peters2a9b3672001-06-11 21:23:58 +0000534 if (accumbits) {
Mark Dickinson2ffb26f2009-02-15 10:13:41 +0000535 assert(idigit < ndigits);
Tim Peters2a9b3672001-06-11 21:23:58 +0000536 v->ob_digit[idigit] = (digit)accum;
537 ++idigit;
538 }
539 }
540
Christian Heimese93237d2007-12-19 02:37:44 +0000541 Py_SIZE(v) = is_signed ? -idigit : idigit;
Tim Peters2a9b3672001-06-11 21:23:58 +0000542 return (PyObject *)long_normalize(v);
543}
544
545int
546_PyLong_AsByteArray(PyLongObject* v,
547 unsigned char* bytes, size_t n,
548 int little_endian, int is_signed)
549{
Mark Dickinsonff84aa82009-01-24 15:27:44 +0000550 Py_ssize_t i; /* index into v->ob_digit */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000551 Py_ssize_t ndigits; /* |v->ob_size| */
Tim Peters2a9b3672001-06-11 21:23:58 +0000552 twodigits accum; /* sliding register */
553 unsigned int accumbits; /* # bits in accum */
554 int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
Mark Dickinson1afe6dd2009-01-25 22:12:31 +0000555 digit carry; /* for computing 2's-comp */
Tim Peters2a9b3672001-06-11 21:23:58 +0000556 size_t j; /* # bytes filled */
557 unsigned char* p; /* pointer to next byte in bytes */
558 int pincr; /* direction to move p */
559
560 assert(v != NULL && PyLong_Check(v));
561
Christian Heimese93237d2007-12-19 02:37:44 +0000562 if (Py_SIZE(v) < 0) {
563 ndigits = -(Py_SIZE(v));
Tim Peters2a9b3672001-06-11 21:23:58 +0000564 if (!is_signed) {
Mark Dickinson4015f622009-02-10 15:46:50 +0000565 PyErr_SetString(PyExc_OverflowError,
Tim Peters2a9b3672001-06-11 21:23:58 +0000566 "can't convert negative long to unsigned");
567 return -1;
568 }
569 do_twos_comp = 1;
570 }
571 else {
Christian Heimese93237d2007-12-19 02:37:44 +0000572 ndigits = Py_SIZE(v);
Tim Peters2a9b3672001-06-11 21:23:58 +0000573 do_twos_comp = 0;
574 }
575
576 if (little_endian) {
577 p = bytes;
578 pincr = 1;
579 }
580 else {
581 p = bytes + n - 1;
582 pincr = -1;
583 }
584
Tim Peters898cf852001-06-13 20:50:08 +0000585 /* Copy over all the Python digits.
586 It's crucial that every Python digit except for the MSD contribute
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000587 exactly PyLong_SHIFT bits to the total, so first assert that the long is
Tim Peters898cf852001-06-13 20:50:08 +0000588 normalized. */
589 assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
Tim Peters2a9b3672001-06-11 21:23:58 +0000590 j = 0;
591 accum = 0;
592 accumbits = 0;
593 carry = do_twos_comp ? 1 : 0;
594 for (i = 0; i < ndigits; ++i) {
Mark Dickinsonff84aa82009-01-24 15:27:44 +0000595 digit thisdigit = v->ob_digit[i];
Tim Peters2a9b3672001-06-11 21:23:58 +0000596 if (do_twos_comp) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000597 thisdigit = (thisdigit ^ PyLong_MASK) + carry;
598 carry = thisdigit >> PyLong_SHIFT;
599 thisdigit &= PyLong_MASK;
Tim Peters2a9b3672001-06-11 21:23:58 +0000600 }
Tim Peters8bc84b42001-06-12 19:17:03 +0000601 /* Because we're going LSB to MSB, thisdigit is more
602 significant than what's already in accum, so needs to be
603 prepended to accum. */
Mark Dickinsonff84aa82009-01-24 15:27:44 +0000604 accum |= (twodigits)thisdigit << accumbits;
Tim Peters8bc84b42001-06-12 19:17:03 +0000605
Tim Petersede05092001-06-14 08:53:38 +0000606 /* The most-significant digit may be (probably is) at least
607 partly empty. */
Tim Peters8bc84b42001-06-12 19:17:03 +0000608 if (i == ndigits - 1) {
Tim Petersede05092001-06-14 08:53:38 +0000609 /* Count # of sign bits -- they needn't be stored,
610 * although for signed conversion we need later to
Mark Dickinsonff84aa82009-01-24 15:27:44 +0000611 * make sure at least one sign bit gets stored. */
612 digit s = do_twos_comp ? thisdigit ^ PyLong_MASK :
613 thisdigit;
614 while (s != 0) {
615 s >>= 1;
616 accumbits++;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000617 }
Tim Peters7a3bfc32001-06-12 01:22:22 +0000618 }
Mark Dickinsonff84aa82009-01-24 15:27:44 +0000619 else
620 accumbits += PyLong_SHIFT;
Tim Peters8bc84b42001-06-12 19:17:03 +0000621
Tim Peters2a9b3672001-06-11 21:23:58 +0000622 /* Store as many bytes as possible. */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000623 while (accumbits >= 8) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000624 if (j >= n)
625 goto Overflow;
626 ++j;
627 *p = (unsigned char)(accum & 0xff);
628 p += pincr;
629 accumbits -= 8;
630 accum >>= 8;
Tim Peters7a3bfc32001-06-12 01:22:22 +0000631 }
Tim Peters2a9b3672001-06-11 21:23:58 +0000632 }
633
634 /* Store the straggler (if any). */
635 assert(accumbits < 8);
636 assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
Tim Peters7a3bfc32001-06-12 01:22:22 +0000637 if (accumbits > 0) {
Tim Peters2a9b3672001-06-11 21:23:58 +0000638 if (j >= n)
639 goto Overflow;
640 ++j;
641 if (do_twos_comp) {
642 /* Fill leading bits of the byte with sign bits
643 (appropriately pretending that the long had an
644 infinite supply of sign bits). */
645 accum |= (~(twodigits)0) << accumbits;
646 }
647 *p = (unsigned char)(accum & 0xff);
648 p += pincr;
649 }
Tim Peters05607ad2001-06-13 21:01:27 +0000650 else if (j == n && n > 0 && is_signed) {
651 /* The main loop filled the byte array exactly, so the code
652 just above didn't get to ensure there's a sign bit, and the
653 loop below wouldn't add one either. Make sure a sign bit
654 exists. */
Tim Peters2a9b3672001-06-11 21:23:58 +0000655 unsigned char msb = *(p - pincr);
Tim Peters05607ad2001-06-13 21:01:27 +0000656 int sign_bit_set = msb >= 0x80;
657 assert(accumbits == 0);
658 if (sign_bit_set == do_twos_comp)
659 return 0;
660 else
Tim Peters2a9b3672001-06-11 21:23:58 +0000661 goto Overflow;
662 }
Tim Peters05607ad2001-06-13 21:01:27 +0000663
664 /* Fill remaining bytes with copies of the sign bit. */
665 {
666 unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
667 for ( ; j < n; ++j, p += pincr)
668 *p = signbyte;
669 }
670
Tim Peters2a9b3672001-06-11 21:23:58 +0000671 return 0;
672
673Overflow:
674 PyErr_SetString(PyExc_OverflowError, "long too big to convert");
675 return -1;
Tim Peters5af4e6c2002-08-12 02:31:19 +0000676
Tim Peters2a9b3672001-06-11 21:23:58 +0000677}
678
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000679double
680_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
681{
682/* NBITS_WANTED should be > the number of bits in a double's precision,
683 but small enough so that 2**NBITS_WANTED is within the normal double
684 range. nbitsneeded is set to 1 less than that because the most-significant
685 Python digit contains at least 1 significant bit, but we don't want to
686 bother counting them (catering to the worst case cheaply).
687
688 57 is one more than VAX-D double precision; I (Tim) don't know of a double
689 format with more precision than that; it's 1 larger so that we add in at
690 least one round bit to stand in for the ignored least-significant bits.
691*/
692#define NBITS_WANTED 57
693 PyLongObject *v;
694 double x;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000695 const double multiplier = (double)(1L << PyLong_SHIFT);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000696 Py_ssize_t i;
697 int sign;
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000698 int nbitsneeded;
699
700 if (vv == NULL || !PyLong_Check(vv)) {
701 PyErr_BadInternalCall();
702 return -1;
703 }
704 v = (PyLongObject *)vv;
Christian Heimese93237d2007-12-19 02:37:44 +0000705 i = Py_SIZE(v);
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000706 sign = 1;
707 if (i < 0) {
708 sign = -1;
709 i = -(i);
710 }
711 else if (i == 0) {
712 *exponent = 0;
713 return 0.0;
714 }
715 --i;
716 x = (double)v->ob_digit[i];
717 nbitsneeded = NBITS_WANTED - 1;
718 /* Invariant: i Python digits remain unaccounted for. */
719 while (i > 0 && nbitsneeded > 0) {
720 --i;
721 x = x * multiplier + (double)v->ob_digit[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000722 nbitsneeded -= PyLong_SHIFT;
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000723 }
724 /* There are i digits we didn't shift in. Pretending they're all
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000725 zeroes, the true value is x * 2**(i*PyLong_SHIFT). */
Tim Petersa1c1b0f2001-09-04 02:50:49 +0000726 *exponent = i;
727 assert(x > 0.0);
728 return x * sign;
729#undef NBITS_WANTED
730}
731
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000732/* Get a C double from a long int object. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000733
734double
Tim Peters9f688bf2000-07-07 15:53:28 +0000735PyLong_AsDouble(PyObject *vv)
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000736{
Thomas Wouters553489a2006-02-01 21:32:04 +0000737 int e = -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000738 double x;
Tim Peters9fffa3e2001-09-04 05:14:19 +0000739
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000740 if (vv == NULL || !PyLong_Check(vv)) {
741 PyErr_BadInternalCall();
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000742 return -1;
743 }
Tim Peters9fffa3e2001-09-04 05:14:19 +0000744 x = _PyLong_AsScaledDouble(vv, &e);
745 if (x == -1.0 && PyErr_Occurred())
746 return -1.0;
Thomas Wouters553489a2006-02-01 21:32:04 +0000747 /* 'e' initialized to -1 to silence gcc-4.0.x, but it should be
748 set correctly after a successful _PyLong_AsScaledDouble() call */
749 assert(e >= 0);
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000750 if (e > INT_MAX / PyLong_SHIFT)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000751 goto overflow;
752 errno = 0;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000753 x = ldexp(x, e * PyLong_SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +0000754 if (Py_OVERFLOWED(x))
Tim Peters9fffa3e2001-09-04 05:14:19 +0000755 goto overflow;
756 return x;
757
758overflow:
759 PyErr_SetString(PyExc_OverflowError,
760 "long int too large to convert to float");
761 return -1.0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +0000762}
763
Guido van Rossum78694d91998-09-18 14:14:13 +0000764/* Create a new long (or int) object from a C pointer */
765
766PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +0000767PyLong_FromVoidPtr(void *p)
Guido van Rossum78694d91998-09-18 14:14:13 +0000768{
Tim Peters70128a12001-06-16 08:48:40 +0000769#if SIZEOF_VOID_P <= SIZEOF_LONG
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000770 if ((long)p < 0)
771 return PyLong_FromUnsignedLong((unsigned long)p);
Guido van Rossum78694d91998-09-18 14:14:13 +0000772 return PyInt_FromLong((long)p);
773#else
Guido van Rossum78694d91998-09-18 14:14:13 +0000774
Tim Peters70128a12001-06-16 08:48:40 +0000775#ifndef HAVE_LONG_LONG
776# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
777#endif
778#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000779# error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000780#endif
781 /* optimize null pointers */
782 if (p == NULL)
783 return PyInt_FromLong(0);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000784 return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)p);
Tim Peters70128a12001-06-16 08:48:40 +0000785
786#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000787}
788
789/* Get a C pointer from a long object (or an int object in some cases) */
790
791void *
Tim Peters9f688bf2000-07-07 15:53:28 +0000792PyLong_AsVoidPtr(PyObject *vv)
Guido van Rossum78694d91998-09-18 14:14:13 +0000793{
794 /* This function will allow int or long objects. If vv is neither,
795 then the PyLong_AsLong*() functions will raise the exception:
796 PyExc_SystemError, "bad argument to internal function"
797 */
Tim Peters70128a12001-06-16 08:48:40 +0000798#if SIZEOF_VOID_P <= SIZEOF_LONG
Guido van Rossum78694d91998-09-18 14:14:13 +0000799 long x;
800
Tim Peters70128a12001-06-16 08:48:40 +0000801 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000802 x = PyInt_AS_LONG(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000803 else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
Guido van Rossum78694d91998-09-18 14:14:13 +0000804 x = PyLong_AsLong(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000805 else
806 x = PyLong_AsUnsignedLong(vv);
Guido van Rossum78694d91998-09-18 14:14:13 +0000807#else
Tim Peters70128a12001-06-16 08:48:40 +0000808
809#ifndef HAVE_LONG_LONG
810# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
811#endif
812#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000813# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
Tim Peters70128a12001-06-16 08:48:40 +0000814#endif
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000815 PY_LONG_LONG x;
Guido van Rossum78694d91998-09-18 14:14:13 +0000816
Tim Peters70128a12001-06-16 08:48:40 +0000817 if (PyInt_Check(vv))
Guido van Rossum78694d91998-09-18 14:14:13 +0000818 x = PyInt_AS_LONG(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000819 else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
Guido van Rossum78694d91998-09-18 14:14:13 +0000820 x = PyLong_AsLongLong(vv);
Martin v. Löwis0bc2ab92006-04-10 20:28:17 +0000821 else
822 x = PyLong_AsUnsignedLongLong(vv);
Tim Peters70128a12001-06-16 08:48:40 +0000823
824#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
Guido van Rossum78694d91998-09-18 14:14:13 +0000825
826 if (x == -1 && PyErr_Occurred())
827 return NULL;
828 return (void *)x;
829}
830
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000831#ifdef HAVE_LONG_LONG
Tim Petersd1a7da62001-06-13 00:35:57 +0000832
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000833/* Initial PY_LONG_LONG support by Chris Herborth (chrish@qnx.com), later
Tim Petersd1a7da62001-06-13 00:35:57 +0000834 * rewritten to use the newer PyLong_{As,From}ByteArray API.
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000835 */
836
Tim Peterscf37dfc2001-06-14 18:42:50 +0000837#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
Tim Petersd1a7da62001-06-13 00:35:57 +0000838
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000839/* Create a new long int object from a C PY_LONG_LONG int. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000840
841PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000842PyLong_FromLongLong(PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000843{
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000844 PyLongObject *v;
Mark Dickinson27a63252008-04-15 20:51:18 +0000845 unsigned PY_LONG_LONG abs_ival;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000846 unsigned PY_LONG_LONG t; /* unsigned so >> doesn't propagate sign bit */
847 int ndigits = 0;
848 int negative = 0;
849
850 if (ival < 0) {
Mark Dickinson27a63252008-04-15 20:51:18 +0000851 /* avoid signed overflow on negation; see comments
852 in PyLong_FromLong above. */
853 abs_ival = (unsigned PY_LONG_LONG)(-1-ival) + 1;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000854 negative = 1;
855 }
Mark Dickinson27a63252008-04-15 20:51:18 +0000856 else {
857 abs_ival = (unsigned PY_LONG_LONG)ival;
858 }
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000859
860 /* Count the number of Python digits.
861 We used to pick 5 ("big enough for anything"), but that's a
862 waste of time and space given that 5*15 = 75 bits are rarely
863 needed. */
Mark Dickinson27a63252008-04-15 20:51:18 +0000864 t = abs_ival;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000865 while (t) {
866 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000867 t >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000868 }
869 v = _PyLong_New(ndigits);
870 if (v != NULL) {
871 digit *p = v->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +0000872 Py_SIZE(v) = negative ? -ndigits : ndigits;
Mark Dickinson27a63252008-04-15 20:51:18 +0000873 t = abs_ival;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000874 while (t) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000875 *p++ = (digit)(t & PyLong_MASK);
876 t >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000877 }
878 }
879 return (PyObject *)v;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000880}
881
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000882/* Create a new long int object from a C unsigned PY_LONG_LONG int. */
Tim Petersd1a7da62001-06-13 00:35:57 +0000883
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000884PyObject *
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000885PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG ival)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000886{
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000887 PyLongObject *v;
888 unsigned PY_LONG_LONG t;
889 int ndigits = 0;
890
891 /* Count the number of Python digits. */
892 t = (unsigned PY_LONG_LONG)ival;
893 while (t) {
894 ++ndigits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000895 t >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000896 }
897 v = _PyLong_New(ndigits);
898 if (v != NULL) {
899 digit *p = v->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +0000900 Py_SIZE(v) = ndigits;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000901 while (ival) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000902 *p++ = (digit)(ival & PyLong_MASK);
903 ival >>= PyLong_SHIFT;
Bob Ippolitoa85bf202006-05-25 18:20:23 +0000904 }
905 }
906 return (PyObject *)v;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000907}
908
Martin v. Löwis18e16552006-02-15 17:27:45 +0000909/* Create a new long int object from a C Py_ssize_t. */
910
911PyObject *
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000912PyLong_FromSsize_t(Py_ssize_t ival)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000913{
914 Py_ssize_t bytes = ival;
915 int one = 1;
916 return _PyLong_FromByteArray(
917 (unsigned char *)&bytes,
Kristján Valur Jónssonf0303942007-05-03 20:27:03 +0000918 SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 1);
Martin v. Löwis18e16552006-02-15 17:27:45 +0000919}
920
921/* Create a new long int object from a C size_t. */
922
923PyObject *
Christian Heimes7f39c9f2008-01-25 12:18:43 +0000924PyLong_FromSize_t(size_t ival)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000925{
926 size_t bytes = ival;
927 int one = 1;
928 return _PyLong_FromByteArray(
929 (unsigned char *)&bytes,
930 SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0);
931}
932
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000933/* Get a C PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000934 Return -1 and set an error if overflow occurs. */
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000935
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000936PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000937PyLong_AsLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000938{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000939 PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +0000940 int one = 1;
941 int res;
942
Tim Petersd38b1c72001-09-30 05:09:37 +0000943 if (vv == NULL) {
944 PyErr_BadInternalCall();
945 return -1;
946 }
947 if (!PyLong_Check(vv)) {
Martin v. Löwis6ce7ed22005-03-03 12:26:35 +0000948 PyNumberMethods *nb;
949 PyObject *io;
Tim Petersd38b1c72001-09-30 05:09:37 +0000950 if (PyInt_Check(vv))
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000951 return (PY_LONG_LONG)PyInt_AsLong(vv);
Martin v. Löwis6ce7ed22005-03-03 12:26:35 +0000952 if ((nb = vv->ob_type->tp_as_number) == NULL ||
953 nb->nb_int == NULL) {
954 PyErr_SetString(PyExc_TypeError, "an integer is required");
955 return -1;
956 }
957 io = (*nb->nb_int) (vv);
958 if (io == NULL)
959 return -1;
960 if (PyInt_Check(io)) {
961 bytes = PyInt_AsLong(io);
962 Py_DECREF(io);
963 return bytes;
964 }
965 if (PyLong_Check(io)) {
966 bytes = PyLong_AsLongLong(io);
967 Py_DECREF(io);
968 return bytes;
969 }
970 Py_DECREF(io);
971 PyErr_SetString(PyExc_TypeError, "integer conversion failed");
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000972 return -1;
973 }
974
Tim Petersd1a7da62001-06-13 00:35:57 +0000975 res = _PyLong_AsByteArray(
976 (PyLongObject *)vv, (unsigned char *)&bytes,
977 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000978
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000979 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000980 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000981 return (PY_LONG_LONG)-1;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +0000982 else
983 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000984}
985
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000986/* Get a C unsigned PY_LONG_LONG int from a long int object.
Tim Petersd1a7da62001-06-13 00:35:57 +0000987 Return -1 and set an error if overflow occurs. */
988
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000989unsigned PY_LONG_LONG
Tim Peters9f688bf2000-07-07 15:53:28 +0000990PyLong_AsUnsignedLongLong(PyObject *vv)
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000991{
Martin v. Löwisb9a0f912003-03-29 10:06:18 +0000992 unsigned PY_LONG_LONG bytes;
Tim Petersd1a7da62001-06-13 00:35:57 +0000993 int one = 1;
994 int res;
995
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000996 if (vv == NULL || !PyLong_Check(vv)) {
997 PyErr_BadInternalCall();
Skip Montanaro429433b2006-04-18 00:35:43 +0000998 return (unsigned PY_LONG_LONG)-1;
Guido van Rossum1a8791e1998-08-04 22:46:29 +0000999 }
1000
Tim Petersd1a7da62001-06-13 00:35:57 +00001001 res = _PyLong_AsByteArray(
1002 (PyLongObject *)vv, (unsigned char *)&bytes,
1003 SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001004
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001005 /* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +00001006 if (res < 0)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001007 return (unsigned PY_LONG_LONG)res;
Martin v. Löwisc8bb9eb2002-03-09 12:02:59 +00001008 else
1009 return bytes;
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001010}
Tim Petersd1a7da62001-06-13 00:35:57 +00001011
Thomas Hellera4ea6032003-04-17 18:55:45 +00001012/* Get a C unsigned long int from a long int object, ignoring the high bits.
1013 Returns -1 and sets an error condition if an error occurs. */
1014
1015unsigned PY_LONG_LONG
1016PyLong_AsUnsignedLongLongMask(PyObject *vv)
1017{
1018 register PyLongObject *v;
1019 unsigned PY_LONG_LONG x;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001020 Py_ssize_t i;
1021 int sign;
Thomas Hellera4ea6032003-04-17 18:55:45 +00001022
1023 if (vv == NULL || !PyLong_Check(vv)) {
1024 PyErr_BadInternalCall();
1025 return (unsigned long) -1;
1026 }
1027 v = (PyLongObject *)vv;
1028 i = v->ob_size;
1029 sign = 1;
1030 x = 0;
1031 if (i < 0) {
1032 sign = -1;
1033 i = -i;
1034 }
1035 while (--i >= 0) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001036 x = (x << PyLong_SHIFT) + v->ob_digit[i];
Thomas Hellera4ea6032003-04-17 18:55:45 +00001037 }
1038 return x * sign;
1039}
Tim Petersd1a7da62001-06-13 00:35:57 +00001040#undef IS_LITTLE_ENDIAN
1041
Guido van Rossum1a8791e1998-08-04 22:46:29 +00001042#endif /* HAVE_LONG_LONG */
1043
Neil Schemenauerba872e22001-01-04 01:46:03 +00001044
1045static int
1046convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00001047 if (PyLong_Check(v)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001048 *a = (PyLongObject *) v;
1049 Py_INCREF(v);
1050 }
1051 else if (PyInt_Check(v)) {
1052 *a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
1053 }
1054 else {
1055 return 0;
1056 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001057 if (PyLong_Check(w)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00001058 *b = (PyLongObject *) w;
1059 Py_INCREF(w);
1060 }
1061 else if (PyInt_Check(w)) {
1062 *b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
1063 }
1064 else {
1065 Py_DECREF(*a);
1066 return 0;
1067 }
1068 return 1;
1069}
1070
1071#define CONVERT_BINOP(v, w, a, b) \
1072 if (!convert_binop(v, w, a, b)) { \
1073 Py_INCREF(Py_NotImplemented); \
1074 return Py_NotImplemented; \
1075 }
1076
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001077/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
1078 2**k if d is nonzero, else 0. */
1079
1080static const unsigned char BitLengthTable[32] = {
1081 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
1082 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
1083};
1084
1085static int
1086bits_in_digit(digit d)
1087{
1088 int d_bits = 0;
1089 while (d >= 32) {
1090 d_bits += 6;
1091 d >>= 6;
1092 }
1093 d_bits += (int)BitLengthTable[d];
1094 return d_bits;
1095}
1096
Tim Peters877a2122002-08-12 05:09:36 +00001097/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
1098 * is modified in place, by adding y to it. Carries are propagated as far as
1099 * x[m-1], and the remaining carry (0 or 1) is returned.
1100 */
1101static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001102v_iadd(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
Tim Peters877a2122002-08-12 05:09:36 +00001103{
Mark Dickinsonff84aa82009-01-24 15:27:44 +00001104 Py_ssize_t i;
Tim Peters877a2122002-08-12 05:09:36 +00001105 digit carry = 0;
1106
1107 assert(m >= n);
1108 for (i = 0; i < n; ++i) {
1109 carry += x[i] + y[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001110 x[i] = carry & PyLong_MASK;
1111 carry >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001112 assert((carry & 1) == carry);
1113 }
1114 for (; carry && i < m; ++i) {
1115 carry += x[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001116 x[i] = carry & PyLong_MASK;
1117 carry >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001118 assert((carry & 1) == carry);
1119 }
1120 return carry;
1121}
1122
1123/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
1124 * is modified in place, by subtracting y from it. Borrows are propagated as
1125 * far as x[m-1], and the remaining borrow (0 or 1) is returned.
1126 */
1127static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001128v_isub(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
Tim Peters877a2122002-08-12 05:09:36 +00001129{
Mark Dickinsonff84aa82009-01-24 15:27:44 +00001130 Py_ssize_t i;
Tim Peters877a2122002-08-12 05:09:36 +00001131 digit borrow = 0;
1132
1133 assert(m >= n);
1134 for (i = 0; i < n; ++i) {
1135 borrow = x[i] - y[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001136 x[i] = borrow & PyLong_MASK;
1137 borrow >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001138 borrow &= 1; /* keep only 1 sign bit */
1139 }
1140 for (; borrow && i < m; ++i) {
1141 borrow = x[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001142 x[i] = borrow & PyLong_MASK;
1143 borrow >>= PyLong_SHIFT;
Tim Peters877a2122002-08-12 05:09:36 +00001144 borrow &= 1;
1145 }
1146 return borrow;
1147}
Neil Schemenauerba872e22001-01-04 01:46:03 +00001148
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001149/* Shift digit vector a[0:m] d bits left, with 0 <= d < PyLong_SHIFT. Put
1150 * result in z[0:m], and return the d bits shifted out of the top.
1151 */
1152static digit
1153v_lshift(digit *z, digit *a, Py_ssize_t m, int d)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001154{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001155 Py_ssize_t i;
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001156 digit carry = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001157
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001158 assert(0 <= d && d < PyLong_SHIFT);
1159 for (i=0; i < m; i++) {
1160 twodigits acc = (twodigits)a[i] << d | carry;
1161 z[i] = (digit)acc & PyLong_MASK;
1162 carry = (digit)(acc >> PyLong_SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001163 }
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001164 return carry;
1165}
1166
1167/* Shift digit vector a[0:m] d bits right, with 0 <= d < PyLong_SHIFT. Put
1168 * result in z[0:m], and return the d bits shifted out of the bottom.
1169 */
1170static digit
1171v_rshift(digit *z, digit *a, Py_ssize_t m, int d)
1172{
1173 Py_ssize_t i;
1174 digit carry = 0;
1175 digit mask = ((digit)1 << d) - 1U;
1176
1177 assert(0 <= d && d < PyLong_SHIFT);
1178 for (i=m; i-- > 0;) {
1179 twodigits acc = (twodigits)carry << PyLong_SHIFT | a[i];
1180 carry = (digit)acc & mask;
1181 z[i] = (digit)(acc >> d);
1182 }
1183 return carry;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001184}
1185
Tim Peters212e6142001-07-14 12:23:19 +00001186/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
1187 in pout, and returning the remainder. pin and pout point at the LSD.
1188 It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
Eric Smith5e527eb2008-02-10 01:36:53 +00001189 _PyLong_Format, but that should be done with great care since longs are
Tim Peters212e6142001-07-14 12:23:19 +00001190 immutable. */
1191
1192static digit
Martin v. Löwis18e16552006-02-15 17:27:45 +00001193inplace_divrem1(digit *pout, digit *pin, Py_ssize_t size, digit n)
Tim Peters212e6142001-07-14 12:23:19 +00001194{
1195 twodigits rem = 0;
1196
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001197 assert(n > 0 && n <= PyLong_MASK);
Tim Peters212e6142001-07-14 12:23:19 +00001198 pin += size;
1199 pout += size;
1200 while (--size >= 0) {
1201 digit hi;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001202 rem = (rem << PyLong_SHIFT) + *--pin;
Tim Peters212e6142001-07-14 12:23:19 +00001203 *--pout = hi = (digit)(rem / n);
Mark Dickinsonff84aa82009-01-24 15:27:44 +00001204 rem -= (twodigits)hi * n;
Tim Peters212e6142001-07-14 12:23:19 +00001205 }
1206 return (digit)rem;
1207}
1208
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001209/* Divide a long integer by a digit, returning both the quotient
1210 (as function result) and the remainder (through *prem).
1211 The sign of a is ignored; n should not be zero. */
1212
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001213static PyLongObject *
Tim Peters212e6142001-07-14 12:23:19 +00001214divrem1(PyLongObject *a, digit n, digit *prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001215{
Christian Heimese93237d2007-12-19 02:37:44 +00001216 const Py_ssize_t size = ABS(Py_SIZE(a));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001217 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001218
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001219 assert(n > 0 && n <= PyLong_MASK);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001220 z = _PyLong_New(size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001221 if (z == NULL)
1222 return NULL;
Tim Peters212e6142001-07-14 12:23:19 +00001223 *prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001224 return long_normalize(z);
1225}
1226
Eric Smith5e527eb2008-02-10 01:36:53 +00001227/* Convert the long to a string object with given base,
1228 appending a base prefix of 0[box] if base is 2, 8 or 16.
1229 Add a trailing "L" if addL is non-zero.
1230 If newstyle is zero, then use the pre-2.6 behavior of octal having
1231 a leading "0", instead of the prefix "0o" */
1232PyAPI_FUNC(PyObject *)
1233_PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001234{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001235 register PyLongObject *a = (PyLongObject *)aa;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001236 PyStringObject *str;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001237 Py_ssize_t i, j, sz;
Neal Norwitzc09efa82006-07-23 07:53:14 +00001238 Py_ssize_t size_a;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001239 char *p;
1240 int bits;
1241 char sign = '\0';
Guido van Rossume32e0141992-01-19 16:31:05 +00001242
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001243 if (a == NULL || !PyLong_Check(a)) {
1244 PyErr_BadInternalCall();
Guido van Rossume32e0141992-01-19 16:31:05 +00001245 return NULL;
1246 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001247 assert(base >= 2 && base <= 36);
Christian Heimese93237d2007-12-19 02:37:44 +00001248 size_a = ABS(Py_SIZE(a));
Tim Peters5af4e6c2002-08-12 02:31:19 +00001249
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001250 /* Compute a rough upper bound for the length of the string */
1251 i = base;
1252 bits = 0;
1253 while (i > 1) {
1254 ++bits;
1255 i >>= 1;
1256 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001257 i = 5 + (addL ? 1 : 0);
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001258 j = size_a*PyLong_SHIFT + bits-1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001259 sz = i + j / bits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001260 if (j / PyLong_SHIFT < size_a || sz < i) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00001261 PyErr_SetString(PyExc_OverflowError,
1262 "long is too large to format");
1263 return NULL;
1264 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001265 str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001266 if (str == NULL)
1267 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001268 p = PyString_AS_STRING(str) + sz;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001269 *p = '\0';
Fred Drake121ee271999-12-23 15:41:28 +00001270 if (addL)
1271 *--p = 'L';
Guido van Rossum4c260ff1992-01-14 18:36:43 +00001272 if (a->ob_size < 0)
1273 sign = '-';
Tim Peters5af4e6c2002-08-12 02:31:19 +00001274
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001275 if (a->ob_size == 0) {
1276 *--p = '0';
1277 }
1278 else if ((base & (base - 1)) == 0) {
1279 /* JRH: special case for power-of-2 bases */
Tim Peters586b2e32001-07-15 09:11:14 +00001280 twodigits accum = 0;
1281 int accumbits = 0; /* # of bits in accum */
1282 int basebits = 1; /* # of bits in base-1 */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001283 i = base;
Tim Peters7d3a5112000-07-08 04:17:21 +00001284 while ((i >>= 1) > 1)
1285 ++basebits;
Tim Peters586b2e32001-07-15 09:11:14 +00001286
1287 for (i = 0; i < size_a; ++i) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00001288 accum |= (twodigits)a->ob_digit[i] << accumbits;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001289 accumbits += PyLong_SHIFT;
Tim Peters586b2e32001-07-15 09:11:14 +00001290 assert(accumbits >= basebits);
1291 do {
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001292 char cdigit = (char)(accum & (base - 1));
Raymond Hettinger3296e692005-06-29 23:29:56 +00001293 cdigit += (cdigit < 10) ? '0' : 'a'-10;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001294 assert(p > PyString_AS_STRING(str));
Martin v. Löwisa5854c22002-02-16 23:39:10 +00001295 *--p = cdigit;
Tim Peters586b2e32001-07-15 09:11:14 +00001296 accumbits -= basebits;
1297 accum >>= basebits;
1298 } while (i < size_a-1 ? accumbits >= basebits :
1299 accum > 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001300 }
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001301 }
1302 else {
Tim Petersfad225f2001-07-13 02:59:26 +00001303 /* Not 0, and base not a power of 2. Divide repeatedly by
1304 base, but for speed use the highest power of base that
1305 fits in a digit. */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001306 Py_ssize_t size = size_a;
Tim Peters212e6142001-07-14 12:23:19 +00001307 digit *pin = a->ob_digit;
1308 PyLongObject *scratch;
1309 /* powbasw <- largest power of base that fits in a digit. */
Tim Petersfad225f2001-07-13 02:59:26 +00001310 digit powbase = base; /* powbase == base ** power */
1311 int power = 1;
1312 for (;;) {
Mark Dickinsonb6464872009-02-25 20:29:50 +00001313 twodigits newpow = powbase * (twodigits)base;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001314 if (newpow >> PyLong_SHIFT) /* doesn't fit in a digit */
Tim Petersfad225f2001-07-13 02:59:26 +00001315 break;
1316 powbase = (digit)newpow;
1317 ++power;
1318 }
Tim Peters212e6142001-07-14 12:23:19 +00001319
1320 /* Get a scratch area for repeated division. */
1321 scratch = _PyLong_New(size);
1322 if (scratch == NULL) {
1323 Py_DECREF(str);
1324 return NULL;
1325 }
1326
1327 /* Repeatedly divide by powbase. */
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001328 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001329 int ntostore = power;
Tim Peters212e6142001-07-14 12:23:19 +00001330 digit rem = inplace_divrem1(scratch->ob_digit,
1331 pin, size, powbase);
1332 pin = scratch->ob_digit; /* no need to use a again */
1333 if (pin[size - 1] == 0)
1334 --size;
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001335 SIGCHECK({
Tim Peters212e6142001-07-14 12:23:19 +00001336 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001337 Py_DECREF(str);
1338 return NULL;
1339 })
Tim Peters212e6142001-07-14 12:23:19 +00001340
1341 /* Break rem into digits. */
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001342 assert(ntostore > 0);
1343 do {
Tim Petersfad225f2001-07-13 02:59:26 +00001344 digit nextrem = (digit)(rem / base);
1345 char c = (char)(rem - nextrem * base);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001346 assert(p > PyString_AS_STRING(str));
Raymond Hettinger3296e692005-06-29 23:29:56 +00001347 c += (c < 10) ? '0' : 'a'-10;
Tim Petersfad225f2001-07-13 02:59:26 +00001348 *--p = c;
1349 rem = nextrem;
Tim Petersc8a6b9b2001-07-14 11:01:28 +00001350 --ntostore;
1351 /* Termination is a bit delicate: must not
1352 store leading zeroes, so must get out if
Tim Peters212e6142001-07-14 12:23:19 +00001353 remaining quotient and rem are both 0. */
1354 } while (ntostore && (size || rem));
1355 } while (size != 0);
1356 Py_DECREF(scratch);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001357 }
1358
Eric Smith5e527eb2008-02-10 01:36:53 +00001359 if (base == 2) {
1360 *--p = 'b';
1361 *--p = '0';
1362 }
1363 else if (base == 8) {
1364 if (newstyle) {
1365 *--p = 'o';
Guido van Rossum2c475421992-08-14 15:13:07 +00001366 *--p = '0';
Eric Smith5e527eb2008-02-10 01:36:53 +00001367 }
1368 else
1369 if (size_a != 0)
1370 *--p = '0';
Guido van Rossum2c475421992-08-14 15:13:07 +00001371 }
Guido van Rossum3d3037d1991-10-24 14:55:57 +00001372 else if (base == 16) {
1373 *--p = 'x';
1374 *--p = '0';
1375 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00001376 else if (base != 10) {
1377 *--p = '#';
1378 *--p = '0' + base%10;
1379 if (base > 10)
1380 *--p = '0' + base/10;
1381 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001382 if (sign)
1383 *--p = sign;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001384 if (p != PyString_AS_STRING(str)) {
1385 char *q = PyString_AS_STRING(str);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001386 assert(p > q);
1387 do {
1388 } while ((*q++ = *p++) != '\0');
Guido van Rossumc7ec9c91991-05-28 21:58:16 +00001389 q--;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001390 _PyString_Resize((PyObject **)&str,
1391 (Py_ssize_t) (q - PyString_AS_STRING(str)));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001392 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001393 return (PyObject *)str;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001394}
1395
Tim Petersda53afa2006-05-25 17:34:03 +00001396/* Table of digit values for 8-bit string -> integer conversion.
1397 * '0' maps to 0, ..., '9' maps to 9.
1398 * 'a' and 'A' map to 10, ..., 'z' and 'Z' map to 35.
1399 * All other indices map to 37.
1400 * Note that when converting a base B string, a char c is a legitimate
1401 * base B digit iff _PyLong_DigitValue[Py_CHARMASK(c)] < B.
1402 */
1403int _PyLong_DigitValue[256] = {
Tim Peters696cf432006-05-24 21:10:40 +00001404 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1405 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1406 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1407 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 37, 37, 37, 37, 37, 37,
1408 37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1409 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
1410 37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
1411 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
1412 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1413 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1414 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1415 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1416 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1417 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1418 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
1419 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
Tim Peters696cf432006-05-24 21:10:40 +00001420};
1421
1422/* *str points to the first digit in a string of base `base` digits. base
Tim Petersbf2674b2003-02-02 07:51:32 +00001423 * is a power of 2 (2, 4, 8, 16, or 32). *str is set to point to the first
1424 * non-digit (which may be *str!). A normalized long is returned.
1425 * The point to this routine is that it takes time linear in the number of
1426 * string characters.
1427 */
1428static PyLongObject *
1429long_from_binary_base(char **str, int base)
1430{
1431 char *p = *str;
1432 char *start = p;
1433 int bits_per_char;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001434 Py_ssize_t n;
Tim Petersbf2674b2003-02-02 07:51:32 +00001435 PyLongObject *z;
1436 twodigits accum;
1437 int bits_in_accum;
1438 digit *pdigit;
1439
1440 assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
1441 n = base;
1442 for (bits_per_char = -1; n; ++bits_per_char)
1443 n >>= 1;
1444 /* n <- total # of bits needed, while setting p to end-of-string */
1445 n = 0;
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001446 while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base)
Tim Petersbf2674b2003-02-02 07:51:32 +00001447 ++p;
Tim Petersbf2674b2003-02-02 07:51:32 +00001448 *str = p;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001449 /* n <- # of Python digits needed, = ceiling(n/PyLong_SHIFT). */
1450 n = (p - start) * bits_per_char + PyLong_SHIFT - 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001451 if (n / bits_per_char < p - start) {
Tim Peters1a3b19a2003-02-02 17:33:53 +00001452 PyErr_SetString(PyExc_ValueError,
1453 "long string too large to convert");
1454 return NULL;
1455 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001456 n = n / PyLong_SHIFT;
Tim Petersbf2674b2003-02-02 07:51:32 +00001457 z = _PyLong_New(n);
1458 if (z == NULL)
1459 return NULL;
1460 /* Read string from right, and fill in long from left; i.e.,
1461 * from least to most significant in both.
1462 */
1463 accum = 0;
1464 bits_in_accum = 0;
1465 pdigit = z->ob_digit;
1466 while (--p >= start) {
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001467 int k = _PyLong_DigitValue[Py_CHARMASK(*p)];
Tim Petersc7bc0b92003-05-05 20:39:43 +00001468 assert(k >= 0 && k < base);
Mark Dickinsonff84aa82009-01-24 15:27:44 +00001469 accum |= (twodigits)k << bits_in_accum;
Tim Petersbf2674b2003-02-02 07:51:32 +00001470 bits_in_accum += bits_per_char;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001471 if (bits_in_accum >= PyLong_SHIFT) {
1472 *pdigit++ = (digit)(accum & PyLong_MASK);
Mark Dickinsonff84aa82009-01-24 15:27:44 +00001473 assert(pdigit - z->ob_digit <= n);
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001474 accum >>= PyLong_SHIFT;
1475 bits_in_accum -= PyLong_SHIFT;
1476 assert(bits_in_accum < PyLong_SHIFT);
Tim Petersbf2674b2003-02-02 07:51:32 +00001477 }
1478 }
1479 if (bits_in_accum) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001480 assert(bits_in_accum <= PyLong_SHIFT);
Tim Petersbf2674b2003-02-02 07:51:32 +00001481 *pdigit++ = (digit)accum;
Mark Dickinsonff84aa82009-01-24 15:27:44 +00001482 assert(pdigit - z->ob_digit <= n);
Tim Petersbf2674b2003-02-02 07:51:32 +00001483 }
1484 while (pdigit - z->ob_digit < n)
1485 *pdigit++ = 0;
1486 return long_normalize(z);
1487}
1488
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001489PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001490PyLong_FromString(char *str, char **pend, int base)
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001491{
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001492 int sign = 1;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001493 char *start, *orig_str = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001494 PyLongObject *z;
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001495 PyObject *strobj, *strrepr;
1496 Py_ssize_t slen;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001497
Guido van Rossum472c04f1996-12-05 21:57:21 +00001498 if ((base != 0 && base < 2) || base > 36) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001499 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001500 "long() arg 2 must be >= 2 and <= 36");
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001501 return NULL;
1502 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001503 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001504 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001505 if (*str == '+')
1506 ++str;
1507 else if (*str == '-') {
1508 ++str;
1509 sign = -1;
1510 }
Guido van Rossum9fa2c111995-02-10 17:00:37 +00001511 while (*str != '\0' && isspace(Py_CHARMASK(*str)))
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001512 str++;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001513 if (base == 0) {
Eric Smith9ff19b52008-03-17 17:32:20 +00001514 /* No base given. Deduce the base from the contents
1515 of the string */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001516 if (str[0] != '0')
1517 base = 10;
1518 else if (str[1] == 'x' || str[1] == 'X')
1519 base = 16;
Eric Smith9ff19b52008-03-17 17:32:20 +00001520 else if (str[1] == 'o' || str[1] == 'O')
1521 base = 8;
1522 else if (str[1] == 'b' || str[1] == 'B')
1523 base = 2;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001524 else
Eric Smith9ff19b52008-03-17 17:32:20 +00001525 /* "old" (C-style) octal literal, still valid in
1526 2.x, although illegal in 3.x */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001527 base = 8;
1528 }
Eric Smith9ff19b52008-03-17 17:32:20 +00001529 /* Whether or not we were deducing the base, skip leading chars
1530 as needed */
1531 if (str[0] == '0' &&
1532 ((base == 16 && (str[1] == 'x' || str[1] == 'X')) ||
1533 (base == 8 && (str[1] == 'o' || str[1] == 'O')) ||
1534 (base == 2 && (str[1] == 'b' || str[1] == 'B'))))
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001535 str += 2;
Tim Peters696cf432006-05-24 21:10:40 +00001536
Guido van Rossume6762971998-06-22 03:54:46 +00001537 start = str;
Tim Petersbf2674b2003-02-02 07:51:32 +00001538 if ((base & (base - 1)) == 0)
1539 z = long_from_binary_base(&str, base);
1540 else {
Tim Peters696cf432006-05-24 21:10:40 +00001541/***
1542Binary bases can be converted in time linear in the number of digits, because
1543Python's representation base is binary. Other bases (including decimal!) use
1544the simple quadratic-time algorithm below, complicated by some speed tricks.
Tim Peters5af4e6c2002-08-12 02:31:19 +00001545
Tim Peters696cf432006-05-24 21:10:40 +00001546First some math: the largest integer that can be expressed in N base-B digits
1547is B**N-1. Consequently, if we have an N-digit input in base B, the worst-
1548case number of Python digits needed to hold it is the smallest integer n s.t.
1549
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001550 PyLong_BASE**n-1 >= B**N-1 [or, adding 1 to both sides]
1551 PyLong_BASE**n >= B**N [taking logs to base PyLong_BASE]
1552 n >= log(B**N)/log(PyLong_BASE) = N * log(B)/log(PyLong_BASE)
Tim Peters696cf432006-05-24 21:10:40 +00001553
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001554The static array log_base_PyLong_BASE[base] == log(base)/log(PyLong_BASE) so we can compute
Tim Peters696cf432006-05-24 21:10:40 +00001555this quickly. A Python long with that much space is reserved near the start,
1556and the result is computed into it.
1557
1558The input string is actually treated as being in base base**i (i.e., i digits
1559are processed at a time), where two more static arrays hold:
1560
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001561 convwidth_base[base] = the largest integer i such that base**i <= PyLong_BASE
Tim Peters696cf432006-05-24 21:10:40 +00001562 convmultmax_base[base] = base ** convwidth_base[base]
1563
1564The first of these is the largest i such that i consecutive input digits
1565must fit in a single Python digit. The second is effectively the input
1566base we're really using.
1567
1568Viewing the input as a sequence <c0, c1, ..., c_n-1> of digits in base
1569convmultmax_base[base], the result is "simply"
1570
1571 (((c0*B + c1)*B + c2)*B + c3)*B + ... ))) + c_n-1
1572
1573where B = convmultmax_base[base].
Tim Peters9faa3ed2006-05-30 15:53:34 +00001574
1575Error analysis: as above, the number of Python digits `n` needed is worst-
1576case
1577
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001578 n >= N * log(B)/log(PyLong_BASE)
Tim Peters9faa3ed2006-05-30 15:53:34 +00001579
1580where `N` is the number of input digits in base `B`. This is computed via
1581
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001582 size_z = (Py_ssize_t)((scan - str) * log_base_PyLong_BASE[base]) + 1;
Tim Peters9faa3ed2006-05-30 15:53:34 +00001583
1584below. Two numeric concerns are how much space this can waste, and whether
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001585the computed result can be too small. To be concrete, assume PyLong_BASE = 2**15,
Tim Peters9faa3ed2006-05-30 15:53:34 +00001586which is the default (and it's unlikely anyone changes that).
1587
1588Waste isn't a problem: provided the first input digit isn't 0, the difference
1589between the worst-case input with N digits and the smallest input with N
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001590digits is about a factor of B, but B is small compared to PyLong_BASE so at most
Tim Peters9faa3ed2006-05-30 15:53:34 +00001591one allocated Python digit can remain unused on that count. If
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001592N*log(B)/log(PyLong_BASE) is mathematically an exact integer, then truncating that
Tim Peters9faa3ed2006-05-30 15:53:34 +00001593and adding 1 returns a result 1 larger than necessary. However, that can't
1594happen: whenever B is a power of 2, long_from_binary_base() is called
1595instead, and it's impossible for B**i to be an integer power of 2**15 when
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001596B is not a power of 2 (i.e., it's impossible for N*log(B)/log(PyLong_BASE) to be
Tim Peters9faa3ed2006-05-30 15:53:34 +00001597an exact integer when B is not a power of 2, since B**i has a prime factor
1598other than 2 in that case, but (2**15)**j's only prime factor is 2).
1599
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001600The computed result can be too small if the true value of N*log(B)/log(PyLong_BASE)
Tim Peters9faa3ed2006-05-30 15:53:34 +00001601is a little bit larger than an exact integer, but due to roundoff errors (in
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001602computing log(B), log(PyLong_BASE), their quotient, and/or multiplying that by N)
Tim Peters9faa3ed2006-05-30 15:53:34 +00001603yields a numeric result a little less than that integer. Unfortunately, "how
1604close can a transcendental function get to an integer over some range?"
1605questions are generally theoretically intractable. Computer analysis via
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001606continued fractions is practical: expand log(B)/log(PyLong_BASE) via continued
Tim Peters9faa3ed2006-05-30 15:53:34 +00001607fractions, giving a sequence i/j of "the best" rational approximations. Then
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001608j*log(B)/log(PyLong_BASE) is approximately equal to (the integer) i. This shows that
Tim Peters9faa3ed2006-05-30 15:53:34 +00001609we can get very close to being in trouble, but very rarely. For example,
161076573 is a denominator in one of the continued-fraction approximations to
1611log(10)/log(2**15), and indeed:
1612
1613 >>> log(10)/log(2**15)*76573
1614 16958.000000654003
1615
1616is very close to an integer. If we were working with IEEE single-precision,
1617rounding errors could kill us. Finding worst cases in IEEE double-precision
1618requires better-than-double-precision log() functions, and Tim didn't bother.
1619Instead the code checks to see whether the allocated space is enough as each
1620new Python digit is added, and copies the whole thing to a larger long if not.
1621This should happen extremely rarely, and in fact I don't have a test case
1622that triggers it(!). Instead the code was tested by artificially allocating
1623just 1 digit at the start, so that the copying code was exercised for every
1624digit beyond the first.
Tim Peters696cf432006-05-24 21:10:40 +00001625***/
1626 register twodigits c; /* current input character */
1627 Py_ssize_t size_z;
1628 int i;
1629 int convwidth;
1630 twodigits convmultmax, convmult;
1631 digit *pz, *pzstop;
1632 char* scan;
1633
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001634 static double log_base_PyLong_BASE[37] = {0.0e0,};
Tim Peters696cf432006-05-24 21:10:40 +00001635 static int convwidth_base[37] = {0,};
1636 static twodigits convmultmax_base[37] = {0,};
1637
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001638 if (log_base_PyLong_BASE[base] == 0.0) {
Tim Peters696cf432006-05-24 21:10:40 +00001639 twodigits convmax = base;
1640 int i = 1;
1641
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001642 log_base_PyLong_BASE[base] = log((double)base) /
1643 log((double)PyLong_BASE);
Tim Peters696cf432006-05-24 21:10:40 +00001644 for (;;) {
1645 twodigits next = convmax * base;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001646 if (next > PyLong_BASE)
Tim Peters696cf432006-05-24 21:10:40 +00001647 break;
1648 convmax = next;
1649 ++i;
1650 }
1651 convmultmax_base[base] = convmax;
1652 assert(i > 0);
1653 convwidth_base[base] = i;
1654 }
1655
1656 /* Find length of the string of numeric characters. */
1657 scan = str;
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001658 while (_PyLong_DigitValue[Py_CHARMASK(*scan)] < base)
Tim Peters696cf432006-05-24 21:10:40 +00001659 ++scan;
1660
1661 /* Create a long object that can contain the largest possible
1662 * integer with this base and length. Note that there's no
1663 * need to initialize z->ob_digit -- no slot is read up before
1664 * being stored into.
1665 */
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001666 size_z = (Py_ssize_t)((scan - str) * log_base_PyLong_BASE[base]) + 1;
Tim Peters9faa3ed2006-05-30 15:53:34 +00001667 /* Uncomment next line to test exceedingly rare copy code */
1668 /* size_z = 1; */
Tim Peters696cf432006-05-24 21:10:40 +00001669 assert(size_z > 0);
1670 z = _PyLong_New(size_z);
1671 if (z == NULL)
1672 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001673 Py_SIZE(z) = 0;
Tim Peters696cf432006-05-24 21:10:40 +00001674
1675 /* `convwidth` consecutive input digits are treated as a single
1676 * digit in base `convmultmax`.
1677 */
1678 convwidth = convwidth_base[base];
1679 convmultmax = convmultmax_base[base];
1680
1681 /* Work ;-) */
1682 while (str < scan) {
1683 /* grab up to convwidth digits from the input string */
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001684 c = (digit)_PyLong_DigitValue[Py_CHARMASK(*str++)];
Tim Peters696cf432006-05-24 21:10:40 +00001685 for (i = 1; i < convwidth && str != scan; ++i, ++str) {
1686 c = (twodigits)(c * base +
Neal Norwitzd183bdd2008-03-28 04:58:51 +00001687 _PyLong_DigitValue[Py_CHARMASK(*str)]);
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001688 assert(c < PyLong_BASE);
Tim Peters696cf432006-05-24 21:10:40 +00001689 }
1690
1691 convmult = convmultmax;
1692 /* Calculate the shift only if we couldn't get
1693 * convwidth digits.
1694 */
1695 if (i != convwidth) {
1696 convmult = base;
1697 for ( ; i > 1; --i)
1698 convmult *= base;
1699 }
1700
1701 /* Multiply z by convmult, and add c. */
1702 pz = z->ob_digit;
Christian Heimese93237d2007-12-19 02:37:44 +00001703 pzstop = pz + Py_SIZE(z);
Tim Peters696cf432006-05-24 21:10:40 +00001704 for (; pz < pzstop; ++pz) {
1705 c += (twodigits)*pz * convmult;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001706 *pz = (digit)(c & PyLong_MASK);
1707 c >>= PyLong_SHIFT;
Tim Peters696cf432006-05-24 21:10:40 +00001708 }
1709 /* carry off the current end? */
1710 if (c) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00001711 assert(c < PyLong_BASE);
Christian Heimese93237d2007-12-19 02:37:44 +00001712 if (Py_SIZE(z) < size_z) {
Tim Peters9faa3ed2006-05-30 15:53:34 +00001713 *pz = (digit)c;
Christian Heimese93237d2007-12-19 02:37:44 +00001714 ++Py_SIZE(z);
Tim Peters9faa3ed2006-05-30 15:53:34 +00001715 }
1716 else {
1717 PyLongObject *tmp;
1718 /* Extremely rare. Get more space. */
Christian Heimese93237d2007-12-19 02:37:44 +00001719 assert(Py_SIZE(z) == size_z);
Tim Peters9faa3ed2006-05-30 15:53:34 +00001720 tmp = _PyLong_New(size_z + 1);
1721 if (tmp == NULL) {
1722 Py_DECREF(z);
1723 return NULL;
1724 }
1725 memcpy(tmp->ob_digit,
1726 z->ob_digit,
1727 sizeof(digit) * size_z);
1728 Py_DECREF(z);
1729 z = tmp;
1730 z->ob_digit[size_z] = (digit)c;
1731 ++size_z;
1732 }
Tim Peters696cf432006-05-24 21:10:40 +00001733 }
Tim Petersbf2674b2003-02-02 07:51:32 +00001734 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001735 }
Guido van Rossumac6a37a1998-08-04 15:04:06 +00001736 if (z == NULL)
1737 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001738 if (str == start)
1739 goto onError;
Tim Peters696cf432006-05-24 21:10:40 +00001740 if (sign < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001741 Py_SIZE(z) = -(Py_SIZE(z));
Guido van Rossum9e896b32000-04-05 20:11:21 +00001742 if (*str == 'L' || *str == 'l')
1743 str++;
1744 while (*str && isspace(Py_CHARMASK(*str)))
1745 str++;
1746 if (*str != '\0')
1747 goto onError;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001748 if (pend)
1749 *pend = str;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001750 return (PyObject *) z;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001751
1752 onError:
Guido van Rossum9e896b32000-04-05 20:11:21 +00001753 Py_XDECREF(z);
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001754 slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001755 strobj = PyString_FromStringAndSize(orig_str, slen);
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001756 if (strobj == NULL)
1757 return NULL;
1758 strrepr = PyObject_Repr(strobj);
1759 Py_DECREF(strobj);
1760 if (strrepr == NULL)
1761 return NULL;
1762 PyErr_Format(PyExc_ValueError,
1763 "invalid literal for long() with base %d: %s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001764 base, PyString_AS_STRING(strrepr));
Thomas Wouters9cb28bea2006-04-11 23:50:33 +00001765 Py_DECREF(strrepr);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001766 return NULL;
1767}
1768
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001769#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001770PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001771PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001772{
Walter Dörwald07e14762002-11-06 16:15:14 +00001773 PyObject *result;
Anthony Baxter377be112006-04-11 06:54:30 +00001774 char *buffer = (char *)PyMem_MALLOC(length+1);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001775
Walter Dörwald07e14762002-11-06 16:15:14 +00001776 if (buffer == NULL)
1777 return NULL;
1778
1779 if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
1780 PyMem_FREE(buffer);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001781 return NULL;
1782 }
Walter Dörwald07e14762002-11-06 16:15:14 +00001783 result = PyLong_FromString(buffer, NULL, base);
1784 PyMem_FREE(buffer);
1785 return result;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001786}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001787#endif
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001788
Tim Peters9f688bf2000-07-07 15:53:28 +00001789/* forward */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001790static PyLongObject *x_divrem
Tim Peters9f688bf2000-07-07 15:53:28 +00001791 (PyLongObject *, PyLongObject *, PyLongObject **);
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00001792static PyObject *long_long(PyObject *v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001793
1794/* Long division with remainder, top-level routine */
1795
Guido van Rossume32e0141992-01-19 16:31:05 +00001796static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001797long_divrem(PyLongObject *a, PyLongObject *b,
1798 PyLongObject **pdiv, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001799{
Christian Heimese93237d2007-12-19 02:37:44 +00001800 Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001801 PyLongObject *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001802
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001803 if (size_b == 0) {
Guido van Rossumbd3a5271998-08-11 15:04:47 +00001804 PyErr_SetString(PyExc_ZeroDivisionError,
Fred Drake661ea262000-10-24 19:57:45 +00001805 "long division or modulo by zero");
Guido van Rossume32e0141992-01-19 16:31:05 +00001806 return -1;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001807 }
1808 if (size_a < size_b ||
Guido van Rossum472c04f1996-12-05 21:57:21 +00001809 (size_a == size_b &&
1810 a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001811 /* |a| < |b|. */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001812 *pdiv = _PyLong_New(0);
Georg Brandlc02e1312007-04-11 17:16:24 +00001813 if (*pdiv == NULL)
1814 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001815 Py_INCREF(a);
1816 *prem = (PyLongObject *) a;
Guido van Rossume32e0141992-01-19 16:31:05 +00001817 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001818 }
1819 if (size_b == 1) {
1820 digit rem = 0;
1821 z = divrem1(a, b->ob_digit[0], &rem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001822 if (z == NULL)
1823 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001824 *prem = (PyLongObject *) PyLong_FromLong((long)rem);
Georg Brandlc02e1312007-04-11 17:16:24 +00001825 if (*prem == NULL) {
1826 Py_DECREF(z);
1827 return -1;
1828 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001829 }
Guido van Rossume32e0141992-01-19 16:31:05 +00001830 else {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001831 z = x_divrem(a, b, prem);
Guido van Rossume32e0141992-01-19 16:31:05 +00001832 if (z == NULL)
1833 return -1;
1834 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001835 /* Set the signs.
1836 The quotient z has the sign of a*b;
1837 the remainder r has the sign of a,
1838 so a = b*z + r. */
Guido van Rossume32e0141992-01-19 16:31:05 +00001839 if ((a->ob_size < 0) != (b->ob_size < 0))
1840 z->ob_size = -(z->ob_size);
1841 if (a->ob_size < 0 && (*prem)->ob_size != 0)
1842 (*prem)->ob_size = -((*prem)->ob_size);
1843 *pdiv = z;
1844 return 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001845}
1846
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001847/* Unsigned long division with remainder -- the algorithm. The arguments v1
1848 and w1 should satisfy 2 <= ABS(Py_SIZE(w1)) <= ABS(Py_SIZE(v1)). */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001849
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001850static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001851x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001852{
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001853 PyLongObject *v, *w, *a;
1854 Py_ssize_t i, k, size_v, size_w;
1855 int d;
1856 digit wm1, wm2, carry, q, r, vtop, *v0, *vk, *w0, *ak;
1857 twodigits vv;
1858 sdigit zhi;
1859 stwodigits z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001860
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001861 /* We follow Knuth [The Art of Computer Programming, Vol. 2 (3rd
1862 edn.), section 4.3.1, Algorithm D], except that we don't explicitly
1863 handle the special case when the initial estimate q for a quotient
1864 digit is >= PyLong_BASE: the max value for q is PyLong_BASE+1, and
1865 that won't overflow a digit. */
1866
1867 /* allocate space; w will also be used to hold the final remainder */
1868 size_v = ABS(Py_SIZE(v1));
1869 size_w = ABS(Py_SIZE(w1));
1870 assert(size_v >= size_w && size_w >= 2); /* Assert checks by div() */
1871 v = _PyLong_New(size_v+1);
1872 if (v == NULL) {
1873 *prem = NULL;
1874 return NULL;
1875 }
1876 w = _PyLong_New(size_w);
1877 if (w == NULL) {
1878 Py_DECREF(v);
1879 *prem = NULL;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001880 return NULL;
1881 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001882
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001883 /* normalize: shift w1 left so that its top digit is >= PyLong_BASE/2.
1884 shift v1 left by the same amount. Results go into w and v. */
1885 d = PyLong_SHIFT - bits_in_digit(w1->ob_digit[size_w-1]);
1886 carry = v_lshift(w->ob_digit, w1->ob_digit, size_w, d);
1887 assert(carry == 0);
1888 carry = v_lshift(v->ob_digit, v1->ob_digit, size_v, d);
1889 if (carry != 0 || v->ob_digit[size_v-1] >= w->ob_digit[size_w-1]) {
1890 v->ob_digit[size_v] = carry;
1891 size_v++;
1892 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001893
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001894 /* Now v->ob_digit[size_v-1] < w->ob_digit[size_w-1], so quotient has
1895 at most (and usually exactly) k = size_v - size_w digits. */
Neal Norwitzc6a989a2006-05-10 06:57:58 +00001896 k = size_v - size_w;
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001897 assert(k >= 0);
1898 a = _PyLong_New(k);
1899 if (a == NULL) {
1900 Py_DECREF(w);
1901 Py_DECREF(v);
1902 *prem = NULL;
1903 return NULL;
1904 }
1905 v0 = v->ob_digit;
1906 w0 = w->ob_digit;
1907 wm1 = w0[size_w-1];
1908 wm2 = w0[size_w-2];
1909 for (vk = v0+k, ak = a->ob_digit + k; vk-- > v0;) {
1910 /* inner loop: divide vk[0:size_w+1] by w0[0:size_w], giving
1911 single-digit quotient q, remainder in vk[0:size_w]. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00001912
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00001913 SIGCHECK({
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001914 Py_DECREF(a);
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001915 Py_DECREF(w);
1916 Py_DECREF(v);
1917 *prem = NULL;
1918 return NULL;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00001919 })
Tim Peters5af4e6c2002-08-12 02:31:19 +00001920
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001921 /* estimate quotient digit q; may overestimate by 1 (rare) */
1922 vtop = vk[size_w];
1923 assert(vtop <= wm1);
1924 vv = ((twodigits)vtop << PyLong_SHIFT) | vk[size_w-1];
1925 q = (digit)(vv / wm1);
1926 r = (digit)(vv - (twodigits)wm1 * q); /* r = vv % wm1 */
1927 while ((twodigits)wm2 * q > (((twodigits)r << PyLong_SHIFT)
1928 | vk[size_w-2])) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001929 --q;
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001930 r += wm1;
1931 if (r >= PyLong_BASE)
1932 break;
1933 }
1934 assert(q <= PyLong_BASE);
Tim Peters5af4e6c2002-08-12 02:31:19 +00001935
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001936 /* subtract q*w0[0:size_w] from vk[0:size_w+1] */
1937 zhi = 0;
1938 for (i = 0; i < size_w; ++i) {
1939 /* invariants: -PyLong_BASE <= -q <= zhi <= 0;
1940 -PyLong_BASE * q <= z < PyLong_BASE */
1941 z = (sdigit)vk[i] + zhi -
1942 (stwodigits)q * (stwodigits)w0[i];
1943 vk[i] = (digit)z & PyLong_MASK;
1944 zhi = (sdigit)Py_ARITHMETIC_RIGHT_SHIFT(stwodigits,
1945 z, PyLong_SHIFT);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001946 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001947
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001948 /* add w back if q was too large (this branch taken rarely) */
1949 assert((sdigit)vtop + zhi == -1 || (sdigit)vtop + zhi == 0);
1950 if ((sdigit)vtop + zhi < 0) {
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001951 carry = 0;
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001952 for (i = 0; i < size_w; ++i) {
1953 carry += vk[i] + w0[i];
1954 vk[i] = carry & PyLong_MASK;
1955 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001956 }
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001957 --q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001958 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00001959
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001960 /* store quotient digit */
1961 assert(q < PyLong_BASE);
1962 *--ak = q;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001963 }
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001964
1965 /* unshift remainder; we reuse w to store the result */
1966 carry = v_rshift(w0, v0, size_w, d);
1967 assert(carry==0);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001968 Py_DECREF(v);
Mark Dickinson0b666bf2009-03-23 18:25:13 +00001969
1970 *prem = long_normalize(w);
1971 return long_normalize(a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001972}
1973
1974/* Methods */
1975
1976static void
Tim Peters9f688bf2000-07-07 15:53:28 +00001977long_dealloc(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001978{
Christian Heimese93237d2007-12-19 02:37:44 +00001979 Py_TYPE(v)->tp_free(v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001980}
1981
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001982static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001983long_repr(PyObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001984{
Eric Smith5e527eb2008-02-10 01:36:53 +00001985 return _PyLong_Format(v, 10, 1, 0);
Fred Drake121ee271999-12-23 15:41:28 +00001986}
1987
1988static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00001989long_str(PyObject *v)
Fred Drake121ee271999-12-23 15:41:28 +00001990{
Eric Smith5e527eb2008-02-10 01:36:53 +00001991 return _PyLong_Format(v, 10, 0, 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001992}
1993
1994static int
Tim Peters9f688bf2000-07-07 15:53:28 +00001995long_compare(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00001996{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001997 Py_ssize_t sign;
Tim Peters5af4e6c2002-08-12 02:31:19 +00001998
Christian Heimese93237d2007-12-19 02:37:44 +00001999 if (Py_SIZE(a) != Py_SIZE(b)) {
2000 if (ABS(Py_SIZE(a)) == 0 && ABS(Py_SIZE(b)) == 0)
Guido van Rossumc6913e71991-11-19 20:26:46 +00002001 sign = 0;
2002 else
Christian Heimese93237d2007-12-19 02:37:44 +00002003 sign = Py_SIZE(a) - Py_SIZE(b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002004 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002005 else {
Christian Heimese93237d2007-12-19 02:37:44 +00002006 Py_ssize_t i = ABS(Py_SIZE(a));
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002007 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
2008 ;
2009 if (i < 0)
2010 sign = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00002011 else {
Mark Dickinsonbcf6b182009-02-15 15:48:39 +00002012 sign = (sdigit)a->ob_digit[i] - (sdigit)b->ob_digit[i];
Christian Heimese93237d2007-12-19 02:37:44 +00002013 if (Py_SIZE(a) < 0)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00002014 sign = -sign;
2015 }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002016 }
Guido van Rossumc6913e71991-11-19 20:26:46 +00002017 return sign < 0 ? -1 : sign > 0 ? 1 : 0;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002018}
2019
Guido van Rossum9bfef441993-03-29 10:43:31 +00002020static long
Tim Peters9f688bf2000-07-07 15:53:28 +00002021long_hash(PyLongObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +00002022{
Mark Dickinson6ffa4a22009-01-26 21:36:30 +00002023 unsigned long x;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002024 Py_ssize_t i;
2025 int sign;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002026
2027 /* This is designed so that Python ints and longs with the
2028 same value hash to the same value, otherwise comparisons
2029 of mapping keys will turn out weird */
2030 i = v->ob_size;
2031 sign = 1;
2032 x = 0;
2033 if (i < 0) {
2034 sign = -1;
2035 i = -(i);
2036 }
Mark Dickinsona0eae032009-01-26 21:40:08 +00002037 /* The following loop produces a C unsigned long x such that x is
2038 congruent to the absolute value of v modulo ULONG_MAX. The
2039 resulting x is nonzero if and only if v is. */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002040 while (--i >= 0) {
Neal Norwitzd5a65a72003-02-23 23:11:41 +00002041 /* Force a native long #-bits (32 or 64) circular shift */
Mark Dickinson2ffb26f2009-02-15 10:13:41 +00002042 x = (x >> (8*SIZEOF_LONG-PyLong_SHIFT)) | (x << PyLong_SHIFT);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002043 x += v->ob_digit[i];
Mark Dickinson6ffa4a22009-01-26 21:36:30 +00002044 /* If the addition above overflowed we compensate by
2045 incrementing. This preserves the value modulo
2046 ULONG_MAX. */
2047 if (x < v->ob_digit[i])
Facundo Batistad544df72007-09-19 15:10:06 +00002048 x++;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002049 }
2050 x = x * sign;
Mark Dickinson2ffb26f2009-02-15 10:13:41 +00002051 if (x == (unsigned long)-1)
2052 x = (unsigned long)-2;
2053 return (long)x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002054}
2055
2056
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002057/* Add the absolute values of two long integers. */
2058
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002059static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002060x_add(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002061{
Christian Heimese93237d2007-12-19 02:37:44 +00002062 Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002063 PyLongObject *z;
Mark Dickinsonff84aa82009-01-24 15:27:44 +00002064 Py_ssize_t i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002065 digit carry = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00002066
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002067 /* Ensure a is the larger of the two: */
2068 if (size_a < size_b) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002069 { PyLongObject *temp = a; a = b; b = temp; }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002070 { Py_ssize_t size_temp = size_a;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002071 size_a = size_b;
2072 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002073 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002074 z = _PyLong_New(size_a+1);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002075 if (z == NULL)
2076 return NULL;
2077 for (i = 0; i < size_b; ++i) {
2078 carry += a->ob_digit[i] + b->ob_digit[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002079 z->ob_digit[i] = carry & PyLong_MASK;
2080 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002081 }
2082 for (; i < size_a; ++i) {
2083 carry += a->ob_digit[i];
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002084 z->ob_digit[i] = carry & PyLong_MASK;
2085 carry >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002086 }
2087 z->ob_digit[i] = carry;
2088 return long_normalize(z);
2089}
2090
2091/* Subtract the absolute values of two integers. */
2092
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002093static PyLongObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002094x_sub(PyLongObject *a, PyLongObject *b)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002095{
Christian Heimese93237d2007-12-19 02:37:44 +00002096 Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002097 PyLongObject *z;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002098 Py_ssize_t i;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002099 int sign = 1;
2100 digit borrow = 0;
Tim Peters69c2de32001-09-11 22:31:33 +00002101
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002102 /* Ensure a is the larger of the two: */
2103 if (size_a < size_b) {
2104 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002105 { PyLongObject *temp = a; a = b; b = temp; }
Martin v. Löwis18e16552006-02-15 17:27:45 +00002106 { Py_ssize_t size_temp = size_a;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002107 size_a = size_b;
2108 size_b = size_temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002109 }
2110 else if (size_a == size_b) {
2111 /* Find highest digit where a and b differ: */
2112 i = size_a;
2113 while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
2114 ;
2115 if (i < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002116 return _PyLong_New(0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002117 if (a->ob_digit[i] < b->ob_digit[i]) {
2118 sign = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002119 { PyLongObject *temp = a; a = b; b = temp; }
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002120 }
2121 size_a = size_b = i+1;
2122 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002123 z = _PyLong_New(size_a);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002124 if (z == NULL)
2125 return NULL;
2126 for (i = 0; i < size_b; ++i) {
2127 /* The following assumes unsigned arithmetic
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002128 works module 2**N for some N>PyLong_SHIFT. */
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002129 borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002130 z->ob_digit[i] = borrow & PyLong_MASK;
2131 borrow >>= PyLong_SHIFT;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002132 borrow &= 1; /* Keep only one sign bit */
2133 }
2134 for (; i < size_a; ++i) {
2135 borrow = a->ob_digit[i] - borrow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002136 z->ob_digit[i] = borrow & PyLong_MASK;
2137 borrow >>= PyLong_SHIFT;
Tim Peters43f04a32000-07-08 02:26:47 +00002138 borrow &= 1; /* Keep only one sign bit */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002139 }
2140 assert(borrow == 0);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002141 if (sign < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002142 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002143 return long_normalize(z);
2144}
2145
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002146static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002147long_add(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002148{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002149 PyLongObject *a, *b, *z;
Tim Peters69c2de32001-09-11 22:31:33 +00002150
Neil Schemenauerba872e22001-01-04 01:46:03 +00002151 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2152
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002153 if (a->ob_size < 0) {
2154 if (b->ob_size < 0) {
2155 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002156 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002157 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002158 }
2159 else
2160 z = x_sub(b, a);
2161 }
2162 else {
2163 if (b->ob_size < 0)
2164 z = x_sub(a, b);
2165 else
2166 z = x_add(a, b);
2167 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002168 Py_DECREF(a);
2169 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002170 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002171}
2172
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002173static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002174long_sub(PyLongObject *v, PyLongObject *w)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002175{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002176 PyLongObject *a, *b, *z;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002177
Neil Schemenauerba872e22001-01-04 01:46:03 +00002178 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
2179
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002180 if (a->ob_size < 0) {
2181 if (b->ob_size < 0)
2182 z = x_sub(a, b);
2183 else
2184 z = x_add(a, b);
Guido van Rossumc6913e71991-11-19 20:26:46 +00002185 if (z != NULL && z->ob_size != 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002186 z->ob_size = -(z->ob_size);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002187 }
2188 else {
2189 if (b->ob_size < 0)
2190 z = x_add(a, b);
2191 else
2192 z = x_sub(a, b);
2193 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002194 Py_DECREF(a);
2195 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002196 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002197}
2198
Tim Peters5af4e6c2002-08-12 02:31:19 +00002199/* Grade school multiplication, ignoring the signs.
2200 * Returns the absolute value of the product, or NULL if error.
2201 */
2202static PyLongObject *
2203x_mul(PyLongObject *a, PyLongObject *b)
Neil Schemenauerba872e22001-01-04 01:46:03 +00002204{
Tim Peters5af4e6c2002-08-12 02:31:19 +00002205 PyLongObject *z;
Christian Heimese93237d2007-12-19 02:37:44 +00002206 Py_ssize_t size_a = ABS(Py_SIZE(a));
2207 Py_ssize_t size_b = ABS(Py_SIZE(b));
Martin v. Löwis18e16552006-02-15 17:27:45 +00002208 Py_ssize_t i;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002209
Tim Peters5af4e6c2002-08-12 02:31:19 +00002210 z = _PyLong_New(size_a + size_b);
2211 if (z == NULL)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002212 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002213
Christian Heimese93237d2007-12-19 02:37:44 +00002214 memset(z->ob_digit, 0, Py_SIZE(z) * sizeof(digit));
Tim Peters0973b992004-08-29 22:16:50 +00002215 if (a == b) {
2216 /* Efficient squaring per HAC, Algorithm 14.16:
2217 * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
2218 * Gives slightly less than a 2x speedup when a == b,
2219 * via exploiting that each entry in the multiplication
2220 * pyramid appears twice (except for the size_a squares).
2221 */
2222 for (i = 0; i < size_a; ++i) {
2223 twodigits carry;
2224 twodigits f = a->ob_digit[i];
2225 digit *pz = z->ob_digit + (i << 1);
2226 digit *pa = a->ob_digit + i + 1;
2227 digit *paend = a->ob_digit + size_a;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002228
Tim Peters0973b992004-08-29 22:16:50 +00002229 SIGCHECK({
2230 Py_DECREF(z);
2231 return NULL;
2232 })
2233
2234 carry = *pz + f * f;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002235 *pz++ = (digit)(carry & PyLong_MASK);
2236 carry >>= PyLong_SHIFT;
2237 assert(carry <= PyLong_MASK);
Tim Peters0973b992004-08-29 22:16:50 +00002238
2239 /* Now f is added in twice in each column of the
2240 * pyramid it appears. Same as adding f<<1 once.
2241 */
2242 f <<= 1;
2243 while (pa < paend) {
2244 carry += *pz + *pa++ * f;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002245 *pz++ = (digit)(carry & PyLong_MASK);
2246 carry >>= PyLong_SHIFT;
2247 assert(carry <= (PyLong_MASK << 1));
Tim Peters0973b992004-08-29 22:16:50 +00002248 }
2249 if (carry) {
2250 carry += *pz;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002251 *pz++ = (digit)(carry & PyLong_MASK);
2252 carry >>= PyLong_SHIFT;
Tim Peters0973b992004-08-29 22:16:50 +00002253 }
2254 if (carry)
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002255 *pz += (digit)(carry & PyLong_MASK);
2256 assert((carry >> PyLong_SHIFT) == 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002257 }
Tim Peters0973b992004-08-29 22:16:50 +00002258 }
2259 else { /* a is not the same as b -- gradeschool long mult */
2260 for (i = 0; i < size_a; ++i) {
2261 twodigits carry = 0;
2262 twodigits f = a->ob_digit[i];
2263 digit *pz = z->ob_digit + i;
2264 digit *pb = b->ob_digit;
2265 digit *pbend = b->ob_digit + size_b;
2266
2267 SIGCHECK({
2268 Py_DECREF(z);
2269 return NULL;
2270 })
2271
2272 while (pb < pbend) {
2273 carry += *pz + *pb++ * f;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002274 *pz++ = (digit)(carry & PyLong_MASK);
2275 carry >>= PyLong_SHIFT;
2276 assert(carry <= PyLong_MASK);
Tim Peters0973b992004-08-29 22:16:50 +00002277 }
2278 if (carry)
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002279 *pz += (digit)(carry & PyLong_MASK);
2280 assert((carry >> PyLong_SHIFT) == 0);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002281 }
2282 }
Tim Peters44121a62002-08-12 06:17:58 +00002283 return long_normalize(z);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002284}
2285
2286/* A helper for Karatsuba multiplication (k_mul).
2287 Takes a long "n" and an integer "size" representing the place to
2288 split, and sets low and high such that abs(n) == (high << size) + low,
2289 viewing the shift as being by digits. The sign bit is ignored, and
2290 the return values are >= 0.
2291 Returns 0 on success, -1 on failure.
2292*/
2293static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002294kmul_split(PyLongObject *n, Py_ssize_t size, PyLongObject **high, PyLongObject **low)
Tim Peters5af4e6c2002-08-12 02:31:19 +00002295{
2296 PyLongObject *hi, *lo;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002297 Py_ssize_t size_lo, size_hi;
Christian Heimese93237d2007-12-19 02:37:44 +00002298 const Py_ssize_t size_n = ABS(Py_SIZE(n));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002299
2300 size_lo = MIN(size_n, size);
2301 size_hi = size_n - size_lo;
2302
2303 if ((hi = _PyLong_New(size_hi)) == NULL)
2304 return -1;
2305 if ((lo = _PyLong_New(size_lo)) == NULL) {
2306 Py_DECREF(hi);
2307 return -1;
2308 }
2309
2310 memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
2311 memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
2312
2313 *high = long_normalize(hi);
2314 *low = long_normalize(lo);
2315 return 0;
2316}
2317
Tim Peters60004642002-08-12 22:01:34 +00002318static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
2319
Tim Peters5af4e6c2002-08-12 02:31:19 +00002320/* Karatsuba multiplication. Ignores the input signs, and returns the
2321 * absolute value of the product (or NULL if error).
2322 * See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
2323 */
2324static PyLongObject *
2325k_mul(PyLongObject *a, PyLongObject *b)
2326{
Christian Heimese93237d2007-12-19 02:37:44 +00002327 Py_ssize_t asize = ABS(Py_SIZE(a));
2328 Py_ssize_t bsize = ABS(Py_SIZE(b));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002329 PyLongObject *ah = NULL;
2330 PyLongObject *al = NULL;
2331 PyLongObject *bh = NULL;
2332 PyLongObject *bl = NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002333 PyLongObject *ret = NULL;
Tim Peters738eda72002-08-12 15:08:20 +00002334 PyLongObject *t1, *t2, *t3;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002335 Py_ssize_t shift; /* the number of digits we split off */
2336 Py_ssize_t i;
Tim Peters738eda72002-08-12 15:08:20 +00002337
Tim Peters5af4e6c2002-08-12 02:31:19 +00002338 /* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
2339 * Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
2340 * Then the original product is
Tim Peters18c15b92002-08-12 02:43:58 +00002341 * ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
Tim Peters5af4e6c2002-08-12 02:31:19 +00002342 * By picking X to be a power of 2, "*X" is just shifting, and it's
2343 * been reduced to 3 multiplies on numbers half the size.
2344 */
2345
Tim Petersfc07e562002-08-12 02:54:10 +00002346 /* We want to split based on the larger number; fiddle so that b
Tim Peters5af4e6c2002-08-12 02:31:19 +00002347 * is largest.
2348 */
Tim Peters738eda72002-08-12 15:08:20 +00002349 if (asize > bsize) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002350 t1 = a;
2351 a = b;
2352 b = t1;
Tim Peters738eda72002-08-12 15:08:20 +00002353
2354 i = asize;
2355 asize = bsize;
2356 bsize = i;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002357 }
2358
2359 /* Use gradeschool math when either number is too small. */
Tim Peters0973b992004-08-29 22:16:50 +00002360 i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF;
2361 if (asize <= i) {
Tim Peters738eda72002-08-12 15:08:20 +00002362 if (asize == 0)
Tim Peters44121a62002-08-12 06:17:58 +00002363 return _PyLong_New(0);
2364 else
2365 return x_mul(a, b);
2366 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00002367
Tim Peters60004642002-08-12 22:01:34 +00002368 /* If a is small compared to b, splitting on b gives a degenerate
2369 * case with ah==0, and Karatsuba may be (even much) less efficient
2370 * than "grade school" then. However, we can still win, by viewing
2371 * b as a string of "big digits", each of width a->ob_size. That
2372 * leads to a sequence of balanced calls to k_mul.
2373 */
2374 if (2 * asize <= bsize)
2375 return k_lopsided_mul(a, b);
2376
Tim Petersd6974a52002-08-13 20:37:51 +00002377 /* Split a & b into hi & lo pieces. */
Tim Peters738eda72002-08-12 15:08:20 +00002378 shift = bsize >> 1;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002379 if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
Christian Heimese93237d2007-12-19 02:37:44 +00002380 assert(Py_SIZE(ah) > 0); /* the split isn't degenerate */
Tim Petersd6974a52002-08-13 20:37:51 +00002381
Tim Peters0973b992004-08-29 22:16:50 +00002382 if (a == b) {
2383 bh = ah;
2384 bl = al;
2385 Py_INCREF(bh);
2386 Py_INCREF(bl);
2387 }
2388 else if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002389
Tim Petersd64c1de2002-08-12 17:36:03 +00002390 /* The plan:
2391 * 1. Allocate result space (asize + bsize digits: that's always
2392 * enough).
2393 * 2. Compute ah*bh, and copy into result at 2*shift.
2394 * 3. Compute al*bl, and copy into result at 0. Note that this
2395 * can't overlap with #2.
2396 * 4. Subtract al*bl from the result, starting at shift. This may
2397 * underflow (borrow out of the high digit), but we don't care:
2398 * we're effectively doing unsigned arithmetic mod
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002399 * PyLong_BASE**(sizea + sizeb), and so long as the *final* result fits,
Tim Petersd64c1de2002-08-12 17:36:03 +00002400 * borrows and carries out of the high digit can be ignored.
2401 * 5. Subtract ah*bh from the result, starting at shift.
2402 * 6. Compute (ah+al)*(bh+bl), and add it into the result starting
2403 * at shift.
2404 */
2405
2406 /* 1. Allocate result space. */
Tim Peters70b041b2002-08-12 19:38:01 +00002407 ret = _PyLong_New(asize + bsize);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002408 if (ret == NULL) goto fail;
2409#ifdef Py_DEBUG
2410 /* Fill with trash, to catch reference to uninitialized digits. */
Christian Heimese93237d2007-12-19 02:37:44 +00002411 memset(ret->ob_digit, 0xDF, Py_SIZE(ret) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002412#endif
Tim Peters44121a62002-08-12 06:17:58 +00002413
Tim Petersd64c1de2002-08-12 17:36:03 +00002414 /* 2. t1 <- ah*bh, and copy into high digits of result. */
Tim Peters738eda72002-08-12 15:08:20 +00002415 if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
Christian Heimese93237d2007-12-19 02:37:44 +00002416 assert(Py_SIZE(t1) >= 0);
2417 assert(2*shift + Py_SIZE(t1) <= Py_SIZE(ret));
Tim Peters738eda72002-08-12 15:08:20 +00002418 memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
Christian Heimese93237d2007-12-19 02:37:44 +00002419 Py_SIZE(t1) * sizeof(digit));
Tim Peters738eda72002-08-12 15:08:20 +00002420
2421 /* Zero-out the digits higher than the ah*bh copy. */
Christian Heimese93237d2007-12-19 02:37:44 +00002422 i = Py_SIZE(ret) - 2*shift - Py_SIZE(t1);
Tim Peters44121a62002-08-12 06:17:58 +00002423 if (i)
Christian Heimese93237d2007-12-19 02:37:44 +00002424 memset(ret->ob_digit + 2*shift + Py_SIZE(t1), 0,
Tim Peters44121a62002-08-12 06:17:58 +00002425 i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002426
Tim Petersd64c1de2002-08-12 17:36:03 +00002427 /* 3. t2 <- al*bl, and copy into the low digits. */
Tim Peters738eda72002-08-12 15:08:20 +00002428 if ((t2 = k_mul(al, bl)) == NULL) {
2429 Py_DECREF(t1);
2430 goto fail;
2431 }
Christian Heimese93237d2007-12-19 02:37:44 +00002432 assert(Py_SIZE(t2) >= 0);
2433 assert(Py_SIZE(t2) <= 2*shift); /* no overlap with high digits */
2434 memcpy(ret->ob_digit, t2->ob_digit, Py_SIZE(t2) * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002435
2436 /* Zero out remaining digits. */
Christian Heimese93237d2007-12-19 02:37:44 +00002437 i = 2*shift - Py_SIZE(t2); /* number of uninitialized digits */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002438 if (i)
Christian Heimese93237d2007-12-19 02:37:44 +00002439 memset(ret->ob_digit + Py_SIZE(t2), 0, i * sizeof(digit));
Tim Peters5af4e6c2002-08-12 02:31:19 +00002440
Tim Petersd64c1de2002-08-12 17:36:03 +00002441 /* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
2442 * because it's fresher in cache.
2443 */
Christian Heimese93237d2007-12-19 02:37:44 +00002444 i = Py_SIZE(ret) - shift; /* # digits after shift */
2445 (void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, Py_SIZE(t2));
Tim Peters738eda72002-08-12 15:08:20 +00002446 Py_DECREF(t2);
2447
Christian Heimese93237d2007-12-19 02:37:44 +00002448 (void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, Py_SIZE(t1));
Tim Peters738eda72002-08-12 15:08:20 +00002449 Py_DECREF(t1);
2450
Tim Petersd64c1de2002-08-12 17:36:03 +00002451 /* 6. t3 <- (ah+al)(bh+bl), and add into result. */
Tim Peters5af4e6c2002-08-12 02:31:19 +00002452 if ((t1 = x_add(ah, al)) == NULL) goto fail;
2453 Py_DECREF(ah);
2454 Py_DECREF(al);
2455 ah = al = NULL;
2456
Tim Peters0973b992004-08-29 22:16:50 +00002457 if (a == b) {
2458 t2 = t1;
2459 Py_INCREF(t2);
2460 }
2461 else if ((t2 = x_add(bh, bl)) == NULL) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002462 Py_DECREF(t1);
2463 goto fail;
2464 }
2465 Py_DECREF(bh);
2466 Py_DECREF(bl);
2467 bh = bl = NULL;
2468
Tim Peters738eda72002-08-12 15:08:20 +00002469 t3 = k_mul(t1, t2);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002470 Py_DECREF(t1);
2471 Py_DECREF(t2);
Tim Peters738eda72002-08-12 15:08:20 +00002472 if (t3 == NULL) goto fail;
Christian Heimese93237d2007-12-19 02:37:44 +00002473 assert(Py_SIZE(t3) >= 0);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002474
Tim Petersd6974a52002-08-13 20:37:51 +00002475 /* Add t3. It's not obvious why we can't run out of room here.
2476 * See the (*) comment after this function.
Tim Petersd8b21732002-08-12 19:30:26 +00002477 */
Christian Heimese93237d2007-12-19 02:37:44 +00002478 (void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, Py_SIZE(t3));
Tim Peters738eda72002-08-12 15:08:20 +00002479 Py_DECREF(t3);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002480
Tim Peters5af4e6c2002-08-12 02:31:19 +00002481 return long_normalize(ret);
2482
2483 fail:
2484 Py_XDECREF(ret);
2485 Py_XDECREF(ah);
2486 Py_XDECREF(al);
2487 Py_XDECREF(bh);
2488 Py_XDECREF(bl);
Tim Peters5af4e6c2002-08-12 02:31:19 +00002489 return NULL;
2490}
2491
Tim Petersd6974a52002-08-13 20:37:51 +00002492/* (*) Why adding t3 can't "run out of room" above.
2493
Tim Petersab86c2b2002-08-15 20:06:00 +00002494Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
2495to start with:
Tim Petersd6974a52002-08-13 20:37:51 +00002496
Tim Petersab86c2b2002-08-15 20:06:00 +000024971. For any integer i, i = c(i/2) + f(i/2). In particular,
2498 bsize = c(bsize/2) + f(bsize/2).
24992. shift = f(bsize/2)
25003. asize <= bsize
25014. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
2502 routine, so asize > bsize/2 >= f(bsize/2) in this routine.
Tim Petersd6974a52002-08-13 20:37:51 +00002503
Tim Petersab86c2b2002-08-15 20:06:00 +00002504We allocated asize + bsize result digits, and add t3 into them at an offset
2505of shift. This leaves asize+bsize-shift allocated digit positions for t3
2506to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
2507asize + c(bsize/2) available digit positions.
Tim Petersd6974a52002-08-13 20:37:51 +00002508
Tim Petersab86c2b2002-08-15 20:06:00 +00002509bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
2510at most c(bsize/2) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00002511
Tim Petersab86c2b2002-08-15 20:06:00 +00002512If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
2513digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
2514most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
Tim Petersd6974a52002-08-13 20:37:51 +00002515
Tim Petersab86c2b2002-08-15 20:06:00 +00002516The product (ah+al)*(bh+bl) therefore has at most
Tim Petersd6974a52002-08-13 20:37:51 +00002517
Tim Petersab86c2b2002-08-15 20:06:00 +00002518 c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
Tim Petersd6974a52002-08-13 20:37:51 +00002519
Tim Petersab86c2b2002-08-15 20:06:00 +00002520and we have asize + c(bsize/2) available digit positions. We need to show
2521this is always enough. An instance of c(bsize/2) cancels out in both, so
2522the question reduces to whether asize digits is enough to hold
2523(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
2524then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
2525asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002526digit is enough to hold 2 bits. This is so since PyLong_SHIFT=15 >= 2. If
Tim Petersab86c2b2002-08-15 20:06:00 +00002527asize == bsize, then we're asking whether bsize digits is enough to hold
Tim Peterse417de02002-08-15 20:10:45 +00002528c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
2529is enough to hold 2 bits. This is so if bsize >= 2, which holds because
2530bsize >= KARATSUBA_CUTOFF >= 2.
Tim Peters8e966ee2002-08-14 16:36:23 +00002531
Tim Peters48d52c02002-08-14 17:07:32 +00002532Note that since there's always enough room for (ah+al)*(bh+bl), and that's
2533clearly >= each of ah*bh and al*bl, there's always enough room to subtract
2534ah*bh and al*bl too.
Tim Petersd6974a52002-08-13 20:37:51 +00002535*/
2536
Tim Peters60004642002-08-12 22:01:34 +00002537/* b has at least twice the digits of a, and a is big enough that Karatsuba
2538 * would pay off *if* the inputs had balanced sizes. View b as a sequence
2539 * of slices, each with a->ob_size digits, and multiply the slices by a,
2540 * one at a time. This gives k_mul balanced inputs to work with, and is
2541 * also cache-friendly (we compute one double-width slice of the result
2542 * at a time, then move on, never bactracking except for the helpful
2543 * single-width slice overlap between successive partial sums).
2544 */
2545static PyLongObject *
2546k_lopsided_mul(PyLongObject *a, PyLongObject *b)
2547{
Christian Heimese93237d2007-12-19 02:37:44 +00002548 const Py_ssize_t asize = ABS(Py_SIZE(a));
2549 Py_ssize_t bsize = ABS(Py_SIZE(b));
Martin v. Löwis18e16552006-02-15 17:27:45 +00002550 Py_ssize_t nbdone; /* # of b digits already multiplied */
Tim Peters60004642002-08-12 22:01:34 +00002551 PyLongObject *ret;
2552 PyLongObject *bslice = NULL;
2553
2554 assert(asize > KARATSUBA_CUTOFF);
2555 assert(2 * asize <= bsize);
2556
2557 /* Allocate result space, and zero it out. */
2558 ret = _PyLong_New(asize + bsize);
2559 if (ret == NULL)
2560 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00002561 memset(ret->ob_digit, 0, Py_SIZE(ret) * sizeof(digit));
Tim Peters60004642002-08-12 22:01:34 +00002562
2563 /* Successive slices of b are copied into bslice. */
Tim Peters12034032002-08-12 22:10:00 +00002564 bslice = _PyLong_New(asize);
Tim Peters60004642002-08-12 22:01:34 +00002565 if (bslice == NULL)
2566 goto fail;
2567
2568 nbdone = 0;
2569 while (bsize > 0) {
2570 PyLongObject *product;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002571 const Py_ssize_t nbtouse = MIN(bsize, asize);
Tim Peters60004642002-08-12 22:01:34 +00002572
2573 /* Multiply the next slice of b by a. */
2574 memcpy(bslice->ob_digit, b->ob_digit + nbdone,
2575 nbtouse * sizeof(digit));
Christian Heimese93237d2007-12-19 02:37:44 +00002576 Py_SIZE(bslice) = nbtouse;
Tim Peters60004642002-08-12 22:01:34 +00002577 product = k_mul(a, bslice);
2578 if (product == NULL)
2579 goto fail;
2580
2581 /* Add into result. */
Christian Heimese93237d2007-12-19 02:37:44 +00002582 (void)v_iadd(ret->ob_digit + nbdone, Py_SIZE(ret) - nbdone,
2583 product->ob_digit, Py_SIZE(product));
Tim Peters60004642002-08-12 22:01:34 +00002584 Py_DECREF(product);
2585
2586 bsize -= nbtouse;
2587 nbdone += nbtouse;
2588 }
2589
2590 Py_DECREF(bslice);
2591 return long_normalize(ret);
2592
2593 fail:
2594 Py_DECREF(ret);
2595 Py_XDECREF(bslice);
2596 return NULL;
2597}
Tim Peters5af4e6c2002-08-12 02:31:19 +00002598
2599static PyObject *
2600long_mul(PyLongObject *v, PyLongObject *w)
2601{
2602 PyLongObject *a, *b, *z;
2603
2604 if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
Tim Peters5af4e6c2002-08-12 02:31:19 +00002605 Py_INCREF(Py_NotImplemented);
2606 return Py_NotImplemented;
2607 }
2608
Tim Petersd64c1de2002-08-12 17:36:03 +00002609 z = k_mul(a, b);
Tim Peters9973d742002-08-15 19:41:06 +00002610 /* Negate if exactly one of the inputs is negative. */
2611 if (((a->ob_size ^ b->ob_size) < 0) && z)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002612 z->ob_size = -(z->ob_size);
Neil Schemenauerba872e22001-01-04 01:46:03 +00002613 Py_DECREF(a);
2614 Py_DECREF(b);
Tim Peters9973d742002-08-15 19:41:06 +00002615 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002616}
2617
Guido van Rossume32e0141992-01-19 16:31:05 +00002618/* The / and % operators are now defined in terms of divmod().
2619 The expression a mod b has the value a - b*floor(a/b).
2620 The long_divrem function gives the remainder after division of
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002621 |a| by |b|, with the sign of a. This is also expressed
2622 as a - b*trunc(a/b), if trunc truncates towards zero.
2623 Some examples:
2624 a b a rem b a mod b
2625 13 10 3 3
2626 -13 10 -3 7
2627 13 -10 3 -7
2628 -13 -10 -3 -3
2629 So, to get from rem to mod, we have to add b if a and b
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00002630 have different signs. We then subtract one from the 'div'
2631 part of the outcome to keep the invariant intact. */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002632
Tim Peters47e52ee2004-08-30 02:44:38 +00002633/* Compute
2634 * *pdiv, *pmod = divmod(v, w)
2635 * NULL can be passed for pdiv or pmod, in which case that part of
2636 * the result is simply thrown away. The caller owns a reference to
2637 * each of these it requests (does not pass NULL for).
2638 */
Guido van Rossume32e0141992-01-19 16:31:05 +00002639static int
Tim Peters5af4e6c2002-08-12 02:31:19 +00002640l_divmod(PyLongObject *v, PyLongObject *w,
Tim Peters9f688bf2000-07-07 15:53:28 +00002641 PyLongObject **pdiv, PyLongObject **pmod)
Guido van Rossume32e0141992-01-19 16:31:05 +00002642{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002643 PyLongObject *div, *mod;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002644
Guido van Rossume32e0141992-01-19 16:31:05 +00002645 if (long_divrem(v, w, &div, &mod) < 0)
2646 return -1;
Christian Heimese93237d2007-12-19 02:37:44 +00002647 if ((Py_SIZE(mod) < 0 && Py_SIZE(w) > 0) ||
2648 (Py_SIZE(mod) > 0 && Py_SIZE(w) < 0)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002649 PyLongObject *temp;
2650 PyLongObject *one;
2651 temp = (PyLongObject *) long_add(mod, w);
2652 Py_DECREF(mod);
Guido van Rossume32e0141992-01-19 16:31:05 +00002653 mod = temp;
2654 if (mod == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002655 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002656 return -1;
2657 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002658 one = (PyLongObject *) PyLong_FromLong(1L);
Guido van Rossume32e0141992-01-19 16:31:05 +00002659 if (one == NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002660 (temp = (PyLongObject *) long_sub(div, one)) == NULL) {
2661 Py_DECREF(mod);
2662 Py_DECREF(div);
2663 Py_XDECREF(one);
Guido van Rossume32e0141992-01-19 16:31:05 +00002664 return -1;
2665 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002666 Py_DECREF(one);
2667 Py_DECREF(div);
Guido van Rossume32e0141992-01-19 16:31:05 +00002668 div = temp;
2669 }
Tim Peters47e52ee2004-08-30 02:44:38 +00002670 if (pdiv != NULL)
2671 *pdiv = div;
2672 else
2673 Py_DECREF(div);
2674
2675 if (pmod != NULL)
2676 *pmod = mod;
2677 else
2678 Py_DECREF(mod);
2679
Guido van Rossume32e0141992-01-19 16:31:05 +00002680 return 0;
2681}
2682
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002683static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002684long_div(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002685{
Tim Peters47e52ee2004-08-30 02:44:38 +00002686 PyLongObject *a, *b, *div;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002687
2688 CONVERT_BINOP(v, w, &a, &b);
Tim Peters47e52ee2004-08-30 02:44:38 +00002689 if (l_divmod(a, b, &div, NULL) < 0)
2690 div = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002691 Py_DECREF(a);
2692 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002693 return (PyObject *)div;
Guido van Rossume32e0141992-01-19 16:31:05 +00002694}
2695
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002696static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +00002697long_classic_div(PyObject *v, PyObject *w)
2698{
Tim Peters47e52ee2004-08-30 02:44:38 +00002699 PyLongObject *a, *b, *div;
Guido van Rossum393661d2001-08-31 17:40:15 +00002700
2701 CONVERT_BINOP(v, w, &a, &b);
Guido van Rossum393661d2001-08-31 17:40:15 +00002702 if (Py_DivisionWarningFlag &&
2703 PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
2704 div = NULL;
Tim Peters47e52ee2004-08-30 02:44:38 +00002705 else if (l_divmod(a, b, &div, NULL) < 0)
Guido van Rossum393661d2001-08-31 17:40:15 +00002706 div = NULL;
Guido van Rossum393661d2001-08-31 17:40:15 +00002707 Py_DECREF(a);
2708 Py_DECREF(b);
2709 return (PyObject *)div;
2710}
2711
2712static PyObject *
Tim Peters20dab9f2001-09-04 05:31:47 +00002713long_true_divide(PyObject *v, PyObject *w)
2714{
Tim Peterse2a60002001-09-04 06:17:36 +00002715 PyLongObject *a, *b;
2716 double ad, bd;
Thomas Wouters553489a2006-02-01 21:32:04 +00002717 int failed, aexp = -1, bexp = -1;
Tim Peterse2a60002001-09-04 06:17:36 +00002718
2719 CONVERT_BINOP(v, w, &a, &b);
2720 ad = _PyLong_AsScaledDouble((PyObject *)a, &aexp);
2721 bd = _PyLong_AsScaledDouble((PyObject *)b, &bexp);
Tim Peters6f97e492001-11-04 23:09:40 +00002722 failed = (ad == -1.0 || bd == -1.0) && PyErr_Occurred();
2723 Py_DECREF(a);
2724 Py_DECREF(b);
2725 if (failed)
Tim Peterse2a60002001-09-04 06:17:36 +00002726 return NULL;
Thomas Wouters553489a2006-02-01 21:32:04 +00002727 /* 'aexp' and 'bexp' were initialized to -1 to silence gcc-4.0.x,
2728 but should really be set correctly after sucessful calls to
2729 _PyLong_AsScaledDouble() */
2730 assert(aexp >= 0 && bexp >= 0);
Tim Peterse2a60002001-09-04 06:17:36 +00002731
2732 if (bd == 0.0) {
2733 PyErr_SetString(PyExc_ZeroDivisionError,
2734 "long division or modulo by zero");
2735 return NULL;
2736 }
2737
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002738 /* True value is very close to ad/bd * 2**(PyLong_SHIFT*(aexp-bexp)) */
Tim Peterse2a60002001-09-04 06:17:36 +00002739 ad /= bd; /* overflow/underflow impossible here */
2740 aexp -= bexp;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002741 if (aexp > INT_MAX / PyLong_SHIFT)
Tim Peterse2a60002001-09-04 06:17:36 +00002742 goto overflow;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002743 else if (aexp < -(INT_MAX / PyLong_SHIFT))
Tim Peterse56ed9b2001-09-06 21:59:14 +00002744 return PyFloat_FromDouble(0.0); /* underflow to 0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002745 errno = 0;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002746 ad = ldexp(ad, aexp * PyLong_SHIFT);
Tim Peters57f282a2001-09-05 05:38:10 +00002747 if (Py_OVERFLOWED(ad)) /* ignore underflow to 0.0 */
Tim Peterse2a60002001-09-04 06:17:36 +00002748 goto overflow;
2749 return PyFloat_FromDouble(ad);
2750
2751overflow:
2752 PyErr_SetString(PyExc_OverflowError,
2753 "long/long too large for a float");
2754 return NULL;
Tim Peters5af4e6c2002-08-12 02:31:19 +00002755
Tim Peters20dab9f2001-09-04 05:31:47 +00002756}
2757
2758static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002759long_mod(PyObject *v, PyObject *w)
Guido van Rossume32e0141992-01-19 16:31:05 +00002760{
Tim Peters47e52ee2004-08-30 02:44:38 +00002761 PyLongObject *a, *b, *mod;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002762
2763 CONVERT_BINOP(v, w, &a, &b);
2764
Tim Peters47e52ee2004-08-30 02:44:38 +00002765 if (l_divmod(a, b, NULL, &mod) < 0)
2766 mod = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002767 Py_DECREF(a);
2768 Py_DECREF(b);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002769 return (PyObject *)mod;
Guido van Rossume32e0141992-01-19 16:31:05 +00002770}
2771
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002772static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002773long_divmod(PyObject *v, PyObject *w)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002774{
Neil Schemenauerba872e22001-01-04 01:46:03 +00002775 PyLongObject *a, *b, *div, *mod;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002776 PyObject *z;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002777
2778 CONVERT_BINOP(v, w, &a, &b);
2779
2780 if (l_divmod(a, b, &div, &mod) < 0) {
2781 Py_DECREF(a);
2782 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002783 return NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002784 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002785 z = PyTuple_New(2);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002786 if (z != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002787 PyTuple_SetItem(z, 0, (PyObject *) div);
2788 PyTuple_SetItem(z, 1, (PyObject *) mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002789 }
2790 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002791 Py_DECREF(div);
2792 Py_DECREF(mod);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002793 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00002794 Py_DECREF(a);
2795 Py_DECREF(b);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002796 return z;
2797}
2798
Tim Peters47e52ee2004-08-30 02:44:38 +00002799/* pow(v, w, x) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002800static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00002801long_pow(PyObject *v, PyObject *w, PyObject *x)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002802{
Tim Peters47e52ee2004-08-30 02:44:38 +00002803 PyLongObject *a, *b, *c; /* a,b,c = v,w,x */
2804 int negativeOutput = 0; /* if x<0 return negative output */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002805
Tim Peters47e52ee2004-08-30 02:44:38 +00002806 PyLongObject *z = NULL; /* accumulated result */
Martin v. Löwis18e16552006-02-15 17:27:45 +00002807 Py_ssize_t i, j, k; /* counters */
Tim Peters47e52ee2004-08-30 02:44:38 +00002808 PyLongObject *temp = NULL;
2809
2810 /* 5-ary values. If the exponent is large enough, table is
2811 * precomputed so that table[i] == a**i % c for i in range(32).
2812 */
2813 PyLongObject *table[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2814 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
2815
2816 /* a, b, c = v, w, x */
Neil Schemenauerba872e22001-01-04 01:46:03 +00002817 CONVERT_BINOP(v, w, &a, &b);
Tim Peters47e52ee2004-08-30 02:44:38 +00002818 if (PyLong_Check(x)) {
2819 c = (PyLongObject *)x;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002820 Py_INCREF(x);
2821 }
Tim Petersde7990b2005-07-17 23:45:23 +00002822 else if (PyInt_Check(x)) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002823 c = (PyLongObject *)PyLong_FromLong(PyInt_AS_LONG(x));
Tim Petersde7990b2005-07-17 23:45:23 +00002824 if (c == NULL)
2825 goto Error;
2826 }
Tim Peters47e52ee2004-08-30 02:44:38 +00002827 else if (x == Py_None)
2828 c = NULL;
Neil Schemenauerba872e22001-01-04 01:46:03 +00002829 else {
2830 Py_DECREF(a);
2831 Py_DECREF(b);
2832 Py_INCREF(Py_NotImplemented);
2833 return Py_NotImplemented;
2834 }
Tim Peters4c483c42001-09-05 06:24:58 +00002835
Christian Heimese93237d2007-12-19 02:37:44 +00002836 if (Py_SIZE(b) < 0) { /* if exponent is negative */
Tim Peters47e52ee2004-08-30 02:44:38 +00002837 if (c) {
Tim Peters4c483c42001-09-05 06:24:58 +00002838 PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
Tim Peters47e52ee2004-08-30 02:44:38 +00002839 "cannot be negative when 3rd argument specified");
Tim Peterscd97da32004-08-30 02:58:59 +00002840 goto Error;
Tim Peters32f453e2001-09-03 08:35:41 +00002841 }
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002842 else {
Tim Peters47e52ee2004-08-30 02:44:38 +00002843 /* else return a float. This works because we know
2844 that this calls float_pow() which converts its
2845 arguments to double. */
2846 Py_DECREF(a);
2847 Py_DECREF(b);
2848 return PyFloat_Type.tp_as_number->nb_power(v, w, x);
Guido van Rossum2c7b8fe1999-10-11 22:34:41 +00002849 }
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00002850 }
Tim Peters47e52ee2004-08-30 02:44:38 +00002851
2852 if (c) {
2853 /* if modulus == 0:
2854 raise ValueError() */
Christian Heimese93237d2007-12-19 02:37:44 +00002855 if (Py_SIZE(c) == 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002856 PyErr_SetString(PyExc_ValueError,
2857 "pow() 3rd argument cannot be 0");
Tim Peterscd97da32004-08-30 02:58:59 +00002858 goto Error;
Tim Peters47e52ee2004-08-30 02:44:38 +00002859 }
2860
2861 /* if modulus < 0:
2862 negativeOutput = True
2863 modulus = -modulus */
Christian Heimese93237d2007-12-19 02:37:44 +00002864 if (Py_SIZE(c) < 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002865 negativeOutput = 1;
2866 temp = (PyLongObject *)_PyLong_Copy(c);
2867 if (temp == NULL)
2868 goto Error;
2869 Py_DECREF(c);
2870 c = temp;
2871 temp = NULL;
2872 c->ob_size = - c->ob_size;
2873 }
2874
2875 /* if modulus == 1:
2876 return 0 */
Christian Heimese93237d2007-12-19 02:37:44 +00002877 if ((Py_SIZE(c) == 1) && (c->ob_digit[0] == 1)) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002878 z = (PyLongObject *)PyLong_FromLong(0L);
2879 goto Done;
2880 }
2881
2882 /* if base < 0:
2883 base = base % modulus
2884 Having the base positive just makes things easier. */
Christian Heimese93237d2007-12-19 02:37:44 +00002885 if (Py_SIZE(a) < 0) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002886 if (l_divmod(a, c, NULL, &temp) < 0)
Tim Peterscd97da32004-08-30 02:58:59 +00002887 goto Error;
Tim Peters47e52ee2004-08-30 02:44:38 +00002888 Py_DECREF(a);
2889 a = temp;
2890 temp = NULL;
2891 }
2892 }
2893
2894 /* At this point a, b, and c are guaranteed non-negative UNLESS
2895 c is NULL, in which case a may be negative. */
2896
2897 z = (PyLongObject *)PyLong_FromLong(1L);
2898 if (z == NULL)
2899 goto Error;
2900
2901 /* Perform a modular reduction, X = X % c, but leave X alone if c
2902 * is NULL.
2903 */
2904#define REDUCE(X) \
2905 if (c != NULL) { \
2906 if (l_divmod(X, c, NULL, &temp) < 0) \
2907 goto Error; \
2908 Py_XDECREF(X); \
2909 X = temp; \
2910 temp = NULL; \
2911 }
2912
2913 /* Multiply two values, then reduce the result:
2914 result = X*Y % c. If c is NULL, skip the mod. */
2915#define MULT(X, Y, result) \
2916{ \
2917 temp = (PyLongObject *)long_mul(X, Y); \
2918 if (temp == NULL) \
2919 goto Error; \
2920 Py_XDECREF(result); \
2921 result = temp; \
2922 temp = NULL; \
2923 REDUCE(result) \
2924}
2925
Christian Heimese93237d2007-12-19 02:37:44 +00002926 if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002927 /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
2928 /* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf */
Christian Heimese93237d2007-12-19 02:37:44 +00002929 for (i = Py_SIZE(b) - 1; i >= 0; --i) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002930 digit bi = b->ob_digit[i];
2931
Mark Dickinsonbcf6b182009-02-15 15:48:39 +00002932 for (j = (digit)1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002933 MULT(z, z, z)
2934 if (bi & j)
2935 MULT(z, a, z)
2936 }
2937 }
2938 }
2939 else {
2940 /* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */
2941 Py_INCREF(z); /* still holds 1L */
2942 table[0] = z;
2943 for (i = 1; i < 32; ++i)
2944 MULT(table[i-1], a, table[i])
2945
Christian Heimese93237d2007-12-19 02:37:44 +00002946 for (i = Py_SIZE(b) - 1; i >= 0; --i) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002947 const digit bi = b->ob_digit[i];
2948
Christian Heimes7f39c9f2008-01-25 12:18:43 +00002949 for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002950 const int index = (bi >> j) & 0x1f;
2951 for (k = 0; k < 5; ++k)
2952 MULT(z, z, z)
2953 if (index)
2954 MULT(z, table[index], z)
2955 }
2956 }
2957 }
2958
Christian Heimese93237d2007-12-19 02:37:44 +00002959 if (negativeOutput && (Py_SIZE(z) != 0)) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002960 temp = (PyLongObject *)long_sub(z, c);
2961 if (temp == NULL)
2962 goto Error;
2963 Py_DECREF(z);
2964 z = temp;
2965 temp = NULL;
2966 }
2967 goto Done;
2968
2969 Error:
2970 if (z != NULL) {
2971 Py_DECREF(z);
2972 z = NULL;
2973 }
2974 /* fall through */
2975 Done:
Christian Heimese93237d2007-12-19 02:37:44 +00002976 if (Py_SIZE(b) > FIVEARY_CUTOFF) {
Tim Peters47e52ee2004-08-30 02:44:38 +00002977 for (i = 0; i < 32; ++i)
2978 Py_XDECREF(table[i]);
2979 }
Tim Petersde7990b2005-07-17 23:45:23 +00002980 Py_DECREF(a);
2981 Py_DECREF(b);
2982 Py_XDECREF(c);
2983 Py_XDECREF(temp);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002984 return (PyObject *)z;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002985}
2986
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002987static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00002988long_invert(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00002989{
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002990 /* Implement ~x as -(x+1) */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002991 PyLongObject *x;
2992 PyLongObject *w;
2993 w = (PyLongObject *)PyLong_FromLong(1L);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002994 if (w == NULL)
2995 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002996 x = (PyLongObject *) long_add(v, w);
2997 Py_DECREF(w);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00002998 if (x == NULL)
2999 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00003000 Py_SIZE(x) = -(Py_SIZE(x));
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003001 return (PyObject *)x;
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003002}
3003
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003004static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003005long_neg(PyLongObject *v)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003006{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003007 PyLongObject *z;
Tim Peters69c2de32001-09-11 22:31:33 +00003008 if (v->ob_size == 0 && PyLong_CheckExact(v)) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003009 /* -0 == 0 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003010 Py_INCREF(v);
3011 return (PyObject *) v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003012 }
Tim Peters69c2de32001-09-11 22:31:33 +00003013 z = (PyLongObject *)_PyLong_Copy(v);
3014 if (z != NULL)
3015 z->ob_size = -(v->ob_size);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003016 return (PyObject *)z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003017}
3018
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003019static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003020long_abs(PyLongObject *v)
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003021{
3022 if (v->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003023 return long_neg(v);
Tim Peters69c2de32001-09-11 22:31:33 +00003024 else
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003025 return long_long((PyObject *)v);
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003026}
3027
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00003028static int
Tim Peters9f688bf2000-07-07 15:53:28 +00003029long_nonzero(PyLongObject *v)
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00003030{
Christian Heimese93237d2007-12-19 02:37:44 +00003031 return ABS(Py_SIZE(v)) != 0;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003032}
3033
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003034static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003035long_rshift(PyLongObject *v, PyLongObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003036{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003037 PyLongObject *a, *b;
3038 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003039 long shiftby;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003040 Py_ssize_t newsize, wordshift, loshift, hishift, i, j;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003041 digit lomask, himask;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003042
Neil Schemenauerba872e22001-01-04 01:46:03 +00003043 CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
3044
Christian Heimese93237d2007-12-19 02:37:44 +00003045 if (Py_SIZE(a) < 0) {
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003046 /* Right shifting negative numbers is harder */
Neil Schemenauerba872e22001-01-04 01:46:03 +00003047 PyLongObject *a1, *a2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003048 a1 = (PyLongObject *) long_invert(a);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003049 if (a1 == NULL)
3050 goto rshift_error;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003051 a2 = (PyLongObject *) long_rshift(a1, b);
3052 Py_DECREF(a1);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003053 if (a2 == NULL)
3054 goto rshift_error;
3055 z = (PyLongObject *) long_invert(a2);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003056 Py_DECREF(a2);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003057 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00003058 else {
Tim Peters5af4e6c2002-08-12 02:31:19 +00003059
Neil Schemenauerba872e22001-01-04 01:46:03 +00003060 shiftby = PyLong_AsLong((PyObject *)b);
3061 if (shiftby == -1L && PyErr_Occurred())
3062 goto rshift_error;
3063 if (shiftby < 0) {
3064 PyErr_SetString(PyExc_ValueError,
3065 "negative shift count");
3066 goto rshift_error;
3067 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003068 wordshift = shiftby / PyLong_SHIFT;
Christian Heimese93237d2007-12-19 02:37:44 +00003069 newsize = ABS(Py_SIZE(a)) - wordshift;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003070 if (newsize <= 0) {
3071 z = _PyLong_New(0);
3072 Py_DECREF(a);
3073 Py_DECREF(b);
3074 return (PyObject *)z;
3075 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003076 loshift = shiftby % PyLong_SHIFT;
3077 hishift = PyLong_SHIFT - loshift;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003078 lomask = ((digit)1 << hishift) - 1;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003079 himask = PyLong_MASK ^ lomask;
Neil Schemenauerba872e22001-01-04 01:46:03 +00003080 z = _PyLong_New(newsize);
3081 if (z == NULL)
3082 goto rshift_error;
Christian Heimese93237d2007-12-19 02:37:44 +00003083 if (Py_SIZE(a) < 0)
3084 Py_SIZE(z) = -(Py_SIZE(z));
Neil Schemenauerba872e22001-01-04 01:46:03 +00003085 for (i = 0, j = wordshift; i < newsize; i++, j++) {
3086 z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
3087 if (i+1 < newsize)
3088 z->ob_digit[i] |=
3089 (a->ob_digit[j+1] << hishift) & himask;
3090 }
3091 z = long_normalize(z);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003092 }
Neil Schemenauerba872e22001-01-04 01:46:03 +00003093rshift_error:
3094 Py_DECREF(a);
3095 Py_DECREF(b);
3096 return (PyObject *) z;
3097
Guido van Rossumc6913e71991-11-19 20:26:46 +00003098}
3099
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003100static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003101long_lshift(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003102{
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003103 /* This version due to Tim Peters */
Neil Schemenauerba872e22001-01-04 01:46:03 +00003104 PyLongObject *a, *b;
3105 PyLongObject *z = NULL;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003106 long shiftby;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003107 Py_ssize_t oldsize, newsize, wordshift, remshift, i, j;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003108 twodigits accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003109
Neil Schemenauerba872e22001-01-04 01:46:03 +00003110 CONVERT_BINOP(v, w, &a, &b);
3111
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003112 shiftby = PyLong_AsLong((PyObject *)b);
3113 if (shiftby == -1L && PyErr_Occurred())
Neil Schemenauerba872e22001-01-04 01:46:03 +00003114 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003115 if (shiftby < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003116 PyErr_SetString(PyExc_ValueError, "negative shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00003117 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003118 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003119 if ((long)(int)shiftby != shiftby) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003120 PyErr_SetString(PyExc_ValueError,
3121 "outrageous left shift count");
Neil Schemenauerba872e22001-01-04 01:46:03 +00003122 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003123 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003124 /* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
3125 wordshift = (int)shiftby / PyLong_SHIFT;
3126 remshift = (int)shiftby - wordshift * PyLong_SHIFT;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003127
3128 oldsize = ABS(a->ob_size);
3129 newsize = oldsize + wordshift;
3130 if (remshift)
3131 ++newsize;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003132 z = _PyLong_New(newsize);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003133 if (z == NULL)
Neil Schemenauerba872e22001-01-04 01:46:03 +00003134 goto lshift_error;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003135 if (a->ob_size < 0)
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003136 z->ob_size = -(z->ob_size);
Guido van Rossumc6913e71991-11-19 20:26:46 +00003137 for (i = 0; i < wordshift; i++)
3138 z->ob_digit[i] = 0;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003139 accum = 0;
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003140 for (i = wordshift, j = 0; j < oldsize; i++, j++) {
Tim Peters0d2d87d2002-08-20 19:00:22 +00003141 accum |= (twodigits)a->ob_digit[j] << remshift;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003142 z->ob_digit[i] = (digit)(accum & PyLong_MASK);
3143 accum >>= PyLong_SHIFT;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003144 }
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003145 if (remshift)
3146 z->ob_digit[newsize-1] = (digit)accum;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003147 else
Guido van Rossumf2e499b1997-03-16 00:37:59 +00003148 assert(!accum);
Neil Schemenauerba872e22001-01-04 01:46:03 +00003149 z = long_normalize(z);
3150lshift_error:
3151 Py_DECREF(a);
3152 Py_DECREF(b);
3153 return (PyObject *) z;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003154}
3155
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003156
3157/* Bitwise and/xor/or operations */
3158
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003159static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003160long_bitwise(PyLongObject *a,
3161 int op, /* '&', '|', '^' */
3162 PyLongObject *b)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003163{
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003164 digit maska, maskb; /* 0 or PyLong_MASK */
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003165 int negz;
Mark Dickinsonbcf6b182009-02-15 15:48:39 +00003166 Py_ssize_t size_a, size_b, size_z, i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003167 PyLongObject *z;
Guido van Rossum8b27d921992-03-27 17:27:05 +00003168 digit diga, digb;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003169 PyObject *v;
Tim Peters5af4e6c2002-08-12 02:31:19 +00003170
Christian Heimese93237d2007-12-19 02:37:44 +00003171 if (Py_SIZE(a) < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003172 a = (PyLongObject *) long_invert(a);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003173 if (a == NULL)
3174 return NULL;
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003175 maska = PyLong_MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003176 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003177 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003178 Py_INCREF(a);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003179 maska = 0;
Guido van Rossumafbb8db1991-12-31 13:14:13 +00003180 }
Christian Heimese93237d2007-12-19 02:37:44 +00003181 if (Py_SIZE(b) < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003182 b = (PyLongObject *) long_invert(b);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003183 if (b == NULL) {
3184 Py_DECREF(a);
3185 return NULL;
3186 }
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003187 maskb = PyLong_MASK;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003188 }
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003189 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003190 Py_INCREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003191 maskb = 0;
3192 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003193
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003194 negz = 0;
3195 switch (op) {
3196 case '^':
3197 if (maska != maskb) {
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003198 maska ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003199 negz = -1;
3200 }
3201 break;
Guido van Rossumeb1fafc1994-08-29 12:47:19 +00003202 case '&':
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003203 if (maska && maskb) {
3204 op = '|';
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003205 maska ^= PyLong_MASK;
3206 maskb ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003207 negz = -1;
3208 }
3209 break;
3210 case '|':
3211 if (maska || maskb) {
3212 op = '&';
Christian Heimes7f39c9f2008-01-25 12:18:43 +00003213 maska ^= PyLong_MASK;
3214 maskb ^= PyLong_MASK;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003215 negz = -1;
3216 }
3217 break;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003218 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003219
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003220 /* JRH: The original logic here was to allocate the result value (z)
3221 as the longer of the two operands. However, there are some cases
3222 where the result is guaranteed to be shorter than that: AND of two
3223 positives, OR of two negatives: use the shorter number. AND with
3224 mixed signs: use the positive number. OR with mixed signs: use the
3225 negative number. After the transformations above, op will be '&'
3226 iff one of these cases applies, and mask will be non-0 for operands
3227 whose length should be ignored.
3228 */
3229
Christian Heimese93237d2007-12-19 02:37:44 +00003230 size_a = Py_SIZE(a);
3231 size_b = Py_SIZE(b);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003232 size_z = op == '&'
3233 ? (maska
3234 ? size_b
3235 : (maskb ? size_a : MIN(size_a, size_b)))
3236 : MAX(size_a, size_b);
3237 z = _PyLong_New(size_z);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003238 if (z == NULL) {
Neal Norwitzef02b9e2006-07-16 02:00:32 +00003239 Py_DECREF(a);
3240 Py_DECREF(b);
Guido van Rossumbd3a5271998-08-11 15:04:47 +00003241 return NULL;
3242 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003243
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003244 for (i = 0; i < size_z; ++i) {
3245 diga = (i < size_a ? a->ob_digit[i] : 0) ^ maska;
3246 digb = (i < size_b ? b->ob_digit[i] : 0) ^ maskb;
3247 switch (op) {
3248 case '&': z->ob_digit[i] = diga & digb; break;
3249 case '|': z->ob_digit[i] = diga | digb; break;
3250 case '^': z->ob_digit[i] = diga ^ digb; break;
3251 }
Guido van Rossumafbb8db1991-12-31 13:14:13 +00003252 }
Tim Peters5af4e6c2002-08-12 02:31:19 +00003253
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003254 Py_DECREF(a);
3255 Py_DECREF(b);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003256 z = long_normalize(z);
3257 if (negz == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003258 return (PyObject *) z;
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003259 v = long_invert(z);
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003260 Py_DECREF(z);
Guido van Rossum4c260ff1992-01-14 18:36:43 +00003261 return v;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003262}
3263
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003264static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003265long_and(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003266{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003267 PyLongObject *a, *b;
3268 PyObject *c;
3269 CONVERT_BINOP(v, w, &a, &b);
3270 c = long_bitwise(a, '&', b);
3271 Py_DECREF(a);
3272 Py_DECREF(b);
3273 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003274}
3275
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003276static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003277long_xor(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003278{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003279 PyLongObject *a, *b;
3280 PyObject *c;
3281 CONVERT_BINOP(v, w, &a, &b);
3282 c = long_bitwise(a, '^', b);
3283 Py_DECREF(a);
3284 Py_DECREF(b);
3285 return c;
Guido van Rossumc6913e71991-11-19 20:26:46 +00003286}
3287
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003288static PyObject *
Neil Schemenauerba872e22001-01-04 01:46:03 +00003289long_or(PyObject *v, PyObject *w)
Guido van Rossumc6913e71991-11-19 20:26:46 +00003290{
Neil Schemenauerba872e22001-01-04 01:46:03 +00003291 PyLongObject *a, *b;
3292 PyObject *c;
3293 CONVERT_BINOP(v, w, &a, &b);
3294 c = long_bitwise(a, '|', b);
3295 Py_DECREF(a);
3296 Py_DECREF(b);
3297 return c;
Guido van Rossum23d6f0e1991-05-14 12:06:49 +00003298}
3299
Guido van Rossum234f9421993-06-17 12:35:49 +00003300static int
Tim Peters9f688bf2000-07-07 15:53:28 +00003301long_coerce(PyObject **pv, PyObject **pw)
Guido van Rossume6eefc21992-08-14 12:06:52 +00003302{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003303 if (PyInt_Check(*pw)) {
Neil Schemenauerba872e22001-01-04 01:46:03 +00003304 *pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
Georg Brandlc02e1312007-04-11 17:16:24 +00003305 if (*pw == NULL)
3306 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003307 Py_INCREF(*pv);
Guido van Rossume6eefc21992-08-14 12:06:52 +00003308 return 0;
3309 }
Guido van Rossum1952e382001-09-19 01:25:16 +00003310 else if (PyLong_Check(*pw)) {
3311 Py_INCREF(*pv);
3312 Py_INCREF(*pw);
3313 return 0;
3314 }
Guido van Rossume6eefc21992-08-14 12:06:52 +00003315 return 1; /* Can't do it */
3316}
3317
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003318static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003319long_long(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003320{
Brett Cannonc3647ac2005-04-26 03:45:26 +00003321 if (PyLong_CheckExact(v))
3322 Py_INCREF(v);
3323 else
3324 v = _PyLong_Copy((PyLongObject *)v);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003325 return v;
3326}
3327
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003328static PyObject *
Walter Dörwaldf1715402002-11-19 20:49:15 +00003329long_int(PyObject *v)
3330{
3331 long x;
3332 x = PyLong_AsLong(v);
3333 if (PyErr_Occurred()) {
3334 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
3335 PyErr_Clear();
3336 if (PyLong_CheckExact(v)) {
3337 Py_INCREF(v);
3338 return v;
3339 }
3340 else
3341 return _PyLong_Copy((PyLongObject *)v);
3342 }
3343 else
3344 return NULL;
3345 }
3346 return PyInt_FromLong(x);
3347}
3348
3349static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003350long_float(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003351{
Guido van Rossum09e6ad01997-02-14 22:54:21 +00003352 double result;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003353 result = PyLong_AsDouble(v);
Tim Peters9fffa3e2001-09-04 05:14:19 +00003354 if (result == -1.0 && PyErr_Occurred())
3355 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003356 return PyFloat_FromDouble(result);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003357}
3358
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003359static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003360long_oct(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003361{
Eric Smith5e527eb2008-02-10 01:36:53 +00003362 return _PyLong_Format(v, 8, 1, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003363}
3364
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003365static PyObject *
Tim Peters9f688bf2000-07-07 15:53:28 +00003366long_hex(PyObject *v)
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003367{
Eric Smith5e527eb2008-02-10 01:36:53 +00003368 return _PyLong_Format(v, 16, 1, 0);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003369}
Jeremy Hylton938ace62002-07-17 16:30:39 +00003370
3371static PyObject *
Guido van Rossumbef14172001-08-29 15:47:46 +00003372long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
Guido van Rossum1899c2e1992-09-12 11:09:23 +00003373
Tim Peters6d6c1a32001-08-02 04:15:00 +00003374static PyObject *
3375long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3376{
3377 PyObject *x = NULL;
3378 int base = -909; /* unlikely! */
Martin v. Löwis15e62742006-02-27 16:46:16 +00003379 static char *kwlist[] = {"x", "base", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00003380
Guido van Rossumbef14172001-08-29 15:47:46 +00003381 if (type != &PyLong_Type)
3382 return long_subtype_new(type, args, kwds); /* Wimp out */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003383 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
3384 &x, &base))
3385 return NULL;
3386 if (x == NULL)
3387 return PyLong_FromLong(0L);
3388 if (base == -909)
3389 return PyNumber_Long(x);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003390 else if (PyString_Check(x)) {
Georg Brandl00cd8182007-03-06 18:41:12 +00003391 /* Since PyLong_FromString doesn't have a length parameter,
3392 * check here for possible NULs in the string. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003393 char *string = PyString_AS_STRING(x);
Mark Dickinson2ffb26f2009-02-15 10:13:41 +00003394 if (strlen(string) != (size_t)PyString_Size(x)) {
Georg Brandl00cd8182007-03-06 18:41:12 +00003395 /* create a repr() of the input string,
3396 * just like PyLong_FromString does. */
3397 PyObject *srepr;
3398 srepr = PyObject_Repr(x);
3399 if (srepr == NULL)
3400 return NULL;
3401 PyErr_Format(PyExc_ValueError,
3402 "invalid literal for long() with base %d: %s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003403 base, PyString_AS_STRING(srepr));
Georg Brandl00cd8182007-03-06 18:41:12 +00003404 Py_DECREF(srepr);
3405 return NULL;
3406 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003407 return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
Georg Brandl00cd8182007-03-06 18:41:12 +00003408 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003409#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00003410 else if (PyUnicode_Check(x))
3411 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
3412 PyUnicode_GET_SIZE(x),
3413 base);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003414#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003415 else {
3416 PyErr_SetString(PyExc_TypeError,
3417 "long() can't convert non-string with explicit base");
3418 return NULL;
3419 }
3420}
3421
Guido van Rossumbef14172001-08-29 15:47:46 +00003422/* Wimpy, slow approach to tp_new calls for subtypes of long:
3423 first create a regular long from whatever arguments we got,
3424 then allocate a subtype instance and initialize it from
3425 the regular long. The regular long is then thrown away.
3426*/
3427static PyObject *
3428long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3429{
Anthony Baxter377be112006-04-11 06:54:30 +00003430 PyLongObject *tmp, *newobj;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003431 Py_ssize_t i, n;
Guido van Rossumbef14172001-08-29 15:47:46 +00003432
3433 assert(PyType_IsSubtype(type, &PyLong_Type));
3434 tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
3435 if (tmp == NULL)
3436 return NULL;
Tim Peters64b5ce32001-09-10 20:52:51 +00003437 assert(PyLong_CheckExact(tmp));
Christian Heimese93237d2007-12-19 02:37:44 +00003438 n = Py_SIZE(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003439 if (n < 0)
3440 n = -n;
Anthony Baxter377be112006-04-11 06:54:30 +00003441 newobj = (PyLongObject *)type->tp_alloc(type, n);
3442 if (newobj == NULL) {
Raymond Hettingerf4667932003-06-28 20:04:25 +00003443 Py_DECREF(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003444 return NULL;
Raymond Hettingerf4667932003-06-28 20:04:25 +00003445 }
Anthony Baxter377be112006-04-11 06:54:30 +00003446 assert(PyLong_Check(newobj));
Christian Heimese93237d2007-12-19 02:37:44 +00003447 Py_SIZE(newobj) = Py_SIZE(tmp);
Guido van Rossumbef14172001-08-29 15:47:46 +00003448 for (i = 0; i < n; i++)
Anthony Baxter377be112006-04-11 06:54:30 +00003449 newobj->ob_digit[i] = tmp->ob_digit[i];
Guido van Rossumbef14172001-08-29 15:47:46 +00003450 Py_DECREF(tmp);
Anthony Baxter377be112006-04-11 06:54:30 +00003451 return (PyObject *)newobj;
Guido van Rossumbef14172001-08-29 15:47:46 +00003452}
3453
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003454static PyObject *
3455long_getnewargs(PyLongObject *v)
3456{
3457 return Py_BuildValue("(N)", _PyLong_Copy(v));
3458}
3459
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003460static PyObject *
3461long_getN(PyLongObject *v, void *context) {
Jeffrey Yasskin5de250e2008-03-18 01:09:59 +00003462 return PyLong_FromLong((Py_intptr_t)context);
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003463}
3464
Eric Smitha9f7d622008-02-17 19:46:49 +00003465static PyObject *
3466long__format__(PyObject *self, PyObject *args)
3467{
3468 PyObject *format_spec;
3469
3470 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
3471 return NULL;
Christian Heimes593daf52008-05-26 12:51:38 +00003472 if (PyBytes_Check(format_spec))
Eric Smithdc13b792008-05-30 18:10:04 +00003473 return _PyLong_FormatAdvanced(self,
3474 PyBytes_AS_STRING(format_spec),
3475 PyBytes_GET_SIZE(format_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00003476 if (PyUnicode_Check(format_spec)) {
3477 /* Convert format_spec to a str */
Eric Smithdc13b792008-05-30 18:10:04 +00003478 PyObject *result;
3479 PyObject *str_spec = PyObject_Str(format_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00003480
Eric Smithdc13b792008-05-30 18:10:04 +00003481 if (str_spec == NULL)
3482 return NULL;
Eric Smitha9f7d622008-02-17 19:46:49 +00003483
Eric Smithdc13b792008-05-30 18:10:04 +00003484 result = _PyLong_FormatAdvanced(self,
3485 PyBytes_AS_STRING(str_spec),
3486 PyBytes_GET_SIZE(str_spec));
Eric Smitha9f7d622008-02-17 19:46:49 +00003487
Eric Smithdc13b792008-05-30 18:10:04 +00003488 Py_DECREF(str_spec);
Eric Smitha9f7d622008-02-17 19:46:49 +00003489 return result;
3490 }
3491 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
3492 return NULL;
3493}
3494
Robert Schuppenies51df0642008-06-01 16:16:17 +00003495static PyObject *
3496long_sizeof(PyLongObject *v)
3497{
3498 Py_ssize_t res;
3499
Mark Dickinson2ffb26f2009-02-15 10:13:41 +00003500 res = v->ob_type->tp_basicsize + ABS(Py_SIZE(v))*sizeof(digit);
Robert Schuppenies51df0642008-06-01 16:16:17 +00003501 return PyInt_FromSsize_t(res);
3502}
3503
Mark Dickinson1a707982008-12-17 16:14:37 +00003504static PyObject *
3505long_bit_length(PyLongObject *v)
3506{
3507 PyLongObject *result, *x, *y;
3508 Py_ssize_t ndigits, msd_bits = 0;
3509 digit msd;
3510
3511 assert(v != NULL);
3512 assert(PyLong_Check(v));
3513
3514 ndigits = ABS(Py_SIZE(v));
3515 if (ndigits == 0)
3516 return PyInt_FromLong(0);
3517
3518 msd = v->ob_digit[ndigits-1];
3519 while (msd >= 32) {
3520 msd_bits += 6;
3521 msd >>= 6;
3522 }
3523 msd_bits += (long)(BitLengthTable[msd]);
3524
3525 if (ndigits <= PY_SSIZE_T_MAX/PyLong_SHIFT)
3526 return PyInt_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits);
3527
3528 /* expression above may overflow; use Python integers instead */
3529 result = (PyLongObject *)PyLong_FromSsize_t(ndigits - 1);
3530 if (result == NULL)
3531 return NULL;
3532 x = (PyLongObject *)PyLong_FromLong(PyLong_SHIFT);
3533 if (x == NULL)
3534 goto error;
3535 y = (PyLongObject *)long_mul(result, x);
3536 Py_DECREF(x);
3537 if (y == NULL)
3538 goto error;
3539 Py_DECREF(result);
3540 result = y;
3541
3542 x = (PyLongObject *)PyLong_FromLong(msd_bits);
3543 if (x == NULL)
3544 goto error;
3545 y = (PyLongObject *)long_add(result, x);
3546 Py_DECREF(x);
3547 if (y == NULL)
3548 goto error;
3549 Py_DECREF(result);
3550 result = y;
3551
3552 return (PyObject *)result;
3553
3554error:
3555 Py_DECREF(result);
3556 return NULL;
3557}
3558
3559PyDoc_STRVAR(long_bit_length_doc,
3560"long.bit_length() -> int or long\n\
3561\n\
3562Number of bits necessary to represent self in binary.\n\
3563>>> bin(37L)\n\
3564'0b100101'\n\
3565>>> (37L).bit_length()\n\
35666");
3567
Christian Heimes6f341092008-04-18 23:13:07 +00003568#if 0
3569static PyObject *
3570long_is_finite(PyObject *v)
3571{
3572 Py_RETURN_TRUE;
3573}
3574#endif
3575
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003576static PyMethodDef long_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003577 {"conjugate", (PyCFunction)long_long, METH_NOARGS,
3578 "Returns self, the complex conjugate of any long."},
Mark Dickinson1a707982008-12-17 16:14:37 +00003579 {"bit_length", (PyCFunction)long_bit_length, METH_NOARGS,
3580 long_bit_length_doc},
Christian Heimes6f341092008-04-18 23:13:07 +00003581#if 0
3582 {"is_finite", (PyCFunction)long_is_finite, METH_NOARGS,
3583 "Returns always True."},
3584#endif
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003585 {"__trunc__", (PyCFunction)long_long, METH_NOARGS,
3586 "Truncating an Integral returns itself."},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003587 {"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
Eric Smitha9f7d622008-02-17 19:46:49 +00003588 {"__format__", (PyCFunction)long__format__, METH_VARARGS},
Robert Schuppenies51df0642008-06-01 16:16:17 +00003589 {"__sizeof__", (PyCFunction)long_sizeof, METH_NOARGS,
Georg Brandl7a6de8b2008-06-01 16:42:16 +00003590 "Returns size in memory, in bytes"},
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003591 {NULL, NULL} /* sentinel */
3592};
3593
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003594static PyGetSetDef long_getset[] = {
3595 {"real",
3596 (getter)long_long, (setter)NULL,
3597 "the real part of a complex number",
3598 NULL},
3599 {"imag",
3600 (getter)long_getN, (setter)NULL,
3601 "the imaginary part of a complex number",
3602 (void*)0},
3603 {"numerator",
3604 (getter)long_long, (setter)NULL,
3605 "the numerator of a rational number in lowest terms",
3606 NULL},
3607 {"denominator",
3608 (getter)long_getN, (setter)NULL,
3609 "the denominator of a rational number in lowest terms",
3610 (void*)1},
3611 {NULL} /* Sentinel */
3612};
3613
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003614PyDoc_STRVAR(long_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00003615"long(x[, base]) -> integer\n\
3616\n\
3617Convert a string or number to a long integer, if possible. A floating\n\
3618point argument will be truncated towards zero (this does not include a\n\
3619string representation of a floating point number!) When converting a\n\
3620string, use the optional base. It is an error to supply a base when\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003621converting a non-string.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00003622
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003623static PyNumberMethods long_as_number = {
Tim Peters9f688bf2000-07-07 15:53:28 +00003624 (binaryfunc) long_add, /*nb_add*/
3625 (binaryfunc) long_sub, /*nb_subtract*/
3626 (binaryfunc) long_mul, /*nb_multiply*/
Georg Brandl347b3002006-03-30 11:57:00 +00003627 long_classic_div, /*nb_divide*/
3628 long_mod, /*nb_remainder*/
3629 long_divmod, /*nb_divmod*/
3630 long_pow, /*nb_power*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003631 (unaryfunc) long_neg, /*nb_negative*/
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003632 (unaryfunc) long_long, /*tp_positive*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003633 (unaryfunc) long_abs, /*tp_absolute*/
3634 (inquiry) long_nonzero, /*tp_nonzero*/
3635 (unaryfunc) long_invert, /*nb_invert*/
Georg Brandl347b3002006-03-30 11:57:00 +00003636 long_lshift, /*nb_lshift*/
Tim Peters9f688bf2000-07-07 15:53:28 +00003637 (binaryfunc) long_rshift, /*nb_rshift*/
Georg Brandl347b3002006-03-30 11:57:00 +00003638 long_and, /*nb_and*/
3639 long_xor, /*nb_xor*/
3640 long_or, /*nb_or*/
3641 long_coerce, /*nb_coerce*/
3642 long_int, /*nb_int*/
3643 long_long, /*nb_long*/
3644 long_float, /*nb_float*/
3645 long_oct, /*nb_oct*/
3646 long_hex, /*nb_hex*/
Guido van Rossum4668b002001-08-08 05:00:18 +00003647 0, /* nb_inplace_add */
3648 0, /* nb_inplace_subtract */
3649 0, /* nb_inplace_multiply */
3650 0, /* nb_inplace_divide */
3651 0, /* nb_inplace_remainder */
3652 0, /* nb_inplace_power */
3653 0, /* nb_inplace_lshift */
3654 0, /* nb_inplace_rshift */
3655 0, /* nb_inplace_and */
3656 0, /* nb_inplace_xor */
3657 0, /* nb_inplace_or */
Georg Brandl347b3002006-03-30 11:57:00 +00003658 long_div, /* nb_floor_divide */
Guido van Rossum4668b002001-08-08 05:00:18 +00003659 long_true_divide, /* nb_true_divide */
3660 0, /* nb_inplace_floor_divide */
3661 0, /* nb_inplace_true_divide */
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003662 long_long, /* nb_index */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003663};
3664
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003665PyTypeObject PyLong_Type = {
3666 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003667 0, /* ob_size */
3668 "long", /* tp_name */
Mark Dickinson2ffb26f2009-02-15 10:13:41 +00003669 offsetof(PyLongObject, ob_digit), /* tp_basicsize */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003670 sizeof(digit), /* tp_itemsize */
Georg Brandl347b3002006-03-30 11:57:00 +00003671 long_dealloc, /* tp_dealloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003672 0, /* tp_print */
3673 0, /* tp_getattr */
3674 0, /* tp_setattr */
3675 (cmpfunc)long_compare, /* tp_compare */
Georg Brandl347b3002006-03-30 11:57:00 +00003676 long_repr, /* tp_repr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003677 &long_as_number, /* tp_as_number */
3678 0, /* tp_as_sequence */
3679 0, /* tp_as_mapping */
3680 (hashfunc)long_hash, /* tp_hash */
3681 0, /* tp_call */
Georg Brandl347b3002006-03-30 11:57:00 +00003682 long_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003683 PyObject_GenericGetAttr, /* tp_getattro */
3684 0, /* tp_setattro */
3685 0, /* tp_as_buffer */
Guido van Rossumbef14172001-08-29 15:47:46 +00003686 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00003687 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003688 long_doc, /* tp_doc */
3689 0, /* tp_traverse */
3690 0, /* tp_clear */
3691 0, /* tp_richcompare */
3692 0, /* tp_weaklistoffset */
3693 0, /* tp_iter */
3694 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +00003695 long_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003696 0, /* tp_members */
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +00003697 long_getset, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003698 0, /* tp_base */
3699 0, /* tp_dict */
3700 0, /* tp_descr_get */
3701 0, /* tp_descr_set */
3702 0, /* tp_dictoffset */
3703 0, /* tp_init */
3704 0, /* tp_alloc */
3705 long_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00003706 PyObject_Del, /* tp_free */
Guido van Rossumedcc38a1991-05-05 20:09:44 +00003707};
Mark Dickinsonefc82f72009-03-20 15:51:55 +00003708
3709static PyTypeObject Long_InfoType;
3710
3711PyDoc_STRVAR(long_info__doc__,
3712"sys.long_info\n\
3713\n\
3714A struct sequence that holds information about Python's\n\
3715internal representation of integers. The attributes are read only.");
3716
3717static PyStructSequence_Field long_info_fields[] = {
3718 {"bits_per_digit", "size of a digit in bits"},
3719 {"sizeof_digit", "size in bytes of the C type used to "
3720 "represent a digit"},
3721 {NULL, NULL}
3722};
3723
3724static PyStructSequence_Desc long_info_desc = {
3725 "sys.long_info", /* name */
3726 long_info__doc__, /* doc */
3727 long_info_fields, /* fields */
3728 2 /* number of fields */
3729};
3730
3731PyObject *
3732PyLong_GetInfo(void)
3733{
3734 PyObject* long_info;
3735 int field = 0;
3736 long_info = PyStructSequence_New(&Long_InfoType);
3737 if (long_info == NULL)
3738 return NULL;
3739 PyStructSequence_SET_ITEM(long_info, field++, PyLong_FromLong(PyLong_SHIFT));
3740 PyStructSequence_SET_ITEM(long_info, field++, PyLong_FromLong(sizeof(digit)));
3741 if (PyErr_Occurred()) {
3742 Py_CLEAR(long_info);
3743 return NULL;
3744 }
3745 return long_info;
3746}
3747
3748int
3749_PyLong_Init(void)
3750{
3751 /* initialize long_info */
3752 if (Long_InfoType.tp_name == 0)
3753 PyStructSequence_InitType(&Long_InfoType, &long_info_desc);
3754 return 1;
3755}