Math-GMP
view release on metacpan or search on metacpan
void
bdiv(m,n)
mpz_t * m
mpz_t * n
PREINIT:
mpz_t * quo;
mpz_t * rem;
PPCODE:
quo = malloc (sizeof(mpz_t));
rem = malloc (sizeof(mpz_t));
mpz_init(*quo);
mpz_init(*rem);
mpz_tdiv_qr(*quo, *rem, *m, *n);
EXTEND(SP, 2);
PUSHs(sv_setref_pv(sv_newmortal(), "Math::GMP", (void*)quo));
PUSHs(sv_setref_pv(sv_newmortal(), "Math::GMP", (void*)rem));
RETVAL
void
brootrem(m,n)
mpz_t * m
unsigned long n
PREINIT:
mpz_t * root;
mpz_t * remainder;
PPCODE:
root = malloc (sizeof(mpz_t));
remainder = malloc (sizeof(mpz_t));
mpz_init(*root);
mpz_init(*remainder);
if (need_rootrem_workaround(m, n)) {
/* Older libgmp have bugs for negative m, but if we need to we can
* work on abs(m) then negate the results.
*/
mpz_neg(*root, *m);
mpz_rootrem(*root, *remainder, *root, n);
OUTPUT:
RETVAL
void
bsqrtrem(m)
mpz_t * m
PREINIT:
mpz_t * sqrt;
mpz_t * remainder;
PPCODE:
sqrt = malloc (sizeof(mpz_t));
remainder = malloc (sizeof(mpz_t));
mpz_init(*sqrt);
mpz_init(*remainder);
mpz_sqrtrem(*sqrt, *remainder, *m);
EXTEND(SP, 2);
PUSHs(sv_setref_pv(sv_newmortal(), "Math::GMP", (void*)sqrt));
PUSHs(sv_setref_pv(sv_newmortal(), "Math::GMP", (void*)remainder));
int
( run in 0.928 second using v1.01-cache-2.11-cpan-5511b514fd6 )