1991-05-05 17:09:44 -03:00
|
|
|
|
2005-12-10 14:50:16 -04:00
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
/* Long (arbitrary precision) integer object implementation */
|
|
|
|
|
1991-05-14 09:06:49 -03:00
|
|
|
/* XXX The functional organization of this file is terrible */
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
#include "Python.h"
|
1991-05-05 17:09:44 -03:00
|
|
|
#include "longintrepr.h"
|
2009-03-20 12:51:55 -03:00
|
|
|
#include "structseq.h"
|
1997-05-02 00:12:38 -03:00
|
|
|
|
2009-04-20 18:13:33 -03:00
|
|
|
#include <float.h>
|
1994-08-29 09:47:19 -03:00
|
|
|
#include <ctype.h>
|
2009-02-15 06:13:41 -04:00
|
|
|
#include <stddef.h>
|
1991-05-05 17:09:44 -03:00
|
|
|
|
2002-08-11 23:31:19 -03:00
|
|
|
/* For long multiplication, use the O(N**2) school algorithm unless
|
|
|
|
* both operands contain more than KARATSUBA_CUTOFF digits (this
|
2008-01-25 08:18:43 -04:00
|
|
|
* being an internal Python long digit, in base PyLong_BASE).
|
2002-08-11 23:31:19 -03:00
|
|
|
*/
|
2004-08-29 19:16:50 -03:00
|
|
|
#define KARATSUBA_CUTOFF 70
|
|
|
|
#define KARATSUBA_SQUARE_CUTOFF (2 * KARATSUBA_CUTOFF)
|
2002-08-11 23:31:19 -03:00
|
|
|
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
/* For exponentiation, use the binary left-to-right algorithm
|
|
|
|
* unless the exponent contains more than FIVEARY_CUTOFF digits.
|
|
|
|
* In that case, do 5 bits at a time. The potential drawback is that
|
|
|
|
* a table of 2**5 intermediate results is computed.
|
|
|
|
*/
|
|
|
|
#define FIVEARY_CUTOFF 8
|
|
|
|
|
1992-01-19 12:31:05 -04:00
|
|
|
#define ABS(x) ((x) < 0 ? -(x) : (x))
|
|
|
|
|
2002-08-11 23:31:19 -03:00
|
|
|
#undef MIN
|
|
|
|
#undef MAX
|
|
|
|
#define MAX(x, y) ((x) < (y) ? (y) : (x))
|
|
|
|
#define MIN(x, y) ((x) > (y) ? (y) : (x))
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
#define SIGCHECK(PyTryBlock) \
|
2002-09-03 17:10:45 -03:00
|
|
|
if (--_Py_Ticker < 0) { \
|
|
|
|
_Py_Ticker = _Py_CheckInterval; \
|
2006-05-25 19:28:46 -03:00
|
|
|
if (PyErr_CheckSignals()) PyTryBlock \
|
1991-05-14 09:06:49 -03:00
|
|
|
}
|
|
|
|
|
2009-04-20 18:13:33 -03:00
|
|
|
/* forward declaration */
|
|
|
|
static int bits_in_digit(digit d);
|
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
/* Normalize (remove leading zeros from) a long int object.
|
|
|
|
Doesn't attempt to free the storage--in most cases, due to the nature
|
|
|
|
of the algorithms used, this could save at most be one word anyway. */
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyLongObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
long_normalize(register PyLongObject *v)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_ssize_t j = ABS(Py_SIZE(v));
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i = j;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
while (i > 0 && v->ob_digit[i-1] == 0)
|
|
|
|
--i;
|
|
|
|
if (i != j)
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(v) = (Py_SIZE(v) < 0) ? -(i) : i;
|
1991-05-05 17:09:44 -03:00
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Allocate a new long int object with size digits.
|
|
|
|
Return NULL and set exception if we run out of memory. */
|
|
|
|
|
2009-02-15 06:13:41 -04:00
|
|
|
#define MAX_LONG_DIGITS \
|
|
|
|
((PY_SSIZE_T_MAX - offsetof(PyLongObject, ob_digit))/sizeof(digit))
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *
|
2006-02-15 13:27:45 -04:00
|
|
|
_PyLong_New(Py_ssize_t size)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2009-02-15 11:48:39 -04:00
|
|
|
if (size > (Py_ssize_t)MAX_LONG_DIGITS) {
|
2009-02-15 06:13:41 -04:00
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
|
|
|
"too many digits in integer");
|
2006-02-15 13:27:45 -04:00
|
|
|
return NULL;
|
|
|
|
}
|
2008-01-18 15:12:56 -04:00
|
|
|
/* coverity[ampersand_in_size] */
|
2009-02-15 06:13:41 -04:00
|
|
|
/* XXX(nnorwitz): PyObject_NEW_VAR / _PyObject_VAR_SIZE need to detect
|
|
|
|
overflow */
|
1997-05-02 00:12:38 -03:00
|
|
|
return PyObject_NEW_VAR(PyLongObject, &PyLong_Type, size);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
2001-09-10 17:52:51 -03:00
|
|
|
PyObject *
|
|
|
|
_PyLong_Copy(PyLongObject *src)
|
|
|
|
{
|
|
|
|
PyLongObject *result;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i;
|
2001-09-10 17:52:51 -03:00
|
|
|
|
|
|
|
assert(src != NULL);
|
|
|
|
i = src->ob_size;
|
|
|
|
if (i < 0)
|
|
|
|
i = -(i);
|
|
|
|
result = _PyLong_New(i);
|
|
|
|
if (result != NULL) {
|
2002-03-02 00:18:04 -04:00
|
|
|
result->ob_size = src->ob_size;
|
2001-09-10 17:52:51 -03:00
|
|
|
while (--i >= 0)
|
|
|
|
result->ob_digit[i] = src->ob_digit[i];
|
|
|
|
}
|
|
|
|
return (PyObject *)result;
|
|
|
|
}
|
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
/* Create a new long int object from a C long int */
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
PyLong_FromLong(long ival)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2001-06-14 01:56:19 -03:00
|
|
|
PyLongObject *v;
|
2008-04-15 17:51:18 -03:00
|
|
|
unsigned long abs_ival;
|
2001-06-14 01:56:19 -03:00
|
|
|
unsigned long t; /* unsigned so >> doesn't propagate sign bit */
|
|
|
|
int ndigits = 0;
|
|
|
|
int negative = 0;
|
|
|
|
|
|
|
|
if (ival < 0) {
|
2008-04-15 17:51:18 -03:00
|
|
|
/* if LONG_MIN == -LONG_MAX-1 (true on most platforms) then
|
|
|
|
ANSI C says that the result of -ival is undefined when ival
|
|
|
|
== LONG_MIN. Hence the following workaround. */
|
|
|
|
abs_ival = (unsigned long)(-1-ival) + 1;
|
2001-06-14 01:56:19 -03:00
|
|
|
negative = 1;
|
|
|
|
}
|
2008-04-15 17:51:18 -03:00
|
|
|
else {
|
|
|
|
abs_ival = (unsigned long)ival;
|
|
|
|
}
|
2001-06-14 01:56:19 -03:00
|
|
|
|
|
|
|
/* Count the number of Python digits.
|
|
|
|
We used to pick 5 ("big enough for anything"), but that's a
|
|
|
|
waste of time and space given that 5*15 = 75 bits are rarely
|
|
|
|
needed. */
|
2008-04-15 17:51:18 -03:00
|
|
|
t = abs_ival;
|
2001-06-14 01:56:19 -03:00
|
|
|
while (t) {
|
|
|
|
++ndigits;
|
2008-01-25 08:18:43 -04:00
|
|
|
t >>= PyLong_SHIFT;
|
2001-06-14 01:56:19 -03:00
|
|
|
}
|
|
|
|
v = _PyLong_New(ndigits);
|
1991-05-05 17:09:44 -03:00
|
|
|
if (v != NULL) {
|
2001-06-14 01:56:19 -03:00
|
|
|
digit *p = v->ob_digit;
|
|
|
|
v->ob_size = negative ? -ndigits : ndigits;
|
2008-04-15 17:51:18 -03:00
|
|
|
t = abs_ival;
|
2001-06-14 01:56:19 -03:00
|
|
|
while (t) {
|
2008-01-25 08:18:43 -04:00
|
|
|
*p++ = (digit)(t & PyLong_MASK);
|
|
|
|
t >>= PyLong_SHIFT;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
}
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *)v;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
1997-01-03 13:14:46 -04:00
|
|
|
/* Create a new long int object from a C unsigned long int */
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
PyLong_FromUnsignedLong(unsigned long ival)
|
1997-01-03 13:14:46 -04:00
|
|
|
{
|
2001-06-14 01:56:19 -03:00
|
|
|
PyLongObject *v;
|
|
|
|
unsigned long t;
|
|
|
|
int ndigits = 0;
|
|
|
|
|
|
|
|
/* Count the number of Python digits. */
|
|
|
|
t = (unsigned long)ival;
|
|
|
|
while (t) {
|
|
|
|
++ndigits;
|
2008-01-25 08:18:43 -04:00
|
|
|
t >>= PyLong_SHIFT;
|
2001-06-14 01:56:19 -03:00
|
|
|
}
|
|
|
|
v = _PyLong_New(ndigits);
|
1997-01-03 13:14:46 -04:00
|
|
|
if (v != NULL) {
|
2001-06-14 01:56:19 -03:00
|
|
|
digit *p = v->ob_digit;
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(v) = ndigits;
|
2001-06-14 01:56:19 -03:00
|
|
|
while (ival) {
|
2008-01-25 08:18:43 -04:00
|
|
|
*p++ = (digit)(ival & PyLong_MASK);
|
|
|
|
ival >>= PyLong_SHIFT;
|
1997-01-03 13:14:46 -04:00
|
|
|
}
|
|
|
|
}
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *)v;
|
1997-01-03 13:14:46 -04:00
|
|
|
}
|
|
|
|
|
1991-06-03 07:58:24 -03:00
|
|
|
/* Create a new long int object from a C double */
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
PyObject *
|
|
|
|
PyLong_FromDouble(double dval)
|
1991-06-03 07:58:24 -03:00
|
|
|
{
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *v;
|
1991-06-03 07:58:24 -03:00
|
|
|
double frac;
|
|
|
|
int i, ndig, expo, neg;
|
|
|
|
neg = 0;
|
2000-08-15 00:34:48 -03:00
|
|
|
if (Py_IS_INFINITY(dval)) {
|
1999-09-27 14:11:52 -03:00
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
2008-08-04 18:30:09 -03:00
|
|
|
"cannot convert float infinity to integer");
|
1999-09-27 14:11:52 -03:00
|
|
|
return NULL;
|
|
|
|
}
|
2008-01-03 20:37:34 -04:00
|
|
|
if (Py_IS_NAN(dval)) {
|
2008-08-04 18:30:09 -03:00
|
|
|
PyErr_SetString(PyExc_ValueError,
|
|
|
|
"cannot convert float NaN to integer");
|
|
|
|
return NULL;
|
2008-01-03 20:37:34 -04:00
|
|
|
}
|
1991-06-03 07:58:24 -03:00
|
|
|
if (dval < 0.0) {
|
|
|
|
neg = 1;
|
|
|
|
dval = -dval;
|
|
|
|
}
|
|
|
|
frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */
|
|
|
|
if (expo <= 0)
|
1997-05-02 00:12:38 -03:00
|
|
|
return PyLong_FromLong(0L);
|
2008-01-25 08:18:43 -04:00
|
|
|
ndig = (expo-1) / PyLong_SHIFT + 1; /* Number of 'digits' in result */
|
1997-05-02 00:12:38 -03:00
|
|
|
v = _PyLong_New(ndig);
|
1991-06-03 07:58:24 -03:00
|
|
|
if (v == NULL)
|
|
|
|
return NULL;
|
2008-01-25 08:18:43 -04:00
|
|
|
frac = ldexp(frac, (expo-1) % PyLong_SHIFT + 1);
|
1991-06-03 07:58:24 -03:00
|
|
|
for (i = ndig; --i >= 0; ) {
|
2009-02-15 06:13:41 -04:00
|
|
|
digit bits = (digit)frac;
|
|
|
|
v->ob_digit[i] = bits;
|
1991-06-03 07:58:24 -03:00
|
|
|
frac = frac - (double)bits;
|
2008-01-25 08:18:43 -04:00
|
|
|
frac = ldexp(frac, PyLong_SHIFT);
|
1991-06-03 07:58:24 -03:00
|
|
|
}
|
|
|
|
if (neg)
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(v) = -(Py_SIZE(v));
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *)v;
|
1991-06-03 07:58:24 -03:00
|
|
|
}
|
|
|
|
|
2006-10-04 09:17:45 -03:00
|
|
|
/* Checking for overflow in PyLong_AsLong is a PITA since C doesn't define
|
|
|
|
* anything about what happens when a signed integer operation overflows,
|
|
|
|
* and some compilers think they're doing you a favor by being "clever"
|
|
|
|
* then. The bit pattern for the largest postive signed long is
|
|
|
|
* (unsigned long)LONG_MAX, and for the smallest negative signed long
|
|
|
|
* it is abs(LONG_MIN), which we could write -(unsigned long)LONG_MIN.
|
|
|
|
* However, some other compilers warn about applying unary minus to an
|
|
|
|
* unsigned operand. Hence the weird "0-".
|
|
|
|
*/
|
|
|
|
#define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN)
|
|
|
|
#define PY_ABS_SSIZE_T_MIN (0-(size_t)PY_SSIZE_T_MIN)
|
|
|
|
|
2009-12-21 07:21:25 -04:00
|
|
|
/* Get a C long int from a Python long or Python int object.
|
|
|
|
On overflow, returns -1 and sets *overflow to 1 or -1 depending
|
|
|
|
on the sign of the result. Otherwise *overflow is 0.
|
|
|
|
|
|
|
|
For other errors (e.g., type error), returns -1 and sets an error
|
|
|
|
condition.
|
|
|
|
*/
|
1991-05-05 17:09:44 -03:00
|
|
|
|
|
|
|
long
|
2009-12-21 07:21:25 -04:00
|
|
|
PyLong_AsLongAndOverflow(PyObject *vv, int *overflow)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
Subject: Buglet in PyLong_AsLong
From: "Tim Peters" <tim_one@email.msn.com>
To: "Guido van Rossum" <guido@CNRI.Reston.VA.US>
Date: Sat, 23 May 1998 21:45:53 -0400
Guido, the overflow checking in PyLong_AsLong is off a little:
1) If the C in use sign-extends right shifts on signed longs, there's a
spurious overflow error when converting the most-negative int:
Python 1.5.1 (#0, Apr 13 1998, 20:22:04) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> x = -1L << 31
>>> x
-2147483648L
>>> int(x)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>>
2) If C does not sign-extend, some genuine overflows won't be caught.
The attached should repair both, and, because I installed a new disk and a C
compiler today, it's even been compiled this time <wink>.
Python 1.5.1 (#0, May 23 1998, 20:24:58) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> x = -1L << 31
>>> x
-2147483648L
>>> int(x)
-2147483648
>>> int(-x)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>> int(-x-1)
2147483647
>>> int(x-1)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>>
end-casing-ly y'rs - tim
1998-05-26 11:33:37 -03:00
|
|
|
/* This version by Tim Peters */
|
1997-05-02 00:12:38 -03:00
|
|
|
register PyLongObject *v;
|
Subject: Buglet in PyLong_AsLong
From: "Tim Peters" <tim_one@email.msn.com>
To: "Guido van Rossum" <guido@CNRI.Reston.VA.US>
Date: Sat, 23 May 1998 21:45:53 -0400
Guido, the overflow checking in PyLong_AsLong is off a little:
1) If the C in use sign-extends right shifts on signed longs, there's a
spurious overflow error when converting the most-negative int:
Python 1.5.1 (#0, Apr 13 1998, 20:22:04) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> x = -1L << 31
>>> x
-2147483648L
>>> int(x)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>>
2) If C does not sign-extend, some genuine overflows won't be caught.
The attached should repair both, and, because I installed a new disk and a C
compiler today, it's even been compiled this time <wink>.
Python 1.5.1 (#0, May 23 1998, 20:24:58) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> x = -1L << 31
>>> x
-2147483648L
>>> int(x)
-2147483648
>>> int(-x)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>> int(-x-1)
2147483647
>>> int(x-1)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>>
end-casing-ly y'rs - tim
1998-05-26 11:33:37 -03:00
|
|
|
unsigned long x, prev;
|
2009-12-21 07:21:25 -04:00
|
|
|
long res;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i;
|
|
|
|
int sign;
|
2009-12-21 07:21:25 -04:00
|
|
|
int do_decref = 0; /* if nb_int was called */
|
Subject: Buglet in PyLong_AsLong
From: "Tim Peters" <tim_one@email.msn.com>
To: "Guido van Rossum" <guido@CNRI.Reston.VA.US>
Date: Sat, 23 May 1998 21:45:53 -0400
Guido, the overflow checking in PyLong_AsLong is off a little:
1) If the C in use sign-extends right shifts on signed longs, there's a
spurious overflow error when converting the most-negative int:
Python 1.5.1 (#0, Apr 13 1998, 20:22:04) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> x = -1L << 31
>>> x
-2147483648L
>>> int(x)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>>
2) If C does not sign-extend, some genuine overflows won't be caught.
The attached should repair both, and, because I installed a new disk and a C
compiler today, it's even been compiled this time <wink>.
Python 1.5.1 (#0, May 23 1998, 20:24:58) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> x = -1L << 31
>>> x
-2147483648L
>>> int(x)
-2147483648
>>> int(-x)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>> int(-x-1)
2147483647
>>> int(x-1)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>>
end-casing-ly y'rs - tim
1998-05-26 11:33:37 -03:00
|
|
|
|
2009-12-21 07:21:25 -04:00
|
|
|
*overflow = 0;
|
|
|
|
if (vv == NULL) {
|
1997-05-02 00:12:38 -03:00
|
|
|
PyErr_BadInternalCall();
|
1991-05-05 17:09:44 -03:00
|
|
|
return -1;
|
|
|
|
}
|
2009-12-21 07:21:25 -04:00
|
|
|
|
|
|
|
if(PyInt_Check(vv))
|
|
|
|
return PyInt_AsLong(vv);
|
|
|
|
|
|
|
|
if (!PyLong_Check(vv)) {
|
|
|
|
PyNumberMethods *nb;
|
|
|
|
nb = vv->ob_type->tp_as_number;
|
|
|
|
if (nb == NULL || nb->nb_int == NULL) {
|
|
|
|
PyErr_SetString(PyExc_TypeError,
|
|
|
|
"an integer is required");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
vv = (*nb->nb_int) (vv);
|
|
|
|
if (vv == NULL)
|
|
|
|
return -1;
|
|
|
|
do_decref = 1;
|
|
|
|
if(PyInt_Check(vv)) {
|
|
|
|
res = PyInt_AsLong(vv);
|
|
|
|
goto exit;
|
|
|
|
}
|
|
|
|
if (!PyLong_Check(vv)) {
|
|
|
|
Py_DECREF(vv);
|
|
|
|
PyErr_SetString(PyExc_TypeError,
|
|
|
|
"nb_int should return int object");
|
|
|
|
return -1;
|
|
|
|
}
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
2009-12-21 07:21:25 -04:00
|
|
|
|
|
|
|
res = -1;
|
|
|
|
v = (PyLongObject *)vv;
|
|
|
|
i = Py_SIZE(v);
|
|
|
|
|
|
|
|
switch (i) {
|
|
|
|
case -1:
|
|
|
|
res = -(sdigit)v->ob_digit[0];
|
|
|
|
break;
|
|
|
|
case 0:
|
|
|
|
res = 0;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
res = v->ob_digit[0];
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
sign = 1;
|
|
|
|
x = 0;
|
|
|
|
if (i < 0) {
|
|
|
|
sign = -1;
|
|
|
|
i = -(i);
|
|
|
|
}
|
|
|
|
while (--i >= 0) {
|
|
|
|
prev = x;
|
|
|
|
x = (x << PyLong_SHIFT) + v->ob_digit[i];
|
|
|
|
if ((x >> PyLong_SHIFT) != prev) {
|
|
|
|
*overflow = sign;
|
|
|
|
goto exit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* Haven't lost any bits, but casting to long requires extra
|
|
|
|
* care (see comment above).
|
|
|
|
*/
|
|
|
|
if (x <= (unsigned long)LONG_MAX) {
|
|
|
|
res = (long)x * sign;
|
|
|
|
}
|
|
|
|
else if (sign < 0 && x == PY_ABS_LONG_MIN) {
|
|
|
|
res = LONG_MIN;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
*overflow = sign;
|
|
|
|
/* res is already set to -1 */
|
|
|
|
}
|
2006-10-04 09:17:45 -03:00
|
|
|
}
|
2009-12-21 07:21:25 -04:00
|
|
|
exit:
|
|
|
|
if (do_decref) {
|
|
|
|
Py_DECREF(vv);
|
2006-10-04 09:17:45 -03:00
|
|
|
}
|
2009-12-21 07:21:25 -04:00
|
|
|
return res;
|
|
|
|
}
|
Subject: Buglet in PyLong_AsLong
From: "Tim Peters" <tim_one@email.msn.com>
To: "Guido van Rossum" <guido@CNRI.Reston.VA.US>
Date: Sat, 23 May 1998 21:45:53 -0400
Guido, the overflow checking in PyLong_AsLong is off a little:
1) If the C in use sign-extends right shifts on signed longs, there's a
spurious overflow error when converting the most-negative int:
Python 1.5.1 (#0, Apr 13 1998, 20:22:04) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> x = -1L << 31
>>> x
-2147483648L
>>> int(x)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>>
2) If C does not sign-extend, some genuine overflows won't be caught.
The attached should repair both, and, because I installed a new disk and a C
compiler today, it's even been compiled this time <wink>.
Python 1.5.1 (#0, May 23 1998, 20:24:58) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> x = -1L << 31
>>> x
-2147483648L
>>> int(x)
-2147483648
>>> int(-x)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>> int(-x-1)
2147483647
>>> int(x-1)
Traceback (innermost last):
File "<stdin>", line 1, in ?
OverflowError: long int too long to convert
>>>
end-casing-ly y'rs - tim
1998-05-26 11:33:37 -03:00
|
|
|
|
2009-12-21 07:21:25 -04:00
|
|
|
/* Get a C long int from a long int object.
|
|
|
|
Returns -1 and sets an error condition if overflow occurs. */
|
|
|
|
|
|
|
|
long
|
|
|
|
PyLong_AsLong(PyObject *obj)
|
|
|
|
{
|
|
|
|
int overflow;
|
|
|
|
long result = PyLong_AsLongAndOverflow(obj, &overflow);
|
|
|
|
if (overflow) {
|
|
|
|
/* XXX: could be cute and give a different
|
|
|
|
message for overflow == -1 */
|
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
|
|
|
"Python int too large to convert to C long");
|
|
|
|
}
|
|
|
|
return result;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
2006-08-12 14:03:09 -03:00
|
|
|
/* Get a Py_ssize_t from a long int object.
|
|
|
|
Returns -1 and sets an error condition if overflow occurs. */
|
|
|
|
|
|
|
|
Py_ssize_t
|
2008-01-25 08:18:43 -04:00
|
|
|
PyLong_AsSsize_t(PyObject *vv) {
|
2006-02-15 13:27:45 -04:00
|
|
|
register PyLongObject *v;
|
|
|
|
size_t x, prev;
|
|
|
|
Py_ssize_t i;
|
|
|
|
int sign;
|
|
|
|
|
|
|
|
if (vv == NULL || !PyLong_Check(vv)) {
|
|
|
|
PyErr_BadInternalCall();
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
v = (PyLongObject *)vv;
|
|
|
|
i = v->ob_size;
|
|
|
|
sign = 1;
|
|
|
|
x = 0;
|
|
|
|
if (i < 0) {
|
|
|
|
sign = -1;
|
|
|
|
i = -(i);
|
|
|
|
}
|
|
|
|
while (--i >= 0) {
|
|
|
|
prev = x;
|
2009-09-28 13:52:40 -03:00
|
|
|
x = (x << PyLong_SHIFT) | v->ob_digit[i];
|
2008-01-25 08:18:43 -04:00
|
|
|
if ((x >> PyLong_SHIFT) != prev)
|
2006-02-15 13:27:45 -04:00
|
|
|
goto overflow;
|
|
|
|
}
|
2006-10-04 09:17:45 -03:00
|
|
|
/* Haven't lost any bits, but casting to a signed type requires
|
|
|
|
* extra care (see comment above).
|
2006-02-15 13:27:45 -04:00
|
|
|
*/
|
2006-10-04 09:17:45 -03:00
|
|
|
if (x <= (size_t)PY_SSIZE_T_MAX) {
|
|
|
|
return (Py_ssize_t)x * sign;
|
|
|
|
}
|
|
|
|
else if (sign < 0 && x == PY_ABS_SSIZE_T_MIN) {
|
|
|
|
return PY_SSIZE_T_MIN;
|
|
|
|
}
|
|
|
|
/* else overflow */
|
2006-02-15 13:27:45 -04:00
|
|
|
|
|
|
|
overflow:
|
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
|
|
|
"long int too large to convert to int");
|
2006-08-12 14:03:09 -03:00
|
|
|
return -1;
|
2006-02-15 13:27:45 -04:00
|
|
|
}
|
|
|
|
|
2002-08-12 21:24:58 -03:00
|
|
|
/* Get a C unsigned long int from a long int object.
|
1997-01-03 13:14:46 -04:00
|
|
|
Returns -1 and sets an error condition if overflow occurs. */
|
|
|
|
|
|
|
|
unsigned long
|
2000-07-07 12:53:28 -03:00
|
|
|
PyLong_AsUnsignedLong(PyObject *vv)
|
1997-01-03 13:14:46 -04:00
|
|
|
{
|
1997-05-02 00:12:38 -03:00
|
|
|
register PyLongObject *v;
|
1997-01-03 13:14:46 -04:00
|
|
|
unsigned long x, prev;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
if (vv == NULL || !PyLong_Check(vv)) {
|
2004-09-20 03:17:46 -03:00
|
|
|
if (vv != NULL && PyInt_Check(vv)) {
|
|
|
|
long val = PyInt_AsLong(vv);
|
|
|
|
if (val < 0) {
|
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
|
|
|
"can't convert negative value to unsigned long");
|
|
|
|
return (unsigned long) -1;
|
|
|
|
}
|
|
|
|
return val;
|
|
|
|
}
|
1997-05-02 00:12:38 -03:00
|
|
|
PyErr_BadInternalCall();
|
1997-01-03 13:14:46 -04:00
|
|
|
return (unsigned long) -1;
|
|
|
|
}
|
1997-05-02 00:12:38 -03:00
|
|
|
v = (PyLongObject *)vv;
|
2007-12-18 22:37:44 -04:00
|
|
|
i = Py_SIZE(v);
|
1997-01-03 13:14:46 -04:00
|
|
|
x = 0;
|
|
|
|
if (i < 0) {
|
1997-05-02 00:12:38 -03:00
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
1997-01-03 13:14:46 -04:00
|
|
|
"can't convert negative value to unsigned long");
|
|
|
|
return (unsigned long) -1;
|
|
|
|
}
|
|
|
|
while (--i >= 0) {
|
|
|
|
prev = x;
|
2009-09-28 13:52:40 -03:00
|
|
|
x = (x << PyLong_SHIFT) | v->ob_digit[i];
|
2008-01-25 08:18:43 -04:00
|
|
|
if ((x >> PyLong_SHIFT) != prev) {
|
1997-05-02 00:12:38 -03:00
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
2000-10-24 16:57:45 -03:00
|
|
|
"long int too large to convert");
|
1997-01-03 13:14:46 -04:00
|
|
|
return (unsigned long) -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
2003-04-17 15:55:45 -03:00
|
|
|
/* Get a C unsigned long int from a long int object, ignoring the high bits.
|
|
|
|
Returns -1 and sets an error condition if an error occurs. */
|
|
|
|
|
|
|
|
unsigned long
|
|
|
|
PyLong_AsUnsignedLongMask(PyObject *vv)
|
|
|
|
{
|
|
|
|
register PyLongObject *v;
|
|
|
|
unsigned long x;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i;
|
|
|
|
int sign;
|
2003-04-17 15:55:45 -03:00
|
|
|
|
|
|
|
if (vv == NULL || !PyLong_Check(vv)) {
|
2004-09-20 03:17:46 -03:00
|
|
|
if (vv != NULL && PyInt_Check(vv))
|
|
|
|
return PyInt_AsUnsignedLongMask(vv);
|
2003-04-17 15:55:45 -03:00
|
|
|
PyErr_BadInternalCall();
|
|
|
|
return (unsigned long) -1;
|
|
|
|
}
|
|
|
|
v = (PyLongObject *)vv;
|
|
|
|
i = v->ob_size;
|
|
|
|
sign = 1;
|
|
|
|
x = 0;
|
|
|
|
if (i < 0) {
|
|
|
|
sign = -1;
|
|
|
|
i = -i;
|
|
|
|
}
|
|
|
|
while (--i >= 0) {
|
2009-09-28 13:52:40 -03:00
|
|
|
x = (x << PyLong_SHIFT) | v->ob_digit[i];
|
2003-04-17 15:55:45 -03:00
|
|
|
}
|
|
|
|
return x * sign;
|
|
|
|
}
|
|
|
|
|
2003-01-31 11:52:05 -04:00
|
|
|
int
|
|
|
|
_PyLong_Sign(PyObject *vv)
|
|
|
|
{
|
|
|
|
PyLongObject *v = (PyLongObject *)vv;
|
|
|
|
|
|
|
|
assert(v != NULL);
|
|
|
|
assert(PyLong_Check(v));
|
|
|
|
|
2007-12-18 22:37:44 -04:00
|
|
|
return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1);
|
2003-01-31 11:52:05 -04:00
|
|
|
}
|
|
|
|
|
2003-01-28 16:37:45 -04:00
|
|
|
size_t
|
|
|
|
_PyLong_NumBits(PyObject *vv)
|
|
|
|
{
|
|
|
|
PyLongObject *v = (PyLongObject *)vv;
|
2003-01-31 11:52:05 -04:00
|
|
|
size_t result = 0;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t ndigits;
|
2003-01-28 16:37:45 -04:00
|
|
|
|
|
|
|
assert(v != NULL);
|
|
|
|
assert(PyLong_Check(v));
|
2007-12-18 22:37:44 -04:00
|
|
|
ndigits = ABS(Py_SIZE(v));
|
2003-01-28 16:37:45 -04:00
|
|
|
assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
|
|
|
|
if (ndigits > 0) {
|
|
|
|
digit msd = v->ob_digit[ndigits - 1];
|
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
result = (ndigits - 1) * PyLong_SHIFT;
|
|
|
|
if (result / PyLong_SHIFT != (size_t)(ndigits - 1))
|
2003-01-28 16:37:45 -04:00
|
|
|
goto Overflow;
|
|
|
|
do {
|
|
|
|
++result;
|
|
|
|
if (result == 0)
|
|
|
|
goto Overflow;
|
|
|
|
msd >>= 1;
|
|
|
|
} while (msd);
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
|
|
|
|
Overflow:
|
|
|
|
PyErr_SetString(PyExc_OverflowError, "long has too many bits "
|
|
|
|
"to express in a platform size_t");
|
|
|
|
return (size_t)-1;
|
|
|
|
}
|
|
|
|
|
2001-06-11 18:23:58 -03:00
|
|
|
PyObject *
|
|
|
|
_PyLong_FromByteArray(const unsigned char* bytes, size_t n,
|
|
|
|
int little_endian, int is_signed)
|
|
|
|
{
|
|
|
|
const unsigned char* pstartbyte;/* LSB of bytes */
|
|
|
|
int incr; /* direction to move pstartbyte */
|
|
|
|
const unsigned char* pendbyte; /* MSB of bytes */
|
|
|
|
size_t numsignificantbytes; /* number of bytes that matter */
|
2009-02-15 06:13:41 -04:00
|
|
|
Py_ssize_t ndigits; /* number of Python long digits */
|
2001-06-11 18:23:58 -03:00
|
|
|
PyLongObject* v; /* result */
|
2009-02-15 06:13:41 -04:00
|
|
|
Py_ssize_t idigit = 0; /* next free index in v->ob_digit */
|
2001-06-11 18:23:58 -03:00
|
|
|
|
|
|
|
if (n == 0)
|
|
|
|
return PyLong_FromLong(0L);
|
|
|
|
|
|
|
|
if (little_endian) {
|
|
|
|
pstartbyte = bytes;
|
|
|
|
pendbyte = bytes + n - 1;
|
|
|
|
incr = 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
pstartbyte = bytes + n - 1;
|
|
|
|
pendbyte = bytes;
|
|
|
|
incr = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is_signed)
|
|
|
|
is_signed = *pendbyte >= 0x80;
|
|
|
|
|
|
|
|
/* Compute numsignificantbytes. This consists of finding the most
|
|
|
|
significant byte. Leading 0 bytes are insignficant if the number
|
|
|
|
is positive, and leading 0xff bytes if negative. */
|
|
|
|
{
|
|
|
|
size_t i;
|
|
|
|
const unsigned char* p = pendbyte;
|
|
|
|
const int pincr = -incr; /* search MSB to LSB */
|
|
|
|
const unsigned char insignficant = is_signed ? 0xff : 0x00;
|
|
|
|
|
|
|
|
for (i = 0; i < n; ++i, p += pincr) {
|
|
|
|
if (*p != insignficant)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
numsignificantbytes = n - i;
|
|
|
|
/* 2's-comp is a bit tricky here, e.g. 0xff00 == -0x0100, so
|
|
|
|
actually has 2 significant bytes. OTOH, 0xff0001 ==
|
|
|
|
-0x00ffff, so we wouldn't *need* to bump it there; but we
|
|
|
|
do for 0xffff = -0x0001. To be safe without bothering to
|
|
|
|
check every case, bump it regardless. */
|
|
|
|
if (is_signed && numsignificantbytes < n)
|
|
|
|
++numsignificantbytes;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* How many Python long digits do we need? We have
|
2009-02-15 06:13:41 -04:00
|
|
|
8*numsignificantbytes bits, and each Python long digit has
|
|
|
|
PyLong_SHIFT bits, so it's the ceiling of the quotient. */
|
|
|
|
/* catch overflow before it happens */
|
|
|
|
if (numsignificantbytes > (PY_SSIZE_T_MAX - PyLong_SHIFT) / 8) {
|
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
|
|
|
"byte array too long to convert to int");
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-01-25 08:18:43 -04:00
|
|
|
ndigits = (numsignificantbytes * 8 + PyLong_SHIFT - 1) / PyLong_SHIFT;
|
2009-02-15 06:13:41 -04:00
|
|
|
v = _PyLong_New(ndigits);
|
2001-06-11 18:23:58 -03:00
|
|
|
if (v == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* Copy the bits over. The tricky parts are computing 2's-comp on
|
|
|
|
the fly for signed numbers, and dealing with the mismatch between
|
|
|
|
8-bit bytes and (probably) 15-bit Python digits.*/
|
|
|
|
{
|
|
|
|
size_t i;
|
2001-06-13 18:09:15 -03:00
|
|
|
twodigits carry = 1; /* for 2's-comp calculation */
|
2001-06-11 18:23:58 -03:00
|
|
|
twodigits accum = 0; /* sliding register */
|
|
|
|
unsigned int accumbits = 0; /* number of bits in accum */
|
|
|
|
const unsigned char* p = pstartbyte;
|
|
|
|
|
|
|
|
for (i = 0; i < numsignificantbytes; ++i, p += incr) {
|
2001-06-12 16:17:03 -03:00
|
|
|
twodigits thisbyte = *p;
|
2001-06-11 18:23:58 -03:00
|
|
|
/* Compute correction for 2's comp, if needed. */
|
|
|
|
if (is_signed) {
|
|
|
|
thisbyte = (0xff ^ thisbyte) + carry;
|
|
|
|
carry = thisbyte >> 8;
|
|
|
|
thisbyte &= 0xff;
|
|
|
|
}
|
|
|
|
/* Because we're going LSB to MSB, thisbyte is
|
|
|
|
more significant than what's already in accum,
|
|
|
|
so needs to be prepended to accum. */
|
2009-01-24 11:27:44 -04:00
|
|
|
accum |= (twodigits)thisbyte << accumbits;
|
2001-06-11 18:23:58 -03:00
|
|
|
accumbits += 8;
|
2008-01-25 08:18:43 -04:00
|
|
|
if (accumbits >= PyLong_SHIFT) {
|
2001-06-11 18:23:58 -03:00
|
|
|
/* There's enough to fill a Python digit. */
|
2009-02-15 06:13:41 -04:00
|
|
|
assert(idigit < ndigits);
|
|
|
|
v->ob_digit[idigit] = (digit)(accum &
|
|
|
|
PyLong_MASK);
|
2001-06-11 18:23:58 -03:00
|
|
|
++idigit;
|
2008-01-25 08:18:43 -04:00
|
|
|
accum >>= PyLong_SHIFT;
|
|
|
|
accumbits -= PyLong_SHIFT;
|
|
|
|
assert(accumbits < PyLong_SHIFT);
|
2001-06-11 18:23:58 -03:00
|
|
|
}
|
|
|
|
}
|
2008-01-25 08:18:43 -04:00
|
|
|
assert(accumbits < PyLong_SHIFT);
|
2001-06-11 18:23:58 -03:00
|
|
|
if (accumbits) {
|
2009-02-15 06:13:41 -04:00
|
|
|
assert(idigit < ndigits);
|
2001-06-11 18:23:58 -03:00
|
|
|
v->ob_digit[idigit] = (digit)accum;
|
|
|
|
++idigit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(v) = is_signed ? -idigit : idigit;
|
2001-06-11 18:23:58 -03:00
|
|
|
return (PyObject *)long_normalize(v);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
_PyLong_AsByteArray(PyLongObject* v,
|
|
|
|
unsigned char* bytes, size_t n,
|
|
|
|
int little_endian, int is_signed)
|
|
|
|
{
|
2009-01-24 11:27:44 -04:00
|
|
|
Py_ssize_t i; /* index into v->ob_digit */
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t ndigits; /* |v->ob_size| */
|
2001-06-11 18:23:58 -03:00
|
|
|
twodigits accum; /* sliding register */
|
|
|
|
unsigned int accumbits; /* # bits in accum */
|
|
|
|
int do_twos_comp; /* store 2's-comp? is_signed and v < 0 */
|
2009-01-25 18:12:31 -04:00
|
|
|
digit carry; /* for computing 2's-comp */
|
2001-06-11 18:23:58 -03:00
|
|
|
size_t j; /* # bytes filled */
|
|
|
|
unsigned char* p; /* pointer to next byte in bytes */
|
|
|
|
int pincr; /* direction to move p */
|
|
|
|
|
|
|
|
assert(v != NULL && PyLong_Check(v));
|
|
|
|
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(v) < 0) {
|
|
|
|
ndigits = -(Py_SIZE(v));
|
2001-06-11 18:23:58 -03:00
|
|
|
if (!is_signed) {
|
2009-02-10 11:46:50 -04:00
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
2001-06-11 18:23:58 -03:00
|
|
|
"can't convert negative long to unsigned");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
do_twos_comp = 1;
|
|
|
|
}
|
|
|
|
else {
|
2007-12-18 22:37:44 -04:00
|
|
|
ndigits = Py_SIZE(v);
|
2001-06-11 18:23:58 -03:00
|
|
|
do_twos_comp = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (little_endian) {
|
|
|
|
p = bytes;
|
|
|
|
pincr = 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
p = bytes + n - 1;
|
|
|
|
pincr = -1;
|
|
|
|
}
|
|
|
|
|
2001-06-13 17:50:08 -03:00
|
|
|
/* Copy over all the Python digits.
|
|
|
|
It's crucial that every Python digit except for the MSD contribute
|
2008-01-25 08:18:43 -04:00
|
|
|
exactly PyLong_SHIFT bits to the total, so first assert that the long is
|
2001-06-13 17:50:08 -03:00
|
|
|
normalized. */
|
|
|
|
assert(ndigits == 0 || v->ob_digit[ndigits - 1] != 0);
|
2001-06-11 18:23:58 -03:00
|
|
|
j = 0;
|
|
|
|
accum = 0;
|
|
|
|
accumbits = 0;
|
|
|
|
carry = do_twos_comp ? 1 : 0;
|
|
|
|
for (i = 0; i < ndigits; ++i) {
|
2009-01-24 11:27:44 -04:00
|
|
|
digit thisdigit = v->ob_digit[i];
|
2001-06-11 18:23:58 -03:00
|
|
|
if (do_twos_comp) {
|
2008-01-25 08:18:43 -04:00
|
|
|
thisdigit = (thisdigit ^ PyLong_MASK) + carry;
|
|
|
|
carry = thisdigit >> PyLong_SHIFT;
|
|
|
|
thisdigit &= PyLong_MASK;
|
2001-06-11 18:23:58 -03:00
|
|
|
}
|
2001-06-12 16:17:03 -03:00
|
|
|
/* Because we're going LSB to MSB, thisdigit is more
|
|
|
|
significant than what's already in accum, so needs to be
|
|
|
|
prepended to accum. */
|
2009-01-24 11:27:44 -04:00
|
|
|
accum |= (twodigits)thisdigit << accumbits;
|
2001-06-12 16:17:03 -03:00
|
|
|
|
2001-06-14 05:53:38 -03:00
|
|
|
/* The most-significant digit may be (probably is) at least
|
|
|
|
partly empty. */
|
2001-06-12 16:17:03 -03:00
|
|
|
if (i == ndigits - 1) {
|
2001-06-14 05:53:38 -03:00
|
|
|
/* Count # of sign bits -- they needn't be stored,
|
|
|
|
* although for signed conversion we need later to
|
2009-01-24 11:27:44 -04:00
|
|
|
* make sure at least one sign bit gets stored. */
|
|
|
|
digit s = do_twos_comp ? thisdigit ^ PyLong_MASK :
|
|
|
|
thisdigit;
|
|
|
|
while (s != 0) {
|
|
|
|
s >>= 1;
|
|
|
|
accumbits++;
|
2001-06-11 22:22:22 -03:00
|
|
|
}
|
|
|
|
}
|
2009-01-24 11:27:44 -04:00
|
|
|
else
|
|
|
|
accumbits += PyLong_SHIFT;
|
2001-06-12 16:17:03 -03:00
|
|
|
|
2001-06-11 18:23:58 -03:00
|
|
|
/* Store as many bytes as possible. */
|
2001-06-11 22:22:22 -03:00
|
|
|
while (accumbits >= 8) {
|
2001-06-11 18:23:58 -03:00
|
|
|
if (j >= n)
|
|
|
|
goto Overflow;
|
|
|
|
++j;
|
|
|
|
*p = (unsigned char)(accum & 0xff);
|
|
|
|
p += pincr;
|
|
|
|
accumbits -= 8;
|
|
|
|
accum >>= 8;
|
2001-06-11 22:22:22 -03:00
|
|
|
}
|
2001-06-11 18:23:58 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Store the straggler (if any). */
|
|
|
|
assert(accumbits < 8);
|
|
|
|
assert(carry == 0); /* else do_twos_comp and *every* digit was 0 */
|
2001-06-11 22:22:22 -03:00
|
|
|
if (accumbits > 0) {
|
2001-06-11 18:23:58 -03:00
|
|
|
if (j >= n)
|
|
|
|
goto Overflow;
|
|
|
|
++j;
|
|
|
|
if (do_twos_comp) {
|
|
|
|
/* Fill leading bits of the byte with sign bits
|
|
|
|
(appropriately pretending that the long had an
|
|
|
|
infinite supply of sign bits). */
|
|
|
|
accum |= (~(twodigits)0) << accumbits;
|
|
|
|
}
|
|
|
|
*p = (unsigned char)(accum & 0xff);
|
|
|
|
p += pincr;
|
|
|
|
}
|
2001-06-13 18:01:27 -03:00
|
|
|
else if (j == n && n > 0 && is_signed) {
|
|
|
|
/* The main loop filled the byte array exactly, so the code
|
|
|
|
just above didn't get to ensure there's a sign bit, and the
|
|
|
|
loop below wouldn't add one either. Make sure a sign bit
|
|
|
|
exists. */
|
2001-06-11 18:23:58 -03:00
|
|
|
unsigned char msb = *(p - pincr);
|
2001-06-13 18:01:27 -03:00
|
|
|
int sign_bit_set = msb >= 0x80;
|
|
|
|
assert(accumbits == 0);
|
|
|
|
if (sign_bit_set == do_twos_comp)
|
|
|
|
return 0;
|
|
|
|
else
|
2001-06-11 18:23:58 -03:00
|
|
|
goto Overflow;
|
|
|
|
}
|
2001-06-13 18:01:27 -03:00
|
|
|
|
|
|
|
/* Fill remaining bytes with copies of the sign bit. */
|
|
|
|
{
|
|
|
|
unsigned char signbyte = do_twos_comp ? 0xffU : 0U;
|
|
|
|
for ( ; j < n; ++j, p += pincr)
|
|
|
|
*p = signbyte;
|
|
|
|
}
|
|
|
|
|
2001-06-11 18:23:58 -03:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
Overflow:
|
|
|
|
PyErr_SetString(PyExc_OverflowError, "long too big to convert");
|
|
|
|
return -1;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2001-06-11 18:23:58 -03:00
|
|
|
}
|
|
|
|
|
2001-09-03 23:50:49 -03:00
|
|
|
double
|
|
|
|
_PyLong_AsScaledDouble(PyObject *vv, int *exponent)
|
|
|
|
{
|
|
|
|
/* NBITS_WANTED should be > the number of bits in a double's precision,
|
|
|
|
but small enough so that 2**NBITS_WANTED is within the normal double
|
|
|
|
range. nbitsneeded is set to 1 less than that because the most-significant
|
|
|
|
Python digit contains at least 1 significant bit, but we don't want to
|
|
|
|
bother counting them (catering to the worst case cheaply).
|
|
|
|
|
|
|
|
57 is one more than VAX-D double precision; I (Tim) don't know of a double
|
|
|
|
format with more precision than that; it's 1 larger so that we add in at
|
|
|
|
least one round bit to stand in for the ignored least-significant bits.
|
|
|
|
*/
|
|
|
|
#define NBITS_WANTED 57
|
|
|
|
PyLongObject *v;
|
|
|
|
double x;
|
2008-01-25 08:18:43 -04:00
|
|
|
const double multiplier = (double)(1L << PyLong_SHIFT);
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i;
|
|
|
|
int sign;
|
2001-09-03 23:50:49 -03:00
|
|
|
int nbitsneeded;
|
|
|
|
|
|
|
|
if (vv == NULL || !PyLong_Check(vv)) {
|
|
|
|
PyErr_BadInternalCall();
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
v = (PyLongObject *)vv;
|
2007-12-18 22:37:44 -04:00
|
|
|
i = Py_SIZE(v);
|
2001-09-03 23:50:49 -03:00
|
|
|
sign = 1;
|
|
|
|
if (i < 0) {
|
|
|
|
sign = -1;
|
|
|
|
i = -(i);
|
|
|
|
}
|
|
|
|
else if (i == 0) {
|
|
|
|
*exponent = 0;
|
|
|
|
return 0.0;
|
|
|
|
}
|
|
|
|
--i;
|
|
|
|
x = (double)v->ob_digit[i];
|
|
|
|
nbitsneeded = NBITS_WANTED - 1;
|
|
|
|
/* Invariant: i Python digits remain unaccounted for. */
|
|
|
|
while (i > 0 && nbitsneeded > 0) {
|
|
|
|
--i;
|
|
|
|
x = x * multiplier + (double)v->ob_digit[i];
|
2008-01-25 08:18:43 -04:00
|
|
|
nbitsneeded -= PyLong_SHIFT;
|
2001-09-03 23:50:49 -03:00
|
|
|
}
|
|
|
|
/* There are i digits we didn't shift in. Pretending they're all
|
2008-01-25 08:18:43 -04:00
|
|
|
zeroes, the true value is x * 2**(i*PyLong_SHIFT). */
|
2001-09-03 23:50:49 -03:00
|
|
|
*exponent = i;
|
|
|
|
assert(x > 0.0);
|
|
|
|
return x * sign;
|
|
|
|
#undef NBITS_WANTED
|
|
|
|
}
|
|
|
|
|
2009-04-20 18:13:33 -03:00
|
|
|
/* Get a C double from a long int object. Rounds to the nearest double,
|
|
|
|
using the round-half-to-even rule in the case of a tie. */
|
1991-05-05 17:09:44 -03:00
|
|
|
|
|
|
|
double
|
2000-07-07 12:53:28 -03:00
|
|
|
PyLong_AsDouble(PyObject *vv)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2009-04-20 18:13:33 -03:00
|
|
|
PyLongObject *v = (PyLongObject *)vv;
|
|
|
|
Py_ssize_t rnd_digit, rnd_bit, m, n;
|
|
|
|
digit lsb, *d;
|
|
|
|
int round_up = 0;
|
1991-05-05 17:09:44 -03:00
|
|
|
double x;
|
2001-09-04 02:14:19 -03:00
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
if (vv == NULL || !PyLong_Check(vv)) {
|
|
|
|
PyErr_BadInternalCall();
|
2001-09-04 02:14:19 -03:00
|
|
|
return -1.0;
|
2009-04-20 18:13:33 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Notes on the method: for simplicity, assume v is positive and >=
|
|
|
|
2**DBL_MANT_DIG. (For negative v we just ignore the sign until the
|
|
|
|
end; for small v no rounding is necessary.) Write n for the number
|
|
|
|
of bits in v, so that 2**(n-1) <= v < 2**n, and n > DBL_MANT_DIG.
|
|
|
|
|
|
|
|
Some terminology: the *rounding bit* of v is the 1st bit of v that
|
|
|
|
will be rounded away (bit n - DBL_MANT_DIG - 1); the *parity bit*
|
|
|
|
is the bit immediately above. The round-half-to-even rule says
|
|
|
|
that we round up if the rounding bit is set, unless v is exactly
|
|
|
|
halfway between two floats and the parity bit is zero.
|
|
|
|
|
|
|
|
Write d[0] ... d[m] for the digits of v, least to most significant.
|
|
|
|
Let rnd_bit be the index of the rounding bit, and rnd_digit the
|
|
|
|
index of the PyLong digit containing the rounding bit. Then the
|
|
|
|
bits of the digit d[rnd_digit] look something like:
|
|
|
|
|
|
|
|
rounding bit
|
|
|
|
|
|
|
|
|
v
|
|
|
|
msb -> sssssrttttttttt <- lsb
|
|
|
|
^
|
|
|
|
|
|
|
|
|
parity bit
|
|
|
|
|
|
|
|
where 's' represents a 'significant bit' that will be included in
|
|
|
|
the mantissa of the result, 'r' is the rounding bit, and 't'
|
|
|
|
represents a 'trailing bit' following the rounding bit. Note that
|
|
|
|
if the rounding bit is at the top of d[rnd_digit] then the parity
|
|
|
|
bit will be the lsb of d[rnd_digit+1]. If we set
|
|
|
|
|
|
|
|
lsb = 1 << (rnd_bit % PyLong_SHIFT)
|
|
|
|
|
|
|
|
then d[rnd_digit] & (PyLong_BASE - 2*lsb) selects just the
|
|
|
|
significant bits of d[rnd_digit], d[rnd_digit] & (lsb-1) gets the
|
|
|
|
trailing bits, and d[rnd_digit] & lsb gives the rounding bit.
|
|
|
|
|
|
|
|
We initialize the double x to the integer given by digits
|
|
|
|
d[rnd_digit:m-1], but with the rounding bit and trailing bits of
|
|
|
|
d[rnd_digit] masked out. So the value of x comes from the top
|
|
|
|
DBL_MANT_DIG bits of v, multiplied by 2*lsb. Note that in the loop
|
|
|
|
that produces x, all floating-point operations are exact (assuming
|
|
|
|
that FLT_RADIX==2). Now if we're rounding down, the value we want
|
|
|
|
to return is simply
|
|
|
|
|
|
|
|
x * 2**(PyLong_SHIFT * rnd_digit).
|
|
|
|
|
|
|
|
and if we're rounding up, it's
|
|
|
|
|
|
|
|
(x + 2*lsb) * 2**(PyLong_SHIFT * rnd_digit).
|
|
|
|
|
|
|
|
Under the round-half-to-even rule, we round up if, and only
|
|
|
|
if, the rounding bit is set *and* at least one of the
|
|
|
|
following three conditions is satisfied:
|
|
|
|
|
|
|
|
(1) the parity bit is set, or
|
|
|
|
(2) at least one of the trailing bits of d[rnd_digit] is set, or
|
|
|
|
(3) at least one of the digits d[i], 0 <= i < rnd_digit
|
|
|
|
is nonzero.
|
|
|
|
|
|
|
|
Finally, we have to worry about overflow. If v >= 2**DBL_MAX_EXP,
|
|
|
|
or equivalently n > DBL_MAX_EXP, then overflow occurs. If v <
|
|
|
|
2**DBL_MAX_EXP then we're usually safe, but there's a corner case
|
|
|
|
to consider: if v is very close to 2**DBL_MAX_EXP then it's
|
|
|
|
possible that v is rounded up to exactly 2**DBL_MAX_EXP, and then
|
|
|
|
again overflow occurs.
|
|
|
|
*/
|
|
|
|
|
|
|
|
if (Py_SIZE(v) == 0)
|
|
|
|
return 0.0;
|
|
|
|
m = ABS(Py_SIZE(v)) - 1;
|
|
|
|
d = v->ob_digit;
|
|
|
|
assert(d[m]); /* v should be normalized */
|
|
|
|
|
|
|
|
/* fast path for case where 0 < abs(v) < 2**DBL_MANT_DIG */
|
|
|
|
if (m < DBL_MANT_DIG / PyLong_SHIFT ||
|
|
|
|
(m == DBL_MANT_DIG / PyLong_SHIFT &&
|
|
|
|
d[m] < (digit)1 << DBL_MANT_DIG%PyLong_SHIFT)) {
|
|
|
|
x = d[m];
|
|
|
|
while (--m >= 0)
|
|
|
|
x = x*PyLong_BASE + d[m];
|
|
|
|
return Py_SIZE(v) < 0 ? -x : x;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if m is huge then overflow immediately; otherwise, compute the
|
|
|
|
number of bits n in v. The condition below implies n (= #bits) >=
|
|
|
|
m * PyLong_SHIFT + 1 > DBL_MAX_EXP, hence v >= 2**DBL_MAX_EXP. */
|
|
|
|
if (m > (DBL_MAX_EXP-1)/PyLong_SHIFT)
|
2001-09-04 02:14:19 -03:00
|
|
|
goto overflow;
|
2009-04-20 18:13:33 -03:00
|
|
|
n = m * PyLong_SHIFT + bits_in_digit(d[m]);
|
|
|
|
if (n > DBL_MAX_EXP)
|
2001-09-04 02:14:19 -03:00
|
|
|
goto overflow;
|
|
|
|
|
2009-04-20 18:13:33 -03:00
|
|
|
/* find location of rounding bit */
|
|
|
|
assert(n > DBL_MANT_DIG); /* dealt with |v| < 2**DBL_MANT_DIG above */
|
|
|
|
rnd_bit = n - DBL_MANT_DIG - 1;
|
|
|
|
rnd_digit = rnd_bit/PyLong_SHIFT;
|
|
|
|
lsb = (digit)1 << (rnd_bit%PyLong_SHIFT);
|
|
|
|
|
|
|
|
/* Get top DBL_MANT_DIG bits of v. Assumes PyLong_SHIFT <
|
|
|
|
DBL_MANT_DIG, so we'll need bits from at least 2 digits of v. */
|
|
|
|
x = d[m];
|
|
|
|
assert(m > rnd_digit);
|
|
|
|
while (--m > rnd_digit)
|
|
|
|
x = x*PyLong_BASE + d[m];
|
|
|
|
x = x*PyLong_BASE + (d[m] & (PyLong_BASE-2*lsb));
|
|
|
|
|
|
|
|
/* decide whether to round up, using round-half-to-even */
|
|
|
|
assert(m == rnd_digit);
|
|
|
|
if (d[m] & lsb) { /* if (rounding bit is set) */
|
|
|
|
digit parity_bit;
|
|
|
|
if (lsb == PyLong_BASE/2)
|
|
|
|
parity_bit = d[m+1] & 1;
|
|
|
|
else
|
|
|
|
parity_bit = d[m] & 2*lsb;
|
|
|
|
if (parity_bit)
|
|
|
|
round_up = 1;
|
|
|
|
else if (d[m] & (lsb-1))
|
|
|
|
round_up = 1;
|
|
|
|
else {
|
|
|
|
while (--m >= 0) {
|
|
|
|
if (d[m]) {
|
|
|
|
round_up = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* and round up if necessary */
|
|
|
|
if (round_up) {
|
|
|
|
x += 2*lsb;
|
|
|
|
if (n == DBL_MAX_EXP &&
|
|
|
|
x == ldexp((double)(2*lsb), DBL_MANT_DIG)) {
|
|
|
|
/* overflow corner case */
|
|
|
|
goto overflow;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* shift, adjust for sign, and return */
|
|
|
|
x = ldexp(x, rnd_digit*PyLong_SHIFT);
|
|
|
|
return Py_SIZE(v) < 0 ? -x : x;
|
|
|
|
|
|
|
|
overflow:
|
2001-09-04 02:14:19 -03:00
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
|
|
|
"long int too large to convert to float");
|
|
|
|
return -1.0;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
1998-09-18 11:14:13 -03:00
|
|
|
/* Create a new long (or int) object from a C pointer */
|
|
|
|
|
|
|
|
PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
PyLong_FromVoidPtr(void *p)
|
1998-09-18 11:14:13 -03:00
|
|
|
{
|
2001-06-16 05:48:40 -03:00
|
|
|
#if SIZEOF_VOID_P <= SIZEOF_LONG
|
2006-04-10 17:28:17 -03:00
|
|
|
if ((long)p < 0)
|
|
|
|
return PyLong_FromUnsignedLong((unsigned long)p);
|
1998-09-18 11:14:13 -03:00
|
|
|
return PyInt_FromLong((long)p);
|
|
|
|
#else
|
2001-06-16 05:48:40 -03:00
|
|
|
|
|
|
|
#ifndef HAVE_LONG_LONG
|
|
|
|
# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
|
|
|
|
#endif
|
|
|
|
#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
|
2003-03-29 06:06:18 -04:00
|
|
|
# error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
|
2001-06-16 05:48:40 -03:00
|
|
|
#endif
|
1998-09-18 11:14:13 -03:00
|
|
|
/* optimize null pointers */
|
2001-06-16 05:48:40 -03:00
|
|
|
if (p == NULL)
|
1998-09-18 11:14:13 -03:00
|
|
|
return PyInt_FromLong(0);
|
2006-04-10 17:28:17 -03:00
|
|
|
return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)p);
|
2001-06-16 05:48:40 -03:00
|
|
|
|
|
|
|
#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
|
1998-09-18 11:14:13 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Get a C pointer from a long object (or an int object in some cases) */
|
|
|
|
|
|
|
|
void *
|
2000-07-07 12:53:28 -03:00
|
|
|
PyLong_AsVoidPtr(PyObject *vv)
|
1998-09-18 11:14:13 -03:00
|
|
|
{
|
|
|
|
/* This function will allow int or long objects. If vv is neither,
|
|
|
|
then the PyLong_AsLong*() functions will raise the exception:
|
|
|
|
PyExc_SystemError, "bad argument to internal function"
|
|
|
|
*/
|
2001-06-16 05:48:40 -03:00
|
|
|
#if SIZEOF_VOID_P <= SIZEOF_LONG
|
1998-09-18 11:14:13 -03:00
|
|
|
long x;
|
|
|
|
|
2001-06-16 05:48:40 -03:00
|
|
|
if (PyInt_Check(vv))
|
1998-09-18 11:14:13 -03:00
|
|
|
x = PyInt_AS_LONG(vv);
|
2006-04-10 17:28:17 -03:00
|
|
|
else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
|
1998-09-18 11:14:13 -03:00
|
|
|
x = PyLong_AsLong(vv);
|
2006-04-10 17:28:17 -03:00
|
|
|
else
|
|
|
|
x = PyLong_AsUnsignedLong(vv);
|
1998-09-18 11:14:13 -03:00
|
|
|
#else
|
2001-06-16 05:48:40 -03:00
|
|
|
|
|
|
|
#ifndef HAVE_LONG_LONG
|
|
|
|
# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
|
|
|
|
#endif
|
|
|
|
#if SIZEOF_LONG_LONG < SIZEOF_VOID_P
|
2003-03-29 06:06:18 -04:00
|
|
|
# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
|
2001-06-16 05:48:40 -03:00
|
|
|
#endif
|
2003-03-29 06:06:18 -04:00
|
|
|
PY_LONG_LONG x;
|
1998-09-18 11:14:13 -03:00
|
|
|
|
2001-06-16 05:48:40 -03:00
|
|
|
if (PyInt_Check(vv))
|
1998-09-18 11:14:13 -03:00
|
|
|
x = PyInt_AS_LONG(vv);
|
2006-04-10 17:28:17 -03:00
|
|
|
else if (PyLong_Check(vv) && _PyLong_Sign(vv) < 0)
|
1998-09-18 11:14:13 -03:00
|
|
|
x = PyLong_AsLongLong(vv);
|
2006-04-10 17:28:17 -03:00
|
|
|
else
|
|
|
|
x = PyLong_AsUnsignedLongLong(vv);
|
2001-06-16 05:48:40 -03:00
|
|
|
|
|
|
|
#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
|
1998-09-18 11:14:13 -03:00
|
|
|
|
|
|
|
if (x == -1 && PyErr_Occurred())
|
|
|
|
return NULL;
|
|
|
|
return (void *)x;
|
|
|
|
}
|
|
|
|
|
1998-08-04 19:46:29 -03:00
|
|
|
#ifdef HAVE_LONG_LONG
|
2001-06-12 21:35:57 -03:00
|
|
|
|
2003-03-29 06:06:18 -04:00
|
|
|
/* Initial PY_LONG_LONG support by Chris Herborth (chrish@qnx.com), later
|
2001-06-12 21:35:57 -03:00
|
|
|
* rewritten to use the newer PyLong_{As,From}ByteArray API.
|
1998-08-04 19:46:29 -03:00
|
|
|
*/
|
|
|
|
|
2001-06-14 15:42:50 -03:00
|
|
|
#define IS_LITTLE_ENDIAN (int)*(unsigned char*)&one
|
2001-06-12 21:35:57 -03:00
|
|
|
|
2003-03-29 06:06:18 -04:00
|
|
|
/* Create a new long int object from a C PY_LONG_LONG int. */
|
1998-08-04 19:46:29 -03:00
|
|
|
|
|
|
|
PyObject *
|
2003-03-29 06:06:18 -04:00
|
|
|
PyLong_FromLongLong(PY_LONG_LONG ival)
|
1998-08-04 19:46:29 -03:00
|
|
|
{
|
2006-05-25 15:20:23 -03:00
|
|
|
PyLongObject *v;
|
2008-04-15 17:51:18 -03:00
|
|
|
unsigned PY_LONG_LONG abs_ival;
|
2006-05-25 15:20:23 -03:00
|
|
|
unsigned PY_LONG_LONG t; /* unsigned so >> doesn't propagate sign bit */
|
|
|
|
int ndigits = 0;
|
|
|
|
int negative = 0;
|
|
|
|
|
|
|
|
if (ival < 0) {
|
2008-04-15 17:51:18 -03:00
|
|
|
/* avoid signed overflow on negation; see comments
|
|
|
|
in PyLong_FromLong above. */
|
|
|
|
abs_ival = (unsigned PY_LONG_LONG)(-1-ival) + 1;
|
2006-05-25 15:20:23 -03:00
|
|
|
negative = 1;
|
|
|
|
}
|
2008-04-15 17:51:18 -03:00
|
|
|
else {
|
|
|
|
abs_ival = (unsigned PY_LONG_LONG)ival;
|
|
|
|
}
|
2006-05-25 15:20:23 -03:00
|
|
|
|
|
|
|
/* Count the number of Python digits.
|
|
|
|
We used to pick 5 ("big enough for anything"), but that's a
|
|
|
|
waste of time and space given that 5*15 = 75 bits are rarely
|
|
|
|
needed. */
|
2008-04-15 17:51:18 -03:00
|
|
|
t = abs_ival;
|
2006-05-25 15:20:23 -03:00
|
|
|
while (t) {
|
|
|
|
++ndigits;
|
2008-01-25 08:18:43 -04:00
|
|
|
t >>= PyLong_SHIFT;
|
2006-05-25 15:20:23 -03:00
|
|
|
}
|
|
|
|
v = _PyLong_New(ndigits);
|
|
|
|
if (v != NULL) {
|
|
|
|
digit *p = v->ob_digit;
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(v) = negative ? -ndigits : ndigits;
|
2008-04-15 17:51:18 -03:00
|
|
|
t = abs_ival;
|
2006-05-25 15:20:23 -03:00
|
|
|
while (t) {
|
2008-01-25 08:18:43 -04:00
|
|
|
*p++ = (digit)(t & PyLong_MASK);
|
|
|
|
t >>= PyLong_SHIFT;
|
2006-05-25 15:20:23 -03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return (PyObject *)v;
|
1998-08-04 19:46:29 -03:00
|
|
|
}
|
|
|
|
|
2003-03-29 06:06:18 -04:00
|
|
|
/* Create a new long int object from a C unsigned PY_LONG_LONG int. */
|
2001-06-12 21:35:57 -03:00
|
|
|
|
1998-08-04 19:46:29 -03:00
|
|
|
PyObject *
|
2003-03-29 06:06:18 -04:00
|
|
|
PyLong_FromUnsignedLongLong(unsigned PY_LONG_LONG ival)
|
1998-08-04 19:46:29 -03:00
|
|
|
{
|
2006-05-25 15:20:23 -03:00
|
|
|
PyLongObject *v;
|
|
|
|
unsigned PY_LONG_LONG t;
|
|
|
|
int ndigits = 0;
|
|
|
|
|
|
|
|
/* Count the number of Python digits. */
|
|
|
|
t = (unsigned PY_LONG_LONG)ival;
|
|
|
|
while (t) {
|
|
|
|
++ndigits;
|
2008-01-25 08:18:43 -04:00
|
|
|
t >>= PyLong_SHIFT;
|
2006-05-25 15:20:23 -03:00
|
|
|
}
|
|
|
|
v = _PyLong_New(ndigits);
|
|
|
|
if (v != NULL) {
|
|
|
|
digit *p = v->ob_digit;
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(v) = ndigits;
|
2006-05-25 15:20:23 -03:00
|
|
|
while (ival) {
|
2008-01-25 08:18:43 -04:00
|
|
|
*p++ = (digit)(ival & PyLong_MASK);
|
|
|
|
ival >>= PyLong_SHIFT;
|
2006-05-25 15:20:23 -03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return (PyObject *)v;
|
1998-08-04 19:46:29 -03:00
|
|
|
}
|
|
|
|
|
2006-02-15 13:27:45 -04:00
|
|
|
/* Create a new long int object from a C Py_ssize_t. */
|
|
|
|
|
|
|
|
PyObject *
|
2008-01-25 08:18:43 -04:00
|
|
|
PyLong_FromSsize_t(Py_ssize_t ival)
|
2006-02-15 13:27:45 -04:00
|
|
|
{
|
|
|
|
Py_ssize_t bytes = ival;
|
|
|
|
int one = 1;
|
|
|
|
return _PyLong_FromByteArray(
|
|
|
|
(unsigned char *)&bytes,
|
2007-05-03 17:27:03 -03:00
|
|
|
SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 1);
|
2006-02-15 13:27:45 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Create a new long int object from a C size_t. */
|
|
|
|
|
|
|
|
PyObject *
|
2008-01-25 08:18:43 -04:00
|
|
|
PyLong_FromSize_t(size_t ival)
|
2006-02-15 13:27:45 -04:00
|
|
|
{
|
|
|
|
size_t bytes = ival;
|
|
|
|
int one = 1;
|
|
|
|
return _PyLong_FromByteArray(
|
|
|
|
(unsigned char *)&bytes,
|
|
|
|
SIZEOF_SIZE_T, IS_LITTLE_ENDIAN, 0);
|
|
|
|
}
|
|
|
|
|
2003-03-29 06:06:18 -04:00
|
|
|
/* Get a C PY_LONG_LONG int from a long int object.
|
2001-06-12 21:35:57 -03:00
|
|
|
Return -1 and set an error if overflow occurs. */
|
1998-08-04 19:46:29 -03:00
|
|
|
|
2003-03-29 06:06:18 -04:00
|
|
|
PY_LONG_LONG
|
2000-07-07 12:53:28 -03:00
|
|
|
PyLong_AsLongLong(PyObject *vv)
|
1998-08-04 19:46:29 -03:00
|
|
|
{
|
2003-03-29 06:06:18 -04:00
|
|
|
PY_LONG_LONG bytes;
|
2001-06-12 21:35:57 -03:00
|
|
|
int one = 1;
|
|
|
|
int res;
|
|
|
|
|
2001-09-30 02:09:37 -03:00
|
|
|
if (vv == NULL) {
|
|
|
|
PyErr_BadInternalCall();
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (!PyLong_Check(vv)) {
|
2005-03-03 08:26:35 -04:00
|
|
|
PyNumberMethods *nb;
|
|
|
|
PyObject *io;
|
2001-09-30 02:09:37 -03:00
|
|
|
if (PyInt_Check(vv))
|
2003-03-29 06:06:18 -04:00
|
|
|
return (PY_LONG_LONG)PyInt_AsLong(vv);
|
2005-03-03 08:26:35 -04:00
|
|
|
if ((nb = vv->ob_type->tp_as_number) == NULL ||
|
|
|
|
nb->nb_int == NULL) {
|
|
|
|
PyErr_SetString(PyExc_TypeError, "an integer is required");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
io = (*nb->nb_int) (vv);
|
|
|
|
if (io == NULL)
|
|
|
|
return -1;
|
|
|
|
if (PyInt_Check(io)) {
|
|
|
|
bytes = PyInt_AsLong(io);
|
|
|
|
Py_DECREF(io);
|
|
|
|
return bytes;
|
|
|
|
}
|
|
|
|
if (PyLong_Check(io)) {
|
|
|
|
bytes = PyLong_AsLongLong(io);
|
|
|
|
Py_DECREF(io);
|
|
|
|
return bytes;
|
|
|
|
}
|
|
|
|
Py_DECREF(io);
|
|
|
|
PyErr_SetString(PyExc_TypeError, "integer conversion failed");
|
1998-08-04 19:46:29 -03:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2001-06-12 21:35:57 -03:00
|
|
|
res = _PyLong_AsByteArray(
|
|
|
|
(PyLongObject *)vv, (unsigned char *)&bytes,
|
|
|
|
SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 1);
|
1998-08-04 19:46:29 -03:00
|
|
|
|
2003-03-29 06:06:18 -04:00
|
|
|
/* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
|
2002-03-09 08:02:59 -04:00
|
|
|
if (res < 0)
|
2003-03-29 06:06:18 -04:00
|
|
|
return (PY_LONG_LONG)-1;
|
2002-03-09 08:02:59 -04:00
|
|
|
else
|
|
|
|
return bytes;
|
1998-08-04 19:46:29 -03:00
|
|
|
}
|
|
|
|
|
2003-03-29 06:06:18 -04:00
|
|
|
/* Get a C unsigned PY_LONG_LONG int from a long int object.
|
2001-06-12 21:35:57 -03:00
|
|
|
Return -1 and set an error if overflow occurs. */
|
|
|
|
|
2003-03-29 06:06:18 -04:00
|
|
|
unsigned PY_LONG_LONG
|
2000-07-07 12:53:28 -03:00
|
|
|
PyLong_AsUnsignedLongLong(PyObject *vv)
|
1998-08-04 19:46:29 -03:00
|
|
|
{
|
2003-03-29 06:06:18 -04:00
|
|
|
unsigned PY_LONG_LONG bytes;
|
2001-06-12 21:35:57 -03:00
|
|
|
int one = 1;
|
|
|
|
int res;
|
|
|
|
|
1998-08-04 19:46:29 -03:00
|
|
|
if (vv == NULL || !PyLong_Check(vv)) {
|
|
|
|
PyErr_BadInternalCall();
|
2006-04-17 21:35:43 -03:00
|
|
|
return (unsigned PY_LONG_LONG)-1;
|
1998-08-04 19:46:29 -03:00
|
|
|
}
|
|
|
|
|
2001-06-12 21:35:57 -03:00
|
|
|
res = _PyLong_AsByteArray(
|
|
|
|
(PyLongObject *)vv, (unsigned char *)&bytes,
|
|
|
|
SIZEOF_LONG_LONG, IS_LITTLE_ENDIAN, 0);
|
1998-08-04 19:46:29 -03:00
|
|
|
|
2003-03-29 06:06:18 -04:00
|
|
|
/* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
|
2002-03-09 08:02:59 -04:00
|
|
|
if (res < 0)
|
2003-03-29 06:06:18 -04:00
|
|
|
return (unsigned PY_LONG_LONG)res;
|
2002-03-09 08:02:59 -04:00
|
|
|
else
|
|
|
|
return bytes;
|
2001-06-12 21:35:57 -03:00
|
|
|
}
|
1998-08-04 19:46:29 -03:00
|
|
|
|
2003-04-17 15:55:45 -03:00
|
|
|
/* Get a C unsigned long int from a long int object, ignoring the high bits.
|
|
|
|
Returns -1 and sets an error condition if an error occurs. */
|
|
|
|
|
|
|
|
unsigned PY_LONG_LONG
|
|
|
|
PyLong_AsUnsignedLongLongMask(PyObject *vv)
|
|
|
|
{
|
|
|
|
register PyLongObject *v;
|
|
|
|
unsigned PY_LONG_LONG x;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i;
|
|
|
|
int sign;
|
2003-04-17 15:55:45 -03:00
|
|
|
|
|
|
|
if (vv == NULL || !PyLong_Check(vv)) {
|
|
|
|
PyErr_BadInternalCall();
|
|
|
|
return (unsigned long) -1;
|
|
|
|
}
|
|
|
|
v = (PyLongObject *)vv;
|
|
|
|
i = v->ob_size;
|
|
|
|
sign = 1;
|
|
|
|
x = 0;
|
|
|
|
if (i < 0) {
|
|
|
|
sign = -1;
|
|
|
|
i = -i;
|
|
|
|
}
|
|
|
|
while (--i >= 0) {
|
2009-09-28 13:52:40 -03:00
|
|
|
x = (x << PyLong_SHIFT) | v->ob_digit[i];
|
2003-04-17 15:55:45 -03:00
|
|
|
}
|
|
|
|
return x * sign;
|
|
|
|
}
|
2001-06-12 21:35:57 -03:00
|
|
|
#undef IS_LITTLE_ENDIAN
|
1998-08-04 19:46:29 -03:00
|
|
|
|
|
|
|
#endif /* HAVE_LONG_LONG */
|
|
|
|
|
2001-01-03 21:46:03 -04:00
|
|
|
|
|
|
|
static int
|
|
|
|
convert_binop(PyObject *v, PyObject *w, PyLongObject **a, PyLongObject **b) {
|
2002-08-11 23:31:19 -03:00
|
|
|
if (PyLong_Check(v)) {
|
2001-01-03 21:46:03 -04:00
|
|
|
*a = (PyLongObject *) v;
|
|
|
|
Py_INCREF(v);
|
|
|
|
}
|
|
|
|
else if (PyInt_Check(v)) {
|
|
|
|
*a = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(v));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return 0;
|
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
if (PyLong_Check(w)) {
|
2001-01-03 21:46:03 -04:00
|
|
|
*b = (PyLongObject *) w;
|
|
|
|
Py_INCREF(w);
|
|
|
|
}
|
|
|
|
else if (PyInt_Check(w)) {
|
|
|
|
*b = (PyLongObject *) PyLong_FromLong(PyInt_AS_LONG(w));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Py_DECREF(*a);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define CONVERT_BINOP(v, w, a, b) \
|
|
|
|
if (!convert_binop(v, w, a, b)) { \
|
|
|
|
Py_INCREF(Py_NotImplemented); \
|
|
|
|
return Py_NotImplemented; \
|
|
|
|
}
|
|
|
|
|
2009-03-23 15:25:13 -03:00
|
|
|
/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
|
|
|
|
2**k if d is nonzero, else 0. */
|
|
|
|
|
|
|
|
static const unsigned char BitLengthTable[32] = {
|
|
|
|
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
|
|
|
|
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
|
|
|
|
};
|
|
|
|
|
|
|
|
static int
|
|
|
|
bits_in_digit(digit d)
|
|
|
|
{
|
|
|
|
int d_bits = 0;
|
|
|
|
while (d >= 32) {
|
|
|
|
d_bits += 6;
|
|
|
|
d >>= 6;
|
|
|
|
}
|
|
|
|
d_bits += (int)BitLengthTable[d];
|
|
|
|
return d_bits;
|
|
|
|
}
|
|
|
|
|
2002-08-12 02:09:36 -03:00
|
|
|
/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
|
|
|
|
* is modified in place, by adding y to it. Carries are propagated as far as
|
|
|
|
* x[m-1], and the remaining carry (0 or 1) is returned.
|
|
|
|
*/
|
|
|
|
static digit
|
2006-02-15 13:27:45 -04:00
|
|
|
v_iadd(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
|
2002-08-12 02:09:36 -03:00
|
|
|
{
|
2009-01-24 11:27:44 -04:00
|
|
|
Py_ssize_t i;
|
2002-08-12 02:09:36 -03:00
|
|
|
digit carry = 0;
|
|
|
|
|
|
|
|
assert(m >= n);
|
|
|
|
for (i = 0; i < n; ++i) {
|
|
|
|
carry += x[i] + y[i];
|
2008-01-25 08:18:43 -04:00
|
|
|
x[i] = carry & PyLong_MASK;
|
|
|
|
carry >>= PyLong_SHIFT;
|
2002-08-12 02:09:36 -03:00
|
|
|
assert((carry & 1) == carry);
|
|
|
|
}
|
|
|
|
for (; carry && i < m; ++i) {
|
|
|
|
carry += x[i];
|
2008-01-25 08:18:43 -04:00
|
|
|
x[i] = carry & PyLong_MASK;
|
|
|
|
carry >>= PyLong_SHIFT;
|
2002-08-12 02:09:36 -03:00
|
|
|
assert((carry & 1) == carry);
|
|
|
|
}
|
|
|
|
return carry;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
|
|
|
|
* is modified in place, by subtracting y from it. Borrows are propagated as
|
|
|
|
* far as x[m-1], and the remaining borrow (0 or 1) is returned.
|
|
|
|
*/
|
|
|
|
static digit
|
2006-02-15 13:27:45 -04:00
|
|
|
v_isub(digit *x, Py_ssize_t m, digit *y, Py_ssize_t n)
|
2002-08-12 02:09:36 -03:00
|
|
|
{
|
2009-01-24 11:27:44 -04:00
|
|
|
Py_ssize_t i;
|
2002-08-12 02:09:36 -03:00
|
|
|
digit borrow = 0;
|
|
|
|
|
|
|
|
assert(m >= n);
|
|
|
|
for (i = 0; i < n; ++i) {
|
|
|
|
borrow = x[i] - y[i] - borrow;
|
2008-01-25 08:18:43 -04:00
|
|
|
x[i] = borrow & PyLong_MASK;
|
|
|
|
borrow >>= PyLong_SHIFT;
|
2002-08-12 02:09:36 -03:00
|
|
|
borrow &= 1; /* keep only 1 sign bit */
|
|
|
|
}
|
|
|
|
for (; borrow && i < m; ++i) {
|
|
|
|
borrow = x[i] - borrow;
|
2008-01-25 08:18:43 -04:00
|
|
|
x[i] = borrow & PyLong_MASK;
|
|
|
|
borrow >>= PyLong_SHIFT;
|
2002-08-12 02:09:36 -03:00
|
|
|
borrow &= 1;
|
|
|
|
}
|
|
|
|
return borrow;
|
|
|
|
}
|
2001-01-03 21:46:03 -04:00
|
|
|
|
2009-03-23 15:25:13 -03:00
|
|
|
/* Shift digit vector a[0:m] d bits left, with 0 <= d < PyLong_SHIFT. Put
|
|
|
|
* result in z[0:m], and return the d bits shifted out of the top.
|
|
|
|
*/
|
|
|
|
static digit
|
|
|
|
v_lshift(digit *z, digit *a, Py_ssize_t m, int d)
|
|
|
|
{
|
|
|
|
Py_ssize_t i;
|
|
|
|
digit carry = 0;
|
1991-05-05 17:09:44 -03:00
|
|
|
|
2009-03-23 15:25:13 -03:00
|
|
|
assert(0 <= d && d < PyLong_SHIFT);
|
|
|
|
for (i=0; i < m; i++) {
|
|
|
|
twodigits acc = (twodigits)a[i] << d | carry;
|
|
|
|
z[i] = (digit)acc & PyLong_MASK;
|
|
|
|
carry = (digit)(acc >> PyLong_SHIFT);
|
|
|
|
}
|
|
|
|
return carry;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Shift digit vector a[0:m] d bits right, with 0 <= d < PyLong_SHIFT. Put
|
|
|
|
* result in z[0:m], and return the d bits shifted out of the bottom.
|
|
|
|
*/
|
|
|
|
static digit
|
|
|
|
v_rshift(digit *z, digit *a, Py_ssize_t m, int d)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i;
|
2009-03-23 15:25:13 -03:00
|
|
|
digit carry = 0;
|
|
|
|
digit mask = ((digit)1 << d) - 1U;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2009-03-23 15:25:13 -03:00
|
|
|
assert(0 <= d && d < PyLong_SHIFT);
|
|
|
|
for (i=m; i-- > 0;) {
|
|
|
|
twodigits acc = (twodigits)carry << PyLong_SHIFT | a[i];
|
|
|
|
carry = (digit)acc & mask;
|
|
|
|
z[i] = (digit)(acc >> d);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
2009-03-23 15:25:13 -03:00
|
|
|
return carry;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
2001-07-14 09:23:19 -03:00
|
|
|
/* Divide long pin, w/ size digits, by non-zero digit n, storing quotient
|
|
|
|
in pout, and returning the remainder. pin and pout point at the LSD.
|
|
|
|
It's OK for pin == pout on entry, which saves oodles of mallocs/frees in
|
2008-02-09 21:36:53 -04:00
|
|
|
_PyLong_Format, but that should be done with great care since longs are
|
2001-07-14 09:23:19 -03:00
|
|
|
immutable. */
|
|
|
|
|
|
|
|
static digit
|
2006-02-15 13:27:45 -04:00
|
|
|
inplace_divrem1(digit *pout, digit *pin, Py_ssize_t size, digit n)
|
2001-07-14 09:23:19 -03:00
|
|
|
{
|
|
|
|
twodigits rem = 0;
|
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
assert(n > 0 && n <= PyLong_MASK);
|
2001-07-14 09:23:19 -03:00
|
|
|
pin += size;
|
|
|
|
pout += size;
|
|
|
|
while (--size >= 0) {
|
|
|
|
digit hi;
|
2009-09-28 13:52:40 -03:00
|
|
|
rem = (rem << PyLong_SHIFT) | *--pin;
|
2001-07-14 09:23:19 -03:00
|
|
|
*--pout = hi = (digit)(rem / n);
|
2009-01-24 11:27:44 -04:00
|
|
|
rem -= (twodigits)hi * n;
|
2001-07-14 09:23:19 -03:00
|
|
|
}
|
|
|
|
return (digit)rem;
|
|
|
|
}
|
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
/* Divide a long integer by a digit, returning both the quotient
|
|
|
|
(as function result) and the remainder (through *prem).
|
|
|
|
The sign of a is ignored; n should not be zero. */
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyLongObject *
|
2001-07-14 09:23:19 -03:00
|
|
|
divrem1(PyLongObject *a, digit n, digit *prem)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2007-12-18 22:37:44 -04:00
|
|
|
const Py_ssize_t size = ABS(Py_SIZE(a));
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *z;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
assert(n > 0 && n <= PyLong_MASK);
|
1997-05-02 00:12:38 -03:00
|
|
|
z = _PyLong_New(size);
|
1991-05-05 17:09:44 -03:00
|
|
|
if (z == NULL)
|
|
|
|
return NULL;
|
2001-07-14 09:23:19 -03:00
|
|
|
*prem = inplace_divrem1(z->ob_digit, a->ob_digit, size, n);
|
1991-05-05 17:09:44 -03:00
|
|
|
return long_normalize(z);
|
|
|
|
}
|
|
|
|
|
2009-09-16 19:10:56 -03:00
|
|
|
/* Convert a long integer to a base 10 string. Returns a new non-shared
|
|
|
|
string. (Return value is non-shared so that callers can modify the
|
|
|
|
returned value if necessary.) */
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
long_to_decimal_string(PyObject *aa, int addL)
|
|
|
|
{
|
|
|
|
PyLongObject *scratch, *a;
|
|
|
|
PyObject *str;
|
|
|
|
Py_ssize_t size, strlen, size_a, i, j;
|
|
|
|
digit *pout, *pin, rem, tenpow;
|
|
|
|
char *p;
|
|
|
|
int negative;
|
|
|
|
|
|
|
|
a = (PyLongObject *)aa;
|
|
|
|
if (a == NULL || !PyLong_Check(a)) {
|
|
|
|
PyErr_BadInternalCall();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
size_a = ABS(Py_SIZE(a));
|
|
|
|
negative = Py_SIZE(a) < 0;
|
|
|
|
|
|
|
|
/* quick and dirty upper bound for the number of digits
|
|
|
|
required to express a in base _PyLong_DECIMAL_BASE:
|
|
|
|
|
|
|
|
#digits = 1 + floor(log2(a) / log2(_PyLong_DECIMAL_BASE))
|
|
|
|
|
|
|
|
But log2(a) < size_a * PyLong_SHIFT, and
|
|
|
|
log2(_PyLong_DECIMAL_BASE) = log2(10) * _PyLong_DECIMAL_SHIFT
|
|
|
|
> 3 * _PyLong_DECIMAL_SHIFT
|
|
|
|
*/
|
|
|
|
if (size_a > PY_SSIZE_T_MAX / PyLong_SHIFT) {
|
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
|
|
|
"long is too large to format");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
/* the expression size_a * PyLong_SHIFT is now safe from overflow */
|
|
|
|
size = 1 + size_a * PyLong_SHIFT / (3 * _PyLong_DECIMAL_SHIFT);
|
|
|
|
scratch = _PyLong_New(size);
|
|
|
|
if (scratch == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* convert array of base _PyLong_BASE digits in pin to an array of
|
|
|
|
base _PyLong_DECIMAL_BASE digits in pout, following Knuth (TAOCP,
|
|
|
|
Volume 2 (3rd edn), section 4.4, Method 1b). */
|
|
|
|
pin = a->ob_digit;
|
|
|
|
pout = scratch->ob_digit;
|
|
|
|
size = 0;
|
|
|
|
for (i = size_a; --i >= 0; ) {
|
|
|
|
digit hi = pin[i];
|
|
|
|
for (j = 0; j < size; j++) {
|
|
|
|
twodigits z = (twodigits)pout[j] << PyLong_SHIFT | hi;
|
2009-09-21 13:16:44 -03:00
|
|
|
hi = (digit)(z / _PyLong_DECIMAL_BASE);
|
|
|
|
pout[j] = (digit)(z - (twodigits)hi *
|
|
|
|
_PyLong_DECIMAL_BASE);
|
2009-09-16 19:10:56 -03:00
|
|
|
}
|
|
|
|
while (hi) {
|
|
|
|
pout[size++] = hi % _PyLong_DECIMAL_BASE;
|
|
|
|
hi /= _PyLong_DECIMAL_BASE;
|
|
|
|
}
|
|
|
|
/* check for keyboard interrupt */
|
|
|
|
SIGCHECK({
|
|
|
|
Py_DECREF(scratch);
|
|
|
|
return NULL;
|
|
|
|
})
|
|
|
|
}
|
|
|
|
/* pout should have at least one digit, so that the case when a = 0
|
|
|
|
works correctly */
|
|
|
|
if (size == 0)
|
|
|
|
pout[size++] = 0;
|
|
|
|
|
|
|
|
/* calculate exact length of output string, and allocate */
|
|
|
|
strlen = (addL != 0) + negative +
|
|
|
|
1 + (size - 1) * _PyLong_DECIMAL_SHIFT;
|
|
|
|
tenpow = 10;
|
|
|
|
rem = pout[size-1];
|
|
|
|
while (rem >= tenpow) {
|
|
|
|
tenpow *= 10;
|
|
|
|
strlen++;
|
|
|
|
}
|
|
|
|
str = PyString_FromStringAndSize(NULL, strlen);
|
|
|
|
if (str == NULL) {
|
|
|
|
Py_DECREF(scratch);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* fill the string right-to-left */
|
|
|
|
p = PyString_AS_STRING(str) + strlen;
|
|
|
|
*p = '\0';
|
|
|
|
if (addL)
|
|
|
|
*--p = 'L';
|
|
|
|
/* pout[0] through pout[size-2] contribute exactly
|
|
|
|
_PyLong_DECIMAL_SHIFT digits each */
|
|
|
|
for (i=0; i < size - 1; i++) {
|
|
|
|
rem = pout[i];
|
|
|
|
for (j = 0; j < _PyLong_DECIMAL_SHIFT; j++) {
|
|
|
|
*--p = '0' + rem % 10;
|
|
|
|
rem /= 10;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* pout[size-1]: always produce at least one decimal digit */
|
|
|
|
rem = pout[i];
|
|
|
|
do {
|
|
|
|
*--p = '0' + rem % 10;
|
|
|
|
rem /= 10;
|
|
|
|
} while (rem != 0);
|
|
|
|
|
|
|
|
/* and sign */
|
|
|
|
if (negative)
|
|
|
|
*--p = '-';
|
|
|
|
|
|
|
|
/* check we've counted correctly */
|
|
|
|
assert(p == PyString_AS_STRING(str));
|
|
|
|
Py_DECREF(scratch);
|
|
|
|
return (PyObject *)str;
|
|
|
|
}
|
|
|
|
|
2008-02-09 21:36:53 -04:00
|
|
|
/* Convert the long to a string object with given base,
|
|
|
|
appending a base prefix of 0[box] if base is 2, 8 or 16.
|
|
|
|
Add a trailing "L" if addL is non-zero.
|
|
|
|
If newstyle is zero, then use the pre-2.6 behavior of octal having
|
|
|
|
a leading "0", instead of the prefix "0o" */
|
|
|
|
PyAPI_FUNC(PyObject *)
|
|
|
|
_PyLong_Format(PyObject *aa, int base, int addL, int newstyle)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
1997-05-02 00:12:38 -03:00
|
|
|
register PyLongObject *a = (PyLongObject *)aa;
|
2008-06-09 01:58:54 -03:00
|
|
|
PyStringObject *str;
|
2009-09-13 08:56:13 -03:00
|
|
|
Py_ssize_t i, sz;
|
2006-07-23 04:53:14 -03:00
|
|
|
Py_ssize_t size_a;
|
1991-05-05 17:09:44 -03:00
|
|
|
char *p;
|
|
|
|
int bits;
|
|
|
|
char sign = '\0';
|
1992-01-19 12:31:05 -04:00
|
|
|
|
2009-09-16 19:10:56 -03:00
|
|
|
if (base == 10)
|
|
|
|
return long_to_decimal_string((PyObject *)a, addL);
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
if (a == NULL || !PyLong_Check(a)) {
|
|
|
|
PyErr_BadInternalCall();
|
1992-01-19 12:31:05 -04:00
|
|
|
return NULL;
|
|
|
|
}
|
1991-05-05 17:09:44 -03:00
|
|
|
assert(base >= 2 && base <= 36);
|
2007-12-18 22:37:44 -04:00
|
|
|
size_a = ABS(Py_SIZE(a));
|
2002-08-11 23:31:19 -03:00
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
/* Compute a rough upper bound for the length of the string */
|
|
|
|
i = base;
|
|
|
|
bits = 0;
|
|
|
|
while (i > 1) {
|
|
|
|
++bits;
|
|
|
|
i >>= 1;
|
|
|
|
}
|
2006-10-04 09:17:45 -03:00
|
|
|
i = 5 + (addL ? 1 : 0);
|
2009-09-13 08:56:13 -03:00
|
|
|
/* ensure we don't get signed overflow in sz calculation */
|
|
|
|
if (size_a > (PY_SSIZE_T_MAX - i) / PyLong_SHIFT) {
|
2006-10-04 09:17:45 -03:00
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
|
|
|
"long is too large to format");
|
|
|
|
return NULL;
|
|
|
|
}
|
2009-09-13 08:56:13 -03:00
|
|
|
sz = i + 1 + (size_a * PyLong_SHIFT - 1) / bits;
|
|
|
|
assert(sz >= 0);
|
2008-06-09 01:58:54 -03:00
|
|
|
str = (PyStringObject *) PyString_FromStringAndSize((char *)0, sz);
|
1991-05-05 17:09:44 -03:00
|
|
|
if (str == NULL)
|
|
|
|
return NULL;
|
2008-06-09 01:58:54 -03:00
|
|
|
p = PyString_AS_STRING(str) + sz;
|
1991-05-05 17:09:44 -03:00
|
|
|
*p = '\0';
|
2009-09-13 08:56:13 -03:00
|
|
|
if (addL)
|
|
|
|
*--p = 'L';
|
1992-01-14 14:36:43 -04:00
|
|
|
if (a->ob_size < 0)
|
|
|
|
sign = '-';
|
2002-08-11 23:31:19 -03:00
|
|
|
|
1998-08-11 12:04:47 -03:00
|
|
|
if (a->ob_size == 0) {
|
|
|
|
*--p = '0';
|
|
|
|
}
|
|
|
|
else if ((base & (base - 1)) == 0) {
|
|
|
|
/* JRH: special case for power-of-2 bases */
|
2001-07-15 06:11:14 -03:00
|
|
|
twodigits accum = 0;
|
|
|
|
int accumbits = 0; /* # of bits in accum */
|
|
|
|
int basebits = 1; /* # of bits in base-1 */
|
1998-08-11 12:04:47 -03:00
|
|
|
i = base;
|
2000-07-08 01:17:21 -03:00
|
|
|
while ((i >>= 1) > 1)
|
|
|
|
++basebits;
|
2001-07-15 06:11:14 -03:00
|
|
|
|
|
|
|
for (i = 0; i < size_a; ++i) {
|
2002-08-20 16:00:22 -03:00
|
|
|
accum |= (twodigits)a->ob_digit[i] << accumbits;
|
2008-01-25 08:18:43 -04:00
|
|
|
accumbits += PyLong_SHIFT;
|
2001-07-15 06:11:14 -03:00
|
|
|
assert(accumbits >= basebits);
|
|
|
|
do {
|
2002-02-16 19:39:10 -04:00
|
|
|
char cdigit = (char)(accum & (base - 1));
|
2005-06-29 20:29:56 -03:00
|
|
|
cdigit += (cdigit < 10) ? '0' : 'a'-10;
|
2008-06-09 01:58:54 -03:00
|
|
|
assert(p > PyString_AS_STRING(str));
|
2002-02-16 19:39:10 -04:00
|
|
|
*--p = cdigit;
|
2001-07-15 06:11:14 -03:00
|
|
|
accumbits -= basebits;
|
|
|
|
accum >>= basebits;
|
|
|
|
} while (i < size_a-1 ? accumbits >= basebits :
|
2009-09-13 08:56:13 -03:00
|
|
|
accum > 0);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
1998-08-11 12:04:47 -03:00
|
|
|
}
|
|
|
|
else {
|
2001-07-12 23:59:26 -03:00
|
|
|
/* Not 0, and base not a power of 2. Divide repeatedly by
|
|
|
|
base, but for speed use the highest power of base that
|
|
|
|
fits in a digit. */
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t size = size_a;
|
2001-07-14 09:23:19 -03:00
|
|
|
digit *pin = a->ob_digit;
|
|
|
|
PyLongObject *scratch;
|
|
|
|
/* powbasw <- largest power of base that fits in a digit. */
|
2001-07-12 23:59:26 -03:00
|
|
|
digit powbase = base; /* powbase == base ** power */
|
|
|
|
int power = 1;
|
|
|
|
for (;;) {
|
2009-02-25 16:29:50 -04:00
|
|
|
twodigits newpow = powbase * (twodigits)base;
|
2009-09-13 08:56:13 -03:00
|
|
|
if (newpow >> PyLong_SHIFT)
|
|
|
|
/* doesn't fit in a digit */
|
2001-07-12 23:59:26 -03:00
|
|
|
break;
|
|
|
|
powbase = (digit)newpow;
|
|
|
|
++power;
|
|
|
|
}
|
2001-07-14 09:23:19 -03:00
|
|
|
|
|
|
|
/* Get a scratch area for repeated division. */
|
|
|
|
scratch = _PyLong_New(size);
|
|
|
|
if (scratch == NULL) {
|
|
|
|
Py_DECREF(str);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Repeatedly divide by powbase. */
|
1998-08-11 12:04:47 -03:00
|
|
|
do {
|
2001-07-12 23:59:26 -03:00
|
|
|
int ntostore = power;
|
2001-07-14 09:23:19 -03:00
|
|
|
digit rem = inplace_divrem1(scratch->ob_digit,
|
|
|
|
pin, size, powbase);
|
|
|
|
pin = scratch->ob_digit; /* no need to use a again */
|
|
|
|
if (pin[size - 1] == 0)
|
|
|
|
--size;
|
1998-08-11 12:04:47 -03:00
|
|
|
SIGCHECK({
|
2001-07-14 09:23:19 -03:00
|
|
|
Py_DECREF(scratch);
|
1998-08-11 12:04:47 -03:00
|
|
|
Py_DECREF(str);
|
|
|
|
return NULL;
|
|
|
|
})
|
2001-07-14 09:23:19 -03:00
|
|
|
|
|
|
|
/* Break rem into digits. */
|
2001-07-14 08:01:28 -03:00
|
|
|
assert(ntostore > 0);
|
|
|
|
do {
|
2001-07-12 23:59:26 -03:00
|
|
|
digit nextrem = (digit)(rem / base);
|
|
|
|
char c = (char)(rem - nextrem * base);
|
2008-06-09 01:58:54 -03:00
|
|
|
assert(p > PyString_AS_STRING(str));
|
2005-06-29 20:29:56 -03:00
|
|
|
c += (c < 10) ? '0' : 'a'-10;
|
2001-07-12 23:59:26 -03:00
|
|
|
*--p = c;
|
|
|
|
rem = nextrem;
|
2001-07-14 08:01:28 -03:00
|
|
|
--ntostore;
|
|
|
|
/* Termination is a bit delicate: must not
|
|
|
|
store leading zeroes, so must get out if
|
2001-07-14 09:23:19 -03:00
|
|
|
remaining quotient and rem are both 0. */
|
|
|
|
} while (ntostore && (size || rem));
|
|
|
|
} while (size != 0);
|
|
|
|
Py_DECREF(scratch);
|
1998-08-11 12:04:47 -03:00
|
|
|
}
|
|
|
|
|
2008-02-09 21:36:53 -04:00
|
|
|
if (base == 2) {
|
|
|
|
*--p = 'b';
|
|
|
|
*--p = '0';
|
|
|
|
}
|
|
|
|
else if (base == 8) {
|
2009-09-13 08:56:13 -03:00
|
|
|
if (newstyle) {
|
2008-02-09 21:36:53 -04:00
|
|
|
*--p = 'o';
|
1992-08-14 12:13:07 -03:00
|
|
|
*--p = '0';
|
2008-02-09 21:36:53 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
if (size_a != 0)
|
|
|
|
*--p = '0';
|
1992-08-14 12:13:07 -03:00
|
|
|
}
|
1991-10-24 11:55:57 -03:00
|
|
|
else if (base == 16) {
|
|
|
|
*--p = 'x';
|
|
|
|
*--p = '0';
|
|
|
|
}
|
1991-11-19 16:26:46 -04:00
|
|
|
else if (base != 10) {
|
|
|
|
*--p = '#';
|
|
|
|
*--p = '0' + base%10;
|
|
|
|
if (base > 10)
|
|
|
|
*--p = '0' + base/10;
|
|
|
|
}
|
1991-05-05 17:09:44 -03:00
|
|
|
if (sign)
|
|
|
|
*--p = sign;
|
2008-06-09 01:58:54 -03:00
|
|
|
if (p != PyString_AS_STRING(str)) {
|
|
|
|
char *q = PyString_AS_STRING(str);
|
1991-05-05 17:09:44 -03:00
|
|
|
assert(p > q);
|
|
|
|
do {
|
|
|
|
} while ((*q++ = *p++) != '\0');
|
1991-05-28 18:58:16 -03:00
|
|
|
q--;
|
2008-06-09 01:58:54 -03:00
|
|
|
_PyString_Resize((PyObject **)&str,
|
|
|
|
(Py_ssize_t) (q - PyString_AS_STRING(str)));
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *)str;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
2006-05-25 14:34:03 -03:00
|
|
|
/* Table of digit values for 8-bit string -> integer conversion.
|
|
|
|
* '0' maps to 0, ..., '9' maps to 9.
|
|
|
|
* 'a' and 'A' map to 10, ..., 'z' and 'Z' map to 35.
|
|
|
|
* All other indices map to 37.
|
|
|
|
* Note that when converting a base B string, a char c is a legitimate
|
|
|
|
* base B digit iff _PyLong_DigitValue[Py_CHARMASK(c)] < B.
|
|
|
|
*/
|
|
|
|
int _PyLong_DigitValue[256] = {
|
2006-05-24 18:10:40 -03:00
|
|
|
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
|
|
|
|
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
|
|
|
|
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
|
|
|
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 37, 37, 37, 37, 37, 37,
|
|
|
|
37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
|
|
|
|
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
|
|
|
|
37, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
|
|
|
|
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 37, 37, 37, 37,
|
|
|
|
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
|
|
|
|
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
|
|
|
|
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
|
|
|
|
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
|
|
|
|
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
|
|
|
|
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
|
|
|
|
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
|
|
|
|
37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* *str points to the first digit in a string of base `base` digits. base
|
2003-02-02 03:51:32 -04:00
|
|
|
* is a power of 2 (2, 4, 8, 16, or 32). *str is set to point to the first
|
|
|
|
* non-digit (which may be *str!). A normalized long is returned.
|
|
|
|
* The point to this routine is that it takes time linear in the number of
|
|
|
|
* string characters.
|
|
|
|
*/
|
|
|
|
static PyLongObject *
|
|
|
|
long_from_binary_base(char **str, int base)
|
|
|
|
{
|
|
|
|
char *p = *str;
|
|
|
|
char *start = p;
|
|
|
|
int bits_per_char;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t n;
|
2003-02-02 03:51:32 -04:00
|
|
|
PyLongObject *z;
|
|
|
|
twodigits accum;
|
|
|
|
int bits_in_accum;
|
|
|
|
digit *pdigit;
|
|
|
|
|
|
|
|
assert(base >= 2 && base <= 32 && (base & (base - 1)) == 0);
|
|
|
|
n = base;
|
|
|
|
for (bits_per_char = -1; n; ++bits_per_char)
|
|
|
|
n >>= 1;
|
|
|
|
/* n <- total # of bits needed, while setting p to end-of-string */
|
2008-03-28 01:58:51 -03:00
|
|
|
while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base)
|
2003-02-02 03:51:32 -04:00
|
|
|
++p;
|
|
|
|
*str = p;
|
2008-01-25 08:18:43 -04:00
|
|
|
/* n <- # of Python digits needed, = ceiling(n/PyLong_SHIFT). */
|
|
|
|
n = (p - start) * bits_per_char + PyLong_SHIFT - 1;
|
2006-10-04 09:17:45 -03:00
|
|
|
if (n / bits_per_char < p - start) {
|
2003-02-02 13:33:53 -04:00
|
|
|
PyErr_SetString(PyExc_ValueError,
|
|
|
|
"long string too large to convert");
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-01-25 08:18:43 -04:00
|
|
|
n = n / PyLong_SHIFT;
|
2003-02-02 03:51:32 -04:00
|
|
|
z = _PyLong_New(n);
|
|
|
|
if (z == NULL)
|
|
|
|
return NULL;
|
|
|
|
/* Read string from right, and fill in long from left; i.e.,
|
|
|
|
* from least to most significant in both.
|
|
|
|
*/
|
|
|
|
accum = 0;
|
|
|
|
bits_in_accum = 0;
|
|
|
|
pdigit = z->ob_digit;
|
|
|
|
while (--p >= start) {
|
2008-03-28 01:58:51 -03:00
|
|
|
int k = _PyLong_DigitValue[Py_CHARMASK(*p)];
|
2003-05-05 17:39:43 -03:00
|
|
|
assert(k >= 0 && k < base);
|
2009-01-24 11:27:44 -04:00
|
|
|
accum |= (twodigits)k << bits_in_accum;
|
2003-02-02 03:51:32 -04:00
|
|
|
bits_in_accum += bits_per_char;
|
2008-01-25 08:18:43 -04:00
|
|
|
if (bits_in_accum >= PyLong_SHIFT) {
|
|
|
|
*pdigit++ = (digit)(accum & PyLong_MASK);
|
2009-01-24 11:27:44 -04:00
|
|
|
assert(pdigit - z->ob_digit <= n);
|
2008-01-25 08:18:43 -04:00
|
|
|
accum >>= PyLong_SHIFT;
|
|
|
|
bits_in_accum -= PyLong_SHIFT;
|
|
|
|
assert(bits_in_accum < PyLong_SHIFT);
|
2003-02-02 03:51:32 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (bits_in_accum) {
|
2008-01-25 08:18:43 -04:00
|
|
|
assert(bits_in_accum <= PyLong_SHIFT);
|
2003-02-02 03:51:32 -04:00
|
|
|
*pdigit++ = (digit)accum;
|
2009-01-24 11:27:44 -04:00
|
|
|
assert(pdigit - z->ob_digit <= n);
|
2003-02-02 03:51:32 -04:00
|
|
|
}
|
|
|
|
while (pdigit - z->ob_digit < n)
|
|
|
|
*pdigit++ = 0;
|
|
|
|
return long_normalize(z);
|
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
PyLong_FromString(char *str, char **pend, int base)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
|
|
|
int sign = 1;
|
2000-04-05 17:11:21 -03:00
|
|
|
char *start, *orig_str = str;
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *z;
|
Fix int() and long() to repr() their argument when formatting the exception,
to avoid confusing situations like:
>>> int("")
ValueError: invalid literal for int():
>>> int("2\n\n2")
ValueError: invalid literal for int(): 2
2
Also report the base used, to avoid:
ValueError: invalid literal for int(): 2
They now report:
>>> int("")
ValueError: invalid literal for int() with base 10: ''
>>> int("2\n\n2")
ValueError: invalid literal for int() with base 10: '2\n\n2'
>>> int("2", 2)
ValueError: invalid literal for int() with base 2: '2'
(Reporting the base could be avoided when base is 10, which is the default,
but hrm.) Another effect of these changes is that the errormessage can be
longer; before, it was cut off at about 250 characters. Now, it can be up to
four times as long, as the unrepr'ed string is cut off at 200 characters,
instead.
No tests were added or changed, since testing for exact errormsgs is (pardon
the pun) somewhat errorprone, and I consider not testing the exact text
preferable. The actually changed code is tested frequent enough in the
test_builtin test as it is (120 runs for each of ints and longs.)
2006-04-11 20:50:33 -03:00
|
|
|
PyObject *strobj, *strrepr;
|
|
|
|
Py_ssize_t slen;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
1996-12-05 17:57:21 -04:00
|
|
|
if ((base != 0 && base < 2) || base > 36) {
|
1997-05-02 00:12:38 -03:00
|
|
|
PyErr_SetString(PyExc_ValueError,
|
2000-10-24 16:57:45 -03:00
|
|
|
"long() arg 2 must be >= 2 and <= 36");
|
1994-08-29 09:47:19 -03:00
|
|
|
return NULL;
|
|
|
|
}
|
1995-02-10 13:00:37 -04:00
|
|
|
while (*str != '\0' && isspace(Py_CHARMASK(*str)))
|
1994-08-29 09:47:19 -03:00
|
|
|
str++;
|
1991-05-05 17:09:44 -03:00
|
|
|
if (*str == '+')
|
|
|
|
++str;
|
|
|
|
else if (*str == '-') {
|
|
|
|
++str;
|
|
|
|
sign = -1;
|
|
|
|
}
|
1995-02-10 13:00:37 -04:00
|
|
|
while (*str != '\0' && isspace(Py_CHARMASK(*str)))
|
1994-08-29 09:47:19 -03:00
|
|
|
str++;
|
1991-05-05 17:09:44 -03:00
|
|
|
if (base == 0) {
|
2008-03-17 14:32:20 -03:00
|
|
|
/* No base given. Deduce the base from the contents
|
|
|
|
of the string */
|
1991-05-05 17:09:44 -03:00
|
|
|
if (str[0] != '0')
|
|
|
|
base = 10;
|
|
|
|
else if (str[1] == 'x' || str[1] == 'X')
|
|
|
|
base = 16;
|
2008-03-17 14:32:20 -03:00
|
|
|
else if (str[1] == 'o' || str[1] == 'O')
|
|
|
|
base = 8;
|
|
|
|
else if (str[1] == 'b' || str[1] == 'B')
|
|
|
|
base = 2;
|
1991-05-05 17:09:44 -03:00
|
|
|
else
|
2008-03-17 14:32:20 -03:00
|
|
|
/* "old" (C-style) octal literal, still valid in
|
|
|
|
2.x, although illegal in 3.x */
|
1991-05-05 17:09:44 -03:00
|
|
|
base = 8;
|
|
|
|
}
|
2008-03-17 14:32:20 -03:00
|
|
|
/* Whether or not we were deducing the base, skip leading chars
|
|
|
|
as needed */
|
|
|
|
if (str[0] == '0' &&
|
|
|
|
((base == 16 && (str[1] == 'x' || str[1] == 'X')) ||
|
|
|
|
(base == 8 && (str[1] == 'o' || str[1] == 'O')) ||
|
|
|
|
(base == 2 && (str[1] == 'b' || str[1] == 'B'))))
|
1991-05-05 17:09:44 -03:00
|
|
|
str += 2;
|
2006-05-24 18:10:40 -03:00
|
|
|
|
1998-06-22 00:54:46 -03:00
|
|
|
start = str;
|
2003-02-02 03:51:32 -04:00
|
|
|
if ((base & (base - 1)) == 0)
|
|
|
|
z = long_from_binary_base(&str, base);
|
|
|
|
else {
|
2006-05-24 18:10:40 -03:00
|
|
|
/***
|
|
|
|
Binary bases can be converted in time linear in the number of digits, because
|
|
|
|
Python's representation base is binary. Other bases (including decimal!) use
|
|
|
|
the simple quadratic-time algorithm below, complicated by some speed tricks.
|
|
|
|
|
|
|
|
First some math: the largest integer that can be expressed in N base-B digits
|
|
|
|
is B**N-1. Consequently, if we have an N-digit input in base B, the worst-
|
|
|
|
case number of Python digits needed to hold it is the smallest integer n s.t.
|
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
PyLong_BASE**n-1 >= B**N-1 [or, adding 1 to both sides]
|
|
|
|
PyLong_BASE**n >= B**N [taking logs to base PyLong_BASE]
|
|
|
|
n >= log(B**N)/log(PyLong_BASE) = N * log(B)/log(PyLong_BASE)
|
2006-05-24 18:10:40 -03:00
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
The static array log_base_PyLong_BASE[base] == log(base)/log(PyLong_BASE) so we can compute
|
2006-05-24 18:10:40 -03:00
|
|
|
this quickly. A Python long with that much space is reserved near the start,
|
|
|
|
and the result is computed into it.
|
|
|
|
|
|
|
|
The input string is actually treated as being in base base**i (i.e., i digits
|
|
|
|
are processed at a time), where two more static arrays hold:
|
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
convwidth_base[base] = the largest integer i such that base**i <= PyLong_BASE
|
2006-05-24 18:10:40 -03:00
|
|
|
convmultmax_base[base] = base ** convwidth_base[base]
|
|
|
|
|
|
|
|
The first of these is the largest i such that i consecutive input digits
|
|
|
|
must fit in a single Python digit. The second is effectively the input
|
|
|
|
base we're really using.
|
|
|
|
|
|
|
|
Viewing the input as a sequence <c0, c1, ..., c_n-1> of digits in base
|
|
|
|
convmultmax_base[base], the result is "simply"
|
|
|
|
|
|
|
|
(((c0*B + c1)*B + c2)*B + c3)*B + ... ))) + c_n-1
|
|
|
|
|
|
|
|
where B = convmultmax_base[base].
|
2006-05-30 12:53:34 -03:00
|
|
|
|
|
|
|
Error analysis: as above, the number of Python digits `n` needed is worst-
|
|
|
|
case
|
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
n >= N * log(B)/log(PyLong_BASE)
|
2006-05-30 12:53:34 -03:00
|
|
|
|
|
|
|
where `N` is the number of input digits in base `B`. This is computed via
|
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
size_z = (Py_ssize_t)((scan - str) * log_base_PyLong_BASE[base]) + 1;
|
2006-05-30 12:53:34 -03:00
|
|
|
|
|
|
|
below. Two numeric concerns are how much space this can waste, and whether
|
2008-01-25 08:18:43 -04:00
|
|
|
the computed result can be too small. To be concrete, assume PyLong_BASE = 2**15,
|
2006-05-30 12:53:34 -03:00
|
|
|
which is the default (and it's unlikely anyone changes that).
|
|
|
|
|
|
|
|
Waste isn't a problem: provided the first input digit isn't 0, the difference
|
|
|
|
between the worst-case input with N digits and the smallest input with N
|
2008-01-25 08:18:43 -04:00
|
|
|
digits is about a factor of B, but B is small compared to PyLong_BASE so at most
|
2006-05-30 12:53:34 -03:00
|
|
|
one allocated Python digit can remain unused on that count. If
|
2008-01-25 08:18:43 -04:00
|
|
|
N*log(B)/log(PyLong_BASE) is mathematically an exact integer, then truncating that
|
2006-05-30 12:53:34 -03:00
|
|
|
and adding 1 returns a result 1 larger than necessary. However, that can't
|
|
|
|
happen: whenever B is a power of 2, long_from_binary_base() is called
|
|
|
|
instead, and it's impossible for B**i to be an integer power of 2**15 when
|
2008-01-25 08:18:43 -04:00
|
|
|
B is not a power of 2 (i.e., it's impossible for N*log(B)/log(PyLong_BASE) to be
|
2006-05-30 12:53:34 -03:00
|
|
|
an exact integer when B is not a power of 2, since B**i has a prime factor
|
|
|
|
other than 2 in that case, but (2**15)**j's only prime factor is 2).
|
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
The computed result can be too small if the true value of N*log(B)/log(PyLong_BASE)
|
2006-05-30 12:53:34 -03:00
|
|
|
is a little bit larger than an exact integer, but due to roundoff errors (in
|
2008-01-25 08:18:43 -04:00
|
|
|
computing log(B), log(PyLong_BASE), their quotient, and/or multiplying that by N)
|
2006-05-30 12:53:34 -03:00
|
|
|
yields a numeric result a little less than that integer. Unfortunately, "how
|
|
|
|
close can a transcendental function get to an integer over some range?"
|
|
|
|
questions are generally theoretically intractable. Computer analysis via
|
2008-01-25 08:18:43 -04:00
|
|
|
continued fractions is practical: expand log(B)/log(PyLong_BASE) via continued
|
2006-05-30 12:53:34 -03:00
|
|
|
fractions, giving a sequence i/j of "the best" rational approximations. Then
|
2008-01-25 08:18:43 -04:00
|
|
|
j*log(B)/log(PyLong_BASE) is approximately equal to (the integer) i. This shows that
|
2006-05-30 12:53:34 -03:00
|
|
|
we can get very close to being in trouble, but very rarely. For example,
|
|
|
|
76573 is a denominator in one of the continued-fraction approximations to
|
|
|
|
log(10)/log(2**15), and indeed:
|
|
|
|
|
|
|
|
>>> log(10)/log(2**15)*76573
|
|
|
|
16958.000000654003
|
|
|
|
|
|
|
|
is very close to an integer. If we were working with IEEE single-precision,
|
|
|
|
rounding errors could kill us. Finding worst cases in IEEE double-precision
|
|
|
|
requires better-than-double-precision log() functions, and Tim didn't bother.
|
|
|
|
Instead the code checks to see whether the allocated space is enough as each
|
|
|
|
new Python digit is added, and copies the whole thing to a larger long if not.
|
|
|
|
This should happen extremely rarely, and in fact I don't have a test case
|
|
|
|
that triggers it(!). Instead the code was tested by artificially allocating
|
|
|
|
just 1 digit at the start, so that the copying code was exercised for every
|
|
|
|
digit beyond the first.
|
2006-05-24 18:10:40 -03:00
|
|
|
***/
|
|
|
|
register twodigits c; /* current input character */
|
|
|
|
Py_ssize_t size_z;
|
|
|
|
int i;
|
|
|
|
int convwidth;
|
|
|
|
twodigits convmultmax, convmult;
|
|
|
|
digit *pz, *pzstop;
|
|
|
|
char* scan;
|
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
static double log_base_PyLong_BASE[37] = {0.0e0,};
|
2006-05-24 18:10:40 -03:00
|
|
|
static int convwidth_base[37] = {0,};
|
|
|
|
static twodigits convmultmax_base[37] = {0,};
|
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
if (log_base_PyLong_BASE[base] == 0.0) {
|
2006-05-24 18:10:40 -03:00
|
|
|
twodigits convmax = base;
|
|
|
|
int i = 1;
|
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
log_base_PyLong_BASE[base] = log((double)base) /
|
|
|
|
log((double)PyLong_BASE);
|
2006-05-24 18:10:40 -03:00
|
|
|
for (;;) {
|
|
|
|
twodigits next = convmax * base;
|
2008-01-25 08:18:43 -04:00
|
|
|
if (next > PyLong_BASE)
|
2006-05-24 18:10:40 -03:00
|
|
|
break;
|
|
|
|
convmax = next;
|
|
|
|
++i;
|
|
|
|
}
|
|
|
|
convmultmax_base[base] = convmax;
|
|
|
|
assert(i > 0);
|
|
|
|
convwidth_base[base] = i;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Find length of the string of numeric characters. */
|
|
|
|
scan = str;
|
2008-03-28 01:58:51 -03:00
|
|
|
while (_PyLong_DigitValue[Py_CHARMASK(*scan)] < base)
|
2006-05-24 18:10:40 -03:00
|
|
|
++scan;
|
|
|
|
|
|
|
|
/* Create a long object that can contain the largest possible
|
|
|
|
* integer with this base and length. Note that there's no
|
|
|
|
* need to initialize z->ob_digit -- no slot is read up before
|
|
|
|
* being stored into.
|
|
|
|
*/
|
2008-01-25 08:18:43 -04:00
|
|
|
size_z = (Py_ssize_t)((scan - str) * log_base_PyLong_BASE[base]) + 1;
|
2006-05-30 12:53:34 -03:00
|
|
|
/* Uncomment next line to test exceedingly rare copy code */
|
|
|
|
/* size_z = 1; */
|
2006-05-24 18:10:40 -03:00
|
|
|
assert(size_z > 0);
|
|
|
|
z = _PyLong_New(size_z);
|
|
|
|
if (z == NULL)
|
|
|
|
return NULL;
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(z) = 0;
|
2006-05-24 18:10:40 -03:00
|
|
|
|
|
|
|
/* `convwidth` consecutive input digits are treated as a single
|
|
|
|
* digit in base `convmultmax`.
|
|
|
|
*/
|
|
|
|
convwidth = convwidth_base[base];
|
|
|
|
convmultmax = convmultmax_base[base];
|
|
|
|
|
|
|
|
/* Work ;-) */
|
|
|
|
while (str < scan) {
|
|
|
|
/* grab up to convwidth digits from the input string */
|
2008-03-28 01:58:51 -03:00
|
|
|
c = (digit)_PyLong_DigitValue[Py_CHARMASK(*str++)];
|
2006-05-24 18:10:40 -03:00
|
|
|
for (i = 1; i < convwidth && str != scan; ++i, ++str) {
|
|
|
|
c = (twodigits)(c * base +
|
2008-03-28 01:58:51 -03:00
|
|
|
_PyLong_DigitValue[Py_CHARMASK(*str)]);
|
2008-01-25 08:18:43 -04:00
|
|
|
assert(c < PyLong_BASE);
|
2006-05-24 18:10:40 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
convmult = convmultmax;
|
|
|
|
/* Calculate the shift only if we couldn't get
|
|
|
|
* convwidth digits.
|
|
|
|
*/
|
|
|
|
if (i != convwidth) {
|
|
|
|
convmult = base;
|
|
|
|
for ( ; i > 1; --i)
|
|
|
|
convmult *= base;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Multiply z by convmult, and add c. */
|
|
|
|
pz = z->ob_digit;
|
2007-12-18 22:37:44 -04:00
|
|
|
pzstop = pz + Py_SIZE(z);
|
2006-05-24 18:10:40 -03:00
|
|
|
for (; pz < pzstop; ++pz) {
|
|
|
|
c += (twodigits)*pz * convmult;
|
2008-01-25 08:18:43 -04:00
|
|
|
*pz = (digit)(c & PyLong_MASK);
|
|
|
|
c >>= PyLong_SHIFT;
|
2006-05-24 18:10:40 -03:00
|
|
|
}
|
|
|
|
/* carry off the current end? */
|
|
|
|
if (c) {
|
2008-01-25 08:18:43 -04:00
|
|
|
assert(c < PyLong_BASE);
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(z) < size_z) {
|
2006-05-30 12:53:34 -03:00
|
|
|
*pz = (digit)c;
|
2007-12-18 22:37:44 -04:00
|
|
|
++Py_SIZE(z);
|
2006-05-30 12:53:34 -03:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
PyLongObject *tmp;
|
|
|
|
/* Extremely rare. Get more space. */
|
2007-12-18 22:37:44 -04:00
|
|
|
assert(Py_SIZE(z) == size_z);
|
2006-05-30 12:53:34 -03:00
|
|
|
tmp = _PyLong_New(size_z + 1);
|
|
|
|
if (tmp == NULL) {
|
|
|
|
Py_DECREF(z);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
memcpy(tmp->ob_digit,
|
|
|
|
z->ob_digit,
|
|
|
|
sizeof(digit) * size_z);
|
|
|
|
Py_DECREF(z);
|
|
|
|
z = tmp;
|
|
|
|
z->ob_digit[size_z] = (digit)c;
|
|
|
|
++size_z;
|
|
|
|
}
|
2006-05-24 18:10:40 -03:00
|
|
|
}
|
2003-02-02 03:51:32 -04:00
|
|
|
}
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
1998-08-04 12:04:06 -03:00
|
|
|
if (z == NULL)
|
|
|
|
return NULL;
|
2000-04-05 17:11:21 -03:00
|
|
|
if (str == start)
|
|
|
|
goto onError;
|
2006-05-24 18:10:40 -03:00
|
|
|
if (sign < 0)
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(z) = -(Py_SIZE(z));
|
2000-04-05 17:11:21 -03:00
|
|
|
if (*str == 'L' || *str == 'l')
|
|
|
|
str++;
|
|
|
|
while (*str && isspace(Py_CHARMASK(*str)))
|
|
|
|
str++;
|
|
|
|
if (*str != '\0')
|
|
|
|
goto onError;
|
1994-08-29 09:47:19 -03:00
|
|
|
if (pend)
|
|
|
|
*pend = str;
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *) z;
|
2000-04-05 17:11:21 -03:00
|
|
|
|
|
|
|
onError:
|
|
|
|
Py_XDECREF(z);
|
Fix int() and long() to repr() their argument when formatting the exception,
to avoid confusing situations like:
>>> int("")
ValueError: invalid literal for int():
>>> int("2\n\n2")
ValueError: invalid literal for int(): 2
2
Also report the base used, to avoid:
ValueError: invalid literal for int(): 2
They now report:
>>> int("")
ValueError: invalid literal for int() with base 10: ''
>>> int("2\n\n2")
ValueError: invalid literal for int() with base 10: '2\n\n2'
>>> int("2", 2)
ValueError: invalid literal for int() with base 2: '2'
(Reporting the base could be avoided when base is 10, which is the default,
but hrm.) Another effect of these changes is that the errormessage can be
longer; before, it was cut off at about 250 characters. Now, it can be up to
four times as long, as the unrepr'ed string is cut off at 200 characters,
instead.
No tests were added or changed, since testing for exact errormsgs is (pardon
the pun) somewhat errorprone, and I consider not testing the exact text
preferable. The actually changed code is tested frequent enough in the
test_builtin test as it is (120 runs for each of ints and longs.)
2006-04-11 20:50:33 -03:00
|
|
|
slen = strlen(orig_str) < 200 ? strlen(orig_str) : 200;
|
2008-06-09 01:58:54 -03:00
|
|
|
strobj = PyString_FromStringAndSize(orig_str, slen);
|
Fix int() and long() to repr() their argument when formatting the exception,
to avoid confusing situations like:
>>> int("")
ValueError: invalid literal for int():
>>> int("2\n\n2")
ValueError: invalid literal for int(): 2
2
Also report the base used, to avoid:
ValueError: invalid literal for int(): 2
They now report:
>>> int("")
ValueError: invalid literal for int() with base 10: ''
>>> int("2\n\n2")
ValueError: invalid literal for int() with base 10: '2\n\n2'
>>> int("2", 2)
ValueError: invalid literal for int() with base 2: '2'
(Reporting the base could be avoided when base is 10, which is the default,
but hrm.) Another effect of these changes is that the errormessage can be
longer; before, it was cut off at about 250 characters. Now, it can be up to
four times as long, as the unrepr'ed string is cut off at 200 characters,
instead.
No tests were added or changed, since testing for exact errormsgs is (pardon
the pun) somewhat errorprone, and I consider not testing the exact text
preferable. The actually changed code is tested frequent enough in the
test_builtin test as it is (120 runs for each of ints and longs.)
2006-04-11 20:50:33 -03:00
|
|
|
if (strobj == NULL)
|
|
|
|
return NULL;
|
|
|
|
strrepr = PyObject_Repr(strobj);
|
|
|
|
Py_DECREF(strobj);
|
|
|
|
if (strrepr == NULL)
|
|
|
|
return NULL;
|
|
|
|
PyErr_Format(PyExc_ValueError,
|
|
|
|
"invalid literal for long() with base %d: %s",
|
2008-06-09 01:58:54 -03:00
|
|
|
base, PyString_AS_STRING(strrepr));
|
Fix int() and long() to repr() their argument when formatting the exception,
to avoid confusing situations like:
>>> int("")
ValueError: invalid literal for int():
>>> int("2\n\n2")
ValueError: invalid literal for int(): 2
2
Also report the base used, to avoid:
ValueError: invalid literal for int(): 2
They now report:
>>> int("")
ValueError: invalid literal for int() with base 10: ''
>>> int("2\n\n2")
ValueError: invalid literal for int() with base 10: '2\n\n2'
>>> int("2", 2)
ValueError: invalid literal for int() with base 2: '2'
(Reporting the base could be avoided when base is 10, which is the default,
but hrm.) Another effect of these changes is that the errormessage can be
longer; before, it was cut off at about 250 characters. Now, it can be up to
four times as long, as the unrepr'ed string is cut off at 200 characters,
instead.
No tests were added or changed, since testing for exact errormsgs is (pardon
the pun) somewhat errorprone, and I consider not testing the exact text
preferable. The actually changed code is tested frequent enough in the
test_builtin test as it is (120 runs for each of ints and longs.)
2006-04-11 20:50:33 -03:00
|
|
|
Py_DECREF(strrepr);
|
2000-04-05 17:11:21 -03:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2001-08-17 15:39:25 -03:00
|
|
|
#ifdef Py_USING_UNICODE
|
2000-04-05 17:11:21 -03:00
|
|
|
PyObject *
|
2006-02-15 13:27:45 -04:00
|
|
|
PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
|
2000-04-05 17:11:21 -03:00
|
|
|
{
|
2002-11-06 12:15:14 -04:00
|
|
|
PyObject *result;
|
2006-04-11 03:54:30 -03:00
|
|
|
char *buffer = (char *)PyMem_MALLOC(length+1);
|
2000-04-05 17:11:21 -03:00
|
|
|
|
2002-11-06 12:15:14 -04:00
|
|
|
if (buffer == NULL)
|
2000-04-05 17:11:21 -03:00
|
|
|
return NULL;
|
|
|
|
|
2002-11-06 12:15:14 -04:00
|
|
|
if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
|
|
|
|
PyMem_FREE(buffer);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
result = PyLong_FromString(buffer, NULL, base);
|
|
|
|
PyMem_FREE(buffer);
|
|
|
|
return result;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
2001-08-17 15:39:25 -03:00
|
|
|
#endif
|
1991-05-05 17:09:44 -03:00
|
|
|
|
2000-07-07 12:53:28 -03:00
|
|
|
/* forward */
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyLongObject *x_divrem
|
2000-07-07 12:53:28 -03:00
|
|
|
(PyLongObject *, PyLongObject *, PyLongObject **);
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
static PyObject *long_long(PyObject *v);
|
1991-05-05 17:09:44 -03:00
|
|
|
|
|
|
|
/* Long division with remainder, top-level routine */
|
|
|
|
|
1992-01-19 12:31:05 -04:00
|
|
|
static int
|
2000-07-07 12:53:28 -03:00
|
|
|
long_divrem(PyLongObject *a, PyLongObject *b,
|
|
|
|
PyLongObject **pdiv, PyLongObject **prem)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *z;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
if (size_b == 0) {
|
1998-08-11 12:04:47 -03:00
|
|
|
PyErr_SetString(PyExc_ZeroDivisionError,
|
2000-10-24 16:57:45 -03:00
|
|
|
"long division or modulo by zero");
|
1992-01-19 12:31:05 -04:00
|
|
|
return -1;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
if (size_a < size_b ||
|
1996-12-05 17:57:21 -04:00
|
|
|
(size_a == size_b &&
|
|
|
|
a->ob_digit[size_a-1] < b->ob_digit[size_b-1])) {
|
1991-05-05 17:09:44 -03:00
|
|
|
/* |a| < |b|. */
|
1997-05-02 00:12:38 -03:00
|
|
|
*pdiv = _PyLong_New(0);
|
2007-04-11 14:16:24 -03:00
|
|
|
if (*pdiv == NULL)
|
|
|
|
return -1;
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_INCREF(a);
|
|
|
|
*prem = (PyLongObject *) a;
|
1992-01-19 12:31:05 -04:00
|
|
|
return 0;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
if (size_b == 1) {
|
|
|
|
digit rem = 0;
|
|
|
|
z = divrem1(a, b->ob_digit[0], &rem);
|
1992-01-19 12:31:05 -04:00
|
|
|
if (z == NULL)
|
|
|
|
return -1;
|
1997-05-02 00:12:38 -03:00
|
|
|
*prem = (PyLongObject *) PyLong_FromLong((long)rem);
|
2007-04-11 14:16:24 -03:00
|
|
|
if (*prem == NULL) {
|
|
|
|
Py_DECREF(z);
|
|
|
|
return -1;
|
|
|
|
}
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
1992-01-19 12:31:05 -04:00
|
|
|
else {
|
1991-05-05 17:09:44 -03:00
|
|
|
z = x_divrem(a, b, prem);
|
1992-01-19 12:31:05 -04:00
|
|
|
if (z == NULL)
|
|
|
|
return -1;
|
|
|
|
}
|
1991-05-05 17:09:44 -03:00
|
|
|
/* Set the signs.
|
|
|
|
The quotient z has the sign of a*b;
|
|
|
|
the remainder r has the sign of a,
|
|
|
|
so a = b*z + r. */
|
1992-01-19 12:31:05 -04:00
|
|
|
if ((a->ob_size < 0) != (b->ob_size < 0))
|
|
|
|
z->ob_size = -(z->ob_size);
|
|
|
|
if (a->ob_size < 0 && (*prem)->ob_size != 0)
|
|
|
|
(*prem)->ob_size = -((*prem)->ob_size);
|
|
|
|
*pdiv = z;
|
|
|
|
return 0;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
2009-03-23 15:25:13 -03:00
|
|
|
/* Unsigned long division with remainder -- the algorithm. The arguments v1
|
|
|
|
and w1 should satisfy 2 <= ABS(Py_SIZE(w1)) <= ABS(Py_SIZE(v1)). */
|
1991-05-05 17:09:44 -03:00
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyLongObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2009-03-23 15:25:13 -03:00
|
|
|
PyLongObject *v, *w, *a;
|
|
|
|
Py_ssize_t i, k, size_v, size_w;
|
|
|
|
int d;
|
|
|
|
digit wm1, wm2, carry, q, r, vtop, *v0, *vk, *w0, *ak;
|
|
|
|
twodigits vv;
|
|
|
|
sdigit zhi;
|
|
|
|
stwodigits z;
|
|
|
|
|
|
|
|
/* We follow Knuth [The Art of Computer Programming, Vol. 2 (3rd
|
|
|
|
edn.), section 4.3.1, Algorithm D], except that we don't explicitly
|
|
|
|
handle the special case when the initial estimate q for a quotient
|
|
|
|
digit is >= PyLong_BASE: the max value for q is PyLong_BASE+1, and
|
|
|
|
that won't overflow a digit. */
|
|
|
|
|
|
|
|
/* allocate space; w will also be used to hold the final remainder */
|
|
|
|
size_v = ABS(Py_SIZE(v1));
|
|
|
|
size_w = ABS(Py_SIZE(w1));
|
|
|
|
assert(size_v >= size_w && size_w >= 2); /* Assert checks by div() */
|
|
|
|
v = _PyLong_New(size_v+1);
|
|
|
|
if (v == NULL) {
|
|
|
|
*prem = NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
w = _PyLong_New(size_w);
|
|
|
|
if (w == NULL) {
|
|
|
|
Py_DECREF(v);
|
|
|
|
*prem = NULL;
|
1991-05-05 17:09:44 -03:00
|
|
|
return NULL;
|
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2009-03-23 15:25:13 -03:00
|
|
|
/* normalize: shift w1 left so that its top digit is >= PyLong_BASE/2.
|
|
|
|
shift v1 left by the same amount. Results go into w and v. */
|
|
|
|
d = PyLong_SHIFT - bits_in_digit(w1->ob_digit[size_w-1]);
|
|
|
|
carry = v_lshift(w->ob_digit, w1->ob_digit, size_w, d);
|
|
|
|
assert(carry == 0);
|
|
|
|
carry = v_lshift(v->ob_digit, v1->ob_digit, size_v, d);
|
|
|
|
if (carry != 0 || v->ob_digit[size_v-1] >= w->ob_digit[size_w-1]) {
|
|
|
|
v->ob_digit[size_v] = carry;
|
|
|
|
size_v++;
|
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2009-03-23 15:25:13 -03:00
|
|
|
/* Now v->ob_digit[size_v-1] < w->ob_digit[size_w-1], so quotient has
|
|
|
|
at most (and usually exactly) k = size_v - size_w digits. */
|
2006-05-10 03:57:58 -03:00
|
|
|
k = size_v - size_w;
|
2009-03-23 15:25:13 -03:00
|
|
|
assert(k >= 0);
|
|
|
|
a = _PyLong_New(k);
|
|
|
|
if (a == NULL) {
|
|
|
|
Py_DECREF(w);
|
|
|
|
Py_DECREF(v);
|
|
|
|
*prem = NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
v0 = v->ob_digit;
|
|
|
|
w0 = w->ob_digit;
|
|
|
|
wm1 = w0[size_w-1];
|
|
|
|
wm2 = w0[size_w-2];
|
|
|
|
for (vk = v0+k, ak = a->ob_digit + k; vk-- > v0;) {
|
|
|
|
/* inner loop: divide vk[0:size_w+1] by w0[0:size_w], giving
|
|
|
|
single-digit quotient q, remainder in vk[0:size_w]. */
|
2002-08-11 23:31:19 -03:00
|
|
|
|
1994-08-29 09:47:19 -03:00
|
|
|
SIGCHECK({
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_DECREF(a);
|
2009-03-23 15:25:13 -03:00
|
|
|
Py_DECREF(w);
|
|
|
|
Py_DECREF(v);
|
|
|
|
*prem = NULL;
|
|
|
|
return NULL;
|
1991-05-14 09:06:49 -03:00
|
|
|
})
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2009-03-23 15:25:13 -03:00
|
|
|
/* estimate quotient digit q; may overestimate by 1 (rare) */
|
|
|
|
vtop = vk[size_w];
|
|
|
|
assert(vtop <= wm1);
|
|
|
|
vv = ((twodigits)vtop << PyLong_SHIFT) | vk[size_w-1];
|
|
|
|
q = (digit)(vv / wm1);
|
|
|
|
r = (digit)(vv - (twodigits)wm1 * q); /* r = vv % wm1 */
|
|
|
|
while ((twodigits)wm2 * q > (((twodigits)r << PyLong_SHIFT)
|
|
|
|
| vk[size_w-2])) {
|
|
|
|
--q;
|
|
|
|
r += wm1;
|
|
|
|
if (r >= PyLong_BASE)
|
|
|
|
break;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
2009-03-23 15:25:13 -03:00
|
|
|
assert(q <= PyLong_BASE);
|
|
|
|
|
|
|
|
/* subtract q*w0[0:size_w] from vk[0:size_w+1] */
|
|
|
|
zhi = 0;
|
|
|
|
for (i = 0; i < size_w; ++i) {
|
|
|
|
/* invariants: -PyLong_BASE <= -q <= zhi <= 0;
|
|
|
|
-PyLong_BASE * q <= z < PyLong_BASE */
|
|
|
|
z = (sdigit)vk[i] + zhi -
|
|
|
|
(stwodigits)q * (stwodigits)w0[i];
|
|
|
|
vk[i] = (digit)z & PyLong_MASK;
|
|
|
|
zhi = (sdigit)Py_ARITHMETIC_RIGHT_SHIFT(stwodigits,
|
|
|
|
z, PyLong_SHIFT);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2009-03-23 15:25:13 -03:00
|
|
|
/* add w back if q was too large (this branch taken rarely) */
|
|
|
|
assert((sdigit)vtop + zhi == -1 || (sdigit)vtop + zhi == 0);
|
|
|
|
if ((sdigit)vtop + zhi < 0) {
|
1991-05-05 17:09:44 -03:00
|
|
|
carry = 0;
|
2009-03-23 15:25:13 -03:00
|
|
|
for (i = 0; i < size_w; ++i) {
|
|
|
|
carry += vk[i] + w0[i];
|
|
|
|
vk[i] = carry & PyLong_MASK;
|
|
|
|
carry >>= PyLong_SHIFT;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
2009-03-23 15:25:13 -03:00
|
|
|
--q;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2009-03-23 15:25:13 -03:00
|
|
|
/* store quotient digit */
|
|
|
|
assert(q < PyLong_BASE);
|
|
|
|
*--ak = q;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
2009-03-23 15:25:13 -03:00
|
|
|
|
|
|
|
/* unshift remainder; we reuse w to store the result */
|
|
|
|
carry = v_rshift(w0, v0, size_w, d);
|
|
|
|
assert(carry==0);
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_DECREF(v);
|
2009-03-23 15:25:13 -03:00
|
|
|
|
|
|
|
*prem = long_normalize(w);
|
|
|
|
return long_normalize(a);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Methods */
|
|
|
|
|
|
|
|
static void
|
2000-07-07 12:53:28 -03:00
|
|
|
long_dealloc(PyObject *v)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_TYPE(v)->tp_free(v);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
long_repr(PyObject *v)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2008-02-09 21:36:53 -04:00
|
|
|
return _PyLong_Format(v, 10, 1, 0);
|
1999-12-23 11:41:28 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
long_str(PyObject *v)
|
1999-12-23 11:41:28 -04:00
|
|
|
{
|
2008-02-09 21:36:53 -04:00
|
|
|
return _PyLong_Format(v, 10, 0, 0);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2000-07-07 12:53:28 -03:00
|
|
|
long_compare(PyLongObject *a, PyLongObject *b)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t sign;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(a) != Py_SIZE(b)) {
|
|
|
|
if (ABS(Py_SIZE(a)) == 0 && ABS(Py_SIZE(b)) == 0)
|
1991-11-19 16:26:46 -04:00
|
|
|
sign = 0;
|
|
|
|
else
|
2007-12-18 22:37:44 -04:00
|
|
|
sign = Py_SIZE(a) - Py_SIZE(b);
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
1991-05-05 17:09:44 -03:00
|
|
|
else {
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_ssize_t i = ABS(Py_SIZE(a));
|
1991-05-05 17:09:44 -03:00
|
|
|
while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
|
|
|
|
;
|
|
|
|
if (i < 0)
|
|
|
|
sign = 0;
|
1993-01-21 12:07:51 -04:00
|
|
|
else {
|
2009-02-15 11:48:39 -04:00
|
|
|
sign = (sdigit)a->ob_digit[i] - (sdigit)b->ob_digit[i];
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(a) < 0)
|
1993-01-21 12:07:51 -04:00
|
|
|
sign = -sign;
|
|
|
|
}
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
1991-11-19 16:26:46 -04:00
|
|
|
return sign < 0 ? -1 : sign > 0 ? 1 : 0;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
1993-03-29 06:43:31 -04:00
|
|
|
static long
|
2000-07-07 12:53:28 -03:00
|
|
|
long_hash(PyLongObject *v)
|
1993-03-29 06:43:31 -04:00
|
|
|
{
|
2009-01-26 17:36:30 -04:00
|
|
|
unsigned long x;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i;
|
|
|
|
int sign;
|
1993-03-29 06:43:31 -04:00
|
|
|
|
|
|
|
/* This is designed so that Python ints and longs with the
|
|
|
|
same value hash to the same value, otherwise comparisons
|
|
|
|
of mapping keys will turn out weird */
|
|
|
|
i = v->ob_size;
|
|
|
|
sign = 1;
|
|
|
|
x = 0;
|
|
|
|
if (i < 0) {
|
|
|
|
sign = -1;
|
|
|
|
i = -(i);
|
|
|
|
}
|
2009-01-26 17:40:08 -04:00
|
|
|
/* The following loop produces a C unsigned long x such that x is
|
|
|
|
congruent to the absolute value of v modulo ULONG_MAX. The
|
|
|
|
resulting x is nonzero if and only if v is. */
|
1993-03-29 06:43:31 -04:00
|
|
|
while (--i >= 0) {
|
2003-02-23 19:11:41 -04:00
|
|
|
/* Force a native long #-bits (32 or 64) circular shift */
|
2009-02-15 06:13:41 -04:00
|
|
|
x = (x >> (8*SIZEOF_LONG-PyLong_SHIFT)) | (x << PyLong_SHIFT);
|
1993-03-29 06:43:31 -04:00
|
|
|
x += v->ob_digit[i];
|
2009-01-26 17:36:30 -04:00
|
|
|
/* If the addition above overflowed we compensate by
|
|
|
|
incrementing. This preserves the value modulo
|
|
|
|
ULONG_MAX. */
|
|
|
|
if (x < v->ob_digit[i])
|
2007-09-19 12:10:06 -03:00
|
|
|
x++;
|
1993-03-29 06:43:31 -04:00
|
|
|
}
|
|
|
|
x = x * sign;
|
2009-02-15 06:13:41 -04:00
|
|
|
if (x == (unsigned long)-1)
|
|
|
|
x = (unsigned long)-2;
|
|
|
|
return (long)x;
|
1993-03-29 06:43:31 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
/* Add the absolute values of two long integers. */
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyLongObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
x_add(PyLongObject *a, PyLongObject *b)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *z;
|
2009-01-24 11:27:44 -04:00
|
|
|
Py_ssize_t i;
|
1991-05-05 17:09:44 -03:00
|
|
|
digit carry = 0;
|
2001-09-11 19:31:33 -03:00
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
/* Ensure a is the larger of the two: */
|
|
|
|
if (size_a < size_b) {
|
1997-05-02 00:12:38 -03:00
|
|
|
{ PyLongObject *temp = a; a = b; b = temp; }
|
2006-02-15 13:27:45 -04:00
|
|
|
{ Py_ssize_t size_temp = size_a;
|
1997-05-02 00:12:38 -03:00
|
|
|
size_a = size_b;
|
|
|
|
size_b = size_temp; }
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
1997-05-02 00:12:38 -03:00
|
|
|
z = _PyLong_New(size_a+1);
|
1991-05-05 17:09:44 -03:00
|
|
|
if (z == NULL)
|
|
|
|
return NULL;
|
|
|
|
for (i = 0; i < size_b; ++i) {
|
|
|
|
carry += a->ob_digit[i] + b->ob_digit[i];
|
2008-01-25 08:18:43 -04:00
|
|
|
z->ob_digit[i] = carry & PyLong_MASK;
|
|
|
|
carry >>= PyLong_SHIFT;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
for (; i < size_a; ++i) {
|
|
|
|
carry += a->ob_digit[i];
|
2008-01-25 08:18:43 -04:00
|
|
|
z->ob_digit[i] = carry & PyLong_MASK;
|
|
|
|
carry >>= PyLong_SHIFT;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
z->ob_digit[i] = carry;
|
|
|
|
return long_normalize(z);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Subtract the absolute values of two integers. */
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyLongObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
x_sub(PyLongObject *a, PyLongObject *b)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_ssize_t size_a = ABS(Py_SIZE(a)), size_b = ABS(Py_SIZE(b));
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *z;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i;
|
1991-05-05 17:09:44 -03:00
|
|
|
int sign = 1;
|
|
|
|
digit borrow = 0;
|
2001-09-11 19:31:33 -03:00
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
/* Ensure a is the larger of the two: */
|
|
|
|
if (size_a < size_b) {
|
|
|
|
sign = -1;
|
1997-05-02 00:12:38 -03:00
|
|
|
{ PyLongObject *temp = a; a = b; b = temp; }
|
2006-02-15 13:27:45 -04:00
|
|
|
{ Py_ssize_t size_temp = size_a;
|
1997-05-02 00:12:38 -03:00
|
|
|
size_a = size_b;
|
|
|
|
size_b = size_temp; }
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
else if (size_a == size_b) {
|
|
|
|
/* Find highest digit where a and b differ: */
|
|
|
|
i = size_a;
|
|
|
|
while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i])
|
|
|
|
;
|
|
|
|
if (i < 0)
|
1997-05-02 00:12:38 -03:00
|
|
|
return _PyLong_New(0);
|
1991-05-05 17:09:44 -03:00
|
|
|
if (a->ob_digit[i] < b->ob_digit[i]) {
|
|
|
|
sign = -1;
|
1997-05-02 00:12:38 -03:00
|
|
|
{ PyLongObject *temp = a; a = b; b = temp; }
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
size_a = size_b = i+1;
|
|
|
|
}
|
1997-05-02 00:12:38 -03:00
|
|
|
z = _PyLong_New(size_a);
|
1991-05-05 17:09:44 -03:00
|
|
|
if (z == NULL)
|
|
|
|
return NULL;
|
|
|
|
for (i = 0; i < size_b; ++i) {
|
|
|
|
/* The following assumes unsigned arithmetic
|
2008-01-25 08:18:43 -04:00
|
|
|
works module 2**N for some N>PyLong_SHIFT. */
|
1994-08-29 09:47:19 -03:00
|
|
|
borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
|
2008-01-25 08:18:43 -04:00
|
|
|
z->ob_digit[i] = borrow & PyLong_MASK;
|
|
|
|
borrow >>= PyLong_SHIFT;
|
1991-05-05 17:09:44 -03:00
|
|
|
borrow &= 1; /* Keep only one sign bit */
|
|
|
|
}
|
|
|
|
for (; i < size_a; ++i) {
|
|
|
|
borrow = a->ob_digit[i] - borrow;
|
2008-01-25 08:18:43 -04:00
|
|
|
z->ob_digit[i] = borrow & PyLong_MASK;
|
|
|
|
borrow >>= PyLong_SHIFT;
|
2000-07-07 23:26:47 -03:00
|
|
|
borrow &= 1; /* Keep only one sign bit */
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
assert(borrow == 0);
|
1991-11-19 16:26:46 -04:00
|
|
|
if (sign < 0)
|
1992-01-14 14:36:43 -04:00
|
|
|
z->ob_size = -(z->ob_size);
|
1991-05-05 17:09:44 -03:00
|
|
|
return long_normalize(z);
|
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2001-01-03 21:46:03 -04:00
|
|
|
long_add(PyLongObject *v, PyLongObject *w)
|
1992-01-14 14:36:43 -04:00
|
|
|
{
|
2001-01-03 21:46:03 -04:00
|
|
|
PyLongObject *a, *b, *z;
|
2001-09-11 19:31:33 -03:00
|
|
|
|
2001-01-03 21:46:03 -04:00
|
|
|
CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
|
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
if (a->ob_size < 0) {
|
|
|
|
if (b->ob_size < 0) {
|
|
|
|
z = x_add(a, b);
|
1991-11-19 16:26:46 -04:00
|
|
|
if (z != NULL && z->ob_size != 0)
|
1992-01-14 14:36:43 -04:00
|
|
|
z->ob_size = -(z->ob_size);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
z = x_sub(b, a);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (b->ob_size < 0)
|
|
|
|
z = x_sub(a, b);
|
|
|
|
else
|
|
|
|
z = x_add(a, b);
|
|
|
|
}
|
2001-01-03 21:46:03 -04:00
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *)z;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2001-01-03 21:46:03 -04:00
|
|
|
long_sub(PyLongObject *v, PyLongObject *w)
|
1992-01-14 14:36:43 -04:00
|
|
|
{
|
2001-01-03 21:46:03 -04:00
|
|
|
PyLongObject *a, *b, *z;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2001-01-03 21:46:03 -04:00
|
|
|
CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
|
|
|
|
|
1991-05-05 17:09:44 -03:00
|
|
|
if (a->ob_size < 0) {
|
|
|
|
if (b->ob_size < 0)
|
|
|
|
z = x_sub(a, b);
|
|
|
|
else
|
|
|
|
z = x_add(a, b);
|
1991-11-19 16:26:46 -04:00
|
|
|
if (z != NULL && z->ob_size != 0)
|
1992-01-14 14:36:43 -04:00
|
|
|
z->ob_size = -(z->ob_size);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (b->ob_size < 0)
|
|
|
|
z = x_add(a, b);
|
|
|
|
else
|
|
|
|
z = x_sub(a, b);
|
|
|
|
}
|
2001-01-03 21:46:03 -04:00
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *)z;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
2002-08-11 23:31:19 -03:00
|
|
|
/* Grade school multiplication, ignoring the signs.
|
|
|
|
* Returns the absolute value of the product, or NULL if error.
|
|
|
|
*/
|
|
|
|
static PyLongObject *
|
|
|
|
x_mul(PyLongObject *a, PyLongObject *b)
|
2001-01-03 21:46:03 -04:00
|
|
|
{
|
2002-08-11 23:31:19 -03:00
|
|
|
PyLongObject *z;
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_ssize_t size_a = ABS(Py_SIZE(a));
|
|
|
|
Py_ssize_t size_b = ABS(Py_SIZE(b));
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i;
|
2001-01-03 21:46:03 -04:00
|
|
|
|
2002-08-11 23:31:19 -03:00
|
|
|
z = _PyLong_New(size_a + size_b);
|
|
|
|
if (z == NULL)
|
1991-05-05 17:09:44 -03:00
|
|
|
return NULL;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2007-12-18 22:37:44 -04:00
|
|
|
memset(z->ob_digit, 0, Py_SIZE(z) * sizeof(digit));
|
2004-08-29 19:16:50 -03:00
|
|
|
if (a == b) {
|
|
|
|
/* Efficient squaring per HAC, Algorithm 14.16:
|
|
|
|
* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
|
|
|
|
* Gives slightly less than a 2x speedup when a == b,
|
|
|
|
* via exploiting that each entry in the multiplication
|
|
|
|
* pyramid appears twice (except for the size_a squares).
|
|
|
|
*/
|
|
|
|
for (i = 0; i < size_a; ++i) {
|
|
|
|
twodigits carry;
|
|
|
|
twodigits f = a->ob_digit[i];
|
|
|
|
digit *pz = z->ob_digit + (i << 1);
|
|
|
|
digit *pa = a->ob_digit + i + 1;
|
|
|
|
digit *paend = a->ob_digit + size_a;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2004-08-29 19:16:50 -03:00
|
|
|
SIGCHECK({
|
|
|
|
Py_DECREF(z);
|
|
|
|
return NULL;
|
|
|
|
})
|
|
|
|
|
|
|
|
carry = *pz + f * f;
|
2008-01-25 08:18:43 -04:00
|
|
|
*pz++ = (digit)(carry & PyLong_MASK);
|
|
|
|
carry >>= PyLong_SHIFT;
|
|
|
|
assert(carry <= PyLong_MASK);
|
2004-08-29 19:16:50 -03:00
|
|
|
|
|
|
|
/* Now f is added in twice in each column of the
|
|
|
|
* pyramid it appears. Same as adding f<<1 once.
|
|
|
|
*/
|
|
|
|
f <<= 1;
|
|
|
|
while (pa < paend) {
|
|
|
|
carry += *pz + *pa++ * f;
|
2008-01-25 08:18:43 -04:00
|
|
|
*pz++ = (digit)(carry & PyLong_MASK);
|
|
|
|
carry >>= PyLong_SHIFT;
|
|
|
|
assert(carry <= (PyLong_MASK << 1));
|
2004-08-29 19:16:50 -03:00
|
|
|
}
|
|
|
|
if (carry) {
|
|
|
|
carry += *pz;
|
2008-01-25 08:18:43 -04:00
|
|
|
*pz++ = (digit)(carry & PyLong_MASK);
|
|
|
|
carry >>= PyLong_SHIFT;
|
2004-08-29 19:16:50 -03:00
|
|
|
}
|
|
|
|
if (carry)
|
2008-01-25 08:18:43 -04:00
|
|
|
*pz += (digit)(carry & PyLong_MASK);
|
|
|
|
assert((carry >> PyLong_SHIFT) == 0);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
2004-08-29 19:16:50 -03:00
|
|
|
}
|
|
|
|
else { /* a is not the same as b -- gradeschool long mult */
|
|
|
|
for (i = 0; i < size_a; ++i) {
|
|
|
|
twodigits carry = 0;
|
|
|
|
twodigits f = a->ob_digit[i];
|
|
|
|
digit *pz = z->ob_digit + i;
|
|
|
|
digit *pb = b->ob_digit;
|
|
|
|
digit *pbend = b->ob_digit + size_b;
|
|
|
|
|
|
|
|
SIGCHECK({
|
|
|
|
Py_DECREF(z);
|
|
|
|
return NULL;
|
|
|
|
})
|
|
|
|
|
|
|
|
while (pb < pbend) {
|
|
|
|
carry += *pz + *pb++ * f;
|
2008-01-25 08:18:43 -04:00
|
|
|
*pz++ = (digit)(carry & PyLong_MASK);
|
|
|
|
carry >>= PyLong_SHIFT;
|
|
|
|
assert(carry <= PyLong_MASK);
|
2004-08-29 19:16:50 -03:00
|
|
|
}
|
|
|
|
if (carry)
|
2008-01-25 08:18:43 -04:00
|
|
|
*pz += (digit)(carry & PyLong_MASK);
|
|
|
|
assert((carry >> PyLong_SHIFT) == 0);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
}
|
x_mul(): This failed to normalize its result.
k_mul(): This didn't allocate enough result space when one input had
more than twice as many bits as the other. This was partly hidden by
that x_mul() didn't normalize its result.
The Karatsuba recurrence is pretty much hosed if the inputs aren't
roughly the same size. If one has at least twice as many bits as the
other, we get a degenerate case where the "high half" of the smaller
input is 0. Added a special case for that, for speed, but despite that
it helped, this can still be much slower than the "grade school" method.
It seems to take a really wild imbalance to trigger that; e.g., a
2**22-bit input times a 1000-bit input on my box runs about twice as slow
under k_mul than under x_mul. This still needs to be addressed.
I'm also not sure that allocating a->ob_size + b->ob_size digits is
enough, given that this is computing k = (ah+al)*(bh+bl) instead of
k = (ah-al)*(bl-bh); i.e., it's certainly enough for the final result,
but it's vaguely possible that adding in the "artificially" large k may
overflow that temporarily. If so, an assert will trigger in the debug
build, but we'll probably compute the right result anyway(!).
2002-08-12 03:17:58 -03:00
|
|
|
return long_normalize(z);
|
2002-08-11 23:31:19 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
/* A helper for Karatsuba multiplication (k_mul).
|
|
|
|
Takes a long "n" and an integer "size" representing the place to
|
|
|
|
split, and sets low and high such that abs(n) == (high << size) + low,
|
|
|
|
viewing the shift as being by digits. The sign bit is ignored, and
|
|
|
|
the return values are >= 0.
|
|
|
|
Returns 0 on success, -1 on failure.
|
|
|
|
*/
|
|
|
|
static int
|
2006-02-15 13:27:45 -04:00
|
|
|
kmul_split(PyLongObject *n, Py_ssize_t size, PyLongObject **high, PyLongObject **low)
|
2002-08-11 23:31:19 -03:00
|
|
|
{
|
|
|
|
PyLongObject *hi, *lo;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t size_lo, size_hi;
|
2007-12-18 22:37:44 -04:00
|
|
|
const Py_ssize_t size_n = ABS(Py_SIZE(n));
|
2002-08-11 23:31:19 -03:00
|
|
|
|
|
|
|
size_lo = MIN(size_n, size);
|
|
|
|
size_hi = size_n - size_lo;
|
|
|
|
|
|
|
|
if ((hi = _PyLong_New(size_hi)) == NULL)
|
|
|
|
return -1;
|
|
|
|
if ((lo = _PyLong_New(size_lo)) == NULL) {
|
|
|
|
Py_DECREF(hi);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
memcpy(lo->ob_digit, n->ob_digit, size_lo * sizeof(digit));
|
|
|
|
memcpy(hi->ob_digit, n->ob_digit + size_lo, size_hi * sizeof(digit));
|
|
|
|
|
|
|
|
*high = long_normalize(hi);
|
|
|
|
*low = long_normalize(lo);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-08-12 19:01:34 -03:00
|
|
|
static PyLongObject *k_lopsided_mul(PyLongObject *a, PyLongObject *b);
|
|
|
|
|
2002-08-11 23:31:19 -03:00
|
|
|
/* Karatsuba multiplication. Ignores the input signs, and returns the
|
|
|
|
* absolute value of the product (or NULL if error).
|
|
|
|
* See Knuth Vol. 2 Chapter 4.3.3 (Pp. 294-295).
|
|
|
|
*/
|
|
|
|
static PyLongObject *
|
|
|
|
k_mul(PyLongObject *a, PyLongObject *b)
|
|
|
|
{
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_ssize_t asize = ABS(Py_SIZE(a));
|
|
|
|
Py_ssize_t bsize = ABS(Py_SIZE(b));
|
2002-08-11 23:31:19 -03:00
|
|
|
PyLongObject *ah = NULL;
|
|
|
|
PyLongObject *al = NULL;
|
|
|
|
PyLongObject *bh = NULL;
|
|
|
|
PyLongObject *bl = NULL;
|
|
|
|
PyLongObject *ret = NULL;
|
2002-08-12 12:08:20 -03:00
|
|
|
PyLongObject *t1, *t2, *t3;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t shift; /* the number of digits we split off */
|
|
|
|
Py_ssize_t i;
|
2002-08-12 12:08:20 -03:00
|
|
|
|
2002-08-11 23:31:19 -03:00
|
|
|
/* (ah*X+al)(bh*X+bl) = ah*bh*X*X + (ah*bl + al*bh)*X + al*bl
|
|
|
|
* Let k = (ah+al)*(bh+bl) = ah*bl + al*bh + ah*bh + al*bl
|
|
|
|
* Then the original product is
|
2002-08-11 23:43:58 -03:00
|
|
|
* ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
|
2002-08-11 23:31:19 -03:00
|
|
|
* By picking X to be a power of 2, "*X" is just shifting, and it's
|
|
|
|
* been reduced to 3 multiplies on numbers half the size.
|
|
|
|
*/
|
|
|
|
|
2002-08-11 23:54:10 -03:00
|
|
|
/* We want to split based on the larger number; fiddle so that b
|
2002-08-11 23:31:19 -03:00
|
|
|
* is largest.
|
|
|
|
*/
|
2002-08-12 12:08:20 -03:00
|
|
|
if (asize > bsize) {
|
2002-08-11 23:31:19 -03:00
|
|
|
t1 = a;
|
|
|
|
a = b;
|
|
|
|
b = t1;
|
2002-08-12 12:08:20 -03:00
|
|
|
|
|
|
|
i = asize;
|
|
|
|
asize = bsize;
|
|
|
|
bsize = i;
|
2002-08-11 23:31:19 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Use gradeschool math when either number is too small. */
|
2004-08-29 19:16:50 -03:00
|
|
|
i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF;
|
|
|
|
if (asize <= i) {
|
2002-08-12 12:08:20 -03:00
|
|
|
if (asize == 0)
|
x_mul(): This failed to normalize its result.
k_mul(): This didn't allocate enough result space when one input had
more than twice as many bits as the other. This was partly hidden by
that x_mul() didn't normalize its result.
The Karatsuba recurrence is pretty much hosed if the inputs aren't
roughly the same size. If one has at least twice as many bits as the
other, we get a degenerate case where the "high half" of the smaller
input is 0. Added a special case for that, for speed, but despite that
it helped, this can still be much slower than the "grade school" method.
It seems to take a really wild imbalance to trigger that; e.g., a
2**22-bit input times a 1000-bit input on my box runs about twice as slow
under k_mul than under x_mul. This still needs to be addressed.
I'm also not sure that allocating a->ob_size + b->ob_size digits is
enough, given that this is computing k = (ah+al)*(bh+bl) instead of
k = (ah-al)*(bl-bh); i.e., it's certainly enough for the final result,
but it's vaguely possible that adding in the "artificially" large k may
overflow that temporarily. If so, an assert will trigger in the debug
build, but we'll probably compute the right result anyway(!).
2002-08-12 03:17:58 -03:00
|
|
|
return _PyLong_New(0);
|
|
|
|
else
|
|
|
|
return x_mul(a, b);
|
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2002-08-12 19:01:34 -03:00
|
|
|
/* If a is small compared to b, splitting on b gives a degenerate
|
|
|
|
* case with ah==0, and Karatsuba may be (even much) less efficient
|
|
|
|
* than "grade school" then. However, we can still win, by viewing
|
|
|
|
* b as a string of "big digits", each of width a->ob_size. That
|
|
|
|
* leads to a sequence of balanced calls to k_mul.
|
|
|
|
*/
|
|
|
|
if (2 * asize <= bsize)
|
|
|
|
return k_lopsided_mul(a, b);
|
|
|
|
|
2002-08-13 17:37:51 -03:00
|
|
|
/* Split a & b into hi & lo pieces. */
|
2002-08-12 12:08:20 -03:00
|
|
|
shift = bsize >> 1;
|
2002-08-11 23:31:19 -03:00
|
|
|
if (kmul_split(a, shift, &ah, &al) < 0) goto fail;
|
2007-12-18 22:37:44 -04:00
|
|
|
assert(Py_SIZE(ah) > 0); /* the split isn't degenerate */
|
2002-08-13 17:37:51 -03:00
|
|
|
|
2004-08-29 19:16:50 -03:00
|
|
|
if (a == b) {
|
|
|
|
bh = ah;
|
|
|
|
bl = al;
|
|
|
|
Py_INCREF(bh);
|
|
|
|
Py_INCREF(bl);
|
|
|
|
}
|
|
|
|
else if (kmul_split(b, shift, &bh, &bl) < 0) goto fail;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2002-08-12 14:36:03 -03:00
|
|
|
/* The plan:
|
|
|
|
* 1. Allocate result space (asize + bsize digits: that's always
|
|
|
|
* enough).
|
|
|
|
* 2. Compute ah*bh, and copy into result at 2*shift.
|
|
|
|
* 3. Compute al*bl, and copy into result at 0. Note that this
|
|
|
|
* can't overlap with #2.
|
|
|
|
* 4. Subtract al*bl from the result, starting at shift. This may
|
|
|
|
* underflow (borrow out of the high digit), but we don't care:
|
|
|
|
* we're effectively doing unsigned arithmetic mod
|
2008-01-25 08:18:43 -04:00
|
|
|
* PyLong_BASE**(sizea + sizeb), and so long as the *final* result fits,
|
2002-08-12 14:36:03 -03:00
|
|
|
* borrows and carries out of the high digit can be ignored.
|
|
|
|
* 5. Subtract ah*bh from the result, starting at shift.
|
|
|
|
* 6. Compute (ah+al)*(bh+bl), and add it into the result starting
|
|
|
|
* at shift.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* 1. Allocate result space. */
|
2002-08-12 16:38:01 -03:00
|
|
|
ret = _PyLong_New(asize + bsize);
|
2002-08-11 23:31:19 -03:00
|
|
|
if (ret == NULL) goto fail;
|
|
|
|
#ifdef Py_DEBUG
|
|
|
|
/* Fill with trash, to catch reference to uninitialized digits. */
|
2007-12-18 22:37:44 -04:00
|
|
|
memset(ret->ob_digit, 0xDF, Py_SIZE(ret) * sizeof(digit));
|
2002-08-11 23:31:19 -03:00
|
|
|
#endif
|
x_mul(): This failed to normalize its result.
k_mul(): This didn't allocate enough result space when one input had
more than twice as many bits as the other. This was partly hidden by
that x_mul() didn't normalize its result.
The Karatsuba recurrence is pretty much hosed if the inputs aren't
roughly the same size. If one has at least twice as many bits as the
other, we get a degenerate case where the "high half" of the smaller
input is 0. Added a special case for that, for speed, but despite that
it helped, this can still be much slower than the "grade school" method.
It seems to take a really wild imbalance to trigger that; e.g., a
2**22-bit input times a 1000-bit input on my box runs about twice as slow
under k_mul than under x_mul. This still needs to be addressed.
I'm also not sure that allocating a->ob_size + b->ob_size digits is
enough, given that this is computing k = (ah+al)*(bh+bl) instead of
k = (ah-al)*(bl-bh); i.e., it's certainly enough for the final result,
but it's vaguely possible that adding in the "artificially" large k may
overflow that temporarily. If so, an assert will trigger in the debug
build, but we'll probably compute the right result anyway(!).
2002-08-12 03:17:58 -03:00
|
|
|
|
2002-08-12 14:36:03 -03:00
|
|
|
/* 2. t1 <- ah*bh, and copy into high digits of result. */
|
2002-08-12 12:08:20 -03:00
|
|
|
if ((t1 = k_mul(ah, bh)) == NULL) goto fail;
|
2007-12-18 22:37:44 -04:00
|
|
|
assert(Py_SIZE(t1) >= 0);
|
|
|
|
assert(2*shift + Py_SIZE(t1) <= Py_SIZE(ret));
|
2002-08-12 12:08:20 -03:00
|
|
|
memcpy(ret->ob_digit + 2*shift, t1->ob_digit,
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(t1) * sizeof(digit));
|
2002-08-12 12:08:20 -03:00
|
|
|
|
|
|
|
/* Zero-out the digits higher than the ah*bh copy. */
|
2007-12-18 22:37:44 -04:00
|
|
|
i = Py_SIZE(ret) - 2*shift - Py_SIZE(t1);
|
x_mul(): This failed to normalize its result.
k_mul(): This didn't allocate enough result space when one input had
more than twice as many bits as the other. This was partly hidden by
that x_mul() didn't normalize its result.
The Karatsuba recurrence is pretty much hosed if the inputs aren't
roughly the same size. If one has at least twice as many bits as the
other, we get a degenerate case where the "high half" of the smaller
input is 0. Added a special case for that, for speed, but despite that
it helped, this can still be much slower than the "grade school" method.
It seems to take a really wild imbalance to trigger that; e.g., a
2**22-bit input times a 1000-bit input on my box runs about twice as slow
under k_mul than under x_mul. This still needs to be addressed.
I'm also not sure that allocating a->ob_size + b->ob_size digits is
enough, given that this is computing k = (ah+al)*(bh+bl) instead of
k = (ah-al)*(bl-bh); i.e., it's certainly enough for the final result,
but it's vaguely possible that adding in the "artificially" large k may
overflow that temporarily. If so, an assert will trigger in the debug
build, but we'll probably compute the right result anyway(!).
2002-08-12 03:17:58 -03:00
|
|
|
if (i)
|
2007-12-18 22:37:44 -04:00
|
|
|
memset(ret->ob_digit + 2*shift + Py_SIZE(t1), 0,
|
x_mul(): This failed to normalize its result.
k_mul(): This didn't allocate enough result space when one input had
more than twice as many bits as the other. This was partly hidden by
that x_mul() didn't normalize its result.
The Karatsuba recurrence is pretty much hosed if the inputs aren't
roughly the same size. If one has at least twice as many bits as the
other, we get a degenerate case where the "high half" of the smaller
input is 0. Added a special case for that, for speed, but despite that
it helped, this can still be much slower than the "grade school" method.
It seems to take a really wild imbalance to trigger that; e.g., a
2**22-bit input times a 1000-bit input on my box runs about twice as slow
under k_mul than under x_mul. This still needs to be addressed.
I'm also not sure that allocating a->ob_size + b->ob_size digits is
enough, given that this is computing k = (ah+al)*(bh+bl) instead of
k = (ah-al)*(bl-bh); i.e., it's certainly enough for the final result,
but it's vaguely possible that adding in the "artificially" large k may
overflow that temporarily. If so, an assert will trigger in the debug
build, but we'll probably compute the right result anyway(!).
2002-08-12 03:17:58 -03:00
|
|
|
i * sizeof(digit));
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2002-08-12 14:36:03 -03:00
|
|
|
/* 3. t2 <- al*bl, and copy into the low digits. */
|
2002-08-12 12:08:20 -03:00
|
|
|
if ((t2 = k_mul(al, bl)) == NULL) {
|
|
|
|
Py_DECREF(t1);
|
|
|
|
goto fail;
|
|
|
|
}
|
2007-12-18 22:37:44 -04:00
|
|
|
assert(Py_SIZE(t2) >= 0);
|
|
|
|
assert(Py_SIZE(t2) <= 2*shift); /* no overlap with high digits */
|
|
|
|
memcpy(ret->ob_digit, t2->ob_digit, Py_SIZE(t2) * sizeof(digit));
|
2002-08-11 23:31:19 -03:00
|
|
|
|
|
|
|
/* Zero out remaining digits. */
|
2007-12-18 22:37:44 -04:00
|
|
|
i = 2*shift - Py_SIZE(t2); /* number of uninitialized digits */
|
2002-08-11 23:31:19 -03:00
|
|
|
if (i)
|
2007-12-18 22:37:44 -04:00
|
|
|
memset(ret->ob_digit + Py_SIZE(t2), 0, i * sizeof(digit));
|
2002-08-12 12:08:20 -03:00
|
|
|
|
2002-08-12 14:36:03 -03:00
|
|
|
/* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
|
|
|
|
* because it's fresher in cache.
|
|
|
|
*/
|
2007-12-18 22:37:44 -04:00
|
|
|
i = Py_SIZE(ret) - shift; /* # digits after shift */
|
|
|
|
(void)v_isub(ret->ob_digit + shift, i, t2->ob_digit, Py_SIZE(t2));
|
2002-08-12 12:08:20 -03:00
|
|
|
Py_DECREF(t2);
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2007-12-18 22:37:44 -04:00
|
|
|
(void)v_isub(ret->ob_digit + shift, i, t1->ob_digit, Py_SIZE(t1));
|
2002-08-12 12:08:20 -03:00
|
|
|
Py_DECREF(t1);
|
|
|
|
|
2002-08-12 14:36:03 -03:00
|
|
|
/* 6. t3 <- (ah+al)(bh+bl), and add into result. */
|
2002-08-11 23:31:19 -03:00
|
|
|
if ((t1 = x_add(ah, al)) == NULL) goto fail;
|
|
|
|
Py_DECREF(ah);
|
|
|
|
Py_DECREF(al);
|
|
|
|
ah = al = NULL;
|
|
|
|
|
2004-08-29 19:16:50 -03:00
|
|
|
if (a == b) {
|
|
|
|
t2 = t1;
|
|
|
|
Py_INCREF(t2);
|
|
|
|
}
|
|
|
|
else if ((t2 = x_add(bh, bl)) == NULL) {
|
2002-08-11 23:31:19 -03:00
|
|
|
Py_DECREF(t1);
|
|
|
|
goto fail;
|
|
|
|
}
|
|
|
|
Py_DECREF(bh);
|
|
|
|
Py_DECREF(bl);
|
|
|
|
bh = bl = NULL;
|
|
|
|
|
2002-08-12 12:08:20 -03:00
|
|
|
t3 = k_mul(t1, t2);
|
2002-08-11 23:31:19 -03:00
|
|
|
Py_DECREF(t1);
|
|
|
|
Py_DECREF(t2);
|
2002-08-12 12:08:20 -03:00
|
|
|
if (t3 == NULL) goto fail;
|
2007-12-18 22:37:44 -04:00
|
|
|
assert(Py_SIZE(t3) >= 0);
|
2002-08-12 02:09:36 -03:00
|
|
|
|
2002-08-13 17:37:51 -03:00
|
|
|
/* Add t3. It's not obvious why we can't run out of room here.
|
|
|
|
* See the (*) comment after this function.
|
2002-08-12 16:30:26 -03:00
|
|
|
*/
|
2007-12-18 22:37:44 -04:00
|
|
|
(void)v_iadd(ret->ob_digit + shift, i, t3->ob_digit, Py_SIZE(t3));
|
2002-08-12 12:08:20 -03:00
|
|
|
Py_DECREF(t3);
|
2002-08-11 23:31:19 -03:00
|
|
|
|
|
|
|
return long_normalize(ret);
|
|
|
|
|
|
|
|
fail:
|
|
|
|
Py_XDECREF(ret);
|
|
|
|
Py_XDECREF(ah);
|
|
|
|
Py_XDECREF(al);
|
|
|
|
Py_XDECREF(bh);
|
|
|
|
Py_XDECREF(bl);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2002-08-13 17:37:51 -03:00
|
|
|
/* (*) Why adding t3 can't "run out of room" above.
|
|
|
|
|
2002-08-15 17:06:00 -03:00
|
|
|
Let f(x) mean the floor of x and c(x) mean the ceiling of x. Some facts
|
|
|
|
to start with:
|
|
|
|
|
|
|
|
1. For any integer i, i = c(i/2) + f(i/2). In particular,
|
|
|
|
bsize = c(bsize/2) + f(bsize/2).
|
|
|
|
2. shift = f(bsize/2)
|
|
|
|
3. asize <= bsize
|
|
|
|
4. Since we call k_lopsided_mul if asize*2 <= bsize, asize*2 > bsize in this
|
|
|
|
routine, so asize > bsize/2 >= f(bsize/2) in this routine.
|
|
|
|
|
|
|
|
We allocated asize + bsize result digits, and add t3 into them at an offset
|
|
|
|
of shift. This leaves asize+bsize-shift allocated digit positions for t3
|
|
|
|
to fit into, = (by #1 and #2) asize + f(bsize/2) + c(bsize/2) - f(bsize/2) =
|
|
|
|
asize + c(bsize/2) available digit positions.
|
|
|
|
|
|
|
|
bh has c(bsize/2) digits, and bl at most f(size/2) digits. So bh+hl has
|
|
|
|
at most c(bsize/2) digits + 1 bit.
|
|
|
|
|
|
|
|
If asize == bsize, ah has c(bsize/2) digits, else ah has at most f(bsize/2)
|
|
|
|
digits, and al has at most f(bsize/2) digits in any case. So ah+al has at
|
|
|
|
most (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 1 bit.
|
|
|
|
|
|
|
|
The product (ah+al)*(bh+bl) therefore has at most
|
|
|
|
|
|
|
|
c(bsize/2) + (asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits
|
|
|
|
|
|
|
|
and we have asize + c(bsize/2) available digit positions. We need to show
|
|
|
|
this is always enough. An instance of c(bsize/2) cancels out in both, so
|
|
|
|
the question reduces to whether asize digits is enough to hold
|
|
|
|
(asize == bsize ? c(bsize/2) : f(bsize/2)) digits + 2 bits. If asize < bsize,
|
|
|
|
then we're asking whether asize digits >= f(bsize/2) digits + 2 bits. By #4,
|
|
|
|
asize is at least f(bsize/2)+1 digits, so this in turn reduces to whether 1
|
2008-01-25 08:18:43 -04:00
|
|
|
digit is enough to hold 2 bits. This is so since PyLong_SHIFT=15 >= 2. If
|
2002-08-15 17:06:00 -03:00
|
|
|
asize == bsize, then we're asking whether bsize digits is enough to hold
|
2002-08-15 17:10:45 -03:00
|
|
|
c(bsize/2) digits + 2 bits, or equivalently (by #1) whether f(bsize/2) digits
|
|
|
|
is enough to hold 2 bits. This is so if bsize >= 2, which holds because
|
|
|
|
bsize >= KARATSUBA_CUTOFF >= 2.
|
2002-08-14 13:36:23 -03:00
|
|
|
|
2002-08-14 14:07:32 -03:00
|
|
|
Note that since there's always enough room for (ah+al)*(bh+bl), and that's
|
|
|
|
clearly >= each of ah*bh and al*bl, there's always enough room to subtract
|
|
|
|
ah*bh and al*bl too.
|
2002-08-13 17:37:51 -03:00
|
|
|
*/
|
|
|
|
|
2002-08-12 19:01:34 -03:00
|
|
|
/* b has at least twice the digits of a, and a is big enough that Karatsuba
|
|
|
|
* would pay off *if* the inputs had balanced sizes. View b as a sequence
|
|
|
|
* of slices, each with a->ob_size digits, and multiply the slices by a,
|
|
|
|
* one at a time. This gives k_mul balanced inputs to work with, and is
|
|
|
|
* also cache-friendly (we compute one double-width slice of the result
|
|
|
|
* at a time, then move on, never bactracking except for the helpful
|
|
|
|
* single-width slice overlap between successive partial sums).
|
|
|
|
*/
|
|
|
|
static PyLongObject *
|
|
|
|
k_lopsided_mul(PyLongObject *a, PyLongObject *b)
|
|
|
|
{
|
2007-12-18 22:37:44 -04:00
|
|
|
const Py_ssize_t asize = ABS(Py_SIZE(a));
|
|
|
|
Py_ssize_t bsize = ABS(Py_SIZE(b));
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t nbdone; /* # of b digits already multiplied */
|
2002-08-12 19:01:34 -03:00
|
|
|
PyLongObject *ret;
|
|
|
|
PyLongObject *bslice = NULL;
|
|
|
|
|
|
|
|
assert(asize > KARATSUBA_CUTOFF);
|
|
|
|
assert(2 * asize <= bsize);
|
|
|
|
|
|
|
|
/* Allocate result space, and zero it out. */
|
|
|
|
ret = _PyLong_New(asize + bsize);
|
|
|
|
if (ret == NULL)
|
|
|
|
return NULL;
|
2007-12-18 22:37:44 -04:00
|
|
|
memset(ret->ob_digit, 0, Py_SIZE(ret) * sizeof(digit));
|
2002-08-12 19:01:34 -03:00
|
|
|
|
|
|
|
/* Successive slices of b are copied into bslice. */
|
2002-08-12 19:10:00 -03:00
|
|
|
bslice = _PyLong_New(asize);
|
2002-08-12 19:01:34 -03:00
|
|
|
if (bslice == NULL)
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
nbdone = 0;
|
|
|
|
while (bsize > 0) {
|
|
|
|
PyLongObject *product;
|
2006-02-15 13:27:45 -04:00
|
|
|
const Py_ssize_t nbtouse = MIN(bsize, asize);
|
2002-08-12 19:01:34 -03:00
|
|
|
|
|
|
|
/* Multiply the next slice of b by a. */
|
|
|
|
memcpy(bslice->ob_digit, b->ob_digit + nbdone,
|
|
|
|
nbtouse * sizeof(digit));
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(bslice) = nbtouse;
|
2002-08-12 19:01:34 -03:00
|
|
|
product = k_mul(a, bslice);
|
|
|
|
if (product == NULL)
|
|
|
|
goto fail;
|
|
|
|
|
|
|
|
/* Add into result. */
|
2007-12-18 22:37:44 -04:00
|
|
|
(void)v_iadd(ret->ob_digit + nbdone, Py_SIZE(ret) - nbdone,
|
|
|
|
product->ob_digit, Py_SIZE(product));
|
2002-08-12 19:01:34 -03:00
|
|
|
Py_DECREF(product);
|
|
|
|
|
|
|
|
bsize -= nbtouse;
|
|
|
|
nbdone += nbtouse;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_DECREF(bslice);
|
|
|
|
return long_normalize(ret);
|
|
|
|
|
|
|
|
fail:
|
|
|
|
Py_DECREF(ret);
|
|
|
|
Py_XDECREF(bslice);
|
|
|
|
return NULL;
|
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
long_mul(PyLongObject *v, PyLongObject *w)
|
|
|
|
{
|
|
|
|
PyLongObject *a, *b, *z;
|
|
|
|
|
|
|
|
if (!convert_binop((PyObject *)v, (PyObject *)w, &a, &b)) {
|
|
|
|
Py_INCREF(Py_NotImplemented);
|
|
|
|
return Py_NotImplemented;
|
|
|
|
}
|
|
|
|
|
2002-08-12 14:36:03 -03:00
|
|
|
z = k_mul(a, b);
|
2002-08-15 16:41:06 -03:00
|
|
|
/* Negate if exactly one of the inputs is negative. */
|
|
|
|
if (((a->ob_size ^ b->ob_size) < 0) && z)
|
1992-01-14 14:36:43 -04:00
|
|
|
z->ob_size = -(z->ob_size);
|
2001-01-03 21:46:03 -04:00
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
2002-08-15 16:41:06 -03:00
|
|
|
return (PyObject *)z;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
1992-01-19 12:31:05 -04:00
|
|
|
/* The / and % operators are now defined in terms of divmod().
|
|
|
|
The expression a mod b has the value a - b*floor(a/b).
|
|
|
|
The long_divrem function gives the remainder after division of
|
1991-05-05 17:09:44 -03:00
|
|
|
|a| by |b|, with the sign of a. This is also expressed
|
|
|
|
as a - b*trunc(a/b), if trunc truncates towards zero.
|
|
|
|
Some examples:
|
|
|
|
a b a rem b a mod b
|
|
|
|
13 10 3 3
|
|
|
|
-13 10 -3 7
|
|
|
|
13 -10 3 -7
|
|
|
|
-13 -10 -3 -3
|
|
|
|
So, to get from rem to mod, we have to add b if a and b
|
1991-05-14 09:06:49 -03:00
|
|
|
have different signs. We then subtract one from the 'div'
|
|
|
|
part of the outcome to keep the invariant intact. */
|
1991-05-05 17:09:44 -03:00
|
|
|
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
/* Compute
|
|
|
|
* *pdiv, *pmod = divmod(v, w)
|
|
|
|
* NULL can be passed for pdiv or pmod, in which case that part of
|
|
|
|
* the result is simply thrown away. The caller owns a reference to
|
|
|
|
* each of these it requests (does not pass NULL for).
|
|
|
|
*/
|
1992-01-19 12:31:05 -04:00
|
|
|
static int
|
2002-08-11 23:31:19 -03:00
|
|
|
l_divmod(PyLongObject *v, PyLongObject *w,
|
2000-07-07 12:53:28 -03:00
|
|
|
PyLongObject **pdiv, PyLongObject **pmod)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *div, *mod;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
1992-01-19 12:31:05 -04:00
|
|
|
if (long_divrem(v, w, &div, &mod) < 0)
|
|
|
|
return -1;
|
2007-12-18 22:37:44 -04:00
|
|
|
if ((Py_SIZE(mod) < 0 && Py_SIZE(w) > 0) ||
|
|
|
|
(Py_SIZE(mod) > 0 && Py_SIZE(w) < 0)) {
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *temp;
|
|
|
|
PyLongObject *one;
|
|
|
|
temp = (PyLongObject *) long_add(mod, w);
|
|
|
|
Py_DECREF(mod);
|
1992-01-19 12:31:05 -04:00
|
|
|
mod = temp;
|
|
|
|
if (mod == NULL) {
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_DECREF(div);
|
1992-01-19 12:31:05 -04:00
|
|
|
return -1;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
1997-05-02 00:12:38 -03:00
|
|
|
one = (PyLongObject *) PyLong_FromLong(1L);
|
1991-05-14 09:06:49 -03:00
|
|
|
if (one == NULL ||
|
1997-05-02 00:12:38 -03:00
|
|
|
(temp = (PyLongObject *) long_sub(div, one)) == NULL) {
|
|
|
|
Py_DECREF(mod);
|
|
|
|
Py_DECREF(div);
|
|
|
|
Py_XDECREF(one);
|
1992-01-19 12:31:05 -04:00
|
|
|
return -1;
|
1991-05-14 09:06:49 -03:00
|
|
|
}
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_DECREF(one);
|
|
|
|
Py_DECREF(div);
|
1991-05-14 09:06:49 -03:00
|
|
|
div = temp;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
if (pdiv != NULL)
|
|
|
|
*pdiv = div;
|
|
|
|
else
|
|
|
|
Py_DECREF(div);
|
|
|
|
|
|
|
|
if (pmod != NULL)
|
|
|
|
*pmod = mod;
|
|
|
|
else
|
|
|
|
Py_DECREF(mod);
|
|
|
|
|
1992-01-19 12:31:05 -04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2001-01-03 21:46:03 -04:00
|
|
|
long_div(PyObject *v, PyObject *w)
|
1992-01-19 12:31:05 -04:00
|
|
|
{
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
PyLongObject *a, *b, *div;
|
2001-01-03 21:46:03 -04:00
|
|
|
|
|
|
|
CONVERT_BINOP(v, w, &a, &b);
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
if (l_divmod(a, b, &div, NULL) < 0)
|
|
|
|
div = NULL;
|
2001-01-03 21:46:03 -04:00
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *)div;
|
1992-01-19 12:31:05 -04:00
|
|
|
}
|
|
|
|
|
Add warning mode for classic division, almost exactly as specified in
PEP 238. Changes:
- add a new flag variable Py_DivisionWarningFlag, declared in
pydebug.h, defined in object.c, set in main.c, and used in
{int,long,float,complex}object.c. When this flag is set, the
classic division operator issues a DeprecationWarning message.
- add a new API PyRun_SimpleStringFlags() to match
PyRun_SimpleString(). The main() function calls this so that
commands run with -c can also benefit from -Dnew.
- While I was at it, I changed the usage message in main() somewhat:
alphabetized the options, split it in *four* parts to fit in under
512 bytes (not that I still believe this is necessary -- doc strings
elsewhere are much longer), and perhaps most visibly, don't display
the full list of options on each command line error. Instead, the
full list is only displayed when -h is used, and otherwise a brief
reminder of -h is displayed. When -h is used, write to stdout so
that you can do `python -h | more'.
Notes:
- I don't want to use the -W option to control whether the classic
division warning is issued or not, because the machinery to decide
whether to display the warning or not is very expensive (it involves
calling into the warnings.py module). You can use -Werror to turn
the warnings into exceptions though.
- The -Dnew option doesn't select future division for all of the
program -- only for the __main__ module. I don't know if I'll ever
change this -- it would require changes to the .pyc file magic
number to do it right, and a more global notion of compiler flags.
- You can usefully combine -Dwarn and -Dnew: this gives the __main__
module new division, and warns about classic division everywhere
else.
2001-08-31 14:40:15 -03:00
|
|
|
static PyObject *
|
|
|
|
long_classic_div(PyObject *v, PyObject *w)
|
|
|
|
{
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
PyLongObject *a, *b, *div;
|
Add warning mode for classic division, almost exactly as specified in
PEP 238. Changes:
- add a new flag variable Py_DivisionWarningFlag, declared in
pydebug.h, defined in object.c, set in main.c, and used in
{int,long,float,complex}object.c. When this flag is set, the
classic division operator issues a DeprecationWarning message.
- add a new API PyRun_SimpleStringFlags() to match
PyRun_SimpleString(). The main() function calls this so that
commands run with -c can also benefit from -Dnew.
- While I was at it, I changed the usage message in main() somewhat:
alphabetized the options, split it in *four* parts to fit in under
512 bytes (not that I still believe this is necessary -- doc strings
elsewhere are much longer), and perhaps most visibly, don't display
the full list of options on each command line error. Instead, the
full list is only displayed when -h is used, and otherwise a brief
reminder of -h is displayed. When -h is used, write to stdout so
that you can do `python -h | more'.
Notes:
- I don't want to use the -W option to control whether the classic
division warning is issued or not, because the machinery to decide
whether to display the warning or not is very expensive (it involves
calling into the warnings.py module). You can use -Werror to turn
the warnings into exceptions though.
- The -Dnew option doesn't select future division for all of the
program -- only for the __main__ module. I don't know if I'll ever
change this -- it would require changes to the .pyc file magic
number to do it right, and a more global notion of compiler flags.
- You can usefully combine -Dwarn and -Dnew: this gives the __main__
module new division, and warns about classic division everywhere
else.
2001-08-31 14:40:15 -03:00
|
|
|
|
|
|
|
CONVERT_BINOP(v, w, &a, &b);
|
|
|
|
if (Py_DivisionWarningFlag &&
|
|
|
|
PyErr_Warn(PyExc_DeprecationWarning, "classic long division") < 0)
|
|
|
|
div = NULL;
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
else if (l_divmod(a, b, &div, NULL) < 0)
|
Add warning mode for classic division, almost exactly as specified in
PEP 238. Changes:
- add a new flag variable Py_DivisionWarningFlag, declared in
pydebug.h, defined in object.c, set in main.c, and used in
{int,long,float,complex}object.c. When this flag is set, the
classic division operator issues a DeprecationWarning message.
- add a new API PyRun_SimpleStringFlags() to match
PyRun_SimpleString(). The main() function calls this so that
commands run with -c can also benefit from -Dnew.
- While I was at it, I changed the usage message in main() somewhat:
alphabetized the options, split it in *four* parts to fit in under
512 bytes (not that I still believe this is necessary -- doc strings
elsewhere are much longer), and perhaps most visibly, don't display
the full list of options on each command line error. Instead, the
full list is only displayed when -h is used, and otherwise a brief
reminder of -h is displayed. When -h is used, write to stdout so
that you can do `python -h | more'.
Notes:
- I don't want to use the -W option to control whether the classic
division warning is issued or not, because the machinery to decide
whether to display the warning or not is very expensive (it involves
calling into the warnings.py module). You can use -Werror to turn
the warnings into exceptions though.
- The -Dnew option doesn't select future division for all of the
program -- only for the __main__ module. I don't know if I'll ever
change this -- it would require changes to the .pyc file magic
number to do it right, and a more global notion of compiler flags.
- You can usefully combine -Dwarn and -Dnew: this gives the __main__
module new division, and warns about classic division everywhere
else.
2001-08-31 14:40:15 -03:00
|
|
|
div = NULL;
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
return (PyObject *)div;
|
|
|
|
}
|
|
|
|
|
2009-12-27 10:55:57 -04:00
|
|
|
/* PyLong/PyLong -> float, with correctly rounded result. */
|
|
|
|
|
|
|
|
#define MANT_DIG_DIGITS (DBL_MANT_DIG / PyLong_SHIFT)
|
|
|
|
#define MANT_DIG_BITS (DBL_MANT_DIG % PyLong_SHIFT)
|
|
|
|
|
2001-09-04 02:31:47 -03:00
|
|
|
static PyObject *
|
|
|
|
long_true_divide(PyObject *v, PyObject *w)
|
|
|
|
{
|
2009-12-27 10:55:57 -04:00
|
|
|
PyLongObject *a, *b, *x;
|
|
|
|
Py_ssize_t a_size, b_size, shift, extra_bits, diff, x_size, x_bits;
|
|
|
|
digit mask, low;
|
|
|
|
int inexact, negate, a_is_small, b_is_small;
|
|
|
|
double dx, result;
|
2001-09-04 03:17:36 -03:00
|
|
|
|
|
|
|
CONVERT_BINOP(v, w, &a, &b);
|
|
|
|
|
2009-12-27 10:55:57 -04:00
|
|
|
/*
|
|
|
|
Method in a nutshell:
|
|
|
|
|
|
|
|
0. reduce to case a, b > 0; filter out obvious underflow/overflow
|
|
|
|
1. choose a suitable integer 'shift'
|
|
|
|
2. use integer arithmetic to compute x = floor(2**-shift*a/b)
|
|
|
|
3. adjust x for correct rounding
|
|
|
|
4. convert x to a double dx with the same value
|
|
|
|
5. return ldexp(dx, shift).
|
|
|
|
|
|
|
|
In more detail:
|
|
|
|
|
|
|
|
0. For any a, a/0 raises ZeroDivisionError; for nonzero b, 0/b
|
|
|
|
returns either 0.0 or -0.0, depending on the sign of b. For a and
|
|
|
|
b both nonzero, ignore signs of a and b, and add the sign back in
|
|
|
|
at the end. Now write a_bits and b_bits for the bit lengths of a
|
|
|
|
and b respectively (that is, a_bits = 1 + floor(log_2(a)); likewise
|
|
|
|
for b). Then
|
|
|
|
|
|
|
|
2**(a_bits - b_bits - 1) < a/b < 2**(a_bits - b_bits + 1).
|
|
|
|
|
|
|
|
So if a_bits - b_bits > DBL_MAX_EXP then a/b > 2**DBL_MAX_EXP and
|
|
|
|
so overflows. Similarly, if a_bits - b_bits < DBL_MIN_EXP -
|
|
|
|
DBL_MANT_DIG - 1 then a/b underflows to 0. With these cases out of
|
|
|
|
the way, we can assume that
|
|
|
|
|
|
|
|
DBL_MIN_EXP - DBL_MANT_DIG - 1 <= a_bits - b_bits <= DBL_MAX_EXP.
|
|
|
|
|
|
|
|
1. The integer 'shift' is chosen so that x has the right number of
|
|
|
|
bits for a double, plus two or three extra bits that will be used
|
|
|
|
in the rounding decisions. Writing a_bits and b_bits for the
|
|
|
|
number of significant bits in a and b respectively, a
|
|
|
|
straightforward formula for shift is:
|
|
|
|
|
|
|
|
shift = a_bits - b_bits - DBL_MANT_DIG - 2
|
|
|
|
|
|
|
|
This is fine in the usual case, but if a/b is smaller than the
|
|
|
|
smallest normal float then it can lead to double rounding on an
|
|
|
|
IEEE 754 platform, giving incorrectly rounded results. So we
|
|
|
|
adjust the formula slightly. The actual formula used is:
|
|
|
|
|
|
|
|
shift = MAX(a_bits - b_bits, DBL_MIN_EXP) - DBL_MANT_DIG - 2
|
|
|
|
|
|
|
|
2. The quantity x is computed by first shifting a (left -shift bits
|
|
|
|
if shift <= 0, right shift bits if shift > 0) and then dividing by
|
|
|
|
b. For both the shift and the division, we keep track of whether
|
|
|
|
the result is inexact, in a flag 'inexact'; this information is
|
|
|
|
needed at the rounding stage.
|
|
|
|
|
|
|
|
With the choice of shift above, together with our assumption that
|
|
|
|
a_bits - b_bits >= DBL_MIN_EXP - DBL_MANT_DIG - 1, it follows
|
|
|
|
that x >= 1.
|
|
|
|
|
|
|
|
3. Now x * 2**shift <= a/b < (x+1) * 2**shift. We want to replace
|
|
|
|
this with an exactly representable float of the form
|
|
|
|
|
|
|
|
round(x/2**extra_bits) * 2**(extra_bits+shift).
|
|
|
|
|
|
|
|
For float representability, we need x/2**extra_bits <
|
|
|
|
2**DBL_MANT_DIG and extra_bits + shift >= DBL_MIN_EXP -
|
|
|
|
DBL_MANT_DIG. This translates to the condition:
|
|
|
|
|
|
|
|
extra_bits >= MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG
|
2001-09-04 03:17:36 -03:00
|
|
|
|
2009-12-27 10:55:57 -04:00
|
|
|
To round, we just modify the bottom digit of x in-place; this can
|
|
|
|
end up giving a digit with value > PyLONG_MASK, but that's not a
|
|
|
|
problem since digits can hold values up to 2*PyLONG_MASK+1.
|
|
|
|
|
|
|
|
With the original choices for shift above, extra_bits will always
|
|
|
|
be 2 or 3. Then rounding under the round-half-to-even rule, we
|
|
|
|
round up iff the most significant of the extra bits is 1, and
|
|
|
|
either: (a) the computation of x in step 2 had an inexact result,
|
|
|
|
or (b) at least one other of the extra bits is 1, or (c) the least
|
|
|
|
significant bit of x (above those to be rounded) is 1.
|
|
|
|
|
|
|
|
4. Conversion to a double is straightforward; all floating-point
|
|
|
|
operations involved in the conversion are exact, so there's no
|
|
|
|
danger of rounding errors.
|
|
|
|
|
|
|
|
5. Use ldexp(x, shift) to compute x*2**shift, the final result.
|
|
|
|
The result will always be exactly representable as a double, except
|
|
|
|
in the case that it overflows. To avoid dependence on the exact
|
|
|
|
behaviour of ldexp on overflow, we check for overflow before
|
|
|
|
applying ldexp. The result of ldexp is adjusted for sign before
|
|
|
|
returning.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Reduce to case where a and b are both positive. */
|
|
|
|
a_size = ABS(Py_SIZE(a));
|
|
|
|
b_size = ABS(Py_SIZE(b));
|
|
|
|
negate = (Py_SIZE(a) < 0) ^ (Py_SIZE(b) < 0);
|
|
|
|
if (b_size == 0) {
|
|
|
|
PyErr_SetString(PyExc_ZeroDivisionError,
|
|
|
|
"division by zero");
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if (a_size == 0)
|
|
|
|
goto underflow_or_zero;
|
|
|
|
|
|
|
|
/* Fast path for a and b small (exactly representable in a double).
|
|
|
|
Relies on floating-point division being correctly rounded; results
|
|
|
|
may be subject to double rounding on x86 machines that operate with
|
|
|
|
the x87 FPU set to 64-bit precision. */
|
|
|
|
a_is_small = a_size <= MANT_DIG_DIGITS ||
|
|
|
|
(a_size == MANT_DIG_DIGITS+1 &&
|
|
|
|
a->ob_digit[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0);
|
|
|
|
b_is_small = b_size <= MANT_DIG_DIGITS ||
|
|
|
|
(b_size == MANT_DIG_DIGITS+1 &&
|
|
|
|
b->ob_digit[MANT_DIG_DIGITS] >> MANT_DIG_BITS == 0);
|
|
|
|
if (a_is_small && b_is_small) {
|
|
|
|
double da, db;
|
|
|
|
da = a->ob_digit[--a_size];
|
|
|
|
while (a_size > 0)
|
|
|
|
da = da * PyLong_BASE + a->ob_digit[--a_size];
|
|
|
|
db = b->ob_digit[--b_size];
|
|
|
|
while (b_size > 0)
|
|
|
|
db = db * PyLong_BASE + b->ob_digit[--b_size];
|
|
|
|
result = da / db;
|
|
|
|
goto success;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Catch obvious cases of underflow and overflow */
|
|
|
|
diff = a_size - b_size;
|
|
|
|
if (diff > PY_SSIZE_T_MAX/PyLong_SHIFT - 1)
|
|
|
|
/* Extreme overflow */
|
2001-09-04 03:17:36 -03:00
|
|
|
goto overflow;
|
2009-12-27 10:55:57 -04:00
|
|
|
else if (diff < 1 - PY_SSIZE_T_MAX/PyLong_SHIFT)
|
|
|
|
/* Extreme underflow */
|
|
|
|
goto underflow_or_zero;
|
|
|
|
/* Next line is now safe from overflowing a Py_ssize_t */
|
|
|
|
diff = diff * PyLong_SHIFT + bits_in_digit(a->ob_digit[a_size - 1]) -
|
|
|
|
bits_in_digit(b->ob_digit[b_size - 1]);
|
|
|
|
/* Now diff = a_bits - b_bits. */
|
|
|
|
if (diff > DBL_MAX_EXP)
|
2001-09-04 03:17:36 -03:00
|
|
|
goto overflow;
|
2009-12-27 10:55:57 -04:00
|
|
|
else if (diff < DBL_MIN_EXP - DBL_MANT_DIG - 1)
|
|
|
|
goto underflow_or_zero;
|
|
|
|
|
|
|
|
/* Choose value for shift; see comments for step 1 above. */
|
|
|
|
shift = MAX(diff, DBL_MIN_EXP) - DBL_MANT_DIG - 2;
|
|
|
|
|
|
|
|
inexact = 0;
|
|
|
|
|
|
|
|
/* x = abs(a * 2**-shift) */
|
|
|
|
if (shift <= 0) {
|
|
|
|
Py_ssize_t i, shift_digits = -shift / PyLong_SHIFT;
|
|
|
|
digit rem;
|
|
|
|
/* x = a << -shift */
|
|
|
|
if (a_size >= PY_SSIZE_T_MAX - 1 - shift_digits) {
|
|
|
|
/* In practice, it's probably impossible to end up
|
|
|
|
here. Both a and b would have to be enormous,
|
|
|
|
using close to SIZE_T_MAX bytes of memory each. */
|
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
|
|
|
"intermediate overflow during division");
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
x = _PyLong_New(a_size + shift_digits + 1);
|
|
|
|
if (x == NULL)
|
|
|
|
goto error;
|
|
|
|
for (i = 0; i < shift_digits; i++)
|
|
|
|
x->ob_digit[i] = 0;
|
|
|
|
rem = v_lshift(x->ob_digit + shift_digits, a->ob_digit,
|
|
|
|
a_size, -shift % PyLong_SHIFT);
|
|
|
|
x->ob_digit[a_size + shift_digits] = rem;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Py_ssize_t shift_digits = shift / PyLong_SHIFT;
|
|
|
|
digit rem;
|
|
|
|
/* x = a >> shift */
|
|
|
|
assert(a_size >= shift_digits);
|
|
|
|
x = _PyLong_New(a_size - shift_digits);
|
|
|
|
if (x == NULL)
|
|
|
|
goto error;
|
|
|
|
rem = v_rshift(x->ob_digit, a->ob_digit + shift_digits,
|
|
|
|
a_size - shift_digits, shift % PyLong_SHIFT);
|
|
|
|
/* set inexact if any of the bits shifted out is nonzero */
|
|
|
|
if (rem)
|
|
|
|
inexact = 1;
|
|
|
|
while (!inexact && shift_digits > 0)
|
|
|
|
if (a->ob_digit[--shift_digits])
|
|
|
|
inexact = 1;
|
|
|
|
}
|
|
|
|
long_normalize(x);
|
|
|
|
x_size = Py_SIZE(x);
|
|
|
|
|
|
|
|
/* x //= b. If the remainder is nonzero, set inexact. We own the only
|
|
|
|
reference to x, so it's safe to modify it in-place. */
|
|
|
|
if (b_size == 1) {
|
|
|
|
digit rem = inplace_divrem1(x->ob_digit, x->ob_digit, x_size,
|
|
|
|
b->ob_digit[0]);
|
|
|
|
long_normalize(x);
|
|
|
|
if (rem)
|
|
|
|
inexact = 1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
PyLongObject *div, *rem;
|
|
|
|
div = x_divrem(x, b, &rem);
|
|
|
|
Py_DECREF(x);
|
|
|
|
x = div;
|
|
|
|
if (x == NULL)
|
|
|
|
goto error;
|
|
|
|
if (Py_SIZE(rem))
|
|
|
|
inexact = 1;
|
|
|
|
Py_DECREF(rem);
|
|
|
|
}
|
|
|
|
x_size = ABS(Py_SIZE(x));
|
|
|
|
assert(x_size > 0); /* result of division is never zero */
|
|
|
|
x_bits = (x_size-1)*PyLong_SHIFT+bits_in_digit(x->ob_digit[x_size-1]);
|
|
|
|
|
|
|
|
/* The number of extra bits that have to be rounded away. */
|
|
|
|
extra_bits = MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG;
|
|
|
|
assert(extra_bits == 2 || extra_bits == 3);
|
|
|
|
|
|
|
|
/* Round by directly modifying the low digit of x. */
|
|
|
|
mask = (digit)1 << (extra_bits - 1);
|
|
|
|
low = x->ob_digit[0] | inexact;
|
|
|
|
if (low & mask && low & (3*mask-1))
|
|
|
|
low += mask;
|
|
|
|
x->ob_digit[0] = low & ~(mask-1U);
|
|
|
|
|
|
|
|
/* Convert x to a double dx; the conversion is exact. */
|
|
|
|
dx = x->ob_digit[--x_size];
|
|
|
|
while (x_size > 0)
|
|
|
|
dx = dx * PyLong_BASE + x->ob_digit[--x_size];
|
|
|
|
Py_DECREF(x);
|
|
|
|
|
|
|
|
/* Check whether ldexp result will overflow a double. */
|
|
|
|
if (shift + x_bits >= DBL_MAX_EXP &&
|
|
|
|
(shift + x_bits > DBL_MAX_EXP || dx == ldexp(1.0, x_bits)))
|
|
|
|
goto overflow;
|
|
|
|
result = ldexp(dx, shift);
|
|
|
|
|
|
|
|
success:
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
return PyFloat_FromDouble(negate ? -result : result);
|
2001-09-04 03:17:36 -03:00
|
|
|
|
2009-12-27 10:55:57 -04:00
|
|
|
underflow_or_zero:
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
return PyFloat_FromDouble(negate ? -0.0 : 0.0);
|
|
|
|
|
|
|
|
overflow:
|
2001-09-04 03:17:36 -03:00
|
|
|
PyErr_SetString(PyExc_OverflowError,
|
2009-12-27 10:55:57 -04:00
|
|
|
"integer division result too large for a float");
|
|
|
|
error:
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
2001-09-04 03:17:36 -03:00
|
|
|
return NULL;
|
2001-09-04 02:31:47 -03:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2001-01-03 21:46:03 -04:00
|
|
|
long_mod(PyObject *v, PyObject *w)
|
1992-01-19 12:31:05 -04:00
|
|
|
{
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
PyLongObject *a, *b, *mod;
|
2001-01-03 21:46:03 -04:00
|
|
|
|
|
|
|
CONVERT_BINOP(v, w, &a, &b);
|
|
|
|
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
if (l_divmod(a, b, NULL, &mod) < 0)
|
|
|
|
mod = NULL;
|
2001-01-03 21:46:03 -04:00
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *)mod;
|
1992-01-19 12:31:05 -04:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2001-01-03 21:46:03 -04:00
|
|
|
long_divmod(PyObject *v, PyObject *w)
|
1992-01-19 12:31:05 -04:00
|
|
|
{
|
2001-01-03 21:46:03 -04:00
|
|
|
PyLongObject *a, *b, *div, *mod;
|
1997-05-02 00:12:38 -03:00
|
|
|
PyObject *z;
|
2001-01-03 21:46:03 -04:00
|
|
|
|
|
|
|
CONVERT_BINOP(v, w, &a, &b);
|
|
|
|
|
|
|
|
if (l_divmod(a, b, &div, &mod) < 0) {
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
1992-01-19 12:31:05 -04:00
|
|
|
return NULL;
|
2001-01-03 21:46:03 -04:00
|
|
|
}
|
1997-05-02 00:12:38 -03:00
|
|
|
z = PyTuple_New(2);
|
1991-05-05 17:09:44 -03:00
|
|
|
if (z != NULL) {
|
1997-05-02 00:12:38 -03:00
|
|
|
PyTuple_SetItem(z, 0, (PyObject *) div);
|
|
|
|
PyTuple_SetItem(z, 1, (PyObject *) mod);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
else {
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_DECREF(div);
|
|
|
|
Py_DECREF(mod);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
2001-01-03 21:46:03 -04:00
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
1991-05-05 17:09:44 -03:00
|
|
|
return z;
|
|
|
|
}
|
|
|
|
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
/* pow(v, w, x) */
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2001-01-03 21:46:03 -04:00
|
|
|
long_pow(PyObject *v, PyObject *w, PyObject *x)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
PyLongObject *a, *b, *c; /* a,b,c = v,w,x */
|
|
|
|
int negativeOutput = 0; /* if x<0 return negative output */
|
|
|
|
|
|
|
|
PyLongObject *z = NULL; /* accumulated result */
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i, j, k; /* counters */
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
PyLongObject *temp = NULL;
|
2001-01-03 21:46:03 -04:00
|
|
|
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
/* 5-ary values. If the exponent is large enough, table is
|
|
|
|
* precomputed so that table[i] == a**i % c for i in range(32).
|
|
|
|
*/
|
|
|
|
PyLongObject *table[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
|
|
|
|
|
|
|
/* a, b, c = v, w, x */
|
2001-01-03 21:46:03 -04:00
|
|
|
CONVERT_BINOP(v, w, &a, &b);
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
if (PyLong_Check(x)) {
|
|
|
|
c = (PyLongObject *)x;
|
2001-01-03 21:46:03 -04:00
|
|
|
Py_INCREF(x);
|
|
|
|
}
|
2005-07-17 20:45:23 -03:00
|
|
|
else if (PyInt_Check(x)) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
c = (PyLongObject *)PyLong_FromLong(PyInt_AS_LONG(x));
|
2005-07-17 20:45:23 -03:00
|
|
|
if (c == NULL)
|
|
|
|
goto Error;
|
|
|
|
}
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
else if (x == Py_None)
|
|
|
|
c = NULL;
|
2001-01-03 21:46:03 -04:00
|
|
|
else {
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
Py_INCREF(Py_NotImplemented);
|
|
|
|
return Py_NotImplemented;
|
|
|
|
}
|
2001-09-05 03:24:58 -03:00
|
|
|
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(b) < 0) { /* if exponent is negative */
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
if (c) {
|
2001-09-05 03:24:58 -03:00
|
|
|
PyErr_SetString(PyExc_TypeError, "pow() 2nd argument "
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
"cannot be negative when 3rd argument specified");
|
2004-08-29 23:58:59 -03:00
|
|
|
goto Error;
|
2001-09-03 05:35:41 -03:00
|
|
|
}
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
else {
|
|
|
|
/* else return a float. This works because we know
|
|
|
|
that this calls float_pow() which converts its
|
|
|
|
arguments to double. */
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
return PyFloat_Type.tp_as_number->nb_power(v, w, x);
|
|
|
|
}
|
1991-05-28 18:58:16 -03:00
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
if (c) {
|
|
|
|
/* if modulus == 0:
|
|
|
|
raise ValueError() */
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(c) == 0) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
PyErr_SetString(PyExc_ValueError,
|
|
|
|
"pow() 3rd argument cannot be 0");
|
2004-08-29 23:58:59 -03:00
|
|
|
goto Error;
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
/* if modulus < 0:
|
|
|
|
negativeOutput = True
|
|
|
|
modulus = -modulus */
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(c) < 0) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
negativeOutput = 1;
|
|
|
|
temp = (PyLongObject *)_PyLong_Copy(c);
|
|
|
|
if (temp == NULL)
|
|
|
|
goto Error;
|
|
|
|
Py_DECREF(c);
|
|
|
|
c = temp;
|
|
|
|
temp = NULL;
|
|
|
|
c->ob_size = - c->ob_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if modulus == 1:
|
|
|
|
return 0 */
|
2007-12-18 22:37:44 -04:00
|
|
|
if ((Py_SIZE(c) == 1) && (c->ob_digit[0] == 1)) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
z = (PyLongObject *)PyLong_FromLong(0L);
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if base < 0:
|
|
|
|
base = base % modulus
|
|
|
|
Having the base positive just makes things easier. */
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(a) < 0) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
if (l_divmod(a, c, NULL, &temp) < 0)
|
2004-08-29 23:58:59 -03:00
|
|
|
goto Error;
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_DECREF(a);
|
1991-05-28 18:58:16 -03:00
|
|
|
a = temp;
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
temp = NULL;
|
1991-05-28 18:58:16 -03:00
|
|
|
}
|
|
|
|
}
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
|
|
|
|
/* At this point a, b, and c are guaranteed non-negative UNLESS
|
|
|
|
c is NULL, in which case a may be negative. */
|
|
|
|
|
|
|
|
z = (PyLongObject *)PyLong_FromLong(1L);
|
|
|
|
if (z == NULL)
|
|
|
|
goto Error;
|
|
|
|
|
|
|
|
/* Perform a modular reduction, X = X % c, but leave X alone if c
|
|
|
|
* is NULL.
|
|
|
|
*/
|
|
|
|
#define REDUCE(X) \
|
|
|
|
if (c != NULL) { \
|
|
|
|
if (l_divmod(X, c, NULL, &temp) < 0) \
|
|
|
|
goto Error; \
|
|
|
|
Py_XDECREF(X); \
|
|
|
|
X = temp; \
|
|
|
|
temp = NULL; \
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Multiply two values, then reduce the result:
|
|
|
|
result = X*Y % c. If c is NULL, skip the mod. */
|
|
|
|
#define MULT(X, Y, result) \
|
|
|
|
{ \
|
|
|
|
temp = (PyLongObject *)long_mul(X, Y); \
|
|
|
|
if (temp == NULL) \
|
|
|
|
goto Error; \
|
|
|
|
Py_XDECREF(result); \
|
|
|
|
result = temp; \
|
|
|
|
temp = NULL; \
|
|
|
|
REDUCE(result) \
|
|
|
|
}
|
|
|
|
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
/* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
|
|
|
|
/* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf */
|
2007-12-18 22:37:44 -04:00
|
|
|
for (i = Py_SIZE(b) - 1; i >= 0; --i) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
digit bi = b->ob_digit[i];
|
|
|
|
|
2009-02-15 11:48:39 -04:00
|
|
|
for (j = (digit)1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
MULT(z, z, z)
|
|
|
|
if (bi & j)
|
|
|
|
MULT(z, a, z)
|
|
|
|
}
|
1999-10-11 19:34:41 -03:00
|
|
|
}
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */
|
|
|
|
Py_INCREF(z); /* still holds 1L */
|
|
|
|
table[0] = z;
|
|
|
|
for (i = 1; i < 32; ++i)
|
|
|
|
MULT(table[i-1], a, table[i])
|
|
|
|
|
2007-12-18 22:37:44 -04:00
|
|
|
for (i = Py_SIZE(b) - 1; i >= 0; --i) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
const digit bi = b->ob_digit[i];
|
|
|
|
|
2008-01-25 08:18:43 -04:00
|
|
|
for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
const int index = (bi >> j) & 0x1f;
|
|
|
|
for (k = 0; k < 5; ++k)
|
|
|
|
MULT(z, z, z)
|
|
|
|
if (index)
|
|
|
|
MULT(z, table[index], z)
|
|
|
|
}
|
1999-10-11 19:34:41 -03:00
|
|
|
}
|
1994-08-29 09:47:19 -03:00
|
|
|
}
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
|
2007-12-18 22:37:44 -04:00
|
|
|
if (negativeOutput && (Py_SIZE(z) != 0)) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
temp = (PyLongObject *)long_sub(z, c);
|
|
|
|
if (temp == NULL)
|
|
|
|
goto Error;
|
|
|
|
Py_DECREF(z);
|
|
|
|
z = temp;
|
|
|
|
temp = NULL;
|
|
|
|
}
|
|
|
|
goto Done;
|
|
|
|
|
|
|
|
Error:
|
|
|
|
if (z != NULL) {
|
|
|
|
Py_DECREF(z);
|
|
|
|
z = NULL;
|
|
|
|
}
|
|
|
|
/* fall through */
|
|
|
|
Done:
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(b) > FIVEARY_CUTOFF) {
|
SF patch 936813: fast modular exponentiation
This checkin is adapted from part 2 (of 3) of Trevor Perrin's patch set.
BACKWARD INCOMPATIBILITY: SHIFT must now be divisible by 5. AFAIK,
nobody will care. long_pow() could be complicated to worm around that,
if necessary.
long_pow():
- BUGFIX: This leaked the base and power when the power was negative
(and so the computation delegated to float pow).
- Instead of doing right-to-left exponentiation, do left-to-right. This
is more efficient for small bases, which is the common case.
- In addition, if the exponent is large (more than FIVEARY_CUTOFF
digits), precompute [a**i % c for i in range(32)], and go left to
right 5 bits at a time.
l_divmod():
- The signature changed so that callers who don't want the quotient,
or don't want the remainder, can pass NULL in the slot they don't
want. This saves them from having to declare a vrbl for unwanted
stuff, and remembering to decref it.
long_mod(), long_div(), long_classic_div():
- Adjust to new l_divmod() signature, and simplified as a result.
2004-08-29 23:44:38 -03:00
|
|
|
for (i = 0; i < 32; ++i)
|
|
|
|
Py_XDECREF(table[i]);
|
|
|
|
}
|
2005-07-17 20:45:23 -03:00
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
Py_XDECREF(c);
|
|
|
|
Py_XDECREF(temp);
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *)z;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
long_invert(PyLongObject *v)
|
1991-11-19 16:26:46 -04:00
|
|
|
{
|
1992-01-14 14:36:43 -04:00
|
|
|
/* Implement ~x as -(x+1) */
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *x;
|
|
|
|
PyLongObject *w;
|
|
|
|
w = (PyLongObject *)PyLong_FromLong(1L);
|
1992-01-14 14:36:43 -04:00
|
|
|
if (w == NULL)
|
|
|
|
return NULL;
|
1997-05-02 00:12:38 -03:00
|
|
|
x = (PyLongObject *) long_add(v, w);
|
|
|
|
Py_DECREF(w);
|
1992-01-14 14:36:43 -04:00
|
|
|
if (x == NULL)
|
|
|
|
return NULL;
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(x) = -(Py_SIZE(x));
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *)x;
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
long_neg(PyLongObject *v)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *z;
|
2001-09-11 19:31:33 -03:00
|
|
|
if (v->ob_size == 0 && PyLong_CheckExact(v)) {
|
1992-01-14 14:36:43 -04:00
|
|
|
/* -0 == 0 */
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_INCREF(v);
|
|
|
|
return (PyObject *) v;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
2001-09-11 19:31:33 -03:00
|
|
|
z = (PyLongObject *)_PyLong_Copy(v);
|
|
|
|
if (z != NULL)
|
|
|
|
z->ob_size = -(v->ob_size);
|
1997-05-02 00:12:38 -03:00
|
|
|
return (PyObject *)z;
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
long_abs(PyLongObject *v)
|
1991-05-05 17:09:44 -03:00
|
|
|
{
|
|
|
|
if (v->ob_size < 0)
|
1992-01-14 14:36:43 -04:00
|
|
|
return long_neg(v);
|
2001-09-11 19:31:33 -03:00
|
|
|
else
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
return long_long((PyObject *)v);
|
1991-05-05 17:09:44 -03:00
|
|
|
}
|
|
|
|
|
1991-05-14 09:06:49 -03:00
|
|
|
static int
|
2000-07-07 12:53:28 -03:00
|
|
|
long_nonzero(PyLongObject *v)
|
1991-05-14 09:06:49 -03:00
|
|
|
{
|
2007-12-18 22:37:44 -04:00
|
|
|
return ABS(Py_SIZE(v)) != 0;
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2001-01-03 21:46:03 -04:00
|
|
|
long_rshift(PyLongObject *v, PyLongObject *w)
|
1991-11-19 16:26:46 -04:00
|
|
|
{
|
2001-01-03 21:46:03 -04:00
|
|
|
PyLongObject *a, *b;
|
|
|
|
PyLongObject *z = NULL;
|
1991-11-19 16:26:46 -04:00
|
|
|
long shiftby;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t newsize, wordshift, loshift, hishift, i, j;
|
1991-11-19 16:26:46 -04:00
|
|
|
digit lomask, himask;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2001-01-03 21:46:03 -04:00
|
|
|
CONVERT_BINOP((PyObject *)v, (PyObject *)w, &a, &b);
|
|
|
|
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(a) < 0) {
|
1992-01-14 14:36:43 -04:00
|
|
|
/* Right shifting negative numbers is harder */
|
2001-01-03 21:46:03 -04:00
|
|
|
PyLongObject *a1, *a2;
|
1997-05-02 00:12:38 -03:00
|
|
|
a1 = (PyLongObject *) long_invert(a);
|
2001-01-03 21:46:03 -04:00
|
|
|
if (a1 == NULL)
|
|
|
|
goto rshift_error;
|
1997-05-02 00:12:38 -03:00
|
|
|
a2 = (PyLongObject *) long_rshift(a1, b);
|
|
|
|
Py_DECREF(a1);
|
2001-01-03 21:46:03 -04:00
|
|
|
if (a2 == NULL)
|
|
|
|
goto rshift_error;
|
|
|
|
z = (PyLongObject *) long_invert(a2);
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_DECREF(a2);
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
2001-01-03 21:46:03 -04:00
|
|
|
else {
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2001-01-03 21:46:03 -04:00
|
|
|
shiftby = PyLong_AsLong((PyObject *)b);
|
|
|
|
if (shiftby == -1L && PyErr_Occurred())
|
|
|
|
goto rshift_error;
|
|
|
|
if (shiftby < 0) {
|
|
|
|
PyErr_SetString(PyExc_ValueError,
|
|
|
|
"negative shift count");
|
|
|
|
goto rshift_error;
|
|
|
|
}
|
2008-01-25 08:18:43 -04:00
|
|
|
wordshift = shiftby / PyLong_SHIFT;
|
2007-12-18 22:37:44 -04:00
|
|
|
newsize = ABS(Py_SIZE(a)) - wordshift;
|
2001-01-03 21:46:03 -04:00
|
|
|
if (newsize <= 0) {
|
|
|
|
z = _PyLong_New(0);
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
return (PyObject *)z;
|
|
|
|
}
|
2008-01-25 08:18:43 -04:00
|
|
|
loshift = shiftby % PyLong_SHIFT;
|
|
|
|
hishift = PyLong_SHIFT - loshift;
|
2001-01-03 21:46:03 -04:00
|
|
|
lomask = ((digit)1 << hishift) - 1;
|
2008-01-25 08:18:43 -04:00
|
|
|
himask = PyLong_MASK ^ lomask;
|
2001-01-03 21:46:03 -04:00
|
|
|
z = _PyLong_New(newsize);
|
|
|
|
if (z == NULL)
|
|
|
|
goto rshift_error;
|
2007-12-18 22:37:44 -04:00
|
|
|
if (Py_SIZE(a) < 0)
|
|
|
|
Py_SIZE(z) = -(Py_SIZE(z));
|
2001-01-03 21:46:03 -04:00
|
|
|
for (i = 0, j = wordshift; i < newsize; i++, j++) {
|
|
|
|
z->ob_digit[i] = (a->ob_digit[j] >> loshift) & lomask;
|
|
|
|
if (i+1 < newsize)
|
|
|
|
z->ob_digit[i] |=
|
|
|
|
(a->ob_digit[j+1] << hishift) & himask;
|
|
|
|
}
|
|
|
|
z = long_normalize(z);
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
2001-01-03 21:46:03 -04:00
|
|
|
rshift_error:
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
return (PyObject *) z;
|
|
|
|
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2001-01-03 21:46:03 -04:00
|
|
|
long_lshift(PyObject *v, PyObject *w)
|
1991-11-19 16:26:46 -04:00
|
|
|
{
|
1997-03-15 20:37:59 -04:00
|
|
|
/* This version due to Tim Peters */
|
2001-01-03 21:46:03 -04:00
|
|
|
PyLongObject *a, *b;
|
|
|
|
PyLongObject *z = NULL;
|
1991-11-19 16:26:46 -04:00
|
|
|
long shiftby;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t oldsize, newsize, wordshift, remshift, i, j;
|
1997-03-15 20:37:59 -04:00
|
|
|
twodigits accum;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2001-01-03 21:46:03 -04:00
|
|
|
CONVERT_BINOP(v, w, &a, &b);
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
shiftby = PyLong_AsLong((PyObject *)b);
|
|
|
|
if (shiftby == -1L && PyErr_Occurred())
|
2001-01-03 21:46:03 -04:00
|
|
|
goto lshift_error;
|
1991-11-19 16:26:46 -04:00
|
|
|
if (shiftby < 0) {
|
1997-05-02 00:12:38 -03:00
|
|
|
PyErr_SetString(PyExc_ValueError, "negative shift count");
|
2001-01-03 21:46:03 -04:00
|
|
|
goto lshift_error;
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
1997-03-15 20:37:59 -04:00
|
|
|
if ((long)(int)shiftby != shiftby) {
|
1997-05-02 00:12:38 -03:00
|
|
|
PyErr_SetString(PyExc_ValueError,
|
|
|
|
"outrageous left shift count");
|
2001-01-03 21:46:03 -04:00
|
|
|
goto lshift_error;
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
2008-01-25 08:18:43 -04:00
|
|
|
/* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
|
|
|
|
wordshift = (int)shiftby / PyLong_SHIFT;
|
|
|
|
remshift = (int)shiftby - wordshift * PyLong_SHIFT;
|
1997-03-15 20:37:59 -04:00
|
|
|
|
|
|
|
oldsize = ABS(a->ob_size);
|
|
|
|
newsize = oldsize + wordshift;
|
|
|
|
if (remshift)
|
|
|
|
++newsize;
|
1997-05-02 00:12:38 -03:00
|
|
|
z = _PyLong_New(newsize);
|
1991-11-19 16:26:46 -04:00
|
|
|
if (z == NULL)
|
2001-01-03 21:46:03 -04:00
|
|
|
goto lshift_error;
|
1991-11-19 16:26:46 -04:00
|
|
|
if (a->ob_size < 0)
|
1992-01-14 14:36:43 -04:00
|
|
|
z->ob_size = -(z->ob_size);
|
1991-11-19 16:26:46 -04:00
|
|
|
for (i = 0; i < wordshift; i++)
|
|
|
|
z->ob_digit[i] = 0;
|
2002-08-11 23:31:19 -03:00
|
|
|
accum = 0;
|
1997-03-15 20:37:59 -04:00
|
|
|
for (i = wordshift, j = 0; j < oldsize; i++, j++) {
|
2002-08-20 16:00:22 -03:00
|
|
|
accum |= (twodigits)a->ob_digit[j] << remshift;
|
2008-01-25 08:18:43 -04:00
|
|
|
z->ob_digit[i] = (digit)(accum & PyLong_MASK);
|
|
|
|
accum >>= PyLong_SHIFT;
|
1997-03-15 20:37:59 -04:00
|
|
|
}
|
|
|
|
if (remshift)
|
|
|
|
z->ob_digit[newsize-1] = (digit)accum;
|
2002-08-11 23:31:19 -03:00
|
|
|
else
|
1997-03-15 20:37:59 -04:00
|
|
|
assert(!accum);
|
2001-01-03 21:46:03 -04:00
|
|
|
z = long_normalize(z);
|
|
|
|
lshift_error:
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
return (PyObject *) z;
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
|
|
|
|
2009-10-25 17:39:06 -03:00
|
|
|
/* Compute two's complement of digit vector a[0:m], writing result to
|
|
|
|
z[0:m]. The digit vector a need not be normalized, but should not
|
|
|
|
be entirely zero. a and z may point to the same digit vector. */
|
|
|
|
|
|
|
|
static void
|
|
|
|
v_complement(digit *z, digit *a, Py_ssize_t m)
|
|
|
|
{
|
|
|
|
Py_ssize_t i;
|
|
|
|
digit carry = 1;
|
|
|
|
for (i = 0; i < m; ++i) {
|
|
|
|
carry += a[i] ^ PyLong_MASK;
|
|
|
|
z[i] = carry & PyLong_MASK;
|
|
|
|
carry >>= PyLong_SHIFT;
|
|
|
|
}
|
|
|
|
assert(carry == 0);
|
|
|
|
}
|
1992-01-14 14:36:43 -04:00
|
|
|
|
|
|
|
/* Bitwise and/xor/or operations */
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
long_bitwise(PyLongObject *a,
|
|
|
|
int op, /* '&', '|', '^' */
|
|
|
|
PyLongObject *b)
|
1991-11-19 16:26:46 -04:00
|
|
|
{
|
2009-10-25 17:39:06 -03:00
|
|
|
int nega, negb, negz;
|
2009-02-15 11:48:39 -04:00
|
|
|
Py_ssize_t size_a, size_b, size_z, i;
|
1997-05-02 00:12:38 -03:00
|
|
|
PyLongObject *z;
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2009-10-25 17:39:06 -03:00
|
|
|
/* Bitwise operations for negative numbers operate as though
|
|
|
|
on a two's complement representation. So convert arguments
|
|
|
|
from sign-magnitude to two's complement, and convert the
|
|
|
|
result back to sign-magnitude at the end. */
|
|
|
|
|
|
|
|
/* If a is negative, replace it by its two's complement. */
|
|
|
|
size_a = ABS(Py_SIZE(a));
|
|
|
|
nega = Py_SIZE(a) < 0;
|
|
|
|
if (nega) {
|
|
|
|
z = _PyLong_New(size_a);
|
|
|
|
if (z == NULL)
|
2006-03-07 11:39:21 -04:00
|
|
|
return NULL;
|
2009-10-25 17:39:06 -03:00
|
|
|
v_complement(z->ob_digit, a->ob_digit, size_a);
|
|
|
|
a = z;
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
2009-10-25 17:39:06 -03:00
|
|
|
else
|
|
|
|
/* Keep reference count consistent. */
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_INCREF(a);
|
2009-10-25 17:39:06 -03:00
|
|
|
|
|
|
|
/* Same for b. */
|
|
|
|
size_b = ABS(Py_SIZE(b));
|
|
|
|
negb = Py_SIZE(b) < 0;
|
|
|
|
if (negb) {
|
|
|
|
z = _PyLong_New(size_b);
|
|
|
|
if (z == NULL) {
|
2006-03-07 11:39:21 -04:00
|
|
|
Py_DECREF(a);
|
|
|
|
return NULL;
|
|
|
|
}
|
2009-10-25 17:39:06 -03:00
|
|
|
v_complement(z->ob_digit, b->ob_digit, size_b);
|
|
|
|
b = z;
|
1991-12-31 09:14:13 -04:00
|
|
|
}
|
2009-10-25 17:39:06 -03:00
|
|
|
else
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_INCREF(b);
|
2009-10-25 17:39:06 -03:00
|
|
|
|
|
|
|
/* Swap a and b if necessary to ensure size_a >= size_b. */
|
|
|
|
if (size_a < size_b) {
|
|
|
|
z = a; a = b; b = z;
|
|
|
|
size_z = size_a; size_a = size_b; size_b = size_z;
|
|
|
|
negz = nega; nega = negb; negb = negz;
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2009-10-25 17:39:06 -03:00
|
|
|
/* JRH: The original logic here was to allocate the result value (z)
|
|
|
|
as the longer of the two operands. However, there are some cases
|
|
|
|
where the result is guaranteed to be shorter than that: AND of two
|
|
|
|
positives, OR of two negatives: use the shorter number. AND with
|
|
|
|
mixed signs: use the positive number. OR with mixed signs: use the
|
|
|
|
negative number.
|
|
|
|
*/
|
1992-01-14 14:36:43 -04:00
|
|
|
switch (op) {
|
|
|
|
case '^':
|
2009-10-25 17:39:06 -03:00
|
|
|
negz = nega ^ negb;
|
|
|
|
size_z = size_a;
|
1992-01-14 14:36:43 -04:00
|
|
|
break;
|
1994-08-29 09:47:19 -03:00
|
|
|
case '&':
|
2009-10-25 17:39:06 -03:00
|
|
|
negz = nega & negb;
|
|
|
|
size_z = negb ? size_a : size_b;
|
1992-01-14 14:36:43 -04:00
|
|
|
break;
|
|
|
|
case '|':
|
2009-10-25 17:39:06 -03:00
|
|
|
negz = nega | negb;
|
|
|
|
size_z = negb ? size_b : size_a;
|
1992-01-14 14:36:43 -04:00
|
|
|
break;
|
2009-10-25 17:39:06 -03:00
|
|
|
default:
|
|
|
|
PyErr_BadArgument();
|
|
|
|
return NULL;
|
1991-12-31 09:14:13 -04:00
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2009-10-25 17:39:06 -03:00
|
|
|
/* We allow an extra digit if z is negative, to make sure that
|
|
|
|
the final two's complement of z doesn't overflow. */
|
|
|
|
z = _PyLong_New(size_z + negz);
|
2006-03-07 11:39:21 -04:00
|
|
|
if (z == NULL) {
|
2006-07-15 23:00:32 -03:00
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
1998-08-11 12:04:47 -03:00
|
|
|
return NULL;
|
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
2009-10-25 17:39:06 -03:00
|
|
|
/* Compute digits for overlap of a and b. */
|
|
|
|
switch(op) {
|
|
|
|
case '&':
|
|
|
|
for (i = 0; i < size_b; ++i)
|
|
|
|
z->ob_digit[i] = a->ob_digit[i] & b->ob_digit[i];
|
|
|
|
break;
|
|
|
|
case '|':
|
|
|
|
for (i = 0; i < size_b; ++i)
|
|
|
|
z->ob_digit[i] = a->ob_digit[i] | b->ob_digit[i];
|
|
|
|
break;
|
|
|
|
case '^':
|
|
|
|
for (i = 0; i < size_b; ++i)
|
|
|
|
z->ob_digit[i] = a->ob_digit[i] ^ b->ob_digit[i];
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
PyErr_BadArgument();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Copy any remaining digits of a, inverting if necessary. */
|
|
|
|
if (op == '^' && negb)
|
|
|
|
for (; i < size_z; ++i)
|
|
|
|
z->ob_digit[i] = a->ob_digit[i] ^ PyLong_MASK;
|
|
|
|
else if (i < size_z)
|
|
|
|
memcpy(&z->ob_digit[i], &a->ob_digit[i],
|
|
|
|
(size_z-i)*sizeof(digit));
|
|
|
|
|
|
|
|
/* Complement result if negative. */
|
|
|
|
if (negz) {
|
|
|
|
Py_SIZE(z) = -(Py_SIZE(z));
|
|
|
|
z->ob_digit[size_z] = PyLong_MASK;
|
|
|
|
v_complement(z->ob_digit, z->ob_digit, size_z+1);
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
2002-08-11 23:31:19 -03:00
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
2009-10-25 17:39:06 -03:00
|
|
|
return (PyObject *)long_normalize(z);
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2001-01-03 21:46:03 -04:00
|
|
|
long_and(PyObject *v, PyObject *w)
|
1991-11-19 16:26:46 -04:00
|
|
|
{
|
2001-01-03 21:46:03 -04:00
|
|
|
PyLongObject *a, *b;
|
|
|
|
PyObject *c;
|
|
|
|
CONVERT_BINOP(v, w, &a, &b);
|
|
|
|
c = long_bitwise(a, '&', b);
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
return c;
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2001-01-03 21:46:03 -04:00
|
|
|
long_xor(PyObject *v, PyObject *w)
|
1991-11-19 16:26:46 -04:00
|
|
|
{
|
2001-01-03 21:46:03 -04:00
|
|
|
PyLongObject *a, *b;
|
|
|
|
PyObject *c;
|
|
|
|
CONVERT_BINOP(v, w, &a, &b);
|
|
|
|
c = long_bitwise(a, '^', b);
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
return c;
|
1991-11-19 16:26:46 -04:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2001-01-03 21:46:03 -04:00
|
|
|
long_or(PyObject *v, PyObject *w)
|
1991-11-19 16:26:46 -04:00
|
|
|
{
|
2001-01-03 21:46:03 -04:00
|
|
|
PyLongObject *a, *b;
|
|
|
|
PyObject *c;
|
|
|
|
CONVERT_BINOP(v, w, &a, &b);
|
|
|
|
c = long_bitwise(a, '|', b);
|
|
|
|
Py_DECREF(a);
|
|
|
|
Py_DECREF(b);
|
|
|
|
return c;
|
1991-05-14 09:06:49 -03:00
|
|
|
}
|
|
|
|
|
1993-06-17 09:35:49 -03:00
|
|
|
static int
|
2000-07-07 12:53:28 -03:00
|
|
|
long_coerce(PyObject **pv, PyObject **pw)
|
1992-08-14 09:06:52 -03:00
|
|
|
{
|
1997-05-02 00:12:38 -03:00
|
|
|
if (PyInt_Check(*pw)) {
|
2001-01-03 21:46:03 -04:00
|
|
|
*pw = PyLong_FromLong(PyInt_AS_LONG(*pw));
|
2007-04-11 14:16:24 -03:00
|
|
|
if (*pw == NULL)
|
|
|
|
return -1;
|
1997-05-02 00:12:38 -03:00
|
|
|
Py_INCREF(*pv);
|
1992-08-14 09:06:52 -03:00
|
|
|
return 0;
|
|
|
|
}
|
2001-09-18 22:25:16 -03:00
|
|
|
else if (PyLong_Check(*pw)) {
|
|
|
|
Py_INCREF(*pv);
|
|
|
|
Py_INCREF(*pw);
|
|
|
|
return 0;
|
|
|
|
}
|
1992-08-14 09:06:52 -03:00
|
|
|
return 1; /* Can't do it */
|
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2002-11-19 16:49:15 -04:00
|
|
|
long_long(PyObject *v)
|
1992-09-12 08:09:23 -03:00
|
|
|
{
|
2005-04-26 00:45:26 -03:00
|
|
|
if (PyLong_CheckExact(v))
|
|
|
|
Py_INCREF(v);
|
|
|
|
else
|
|
|
|
v = _PyLong_Copy((PyLongObject *)v);
|
2002-11-19 16:49:15 -04:00
|
|
|
return v;
|
1992-09-12 08:09:23 -03:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2002-11-19 16:49:15 -04:00
|
|
|
long_int(PyObject *v)
|
1992-09-12 08:09:23 -03:00
|
|
|
{
|
2002-11-19 16:49:15 -04:00
|
|
|
long x;
|
|
|
|
x = PyLong_AsLong(v);
|
|
|
|
if (PyErr_Occurred()) {
|
|
|
|
if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
|
|
|
|
PyErr_Clear();
|
|
|
|
if (PyLong_CheckExact(v)) {
|
|
|
|
Py_INCREF(v);
|
|
|
|
return v;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return _PyLong_Copy((PyLongObject *)v);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return PyInt_FromLong(x);
|
1992-09-12 08:09:23 -03:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
long_float(PyObject *v)
|
1992-09-12 08:09:23 -03:00
|
|
|
{
|
1997-02-14 18:54:21 -04:00
|
|
|
double result;
|
1997-05-02 00:12:38 -03:00
|
|
|
result = PyLong_AsDouble(v);
|
2001-09-04 02:14:19 -03:00
|
|
|
if (result == -1.0 && PyErr_Occurred())
|
|
|
|
return NULL;
|
1997-05-02 00:12:38 -03:00
|
|
|
return PyFloat_FromDouble(result);
|
1992-09-12 08:09:23 -03:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
long_oct(PyObject *v)
|
1992-09-12 08:09:23 -03:00
|
|
|
{
|
2008-02-09 21:36:53 -04:00
|
|
|
return _PyLong_Format(v, 8, 1, 0);
|
1992-09-12 08:09:23 -03:00
|
|
|
}
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyObject *
|
2000-07-07 12:53:28 -03:00
|
|
|
long_hex(PyObject *v)
|
1992-09-12 08:09:23 -03:00
|
|
|
{
|
2008-02-09 21:36:53 -04:00
|
|
|
return _PyLong_Format(v, 16, 1, 0);
|
1992-09-12 08:09:23 -03:00
|
|
|
}
|
2002-07-17 13:30:39 -03:00
|
|
|
|
|
|
|
static PyObject *
|
2001-08-29 12:47:46 -03:00
|
|
|
long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
|
1992-09-12 08:09:23 -03:00
|
|
|
|
2001-08-02 01:15:00 -03:00
|
|
|
static PyObject *
|
|
|
|
long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|
|
|
{
|
|
|
|
PyObject *x = NULL;
|
|
|
|
int base = -909; /* unlikely! */
|
2006-02-27 12:46:16 -04:00
|
|
|
static char *kwlist[] = {"x", "base", 0};
|
2001-08-02 01:15:00 -03:00
|
|
|
|
2001-08-29 12:47:46 -03:00
|
|
|
if (type != &PyLong_Type)
|
|
|
|
return long_subtype_new(type, args, kwds); /* Wimp out */
|
2001-08-02 01:15:00 -03:00
|
|
|
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
|
|
|
|
&x, &base))
|
|
|
|
return NULL;
|
|
|
|
if (x == NULL)
|
|
|
|
return PyLong_FromLong(0L);
|
|
|
|
if (base == -909)
|
|
|
|
return PyNumber_Long(x);
|
2008-06-09 01:58:54 -03:00
|
|
|
else if (PyString_Check(x)) {
|
2007-03-06 14:41:12 -04:00
|
|
|
/* Since PyLong_FromString doesn't have a length parameter,
|
|
|
|
* check here for possible NULs in the string. */
|
2008-06-09 01:58:54 -03:00
|
|
|
char *string = PyString_AS_STRING(x);
|
2009-02-15 06:13:41 -04:00
|
|
|
if (strlen(string) != (size_t)PyString_Size(x)) {
|
2007-03-06 14:41:12 -04:00
|
|
|
/* create a repr() of the input string,
|
|
|
|
* just like PyLong_FromString does. */
|
|
|
|
PyObject *srepr;
|
|
|
|
srepr = PyObject_Repr(x);
|
|
|
|
if (srepr == NULL)
|
|
|
|
return NULL;
|
|
|
|
PyErr_Format(PyExc_ValueError,
|
|
|
|
"invalid literal for long() with base %d: %s",
|
2008-06-09 01:58:54 -03:00
|
|
|
base, PyString_AS_STRING(srepr));
|
2007-03-06 14:41:12 -04:00
|
|
|
Py_DECREF(srepr);
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-06-09 01:58:54 -03:00
|
|
|
return PyLong_FromString(PyString_AS_STRING(x), NULL, base);
|
2007-03-06 14:41:12 -04:00
|
|
|
}
|
2001-08-17 15:39:25 -03:00
|
|
|
#ifdef Py_USING_UNICODE
|
2001-08-02 01:15:00 -03:00
|
|
|
else if (PyUnicode_Check(x))
|
|
|
|
return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
|
|
|
|
PyUnicode_GET_SIZE(x),
|
|
|
|
base);
|
2001-08-17 15:39:25 -03:00
|
|
|
#endif
|
2001-08-02 01:15:00 -03:00
|
|
|
else {
|
|
|
|
PyErr_SetString(PyExc_TypeError,
|
|
|
|
"long() can't convert non-string with explicit base");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-08-29 12:47:46 -03:00
|
|
|
/* Wimpy, slow approach to tp_new calls for subtypes of long:
|
|
|
|
first create a regular long from whatever arguments we got,
|
|
|
|
then allocate a subtype instance and initialize it from
|
|
|
|
the regular long. The regular long is then thrown away.
|
|
|
|
*/
|
|
|
|
static PyObject *
|
|
|
|
long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|
|
|
{
|
2006-04-11 03:54:30 -03:00
|
|
|
PyLongObject *tmp, *newobj;
|
2006-02-15 13:27:45 -04:00
|
|
|
Py_ssize_t i, n;
|
2001-08-29 12:47:46 -03:00
|
|
|
|
|
|
|
assert(PyType_IsSubtype(type, &PyLong_Type));
|
|
|
|
tmp = (PyLongObject *)long_new(&PyLong_Type, args, kwds);
|
|
|
|
if (tmp == NULL)
|
|
|
|
return NULL;
|
2001-09-10 17:52:51 -03:00
|
|
|
assert(PyLong_CheckExact(tmp));
|
2007-12-18 22:37:44 -04:00
|
|
|
n = Py_SIZE(tmp);
|
2001-08-29 12:47:46 -03:00
|
|
|
if (n < 0)
|
|
|
|
n = -n;
|
2006-04-11 03:54:30 -03:00
|
|
|
newobj = (PyLongObject *)type->tp_alloc(type, n);
|
|
|
|
if (newobj == NULL) {
|
2003-06-28 17:04:25 -03:00
|
|
|
Py_DECREF(tmp);
|
2001-08-29 12:47:46 -03:00
|
|
|
return NULL;
|
2003-06-28 17:04:25 -03:00
|
|
|
}
|
2006-04-11 03:54:30 -03:00
|
|
|
assert(PyLong_Check(newobj));
|
2007-12-18 22:37:44 -04:00
|
|
|
Py_SIZE(newobj) = Py_SIZE(tmp);
|
2001-08-29 12:47:46 -03:00
|
|
|
for (i = 0; i < n; i++)
|
2006-04-11 03:54:30 -03:00
|
|
|
newobj->ob_digit[i] = tmp->ob_digit[i];
|
2001-08-29 12:47:46 -03:00
|
|
|
Py_DECREF(tmp);
|
2006-04-11 03:54:30 -03:00
|
|
|
return (PyObject *)newobj;
|
2001-08-29 12:47:46 -03:00
|
|
|
}
|
|
|
|
|
2003-01-29 13:58:45 -04:00
|
|
|
static PyObject *
|
|
|
|
long_getnewargs(PyLongObject *v)
|
|
|
|
{
|
|
|
|
return Py_BuildValue("(N)", _PyLong_Copy(v));
|
|
|
|
}
|
|
|
|
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
static PyObject *
|
2009-05-02 14:55:01 -03:00
|
|
|
long_get0(PyLongObject *v, void *context) {
|
|
|
|
return PyLong_FromLong(0L);
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
long_get1(PyLongObject *v, void *context) {
|
|
|
|
return PyLong_FromLong(1L);
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
}
|
|
|
|
|
Backport of PEP 3101, Advanced String Formatting, from py3k.
Highlights:
- Adding PyObject_Format.
- Adding string.Format class.
- Adding __format__ for str, unicode, int, long, float, datetime.
- Adding builtin format.
- Adding ''.format and u''.format.
- str/unicode fixups for formatters.
The files in Objects/stringlib that implement PEP 3101 (stringdefs.h,
unicodedefs.h, formatter.h, string_format.h) are identical in trunk
and py3k. Any changes from here on should be made to trunk, and
changes will propogate to py3k).
2008-02-17 15:46:49 -04:00
|
|
|
static PyObject *
|
|
|
|
long__format__(PyObject *self, PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *format_spec;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
|
|
|
|
return NULL;
|
2008-05-26 09:51:38 -03:00
|
|
|
if (PyBytes_Check(format_spec))
|
2008-05-30 15:10:04 -03:00
|
|
|
return _PyLong_FormatAdvanced(self,
|
|
|
|
PyBytes_AS_STRING(format_spec),
|
|
|
|
PyBytes_GET_SIZE(format_spec));
|
Backport of PEP 3101, Advanced String Formatting, from py3k.
Highlights:
- Adding PyObject_Format.
- Adding string.Format class.
- Adding __format__ for str, unicode, int, long, float, datetime.
- Adding builtin format.
- Adding ''.format and u''.format.
- str/unicode fixups for formatters.
The files in Objects/stringlib that implement PEP 3101 (stringdefs.h,
unicodedefs.h, formatter.h, string_format.h) are identical in trunk
and py3k. Any changes from here on should be made to trunk, and
changes will propogate to py3k).
2008-02-17 15:46:49 -04:00
|
|
|
if (PyUnicode_Check(format_spec)) {
|
|
|
|
/* Convert format_spec to a str */
|
2008-05-30 15:10:04 -03:00
|
|
|
PyObject *result;
|
|
|
|
PyObject *str_spec = PyObject_Str(format_spec);
|
Backport of PEP 3101, Advanced String Formatting, from py3k.
Highlights:
- Adding PyObject_Format.
- Adding string.Format class.
- Adding __format__ for str, unicode, int, long, float, datetime.
- Adding builtin format.
- Adding ''.format and u''.format.
- str/unicode fixups for formatters.
The files in Objects/stringlib that implement PEP 3101 (stringdefs.h,
unicodedefs.h, formatter.h, string_format.h) are identical in trunk
and py3k. Any changes from here on should be made to trunk, and
changes will propogate to py3k).
2008-02-17 15:46:49 -04:00
|
|
|
|
2008-05-30 15:10:04 -03:00
|
|
|
if (str_spec == NULL)
|
|
|
|
return NULL;
|
Backport of PEP 3101, Advanced String Formatting, from py3k.
Highlights:
- Adding PyObject_Format.
- Adding string.Format class.
- Adding __format__ for str, unicode, int, long, float, datetime.
- Adding builtin format.
- Adding ''.format and u''.format.
- str/unicode fixups for formatters.
The files in Objects/stringlib that implement PEP 3101 (stringdefs.h,
unicodedefs.h, formatter.h, string_format.h) are identical in trunk
and py3k. Any changes from here on should be made to trunk, and
changes will propogate to py3k).
2008-02-17 15:46:49 -04:00
|
|
|
|
2008-05-30 15:10:04 -03:00
|
|
|
result = _PyLong_FormatAdvanced(self,
|
|
|
|
PyBytes_AS_STRING(str_spec),
|
|
|
|
PyBytes_GET_SIZE(str_spec));
|
Backport of PEP 3101, Advanced String Formatting, from py3k.
Highlights:
- Adding PyObject_Format.
- Adding string.Format class.
- Adding __format__ for str, unicode, int, long, float, datetime.
- Adding builtin format.
- Adding ''.format and u''.format.
- str/unicode fixups for formatters.
The files in Objects/stringlib that implement PEP 3101 (stringdefs.h,
unicodedefs.h, formatter.h, string_format.h) are identical in trunk
and py3k. Any changes from here on should be made to trunk, and
changes will propogate to py3k).
2008-02-17 15:46:49 -04:00
|
|
|
|
2008-05-30 15:10:04 -03:00
|
|
|
Py_DECREF(str_spec);
|
Backport of PEP 3101, Advanced String Formatting, from py3k.
Highlights:
- Adding PyObject_Format.
- Adding string.Format class.
- Adding __format__ for str, unicode, int, long, float, datetime.
- Adding builtin format.
- Adding ''.format and u''.format.
- str/unicode fixups for formatters.
The files in Objects/stringlib that implement PEP 3101 (stringdefs.h,
unicodedefs.h, formatter.h, string_format.h) are identical in trunk
and py3k. Any changes from here on should be made to trunk, and
changes will propogate to py3k).
2008-02-17 15:46:49 -04:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2008-06-01 13:16:17 -03:00
|
|
|
static PyObject *
|
|
|
|
long_sizeof(PyLongObject *v)
|
|
|
|
{
|
|
|
|
Py_ssize_t res;
|
|
|
|
|
2009-02-15 06:13:41 -04:00
|
|
|
res = v->ob_type->tp_basicsize + ABS(Py_SIZE(v))*sizeof(digit);
|
2008-06-01 13:16:17 -03:00
|
|
|
return PyInt_FromSsize_t(res);
|
|
|
|
}
|
|
|
|
|
2008-12-17 12:14:37 -04:00
|
|
|
static PyObject *
|
|
|
|
long_bit_length(PyLongObject *v)
|
|
|
|
{
|
|
|
|
PyLongObject *result, *x, *y;
|
|
|
|
Py_ssize_t ndigits, msd_bits = 0;
|
|
|
|
digit msd;
|
|
|
|
|
|
|
|
assert(v != NULL);
|
|
|
|
assert(PyLong_Check(v));
|
|
|
|
|
|
|
|
ndigits = ABS(Py_SIZE(v));
|
|
|
|
if (ndigits == 0)
|
|
|
|
return PyInt_FromLong(0);
|
|
|
|
|
|
|
|
msd = v->ob_digit[ndigits-1];
|
|
|
|
while (msd >= 32) {
|
|
|
|
msd_bits += 6;
|
|
|
|
msd >>= 6;
|
|
|
|
}
|
|
|
|
msd_bits += (long)(BitLengthTable[msd]);
|
|
|
|
|
|
|
|
if (ndigits <= PY_SSIZE_T_MAX/PyLong_SHIFT)
|
|
|
|
return PyInt_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits);
|
|
|
|
|
|
|
|
/* expression above may overflow; use Python integers instead */
|
|
|
|
result = (PyLongObject *)PyLong_FromSsize_t(ndigits - 1);
|
|
|
|
if (result == NULL)
|
|
|
|
return NULL;
|
|
|
|
x = (PyLongObject *)PyLong_FromLong(PyLong_SHIFT);
|
|
|
|
if (x == NULL)
|
|
|
|
goto error;
|
|
|
|
y = (PyLongObject *)long_mul(result, x);
|
|
|
|
Py_DECREF(x);
|
|
|
|
if (y == NULL)
|
|
|
|
goto error;
|
|
|
|
Py_DECREF(result);
|
|
|
|
result = y;
|
|
|
|
|
|
|
|
x = (PyLongObject *)PyLong_FromLong(msd_bits);
|
|
|
|
if (x == NULL)
|
|
|
|
goto error;
|
|
|
|
y = (PyLongObject *)long_add(result, x);
|
|
|
|
Py_DECREF(x);
|
|
|
|
if (y == NULL)
|
|
|
|
goto error;
|
|
|
|
Py_DECREF(result);
|
|
|
|
result = y;
|
|
|
|
|
|
|
|
return (PyObject *)result;
|
|
|
|
|
|
|
|
error:
|
|
|
|
Py_DECREF(result);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
PyDoc_STRVAR(long_bit_length_doc,
|
|
|
|
"long.bit_length() -> int or long\n\
|
|
|
|
\n\
|
|
|
|
Number of bits necessary to represent self in binary.\n\
|
|
|
|
>>> bin(37L)\n\
|
|
|
|
'0b100101'\n\
|
|
|
|
>>> (37L).bit_length()\n\
|
|
|
|
6");
|
|
|
|
|
2008-04-18 20:13:07 -03:00
|
|
|
#if 0
|
|
|
|
static PyObject *
|
|
|
|
long_is_finite(PyObject *v)
|
|
|
|
{
|
|
|
|
Py_RETURN_TRUE;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2003-01-29 13:58:45 -04:00
|
|
|
static PyMethodDef long_methods[] = {
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
{"conjugate", (PyCFunction)long_long, METH_NOARGS,
|
|
|
|
"Returns self, the complex conjugate of any long."},
|
2008-12-17 12:14:37 -04:00
|
|
|
{"bit_length", (PyCFunction)long_bit_length, METH_NOARGS,
|
|
|
|
long_bit_length_doc},
|
2008-04-18 20:13:07 -03:00
|
|
|
#if 0
|
|
|
|
{"is_finite", (PyCFunction)long_is_finite, METH_NOARGS,
|
|
|
|
"Returns always True."},
|
|
|
|
#endif
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
{"__trunc__", (PyCFunction)long_long, METH_NOARGS,
|
|
|
|
"Truncating an Integral returns itself."},
|
2003-01-29 13:58:45 -04:00
|
|
|
{"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
|
Backport of PEP 3101, Advanced String Formatting, from py3k.
Highlights:
- Adding PyObject_Format.
- Adding string.Format class.
- Adding __format__ for str, unicode, int, long, float, datetime.
- Adding builtin format.
- Adding ''.format and u''.format.
- str/unicode fixups for formatters.
The files in Objects/stringlib that implement PEP 3101 (stringdefs.h,
unicodedefs.h, formatter.h, string_format.h) are identical in trunk
and py3k. Any changes from here on should be made to trunk, and
changes will propogate to py3k).
2008-02-17 15:46:49 -04:00
|
|
|
{"__format__", (PyCFunction)long__format__, METH_VARARGS},
|
2008-06-01 13:16:17 -03:00
|
|
|
{"__sizeof__", (PyCFunction)long_sizeof, METH_NOARGS,
|
2008-06-01 13:42:16 -03:00
|
|
|
"Returns size in memory, in bytes"},
|
2003-01-29 13:58:45 -04:00
|
|
|
{NULL, NULL} /* sentinel */
|
|
|
|
};
|
|
|
|
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
static PyGetSetDef long_getset[] = {
|
2009-05-02 14:55:01 -03:00
|
|
|
{"real",
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
(getter)long_long, (setter)NULL,
|
|
|
|
"the real part of a complex number",
|
|
|
|
NULL},
|
2009-05-02 14:55:01 -03:00
|
|
|
{"imag",
|
|
|
|
(getter)long_get0, (setter)NULL,
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
"the imaginary part of a complex number",
|
2009-05-02 14:55:01 -03:00
|
|
|
NULL},
|
|
|
|
{"numerator",
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
(getter)long_long, (setter)NULL,
|
|
|
|
"the numerator of a rational number in lowest terms",
|
|
|
|
NULL},
|
2009-05-02 14:55:01 -03:00
|
|
|
{"denominator",
|
|
|
|
(getter)long_get1, (setter)NULL,
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
"the denominator of a rational number in lowest terms",
|
2009-05-02 14:55:01 -03:00
|
|
|
NULL},
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
{NULL} /* Sentinel */
|
|
|
|
};
|
|
|
|
|
2002-06-13 17:33:02 -03:00
|
|
|
PyDoc_STRVAR(long_doc,
|
2001-08-02 01:15:00 -03:00
|
|
|
"long(x[, base]) -> integer\n\
|
|
|
|
\n\
|
|
|
|
Convert a string or number to a long integer, if possible. A floating\n\
|
|
|
|
point argument will be truncated towards zero (this does not include a\n\
|
|
|
|
string representation of a floating point number!) When converting a\n\
|
|
|
|
string, use the optional base. It is an error to supply a base when\n\
|
2002-06-13 17:33:02 -03:00
|
|
|
converting a non-string.");
|
2001-08-02 01:15:00 -03:00
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
static PyNumberMethods long_as_number = {
|
2000-07-07 12:53:28 -03:00
|
|
|
(binaryfunc) long_add, /*nb_add*/
|
|
|
|
(binaryfunc) long_sub, /*nb_subtract*/
|
|
|
|
(binaryfunc) long_mul, /*nb_multiply*/
|
2006-03-30 07:57:00 -04:00
|
|
|
long_classic_div, /*nb_divide*/
|
|
|
|
long_mod, /*nb_remainder*/
|
|
|
|
long_divmod, /*nb_divmod*/
|
|
|
|
long_pow, /*nb_power*/
|
2000-07-07 12:53:28 -03:00
|
|
|
(unaryfunc) long_neg, /*nb_negative*/
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
(unaryfunc) long_long, /*tp_positive*/
|
2000-07-07 12:53:28 -03:00
|
|
|
(unaryfunc) long_abs, /*tp_absolute*/
|
|
|
|
(inquiry) long_nonzero, /*tp_nonzero*/
|
|
|
|
(unaryfunc) long_invert, /*nb_invert*/
|
2006-03-30 07:57:00 -04:00
|
|
|
long_lshift, /*nb_lshift*/
|
2000-07-07 12:53:28 -03:00
|
|
|
(binaryfunc) long_rshift, /*nb_rshift*/
|
2006-03-30 07:57:00 -04:00
|
|
|
long_and, /*nb_and*/
|
|
|
|
long_xor, /*nb_xor*/
|
|
|
|
long_or, /*nb_or*/
|
|
|
|
long_coerce, /*nb_coerce*/
|
|
|
|
long_int, /*nb_int*/
|
|
|
|
long_long, /*nb_long*/
|
|
|
|
long_float, /*nb_float*/
|
|
|
|
long_oct, /*nb_oct*/
|
|
|
|
long_hex, /*nb_hex*/
|
2001-08-08 02:00:18 -03:00
|
|
|
0, /* nb_inplace_add */
|
|
|
|
0, /* nb_inplace_subtract */
|
|
|
|
0, /* nb_inplace_multiply */
|
|
|
|
0, /* nb_inplace_divide */
|
|
|
|
0, /* nb_inplace_remainder */
|
|
|
|
0, /* nb_inplace_power */
|
|
|
|
0, /* nb_inplace_lshift */
|
|
|
|
0, /* nb_inplace_rshift */
|
|
|
|
0, /* nb_inplace_and */
|
|
|
|
0, /* nb_inplace_xor */
|
|
|
|
0, /* nb_inplace_or */
|
2006-03-30 07:57:00 -04:00
|
|
|
long_div, /* nb_floor_divide */
|
2001-08-08 02:00:18 -03:00
|
|
|
long_true_divide, /* nb_true_divide */
|
|
|
|
0, /* nb_inplace_floor_divide */
|
|
|
|
0, /* nb_inplace_true_divide */
|
2006-08-12 14:03:09 -03:00
|
|
|
long_long, /* nb_index */
|
1991-05-05 17:09:44 -03:00
|
|
|
};
|
|
|
|
|
1997-05-02 00:12:38 -03:00
|
|
|
PyTypeObject PyLong_Type = {
|
|
|
|
PyObject_HEAD_INIT(&PyType_Type)
|
2001-08-02 01:15:00 -03:00
|
|
|
0, /* ob_size */
|
|
|
|
"long", /* tp_name */
|
2009-02-15 06:13:41 -04:00
|
|
|
offsetof(PyLongObject, ob_digit), /* tp_basicsize */
|
2001-08-02 01:15:00 -03:00
|
|
|
sizeof(digit), /* tp_itemsize */
|
2006-03-30 07:57:00 -04:00
|
|
|
long_dealloc, /* tp_dealloc */
|
2001-08-02 01:15:00 -03:00
|
|
|
0, /* tp_print */
|
|
|
|
0, /* tp_getattr */
|
|
|
|
0, /* tp_setattr */
|
|
|
|
(cmpfunc)long_compare, /* tp_compare */
|
2006-03-30 07:57:00 -04:00
|
|
|
long_repr, /* tp_repr */
|
2001-08-02 01:15:00 -03:00
|
|
|
&long_as_number, /* tp_as_number */
|
|
|
|
0, /* tp_as_sequence */
|
|
|
|
0, /* tp_as_mapping */
|
|
|
|
(hashfunc)long_hash, /* tp_hash */
|
|
|
|
0, /* tp_call */
|
2006-03-30 07:57:00 -04:00
|
|
|
long_str, /* tp_str */
|
2001-08-02 01:15:00 -03:00
|
|
|
PyObject_GenericGetAttr, /* tp_getattro */
|
|
|
|
0, /* tp_setattro */
|
|
|
|
0, /* tp_as_buffer */
|
2001-08-29 12:47:46 -03:00
|
|
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
|
2007-02-25 15:44:48 -04:00
|
|
|
Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */
|
2001-08-02 01:15:00 -03:00
|
|
|
long_doc, /* tp_doc */
|
|
|
|
0, /* tp_traverse */
|
|
|
|
0, /* tp_clear */
|
|
|
|
0, /* tp_richcompare */
|
|
|
|
0, /* tp_weaklistoffset */
|
|
|
|
0, /* tp_iter */
|
|
|
|
0, /* tp_iternext */
|
2003-01-29 13:58:45 -04:00
|
|
|
long_methods, /* tp_methods */
|
2001-08-02 01:15:00 -03:00
|
|
|
0, /* tp_members */
|
Backport PEP 3141 from the py3k branch to the trunk. This includes r50877 (just
the complex_pow part), r56649, r56652, r56715, r57296, r57302, r57359, r57361,
r57372, r57738, r57739, r58017, r58039, r58040, and r59390, and new
documentation. The only significant difference is that round(x) returns a float
to preserve backward-compatibility. See http://bugs.python.org/issue1689.
2008-01-02 22:21:52 -04:00
|
|
|
long_getset, /* tp_getset */
|
2001-08-02 01:15:00 -03:00
|
|
|
0, /* tp_base */
|
|
|
|
0, /* tp_dict */
|
|
|
|
0, /* tp_descr_get */
|
|
|
|
0, /* tp_descr_set */
|
|
|
|
0, /* tp_dictoffset */
|
|
|
|
0, /* tp_init */
|
|
|
|
0, /* tp_alloc */
|
|
|
|
long_new, /* tp_new */
|
2002-04-11 23:44:10 -03:00
|
|
|
PyObject_Del, /* tp_free */
|
1991-05-05 17:09:44 -03:00
|
|
|
};
|
2009-03-20 12:51:55 -03:00
|
|
|
|
|
|
|
static PyTypeObject Long_InfoType;
|
|
|
|
|
|
|
|
PyDoc_STRVAR(long_info__doc__,
|
|
|
|
"sys.long_info\n\
|
|
|
|
\n\
|
|
|
|
A struct sequence that holds information about Python's\n\
|
|
|
|
internal representation of integers. The attributes are read only.");
|
|
|
|
|
|
|
|
static PyStructSequence_Field long_info_fields[] = {
|
|
|
|
{"bits_per_digit", "size of a digit in bits"},
|
|
|
|
{"sizeof_digit", "size in bytes of the C type used to "
|
|
|
|
"represent a digit"},
|
|
|
|
{NULL, NULL}
|
|
|
|
};
|
|
|
|
|
|
|
|
static PyStructSequence_Desc long_info_desc = {
|
|
|
|
"sys.long_info", /* name */
|
|
|
|
long_info__doc__, /* doc */
|
|
|
|
long_info_fields, /* fields */
|
|
|
|
2 /* number of fields */
|
|
|
|
};
|
|
|
|
|
|
|
|
PyObject *
|
|
|
|
PyLong_GetInfo(void)
|
|
|
|
{
|
|
|
|
PyObject* long_info;
|
|
|
|
int field = 0;
|
|
|
|
long_info = PyStructSequence_New(&Long_InfoType);
|
|
|
|
if (long_info == NULL)
|
|
|
|
return NULL;
|
2009-04-02 15:39:37 -03:00
|
|
|
PyStructSequence_SET_ITEM(long_info, field++,
|
|
|
|
PyInt_FromLong(PyLong_SHIFT));
|
|
|
|
PyStructSequence_SET_ITEM(long_info, field++,
|
|
|
|
PyInt_FromLong(sizeof(digit)));
|
2009-03-20 12:51:55 -03:00
|
|
|
if (PyErr_Occurred()) {
|
|
|
|
Py_CLEAR(long_info);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return long_info;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
_PyLong_Init(void)
|
|
|
|
{
|
|
|
|
/* initialize long_info */
|
|
|
|
if (Long_InfoType.tp_name == 0)
|
|
|
|
PyStructSequence_InitType(&Long_InfoType, &long_info_desc);
|
|
|
|
return 1;
|
|
|
|
}
|