Created
January 4, 2019 19:58
-
-
Save ThatsNoMoon/9b01ec688e63f7258ad127cea078ebba to your computer and use it in GitHub Desktop.
Pi benchmarks -- luajit vs C
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
local ffi = require 'ffi' | |
local jit = require 'jit' | |
local header = [[ | |
// __GMP_SHORT_LIMB | |
// typedef unsigned int mp_limb_t; | |
// typedef int mp_limb_signed_t; | |
// _LONG_LONG_LIMB | |
// typedef unsigned long long int mp_limb_t; | |
// typedef long long int mp_limb_signed_t; | |
typedef unsigned long int mp_limb_t; | |
typedef long int mp_limb_signed_t; | |
typedef unsigned long int mp_bitcnt_t; | |
typedef mp_limb_t* mp_ptr; | |
typedef const mp_limb_t* mp_srcptr; | |
typedef int mp_size_t; | |
typedef int mp_exp_t; | |
// typedef long int mp_size_t; | |
// typedef long int mp_exp_t; | |
typedef struct | |
{ | |
int _mp_alloc; | |
int _mp_size; | |
mp_limb_t* _mp_d; | |
} __mpz_struct; | |
typedef struct | |
{ | |
__mpz_struct _mp_num; | |
__mpz_struct _mp_den; | |
} __mpq_struct; | |
typedef struct | |
{ | |
int _mp_prec; | |
int _mp_size; | |
mp_exp_t _mp_exp; | |
mp_limb_t* _mp_d; | |
} __mpf_struct; | |
typedef __mpz_struct mpz_t[1]; | |
typedef __mpq_struct mpq_t[1]; | |
typedef __mpf_struct mpf_t[1]; | |
typedef enum | |
{ | |
GMP_RAND_ALG_DEFAULT = 0, | |
GMP_RAND_ALG_LC = GMP_RAND_ALG_DEFAULT | |
} gmp_randalg_t; | |
typedef struct | |
{ | |
mpz_t _mp_seed; | |
gmp_randalg_t _mp_alg; | |
union { | |
void *_mp_lc; | |
} _mp_algdata; | |
} __gmp_randstate_struct; | |
typedef __gmp_randstate_struct gmp_randstate_t[1]; | |
typedef const __mpz_struct* mpz_srcptr; | |
typedef __mpz_struct* mpz_ptr; | |
typedef const __mpf_struct* mpf_srcptr; | |
typedef __mpf_struct* mpf_ptr; | |
typedef const __mpq_struct* mpq_srcptr; | |
typedef __mpq_struct* mpq_ptr; | |
typedef void* FILE; | |
void __gmp_randinit_default (gmp_randstate_t); | |
void __gmp_randinit_lc_2exp (gmp_randstate_t, mpz_srcptr, unsigned long int, mp_bitcnt_t); | |
int __gmp_randinit_lc_2exp_size (gmp_randstate_t, mp_bitcnt_t); | |
void __gmp_randinit_mt (gmp_randstate_t); | |
void __gmp_randinit_set (gmp_randstate_t, const __gmp_randstate_struct *); | |
void __gmp_randseed (gmp_randstate_t, mpz_srcptr); | |
void __gmp_randseed_ui (gmp_randstate_t, unsigned long int); | |
void __gmp_randclear (gmp_randstate_t); | |
unsigned long __gmp_urandomb_ui (gmp_randstate_t, unsigned long); | |
unsigned long __gmp_urandomm_ui (gmp_randstate_t, unsigned long); | |
int __gmp_asprintf (char **, const char *, ...); | |
int __gmp_fprintf (FILE *, const char *, ...); | |
int __gmp_printf (const char *, ...); | |
int __gmp_snprintf (char *, size_t, const char *, ...); | |
int __gmp_sprintf (char *, const char *, ...); | |
int __gmp_fscanf (FILE *, const char *, ...); | |
int __gmp_scanf (const char *, ...); | |
int __gmp_sscanf (const char *, const char *, ...); | |
void *__gmpz_realloc (mpz_ptr, mp_size_t); | |
void __gmpz_abs (mpz_ptr, mpz_srcptr); | |
void __gmpz_add (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_add_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_addmul (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_addmul_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_and (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_bin_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_bin_uiui (mpz_ptr, unsigned long int, unsigned long int); | |
void __gmpz_cdiv_q (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_cdiv_q_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t); | |
unsigned long int __gmpz_cdiv_q_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_cdiv_qr (mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr); | |
unsigned long int __gmpz_cdiv_qr_ui (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_cdiv_r (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_cdiv_r_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t); | |
unsigned long int __gmpz_cdiv_r_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
unsigned long int __gmpz_cdiv_ui (mpz_srcptr, unsigned long int); | |
void __gmpz_clear (mpz_ptr); | |
void __gmpz_clears (mpz_ptr, ...); | |
void __gmpz_clrbit (mpz_ptr, mp_bitcnt_t); | |
int __gmpz_cmp (mpz_srcptr, mpz_srcptr); | |
int __gmpz_cmp_d (mpz_srcptr, double); | |
int __gmpz_cmp_si (mpz_srcptr, signed long int); | |
int __gmpz_cmp_ui (mpz_srcptr, unsigned long int); | |
int __gmpz_cmpabs (mpz_srcptr, mpz_srcptr); | |
int __gmpz_cmpabs_d (mpz_srcptr, double); | |
int __gmpz_cmpabs_ui (mpz_srcptr, unsigned long int); | |
void __gmpz_com (mpz_ptr, mpz_srcptr); | |
void __gmpz_combit (mpz_ptr, mp_bitcnt_t); | |
int __gmpz_congruent_p (mpz_srcptr, mpz_srcptr, mpz_srcptr); | |
int __gmpz_congruent_2exp_p (mpz_srcptr, mpz_srcptr, mp_bitcnt_t); | |
int __gmpz_congruent_ui_p (mpz_srcptr, unsigned long, unsigned long); | |
void __gmpz_divexact (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_divexact_ui (mpz_ptr, mpz_srcptr, unsigned long); | |
int __gmpz_divisible_p (mpz_srcptr, mpz_srcptr); | |
int __gmpz_divisible_ui_p (mpz_srcptr, unsigned long); | |
int __gmpz_divisible_2exp_p (mpz_srcptr, mp_bitcnt_t); | |
void __gmpz_dump (mpz_srcptr); | |
void *__gmpz_export (void *, size_t *, int, size_t, int, size_t, mpz_srcptr); | |
void __gmpz_fac_ui (mpz_ptr, unsigned long int); | |
void __gmpz_2fac_ui (mpz_ptr, unsigned long int); | |
void __gmpz_mfac_uiui (mpz_ptr, unsigned long int, unsigned long int); | |
void __gmpz_primorial_ui (mpz_ptr, unsigned long int); | |
void __gmpz_fdiv_q (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_fdiv_q_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t); | |
unsigned long int __gmpz_fdiv_q_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_fdiv_qr (mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr); | |
unsigned long int __gmpz_fdiv_qr_ui (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_fdiv_r (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_fdiv_r_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t); | |
unsigned long int __gmpz_fdiv_r_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
unsigned long int __gmpz_fdiv_ui (mpz_srcptr, unsigned long int); | |
void __gmpz_fib_ui (mpz_ptr, unsigned long int); | |
void __gmpz_fib2_ui (mpz_ptr, mpz_ptr, unsigned long int); | |
int __gmpz_fits_sint_p (mpz_srcptr); | |
int __gmpz_fits_slong_p (mpz_srcptr); | |
int __gmpz_fits_sshort_p (mpz_srcptr); | |
int __gmpz_fits_uint_p (mpz_srcptr); | |
int __gmpz_fits_ulong_p (mpz_srcptr); | |
int __gmpz_fits_ushort_p (mpz_srcptr); | |
void __gmpz_gcd (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
unsigned long int __gmpz_gcd_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_gcdext (mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr); | |
double __gmpz_get_d (mpz_srcptr); | |
double __gmpz_get_d_2exp (signed long int *, mpz_srcptr); | |
long int __gmpz_get_si (mpz_srcptr); | |
char *__gmpz_get_str (char *, int, mpz_srcptr); | |
unsigned long int __gmpz_get_ui (mpz_srcptr); | |
mp_limb_t __gmpz_getlimbn (mpz_srcptr, mp_size_t); | |
mp_bitcnt_t __gmpz_hamdist (mpz_srcptr, mpz_srcptr); | |
void __gmpz_import (mpz_ptr, size_t, int, size_t, int, size_t, const void *); | |
void __gmpz_init (mpz_ptr); | |
void __gmpz_init2 (mpz_ptr, mp_bitcnt_t); | |
void __gmpz_inits (mpz_ptr, ...); | |
void __gmpz_init_set (mpz_ptr, mpz_srcptr); | |
void __gmpz_init_set_d (mpz_ptr, double); | |
void __gmpz_init_set_si (mpz_ptr, signed long int); | |
int __gmpz_init_set_str (mpz_ptr, const char *, int); | |
void __gmpz_init_set_ui (mpz_ptr, unsigned long int); | |
size_t __gmpz_inp_raw (mpz_ptr, FILE *); | |
size_t __gmpz_inp_str (mpz_ptr, FILE *, int); | |
int __gmpz_invert (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_ior (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
int __gmpz_jacobi (mpz_srcptr, mpz_srcptr); | |
int __gmpz_kronecker_si (mpz_srcptr, long); | |
int __gmpz_kronecker_ui (mpz_srcptr, unsigned long); | |
int __gmpz_si_kronecker (long, mpz_srcptr); | |
int __gmpz_ui_kronecker (unsigned long, mpz_srcptr); | |
void __gmpz_lcm (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_lcm_ui (mpz_ptr, mpz_srcptr, unsigned long); | |
void __gmpz_lucnum_ui (mpz_ptr, unsigned long int); | |
void __gmpz_lucnum2_ui (mpz_ptr, mpz_ptr, unsigned long int); | |
int __gmpz_millerrabin (mpz_srcptr, int); | |
void __gmpz_mod (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_mul (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_mul_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t); | |
void __gmpz_mul_si (mpz_ptr, mpz_srcptr, long int); | |
void __gmpz_mul_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_neg (mpz_ptr, mpz_srcptr); | |
void __gmpz_nextprime (mpz_ptr, mpz_srcptr); | |
size_t __gmpz_out_raw (FILE *, mpz_srcptr); | |
size_t __gmpz_out_str (FILE *, int, mpz_srcptr); | |
int __gmpz_perfect_power_p (mpz_srcptr); | |
int __gmpz_perfect_square_p (mpz_srcptr); | |
mp_bitcnt_t __gmpz_popcount (mpz_srcptr); | |
void __gmpz_pow_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_powm (mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_powm_sec (mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_powm_ui (mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr); | |
int __gmpz_probab_prime_p (mpz_srcptr, int); | |
void __gmpz_random (mpz_ptr, mp_size_t); | |
void __gmpz_random2 (mpz_ptr, mp_size_t); | |
void __gmpz_realloc2 (mpz_ptr, mp_bitcnt_t); | |
mp_bitcnt_t __gmpz_remove (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
int __gmpz_root (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_rootrem (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_rrandomb (mpz_ptr, gmp_randstate_t, mp_bitcnt_t); | |
mp_bitcnt_t __gmpz_scan0 (mpz_srcptr, mp_bitcnt_t); | |
mp_bitcnt_t __gmpz_scan1 (mpz_srcptr, mp_bitcnt_t); | |
void __gmpz_set (mpz_ptr, mpz_srcptr); | |
void __gmpz_set_d (mpz_ptr, double); | |
void __gmpz_set_f (mpz_ptr, mpf_srcptr); | |
void __gmpz_set_q (mpz_ptr, mpq_srcptr); | |
void __gmpz_set_si (mpz_ptr, signed long int); | |
int __gmpz_set_str (mpz_ptr, const char *, int); | |
void __gmpz_set_ui (mpz_ptr, unsigned long int); | |
void __gmpz_setbit (mpz_ptr, mp_bitcnt_t); | |
size_t __gmpz_size (mpz_srcptr); | |
size_t __gmpz_sizeinbase (mpz_srcptr, int); | |
void __gmpz_sqrt (mpz_ptr, mpz_srcptr); | |
void __gmpz_sqrtrem (mpz_ptr, mpz_ptr, mpz_srcptr); | |
void __gmpz_sub (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_sub_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_ui_sub (mpz_ptr, unsigned long int, mpz_srcptr); | |
void __gmpz_submul (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_submul_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_swap (mpz_ptr, mpz_ptr); | |
unsigned long int __gmpz_tdiv_ui (mpz_srcptr, unsigned long int); | |
void __gmpz_tdiv_q (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_tdiv_q_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t); | |
unsigned long int __gmpz_tdiv_q_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_tdiv_qr (mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr); | |
unsigned long int __gmpz_tdiv_qr_ui (mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int); | |
void __gmpz_tdiv_r (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpz_tdiv_r_2exp (mpz_ptr, mpz_srcptr, mp_bitcnt_t); | |
unsigned long int __gmpz_tdiv_r_ui (mpz_ptr, mpz_srcptr, unsigned long int); | |
int __gmpz_tstbit (mpz_srcptr, mp_bitcnt_t); | |
void __gmpz_ui_pow_ui (mpz_ptr, unsigned long int, unsigned long int); | |
void __gmpz_urandomb (mpz_ptr, gmp_randstate_t, mp_bitcnt_t); | |
void __gmpz_urandomm (mpz_ptr, gmp_randstate_t, mpz_srcptr); | |
void __gmpz_xor (mpz_ptr, mpz_srcptr, mpz_srcptr); | |
void __gmpq_abs (mpq_ptr, mpq_srcptr); | |
void __gmpq_add (mpq_ptr, mpq_srcptr, mpq_srcptr); | |
void __gmpq_canonicalize (mpq_ptr); | |
void __gmpq_clear (mpq_ptr); | |
void __gmpq_clears (mpq_ptr, ...); | |
int __gmpq_cmp (mpq_srcptr, mpq_srcptr); | |
int __gmpq_cmp_si (mpq_srcptr, long, unsigned long); | |
int __gmpq_cmp_ui (mpq_srcptr, unsigned long int, unsigned long int); | |
void __gmpq_div (mpq_ptr, mpq_srcptr, mpq_srcptr); | |
void __gmpq_div_2exp (mpq_ptr, mpq_srcptr, mp_bitcnt_t); | |
int __gmpq_equal (mpq_srcptr, mpq_srcptr); | |
void __gmpq_get_num (mpz_ptr, mpq_srcptr); | |
void __gmpq_get_den (mpz_ptr, mpq_srcptr); | |
double __gmpq_get_d (mpq_srcptr); | |
char *__gmpq_get_str (char *, int, mpq_srcptr); | |
void __gmpq_init (mpq_ptr); | |
void __gmpq_inits (mpq_ptr, ...); | |
size_t __gmpq_inp_str (mpq_ptr, FILE *, int); | |
void __gmpq_inv (mpq_ptr, mpq_srcptr); | |
void __gmpq_mul (mpq_ptr, mpq_srcptr, mpq_srcptr); | |
void __gmpq_mul_2exp (mpq_ptr, mpq_srcptr, mp_bitcnt_t); | |
void __gmpq_neg (mpq_ptr, mpq_srcptr); | |
size_t __gmpq_out_str (FILE *, int, mpq_srcptr); | |
void __gmpq_set (mpq_ptr, mpq_srcptr); | |
void __gmpq_set_d (mpq_ptr, double); | |
void __gmpq_set_den (mpq_ptr, mpz_srcptr); | |
void __gmpq_set_f (mpq_ptr, mpf_srcptr); | |
void __gmpq_set_num (mpq_ptr, mpz_srcptr); | |
void __gmpq_set_si (mpq_ptr, signed long int, unsigned long int); | |
int __gmpq_set_str (mpq_ptr, const char *, int); | |
void __gmpq_set_ui (mpq_ptr, unsigned long int, unsigned long int); | |
void __gmpq_set_z (mpq_ptr, mpz_srcptr); | |
void __gmpq_sub (mpq_ptr, mpq_srcptr, mpq_srcptr); | |
void __gmpq_swap (mpq_ptr, mpq_ptr); | |
void __gmpf_abs (mpf_ptr, mpf_srcptr); | |
void __gmpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr); | |
void __gmpf_add_ui (mpf_ptr, mpf_srcptr, unsigned long int); | |
void __gmpf_ceil (mpf_ptr, mpf_srcptr); | |
void __gmpf_clear (mpf_ptr); | |
void __gmpf_clears (mpf_ptr, ...); | |
int __gmpf_cmp (mpf_srcptr, mpf_srcptr); | |
int __gmpf_cmp_d (mpf_srcptr, double); | |
int __gmpf_cmp_si (mpf_srcptr, signed long int); | |
int __gmpf_cmp_ui (mpf_srcptr, unsigned long int); | |
void __gmpf_div (mpf_ptr, mpf_srcptr, mpf_srcptr); | |
void __gmpf_div_2exp (mpf_ptr, mpf_srcptr, mp_bitcnt_t); | |
void __gmpf_div_ui (mpf_ptr, mpf_srcptr, unsigned long int); | |
void __gmpf_dump (mpf_srcptr); | |
int __gmpf_eq (mpf_srcptr, mpf_srcptr, mp_bitcnt_t); | |
int __gmpf_fits_sint_p (mpf_srcptr); | |
int __gmpf_fits_slong_p (mpf_srcptr); | |
int __gmpf_fits_sshort_p (mpf_srcptr); | |
int __gmpf_fits_uint_p (mpf_srcptr); | |
int __gmpf_fits_ulong_p (mpf_srcptr); | |
int __gmpf_fits_ushort_p (mpf_srcptr); | |
void __gmpf_floor (mpf_ptr, mpf_srcptr); | |
double __gmpf_get_d (mpf_srcptr); | |
double __gmpf_get_d_2exp (signed long int *, mpf_srcptr); | |
mp_bitcnt_t __gmpf_get_default_prec (void); | |
mp_bitcnt_t __gmpf_get_prec (mpf_srcptr); | |
long __gmpf_get_si (mpf_srcptr); | |
char *__gmpf_get_str (char *, mp_exp_t *, int, size_t, mpf_srcptr); | |
unsigned long __gmpf_get_ui (mpf_srcptr); | |
void __gmpf_init (mpf_ptr); | |
void __gmpf_init2 (mpf_ptr, mp_bitcnt_t); | |
void __gmpf_inits (mpf_ptr, ...); | |
void __gmpf_init_set (mpf_ptr, mpf_srcptr); | |
void __gmpf_init_set_d (mpf_ptr, double); | |
void __gmpf_init_set_si (mpf_ptr, signed long int); | |
int __gmpf_init_set_str (mpf_ptr, const char *, int); | |
void __gmpf_init_set_ui (mpf_ptr, unsigned long int); | |
size_t __gmpf_inp_str (mpf_ptr, FILE *, int); | |
int __gmpf_integer_p (mpf_srcptr); | |
void __gmpf_mul (mpf_ptr, mpf_srcptr, mpf_srcptr); | |
void __gmpf_mul_2exp (mpf_ptr, mpf_srcptr, mp_bitcnt_t); | |
void __gmpf_mul_ui (mpf_ptr, mpf_srcptr, unsigned long int); | |
void __gmpf_neg (mpf_ptr, mpf_srcptr); | |
size_t __gmpf_out_str (FILE *, int, size_t, mpf_srcptr); | |
void __gmpf_pow_ui (mpf_ptr, mpf_srcptr, unsigned long int); | |
void __gmpf_random2 (mpf_ptr, mp_size_t, mp_exp_t); | |
void __gmpf_reldiff (mpf_ptr, mpf_srcptr, mpf_srcptr); | |
void __gmpf_set (mpf_ptr, mpf_srcptr); | |
void __gmpf_set_d (mpf_ptr, double); | |
void __gmpf_set_default_prec (mp_bitcnt_t); | |
void __gmpf_set_prec (mpf_ptr, mp_bitcnt_t); | |
void __gmpf_set_prec_raw (mpf_ptr, mp_bitcnt_t); | |
void __gmpf_set_q (mpf_ptr, mpq_srcptr); | |
void __gmpf_set_si (mpf_ptr, signed long int); | |
int __gmpf_set_str (mpf_ptr, const char *, int); | |
void __gmpf_set_ui (mpf_ptr, unsigned long int); | |
void __gmpf_set_z (mpf_ptr, mpz_srcptr); | |
size_t __gmpf_size (mpf_srcptr); | |
void __gmpf_sqrt (mpf_ptr, mpf_srcptr); | |
void __gmpf_sqrt_ui (mpf_ptr, unsigned long int); | |
void __gmpf_sub (mpf_ptr, mpf_srcptr, mpf_srcptr); | |
void __gmpf_sub_ui (mpf_ptr, mpf_srcptr, unsigned long int); | |
void __gmpf_swap (mpf_ptr, mpf_ptr); | |
void __gmpf_trunc (mpf_ptr, mpf_srcptr); | |
void __gmpf_ui_div (mpf_ptr, unsigned long int, mpf_srcptr); | |
void __gmpf_ui_sub (mpf_ptr, unsigned long int, mpf_srcptr); | |
void __gmpf_urandomb (mpf_t, gmp_randstate_t, mp_bitcnt_t); | |
]] | |
local bind = {} | |
local help = {} | |
local mod = {} | |
function mod.randinit_default(state) | |
bind.__gmp_randinit_default(state) | |
end | |
function mod.randinit_lc_2exp(state, a, c, m2exp) | |
bind.__gmp_randinit_lc_2exp(state, a, c, m2exp) | |
end | |
function mod.randinit_lc_2exp_size(state, size) | |
return bind.__gmp_randinit_lc_2exp_size(state, size) | |
end | |
function mod.randinit_mt(state) | |
bind.__gmp_randinit_mt(state) | |
end | |
function mod.randinit_set(rop, op) | |
bind.__gmp_randinit_set(rop, op) | |
end | |
function mod.randseed(state, seed) | |
bind.__gmp_randseed(state, seed) | |
end | |
function mod.randseed_ui(state, seed) | |
bind.__gmp_randseed_ui(state, seed) | |
end | |
function mod.randclear(state) | |
bind.__gmp_randclear(state) | |
end | |
function mod.urandomb_ui(state, n) | |
return bind.__gmp_urandomb_ui(state, n) | |
end | |
function mod.urandomm_ui(state, n) | |
return bind.__gmp_urandomm_ui(state, n) | |
end | |
function mod.asprintf(fmt, ...) | |
local pp = ffi.new('char*[1]') | |
local r = bind.__gmp_asprintf(pp, fmt, ...) | |
return pp[0], r | |
end | |
function mod.luasprintf(fmt, ...) | |
local pp = ffi.new('char*[1]') | |
local r = bind.__gmp_asprintf(pp, fmt, ...) | |
return ffi.string(pp[0]) | |
end | |
function mod.fprintf(fp, fmt, ...) | |
return bind.__gmp_fprintf(fp, fmt, ...) | |
end | |
function mod.printf(fmt, ...) | |
return bind.__gmp_printf(fmt, ...) | |
end | |
function mod.snprintf(buf, size, fmt, ...) | |
if not ffi.istype('char*', bug) then | |
error("bad argument #1 to 'snprintf' (char* expected)", 2) | |
end | |
return bind.__gmp_snprintf(buf, size, fmt, ...) | |
end | |
function mod.sprintf(buf, fmt, ...) | |
if not ffi.istype('char*', bug) then | |
error("bad argument #1 to 'sprintf' (char* expected)", 2) | |
end | |
return bind.__gmp_sprintf(buf, fmt, ...) | |
end | |
function mod.fscanf(fp, fmt, ...) | |
return bind.__gmp_fscanf(fp, fmt, ...) | |
end | |
function mod.scanf(fmt, ...) | |
return bind.__gmp_scanf(fmt, ...) | |
end | |
function mod.sscanf(s, fmt, ...) | |
return bind.__gmp_sscanf(s, fmt, ...) | |
end | |
function mod.z_realloc(integer, new_alloc) | |
return bind.__gmpz_realloc(integer, new_alloc) | |
end | |
function mod.z_abs(rop, op) | |
bind.__gmpz_abs(rop, op) | |
end | |
function mod.z_add(rop, op1, op2) | |
bind.__gmpz_add(rop, op1, op2) | |
end | |
function mod.z_add_ui(rop, op1, op2) | |
bind.__gmpz_add_ui(rop, op1, op2) | |
end | |
function mod.z_addmul(rop, op1, op2) | |
bind.__gmpz_addmul(rop, op1, op2) | |
end | |
function mod.z_addmul_ui(rop, op1, op2) | |
bind.__gmpz_addmul_ui(rop, op1, op2) | |
end | |
function mod.z_and(rop, op1, op2) | |
bind.__gmpz_and(rop, op1, op2) | |
end | |
function mod.z_bin_ui(rop, n, k) | |
bind.__gmpz_bin_ui(rop, n, k) | |
end | |
function mod.z_bin_uiui(rop, n, k) | |
bind.__gmpz_bin_uiui(rop, n, k) | |
end | |
function mod.z_cdiv_q(q, n, d) | |
bind.__gmpz_cdiv_q(q, n, d) | |
end | |
function mod.z_cdiv_q_2exp(q, n, b) | |
bind.__gmpz_cdiv_q_2exp(q, n, b) | |
end | |
function mod.z_cdiv_q_ui(q, n, d) | |
return bind.__gmpz_cdiv_q_ui(q, n, d) | |
end | |
function mod.z_cdiv_qr(q, r, n, d) | |
bind.__gmpz_cdiv_qr(q, r, n, d) | |
end | |
function mod.z_cdiv_qr_ui(q, r, n, d) | |
return bind.__gmpz_cdiv_qr_ui(q, r, n, d) | |
end | |
function mod.z_cdiv_r(r, n, d) | |
bind.__gmpz_cdiv_r(r, n, d) | |
end | |
function mod.z_cdiv_r_2exp(r, n, b) | |
bind.__gmpz_cdiv_r_2exp(r, n, b) | |
end | |
function mod.z_cdiv_r_ui(r, n, d) | |
return bind.__gmpz_cdiv_r_ui(r, n, d) | |
end | |
function mod.z_cdiv_ui(n, d) | |
return bind.__gmpz_cdiv_ui(n, d) | |
end | |
function mod.z_clear(x) | |
bind.__gmpz_clear(x) | |
end | |
function mod.z_clears(x, ...) | |
bind.__gmpz_clears(x, help.vararg(...)) | |
end | |
function mod.z_clrbit(rop, bit_index) | |
bind.__gmpz_clrbit(rop, bit_index) | |
end | |
function mod.z_cmp(op1, op2) | |
return bind.__gmpz_cmp(op1, op2) | |
end | |
function mod.z_cmp_d(op1, op2) | |
return bind.__gmpz_cmp_d(op1, op2) | |
end | |
function mod.z_cmp_si(op1, op2) | |
return bind.__gmpz_cmp_si(op1, op2) | |
end | |
function mod.z_cmp_ui(op1, op2) | |
return bind.__gmpz_cmp_ui(op1, op2) | |
end | |
function mod.z_cmpabs(op1, op2) | |
return bind.__gmpz_cmpabs(op1, op2) | |
end | |
function mod.z_cmpabs_d(op1, op2) | |
return bind.__gmpz_cmpabs_d(op1, op2) | |
end | |
function mod.z_cmpabs_ui(op1, op2) | |
return bind.__gmpz_cmpabs_ui(op1, op2) | |
end | |
function mod.z_com(rop, op) | |
bind.__gmpz_com(rop, op) | |
end | |
function mod.z_combit(rop, bit_index) | |
bind.__gmpz_combit(rop, bit_index) | |
end | |
function mod.z_congruent_p(n, c, d) | |
return bind.__gmpz_congruent_p(n, c, d) | |
end | |
function mod.z_congruent_2exp_p(n, c, b) | |
return bind.__gmpz_congruent_2exp_p(n, c, b) | |
end | |
function mod.z_congruent_ui_p(n, c, d) | |
return bind.__gmpz_congruent_ui_p(n, c, d) | |
end | |
function mod.z_divexact(q, n, d) | |
bind.__gmpz_divexact(q, n, d) | |
end | |
function mod.z_divexact_ui(q, n, d) | |
bind.__gmpz_divexact_ui(q, n, d) | |
end | |
function mod.z_divisible_p(n, d) | |
return bind.__gmpz_divisible_p(n, d) | |
end | |
function mod.z_divisible_ui_p(n, d) | |
return bind.__gmpz_divisible_ui_p(n, d) | |
end | |
function mod.z_divisible_2exp_p(n, b) | |
return bind.__gmpz_divisible_2exp_p(n, b) | |
end | |
function mod.z_dump(u) | |
bind.__gmpz_dump(u) | |
end | |
-- function mod.z_export(rop, countp, order, size, endian, nails, op) | |
-- -- void *__gmpz_export (void *, size_t *, int, size_t, int, size_t, mpz_srcptr) | |
-- return bind.__gmpz_export(rop, countp, order, size, endian, nails, op) | |
-- end | |
function mod.z_fac_ui(rop, n) | |
bind.__gmpz_fac_ui(rop, n) | |
end | |
function mod.z_2fac_ui(rop, n) | |
bind.__gmpz_2fac_ui(rop, n) | |
end | |
function mod.z_mfac_uiui(rop, n, m) | |
bind.__gmpz_mfac_uiui(rop, n, m) | |
end | |
function mod.z_primorial_ui(rop, n) | |
bind.__gmpz_primorial_ui(rop, n) | |
end | |
function mod.z_fdiv_q(q, n, d) | |
bind.__gmpz_fdiv_q(q, n, d) | |
end | |
function mod.z_fdiv_q_2exp(q, n, b) | |
bind.__gmpz_fdiv_q_2exp(q, n, b) | |
end | |
function mod.z_fdiv_q_ui(q, n, d) | |
return bind.__gmpz_fdiv_q_ui(q, n, d) | |
end | |
function mod.z_fdiv_qr(q, r, n, d) | |
bind.__gmpz_fdiv_qr(q, r, n, d) | |
end | |
function mod.z_fdiv_qr_ui(q, r, n, d) | |
return bind.__gmpz_fdiv_qr_ui(q, r, n, d) | |
end | |
function mod.z_fdiv_r(r, n, d) | |
bind.__gmpz_fdiv_r(r, n, d) | |
end | |
function mod.z_fdiv_r_2exp(r, n, b) | |
bind.__gmpz_fdiv_r_2exp(r, n, b) | |
end | |
function mod.z_fdiv_r_ui(r, n, d) | |
return bind.__gmpz_fdiv_r_ui(r, n, d) | |
end | |
function mod.z_fdiv_ui(n, d) | |
return bind.__gmpz_fdiv_ui(n, d) | |
end | |
function mod.z_fib_ui(fn, n) | |
bind.__gmpz_fib_ui(fn, n) | |
end | |
function mod.z_fib2_ui(fn, fnsub1, n) | |
bind.__gmpz_fib2_ui(fn, fnsub1, n) | |
end | |
function mod.z_fits_sint_p(op) | |
return bind.__gmpz_fits_sint_p(op) | |
end | |
function mod.z_fits_slong_p(op) | |
return bind.__gmpz_fits_slong_p(op) | |
end | |
function mod.z_fits_sshort_p(op) | |
return bind.__gmpz_fits_sshort_p(op) | |
end | |
function mod.z_fits_uint_p(op) | |
return bind.__gmpz_fits_uint_p(op) | |
end | |
function mod.z_fits_ulong_p(op) | |
return bind.__gmpz_fits_ulong_p(op) | |
end | |
function mod.z_fits_ushort_p(op) | |
return bind.__gmpz_fits_ushort_p(op) | |
end | |
function mod.z_gcd(rop, op1, op2) | |
bind.__gmpz_gcd(rop, op1, op2) | |
end | |
function mod.z_gcd_ui(rop, op1, op2) | |
return bind.__gmpz_gcd_ui(rop, op1, op2) | |
end | |
function mod.z_gcdext(g, s, t, a, b) | |
bind.__gmpz_gcdext(g, s, t, a, b) | |
end | |
function mod.z_get_d(op) | |
return bind.__gmpz_get_d(op) | |
end | |
function mod.z_get_d_2exp(exp, op) | |
return bind.__gmpz_get_d_2exp(exp, op) | |
end | |
function mod.z_get_si(op) | |
return bind.__gmpz_get_si(op) | |
end | |
function mod.z_get_str(str, base, op) | |
return ffi.string(bind.__gmpz_get_str(str, base, op)) | |
end | |
function mod.z_get_ui(op) | |
return bind.__gmpz_get_ui(op) | |
end | |
function mod.z_getlimbn(op, n) | |
return bind.__gmpz_getlimbn(op, n) | |
end | |
function mod.z_hamdist(op1, op2) | |
return bind.__gmpz_hamdist(op1, op2) | |
end | |
-- function mod.z_import(rop, count, order, size, endian, nails, op) | |
-- -- void __gmpz_import (mpz_ptr, size_t, int, size_t, int, size_t, const void *) | |
-- bind.__gmpz_import(rop, count, order, size, endian, nails, op) | |
-- end | |
function mod.z_init(x) | |
bind.__gmpz_init(x) | |
end | |
function mod.z_init2(x, n) | |
bind.__gmpz_init2(x, n) | |
end | |
function mod.z_inits(x, ...) | |
bind.__gmpz_inits(x, help.vararg(...)) | |
end | |
function mod.z_init_set(rop, op) | |
bind.__gmpz_init_set(rop, op) | |
end | |
function mod.z_init_set_d(rop, op) | |
bind.__gmpz_init_set_d(rop, op) | |
end | |
function mod.z_init_set_si(rop, op) | |
bind.__gmpz_init_set_si(rop, op) | |
end | |
function mod.z_init_set_str(rop, str, base) | |
return bind.__gmpz_init_set_str(rop, str, base) | |
end | |
function mod.z_init_set_ui(rop, op) | |
bind.__gmpz_init_set_ui(rop, op) | |
end | |
function mod.z_inp_raw(rop, stream) | |
return bind.__gmpz_inp_raw(rop, stream) | |
end | |
function mod.z_inp_str(rop, stream, base) | |
return bind.__gmpz_inp_str(rop, stream, base) | |
end | |
function mod.z_invert(rop, op1, op2) | |
return bind.__gmpz_invert(rop, op1, op2) | |
end | |
function mod.z_ior(rop, op1, op2) | |
bind.__gmpz_ior(rop, op1, op2) | |
end | |
function mod.z_jacobi(a, b) | |
return bind.__gmpz_jacobi(a, b) | |
end | |
function mod.z_kronecker_si(a, b) | |
return bind.__gmpz_kronecker_si(a, b) | |
end | |
function mod.z_kronecker_ui(a, b) | |
return bind.__gmpz_kronecker_ui(a, b) | |
end | |
function mod.z_si_kronecker(a, b) | |
return bind.__gmpz_si_kronecker(a, b) | |
end | |
function mod.z_ui_kronecker(a, b) | |
return bind.__gmpz_ui_kronecker(a, b) | |
end | |
function mod.z_lcm(rop, op1, op2) | |
bind.__gmpz_lcm(rop, op1, op2) | |
end | |
function mod.z_lcm_ui(rop, op1, op2) | |
bind.__gmpz_lcm_ui(rop, op1, op2) | |
end | |
function mod.z_lucnum_ui(ln, n) | |
bind.__gmpz_lucnum_ui(ln, n) | |
end | |
function mod.z_lucnum2_ui(ln, lnsub1, n) | |
bind.__gmpz_lucnum2_ui(ln, lnsub1, n) | |
end | |
function mod.z_millerrabin(n, reps) | |
return bind.__gmpz_millerrabin(n, reps) | |
end | |
function mod.z_mod(r, n, d) | |
bind.__gmpz_mod(r, n, d) | |
end | |
function mod.z_mul(rop, op1, op2) | |
bind.__gmpz_mul(rop, op1, op1) | |
end | |
function mod.z_mul_2exp(rop, op1, op2) | |
bind.__gmpz_mul_2exp(rop, op1, op2) | |
end | |
function mod.z_mul_si(rop, op1, op2) | |
bind.__gmpz_mul_si(rop, op1, op2) | |
end | |
function mod.z_mul_ui(rop, op1, op2) | |
bind.__gmpz_mul_ui(rop, op1, op2) | |
end | |
function mod.z_neg(rop, op) | |
bind.__gmpz_neg(rop, op) | |
end | |
function mod.z_nextprime(rop, op) | |
bind.__gmpz_nextprime(rop, op) | |
end | |
function mod.z_out_raw(stream, op) | |
return bind.__gmpz_out_raw(stream, op) | |
end | |
function mod.z_out_str(stream, base, op) | |
return bind.__gmpz_out_str(stream, base, op) | |
end | |
function mod.z_perfect_power_p(op) | |
return bind.__gmpz_perfect_power_p(op) | |
end | |
function mod.z_perfect_square_p(op) | |
return bind.__gmpz_perfect_square_p(op) | |
end | |
function mod.z_popcount(op) | |
return bind.__gmpz_popcount(op) | |
end | |
function mod.z_pow_ui(rop, base, exp) | |
bind.__gmpz_pow_ui(rop, base, exp) | |
end | |
function mod.z_powm(rop, base, exp, mod) | |
bind.__gmpz_powm(rop, base, exp, mod) | |
end | |
function mod.z_powm_sec(rop, base, exp, mod) | |
bind.__gmpz_powm_sec(rop, base, exp, mod) | |
end | |
function mod.z_powm_ui(rop, base, exp, mod) | |
bind.__gmpz_powm_ui(rop, base, exp, mod) | |
end | |
function mod.z_probab_prime_p(n, reps) | |
return bind.__gmpz_probab_prime_p(n, reps) | |
end | |
function mod.z_random(rop, max_size) | |
bind.__gmpz_random(rop, max_size) | |
end | |
function mod.z_random2(rop, max_size) | |
bind.__gmpz_random2(rop, max_size) | |
end | |
function mod.z_realloc2(x, n) | |
bind.__gmpz_realloc2(x, n) | |
end | |
function mod.z_remove(rop, op, f) | |
return bind.__gmpz_remove(rop, op, f) | |
end | |
function mod.z_root(rop, op, n) | |
return bind.__gmpz_root(rop, op, n) | |
end | |
function mod.z_rootrem(root, rem, u, n) | |
bind.__gmpz_rootrem(root, rem, u, n) | |
end | |
function mod.z_rrandomb(rop, state, n) | |
bind.__gmpz_rrandomb(rop, state, n) | |
end | |
function mod.z_scan0(op, starting_bit) | |
return bind.__gmpz_scan0(op, starting_bit) | |
end | |
function mod.z_scan1(op, starting_bit) | |
return bind.__gmpz_scan1(op, starting_bit) | |
end | |
function mod.z_set(rop, op) | |
bind.__gmpz_set(rop, op) | |
end | |
function mod.z_set_d(rop, op) | |
bind.__gmpz_set_d(rop, op) | |
end | |
function mod.z_set_f(rop, op) | |
bind.__gmpz_set_f(rop, op) | |
end | |
function mod.z_set_q(rop, op) | |
bind.__gmpz_set_q(rop, op) | |
end | |
function mod.z_set_si(rop, op) | |
bind.__gmpz_set_si(rop, op) | |
end | |
function mod.z_set_str(rop, str, base) | |
return bind.__gmpz_set_str(rop, str, base) | |
end | |
function mod.z_set_ui(rop, op) | |
bind.__gmpz_set_ui(rop, op) | |
end | |
function mod.z_setbit(rop, bit_index) | |
bind.__gmpz_setbit(rop, bit_index) | |
end | |
function mod.z_size(op) | |
return bind.__gmpz_size(op) | |
end | |
function mod.z_sizeinbase(op, base) | |
return bind.__gmpz_sizeinbase(op, base) | |
end | |
function mod.z_sqrt(rop, op) | |
bind.__gmpz_sqrt(rop, op) | |
end | |
function mod.z_sqrtrem(rop1, rop2, op) | |
bind.__gmpz_sqrtrem(rop1, rop2, op) | |
end | |
function mod.z_sub(rop, op1, op2) | |
bind.__gmpz_sub(rop, op1, op2) | |
end | |
function mod.z_sub_ui(rop, op1, op2) | |
bind.__gmpz_sub_ui(rop, op1, op2) | |
end | |
function mod.z_ui_sub(rop, op1, op2) | |
bind.__gmpz_ui_sub(rop, op1, op2) | |
end | |
function mod.z_submul(rop, op1, op2) | |
bind.__gmpz_submul(rop, op1, op2) | |
end | |
function mod.z_submul_ui(rop, op1, op2) | |
bind.__gmpz_submul_ui(rop, op1, op2) | |
end | |
function mod.z_swap(rop1, rop2) | |
bind.__gmpz_swap(rop1, rop2) | |
end | |
function mod.z_tdiv_ui(n, d) | |
return bind.__gmpz_tdiv_ui(n, d) | |
end | |
function mod.z_tdiv_q(q, n, d) | |
bind.__gmpz_tdiv_q(q, n, d) | |
end | |
function mod.z_tdiv_q_2exp(q, n, b) | |
bind.__gmpz_tdiv_q_2exp(q, n, b) | |
end | |
function mod.z_tdiv_q_ui(q, n, d) | |
return bind.__gmpz_tdiv_q_ui(q, n, d) | |
end | |
function mod.z_tdiv_qr(q, r, n, d) | |
bind.__gmpz_tdiv_qr(q, r, n, d) | |
end | |
function mod.z_tdiv_qr_ui(q, r, n, d) | |
return bind.__gmpz_tdiv_qr_ui(q, r, n, d) | |
end | |
function mod.z_tdiv_r(r, n, d) | |
bind.__gmpz_tdiv_r(r, n, d) | |
end | |
function mod.z_tdiv_r_2exp(r, n, b) | |
bind.__gmpz_tdiv_r_2exp(r, n, b) | |
end | |
function mod.z_tdiv_r_ui(r, n, d) | |
return bind.__gmpz_tdiv_r_ui(r, n, d) | |
end | |
function mod.z_tstbit(rop, bit_index) | |
return bind.__gmpz_tstbit(rop, bit_index) | |
end | |
function mod.z_ui_pow_ui(rop, base, exp) | |
bind.__gmpz_ui_pow_ui(rop, base, exp) | |
end | |
function mod.z_urandomb(rop, state, n) | |
bind.__gmpz_urandomb(rop, state, n) | |
end | |
function mod.z_urandomm(rop, state, n) | |
bind.__gmpz_urandomm(rop, state, n) | |
end | |
function mod.z_xor(rop, op1, op2) | |
bind.__gmpz_xor(rop, op1, op2) | |
end | |
function mod.q_abs(rop, op) | |
bind.__gmpq_abs(rop, op) | |
end | |
function mod.q_add(summ, addend1, addend2) | |
bind.__gmpq_add(summ, addend1, addend2) | |
end | |
function mod.q_canonicalize(op) | |
bind.__gmpq_canonicalize(op) | |
end | |
function mod.q_clear(x) | |
bind.__gmpq_clear(x) | |
end | |
function mod.q_clears(x, ...) | |
bind.__gmpq_clears(x, help.vararg(...)) | |
end | |
function mod.q_cmp(op1, op2) | |
return bind.__gmpq_cmp(op1, op2) | |
end | |
function mod.q_cmp_si(op1, num2, den2) | |
return bind.__gmpq_cmp_si(op1, num2, den2) | |
end | |
function mod.q_cmp_ui(op1, num2, den2) | |
return bind.__gmpq_cmp_ui(op1, num2, den2) | |
end | |
function mod.q_div(quotient, dividend, divisor) | |
bind.__gmpq_div(quotient, dividend, divisor) | |
end | |
function mod.q_div_2exp(rop, op1, op2) | |
bind.__gmpq_div_2exp(rop, op1, op2) | |
end | |
function mod.q_equal(op1, op2) | |
return bind.__gmpq_equal(op1, op2) | |
end | |
function mod.q_get_num(numerator, rational) | |
bind.__gmpq_get_num(numerator, rational) | |
end | |
function mod.q_get_den(denominator, rational) | |
bind.__gmpq_get_den(denominator, rational) | |
end | |
function mod.q_get_d(op) | |
return bind.__gmpq_get_d(op) | |
end | |
function mod.q_get_str(str, base, op) | |
return ffi.string(bind.__gmpq_get_str(str, base, op)) | |
end | |
function mod.q_init(x) | |
bind.__gmpq_init(x) | |
end | |
function mod.q_inits(x, ...) | |
bind.__gmpq_inits(x, help.vararg(...)) | |
end | |
function mod.q_inp_str(rop, stream, base) | |
return bind.__gmpq_inp_str(rop, stream, base) | |
end | |
function mod.q_inv(inverted_number, number) | |
bind.__gmpq_inv(inverted_number, number) | |
end | |
function mod.q_mul(product, multiplier, multiplicand) | |
bind.__gmpq_mul(product, multiplier, multiplicand) | |
end | |
function mod.q_mul_2exp(rop, op1, op2) | |
bind.__gmpq_mul_2exp(rop, op1, op2) | |
end | |
function mod.q_neg(negated_operand, operand) | |
bind.__gmpq_neg(negated_operand, operand) | |
end | |
function mod.q_out_str(stream, base, op) | |
return bind.__gmpq_out_str(stream, base, op) | |
end | |
function mod.q_set(rop, op) | |
bind.__gmpq_set(rop, op) | |
end | |
function mod.q_set_d(rop, op) | |
bind.__gmpq_set_d(rop, op) | |
end | |
function mod.q_set_den(rational, denominator) | |
bind.__gmpq_set_den(rational, denominator) | |
end | |
function mod.q_set_f(rop, op) | |
bind.__gmpq_set_f(rop, op) | |
end | |
function mod.q_set_num(rational, numerator) | |
bind.__gmpq_set_num(rational, numerator) | |
end | |
function mod.q_set_si(rop, op1, op2) | |
bind.__gmpq_set_si(rop, op1, op2) | |
end | |
function mod.q_set_str(rop, str, base) | |
return bind.__gmpq_set_str(rop, str, base) | |
end | |
function mod.q_set_ui(rop, op1, op2) | |
bind.__gmpq_set_ui(rop, op1, op2) | |
end | |
function mod.q_set_z(rop, op) | |
bind.__gmpq_set_z(rop, op) | |
end | |
function mod.q_sub(difference, minuend, subtrahend) | |
bind.__gmpq_sub(difference, minuend, subtrahend) | |
end | |
function mod.q_swap(rop1, rop2) | |
bind.__gmpq_swap(rop1, rop2) | |
end | |
function mod.f_abs(rop, op) | |
bind.__gmpf_abs(rop, op) | |
end | |
function mod.f_add(rop, op1, op2) | |
bind.__gmpf_add(rop, op1, op2) | |
end | |
function mod.f_add_ui(rop, op1, op2) | |
bind.__gmpf_add_ui(rop, op1, op2) | |
end | |
function mod.f_ceil(rop, op) | |
bind.__gmpf_ceil(rop, op) | |
end | |
function mod.f_clear(x) | |
bind.__gmpf_clear(x) | |
end | |
function mod.f_clears(x, ...) | |
bind.__gmpf_clears(x, help.vararg(...)) | |
end | |
function mod.f_cmp(op1, op2) | |
return bind.__gmpf_cmp(op1, op2) | |
end | |
function mod.f_cmp_d(op1, op2) | |
return bind.__gmpf_cmp_d(op1, op2) | |
end | |
function mod.f_cmp_si(op1, op2) | |
return bind.__gmpf_cmp_si(op1, op2) | |
end | |
function mod.f_cmp_ui(op1, op2) | |
return bind.__gmpf_cmp_ui(op1, op2) | |
end | |
function mod.f_div(rop, op1, op2) | |
bind.__gmpf_div(rop, op1, op2) | |
end | |
function mod.f_div_2exp(rop, op1, op2) | |
bind.__gmpf_div_2exp(rop, op1, op2) | |
end | |
function mod.f_div_ui(rop, op1, op2) | |
bind.__gmpf_div_ui(rop, op1, op2) | |
end | |
function mod.f_dump(u) | |
bind.__gmpf_dump(u) | |
end | |
function mod.f_eq(op1, op2, op3) | |
return bind.__gmpf_eq(op1, op2, op3) | |
end | |
function mod.f_fits_sint_p(op) | |
return bind.__gmpf_fits_sint_p(op) | |
end | |
function mod.f_fits_slong_p(op) | |
return bind.__gmpf_fits_slong_p(op) | |
end | |
function mod.f_fits_sshort_p(op) | |
return bind.__gmpf_fits_sshort_p(op) | |
end | |
function mod.f_fits_uint_p(op) | |
return bind.__gmpf_fits_uint_p(op) | |
end | |
function mod.f_fits_ulong_p(op) | |
return bind.__gmpf_fits_ulong_p(op) | |
end | |
function mod.f_fits_ushort_p(op) | |
return bind.__gmpf_fits_ushort_p(op) | |
end | |
function mod.f_floor(rop, op) | |
bind.__gmpf_floor(rop, op) | |
end | |
function mod.f_get_d(op) | |
return bind.__gmpf_get_d(op) | |
end | |
function mod.f_get_d_2exp(op) | |
local exp = ffi.new('signed long int[1]') | |
local rop = bind.__gmpf_get_d_2exp(exp, op) | |
return rop, exp[0] | |
end | |
function mod.f_get_default_prec() | |
return bind.__gmpf_get_default_prec() | |
end | |
function mod.f_get_prec(op) | |
return bind.__gmpf_get_prec(op) | |
end | |
function mod.f_get_si(op) | |
return bind.__gmpf_get_si(op) | |
end | |
function mod.f_get_str(str, base, n_digits, op) | |
local exp = ffi.new('mp_exp_t[1]') | |
local str = ffi.string(bind.__gmpf_get_str(str, exp, base, n_digits, op)) | |
return str, exp[0] | |
end | |
function mod.f_get_ui(op) | |
return bind.__gmpf_get_ui(op) | |
end | |
function mod.f_init(x) | |
bind.__gmpf_init(x) | |
end | |
function mod.f_init2(x, prec) | |
bind.__gmpf_init2(x, prec) | |
end | |
function mod.f_inits(x, ...) | |
bind.__gmpf_inits(x, help.vararg(...)) | |
end | |
function mod.f_init_set(rop, op) | |
bind.__gmpf_init_set(rop, op) | |
end | |
function mod.f_init_set_d(rop, op) | |
bind.__gmpf_init_set_d(rop, op) | |
end | |
function mod.f_init_set_si(rop, op) | |
bind.__gmpf_init_set_si(rop, op) | |
end | |
function mod.f_init_set_str(rop, str, base) | |
return bind.__gmpf_init_set_str(rop, str, base) | |
end | |
function mod.f_init_set_ui(rop, op) | |
bind.__gmpf_init_set_ui(rop, op) | |
end | |
function mod.f_inp_str(rop, stream, base) | |
return bind.__gmpf_inp_str(rop, stream, base) | |
end | |
function mod.f_integer_p(op) | |
return bind.__gmpf_integer_p(op) | |
end | |
function mod.f_mul(rop, op1, op2) | |
bind.__gmpf_mul(rop, op1, op2) | |
end | |
function mod.f_mul_2exp(rop, op1, op2) | |
bind.__gmpf_mul_2exp(rop, op1, op2) | |
end | |
function mod.f_mul_ui(rop, op1, op2) | |
bind.__gmpf_mul_ui(rop, op1, op2) | |
end | |
function mod.f_neg(rop, op) | |
bind.__gmpf_neg(rop, op) | |
end | |
function mod.f_out_str(stream, base, n_digits, op) | |
return bind.__gmpf_out_str(stream, base, n_digits, op) | |
end | |
function mod.f_pow_ui(rop, op1, op2) | |
bind.__gmpf_pow_ui(rop, op1, op2) | |
end | |
function mod.f_random2(rop, max_size, exp) | |
bind.__gmpf_random2(rop, max_size, exp) | |
end | |
function mod.f_reldiff(rop, op1, op2) | |
bind.__gmpf_reldiff(rop, op1, op2) | |
end | |
function mod.f_set(rop, op) | |
bind.__gmpf_set(rop, op) | |
end | |
function mod.f_set_d(rop, op) | |
bind.__gmpf_set_d(rop, op) | |
end | |
function mod.f_set_default_prec(prec) | |
bind.__gmpf_set_default_prec(prec) | |
end | |
function mod.f_set_prec(rop, prec) | |
bind.__gmpf_set_prec(rop, prec) | |
end | |
function mod.f_set_prec_raw(rop, prec) | |
bind.__gmpf_set_prec_raw(rop, prec) | |
end | |
function mod.f_set_q(rop, op) | |
bind.__gmpf_set_q(rop, op) | |
end | |
function mod.f_set_si(rop, op) | |
bind.__gmpf_set_si(rop, op) | |
end | |
function mod.f_set_str(rop, str, base) | |
return bind.__gmpf_set_str(rop, str, base) | |
end | |
function mod.f_set_ui(rop, op) | |
bind.__gmpf_set_ui(rop, op) | |
end | |
function mod.f_set_z(rop, op) | |
bind.__gmpf_set_z(rop, op) | |
end | |
function mod.f_size(op) | |
return bind.__gmpf_size(op) | |
end | |
function mod.f_sqrt(rop, op) | |
bind.__gmpf_sqrt(rop, op) | |
end | |
function mod.f_sqrt_ui(rop, op) | |
bind.__gmpf_sqrt_ui(rop, op) | |
end | |
function mod.f_sub(rop, op1, op2) | |
bind.__gmpf_sub(rop, op1, op2) | |
end | |
function mod.f_sub_ui(rop, op1, op2) | |
bind.__gmpf_sub_ui(rop, op1, op2) | |
end | |
function mod.f_swap(rop1, rop2) | |
bind.__gmpf_swap(rop1, rop2) | |
end | |
function mod.f_trunc(rop, op) | |
bind.__gmpf_trunc(rop, op) | |
end | |
function mod.f_ui_div(rop, op1, op2) | |
bind.__gmpf_ui_div(rop, op1, op2) | |
end | |
function mod.f_ui_sub(rop, op1, op2) | |
bind.__gmpf_ui_sub(rop, op1, op2) | |
end | |
function mod.f_urandomb(rop, state, nbits) | |
bind.__gmpf_urandomb(rop, state, nbits) | |
end | |
function help.vararg(...) | |
local t = { ... } | |
t[#t + 1] = 0 | |
return unpack(t) | |
end | |
local types = {} | |
types.z = 'mpz_t' | |
types.q = 'mpq_t' | |
types.f = 'mpf_t' | |
types.randstate = 'gmp_randstate_t' | |
mod.types = types | |
setmetatable(mod, { | |
__call = function(self, name) | |
ffi.cdef(header) | |
bind = ffi.load(name) | |
for k,v in pairs(types) do | |
types[k] = ffi.typeof(v) | |
end | |
return self | |
end | |
}) | |
return mod |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* The Computer Language Benchmarks Game | |
* https://salsa.debian.org/benchmarksgame-team/benchmarksgame/ | |
* | |
* Contributed by Mr Ledrug | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <gmp.h> | |
mpz_t tmp1, tmp2, acc, den, num; | |
typedef unsigned int ui; | |
ui extract_digit(ui nth) { | |
// joggling between tmp1 and tmp2, so GMP won't have to use temp buffers | |
mpz_mul_ui(tmp1, num, nth); | |
mpz_add(tmp2, tmp1, acc); | |
mpz_tdiv_q(tmp1, tmp2, den); | |
return mpz_get_ui(tmp1); | |
} | |
void eliminate_digit(ui d) { | |
mpz_submul_ui(acc, den, d); | |
mpz_mul_ui(acc, acc, 10); | |
mpz_mul_ui(num, num, 10); | |
} | |
void next_term(ui k) { | |
ui k2 = k * 2U + 1U; | |
mpz_addmul_ui(acc, num, 2U); | |
mpz_mul_ui(acc, acc, k2); | |
mpz_mul_ui(den, den, k2); | |
mpz_mul_ui(num, num, k); | |
} | |
int main(int argc, char **argv) { | |
ui d, k, i; | |
int n = atoi(argv[1]); | |
mpz_init(tmp1); | |
mpz_init(tmp2); | |
mpz_init_set_ui(acc, 0); | |
mpz_init_set_ui(den, 1); | |
mpz_init_set_ui(num, 1); | |
for (i = k = 0; i < n;) { | |
next_term(++k); | |
if (mpz_cmp(num, acc) > 0) | |
continue; | |
d = extract_digit(3); | |
if (d != extract_digit(4)) | |
continue; | |
putchar('0' + d); | |
if (++i % 10 == 0) | |
printf("\t:%u\n", i); | |
eliminate_digit(d); | |
} | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
local g = require "gmp" ("libgmp") | |
local add, mul, div, addmul, submul | |
= g.z_add, g.z_mul_si, g.z_tdiv_q, g.z_addmul_ui, g.z_submul_ui | |
local init, get = g.z_init_set_d, g.z_get_d | |
local cmp = g.z_cmp | |
local mpz = g.types.z | |
local tmp1, tmp2, acc, den, num = mpz(), mpz(), mpz(), mpz(), mpz() | |
local function extract_digit(n) | |
mul(tmp1, num, n) | |
add(tmp2, tmp1, acc) | |
div(tmp1, tmp2, den) | |
return get(tmp1) | |
end | |
local function eliminate_digit(d) | |
submul(acc, den, d) | |
mul(acc, acc, 10) | |
mul(num, num, 10) | |
end | |
local function next_term(k) | |
local k2 = k * 2 + 1 | |
addmul(acc, num, 2) | |
mul(acc, acc, k2) | |
mul(den, den, k2) | |
mul(num, num, k) | |
end | |
local function main(n) | |
local write = io.write | |
local k, i, d = 0, 0 | |
init(tmp1, 0) | |
init(tmp2, 0) | |
init(acc, 0) | |
init(den, 1) | |
init(num, 1) | |
while i < n do | |
k = k + 1 | |
next_term(k) | |
if cmp(num, acc) <= 0 then | |
d = extract_digit(3) | |
if d == extract_digit(4) then | |
write(tostring(d)) | |
i = i + 1 | |
if i % 10 == 0 then | |
write("\t: ", i, "\n") | |
end | |
eliminate_digit(d) | |
end | |
end | |
end | |
end | |
main(tonumber(arg[1])) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment