#![allow(non_camel_case_types, non_snake_case)]
use core::cmp::Ordering;
use core::ffi::{c_char, c_int, c_long, c_uchar, c_uint, c_ulong, c_ushort, c_void};
use core::fmt::{Debug, Formatter, Result as FmtResult};
use core::mem::MaybeUninit;
use core::ptr;
use core::ptr::NonNull;
use libc::FILE;
include!(concat!(env!("OUT_DIR"), "/gmp_h.rs"));
extern "C" {
#[link_name = "__gmp_bits_per_limb"]
pub static bits_per_limb: c_int;
}
pub const VERSION: c_int = GMP_VERSION;
pub const VERSION_MINOR: c_int = GMP_VERSION_MINOR;
pub const VERSION_PATCHLEVEL: c_int = GMP_VERSION_PATCHLEVEL;
extern "C" {
#[link_name = "__gmp_version"]
pub static version: *const c_char;
}
pub const CC: *const c_char = GMP_CC;
pub const CFLAGS: *const c_char = GMP_CFLAGS;
pub const NAIL_BITS: c_int = GMP_NAIL_BITS;
pub const NUMB_BITS: c_int = LIMB_BITS - NAIL_BITS;
pub const LIMB_BITS: c_int = GMP_LIMB_BITS;
pub const NAIL_MASK: limb_t = !NUMB_MASK;
pub const NUMB_MASK: limb_t = (!(0 as limb_t)) >> NAIL_BITS;
pub const NUMB_MAX: limb_t = NUMB_MASK;
pub type exp_t = c_long;
pub type limb_t = GMP_LIMB_T;
pub type size_t = c_long;
pub type bitcnt_t = c_ulong;
#[doc = include_str!("internal_fields.md")]
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct mpz_t {
pub alloc: c_int,
pub size: c_int,
pub d: NonNull<limb_t>,
}
#[doc = include_str!("internal_fields.md")]
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct mpq_t {
pub num: mpz_t,
pub den: mpz_t,
}
#[doc = include_str!("internal_fields.md")]
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct mpf_t {
pub prec: c_int,
pub size: c_int,
pub exp: exp_t,
pub d: NonNull<limb_t>,
}
#[doc = include_str!("internal_fields.md")]
#[repr(C)]
#[derive(Clone, Copy)]
pub struct randstate_t {
pub seed: randseed_t,
pub alg: MaybeUninit<c_int>,
pub algdata: *const randfnptr_t,
}
impl Debug for randstate_t {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
f.debug_struct("randstate_t")
.field("seed", &self.seed)
.field("alg", &"unused")
.field("algdata", &self.algdata)
.finish()
}
}
#[doc = include_str!("internal_fields.md")]
#[repr(C)]
#[derive(Clone, Copy)]
pub struct randseed_t {
pub alloc: MaybeUninit<c_int>,
pub size: MaybeUninit<c_int>,
pub d: NonNull<c_void>,
}
impl Debug for randseed_t {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
f.debug_struct("randseed_t")
.field("alloc", &"unused")
.field("size", &"unused")
.field("d", &self.d)
.finish()
}
}
#[doc = include_str!("internal_fields.md")]
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct randfnptr_t {
pub seed: unsafe extern "C" fn(rstate: *mut randstate_t, seed: *const mpz_t),
pub get: unsafe extern "C" fn(rstate: *mut randstate_t, dest: *mut limb_t, nbits: c_ulong),
pub clear: unsafe extern "C" fn(rstate: *mut randstate_t),
pub iset: unsafe extern "C" fn(dst: *mut randstate_t, src: *const randstate_t),
}
pub type mpz_ptr = *mut mpz_t;
pub type mpz_srcptr = *const mpz_t;
pub type mpq_ptr = *mut mpq_t;
pub type mpq_srcptr = *const mpq_t;
pub type mpf_ptr = *mut mpf_t;
pub type mpf_srcptr = *const mpf_t;
pub type randstate_ptr = *mut randstate_t;
pub type randstate_srcptr = *const randstate_t;
type mp_ptr = *mut limb_t;
type mp_srcptr = *const limb_t;
extern "C" {
#[link_name = "__gmpz_init"]
pub fn mpz_init(x: mpz_ptr);
#[link_name = "__gmpz_inits"]
pub fn mpz_inits(x: mpz_ptr, ...);
#[link_name = "__gmpz_init2"]
pub fn mpz_init2(x: mpz_ptr, n: bitcnt_t);
#[link_name = "__gmpz_clear"]
pub fn mpz_clear(x: mpz_ptr);
#[link_name = "__gmpz_clears"]
pub fn mpz_clears(x: mpz_ptr, ...);
#[link_name = "__gmpz_realloc2"]
pub fn mpz_realloc2(x: mpz_ptr, n: bitcnt_t);
#[link_name = "__gmpz_set"]
pub fn mpz_set(rop: mpz_ptr, op: mpz_srcptr);
#[link_name = "__gmpz_set_ui"]
pub fn mpz_set_ui(rop: mpz_ptr, op: c_ulong);
#[link_name = "__gmpz_set_si"]
pub fn mpz_set_si(rop: mpz_ptr, op: c_long);
#[link_name = "__gmpz_set_d"]
pub fn mpz_set_d(rop: mpz_ptr, op: f64);
}
#[inline]
pub unsafe extern "C" fn mpz_set_q(rop: mpz_ptr, op: mpq_srcptr) {
unsafe { mpz_tdiv_q(rop, mpq_numref_const(op), mpq_denref_const(op)) }
}
extern "C" {
#[link_name = "__gmpz_set_f"]
pub fn mpz_set_f(rop: mpz_ptr, op: mpf_srcptr);
#[link_name = "__gmpz_set_str"]
pub fn mpz_set_str(rop: mpz_ptr, str: *const c_char, base: c_int) -> c_int;
#[link_name = "__gmpz_swap"]
pub fn mpz_swap(rop1: mpz_ptr, rop2: mpz_ptr);
#[link_name = "__gmpz_init_set"]
pub fn mpz_init_set(rop: mpz_ptr, op: mpz_srcptr);
#[link_name = "__gmpz_init_set_ui"]
pub fn mpz_init_set_ui(rop: mpz_ptr, op: c_ulong);
#[link_name = "__gmpz_init_set_si"]
pub fn mpz_init_set_si(rop: mpz_ptr, op: c_long);
#[link_name = "__gmpz_init_set_d"]
pub fn mpz_init_set_d(rop: mpz_ptr, op: f64);
#[link_name = "__gmpz_init_set_str"]
pub fn mpz_init_set_str(rop: mpz_ptr, str: *const c_char, base: c_int) -> c_int;
}
#[inline]
#[cfg(any(not(nails), long_long_limb))]
pub unsafe extern "C" fn mpz_get_ui(op: mpz_srcptr) -> c_ulong {
if unsafe { (*op).size } != 0 {
unsafe {
let p = (*op).d.as_ptr();
(*p) as c_ulong
}
} else {
0
}
}
#[inline]
#[cfg(all(nails, not(long_long_limb)))]
pub unsafe extern "C" fn mpz_get_ui(op: mpz_srcptr) -> c_ulong {
let p = unsafe { (*op).d };
let n = unsafe { (*op).size }.abs();
if n == 0 {
0
} else if n == 1 {
unsafe { *p }
} else {
unsafe { *p + ((*(p.offset(1))) << NUMB_BITS) }
}
}
extern "C" {
#[link_name = "__gmpz_get_si"]
pub fn mpz_get_si(op: mpz_srcptr) -> c_long;
#[link_name = "__gmpz_get_d"]
pub fn mpz_get_d(op: mpz_srcptr) -> f64;
#[link_name = "__gmpz_get_d_2exp"]
pub fn mpz_get_d_2exp(exp: *mut c_long, op: mpz_srcptr) -> f64;
#[link_name = "__gmpz_get_str"]
pub fn mpz_get_str(str: *mut c_char, base: c_int, op: mpz_srcptr) -> *mut c_char;
#[link_name = "__gmpz_add"]
pub fn mpz_add(rop: mpz_ptr, op1: mpz_srcptr, op2: mpz_srcptr);
#[link_name = "__gmpz_add_ui"]
pub fn mpz_add_ui(rop: mpz_ptr, op1: mpz_srcptr, op2: c_ulong);
#[link_name = "__gmpz_sub"]
pub fn mpz_sub(rop: mpz_ptr, op1: mpz_srcptr, op2: mpz_srcptr);
#[link_name = "__gmpz_sub_ui"]
pub fn mpz_sub_ui(rop: mpz_ptr, op1: mpz_srcptr, op2: c_ulong);
#[link_name = "__gmpz_ui_sub"]
pub fn mpz_ui_sub(rop: mpz_ptr, op1: c_ulong, op2: mpz_srcptr);
#[link_name = "__gmpz_mul"]
pub fn mpz_mul(rop: mpz_ptr, op1: mpz_srcptr, op2: mpz_srcptr);
#[link_name = "__gmpz_mul_si"]
pub fn mpz_mul_si(rop: mpz_ptr, op1: mpz_srcptr, op2: c_long);
#[link_name = "__gmpz_mul_ui"]
pub fn mpz_mul_ui(rop: mpz_ptr, op1: mpz_srcptr, op2: c_ulong);
#[link_name = "__gmpz_addmul"]
pub fn mpz_addmul(rop: mpz_ptr, op1: mpz_srcptr, op2: mpz_srcptr);
#[link_name = "__gmpz_addmul_ui"]
pub fn mpz_addmul_ui(rop: mpz_ptr, op1: mpz_srcptr, op2: c_ulong);
#[link_name = "__gmpz_submul"]
pub fn mpz_submul(rop: mpz_ptr, op1: mpz_srcptr, op2: mpz_srcptr);
#[link_name = "__gmpz_submul_ui"]
pub fn mpz_submul_ui(rop: mpz_ptr, op1: mpz_srcptr, op2: c_ulong);
#[link_name = "__gmpz_mul_2exp"]
pub fn mpz_mul_2exp(rop: mpz_ptr, op1: mpz_srcptr, op2: bitcnt_t);
}
#[inline]
pub unsafe extern "C" fn mpz_neg(rop: mpz_ptr, op: mpz_srcptr) {
if !ptr::eq(rop, op) {
unsafe {
mpz_set(rop, op);
}
}
unsafe {
(*rop).size = -(*rop).size;
}
}
#[inline]
pub unsafe extern "C" fn mpz_abs(rop: mpz_ptr, op: mpz_srcptr) {
unsafe {
if !ptr::eq(rop, op) {
mpz_set(rop, op);
}
(*rop).size = (*rop).size.abs();
}
}
extern "C" {
#[link_name = "__gmpz_cdiv_q"]
pub fn mpz_cdiv_q(q: mpz_ptr, n: mpz_srcptr, d: mpz_srcptr);
#[link_name = "__gmpz_cdiv_r"]
pub fn mpz_cdiv_r(r: mpz_ptr, n: mpz_srcptr, d: mpz_srcptr);
#[link_name = "__gmpz_cdiv_qr"]
pub fn mpz_cdiv_qr(q: mpz_ptr, r: mpz_ptr, n: mpz_srcptr, d: mpz_srcptr);
#[link_name = "__gmpz_cdiv_q_ui"]
pub fn mpz_cdiv_q_ui(q: mpz_ptr, n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_cdiv_r_ui"]
pub fn mpz_cdiv_r_ui(r: mpz_ptr, n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_cdiv_qr_ui"]
pub fn mpz_cdiv_qr_ui(q: mpz_ptr, r: mpz_ptr, n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_cdiv_ui"]
pub fn mpz_cdiv_ui(n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_cdiv_q_2exp"]
pub fn mpz_cdiv_q_2exp(q: mpz_ptr, n: mpz_srcptr, b: bitcnt_t);
#[link_name = "__gmpz_cdiv_r_2exp"]
pub fn mpz_cdiv_r_2exp(r: mpz_ptr, n: mpz_srcptr, b: bitcnt_t);
#[link_name = "__gmpz_fdiv_q"]
pub fn mpz_fdiv_q(q: mpz_ptr, n: mpz_srcptr, d: mpz_srcptr);
#[link_name = "__gmpz_fdiv_r"]
pub fn mpz_fdiv_r(r: mpz_ptr, n: mpz_srcptr, d: mpz_srcptr);
#[link_name = "__gmpz_fdiv_qr"]
pub fn mpz_fdiv_qr(q: mpz_ptr, r: mpz_ptr, n: mpz_srcptr, d: mpz_srcptr);
#[link_name = "__gmpz_fdiv_q_ui"]
pub fn mpz_fdiv_q_ui(q: mpz_ptr, n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_fdiv_r_ui"]
pub fn mpz_fdiv_r_ui(r: mpz_ptr, n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_fdiv_qr_ui"]
pub fn mpz_fdiv_qr_ui(q: mpz_ptr, r: mpz_ptr, n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_fdiv_ui"]
pub fn mpz_fdiv_ui(n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_fdiv_q_2exp"]
pub fn mpz_fdiv_q_2exp(q: mpz_ptr, n: mpz_srcptr, b: bitcnt_t);
#[link_name = "__gmpz_fdiv_r_2exp"]
pub fn mpz_fdiv_r_2exp(r: mpz_ptr, n: mpz_srcptr, b: bitcnt_t);
#[link_name = "__gmpz_tdiv_q"]
pub fn mpz_tdiv_q(q: mpz_ptr, n: mpz_srcptr, d: mpz_srcptr);
#[link_name = "__gmpz_tdiv_r"]
pub fn mpz_tdiv_r(r: mpz_ptr, n: mpz_srcptr, d: mpz_srcptr);
#[link_name = "__gmpz_tdiv_qr"]
pub fn mpz_tdiv_qr(q: mpz_ptr, r: mpz_ptr, n: mpz_srcptr, d: mpz_srcptr);
#[link_name = "__gmpz_tdiv_q_ui"]
pub fn mpz_tdiv_q_ui(q: mpz_ptr, n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_tdiv_r_ui"]
pub fn mpz_tdiv_r_ui(r: mpz_ptr, n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_tdiv_qr_ui"]
pub fn mpz_tdiv_qr_ui(q: mpz_ptr, r: mpz_ptr, n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_tdiv_ui"]
pub fn mpz_tdiv_ui(n: mpz_srcptr, d: c_ulong) -> c_ulong;
#[link_name = "__gmpz_tdiv_q_2exp"]
pub fn mpz_tdiv_q_2exp(q: mpz_ptr, n: mpz_srcptr, b: bitcnt_t);
#[link_name = "__gmpz_tdiv_r_2exp"]
pub fn mpz_tdiv_r_2exp(r: mpz_ptr, n: mpz_srcptr, b: bitcnt_t);
#[link_name = "__gmpz_mod"]
pub fn mpz_mod(r: mpz_ptr, n: mpz_srcptr, d: mpz_srcptr);
}
#[inline]
pub unsafe extern "C" fn mpz_mod_ui(r: mpz_ptr, n: mpz_srcptr, d: c_ulong) -> c_ulong {
unsafe { mpz_fdiv_r_ui(r, n, d) }
}
extern "C" {
#[link_name = "__gmpz_divexact"]
pub fn mpz_divexact(q: mpz_ptr, n: mpz_srcptr, d: mpz_srcptr);
#[link_name = "__gmpz_divexact_ui"]
pub fn mpz_divexact_ui(q: mpz_ptr, n: mpz_srcptr, d: c_ulong);
#[link_name = "__gmpz_divisible_p"]
pub fn mpz_divisible_p(n: mpz_srcptr, d: mpz_srcptr) -> c_int;
#[link_name = "__gmpz_divisible_ui_p"]
pub fn mpz_divisible_ui_p(n: mpz_srcptr, d: c_ulong) -> c_int;
#[link_name = "__gmpz_divisible_2exp_p"]
pub fn mpz_divisible_2exp_p(n: mpz_srcptr, b: bitcnt_t) -> c_int;
#[link_name = "__gmpz_congruent_p"]
pub fn mpz_congruent_p(n: mpz_srcptr, c: mpz_srcptr, d: mpz_srcptr) -> c_int;
#[link_name = "__gmpz_congruent_ui_p"]
pub fn mpz_congruent_ui_p(n: mpz_srcptr, c: c_ulong, d: c_ulong) -> c_int;
#[link_name = "__gmpz_congruent_2exp_p"]
pub fn mpz_congruent_2exp_p(n: mpz_srcptr, c: mpz_srcptr, b: bitcnt_t) -> c_int;
#[link_name = "__gmpz_powm"]
pub fn mpz_powm(rop: mpz_ptr, base: mpz_srcptr, exp: mpz_srcptr, modu: mpz_srcptr);
#[link_name = "__gmpz_powm_ui"]
pub fn mpz_powm_ui(rop: mpz_ptr, base: mpz_srcptr, exp: c_ulong, modu: mpz_srcptr);
#[link_name = "__gmpz_powm_sec"]
pub fn mpz_powm_sec(rop: mpz_ptr, base: mpz_srcptr, exp: mpz_srcptr, modu: mpz_srcptr);
#[link_name = "__gmpz_pow_ui"]
pub fn mpz_pow_ui(rop: mpz_ptr, base: mpz_srcptr, exp: c_ulong);
#[link_name = "__gmpz_ui_pow_ui"]
pub fn mpz_ui_pow_ui(rop: mpz_ptr, base: c_ulong, exp: c_ulong);
#[link_name = "__gmpz_root"]
pub fn mpz_root(rop: mpz_ptr, op: mpz_srcptr, n: c_ulong) -> c_int;
#[link_name = "__gmpz_rootrem"]
pub fn mpz_rootrem(root: mpz_ptr, rem: mpz_ptr, op: mpz_srcptr, n: c_ulong);
#[link_name = "__gmpz_sqrt"]
pub fn mpz_sqrt(rop: mpz_ptr, op: mpz_srcptr);
#[link_name = "__gmpz_sqrtrem"]
pub fn mpz_sqrtrem(rop1: mpz_ptr, rop2: mpz_ptr, op: mpz_srcptr);
#[link_name = "__gmpz_perfect_power_p"]
pub fn mpz_perfect_power_p(op: mpz_srcptr) -> c_int;
}
#[inline]
pub unsafe extern "C" fn mpz_perfect_square_p(op: mpz_srcptr) -> c_int {
let op_size = unsafe { (*op).size };
if op_size > 0 {
unsafe { mpn_perfect_square_p((*op).d.as_ptr(), op_size.into()) }
} else {
(op_size >= 0) as c_int
}
}
extern "C" {
#[link_name = "__gmpz_probab_prime_p"]
pub fn mpz_probab_prime_p(n: mpz_srcptr, reps: c_int) -> c_int;
#[link_name = "__gmpz_nextprime"]
pub fn mpz_nextprime(rop: mpz_ptr, op: mpz_srcptr);
#[link_name = "__gmpz_prevprime"]
pub fn mpz_prevprime(rop: mpz_ptr, op: mpz_srcptr);
#[link_name = "__gmpz_gcd"]
pub fn mpz_gcd(rop: mpz_ptr, op1: mpz_srcptr, op2: mpz_srcptr);
#[link_name = "__gmpz_gcd_ui"]
pub fn mpz_gcd_ui(rop: mpz_ptr, op1: mpz_srcptr, op2: c_ulong) -> c_ulong;
#[link_name = "__gmpz_gcdext"]
pub fn mpz_gcdext(g: mpz_ptr, s: mpz_ptr, t: mpz_ptr, a: mpz_srcptr, b: mpz_srcptr);
#[link_name = "__gmpz_lcm"]
pub fn mpz_lcm(rop: mpz_ptr, op1: mpz_srcptr, op2: mpz_srcptr);
#[link_name = "__gmpz_lcm_ui"]
pub fn mpz_lcm_ui(rop: mpz_ptr, op1: mpz_srcptr, op2: c_ulong);
#[link_name = "__gmpz_invert"]
pub fn mpz_invert(rop: mpz_ptr, op1: mpz_srcptr, op2: mpz_srcptr) -> c_int;
#[link_name = "__gmpz_jacobi"]
pub fn mpz_jacobi(a: mpz_srcptr, b: mpz_srcptr) -> c_int;
}
#[inline]
pub unsafe extern "C" fn mpz_legendre(a: mpz_srcptr, p: mpz_srcptr) -> c_int {
unsafe { mpz_jacobi(a, p) }
}
#[inline]
pub unsafe extern "C" fn mpz_kronecker(a: mpz_srcptr, b: mpz_srcptr) -> c_int {
unsafe { mpz_jacobi(a, b) }
}
extern "C" {
#[link_name = "__gmpz_kronecker_si"]
pub fn mpz_kronecker_si(a: mpz_srcptr, b: c_long) -> c_int;
#[link_name = "__gmpz_kronecker_ui"]
pub fn mpz_kronecker_ui(a: mpz_srcptr, b: c_ulong) -> c_int;
#[link_name = "__gmpz_si_kronecker"]
pub fn mpz_si_kronecker(a: c_long, b: mpz_srcptr) -> c_int;
#[link_name = "__gmpz_ui_kronecker"]
pub fn mpz_ui_kronecker(a: c_ulong, b: mpz_srcptr) -> c_int;
#[link_name = "__gmpz_remove"]
pub fn mpz_remove(rop: mpz_ptr, op: mpz_srcptr, f: mpz_srcptr) -> bitcnt_t;
#[link_name = "__gmpz_fac_ui"]
pub fn mpz_fac_ui(rop: mpz_ptr, n: c_ulong);
#[link_name = "__gmpz_2fac_ui"]
pub fn mpz_2fac_ui(rop: mpz_ptr, n: c_ulong);
#[link_name = "__gmpz_mfac_uiui"]
pub fn mpz_mfac_uiui(rop: mpz_ptr, n: c_ulong, m: c_ulong);
#[link_name = "__gmpz_primorial_ui"]
pub fn mpz_primorial_ui(r: mpz_ptr, n: c_ulong);
#[link_name = "__gmpz_bin_ui"]
pub fn mpz_bin_ui(rop: mpz_ptr, n: mpz_srcptr, k: c_ulong);
#[link_name = "__gmpz_bin_uiui"]
pub fn mpz_bin_uiui(rop: mpz_ptr, n: c_ulong, k: c_ulong);
#[link_name = "__gmpz_fib_ui"]
pub fn mpz_fib_ui(f_n: mpz_ptr, n: c_ulong);
#[link_name = "__gmpz_fib2_ui"]
pub fn mpz_fib2_ui(f_n: mpz_ptr, fnsub1: mpz_ptr, n: c_ulong);
#[link_name = "__gmpz_lucnum_ui"]
pub fn mpz_lucnum_ui(ln: mpz_ptr, n: c_ulong);
#[link_name = "__gmpz_lucnum2_ui"]
pub fn mpz_lucnum2_ui(ln: mpz_ptr, lnsub1: mpz_ptr, n: c_ulong);
#[link_name = "__gmpz_cmp"]
pub fn mpz_cmp(op1: mpz_srcptr, op2: mpz_srcptr) -> c_int;
#[link_name = "__gmpz_cmp_d"]
pub fn mpz_cmp_d(op1: mpz_srcptr, op2: f64) -> c_int;
#[link_name = "__gmpz_cmp_si"]
pub fn mpz_cmp_si(op1: mpz_srcptr, op2: c_long) -> c_int;
#[link_name = "__gmpz_cmp_ui"]
pub fn mpz_cmp_ui(op1: mpz_srcptr, op2: c_ulong) -> c_int;
#[link_name = "__gmpz_cmpabs"]
pub fn mpz_cmpabs(op1: mpz_srcptr, op2: mpz_srcptr) -> c_int;
#[link_name = "__gmpz_cmpabs_d"]
pub fn mpz_cmpabs_d(op1: mpz_srcptr, op2: f64) -> c_int;
#[link_name = "__gmpz_cmpabs_ui"]
pub fn mpz_cmpabs_ui(op1: mpz_srcptr, op2: c_ulong) -> c_int;
}
#[inline]
pub const unsafe extern "C" fn mpz_sgn(op: mpz_srcptr) -> c_int {
let size = unsafe { (*op).size };
if size < 0 {
-1
} else {
(size > 0) as c_int
}
}
extern "C" {
#[link_name = "__gmpz_and"]
pub fn mpz_and(rop: mpz_ptr, op1: mpz_srcptr, op2: mpz_srcptr);
#[link_name = "__gmpz_ior"]
pub fn mpz_ior(rop: mpz_ptr, op1: mpz_srcptr, op2: mpz_srcptr);
#[link_name = "__gmpz_xor"]
pub fn mpz_xor(rop: mpz_ptr, op1: mpz_srcptr, op2: mpz_srcptr);
#[link_name = "__gmpz_com"]
pub fn mpz_com(rop: mpz_ptr, op: mpz_srcptr);
}
#[inline]
pub unsafe extern "C" fn mpz_popcount(op: mpz_srcptr) -> bitcnt_t {
let size = unsafe { (*op).size };
match size.cmp(&0) {
Ordering::Less => !0,
Ordering::Equal => 0,
Ordering::Greater => unsafe { mpn_popcount((*op).d.as_ptr(), size.into()) },
}
}
extern "C" {
#[link_name = "__gmpz_hamdist"]
pub fn mpz_hamdist(op1: mpz_srcptr, op2: mpz_srcptr) -> bitcnt_t;
#[link_name = "__gmpz_scan0"]
pub fn mpz_scan0(op: mpz_srcptr, starting_bit: bitcnt_t) -> bitcnt_t;
#[link_name = "__gmpz_scan1"]
pub fn mpz_scan1(op: mpz_srcptr, starting_bit: bitcnt_t) -> bitcnt_t;
#[link_name = "__gmpz_setbit"]
pub fn mpz_setbit(rop: mpz_ptr, bit_index: bitcnt_t);
#[link_name = "__gmpz_clrbit"]
pub fn mpz_clrbit(rop: mpz_ptr, bit_index: bitcnt_t);
#[link_name = "__gmpz_combit"]
pub fn mpz_combit(rop: mpz_ptr, bit_index: bitcnt_t);
#[link_name = "__gmpz_tstbit"]
pub fn mpz_tstbit(op: mpz_srcptr, bit_index: bitcnt_t) -> c_int;
#[link_name = "__gmpz_out_str"]
pub fn mpz_out_str(stream: *mut FILE, base: c_int, op: mpz_srcptr) -> usize;
#[link_name = "__gmpz_inp_str"]
pub fn mpz_inp_str(rop: mpz_ptr, stream: *mut FILE, base: c_int) -> usize;
#[link_name = "__gmpz_out_raw"]
pub fn mpz_out_raw(stream: *mut FILE, op: mpz_srcptr) -> usize;
#[link_name = "__gmpz_inp_raw"]
pub fn mpz_inp_raw(rop: mpz_ptr, stream: *mut FILE) -> usize;
#[link_name = "__gmpz_urandomb"]
pub fn mpz_urandomb(rop: mpz_ptr, state: randstate_ptr, n: bitcnt_t);
#[link_name = "__gmpz_urandomm"]
pub fn mpz_urandomm(rop: mpz_ptr, state: randstate_ptr, n: mpz_srcptr);
#[link_name = "__gmpz_rrandomb"]
pub fn mpz_rrandomb(rop: mpz_ptr, state: randstate_ptr, n: bitcnt_t);
#[link_name = "__gmpz_random2"]
pub fn mpz_random2(rop: mpz_ptr, max_size: size_t);
#[link_name = "__gmpz_import"]
pub fn mpz_import(
rop: mpz_ptr,
count: usize,
order: c_int,
size: usize,
endian: c_int,
nails: usize,
op: *const c_void,
);
#[link_name = "__gmpz_export"]
pub fn mpz_export(
rop: *mut c_void,
countp: *mut usize,
order: c_int,
size: usize,
endian: c_int,
nails: usize,
op: mpz_srcptr,
) -> *mut c_void;
}
macro_rules! mpz_fits {
{ $(#[$attr:meta])* fn $name:ident($max:expr); } => {
#[cfg(not(nails))]
$(#[$attr])*
#[inline]
pub const unsafe extern "C" fn $name(op: mpz_srcptr) -> c_int {
let n = unsafe { (*op).size };
let p = unsafe { (*op).d }.as_ptr().cast_const();
let fits = n == 0 || (n == 1 && unsafe { *p } <= ($max as limb_t));
fits as c_int
}
#[cfg(nails)]
$(#[$attr])*
#[inline]
pub const unsafe extern "C" fn $name(op: mpz_srcptr) -> c_int {
let n = unsafe { (*op).size };
let p = unsafe { (*op).d }.as_ptr().cast_const();
let fits = n == 0 || (n == 1 && unsafe { *p } <= ($max as limb_t))
|| (n == 2
&& unsafe { *(p.offset(1)) } <= ($max as limb_t) >> NUMB_BITS);
fits as c_int
}
}
}
mpz_fits! {
fn mpz_fits_ulong_p(c_ulong::MAX);
}
extern "C" {
#[link_name = "__gmpz_fits_slong_p"]
pub fn mpz_fits_slong_p(op: mpz_srcptr) -> c_int;
}
mpz_fits! {
fn mpz_fits_uint_p(c_uint::MAX);
}
extern "C" {
#[link_name = "__gmpz_fits_sint_p"]
pub fn mpz_fits_sint_p(op: mpz_srcptr) -> c_int;
}
mpz_fits! {
fn mpz_fits_ushort_p(c_ushort::MAX);
}
extern "C" {
#[link_name = "__gmpz_fits_sshort_p"]
pub fn mpz_fits_sshort_p(op: mpz_srcptr) -> c_int;
}
#[inline]
pub const unsafe extern "C" fn mpz_odd_p(op: mpz_srcptr) -> c_int {
if unsafe { (*op).size } == 0 {
0
} else {
1 & unsafe { *((*op).d.as_ptr().cast_const()) } as c_int
}
}
#[inline]
pub const unsafe extern "C" fn mpz_even_p(op: mpz_srcptr) -> c_int {
(unsafe { mpz_odd_p(op) } == 0) as c_int
}
extern "C" {
#[link_name = "__gmpz_sizeinbase"]
pub fn mpz_sizeinbase(arg1: mpz_srcptr, arg2: c_int) -> usize;
#[link_name = "__gmpz_realloc"]
pub fn _mpz_realloc(integer: mpz_ptr, new_alloc: size_t) -> *mut c_void;
}
#[inline]
pub const unsafe extern "C" fn mpz_getlimbn(op: mpz_srcptr, n: size_t) -> limb_t {
if n >= 0 && n < (unsafe { (*op).size }.abs() as size_t) {
unsafe { *(((*op).d.as_ptr().cast_const()).offset(n as isize)) }
} else {
0
}
}
#[inline]
pub const unsafe extern "C" fn mpz_size(op: mpz_srcptr) -> usize {
unsafe { (*op).size }.unsigned_abs() as usize
}
extern "C" {
#[link_name = "__gmpz_limbs_read"]
pub fn mpz_limbs_read(x: mpz_srcptr) -> mp_srcptr;
#[link_name = "__gmpz_limbs_write"]
pub fn mpz_limbs_write(x: mpz_ptr, n: size_t) -> mp_ptr;
#[link_name = "__gmpz_limbs_modify"]
pub fn mpz_limbs_modify(x: mpz_ptr, n: size_t) -> mp_ptr;
#[link_name = "__gmpz_limbs_finish"]
pub fn mpz_limbs_finish(x: mpz_ptr, s: size_t);
#[link_name = "__gmpz_roinit_n"]
pub fn mpz_roinit_n(x: mpz_ptr, xp: mp_srcptr, xs: size_t) -> mpz_srcptr;
}
#[inline]
pub const unsafe extern "C" fn MPZ_ROINIT_N(xp: mp_ptr, xs: size_t) -> mpz_t {
mpz_t {
alloc: 0,
size: xs as c_int,
d: unsafe { NonNull::new_unchecked(xp) },
}
}
extern "C" {
#[link_name = "__gmpq_canonicalize"]
pub fn mpq_canonicalize(op: mpq_ptr);
#[link_name = "__gmpq_init"]
pub fn mpq_init(x: mpq_ptr);
#[link_name = "__gmpq_inits"]
pub fn mpq_inits(x: mpq_ptr, ...);
#[link_name = "__gmpq_clear"]
pub fn mpq_clear(x: mpq_ptr);
#[link_name = "__gmpq_clears"]
pub fn mpq_clears(x: mpq_ptr, ...);
#[link_name = "__gmpq_set"]
pub fn mpq_set(rop: mpq_ptr, op: mpq_srcptr);
#[link_name = "__gmpq_set_z"]
pub fn mpq_set_z(rop: mpq_ptr, op: mpz_srcptr);
#[link_name = "__gmpq_set_ui"]
pub fn mpq_set_ui(rop: mpq_ptr, op1: c_ulong, op2: c_ulong);
#[link_name = "__gmpq_set_si"]
pub fn mpq_set_si(rop: mpq_ptr, op1: c_long, op2: c_ulong);
#[link_name = "__gmpq_set_str"]
pub fn mpq_set_str(rop: mpq_ptr, str: *const c_char, base: c_int) -> c_int;
#[link_name = "__gmpq_swap"]
pub fn mpq_swap(rop1: mpq_ptr, rop2: mpq_ptr);
#[link_name = "__gmpq_get_d"]
pub fn mpq_get_d(op: mpq_srcptr) -> f64;
#[link_name = "__gmpq_set_d"]
pub fn mpq_set_d(rop: mpq_ptr, op: f64);
#[link_name = "__gmpq_set_f"]
pub fn mpq_set_f(rop: mpq_ptr, op: mpf_srcptr);
#[link_name = "__gmpq_get_str"]
pub fn mpq_get_str(str: *mut c_char, base: c_int, op: mpq_srcptr) -> *mut c_char;
#[link_name = "__gmpq_add"]
pub fn mpq_add(sum: mpq_ptr, addend1: mpq_srcptr, addend2: mpq_srcptr);
#[link_name = "__gmpq_sub"]
pub fn mpq_sub(difference: mpq_ptr, minuend: mpq_srcptr, subtrahend: mpq_srcptr);
#[link_name = "__gmpq_mul"]
pub fn mpq_mul(product: mpq_ptr, multiplier: mpq_srcptr, multiplicand: mpq_srcptr);
#[link_name = "__gmpq_mul_2exp"]
pub fn mpq_mul_2exp(rop: mpq_ptr, op1: mpq_srcptr, op2: bitcnt_t);
#[link_name = "__gmpq_div"]
pub fn mpq_div(quotient: mpq_ptr, dividend: mpq_srcptr, divisor: mpq_srcptr);
#[link_name = "__gmpq_div_2exp"]
pub fn mpq_div_2exp(rop: mpq_ptr, op1: mpq_srcptr, op2: bitcnt_t);
}
#[inline]
pub unsafe extern "C" fn mpq_neg(negated_operand: mpq_ptr, operand: mpq_srcptr) {
if !ptr::eq(negated_operand, operand) {
unsafe { mpq_set(negated_operand, operand) };
}
unsafe {
(*negated_operand).num.size = -(*negated_operand).num.size;
}
}
#[inline]
pub unsafe extern "C" fn mpq_abs(rop: mpq_ptr, op: mpq_srcptr) {
if !ptr::eq(rop, op) {
unsafe {
mpq_set(rop, op);
}
}
unsafe {
(*rop).num.size = (*rop).num.size.abs();
}
}
extern "C" {
#[link_name = "__gmpq_inv"]
pub fn mpq_inv(inverted_number: mpq_ptr, number: mpq_srcptr);
#[link_name = "__gmpq_cmp"]
pub fn mpq_cmp(op1: mpq_srcptr, op2: mpq_srcptr) -> c_int;
#[link_name = "__gmpq_cmp_z"]
pub fn mpq_cmp_z(op1: mpq_srcptr, op2: mpz_srcptr) -> c_int;
#[link_name = "__gmpq_cmp_ui"]
pub fn mpq_cmp_ui(op1: mpq_srcptr, num2: c_ulong, den2: c_ulong) -> c_int;
#[link_name = "__gmpq_cmp_si"]
pub fn mpq_cmp_si(op1: mpq_srcptr, num2: c_long, den2: c_ulong) -> c_int;
}
#[inline]
pub const unsafe extern "C" fn mpq_sgn(op: mpq_srcptr) -> c_int {
let size = unsafe { (*op).num.size };
if size < 0 {
-1
} else {
(size > 0) as c_int
}
}
extern "C" {
#[link_name = "__gmpq_equal"]
pub fn mpq_equal(op1: mpq_srcptr, op2: mpq_srcptr) -> c_int;
}
#[inline]
pub const unsafe extern "C" fn mpq_numref(op: mpq_ptr) -> mpz_ptr {
unsafe { mpq_numref_const(op) as mpz_ptr }
}
#[inline]
pub const unsafe extern "C" fn mpq_numref_const(op: mpq_srcptr) -> mpz_srcptr {
unsafe { ptr::addr_of!((*op).num) }
}
#[inline]
pub const unsafe extern "C" fn mpq_denref(op: mpq_ptr) -> mpz_ptr {
unsafe { mpq_denref_const(op) as mpz_ptr }
}
#[inline]
pub const unsafe extern "C" fn mpq_denref_const(op: mpq_srcptr) -> mpz_srcptr {
unsafe { ptr::addr_of!((*op).den) }
}
extern "C" {
#[link_name = "__gmpq_get_num"]
pub fn mpq_get_num(numerator: mpz_ptr, rational: mpq_srcptr);
#[link_name = "__gmpq_get_den"]
pub fn mpq_get_den(denominator: mpz_ptr, rational: mpq_srcptr);
#[link_name = "__gmpq_set_num"]
pub fn mpq_set_num(rational: mpq_ptr, denominator: mpz_srcptr);
#[link_name = "__gmpq_set_den"]
pub fn mpq_set_den(rational: mpq_ptr, numerator: mpz_srcptr);
#[link_name = "__gmpq_out_str"]
pub fn mpq_out_str(stream: *mut FILE, base: c_int, op: mpq_srcptr) -> usize;
#[link_name = "__gmpq_inp_str"]
pub fn mpq_inp_str(rop: mpq_ptr, stream: *mut FILE, base: c_int) -> usize;
}
extern "C" {
#[link_name = "__gmpf_set_default_prec"]
pub fn mpf_set_default_prec(prec: bitcnt_t);
#[link_name = "__gmpf_get_default_prec"]
pub fn mpf_get_default_prec() -> bitcnt_t;
#[link_name = "__gmpf_init"]
pub fn mpf_init(x: mpf_ptr);
#[link_name = "__gmpf_init2"]
pub fn mpf_init2(x: mpf_ptr, prec: bitcnt_t);
#[link_name = "__gmpf_inits"]
pub fn mpf_inits(x: mpf_ptr, ...);
#[link_name = "__gmpf_clear"]
pub fn mpf_clear(x: mpf_ptr);
#[link_name = "__gmpf_clears"]
pub fn mpf_clears(x: mpf_ptr, ...);
#[link_name = "__gmpf_get_prec"]
pub fn mpf_get_prec(op: mpf_srcptr) -> bitcnt_t;
#[link_name = "__gmpf_set_prec"]
pub fn mpf_set_prec(rop: mpf_ptr, prec: bitcnt_t);
#[link_name = "__gmpf_set_prec_raw"]
pub fn mpf_set_prec_raw(rop: mpf_ptr, prec: bitcnt_t);
#[link_name = "__gmpf_set"]
pub fn mpf_set(rop: mpf_ptr, op: mpf_srcptr);
#[link_name = "__gmpf_set_ui"]
pub fn mpf_set_ui(rop: mpf_ptr, op: c_ulong);
#[link_name = "__gmpf_set_si"]
pub fn mpf_set_si(rop: mpf_ptr, op: c_long);
#[link_name = "__gmpf_set_d"]
pub fn mpf_set_d(rop: mpf_ptr, op: f64);
#[link_name = "__gmpf_set_z"]
pub fn mpf_set_z(rop: mpf_ptr, op: mpz_srcptr);
#[link_name = "__gmpf_set_q"]
pub fn mpf_set_q(rop: mpf_ptr, op: mpq_srcptr);
#[link_name = "__gmpf_set_str"]
pub fn mpf_set_str(rop: mpf_ptr, str: *const c_char, base: c_int) -> c_int;
#[link_name = "__gmpf_swap"]
pub fn mpf_swap(rop1: mpf_ptr, rop2: mpf_ptr);
#[link_name = "__gmpf_init_set"]
pub fn mpf_init_set(rop: mpf_ptr, op: mpf_srcptr);
#[link_name = "__gmpf_init_set_ui"]
pub fn mpf_init_set_ui(rop: mpf_ptr, op: c_ulong);
#[link_name = "__gmpf_init_set_si"]
pub fn mpf_init_set_si(rop: mpf_ptr, op: c_long);
#[link_name = "__gmpf_init_set_d"]
pub fn mpf_init_set_d(rop: mpf_ptr, op: f64);
#[link_name = "__gmpf_init_set_str"]
pub fn mpf_init_set_str(rop: mpf_ptr, str: *const c_char, base: c_int) -> c_int;
#[link_name = "__gmpf_get_d"]
pub fn mpf_get_d(op: mpf_srcptr) -> f64;
#[link_name = "__gmpf_get_d_2exp"]
pub fn mpf_get_d_2exp(exp: *mut c_long, op: mpf_srcptr) -> f64;
#[link_name = "__gmpf_get_si"]
pub fn mpf_get_si(op: mpf_srcptr) -> c_long;
#[link_name = "__gmpf_get_ui"]
pub fn mpf_get_ui(op: mpf_srcptr) -> c_ulong;
#[link_name = "__gmpf_get_str"]
pub fn mpf_get_str(
str: *mut c_char,
expptr: *mut exp_t,
base: c_int,
n_digits: usize,
op: mpf_srcptr,
) -> *mut c_char;
#[link_name = "__gmpf_add"]
pub fn mpf_add(rop: mpf_ptr, op1: mpf_srcptr, op2: mpf_srcptr);
#[link_name = "__gmpf_add_ui"]
pub fn mpf_add_ui(rop: mpf_ptr, op1: mpf_srcptr, op2: c_ulong);
#[link_name = "__gmpf_sub"]
pub fn mpf_sub(rop: mpf_ptr, op1: mpf_srcptr, op2: mpf_srcptr);
#[link_name = "__gmpf_ui_sub"]
pub fn mpf_ui_sub(rop: mpf_ptr, op1: c_ulong, op2: mpf_srcptr);
#[link_name = "__gmpf_sub_ui"]
pub fn mpf_sub_ui(rop: mpf_ptr, op1: mpf_srcptr, op2: c_ulong);
#[link_name = "__gmpf_mul"]
pub fn mpf_mul(rop: mpf_ptr, op1: mpf_srcptr, op2: mpf_srcptr);
#[link_name = "__gmpf_mul_ui"]
pub fn mpf_mul_ui(rop: mpf_ptr, op1: mpf_srcptr, op2: c_ulong);
#[link_name = "__gmpf_div"]
pub fn mpf_div(rop: mpf_ptr, op1: mpf_srcptr, op2: mpf_srcptr);
#[link_name = "__gmpf_ui_div"]
pub fn mpf_ui_div(rop: mpf_ptr, op1: c_ulong, op2: mpf_srcptr);
#[link_name = "__gmpf_div_ui"]
pub fn mpf_div_ui(rop: mpf_ptr, op1: mpf_srcptr, op2: c_ulong);
#[link_name = "__gmpf_sqrt"]
pub fn mpf_sqrt(rop: mpf_ptr, op: mpf_srcptr);
#[link_name = "__gmpf_sqrt_ui"]
pub fn mpf_sqrt_ui(rop: mpf_ptr, op: c_ulong);
#[link_name = "__gmpf_pow_ui"]
pub fn mpf_pow_ui(rop: mpf_ptr, op1: mpf_srcptr, op2: c_ulong);
#[link_name = "__gmpf_neg"]
pub fn mpf_neg(rop: mpf_ptr, op: mpf_srcptr);
#[link_name = "__gmpf_abs"]
pub fn mpf_abs(rop: mpf_ptr, op: mpf_srcptr);
#[link_name = "__gmpf_mul_2exp"]
pub fn mpf_mul_2exp(rop: mpf_ptr, op1: mpf_srcptr, op2: bitcnt_t);
#[link_name = "__gmpf_div_2exp"]
pub fn mpf_div_2exp(rop: mpf_ptr, op1: mpf_srcptr, op2: bitcnt_t);
#[link_name = "__gmpf_cmp"]
pub fn mpf_cmp(op1: mpf_srcptr, op2: mpf_srcptr) -> c_int;
#[link_name = "__gmpf_cmp_z"]
pub fn mpf_cmp_z(op1: mpf_srcptr, op2: mpz_srcptr) -> c_int;
#[link_name = "__gmpf_cmp_d"]
pub fn mpf_cmp_d(op1: mpf_srcptr, op2: f64) -> c_int;
#[link_name = "__gmpf_cmp_ui"]
pub fn mpf_cmp_ui(op1: mpf_srcptr, op2: c_ulong) -> c_int;
#[link_name = "__gmpf_cmp_si"]
pub fn mpf_cmp_si(op1: mpf_srcptr, op2: c_long) -> c_int;
#[link_name = "__gmpf_eq"]
pub fn mpf_eq(op1: mpf_srcptr, op2: mpf_srcptr, op3: bitcnt_t) -> c_int;
#[link_name = "__gmpf_reldiff"]
pub fn mpf_reldiff(rop: mpf_ptr, op1: mpf_srcptr, op2: mpf_srcptr);
}
#[inline]
pub const unsafe extern "C" fn mpf_sgn(op: mpf_srcptr) -> c_int {
let size = unsafe { (*op).size };
if size < 0 {
-1
} else {
(size > 0) as c_int
}
}
extern "C" {
#[link_name = "__gmpf_out_str"]
pub fn mpf_out_str(stream: *mut FILE, base: c_int, n_digits: usize, op: mpf_srcptr) -> usize;
#[link_name = "__gmpf_inp_str"]
pub fn mpf_inp_str(rop: mpf_ptr, stream: *mut FILE, base: c_int) -> usize;
#[link_name = "__gmpf_ceil"]
pub fn mpf_ceil(rop: mpf_ptr, op: mpf_srcptr);
#[link_name = "__gmpf_floor"]
pub fn mpf_floor(rop: mpf_ptr, op: mpf_srcptr);
#[link_name = "__gmpf_trunc"]
pub fn mpf_trunc(rop: mpf_ptr, op: mpf_srcptr);
#[link_name = "__gmpf_integer_p"]
pub fn mpf_integer_p(op: mpf_srcptr) -> c_int;
#[link_name = "__gmpf_fits_ulong_p"]
pub fn mpf_fits_ulong_p(op: mpf_srcptr) -> c_int;
#[link_name = "__gmpf_fits_slong_p"]
pub fn mpf_fits_slong_p(op: mpf_srcptr) -> c_int;
#[link_name = "__gmpf_fits_uint_p"]
pub fn mpf_fits_uint_p(op: mpf_srcptr) -> c_int;
#[link_name = "__gmpf_fits_sint_p"]
pub fn mpf_fits_sint_p(op: mpf_srcptr) -> c_int;
#[link_name = "__gmpf_fits_ushort_p"]
pub fn mpf_fits_ushort_p(op: mpf_srcptr) -> c_int;
#[link_name = "__gmpf_fits_sshort_p"]
pub fn mpf_fits_sshort_p(op: mpf_srcptr) -> c_int;
#[link_name = "__gmpf_urandomb"]
pub fn mpf_urandomb(rop: mpf_t, state: randstate_ptr, nbits: bitcnt_t);
#[link_name = "__gmpf_random2"]
pub fn mpf_random2(rop: mpf_ptr, max_size: size_t, exp: exp_t);
}
extern "C" {
#[link_name = "__gmpn_add_n"]
pub fn mpn_add_n(rp: mp_ptr, s1p: mp_srcptr, s2p: mp_srcptr, n: size_t) -> limb_t;
#[link_name = "__gmpn_add_1"]
pub fn mpn_add_1(rp: mp_ptr, s1p: mp_srcptr, n: size_t, s2limb: limb_t) -> limb_t;
#[link_name = "__gmpn_add"]
pub fn mpn_add(rp: mp_ptr, s1p: mp_srcptr, s1n: size_t, s2p: mp_srcptr, s2n: size_t) -> limb_t;
#[link_name = "__gmpn_sub_n"]
pub fn mpn_sub_n(rp: mp_ptr, s1p: mp_srcptr, s2p: mp_srcptr, n: size_t) -> limb_t;
#[link_name = "__gmpn_sub_1"]
pub fn mpn_sub_1(rp: mp_ptr, s1p: mp_srcptr, n: size_t, s2limb: limb_t) -> limb_t;
#[link_name = "__gmpn_sub"]
pub fn mpn_sub(rp: mp_ptr, s1p: mp_srcptr, s1n: size_t, s2p: mp_srcptr, s2n: size_t) -> limb_t;
#[link_name = "__gmpn_neg"]
pub fn mpn_neg(rp: mp_ptr, sp: mp_srcptr, n: size_t) -> limb_t;
#[link_name = "__gmpn_mul_n"]
pub fn mpn_mul_n(rp: mp_ptr, s1p: mp_srcptr, s2p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_mul"]
pub fn mpn_mul(rp: mp_ptr, s1p: mp_srcptr, s1n: size_t, s2p: mp_srcptr, s2n: size_t) -> limb_t;
#[link_name = "__gmpn_sqr"]
pub fn mpn_sqr(rp: mp_ptr, s1p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_mul_1"]
pub fn mpn_mul_1(rp: mp_ptr, s1p: mp_srcptr, n: size_t, s2limb: limb_t) -> limb_t;
#[link_name = "__gmpn_addmul_1"]
pub fn mpn_addmul_1(rp: mp_ptr, s1p: mp_srcptr, n: size_t, s2limb: limb_t) -> limb_t;
#[link_name = "__gmpn_submul_1"]
pub fn mpn_submul_1(rp: mp_ptr, s1p: mp_srcptr, n: size_t, s2limb: limb_t) -> limb_t;
#[link_name = "__gmpn_tdiv_qr"]
pub fn mpn_tdiv_qr(
qp: mp_ptr,
rp: mp_ptr,
qxn: size_t,
np: mp_srcptr,
nn: size_t,
dp: mp_srcptr,
dn: size_t,
);
#[link_name = "__gmpn_divrem_1"]
pub fn mpn_divrem_1(
r1p: mp_ptr,
qxn: size_t,
s2p: mp_srcptr,
s2n: size_t,
s3limb: limb_t,
) -> limb_t;
}
#[inline]
pub unsafe extern "C" fn mpn_divmod_1(
r1p: mp_ptr,
s2p: mp_srcptr,
s2n: size_t,
s3limb: limb_t,
) -> limb_t {
unsafe { mpn_divrem_1(r1p, 0, s2p, s2n, s3limb) }
}
extern "C" {
#[link_name = "__gmpn_divexact_1"]
pub fn mpn_divexact_1(rp: mp_ptr, sp: mp_srcptr, n: size_t, d: limb_t);
}
#[inline]
pub unsafe extern "C" fn mpn_divexact_by3(rp: mp_ptr, sp: mp_srcptr, n: size_t) -> limb_t {
unsafe { mpn_divexact_by3c(rp, sp, n, 0) }
}
extern "C" {
#[link_name = "__gmpn_divexact_by3c"]
pub fn mpn_divexact_by3c(rp: mp_ptr, sp: mp_srcptr, n: size_t, carry: limb_t) -> limb_t;
#[link_name = "__gmpn_mod_1"]
pub fn mpn_mod_1(s1p: mp_srcptr, s1n: size_t, s2limb: limb_t) -> limb_t;
#[link_name = "__gmpn_lshift"]
pub fn mpn_lshift(rp: mp_ptr, sp: mp_srcptr, n: size_t, count: c_uint) -> limb_t;
#[link_name = "__gmpn_rshift"]
pub fn mpn_rshift(rp: mp_ptr, sp: mp_srcptr, n: size_t, count: c_uint) -> limb_t;
#[link_name = "__gmpn_cmp"]
pub fn mpn_cmp(s1p: mp_srcptr, s2p: mp_srcptr, n: size_t) -> c_int;
#[link_name = "__gmpn_zero_p"]
pub fn mpn_zero_p(sp: mp_srcptr, n: size_t) -> c_int;
#[link_name = "__gmpn_gcd"]
pub fn mpn_gcd(rp: mp_ptr, xp: mp_ptr, xn: size_t, yp: mp_ptr, yn: size_t) -> size_t;
#[link_name = "__gmpn_gcd_1"]
pub fn mpn_gcd_1(xp: mp_srcptr, xn: size_t, yimb: limb_t) -> limb_t;
#[link_name = "__gmpn_gcdext"]
pub fn mpn_gcdext(
gp: mp_ptr,
sp: mp_ptr,
sn: *mut size_t,
up: mp_ptr,
un: size_t,
vp: mp_ptr,
vn: size_t,
) -> size_t;
#[link_name = "__gmpn_sqrtrem"]
pub fn mpn_sqrtrem(r1p: mp_ptr, r2p: mp_ptr, sp: mp_srcptr, n: size_t) -> size_t;
#[link_name = "__gmpn_sizeinbase"]
pub fn mpn_sizeinbase(xp: mp_srcptr, n: size_t, base: c_int) -> usize;
#[link_name = "__gmpn_get_str"]
pub fn mpn_get_str(str: *mut c_uchar, base: c_int, s1p: mp_ptr, s1n: size_t) -> usize;
#[link_name = "__gmpn_set_str"]
pub fn mpn_set_str(rp: mp_ptr, str: *const c_uchar, strsize: usize, base: c_int) -> size_t;
#[link_name = "__gmpn_scan0"]
pub fn mpn_scan0(s1p: mp_srcptr, bit: bitcnt_t) -> bitcnt_t;
#[link_name = "__gmpn_scan1"]
pub fn mpn_scan1(s1p: mp_srcptr, bit: bitcnt_t) -> bitcnt_t;
#[link_name = "__gmpn_random"]
pub fn mpn_random(r1p: mp_ptr, r1n: size_t);
#[link_name = "__gmpn_random2"]
pub fn mpn_random2(r1p: mp_ptr, r1n: size_t);
#[link_name = "__gmpn_popcount"]
pub fn mpn_popcount(s1p: mp_srcptr, n: size_t) -> bitcnt_t;
#[link_name = "__gmpn_hamdist"]
pub fn mpn_hamdist(s1p: mp_srcptr, s2p: mp_srcptr, n: size_t) -> bitcnt_t;
#[link_name = "__gmpn_perfect_square_p"]
pub fn mpn_perfect_square_p(s1p: mp_srcptr, n: size_t) -> c_int;
#[link_name = "__gmpn_and_n"]
pub fn mpn_and_n(rp: mp_ptr, s1p: mp_srcptr, s2p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_ior_n"]
pub fn mpn_ior_n(rp: mp_ptr, s1p: mp_srcptr, s2p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_xor_n"]
pub fn mpn_xor_n(rp: mp_ptr, s1p: mp_srcptr, s2p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_andn_n"]
pub fn mpn_andn_n(rp: mp_ptr, s1p: mp_srcptr, s2p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_iorn_n"]
pub fn mpn_iorn_n(rp: mp_ptr, s1p: mp_srcptr, s2p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_nand_n"]
pub fn mpn_nand_n(rp: mp_ptr, s1p: mp_srcptr, s2p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_nior_n"]
pub fn mpn_nior_n(rp: mp_ptr, s1p: mp_srcptr, s2p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_xnor_n"]
pub fn mpn_xnor_n(rp: mp_ptr, s1p: mp_srcptr, s2p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_com"]
pub fn mpn_com(rp: mp_ptr, sp: mp_srcptr, n: size_t);
#[link_name = "__gmpn_copyi"]
pub fn mpn_copyi(rp: mp_ptr, s1p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_copyd"]
pub fn mpn_copyd(rp: mp_ptr, s1p: mp_srcptr, n: size_t);
#[link_name = "__gmpn_zero"]
pub fn mpn_zero(rp: mp_ptr, n: size_t);
#[link_name = "__gmpn_cnd_add_n"]
pub fn mpn_cnd_add_n(
cnd: limb_t,
rp: mp_ptr,
s1p: mp_srcptr,
s2p: mp_srcptr,
n: size_t,
) -> limb_t;
#[link_name = "__gmpn_cnd_sub_n"]
pub fn mpn_cnd_sub_n(
cnd: limb_t,
rp: mp_ptr,
s1p: mp_srcptr,
s2p: mp_srcptr,
n: size_t,
) -> limb_t;
#[link_name = "__gmpn_sec_add_1"]
pub fn mpn_sec_add_1(rp: mp_ptr, ap: mp_srcptr, n: size_t, b: limb_t, tp: mp_ptr) -> limb_t;
#[link_name = "__gmpn_sec_add_1_itch"]
pub fn mpn_sec_add_1_itch(n: size_t) -> size_t;
#[link_name = "__gmpn_sec_sub_1"]
pub fn mpn_sec_sub_1(rp: mp_ptr, ap: mp_srcptr, n: size_t, b: limb_t, tp: mp_ptr) -> limb_t;
#[link_name = "__gmpn_sec_sub_1_itch"]
pub fn mpn_sec_sub_1_itch(n: size_t) -> size_t;
#[link_name = "__gmpn_cnd_swap"]
pub fn mpn_cnd_swap(cnd: limb_t, ap: *mut limb_t, bp: *mut limb_t, n: size_t);
#[link_name = "__gmpn_sec_mul"]
pub fn mpn_sec_mul(
rp: mp_ptr,
ap: mp_srcptr,
an: size_t,
bp: mp_srcptr,
bn: size_t,
tp: mp_ptr,
);
#[link_name = "__gmpn_sec_mul_itch"]
pub fn mpn_sec_mul_itch(an: size_t, bn: size_t) -> size_t;
#[link_name = "__gmpn_sec_sqr"]
pub fn mpn_sec_sqr(rp: mp_ptr, ap: mp_srcptr, an: size_t, tp: mp_ptr);
#[link_name = "__gmpn_sec_sqr_itch"]
pub fn mpn_sec_sqr_itch(an: size_t) -> size_t;
#[link_name = "__gmpn_sec_powm"]
pub fn mpn_sec_powm(
rp: mp_ptr,
bp: mp_srcptr,
bn: size_t,
ep: mp_srcptr,
enb: bitcnt_t,
mp: mp_srcptr,
n: size_t,
tp: mp_ptr,
);
#[link_name = "__gmpn_sec_powm_itch"]
pub fn mpn_sec_powm_itch(bn: size_t, enb: bitcnt_t, n: size_t) -> size_t;
#[link_name = "__gmpn_sec_tabselect"]
pub fn mpn_sec_tabselect(
rp: *mut limb_t,
tab: *const limb_t,
n: size_t,
nents: size_t,
which: size_t,
);
#[link_name = "__gmpn_sec_div_qr"]
pub fn mpn_sec_div_qr(
qp: mp_ptr,
np: mp_ptr,
nn: size_t,
dp: mp_srcptr,
dn: size_t,
tp: mp_ptr,
) -> limb_t;
#[link_name = "__gmpn_sec_div_qr_itch"]
pub fn mpn_sec_div_qr_itch(nn: size_t, dn: size_t) -> size_t;
#[link_name = "__gmpn_sec_div_r"]
pub fn mpn_sec_div_r(np: mp_ptr, nn: size_t, dp: mp_srcptr, dn: size_t, tp: mp_ptr);
#[link_name = "__gmpn_sec_div_r_itch"]
pub fn mpn_sec_div_r_itch(nn: size_t, dn: size_t) -> size_t;
#[link_name = "__gmpn_sec_invert"]
pub fn mpn_sec_invert(
rp: mp_ptr,
ap: mp_ptr,
mp: mp_srcptr,
n: size_t,
nbcnt: bitcnt_t,
tp: mp_ptr,
) -> c_int;
#[link_name = "__gmpn_sec_invert_itch"]
pub fn mpn_sec_invert_itch(n: size_t) -> size_t;
}
extern "C" {
#[link_name = "__gmp_randinit_default"]
pub fn randinit_default(state: randstate_ptr);
#[link_name = "__gmp_randinit_mt"]
pub fn randinit_mt(state: randstate_ptr);
#[link_name = "__gmp_randinit_lc_2exp"]
pub fn randinit_lc_2exp(state: randstate_ptr, a: mpz_srcptr, c: c_ulong, m2exp: bitcnt_t);
#[link_name = "__gmp_randinit_lc_2exp_size"]
pub fn randinit_lc_2exp_size(state: randstate_ptr, size: bitcnt_t) -> c_int;
#[link_name = "__gmp_randinit_set"]
pub fn randinit_set(rop: randstate_ptr, op: randstate_srcptr);
#[link_name = "__gmp_randclear"]
pub fn randclear(state: randstate_ptr);
#[link_name = "__gmp_randseed"]
pub fn randseed(state: randstate_ptr, seed: mpz_srcptr);
#[link_name = "__gmp_randseed_ui"]
pub fn randseed_ui(state: randstate_ptr, seed: c_ulong);
#[link_name = "__gmp_urandomb_ui"]
pub fn urandomb_ui(state: randstate_ptr, n: c_ulong) -> c_ulong;
#[link_name = "__gmp_urandomm_ui"]
pub fn urandomm_ui(state: randstate_ptr, n: c_ulong) -> c_ulong;
}
extern "C" {
#[link_name = "__gmp_printf"]
pub fn printf(fmt: *const c_char, ...) -> c_int;
#[link_name = "__gmp_fprintf"]
pub fn fprintf(fp: *mut FILE, fmt: *const c_char, ...) -> c_int;
#[link_name = "__gmp_sprintf"]
pub fn sprintf(buf: *mut c_char, fmt: *const c_char, ...) -> c_int;
#[link_name = "__gmp_snprintf"]
pub fn snprintf(buf: *mut c_char, size: usize, fmt: *const c_char, ...) -> c_int;
#[link_name = "__gmp_asprintf"]
pub fn asprintf(pp: *mut *mut c_char, fmt: *const c_char, ...) -> c_int;
}
extern "C" {
#[link_name = "__gmp_scanf"]
pub fn scanf(fmt: *const c_char, ...) -> c_int;
#[link_name = "__gmp_fscanf"]
pub fn fscanf(fp: *mut FILE, fmt: *const c_char, ...) -> c_int;
#[link_name = "__gmp_sscanf"]
pub fn sscanf(s: *const c_char, fmt: *const c_char, ...) -> c_int;
}
pub type allocate_function = Option<extern "C" fn(alloc_size: usize) -> *mut c_void>;
pub type reallocate_function =
Option<unsafe extern "C" fn(ptr: *mut c_void, old_size: usize, new_size: usize) -> *mut c_void>;
pub type free_function = Option<unsafe extern "C" fn(ptr: *mut c_void, size: usize)>;
extern "C" {
#[link_name = "__gmp_set_memory_functions"]
pub fn set_memory_functions(
alloc_func_ptr: allocate_function,
realloc_func_ptr: reallocate_function,
free_func_ptr: free_function,
);
#[link_name = "__gmp_get_memory_functions"]
pub fn get_memory_functions(
alloc_func_ptr: *mut allocate_function,
realloc_func_ptr: *mut reallocate_function,
free_func_ptr: *mut free_function,
);
}
#[cfg(test)]
mod tests {
use crate::gmp;
use core::mem;
use core::ptr::NonNull;
#[test]
fn check_mpq_num_den_offsets() {
let mut limbs: [gmp::limb_t; 2] = [1, 1];
let mut q = gmp::mpq_t {
num: gmp::mpz_t {
alloc: 1,
size: 1,
d: NonNull::from(&mut limbs[0]),
},
den: gmp::mpz_t {
alloc: 1,
size: 1,
d: NonNull::from(&mut limbs[1]),
},
};
unsafe {
assert_eq!(&q.num as *const gmp::mpz_t, gmp::mpq_numref_const(&q));
assert_eq!(&q.den as *const gmp::mpz_t, gmp::mpq_denref_const(&q));
assert_eq!(&mut q.num as *mut gmp::mpz_t, gmp::mpq_numref(&mut q));
assert_eq!(&mut q.den as *mut gmp::mpz_t, gmp::mpq_denref(&mut q));
}
}
#[test]
fn check_limb_size() {
let from_static = unsafe { gmp::bits_per_limb };
let from_type = mem::size_of::<gmp::limb_t>() * 8;
let from_constant = gmp::LIMB_BITS;
assert_eq!(from_static as usize, from_type);
assert_eq!(from_static, from_constant);
}
#[test]
fn check_version() {
use crate::tests;
let (major, minor, patchlevel) = (6, 3, 0);
let version = "6.3.0";
assert_eq!(gmp::VERSION, major);
assert!(gmp::VERSION_MINOR >= minor);
if cfg!(not(feature = "use-system-libs")) {
assert!(gmp::VERSION_MINOR > minor || gmp::VERSION_PATCHLEVEL >= patchlevel);
if gmp::VERSION_MINOR == minor && gmp::VERSION_PATCHLEVEL == patchlevel {
assert_eq!(unsafe { tests::str_from_cstr(gmp::version) }, version);
}
}
}
}