GMP

ysd@KLab > GMP

まえがき

GMPのマニュアル読むのがタルいので整数系関数(mpz_XXXX)だけ集めてみた。

全般的な長さを短くするため,型を下記のように略す.

typedef unsigned long int ulong;
typedef unsigned int      uint;
typedef signed long int   slong;
typedef mpz_t             mpz_t; // 実は変わってない

また,説明上必要な場合は返り値を ret で表す.

概形

void mpz_init(mpz_t integer)
integer = 0;
void mpz_init2 (mpz_t integer, ulong n)
&integer = calloc(n);
void mpz_clear (mpz_t integer)
free(&integer);
void mpz_realloc2 (mpz_t integer, ulong n)
&integer = realloc(&integer, n);
void mpz_set (mpz_t rop, mpz_t op)
void mpz_set_ui (mpz_t rop, ulong op)
void mpz_set_si (mpz_t rop, slong op)
void mpz_set_d (mpz_t rop, double op)
void mpz_set_q (mpz_t rop, mpq_t op)
void mpz_set_f (mpz_t rop, mpf_t op)
rop = op;
int mpz_set_str (mpz_t rop, char *str, int base)
rop = strtol(str, base);
void mpz_swap (mpz_t rop1, mpz_t rop2)
tmp = rop1; rop1 = rop2; rop2 = tmp;
void mpz_init_set (mpz_t rop, mpz_t op)
void mpz_init_set_ui (mpz_t rop, ulong op)
void mpz_init_set_si (mpz_t rop, slong op)
void mpz_init_set_d (mpz_t rop, double op)
int mpz_init_set_str (mpz_t rop, char *str, int base)
&rop = malloc(sizeof(op));
rop = op; (rop = strtol(str, base);)
ulong mpz_get_ui (mpz_t op)
(ulong)op
slong mpz_get_si (mpz_t op)
(slong)op
double mpz_get_d (mpz_t op)
(double)op
double mpz_get_d_2exp (slong *exp, mpz_t op)
説明がタルい
char * mpz_get_str (char *str, int base, mpz_t op)
sprintf(str, "%d", op);
void mpz_add (mpz_t rop, mpz_t op1, mpz_t op2)
void mpz_add_ui (mpz_t rop, mpz_t op1, ulong op2)
rop = op1 + op2;
void mpz_sub (mpz_t rop, mpz_t op1, mpz_t op2)
void mpz_sub_ui (mpz_t rop, mpz_t op1, ulong op2)
void mpz_ui_sub (mpz_t rop, ulong op1, mpz_t op2)
rop = op1 - op2;
void mpz_mul (mpz_t rop, mpz_t op1, mpz_t op2)
void mpz_mul_si (mpz_t rop, mpz_t op1, slong op2)
void mpz_mul_ui (mpz_t rop, mpz_t op1, ulong op2)
rop = op1 * op2;
void mpz_addmul (mpz_t rop, mpz_t op1, mpz_t op2)
void mpz_addmul_ui (mpz_t rop, mpz_t op1, ulong op2)
rop = rop + op1 * op2;
void mpz_submul (mpz_t rop, mpz_t op1, mpz_t op2)
void mpz_submul_ui (mpz_t rop, mpz_t op1, ulong op2)
rop = rop - op1 * op2;
void mpz_mul_2exp (mpz_t rop, mpz_t op1, ulong op2)
rop = op1 << op2;
void mpz_neg (mpz_t rop, mpz_t op)
rop = -op;
void mpz_abs (mpz_t rop, mpz_t op)
rop = abs(op);
void mpz_cdiv_q (mpz_t q, mpz_t n, mpz_t d)
void mpz_cdiv_r (mpz_t r, mpz_t n, mpz_t d)
void mpz_cdiv_qr (mpz_t q, mpz_t r, mpz_t n, mpz_t d)
ulong mpz_cdiv_q_ui (mpz_t q, mpz_t n, ulong d)
ulong mpz_cdiv_r_ui (mpz_t r, mpz_t n, ulong d)
ulong mpz_cdiv_qr_ui (mpz_t q, mpz_t r, mpz_t n, ulong d)
ulong mpz_cdiv_ui (mpz_t n, ulong d)
void mpz_cdiv_q_2exp (mpz_t q, mpz_t n, ulong b)
void mpz_cdiv_r_2exp (mpz_t r, mpz_t n, ulong b)
void mpz_fdiv_q (mpz_t q, mpz_t n, mpz_t d)
void mpz_fdiv_r (mpz_t r, mpz_t n, mpz_t d)
void mpz_fdiv_qr (mpz_t q, mpz_t r, mpz_t n, mpz_t d)
ulong mpz_fdiv_q_ui (mpz_t q, mpz_t n, ulong d)
ulong mpz_fdiv_r_ui (mpz_t r, mpz_t n, ulong d)
ulong mpz_fdiv_qr_ui (mpz_t q, mpz_t r, mpz_t n, ulong d)
ulong mpz_fdiv_ui (mpz_t n, ulong d)
void mpz_fdiv_q_2exp (mpz_t q, mpz_t n, ulong b)
void mpz_fdiv_r_2exp (mpz_t r, mpz_t n, ulong b)
void mpz_tdiv_q (mpz_t q, mpz_t n, mpz_t d)
void mpz_tdiv_r (mpz_t r, mpz_t n, mpz_t d)
void mpz_tdiv_qr (mpz_t q, mpz_t r, mpz_t n, mpz_t d)
ulong mpz_tdiv_q_ui (mpz_t q, mpz_t n, ulong d)
ulong mpz_tdiv_r_ui (mpz_t r, mpz_t n, ulong d)
ulong mpz_tdiv_qr_ui (mpz_t q, mpz_t r, mpz_t n, ulong d)
ulong mpz_tdiv_ui (mpz_t n, ulong d)
void mpz_tdiv_q_2exp (mpz_t q, mpz_t n, ulong b)
void mpz_tdiv_r_2exp (mpz_t r, mpz_t n, ulong b)
q = n / d; r = n % d;
q = n >> b; r = n & ((1 << b) - 1);
(n == q * d + r) か (n == q << b + r) が成り立つ
cdiv は q が +∞ 方向に丸められる。
        r は d と逆符号。ceil。
