static PyObject * GMPy_MPZ_c_mod_2exp(PyObject *self, PyObject *args) { mp_bitcnt_t nbits; MPZ_Object *result, *tempx; if (PyTuple_GET_SIZE(args) != 2) { TYPE_ERROR("c_mod_2exp() requires 'mpz','int' arguments"); return NULL; } nbits = mp_bitcnt_t_From_Integer(PyTuple_GET_ITEM(args, 1)); if (nbits == (mp_bitcnt_t)(-1) && PyErr_Occurred()) { return NULL; } tempx = GMPy_MPZ_From_Integer(PyTuple_GET_ITEM(args, 0), NULL); result = GMPy_MPZ_New(NULL); if (!tempx || !result) { Py_XDECREF((PyObject*)result); Py_XDECREF((PyObject*)tempx); return NULL; } mpz_cdiv_r_2exp(result->z, tempx->z, nbits); Py_DECREF((PyObject*)tempx); return (PyObject*)result; }
void hex_random_bit_op (enum hex_random_op op, unsigned long maxbits, char **ap, unsigned long *b, char **rp) { mpz_t a, r; unsigned long abits, bbits; unsigned signs; mpz_init (a); mpz_init (r); abits = gmp_urandomb_ui (state, 32) % maxbits; bbits = gmp_urandomb_ui (state, 32) % (maxbits + 100); mpz_rrandomb (a, state, abits); signs = gmp_urandomb_ui (state, 1); if (signs & 1) mpz_neg (a, a); switch (op) { default: abort (); case OP_SETBIT: mpz_set (r, a); mpz_setbit (r, bbits); break; case OP_CLRBIT: mpz_set (r, a); mpz_clrbit (r, bbits); break; case OP_COMBIT: mpz_set (r, a); mpz_combit (r, bbits); break; case OP_CDIV_Q_2: mpz_cdiv_q_2exp (r, a, bbits); break; case OP_CDIV_R_2: mpz_cdiv_r_2exp (r, a, bbits); break; case OP_FDIV_Q_2: mpz_fdiv_q_2exp (r, a, bbits); break; case OP_FDIV_R_2: mpz_fdiv_r_2exp (r, a, bbits); break; case OP_TDIV_Q_2: mpz_tdiv_q_2exp (r, a, bbits); break; case OP_TDIV_R_2: mpz_tdiv_r_2exp (r, a, bbits); break; } gmp_asprintf (ap, "%Zx", a); *b = bbits; gmp_asprintf (rp, "%Zx", r); mpz_clear (a); mpz_clear (r); }