/** @file
Long (arbitrary precision) integer object implementation.
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
/* XXX The functional organization of this file is terrible */
#include "Python.h"
#include "longintrepr.h"
#include "structseq.h"
#include <float.h>
#include <ctype.h>
#include <stddef.h>
/* For long multiplication, use the O(N**2) school algorithm unless
* both operands contain more than KARATSUBA_CUTOFF digits (this
* being an internal Python long digit, in base PyLong_BASE).
*/
/* 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.
*/
#ifndef ABS
#define ABS(x) ((x) < 0 ? -(x) : (x))
#endif
#ifndef MAX
#define MAX(x, y) ((x) < (y) ? (y) : (x))
#endif
#ifndef MIN
#define MIN(x, y) ((x) > (y) ? (y) : (x))
#endif
do { \
if (--_Py_Ticker < 0) { \
if (PyErr_CheckSignals()) PyTryBlock \
} \
} while(0)
/* 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. */
static PyLongObject *
{
Py_ssize_t i = j;
while (i > 0 && v->ob_digit[i-1] == 0)
--i;
if (i != j)
return v;
}
/* Allocate a new long int object with size digits.
Return NULL and set exception if we run out of memory. */
#define MAX_LONG_DIGITS \
{
"too many digits in integer");
return NULL;
}
/* coverity[ampersand_in_size] */
/* XXX(nnorwitz): PyObject_NEW_VAR / _PyObject_VAR_SIZE need to detect
overflow */
}
PyObject *
{
Py_ssize_t i;
if (i < 0)
i = -(i);
result = _PyLong_New(i);
while (--i >= 0)
}
}
/* Create a new long int object from a C long int */
PyObject *
{
PyLongObject *v;
unsigned long abs_ival;
unsigned long t; /* unsigned so >> doesn't propagate sign bit */
int ndigits = 0;
int negative = 0;
if (ival < 0) {
/* 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. */
negative = 1;
}
else {
}
/* 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. */
t = abs_ival;
while (t) {
++ndigits;
t >>= PyLong_SHIFT;
}
v = _PyLong_New(ndigits);
if (v != NULL) {
t = abs_ival;
while (t) {
*p++ = (digit)(t & PyLong_MASK);
t >>= PyLong_SHIFT;
}
}
return (PyObject *)v;
}
/* Create a new long int object from a C unsigned long int */
PyObject *
{
PyLongObject *v;
unsigned long t;
int ndigits = 0;
/* Count the number of Python digits. */
t = (unsigned long)ival;
while (t) {
++ndigits;
t >>= PyLong_SHIFT;
}
v = _PyLong_New(ndigits);
if (v != NULL) {
while (ival) {
}
}
return (PyObject *)v;
}
/* Create a new long int object from a C double */
PyObject *
{
PyLongObject *v;
double frac;
neg = 0;
if (Py_IS_INFINITY(dval)) {
"cannot convert float infinity to integer");
return NULL;
}
"cannot convert float NaN to integer");
return NULL;
}
if (dval < 0.0) {
neg = 1;
}
if (expo <= 0)
return PyLong_FromLong(0L);
v = _PyLong_New(ndig);
if (v == NULL)
return NULL;
for (i = ndig; --i >= 0; ) {
}
if (neg)
return (PyObject *)v;
}
/* 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-".
*/
/* 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.
*/
long
{
/* This version by Tim Peters */
register PyLongObject *v;
unsigned long x, prev;
long res;
Py_ssize_t i;
int sign;
*overflow = 0;
return -1;
}
if(PyInt_Check(vv))
return PyInt_AsLong(vv);
if (!PyLong_Check(vv)) {
"an integer is required");
return -1;
}
return -1;
do_decref = 1;
if(PyInt_Check(vv)) {
goto exit;
}
if (!PyLong_Check(vv)) {
"nb_int should return int object");
return -1;
}
}
res = -1;
v = (PyLongObject *)vv;
i = Py_SIZE(v);
switch (i) {
case -1:
break;
case 0:
res = 0;
break;
case 1:
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) {
goto exit;
}
}
/* Haven't lost any bits, but casting to long requires extra
* care (see comment above).
*/
if (x <= (unsigned long)LONG_MAX) {
}
else if (sign < 0 && x == PY_ABS_LONG_MIN) {
}
else {
/* res is already set to -1 */
}
}
exit:
if (do_decref) {
}
return res;
}
/* Get a C long int from a long int object.
Returns -1 and sets an error condition if overflow occurs. */
long
{
int overflow;
if (overflow) {
/* XXX: could be cute and give a different
message for overflow == -1 */
"Python int too large to convert to C long");
}
return result;
}
/* Get a Py_ssize_t from a long int object.
Returns -1 and sets an error condition if overflow occurs. */
register PyLongObject *v;
Py_ssize_t i;
int sign;
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;
x = (x << PyLong_SHIFT) | v->ob_digit[i];
if ((x >> PyLong_SHIFT) != prev)
goto overflow;
}
/* Haven't lost any bits, but casting to a signed type requires
* extra care (see comment above).
*/
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 */
"long int too large to convert to int");
return -1;
}
/* Get a C unsigned long int from a long int object.
Returns -1 and sets an error condition if overflow occurs. */
unsigned long
{
register PyLongObject *v;
unsigned long x, prev;
Py_ssize_t i;
if (val < 0) {
"can't convert negative value "
"to unsigned long");
return (unsigned long) -1;
}
return val;
}
return (unsigned long) -1;
}
v = (PyLongObject *)vv;
i = Py_SIZE(v);
x = 0;
if (i < 0) {
"can't convert negative value to unsigned long");
return (unsigned long) -1;
}
while (--i >= 0) {
prev = x;
x = (x << PyLong_SHIFT) | v->ob_digit[i];
if ((x >> PyLong_SHIFT) != prev) {
"long int too large to convert");
return (unsigned long) -1;
}
}
return x;
}
/* 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
{
register PyLongObject *v;
unsigned long x;
Py_ssize_t i;
int sign;
return PyInt_AsUnsignedLongMask(vv);
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) {
x = (x << PyLong_SHIFT) | v->ob_digit[i];
}
return x * sign;
}
int
{
assert(PyLong_Check(v));
}
{
assert(PyLong_Check(v));
if (ndigits > 0) {
goto Overflow;
do {
++result;
if (result == 0)
goto Overflow;
msd >>= 1;
} while (msd);
}
return result;
"to express in a platform size_t");
return (size_t)-1;
}
PyObject *
int little_endian, int is_signed)
{
PyLongObject* v; /* result */
if (n == 0)
return PyLong_FromLong(0L);
if (little_endian) {
pstartbyte = bytes;
incr = 1;
}
else {
incr = -1;
}
if (is_signed)
/* Compute numsignificantbytes. This consists of finding the most
significant byte. Leading 0 bytes are insignificant if the number
is positive, and leading 0xff bytes if negative. */
{
size_t i;
const unsigned char* p = pendbyte;
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)
}
/* How many Python long digits do we need? We have
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 */
"byte array too long to convert to int");
return NULL;
}
v = _PyLong_New(ndigits);
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;
const unsigned char* p = pstartbyte;
for (i = 0; i < numsignificantbytes; ++i, p += incr) {
/* Compute correction for 2's comp, if needed. */
if (is_signed) {
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. */
accumbits += 8;
if (accumbits >= PyLong_SHIFT) {
/* There's enough to fill a Python digit. */
++idigit;
}
}
if (accumbits) {
++idigit;
}
}
return (PyObject *)long_normalize(v);
}
int
int little_endian, int is_signed)
{
Py_ssize_t i; /* index into v->ob_digit */
size_t j; /* # bytes filled */
unsigned char* p; /* pointer to next byte in bytes */
if (Py_SIZE(v) < 0) {
if (!is_signed) {
"can't convert negative long to unsigned");
return -1;
}
do_twos_comp = 1;
}
else {
do_twos_comp = 0;
}
if (little_endian) {
p = bytes;
pincr = 1;
}
else {
p = bytes + n - 1;
pincr = -1;
}
/* Copy over all the Python digits.
It's crucial that every Python digit except for the MSD contribute
exactly PyLong_SHIFT bits to the total, so first assert that the long is
normalized. */
j = 0;
accum = 0;
accumbits = 0;
for (i = 0; i < ndigits; ++i) {
if (do_twos_comp) {
thisdigit &= PyLong_MASK;
}
/* Because we're going LSB to MSB, thisdigit is more
significant than what's already in accum, so needs to be
prepended to accum. */
/* The most-significant digit may be (probably is) at least
partly empty. */
if (i == ndigits - 1) {
/* Count # of sign bits -- they needn't be stored,
* although for signed conversion we need later to
* make sure at least one sign bit gets stored. */
while (s != 0) {
s >>= 1;
accumbits++;
}
}
else
/* Store as many bytes as possible. */
while (accumbits >= 8) {
if (j >= n)
goto Overflow;
++j;
*p = (unsigned char)(accum & 0xff);
p += pincr;
accumbits -= 8;
accum >>= 8;
}
}
/* Store the straggler (if any). */
if (accumbits > 0) {
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). */
}
*p = (unsigned char)(accum & 0xff);
p += pincr;
}
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. */
if (sign_bit_set == do_twos_comp)
return 0;
else
goto Overflow;
}
/* Fill remaining bytes with copies of the sign bit. */
{
for ( ; j < n; ++j, p += pincr)
*p = signbyte;
}
return 0;
return -1;
}
/* Create a new long (or int) object from a C pointer */
PyObject *
PyLong_FromVoidPtr(void *p)
{
#if SIZEOF_VOID_P <= SIZEOF_LONG
if ((long)p < 0)
return PyLong_FromUnsignedLong((unsigned long)p);
return PyInt_FromLong((long)p);
#else
#ifndef HAVE_LONG_LONG
# error "PyLong_FromVoidPtr: sizeof(void*) > sizeof(long), but no long long"
#endif
# error "PyLong_FromVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
#endif
/* optimize null pointers */
if (p == NULL)
return PyInt_FromLong(0);
return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)p);
#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
}
/* Get a C pointer from a long object (or an int object in some cases) */
void *
{
/* 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"
*/
#if SIZEOF_VOID_P <= SIZEOF_LONG
long x;
if (PyInt_Check(vv))
x = PyInt_AS_LONG(vv);
x = PyLong_AsLong(vv);
else
x = PyLong_AsUnsignedLong(vv);
#else
#ifndef HAVE_LONG_LONG
# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
#endif
# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
#endif
PY_LONG_LONG x;
if (PyInt_Check(vv))
x = PyInt_AS_LONG(vv);
x = PyLong_AsLongLong(vv);
else
x = PyLong_AsUnsignedLongLong(vv);
#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
if (x == -1 && PyErr_Occurred())
return NULL;
return (void *)x;
}
#ifdef HAVE_LONG_LONG
/* Initial PY_LONG_LONG support by Chris Herborth (chrish@qnx.com), later
* rewritten to use the newer PyLong_{As,From}ByteArray API.
*/
/* Create a new long int object from a C PY_LONG_LONG int. */
PyObject *
{
PyLongObject *v;
unsigned PY_LONG_LONG t; /* unsigned so >> doesn't propagate sign bit */
int ndigits = 0;
int negative = 0;
if (ival < 0) {
/* avoid signed overflow on negation; see comments
in PyLong_FromLong above. */
negative = 1;
}
else {
}
/* 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. */
t = abs_ival;
while (t) {
++ndigits;
t >>= PyLong_SHIFT;
}
v = _PyLong_New(ndigits);
if (v != NULL) {
t = abs_ival;
while (t) {
*p++ = (digit)(t & PyLong_MASK);
t >>= PyLong_SHIFT;
}
}
return (PyObject *)v;
}
/* Create a new long int object from a C unsigned PY_LONG_LONG int. */
PyObject *
{
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;
t >>= PyLong_SHIFT;
}
v = _PyLong_New(ndigits);
if (v != NULL) {
while (ival) {
}
}
return (PyObject *)v;
}
/* Create a new long int object from a C Py_ssize_t. */
PyObject *
{
return _PyLong_FromByteArray((unsigned char *)&bytes,
}
/* Create a new long int object from a C size_t. */
PyObject *
{
return _PyLong_FromByteArray((unsigned char *)&bytes,
}
/* Get a C PY_LONG_LONG int from a long int object.
Return -1 and set an error if overflow occurs. */
{
int res;
return -1;
}
if (!PyLong_Check(vv)) {
if (PyInt_Check(vv))
return -1;
}
return -1;
if (PyInt_Check(io)) {
return bytes;
}
if (PyLong_Check(io)) {
return bytes;
}
return -1;
}
/* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
if (res < 0)
return (PY_LONG_LONG)-1;
else
return bytes;
}
/* Get a C unsigned PY_LONG_LONG int from a long int object.
Return -1 and set an error if overflow occurs. */
unsigned PY_LONG_LONG
{
int res;
return (unsigned PY_LONG_LONG)-1;
}
/* Plan 9 can't handle PY_LONG_LONG in ? : expressions */
if (res < 0)
return (unsigned PY_LONG_LONG)res;
else
return bytes;
}
/* 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
{
register PyLongObject *v;
unsigned PY_LONG_LONG x;
Py_ssize_t i;
int sign;
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) {
x = (x << PyLong_SHIFT) | v->ob_digit[i];
}
return x * sign;
}
/* Get a C long 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.
*/
{
/* This version by Tim Peters */
register PyLongObject *v;
Py_ssize_t i;
int sign;
*overflow = 0;
return -1;
}
if (PyInt_Check(vv))
return PyInt_AsLong(vv);
if (!PyLong_Check(vv)) {
"an integer is required");
return -1;
}
return -1;
do_decref = 1;
if(PyInt_Check(vv)) {
goto exit;
}
if (!PyLong_Check(vv)) {
"nb_int should return int object");
return -1;
}
}
res = -1;
v = (PyLongObject *)vv;
i = Py_SIZE(v);
switch (i) {
case -1:
break;
case 0:
res = 0;
break;
case 1:
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) {
goto exit;
}
}
/* Haven't lost any bits, but casting to long requires extra
* care (see comment above).
*/
if (x <= (unsigned PY_LONG_LONG)PY_LLONG_MAX) {
}
else if (sign < 0 && x == PY_ABS_LLONG_MIN) {
res = PY_LLONG_MIN;
}
else {
/* res is already set to -1 */
}
}
exit:
if (do_decref) {
}
return res;
}
#endif /* HAVE_LONG_LONG */
static int
if (PyLong_Check(v)) {
*a = (PyLongObject *) v;
Py_INCREF(v);
}
else if (PyInt_Check(v)) {
}
else {
return 0;
}
if (PyLong_Check(w)) {
*b = (PyLongObject *) w;
Py_INCREF(w);
}
else if (PyInt_Check(w)) {
}
else {
Py_DECREF(*a);
return 0;
}
return 1;
}
#define CONVERT_BINOP(v, w, a, b) \
do { \
if (!convert_binop(v, w, a, b)) { \
return Py_NotImplemented; \
} \
} while(0) \
/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
2**k if d is nonzero, else 0. */
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
{
int d_bits = 0;
while (d >= 32) {
d_bits += 6;
d >>= 6;
}
d_bits += (int)BitLengthTable[d];
return d_bits;
}
/* 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
{
Py_ssize_t i;
assert(m >= n);
for (i = 0; i < n; ++i) {
carry += x[i] + y[i];
x[i] = carry & PyLong_MASK;
}
for (; carry && i < m; ++i) {
carry += x[i];
x[i] = carry & PyLong_MASK;
}
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
{
Py_ssize_t i;
assert(m >= n);
for (i = 0; i < n; ++i) {
x[i] = borrow & PyLong_MASK;
}
for (; borrow && i < m; ++i) {
x[i] = borrow & PyLong_MASK;
borrow &= 1;
}
return borrow;
}
/* 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
{
Py_ssize_t i;
assert(0 <= d && d < PyLong_SHIFT);
for (i=0; i < m; i++) {
}
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
{
Py_ssize_t i;
assert(0 <= d && d < PyLong_SHIFT);
for (i=m; i-- > 0;) {
}
return carry;
}
/* 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.
_PyLong_Format, but that should be done with great care since longs are
immutable. */
static digit
{
assert(n > 0 && n <= PyLong_MASK);
while (--size >= 0) {
}
}
/* 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. */
static PyLongObject *
{
PyLongObject *z;
assert(n > 0 && n <= PyLong_MASK);
z = _PyLong_New(size);
if (z == NULL)
return NULL;
return long_normalize(z);
}
/* 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 *
{
char *p;
int negative;
a = (PyLongObject *)aa;
if (a == NULL || !PyLong_Check(a)) {
return NULL;
}
/* 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
*/
"long is too large to format");
return NULL;
}
/* the expression size_a * PyLong_SHIFT is now safe from overflow */
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). */
size = 0;
for (i = size_a; --i >= 0; ) {
for (j = 0; j < size; j++) {
}
while (hi) {
}
/* check for keyboard interrupt */
SIGCHECK({
return NULL;
});
}
/* pout should have at least one digit, so that the case when a = 0
works correctly */
if (size == 0)
/* calculate exact length of output string, and allocate */
tenpow = 10;
tenpow *= 10;
strlen++;
}
return NULL;
}
/* fill the string right-to-left */
*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++) {
for (j = 0; j < _PyLong_DECIMAL_SHIFT; j++) {
rem /= 10;
}
}
/* pout[size-1]: always produce at least one decimal digit */
do {
rem /= 10;
} while (rem != 0);
/* and sign */
if (negative)
*--p = '-';
/* check we've counted correctly */
}
/* 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" */
{
char *p;
int bits;
if (base == 10)
if (a == NULL || !PyLong_Check(a)) {
return NULL;
}
/* Compute a rough upper bound for the length of the string */
i = base;
bits = 0;
while (i > 1) {
++bits;
i >>= 1;
}
/* ensure we don't get signed overflow in sz calculation */
"long is too large to format");
return NULL;
}
return NULL;
*p = '\0';
if (addL)
*--p = 'L';
if (a->ob_size < 0)
sign = '-';
if (a->ob_size == 0) {
*--p = '0';
}
/* JRH: special case for power-of-2 bases */
i = base;
while ((i >>= 1) > 1)
++basebits;
for (i = 0; i < size_a; ++i) {
do {
*--p = cdigit;
}
}
else {
/* 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. */
/* powbasw <- largest power of base that fits in a digit. */
for (;;) {
if (newpow >> PyLong_SHIFT)
/* doesn't fit in a digit */
break;
++power;
}
/* Get a scratch area for repeated division. */
return NULL;
}
/* Repeatedly divide by powbase. */
do {
--size;
SIGCHECK({
return NULL;
});
/* Break rem into digits. */
do {
c += (c < 10) ? '0' : 'a'-10;
*--p = c;
--ntostore;
/* Termination is a bit delicate: must not
store leading zeroes, so must get out if
remaining quotient and rem are both 0. */
} while (size != 0);
}
if (base == 2) {
*--p = 'b';
*--p = '0';
}
else if (base == 8) {
if (newstyle) {
*--p = 'o';
*--p = '0';
}
else
if (size_a != 0)
*--p = '0';
}
else if (base == 16) {
*--p = 'x';
*--p = '0';
}
else if (base != 10) {
*--p = '#';
if (base > 10)
}
if (sign)
*--p = sign;
if (p != PyString_AS_STRING(str)) {
char *q = PyString_AS_STRING(str);
assert(p > q);
do {
} while ((*q++ = *p++) != '\0');
q--;
}
}
/* 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.
*/
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
* 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 *
{
char *p = *str;
char *start = p;
int bits_per_char;
Py_ssize_t n;
PyLongObject *z;
int bits_in_accum;
n = base;
n >>= 1;
/* n <- total # of bits needed, while setting p to end-of-string */
++p;
*str = p;
/* n <- # of Python digits needed, = ceiling(n/PyLong_SHIFT). */
if (n / bits_per_char < p - start) {
"long string too large to convert");
return NULL;
}
n = n / PyLong_SHIFT;
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;
while (--p >= start) {
int k = _PyLong_DigitValue[Py_CHARMASK(*p)];
if (bits_in_accum >= PyLong_SHIFT) {
}
}
if (bits_in_accum) {
}
*pdigit++ = 0;
return long_normalize(z);
}
PyObject *
{
PyLongObject *z;
"long() arg 2 must be >= 2 and <= 36");
return NULL;
}
str++;
if (*str == '+')
++str;
else if (*str == '-') {
++str;
sign = -1;
}
str++;
if (base == 0) {
/* No base given. Deduce the base from the contents
of the string */
if (str[0] != '0')
base = 10;
base = 16;
base = 8;
base = 2;
else
/* "old" (C-style) octal literal, still valid in
2.x, although illegal in 3.x */
base = 8;
}
/* Whether or not we were deducing the base, skip leading chars
as needed */
if (str[0] == '0' &&
str += 2;
else {
/***
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.
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)
The static array log_base_PyLong_BASE[base] == log(base)/log(PyLong_BASE) so
we can compute 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:
convwidth_base[base] = the largest integer i such that
base**i <= PyLong_BASE
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].
Error analysis: as above, the number of Python digits `n` needed is worst-
case
n >= N * log(B)/log(PyLong_BASE)
where `N` is the number of input digits in base `B`. This is computed via
size_z = (Py_ssize_t)((scan - str) * log_base_PyLong_BASE[base]) + 1;
below. Two numeric concerns are how much space this can waste, and whether
the computed result can be too small. To be concrete, assume PyLong_BASE =
2**15, 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
digits is about a factor of B, but B is small compared to PyLong_BASE so at
most one allocated Python digit can remain unused on that count. If
N*log(B)/log(PyLong_BASE) is mathematically an exact integer, then truncating
that 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 B
is not a power of 2 (i.e., it's impossible for N*log(B)/log(PyLong_BASE) to be
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).
The computed result can be too small if the true value of
N*log(B)/log(PyLong_BASE) is a little bit larger than an exact integer, but
due to roundoff errors (in computing log(B), log(PyLong_BASE), their quotient,
integer. Unfortunately, "how close can a transcendental function get to an
integer over some range?" questions are generally theoretically intractable.
Computer analysis via continued fractions is practical: expand
log(B)/log(PyLong_BASE) via continued fractions, giving a sequence i/j of "the
best" rational approximations. Then j*log(B)/log(PyLong_BASE) is
approximately equal to (the integer) i. This shows that 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.
***/
register twodigits c; /* current input character */
int i;
int convwidth;
char* scan;
int i = 1;
log((double)PyLong_BASE));
for (;;) {
if (next > PyLong_BASE)
break;
++i;
}
assert(i > 0);
convwidth_base[base] = i;
}
/* Find length of the string of numeric characters. */
++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.
*/
/* Uncomment next line to test exceedingly rare copy code */
/* size_z = 1; */
z = _PyLong_New(size_z);
if (z == NULL)
return NULL;
Py_SIZE(z) = 0;
/* `convwidth` consecutive input digits are treated as a single
* digit in base `convmultmax`.
*/
/* Work ;-) */
/* grab up to convwidth digits from the input string */
assert(c < PyLong_BASE);
}
/* Calculate the shift only if we couldn't get
* convwidth digits.
*/
if (i != convwidth) {
for ( ; i > 1; --i)
}
/* Multiply z by convmult, and add c. */
c >>= PyLong_SHIFT;
}
/* carry off the current end? */
if (c) {
assert(c < PyLong_BASE);
++Py_SIZE(z);
}
else {
/* Extremely rare. Get more space. */
Py_DECREF(z);
return NULL;
}
z->ob_digit,
Py_DECREF(z);
z = tmp;
++size_z;
}
}
}
}
if (z == NULL)
return NULL;
goto onError;
if (sign < 0)
str++;
str++;
if (*str != '\0')
goto onError;
if (pend)
return (PyObject *) z;
Py_XDECREF(z);
return NULL;
return NULL;
"invalid literal for long() with base %d: %s",
return NULL;
}
#ifdef Py_USING_UNICODE
PyObject *
{
return NULL;
return NULL;
}
return result;
}
#endif
/* forward */
static PyLongObject *x_divrem
/* Long division with remainder, top-level routine */
static int
{
PyLongObject *z;
if (size_b == 0) {
"long division or modulo by zero");
return -1;
}
/* |a| < |b|. */
*pdiv = _PyLong_New(0);
return -1;
Py_INCREF(a);
*prem = (PyLongObject *) a;
return 0;
}
if (size_b == 1) {
if (z == NULL)
return -1;
Py_DECREF(z);
return -1;
}
}
else {
if (z == NULL)
return -1;
}
/* 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. */
*pdiv = z;
return 0;
}
/* Unsigned long division with remainder -- the algorithm. The arguments v1
and w1 should satisfy 2 <= ABS(Py_SIZE(w1)) <= ABS(Py_SIZE(v1)). */
static PyLongObject *
{
PyLongObject *v, *w, *a;
int d;
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 */
if (v == NULL) {
return NULL;
}
w = _PyLong_New(size_w);
if (w == NULL) {
Py_DECREF(v);
return NULL;
}
/* 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. */
size_v++;
}
/* 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. */
assert(k >= 0);
a = _PyLong_New(k);
if (a == NULL) {
Py_DECREF(w);
Py_DECREF(v);
return NULL;
}
/* inner loop: divide vk[0:size_w+1] by w0[0:size_w], giving
single-digit quotient q, remainder in vk[0:size_w]. */
SIGCHECK({
Py_DECREF(a);
Py_DECREF(w);
Py_DECREF(v);
return NULL;
});
/* estimate quotient digit q; may overestimate by 1 (rare) */
--q;
r += wm1;
if (r >= PyLong_BASE)
break;
}
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, PyLong_SHIFT);
}
/* add w back if q was too large (this branch taken rarely) */
carry = 0;
for (i = 0; i < size_w; ++i) {
}
--q;
}
/* store quotient digit */
assert(q < PyLong_BASE);
*--ak = q;
}
/* unshift remainder; we reuse w to store the result */
Py_DECREF(v);
*prem = long_normalize(w);
return long_normalize(a);
}
/* For a nonzero PyLong a, express a in the form x * 2**e, with 0.5 <=
abs(x) < 1.0 and e >= 0; return x and put e in *e. Here x is
rounded to DBL_MANT_DIG significant bits using round-half-to-even.
If a == 0, return 0.0 and set *e = 0. If the resulting exponent
e is larger than PY_SSIZE_T_MAX, raise OverflowError and return
-1.0. */
/* attempt to define 2.0**DBL_MANT_DIG as a compile-time constant */
#if DBL_MANT_DIG == 53
#else
#endif
double
{
/* See below for why x_digits is always large enough. */
double dx;
/* Correction term for round-half-to-even rounding. For a digit x,
"x + half_even_correction[x & 7]" gives x rounded to the nearest
multiple of 4, rounding ties to a multiple of 8. */
if (a_size == 0) {
/* Special case for 0: significand 0.0, exponent 0. */
*e = 0;
return 0.0;
}
/* The following is an overflow-free version of the check
"if ((a_size - 1) * PyLong_SHIFT + a_bits > PY_SSIZE_T_MAX) ..." */
goto overflow;
/* Shift the first DBL_MANT_DIG + 2 bits of a into x_digits[0:x_size]
(shifting left if a_bits <= DBL_MANT_DIG + 2).
Number of digits needed for result: write // for floor division.
Then if shifting left, we end up using
1 + a_size + (DBL_MANT_DIG + 2 - a_bits) // PyLong_SHIFT
digits. If shifting right, we use
a_size - (a_bits - DBL_MANT_DIG - 2) // PyLong_SHIFT
digits. Using a_size = 1 + (a_bits - 1) // PyLong_SHIFT along with
the inequalities
m // PyLong_SHIFT + n // PyLong_SHIFT <= (m + n) // PyLong_SHIFT
m // PyLong_SHIFT - n // PyLong_SHIFT <=
1 + (m - n - 1) // PyLong_SHIFT,
valid for any integers m and n, we find that x_size satisfies
x_size <= 2 + (DBL_MANT_DIG + 1) // PyLong_SHIFT
in both cases.
*/
x_size = 0;
while (x_size < shift_digits)
(int)shift_bits);
}
else {
/* For correct rounding below, we need the least significant
bit of x to be 'sticky' for this shift: if any of the bits
shifted out was nonzero, we set the least significant bit
of x. */
if (rem)
x_digits[0] |= 1;
else
while (shift_digits > 0)
if (a->ob_digit[--shift_digits]) {
x_digits[0] |= 1;
break;
}
}
/* Round, and convert to double. */
while (x_size > 0)
/* Rescale; make correction if result is 1.0. */
if (dx == 1.0) {
if (a_bits == PY_SSIZE_T_MAX)
goto overflow;
dx = 0.5;
a_bits += 1;
}
*e = a_bits;
/* exponent > PY_SSIZE_T_MAX */
"huge integer: number of bits overflows a Py_ssize_t");
*e = 0;
return -1.0;
}
/* 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. */
double
{
double x;
if (v == NULL || !PyLong_Check(v)) {
return -1.0;
}
"long int too large to convert to float");
return -1.0;
}
}
/* Methods */
static void
{
}
static PyObject *
{
}
static PyObject *
{
return _PyLong_Format(v, 10, 0, 0);
}
static int
{
}
else {
;
if (i < 0)
sign = 0;
else {
if (Py_SIZE(a) < 0)
}
}
}
static long
{
unsigned long x;
Py_ssize_t i;
int sign;
/* 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);
}
/* 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. */
while (--i >= 0) {
/* Force a native long #-bits (32 or 64) circular shift */
x += v->ob_digit[i];
/* If the addition above overflowed we compensate by
incrementing. This preserves the value modulo
ULONG_MAX. */
if (x < v->ob_digit[i])
x++;
}
x = x * sign;
if (x == (unsigned long)-1)
x = (unsigned long)-2;
return (long)x;
}
/* Add the absolute values of two long integers. */
static PyLongObject *
{
PyLongObject *z;
Py_ssize_t i;
/* Ensure a is the larger of the two: */
}
if (z == NULL)
return NULL;
for (i = 0; i < size_b; ++i) {
}
for (; i < size_a; ++i) {
}
return long_normalize(z);
}
/* Subtract the absolute values of two integers. */
static PyLongObject *
{
PyLongObject *z;
Py_ssize_t i;
/* Ensure a is the larger of the two: */
sign = -1;
}
/* Find highest digit where a and b differ: */
i = size_a;
;
if (i < 0)
return _PyLong_New(0);
sign = -1;
}
}
z = _PyLong_New(size_a);
if (z == NULL)
return NULL;
for (i = 0; i < size_b; ++i) {
/* The following assumes unsigned arithmetic
works module 2**N for some N>PyLong_SHIFT. */
}
for (; i < size_a; ++i) {
}
if (sign < 0)
return long_normalize(z);
}
static PyObject *
{
PyLongObject *a, *b, *z;
if (a->ob_size < 0) {
if (b->ob_size < 0) {
z = x_add(a, b);
}
else
z = x_sub(b, a);
}
else {
if (b->ob_size < 0)
z = x_sub(a, b);
else
z = x_add(a, b);
}
Py_DECREF(a);
Py_DECREF(b);
return (PyObject *)z;
}
static PyObject *
{
PyLongObject *a, *b, *z;
if (a->ob_size < 0) {
if (b->ob_size < 0)
z = x_sub(a, b);
else
z = x_add(a, b);
}
else {
if (b->ob_size < 0)
z = x_add(a, b);
else
z = x_sub(a, b);
}
Py_DECREF(a);
Py_DECREF(b);
return (PyObject *)z;
}
/* Grade school multiplication, ignoring the signs.
* Returns the absolute value of the product, or NULL if error.
*/
static PyLongObject *
{
PyLongObject *z;
Py_ssize_t i;
if (z == NULL)
return NULL;
if (a == b) {
/* Efficient squaring per HAC, Algorithm 14.16:
* 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) {
SIGCHECK({
Py_DECREF(z);
return NULL;
});
/* Now f is added in twice in each column of the
* pyramid it appears. Same as adding f<<1 once.
*/
f <<= 1;
}
if (carry) {
}
if (carry)
}
}
else { /* a is not the same as b -- gradeschool long mult */
for (i = 0; i < size_a; ++i) {
SIGCHECK({
Py_DECREF(z);
return NULL;
});
}
if (carry)
}
}
return long_normalize(z);
}
/* 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
PyLongObject **high,
PyLongObject **low)
{
return -1;
return -1;
}
return 0;
}
/* 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 *
{
Py_ssize_t i;
/* (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
* ah*bh*X*X + (k - ah*bh - al*bl)*X + al*bl
* 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.
*/
/* We want to split based on the larger number; fiddle so that b
* is largest.
*/
t1 = a;
a = b;
b = t1;
i = asize;
bsize = i;
}
/* Use gradeschool math when either number is too small. */
i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF;
if (asize <= i) {
if (asize == 0)
return _PyLong_New(0);
else
return x_mul(a, b);
}
/* 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.
*/
return k_lopsided_mul(a, b);
/* Split a & b into hi & lo pieces. */
if (a == b) {
}
/* 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
* PyLong_BASE**(sizea + sizeb), and so long as the *final* result fits,
* 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. */
#ifdef Py_DEBUG
/* Fill with trash, to catch reference to uninitialized digits. */
#endif
/* 2. t1 <- ah*bh, and copy into high digits of result. */
/* Zero-out the digits higher than the ah*bh copy. */
if (i)
i * sizeof(digit));
/* 3. t2 <- al*bl, and copy into the low digits. */
goto fail;
}
/* Zero out remaining digits. */
if (i)
/* 4 & 5. Subtract ah*bh (t1) and al*bl (t2). We do al*bl first
* because it's fresher in cache.
*/
/* 6. t3 <- (ah+al)(bh+bl), and add into result. */
if (a == b) {
}
goto fail;
}
/* Add t3. It's not obvious why we can't run out of room here.
* See the (*) comment after this function.
*/
return long_normalize(ret);
fail:
Py_XDECREF(ah);
Py_XDECREF(al);
Py_XDECREF(bh);
Py_XDECREF(bl);
return NULL;
}
/* (*) Why adding t3 can't "run out of room" above.
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
digit is enough to hold 2 bits. This is so since PyLong_SHIFT=15 >= 2. If
asize == bsize, then we're asking whether bsize digits is enough to hold
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.
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.
*/
/* 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 backtracking except for the helpful
* single-width slice overlap between successive partial sums).
*/
static PyLongObject *
{
/* Allocate result space, and zero it out. */
return NULL;
/* Successive slices of b are copied into bslice. */
goto fail;
nbdone = 0;
while (bsize > 0) {
/* Multiply the next slice of b by a. */
goto fail;
/* Add into result. */
}
return long_normalize(ret);
fail:
return NULL;
}
static PyObject *
{
PyLongObject *a, *b, *z;
return Py_NotImplemented;
}
z = k_mul(a, b);
/* Negate if exactly one of the inputs is negative. */
Py_DECREF(a);
Py_DECREF(b);
return (PyObject *)z;
}
/* 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
|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
have different signs. We then subtract one from the 'div'
part of the outcome to keep the invariant intact. */
/* 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).
*/
static int
{
return -1;
return -1;
}
return -1;
}
}
else
else
return 0;
}
static PyObject *
{
CONVERT_BINOP(v, w, &a, &b);
Py_DECREF(a);
Py_DECREF(b);
}
static PyObject *
{
CONVERT_BINOP(v, w, &a, &b);
if (Py_DivisionWarningFlag &&
Py_DECREF(a);
Py_DECREF(b);
}
static PyObject *
{
PyLongObject *a, *b, *x;
CONVERT_BINOP(v, w, &a, &b);
/*
Method in a nutshell:
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
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. */
if (b_size == 0) {
"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. */
if (a_is_small && b_is_small) {
while (a_size > 0)
while (b_size > 0)
goto success;
}
/* Catch obvious cases of underflow and overflow */
/* Extreme overflow */
goto overflow;
/* Extreme underflow */
goto underflow_or_zero;
/* Next line is now safe from overflowing a Py_ssize_t */
/* Now diff = a_bits - b_bits. */
if (diff > DBL_MAX_EXP)
goto overflow;
goto underflow_or_zero;
/* Choose value for shift; see comments for step 1 above. */
inexact = 0;
/* x = abs(a * 2**-shift) */
if (shift <= 0) {
/* x = a << -shift */
/* 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. */
"intermediate overflow during division");
goto error;
}
if (x == NULL)
goto error;
for (i = 0; i < shift_digits; i++)
x->ob_digit[i] = 0;
}
else {
/* x = a >> shift */
if (x == NULL)
goto error;
/* 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 //= 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) {
b->ob_digit[0]);
long_normalize(x);
if (rem)
inexact = 1;
}
else {
Py_DECREF(x);
x = div;
if (x == NULL)
goto error;
inexact = 1;
}
/* The number of extra bits that have to be rounded away. */
/* Round by directly modifying the low digit of x. */
/* Convert x to a double dx; the conversion is exact. */
while (x_size > 0)
Py_DECREF(x);
/* Check whether ldexp result will overflow a double. */
goto overflow;
Py_DECREF(a);
Py_DECREF(b);
Py_DECREF(a);
Py_DECREF(b);
"integer division result too large for a float");
Py_DECREF(a);
Py_DECREF(b);
return NULL;
}
static PyObject *
{
CONVERT_BINOP(v, w, &a, &b);
Py_DECREF(a);
Py_DECREF(b);
}
static PyObject *
{
PyObject *z;
CONVERT_BINOP(v, w, &a, &b);
Py_DECREF(a);
Py_DECREF(b);
return NULL;
}
z = PyTuple_New(2);
if (z != NULL) {
}
else {
}
Py_DECREF(a);
Py_DECREF(b);
return z;
}
/* pow(v, w, x) */
static PyObject *
{
PyLongObject *a, *b, *c; /* a,b,c = v,w,x */
Py_ssize_t i, j, k; /* counters */
/* 5-ary values. If the exponent is large enough, table is
* precomputed so that table[i] == a**i % c for i in range(32).
*/
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/* a, b, c = v, w, x */
CONVERT_BINOP(v, w, &a, &b);
if (PyLong_Check(x)) {
c = (PyLongObject *)x;
Py_INCREF(x);
}
else if (PyInt_Check(x)) {
if (c == NULL)
goto Error;
}
else if (x == Py_None)
c = NULL;
else {
Py_DECREF(a);
Py_DECREF(b);
return Py_NotImplemented;
}
if (Py_SIZE(b) < 0) { /* if exponent is negative */
if (c) {
"cannot be negative when 3rd argument specified");
goto Error;
}
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);
}
}
if (c) {
/* if modulus == 0:
raise ValueError() */
if (Py_SIZE(c) == 0) {
"pow() 3rd argument cannot be 0");
goto Error;
}
/* if modulus < 0:
negativeOutput = True
modulus = -modulus */
if (Py_SIZE(c) < 0) {
negativeOutput = 1;
goto Error;
Py_DECREF(c);
c = temp;
}
/* if modulus == 1:
return 0 */
z = (PyLongObject *)PyLong_FromLong(0L);
goto Done;
}
/* if base < 0:
base = base % modulus
Having the base positive just makes things easier. */
if (Py_SIZE(a) < 0) {
goto Error;
Py_DECREF(a);
a = temp;
}
}
/* At this point a, b, and c are guaranteed non-negative UNLESS
c is NULL, in which case a may be negative. */
if (z == NULL)
goto Error;
/* Perform a modular reduction, X = X % c, but leave X alone if c
* is NULL.
*/
#define REDUCE(X) \
do { \
if (c != NULL) { \
goto Error; \
Py_XDECREF(X); \
X = temp; \
} \
} while(0)
/* Multiply two values, then reduce the result:
result = X*Y % c. If c is NULL, skip the mod. */
do { \
goto Error; \
Py_XDECREF(result); \
} while(0)
if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
/* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
for (i = Py_SIZE(b) - 1; i >= 0; --i) {
MULT(z, z, z);
if (bi & j)
MULT(z, a, z);
}
}
}
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)
for (i = Py_SIZE(b) - 1; i >= 0; --i) {
for (k = 0; k < 5; ++k)
MULT(z, z, z);
if (index)
}
}
}
if (negativeOutput && (Py_SIZE(z) != 0)) {
goto Error;
Py_DECREF(z);
z = temp;
}
goto Done;
if (z != NULL) {
Py_DECREF(z);
z = NULL;
}
/* fall through */
Done:
if (Py_SIZE(b) > FIVEARY_CUTOFF) {
for (i = 0; i < 32; ++i)
Py_XDECREF(table[i]);
}
Py_DECREF(a);
Py_DECREF(b);
Py_XDECREF(c);
return (PyObject *)z;
}
static PyObject *
{
/* Implement ~x as -(x+1) */
PyLongObject *x;
PyLongObject *w;
if (w == NULL)
return NULL;
x = (PyLongObject *) long_add(v, w);
Py_DECREF(w);
if (x == NULL)
return NULL;
return (PyObject *)x;
}
static PyObject *
{
PyLongObject *z;
if (v->ob_size == 0 && PyLong_CheckExact(v)) {
/* -0 == 0 */
Py_INCREF(v);
return (PyObject *) v;
}
z = (PyLongObject *)_PyLong_Copy(v);
if (z != NULL)
return (PyObject *)z;
}
static PyObject *
{
if (v->ob_size < 0)
return long_neg(v);
else
}
static int
{
return Py_SIZE(v) != 0;
}
static PyObject *
{
PyLongObject *a, *b;
PyLongObject *z = NULL;
if (Py_SIZE(a) < 0) {
/* Right shifting negative numbers is harder */
goto rshift_error;
goto rshift_error;
}
else {
goto rshift_error;
if (shiftby < 0) {
"negative shift count");
goto rshift_error;
}
if (newsize <= 0) {
z = _PyLong_New(0);
Py_DECREF(a);
Py_DECREF(b);
return (PyObject *)z;
}
z = _PyLong_New(newsize);
if (z == NULL)
goto rshift_error;
if (Py_SIZE(a) < 0)
if (i+1 < newsize)
}
z = long_normalize(z);
}
Py_DECREF(a);
Py_DECREF(b);
return (PyObject *) z;
}
static PyObject *
{
/* This version due to Tim Peters */
PyLongObject *a, *b;
PyLongObject *z = NULL;
CONVERT_BINOP(v, w, &a, &b);
goto lshift_error;
if (shiftby < 0) {
goto lshift_error;
}
/* wordshift, remshift = divmod(shiftby, PyLong_SHIFT) */
if (remshift)
++newsize;
z = _PyLong_New(newsize);
if (z == NULL)
goto lshift_error;
if (a->ob_size < 0)
for (i = 0; i < wordshift; i++)
z->ob_digit[i] = 0;
accum = 0;
}
if (remshift)
else
z = long_normalize(z);
Py_DECREF(a);
Py_DECREF(b);
return (PyObject *) z;
}
/* 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
{
Py_ssize_t i;
for (i = 0; i < m; ++i) {
carry += a[i] ^ PyLong_MASK;
z[i] = carry & PyLong_MASK;
}
}
static PyObject *
int op, /* '&', '|', '^' */
PyLongObject *b)
{
PyLongObject *z;
/* 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. */
if (nega) {
z = _PyLong_New(size_a);
if (z == NULL)
return NULL;
a = z;
}
else
/* Keep reference count consistent. */
Py_INCREF(a);
/* Same for b. */
if (negb) {
z = _PyLong_New(size_b);
if (z == NULL) {
Py_DECREF(a);
return NULL;
}
b = z;
}
else
Py_INCREF(b);
/* Swap a and b if necessary to ensure size_a >= size_b. */
z = a; a = b; b = z;
}
/* 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.
*/
switch (op) {
case '^':
break;
case '&':
break;
case '|':
break;
default:
return NULL;
}
/* We allow an extra digit if z is negative, to make sure that
the final two's complement of z doesn't overflow. */
if (z == NULL) {
Py_DECREF(a);
Py_DECREF(b);
return NULL;
}
/* Compute digits for overlap of a and b. */
switch(op) {
case '&':
for (i = 0; i < size_b; ++i)
break;
case '|':
for (i = 0; i < size_b; ++i)
break;
case '^':
for (i = 0; i < size_b; ++i)
break;
default:
return NULL;
}
/* Copy any remaining digits of a, inverting if necessary. */
for (; i < size_z; ++i)
else if (i < size_z)
/* Complement result if negative. */
if (negz) {
}
Py_DECREF(a);
Py_DECREF(b);
return (PyObject *)long_normalize(z);
}
static PyObject *
{
PyLongObject *a, *b;
PyObject *c;
CONVERT_BINOP(v, w, &a, &b);
c = long_bitwise(a, '&', b);
Py_DECREF(a);
Py_DECREF(b);
return c;
}
static PyObject *
{
PyLongObject *a, *b;
PyObject *c;
CONVERT_BINOP(v, w, &a, &b);
c = long_bitwise(a, '^', b);
Py_DECREF(a);
Py_DECREF(b);
return c;
}
static PyObject *
{
PyLongObject *a, *b;
PyObject *c;
CONVERT_BINOP(v, w, &a, &b);
c = long_bitwise(a, '|', b);
Py_DECREF(a);
Py_DECREF(b);
return c;
}
static int
{
if (PyInt_Check(*pw)) {
return -1;
return 0;
}
else if (PyLong_Check(*pw)) {
return 0;
}
return 1; /* Can't do it */
}
static PyObject *
{
if (PyLong_CheckExact(v))
Py_INCREF(v);
else
v = _PyLong_Copy((PyLongObject *)v);
return v;
}
static PyObject *
{
long x;
x = PyLong_AsLong(v);
if (PyErr_Occurred()) {
PyErr_Clear();
if (PyLong_CheckExact(v)) {
Py_INCREF(v);
return v;
}
else
return _PyLong_Copy((PyLongObject *)v);
}
else
return NULL;
}
return PyInt_FromLong(x);
}
static PyObject *
{
double result;
result = PyLong_AsDouble(v);
return NULL;
return PyFloat_FromDouble(result);
}
static PyObject *
{
}
static PyObject *
{
}
static PyObject *
static PyObject *
{
if (type != &PyLong_Type)
&x, &base))
return NULL;
if (x == NULL)
return PyLong_FromLong(0L);
if (base == -909)
return PyNumber_Long(x);
else if (PyString_Check(x)) {
/* Since PyLong_FromString doesn't have a length parameter,
* check here for possible NULs in the string. */
/* create a repr() of the input string,
* just like PyLong_FromString does. */
srepr = PyObject_Repr(x);
return NULL;
"invalid literal for long() with base %d: %s",
return NULL;
}
}
#ifdef Py_USING_UNICODE
else if (PyUnicode_Check(x))
return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
base);
#endif
else {
"long() can't convert non-string with explicit base");
return NULL;
}
}
/* 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 *
{
Py_ssize_t i, n;
return NULL;
if (n < 0)
n = -n;
return NULL;
}
for (i = 0; i < n; i++)
}
static PyObject *
{
}
static PyObject *
return PyLong_FromLong(0L);
}
static PyObject *
return PyLong_FromLong(1L);
}
static PyObject *
{
return NULL;
if (PyBytes_Check(format_spec))
return _PyLong_FormatAdvanced(self,
if (PyUnicode_Check(format_spec)) {
/* Convert format_spec to a str */
return NULL;
return result;
}
return NULL;
}
static PyObject *
{
return PyInt_FromSsize_t(res);
}
static PyObject *
{
assert(PyLong_Check(v));
if (ndigits == 0)
return PyInt_FromLong(0);
while (msd >= 32) {
msd_bits += 6;
msd >>= 6;
}
/* expression above may overflow; use Python integers instead */
return NULL;
if (x == NULL)
goto error;
Py_DECREF(x);
if (y == NULL)
goto error;
result = y;
if (x == NULL)
goto error;
Py_DECREF(x);
if (y == NULL)
goto error;
result = y;
return NULL;
}
"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");
#if 0
static PyObject *
{
}
#endif
"Returns self, the complex conjugate of any long."},
#if 0
"Returns always True."},
#endif
"Truncating an Integral returns itself."},
"Returns size in memory, in bytes"},
};
{"real",
"the real part of a complex number",
NULL},
{"imag",
"the imaginary part of a complex number",
NULL},
{"numerator",
"the numerator of a rational number in lowest terms",
NULL},
{"denominator",
"the denominator of a rational number in lowest terms",
NULL},
{NULL} /* Sentinel */
};
"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\
converting a non-string.");
long_classic_div, /*nb_divide*/
long_mod, /*nb_remainder*/
long_divmod, /*nb_divmod*/
long_pow, /*nb_power*/
long_lshift, /*nb_lshift*/
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*/
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 */
long_div, /* nb_floor_divide */
long_true_divide, /* nb_true_divide */
0, /* nb_inplace_floor_divide */
0, /* nb_inplace_true_divide */
long_long, /* nb_index */
};
0, /* ob_size */
"long", /* tp_name */
sizeof(digit), /* tp_itemsize */
long_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
long_repr, /* tp_repr */
&long_as_number, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_call */
long_str, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
long_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
long_methods, /* tp_methods */
0, /* tp_members */
long_getset, /* tp_getset */
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 */
PyObject_Del, /* tp_free */
};
"sys.long_info\n\
\n\
A struct sequence that holds information about Python's\n\
internal representation of integers. The attributes are read only.");
{"bits_per_digit", "size of a digit in bits"},
{"sizeof_digit", "size in bytes of the C type used to represent a digit"},
};
"sys.long_info", /* name */
long_info__doc__, /* doc */
long_info_fields, /* fields */
2 /* number of fields */
};
PyObject *
PyLong_GetInfo(void)
{
int field = 0;
return NULL;
PyInt_FromLong(sizeof(digit)));
if (PyErr_Occurred()) {
return NULL;
}
return long_info;
}
int
_PyLong_Init(void)
{
/* initialize long_info */
if (Long_InfoType.tp_name == 0)
return 1;
}