void gmp_wrap_sb_isqrt(char * n1l, char * resl) { WORD_PTR_TYPE n1 = TO_WORD_PTR(n1l); mp_size_t l1 = BIGNUM_LENGTH(n1); WORD_PTR_TYPE res = TO_WORD_PTR(resl); unsigned long l2 = BIGNUM_LENGTH(res); gmp_wrap_isqrt(res, l2, n1, l1); }
void gmp_wrap_sb_mul(char * n1l, char * n2l, char * resl) { WORD_PTR_TYPE n1 = TO_WORD_PTR(n1l); mp_size_t l1 = BIGNUM_LENGTH(n1); WORD_PTR_TYPE n2 = TO_WORD_PTR(n2l); mp_size_t l2 = BIGNUM_LENGTH(n2); WORD_PTR_TYPE res = TO_WORD_PTR(resl); mpn_mul(res, n1, l1, n2, l2); }
void gmp_sb_isqrt(char * n1l, char * resl) { WORD_PTR_TYPE n1 = TO_WORD_PTR(n1l); mp_size_t l1 = BIGNUM_LENGTH(n1); WORD_PTR_TYPE res = TO_WORD_PTR(resl); unsigned long l2 = BIGNUM_LENGTH(res); if (n1[l1 - 1] == 0) { l1--; res[l2 - 1] = 0; } mpn_sqrtrem(res, 0, n1, l1); }
void gmp_wrap_sb_div_rem(char * n1l, char * n2l, char * quol, char * reml) { WORD_PTR_TYPE n1 = TO_WORD_PTR(n1l); mp_size_t l1 = BIGNUM_LENGTH(n1); WORD_PTR_TYPE n2 = TO_WORD_PTR(n2l); mp_size_t l2 = BIGNUM_LENGTH(n2); WORD_PTR_TYPE quo = TO_WORD_PTR(quol); WORD_PTR_TYPE rem = TO_WORD_PTR(reml); mp_size_t lr = BIGNUM_LENGTH(rem); if (n2[l2 - 1] == 0) { l2 = l2 - 1; rem[lr - 1] = 0; } mpn_tdiv_qr(quo, rem, 0, n1, l1, n2, l2); }