fdiv は q が -∞ 方向に丸められる。
        r は d と同符号。floor。
tdiv は q が 0 方向に丸められる。
        r は n と同符号。truncate。
b を使う場合の説明は d = 1 << b; として読む。
void mpz_mod (mpz_t r, mpz_t n, mpz_t d)
ulong mpz_mod_ui (mpz_t r, mpz_t n, ulong d)
r = n % d; (r ≥ 0)
void mpz_divexact (mpz_t q, mpz_t n, mpz_t d)
void mpz_divexact_ui (mpz_t q, mpz_t n, ulong d)
q = n / d; // n % d = 0 が前提
int mpz_divisible_p (mpz_t n, mpz_t d)
int mpz_divisible_ui_p (mpz_t n, ulong d)
(n % d == 0)
int mpz_divisible_2exp_p (mpz_t n, ulong b)
(n % (1 << b) == 0)
int mpz_congruent_p (mpz_t n, mpz_t c, mpz_t d)
int mpz_congruent_ui_p (mpz_t n, ulong c, ulong d)
(n == (c % d))
int mpz_congruent_2exp_p (mpz_t n, mpz_t c, ulong b)
(n == (c % (1 << b)))
void mpz_powm (mpz_t rop, mpz_t base, mpz_t exp, mpz_t mod)
void mpz_powm_ui (mpz_t rop, mpz_t base, ulong exp, mpz_t mod)
rop = (base ** exp) % mod;
void mpz_pow_ui (mpz_t rop, mpz_t base, ulong exp)
void mpz_ui_pow_ui (mpz_t rop, ulong base, ulong exp)
rop = base ** exp;
int mpz_root (mpz_t rop, mpz_t op, ulong n)
rop = op ** (1 / n); // 端数は0方向丸め
void mpz_rootrem (mpz_t root, mpz_t rem, mpz_t u, ulong n)
root = u ** (1 / n); rem = u - root ** n;
void mpz_sqrt (mpz_t rop, mpz_t op)
void mpz_sqrtrem (mpz_t rop1, mpz_t rop2, mpz_t op)
int mpz_perfect_power_p (mpz_t op)
int mpz_perfect_square_p (mpz_t op)
int mpz_probab_prime_p (mpz_t n, int reps)
void mpz_nextprime (mpz_t rop, mpz_t op)
void mpz_gcd (mpz_t rop, mpz_t op1, mpz_t op2)
ulong mpz_gcd_ui (mpz_t rop, mpz_t op1, ulong op2)
void mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, mpz_t a, mpz_t b)
void mpz_lcm (mpz_t rop, mpz_t op1, mpz_t op2)
void mpz_lcm_ui (mpz_t rop, mpz_t op1, ulong op2)
int mpz_invert (mpz_t rop, mpz_t op1, mpz_t op2)
int mpz_jacobi (mpz_t a, mpz_t b)
int mpz_legendre (mpz_t a, mpz_t p)
int mpz_kronecker (mpz_t a, mpz_t b)
int mpz_kronecker_si (mpz_t a, slong b)
int mpz_kronecker_ui (mpz_t a, ulong b)
int mpz_si_kronecker (slong a, mpz_t b)
int mpz_ui_kronecker (ulong a, mpz_t b)
ulong mpz_remove (mpz_t rop, mpz_t op, mpz_t f)
void mpz_fac_ui (mpz_t rop, ulong op)
void mpz_bin_ui (mpz_t rop, mpz_t n, ulong k)
void mpz_bin_uiui (mpz_t rop, ulong n, ulong k)
void mpz_fib_ui (mpz_t fn, ulong n)
void mpz_fib2_ui (mpz_t fn, mpz_t fnsub1, ulong n)
void mpz_lucnum_ui (mpz_t ln, ulong n)
void mpz_lucnum2_ui (mpz_t ln, mpz_t lnsub1, ulong n)
int mpz_cmp (mpz_t op1, mpz_t op2)
int mpz_cmp_d (mpz_t op1, double op2)
int mpz_cmp_si (mpz_t op1, slong op2)
int mpz_cmp_ui (mpz_t op1, ulong op2)
int mpz_cmpabs (mpz_t op1, mpz_t op2)
int mpz_cmpabs_d (mpz_t op1, double op2)
int mpz_cmpabs_ui (mpz_t op1, ulong op2)
void mpz_and (mpz_t rop, mpz_t op1, mpz_t op2)
void mpz_ior (mpz_t rop, mpz_t op1, mpz_t op2)
void mpz_xor (mpz_t rop, mpz_t op1, mpz_t op2)
void mpz_com (mpz_t rop, mpz_t op)
ulong mpz_popcount (mpz_t op)
ulong mpz_hamdist (mpz_t op1, mpz_t op2)
ulong mpz_scan0 (mpz_t op, ulong starting_bit)
ulong mpz_scan1 (mpz_t op, ulong starting_bit)
void mpz_setbit (mpz_t rop, ulong bit_index)
void mpz_clrbit (mpz_t rop, ulong bit_index)
void mpz_combit (mpz_t rop, ulong bit_index)
int mpz_tstbit (mpz_t op, ulong bit_index)
size_t mpz_out_str (FILE *stream, int base, mpz_t op)
size_t mpz_inp_str (mpz_t rop, FILE *stream, int base)
size_t mpz_out_raw (FILE *stream, mpz_t op)
size_t mpz_inp_raw (mpz_t rop, FILE *stream)
void mpz_urandomb (mpz_t rop, gmp_randstate_t state, ulong n)
void mpz_urandomm (mpz_t rop, gmp_randstate_t state, mpz_t n)
void mpz_rrandomb (mpz_t rop, gmp_randstate_t state, ulong n)
void mpz_random (mpz_t rop, mp_size_t max_size)
void mpz_random2 (mpz_t rop, mp_size_t max_size)
void mpz_urandomb (mpz_t rop, gmp_randstate_t state, ulong n)
void mpz_urandomm (mpz_t rop, gmp_randstate_t state, mpz_t n)
void mpz_rrandomb (mpz_t rop, gmp_randstate_t state, ulong n)
void mpz_random (mpz_t rop, mp_size_t max_size)
void mpz_random2 (mpz_t rop, mp_size_t max_size)
int mpz_fits_ulong_p (mpz_t op)
int mpz_fits_slong_p (mpz_t op)
int mpz_fits_uint_p (mpz_t op)
int mpz_fits_sint_p (mpz_t op)
int mpz_fits_ushort_p (mpz_t op)
int mpz_fits_sshort_p (mpz_t op)
int mpz_odd_p (mpz_t op)
int mpz_even_p (mpz_t op)
size_t mpz_sizeinbase (mpz_t op, int base)
void * _mpz_realloc (mpz_t integer, mp_size_t new_alloc)
mp_limb_t mpz_getlimbn (mpz_t op, mp_size_t n)
size_t mpz_size (mpz_t op)