From 9f49c854939cf36901a4a31e43abdb4ea440060f Mon Sep 17 00:00:00 2001 Message-Id: <9f49c854939cf36901a4a31e43abdb4ea440060f.1716782072.git.mdw@distorted.org.uk> From: Mark Wooding Date: Fri, 27 Feb 2015 14:40:01 +0000 Subject: [PATCH] mp.c: Proper binding for `mp_factorial'. Organization: Straylight/Edgeware From: Mark Wooding Rather than using the cardboard one in Python. --- catacomb/__init__.py | 5 ----- mp.c | 12 ++++++++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/catacomb/__init__.py b/catacomb/__init__.py index 0f0aa99..93f66da 100644 --- a/catacomb/__init__.py +++ b/catacomb/__init__.py @@ -108,11 +108,6 @@ class _tmp: def mont(x): return MPMont(x) def barrett(x): return MPBarrett(x) def reduce(x): return MPReduce(x) - def factorial(x): - 'factorial(X) -> X!' - if x < 0: raise ValueError, 'factorial argument must be > 0' - return MPMul.product(xrange(1, x + 1)) - factorial = staticmethod(factorial) _augment(MP, _tmp) class _tmp: diff --git a/mp.c b/mp.c index 705a65e..038324a 100644 --- a/mp.c +++ b/mp.c @@ -927,6 +927,16 @@ end: return (z); } +static PyObject *meth__MP_factorial(PyObject *me, PyObject *arg) +{ + unsigned long i; + mp *x; + if (!PyArg_ParseTuple(arg, "OO&:factorial", &me, convulong, &i)) + return (0); + x = mp_factorial(i); + return mp_pywrap(x); +} + #define LOADOP(pre, py, name) \ static PyObject *meth__##py##_##name(PyObject *me, PyObject *arg) \ { \ @@ -2446,6 +2456,8 @@ fromstring(STR, radix = 0) -> (X, REST)\n\ Parse STR as a binary polynomial, according to radix. If radix is zero,\n\ read a prefix from STR to decide radix: allow `0' for octal, `0x' for hex\n\ or `R_' for other radix R.") + METH (_MP_factorial, "\ +factorial(I) -> I!: compute factorial") METH (_MP_loadl, "\ loadl(STR) -> X: read little-endian bytes") METH (_MP_loadb, "\ -- [mdw]