static int Bdivmod(lua_State *L) { mpi *a=Bget(L,1); mpi *b=Bget(L,2); mpi *q=Bnew(L); mpi *r=Bnew(L); mpi_div_mpi(q,r,a,b); return 2; }
static int Bidiv(lua_State *L) /** idiv(x,y) */ { M_APM a=Bget(L,1); M_APM b=Bget(L,2); M_APM q=Bnew(L); M_APM r=Bnew(L); m_apm_integer_div_rem(q,r,a,b); return 2; }
static int Bsincos(lua_State *L) /** sincos(x) */ { int n=luaL_optint(L,2,DIGITS); M_APM a=Bget(L,1); M_APM s=Bnew(L); M_APM c=Bnew(L); m_apm_sin_cos(s,c,n,a); return 2; }
static int Bdo0(lua_State *L, void (*f)(M_APM y, M_APM x)) { M_APM a=Bget(L,1); M_APM c=Bnew(L); f(c,a); return 1; }
static int Binvmod(lua_State *L) { mpi *a=Bget(L,1); mpi *m=Bget(L,2); mpi *c=Bnew(L); mpi_inv_mod(c,a,m); return 1; }
static int Bgcd(lua_State *L) { mpi *a=Bget(L,1); mpi *b=Bget(L,2); mpi *c=Bnew(L); mpi_gcd(c,a,b); return 1; }
static int Bmul(lua_State *L) { mpi *a=Bget(L,1); mpi *b=Bget(L,2); mpi *c=Bnew(L); mpi_mul_mpi(c,a,b); return 1; }
static int Btext(lua_State *L) { size_t l; const char *s=luaL_checklstring(L,1,&l); mpi *a=Bnew(L); mpi_read_binary(a, (unsigned char *) s, l); return 1; }
static int Bdo2(lua_State *L, void (*f)(M_APM z, M_APM x, M_APM y)) { M_APM a=Bget(L,1); M_APM b=Bget(L,2); M_APM c=Bnew(L); f(c,a,b); return 1; }
static int Bdo1(lua_State *L, void (*f)(M_APM y, int n, M_APM x)) { int n=luaL_optint(L,2,DIGITS); M_APM a=Bget(L,1); M_APM c=Bnew(L); f(c,n,a); return 1; }
static int Bdo3(lua_State *L, void (*f)(M_APM z, int n, M_APM x, M_APM y)) { int n=luaL_optint(L,3,DIGITS); M_APM a=Bget(L,1); M_APM b=Bget(L,2); M_APM c=Bnew(L); f(c,n,a,b); return 1; }
static int Bneg(lua_State *L) { mpi A; mpi *a = &A; mpi *b=Bget(L,1); mpi *c=Bnew(L); mpi_init(a); mpi_sub_mpi(c, a, b); mpi_free(a); return 1; }
static int Bpowmod(lua_State *L) { mpi *a=Bget(L,1); mpi *b=Bget(L,2); mpi *m=Bget(L,3); mpi RR; mpi *rr=&RR; mpi_init(rr); mpi *c=Bnew(L); mpi_exp_mod(c,a,b,m,rr); mpi_free(rr); return 1; }
static int Babs(lua_State *L) { mpi *b=Bget(L,1); if (mpi_cmp_int(b,0)<0) { mpi A; mpi *a=&A; mpi *c=Bnew(L); mpi_init(a); mpi_sub_mpi(c,a,b); mpi_free(a); } else lua_settop(L,1); return 1; }
static M_APM Bget(lua_State *L, int i) { LL=L; switch (lua_type(L,i)) { case LUA_TNUMBER: { M_APM x=Bnew(L); m_apm_set_double(x,lua_tonumber(L,i)); lua_replace(L,i); return x; } case LUA_TSTRING: { M_APM x=Bnew(L); m_apm_set_string(x,(char*)lua_tostring(L,i)); lua_replace(L,i); return x; } default: return *((void**)luaL_checkudata(L,i,MYTYPE)); } return NULL; }
static mpi *Bget(lua_State *L, int i) { switch (lua_type(L,i)) { case LUA_TNUMBER: case LUA_TSTRING: { mpi *x=Bnew(L); const char *s=lua_tostring(L,i); if(s[0]=='X' || s[0]=='x') mpi_read_string(x, 16, s+1); else mpi_read_string(x,10,s); lua_replace(L,i); return x; } default: return *((mpi**)luaL_checkudata(L,i,MYTYPE)); } return NULL; }