chiark
/
gitweb
/
~mdw
/
catacomb-python
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
rand.c: Show keyword argument as optional.
[catacomb-python]
/
mp.c
diff --git
a/mp.c
b/mp.c
index e7cb557b97081e9dc42fcefc1c7203e1eb66a621..31eec247760b63318f6082704ed551205007dd68 100644
(file)
--- a/
mp.c
+++ b/
mp.c
@@
-211,6
+211,7
@@
mp *tomp(PyObject *o)
return (MP_COPY(PFILT_F(o)->m));
else if (ECPT_PYCHECK(o)) {
ec p = EC_INIT;
return (MP_COPY(PFILT_F(o)->m));
else if (ECPT_PYCHECK(o)) {
ec p = EC_INIT;
+ if (EC_ATINF(ECPT_P(o))) return (0);
getecptout(&p, o);
x = MP_COPY(p.x);
EC_DESTROY(&p);
getecptout(&p, o);
x = MP_COPY(p.x);
EC_DESTROY(&p);
@@
-527,9
+528,9
@@
static PyObject *mp_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
mp *z;
mp_pyobj *zz = 0;
int radix = 0;
mp *z;
mp_pyobj *zz = 0;
int radix = 0;
-
char *
kwlist[] = { "x", "radix", 0 };
+
static const char *const
kwlist[] = { "x", "radix", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O|i:new",
kwlist
, &x, &radix))
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O|i:new",
KWLIST
, &x, &radix))
goto end;
if (MP_PYCHECK(x)) RETURN_OBJ(x);
if (!good_radix_p(radix, 1)) VALERR("bad radix");
goto end;
if (MP_PYCHECK(x)) RETURN_OBJ(x);
if (!good_radix_p(radix, 1)) VALERR("bad radix");
@@
-661,8
+662,8
@@
end:
static PyObject *mpmeth_tostring(PyObject *me, PyObject *arg, PyObject *kw)
{
int radix = 10;
static PyObject *mpmeth_tostring(PyObject *me, PyObject *arg, PyObject *kw)
{
int radix = 10;
-
char *
kwlist[] = { "radix", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "|i:tostring",
kwlist
, &radix))
+
static const char *const
kwlist[] = { "radix", 0 };
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "|i:tostring",
KWLIST
, &radix))
goto end;
if (!good_radix_p(radix, 0)) VALERR("bad radix");
return (mp_topystring(MP_X(me), radix, 0, 0, 0));
goto end;
if (!good_radix_p(radix, 0)) VALERR("bad radix");
return (mp_topystring(MP_X(me), radix, 0, 0, 0));
@@
-702,11
+703,11
@@
end:
PyObject *arg, PyObject *kw) \
{ \
long len = -1; \
PyObject *arg, PyObject *kw) \
{ \
long len = -1; \
-
char *kwlist[] = { "len", 0 };
\
+
static const char *const kwlist[] = { "len", 0 };
\
PyObject *rc = 0; \
\
if (!PyArg_ParseTupleAndKeywords(arg, kw, "|l:" #name, \
PyObject *rc = 0; \
\
if (!PyArg_ParseTupleAndKeywords(arg, kw, "|l:" #name, \
-
kwlist
, &len)) \
+
KWLIST
, &len)) \
goto end; \
if (len < 0) { \
len = mp_octets##c(MP_X(me)); \
goto end; \
if (len < 0) { \
len = mp_octets##c(MP_X(me)); \
@@
-765,10
+766,10
@@
static PyObject *mpmeth_tobuf(PyObject *me, PyObject *arg)
static PyObject *mpmeth_primep(PyObject *me, PyObject *arg, PyObject *kw)
{
grand *r = &rand_global;
static PyObject *mpmeth_primep(PyObject *me, PyObject *arg, PyObject *kw)
{
grand *r = &rand_global;
-
char *
kwlist[] = { "rng", 0 };
+
static const char *const
kwlist[] = { "rng", 0 };
PyObject *rc = 0;
PyObject *rc = 0;
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&",
kwlist
, convgrand, &r))
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&",
KWLIST
, convgrand, &r))
goto end;
rc = getbool(pgen_primep(MP_X(me), r));
end:
goto end;
rc = getbool(pgen_primep(MP_X(me), r));
end:
@@
-904,7
+905,7
@@
with an integer conversion.\n\
\n\
Notes:\n\
\n\
\n\
Notes:\n\
\n\
- * Use `//' for
division. MPs don't have `/'
division.",
+ * Use `//' for
integer division: `/' gives exact rational
division.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-936,10
+937,10
@@
static PyObject *meth__MP_fromstring(PyObject *me,
PyObject *z = 0;
mp *zz;
mptext_stringctx sc;
PyObject *z = 0;
mp *zz;
mptext_stringctx sc;
-
char *
kwlist[] = { "class", "x", "radix", 0 };
+
static const char *const
kwlist[] = { "class", "x", "radix", 0 };
if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|i:fromstring",
if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|i:fromstring",
-
kwlist
, &me, &p, &len, &r))
+
KWLIST
, &me, &p, &len, &r))
goto end;
if (!good_radix_p(r, 1)) VALERR("bad radix");
sc.buf = p; sc.lim = p + len;
goto end;
if (!good_radix_p(r, 1)) VALERR("bad radix");
sc.buf = p; sc.lim = p + len;
@@
-1107,7
+1108,7
@@
static PyTypeObject *mpmul_pytype, mpmul_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"
A
n object for multiplying many small integers.",
+"
MPMul(N_0, N_1, ....): a
n object for multiplying many small integers.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-1300,10
+1301,10
@@
static void mpmont_pydealloc(PyObject *me)
static PyObject *mpmont_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
{
mpmont_pyobj *mm = 0;
static PyObject *mpmont_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
{
mpmont_pyobj *mm = 0;
-
char *
kwlist[] = { "m", 0 };
+
static const char *const
kwlist[] = { "m", 0 };
mp *xx = 0;
mp *xx = 0;
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:new",
kwlist
, convmp, &xx))
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:new",
KWLIST
, convmp, &xx))
goto end;
if (!MP_POSP(xx) || !MP_ODDP(xx)) VALERR("m must be positive and odd");
mm = (mpmont_pyobj *)ty->tp_alloc(ty, 0);
goto end;
if (!MP_POSP(xx) || !MP_ODDP(xx)) VALERR("m must be positive and odd");
mm = (mpmont_pyobj *)ty->tp_alloc(ty, 0);
@@
-1374,7
+1375,7
@@
static PyTypeObject *mpmont_pytype, mpmont_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"
A
Montgomery reduction context.",
+"
MPMont(N): a
Montgomery reduction context.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-1454,10
+1455,10
@@
static PyObject *mpbarrett_pynew(PyTypeObject *ty,
PyObject *arg, PyObject *kw)
{
mpbarrett_pyobj *mb = 0;
PyObject *arg, PyObject *kw)
{
mpbarrett_pyobj *mb = 0;
-
char *
kwlist[] = { "m", 0 };
+
static const char *const
kwlist[] = { "m", 0 };
mp *xx = 0;
mp *xx = 0;
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:new",
kwlist
, convmp, &xx))
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:new",
KWLIST
, convmp, &xx))
goto end;
if (!MP_POSP(xx)) VALERR("m must be positive");
mb = (mpbarrett_pyobj *)ty->tp_alloc(ty, 0);
goto end;
if (!MP_POSP(xx)) VALERR("m must be positive");
mb = (mpbarrett_pyobj *)ty->tp_alloc(ty, 0);
@@
-1513,7
+1514,7
@@
static PyTypeObject *mpbarrett_pytype, mpbarrett_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"
A
Barrett reduction context.",
+"
MPBarrett(N): a
Barrett reduction context.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-1584,10
+1585,10
@@
static PyObject *mpreduce_pynew(PyTypeObject *ty,
{
mpreduce_pyobj *mr = 0;
mpreduce r;
{
mpreduce_pyobj *mr = 0;
mpreduce r;
-
char *
kwlist[] = { "m", 0 };
+
static const char *const
kwlist[] = { "m", 0 };
mp *xx = 0;
mp *xx = 0;
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:new",
kwlist
, convmp, &xx))
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:new",
KWLIST
, convmp, &xx))
goto end;
if (!MP_POSP(xx)) VALERR("m must be positive");
if (mpreduce_create(&r, xx)) VALERR("bad modulus (must be 2^k - ...)");
goto end;
if (!MP_POSP(xx)) VALERR("m must be positive");
if (mpreduce_create(&r, xx)) VALERR("bad modulus (must be 2^k - ...)");
@@
-1641,7
+1642,7
@@
static PyTypeObject *mpreduce_pytype, mpreduce_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"
A reduction context for reduction modulo primes of special form
.",
+"
MPReduce(N): a reduction context for reduction modulo Solinas primes
.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-1679,7
+1680,7
@@
static PyObject *mcmeth_solve(PyObject *me, PyObject *arg)
PyObject *q = 0, *x, *z = 0;
mp *xx;
mp **v = 0;
PyObject *q = 0, *x, *z = 0;
mp *xx;
mp **v = 0;
-
in
t i = 0, n = c->k;
+
Py_ssize_
t i = 0, n = c->k;
Py_INCREF(me);
if (PyTuple_Size(arg) == n)
Py_INCREF(me);
if (PyTuple_Size(arg) == n)
@@
-1688,7
+1689,8
@@
static PyObject *mcmeth_solve(PyObject *me, PyObject *arg)
goto end;
Py_INCREF(q);
if (!PySequence_Check(q)) TYERR("want a sequence of residues");
goto end;
Py_INCREF(q);
if (!PySequence_Check(q)) TYERR("want a sequence of residues");
- if (PySequence_Size(q) != n) VALERR("residue count mismatch");
+ i = PySequence_Size(q); if (i < 0) goto end;
+ if (i != n) VALERR("residue count mismatch");
v = xmalloc(n * sizeof(*v));
for (i = 0; i < n; i++) {
if ((x = PySequence_GetItem(q, i)) == 0) goto end;
v = xmalloc(n * sizeof(*v));
for (i = 0; i < n; i++) {
if ((x = PySequence_GetItem(q, i)) == 0) goto end;
@@
-1718,8
+1720,8
@@
static void mpcrt_pydealloc(PyObject *me)
static PyObject *mpcrt_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
{
mpcrt_mod *v = 0;
static PyObject *mpcrt_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
{
mpcrt_mod *v = 0;
-
in
t n, i = 0, j;
-
char *
kwlist[] = { "mv", 0 };
+
Py_ssize_
t n, i = 0, j;
+
static const char *const
kwlist[] = { "mv", 0 };
PyObject *q = 0, *x;
mp *xx = MP_NEW, *y = MP_NEW, *g = MP_NEW;
mpmul mm;
PyObject *q = 0, *x;
mp *xx = MP_NEW, *y = MP_NEW, *g = MP_NEW;
mpmul mm;
@@
-1727,12
+1729,11
@@
static PyObject *mpcrt_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
if (PyTuple_Size(arg) > 1)
q = arg;
if (PyTuple_Size(arg) > 1)
q = arg;
- else if (!PyArg_ParseTupleAndKeywords(arg, kw, "O:new",
kwlist
, &q))
+ else if (!PyArg_ParseTupleAndKeywords(arg, kw, "O:new",
KWLIST
, &q))
goto end;
Py_INCREF(q);
if (!PySequence_Check(q)) TYERR("want a sequence of moduli");
goto end;
Py_INCREF(q);
if (!PySequence_Check(q)) TYERR("want a sequence of moduli");
- n = PySequence_Size(q);
- if (PyErr_Occurred()) goto end;
+ n = PySequence_Size(q); if (n < 0) goto end;
if (!n) VALERR("want at least one modulus");
v = xmalloc(n * sizeof(*v));
for (i = 0; i < n; i++) {
if (!n) VALERR("want at least one modulus");
v = xmalloc(n * sizeof(*v));
for (i = 0; i < n; i++) {
@@
-1823,7
+1824,7
@@
static PyTypeObject *mpcrt_pytype, mpcrt_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"
A context for the solution of
Chinese Remainder Theorem problems.",
+"
MPCRT(SEQ): a context for solving
Chinese Remainder Theorem problems.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-1883,9
+1884,9
@@
static PyObject *gf_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
mp *z;
mp_pyobj *zz = 0;
int radix = 0;
mp *z;
mp_pyobj *zz = 0;
int radix = 0;
-
char *
kwlist[] = { "x", "radix", 0 };
+
static const char *const
kwlist[] = { "x", "radix", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O|i:gf",
kwlist
, &x, &radix))
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O|i:gf",
KWLIST
, &x, &radix))
goto end;
if (GF_PYCHECK(x)) RETURN_OBJ(x);
if (!good_radix_p(radix, 1)) VALERR("radix out of range");
goto end;
if (GF_PYCHECK(x)) RETURN_OBJ(x);
if (!good_radix_p(radix, 1)) VALERR("radix out of range");
@@
-2111,7
+2112,7
@@
but it's much easier to type than `p2' or `c2' or whatever.\n\
\n\
Notes:\n\
\n\
\n\
Notes:\n\
\n\
- * Use `//' for
division. GFs don't have `/'
division.",
+ * Use `//' for
Euclidean division: `/' gives exact rational
division.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-2143,10
+2144,10
@@
static PyObject *meth__GF_fromstring(PyObject *me,
PyObject *z = 0;
mp *zz;
mptext_stringctx sc;
PyObject *z = 0;
mp *zz;
mptext_stringctx sc;
-
char *
kwlist[] = { "class", "x", "radix", 0 };
+
static const char *const
kwlist[] = { "class", "x", "radix", 0 };
if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|i:fromstring",
if (!PyArg_ParseTupleAndKeywords(arg, kw, "Os#|i:fromstring",
-
kwlist
, &me, &p, &len, &r))
+
KWLIST
, &me, &p, &len, &r))
goto end;
if (!good_radix_p(r, 1)) VALERR("bad radix");
sc.buf = p; sc.lim = p + len;
goto end;
if (!good_radix_p(r, 1)) VALERR("bad radix");
sc.buf = p; sc.lim = p + len;
@@
-2261,10
+2262,10
@@
static PyObject *gfreduce_pynew(PyTypeObject *ty,
{
gfreduce_pyobj *mr = 0;
gfreduce r;
{
gfreduce_pyobj *mr = 0;
gfreduce r;
-
char *
kwlist[] = { "m", 0 };
+
static const char *const
kwlist[] = { "m", 0 };
mp *xx = 0;
mp *xx = 0;
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:new",
kwlist
, convgf, &xx))
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&:new",
KWLIST
, convgf, &xx))
goto end;
if (MP_ZEROP(xx)) ZDIVERR("modulus is zero!");
gfreduce_create(&r, xx);
goto end;
if (MP_ZEROP(xx)) ZDIVERR("modulus is zero!");
gfreduce_create(&r, xx);
@@
-2322,7
+2323,7
@@
static PyTypeObject *gfreduce_pytype, gfreduce_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"
A reduction context for reduction modulo sparse irreducibl
e polynomials.",
+"
GFReduce(N): a context for reduction modulo spars
e polynomials.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
@@
-2363,9
+2364,9
@@
static PyObject *gfn_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
{
mp *p = 0, *beta = 0;
gfn_pyobj *gg = 0;
{
mp *p = 0, *beta = 0;
gfn_pyobj *gg = 0;
-
char *
kwlist[] = { "p", "beta", 0 };
+
static const char *const
kwlist[] = { "p", "beta", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&:new",
kwlist
,
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&:new",
KWLIST
,
convgf, &p, convgf, &beta))
goto end;
gg = PyObject_New(gfn_pyobj, ty);
convgf, &p, convgf, &beta))
goto end;
gg = PyObject_New(gfn_pyobj, ty);
@@
-2403,7
+2404,7
@@
static PyObject *gfnget_beta(PyObject *me, void *hunoz)
end: \
mp_drop(xx); \
if (!z) return (0); \
end: \
mp_drop(xx); \
if (!z) return (0); \
- return (
mp
_pywrap(z)); \
+ return (
gf
_pywrap(z)); \
}
XFORMOP(pton, PTON)
XFORMOP(ntop, NTOP)
}
XFORMOP(pton, PTON)
XFORMOP(ntop, NTOP)
@@
-2460,8
+2461,8
@@
static PyTypeObject gfn_pytype_skel = {
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
Py_TPFLAGS_BASETYPE,
/* @tp_doc@ */
-"
An object for transforming elements of binary fields between polynomial
\n\
-and normal basis representations.",
+"
GFN(P, BETA): an object for transforming elements of binary fields
\n\
+
between polynomial
and normal basis representations.",
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */