version 1.1, 2018/09/19 05:45:06 |
version 1.5, 2018/10/01 05:49:06 |
|
|
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* |
* |
* $OpenXM$ |
* $OpenXM: OpenXM_contrib2/asir2018/builtin/int.c,v 1.4 2018/09/28 08:20:27 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
Line 69 void Pigcdbin(), Pigcdbmod(), PigcdEuc(), Pigcdacc(), |
|
Line 69 void Pigcdbin(), Pigcdbmod(), PigcdEuc(), Pigcdacc(), |
|
void Pihex(); |
void Pihex(); |
void Pimaxrsh(), Pilen(); |
void Pimaxrsh(), Pilen(); |
void Ptype_t_NB(); |
void Ptype_t_NB(); |
|
void Plprime64(); |
|
|
struct ftab int_tab[] = { |
struct ftab int_tab[] = { |
{"dp_set_mpi",Pdp_set_mpi,-1}, |
{"dp_set_mpi",Pdp_set_mpi,-1}, |
Line 93 struct ftab int_tab[] = { |
|
Line 94 struct ftab int_tab[] = { |
|
{"fac",Pfac,1}, |
{"fac",Pfac,1}, |
{"prime",Pprime,1}, |
{"prime",Pprime,1}, |
{"lprime",Plprime,1}, |
{"lprime",Plprime,1}, |
|
#if SIZEOF_LONG==8 |
|
{"lprime64",Plprime64,1}, |
|
#endif |
{"random",Prandom,-1}, |
{"random",Prandom,-1}, |
{"lrandom",Plrandom,1}, |
{"lrandom",Plrandom,1}, |
{"iand",Piand,2}, |
{"iand",Piand,2}, |
Line 133 void Pntoint32(NODE arg,USINT *rp) |
|
Line 137 void Pntoint32(NODE arg,USINT *rp) |
|
if ( !INT(q) || !smallz(q) ) |
if ( !INT(q) || !smallz(q) ) |
error("ntoint32 : invalid argument"); |
error("ntoint32 : invalid argument"); |
absz(q,&z); |
absz(q,&z); |
t = QTOS(z); |
t = ZTOS(z); |
if ( sgnz(q) < 0 ) |
if ( sgnz(q) < 0 ) |
t = -(int)t; |
t = -(int)t; |
MKUSINT(*rp,t); |
MKUSINT(*rp,t); |
Line 145 void Pint32ton(NODE arg,Z *rp) |
|
Line 149 void Pint32ton(NODE arg,Z *rp) |
|
|
|
asir_assert(ARG0(arg),O_USINT,"int32ton"); |
asir_assert(ARG0(arg),O_USINT,"int32ton"); |
t = (int)BDY((USINT)ARG0(arg)); |
t = (int)BDY((USINT)ARG0(arg)); |
STOQ(t,*rp); |
STOZ(t,*rp); |
} |
} |
|
|
void Pdp_set_mpi(NODE arg,Z *rp) |
void Pdp_set_mpi(NODE arg,Z *rp) |
{ |
{ |
if ( arg ) { |
if ( arg ) { |
asir_assert(ARG0(arg),O_N,"dp_set_mpi"); |
asir_assert(ARG0(arg),O_N,"dp_set_mpi"); |
mpi_mag = QTOS((Q)ARG0(arg)); |
mpi_mag = ZTOS((Q)ARG0(arg)); |
} |
} |
STOQ(mpi_mag,*rp); |
STOZ(mpi_mag,*rp); |
} |
} |
|
|
void Psmall_jacobi(NODE arg,Z *rp) |
void Psmall_jacobi(NODE arg,Z *rp) |
Line 172 void Psmall_jacobi(NODE arg,Z *rp) |
|
Line 176 void Psmall_jacobi(NODE arg,Z *rp) |
|
|| !smallz(m) || !smallz(a) || sgnz(m) < 0 || evenz(m) ) |
|| !smallz(m) || !smallz(a) || sgnz(m) < 0 || evenz(m) ) |
error("small_jacobi : invalid input"); |
error("small_jacobi : invalid input"); |
else { |
else { |
a0 = QTOS(a); m0 = QTOS(m); |
a0 = ZTOS(a); m0 = ZTOS(m); |
s = small_jacobi(a0,m0); |
s = small_jacobi(a0,m0); |
STOQ(s,*rp); |
STOZ(s,*rp); |
} |
} |
} |
} |
|
|
Line 206 int small_jacobi(int a,int m) |
|
Line 210 int small_jacobi(int a,int m) |
|
|
|
void Ptype_t_NB(NODE arg,Z *rp) |
void Ptype_t_NB(NODE arg,Z *rp) |
{ |
{ |
if ( TypeT_NB_check(QTOS((Q)ARG0(arg)),QTOS((Q)ARG1(arg)))) |
if ( TypeT_NB_check(ZTOS((Q)ARG0(arg)),ZTOS((Q)ARG1(arg)))) |
*rp = ONE; |
*rp = ONE; |
else |
else |
*rp = 0; |
*rp = 0; |
Line 280 void Pmt_save(NODE arg,Z *rp) |
|
Line 284 void Pmt_save(NODE arg,Z *rp) |
|
int ret; |
int ret; |
|
|
ret = mt_save(BDY((STRING)ARG0(arg))); |
ret = mt_save(BDY((STRING)ARG0(arg))); |
STOQ(ret,*rp); |
STOZ(ret,*rp); |
} |
} |
|
|
void Pmt_load(NODE arg,Z *rp) |
void Pmt_load(NODE arg,Z *rp) |
Line 288 void Pmt_load(NODE arg,Z *rp) |
|
Line 292 void Pmt_load(NODE arg,Z *rp) |
|
int ret; |
int ret; |
|
|
ret = mt_load(BDY((STRING)ARG0(arg))); |
ret = mt_load(BDY((STRING)ARG0(arg))); |
STOQ(ret,*rp); |
STOZ(ret,*rp); |
} |
} |
|
|
void isqrt(Z a,Z *r); |
void isqrt(Z a,Z *r); |
Line 364 void Piqr(NODE arg,LIST *rp) |
|
Line 368 void Piqr(NODE arg,LIST *rp) |
|
|
|
void Pinttorat(NODE arg,LIST *rp) |
void Pinttorat(NODE arg,LIST *rp) |
{ |
{ |
Z c,m,b,nm,dn; |
int ret; |
|
Z c,m,t,b,nm,dn; |
NODE node; |
NODE node; |
|
|
asir_assert(ARG0(arg),O_N,"inttorat"); |
asir_assert(ARG0(arg),O_N,"inttorat"); |
asir_assert(ARG1(arg),O_N,"inttorat"); |
asir_assert(ARG1(arg),O_N,"inttorat"); |
asir_assert(ARG2(arg),O_N,"inttorat"); |
asir_assert(ARG2(arg),O_N,"inttorat"); |
c = (Z)ARG0(arg); m = (Z)ARG1(arg); b = (Z)ARG2(arg); |
c = (Z)ARG0(arg); m = (Z)ARG1(arg); b = (Z)ARG2(arg); |
inttorat(c,m,b,&nm,&dn); |
remz(c,m,&t); c = t; |
node = mknode(2,nm,dn); MKLIST(*rp,node); |
ret = inttorat(c,m,b,&nm,&dn); |
|
if ( !ret ) |
|
*rp = 0; |
|
else { |
|
node = mknode(2,nm,dn); MKLIST(*rp,node); |
|
} |
} |
} |
|
|
void Pigcd(NODE arg,Z *rp) |
void Pigcd(NODE arg,Z *rp) |
Line 508 void Pishift(NODE arg,Z *rp) |
|
Line 518 void Pishift(NODE arg,Z *rp) |
|
s = (Z)ARG1(arg); |
s = (Z)ARG1(arg); |
asir_assert(n1,O_N,"ixor"); |
asir_assert(n1,O_N,"ixor"); |
asir_assert(s,O_N,"ixor"); |
asir_assert(s,O_N,"ixor"); |
bshiftz(n1,QTOS(s),rp); |
bshiftz(n1,ZTOS(s),rp); |
} |
} |
|
|
void isqrt(Z a,Z *r) |
void isqrt(Z a,Z *r) |
Line 595 void Pinv(NODE arg,Num *rp) |
|
Line 605 void Pinv(NODE arg,Num *rp) |
|
invz((Z)n,mod,(Z *)rp); |
invz((Z)n,mod,(Z *)rp); |
break; |
break; |
case N_M: |
case N_M: |
inv = invm(CONT((MQ)n),QTOS(mod)); |
inv = invm(CONT((MQ)n),ZTOS(mod)); |
STOMQ(inv,r); |
STOMQ(inv,r); |
*rp = (Num)r; |
*rp = (Num)r; |
break; |
break; |
Line 607 void Pinv(NODE arg,Num *rp) |
|
Line 617 void Pinv(NODE arg,Num *rp) |
|
void Pfac(NODE arg,Z *rp) |
void Pfac(NODE arg,Z *rp) |
{ |
{ |
asir_assert(ARG0(arg),O_N,"fac"); |
asir_assert(ARG0(arg),O_N,"fac"); |
factorialz(QTOS((Q)ARG0(arg)),rp); |
factorialz(ZTOS((Q)ARG0(arg)),rp); |
} |
} |
|
|
void Plrandom(NODE arg,Z *rp) |
void Plrandom(NODE arg,Z *rp) |
{ |
{ |
asir_assert(ARG0(arg),O_N,"lrandom"); |
asir_assert(ARG0(arg),O_N,"lrandom"); |
randomz(QTOS((Q)ARG0(arg)),rp); |
randomz(ZTOS((Q)ARG0(arg)),rp); |
} |
} |
|
|
void Prandom(NODE arg,Z *rp) |
void Prandom(NODE arg,Z *rp) |
Line 625 void Prandom(NODE arg,Z *rp) |
|
Line 635 void Prandom(NODE arg,Z *rp) |
|
r = mrand48()&BMASK; |
r = mrand48()&BMASK; |
#else |
#else |
if ( arg ) |
if ( arg ) |
srandom(QTOS((Q)ARG0(arg))); |
srandom(ZTOS((Q)ARG0(arg))); |
r = random()&BMASK; |
r = random()&BMASK; |
#endif |
#endif |
#endif |
#endif |
if ( arg ) |
if ( arg ) |
mt_sgenrand(QTOS((Q)ARG0(arg))); |
mt_sgenrand(ZTOS((Q)ARG0(arg))); |
r = mt_genrand(); |
r = mt_genrand(); |
UTOQ(r,*rp); |
UTOZ(r,*rp); |
} |
} |
|
|
#if defined(VISUAL) || defined(__MINGW32__) |
#if defined(VISUAL) || defined(__MINGW32__) |
Line 660 void Pprime(NODE arg,Z *rp) |
|
Line 670 void Pprime(NODE arg,Z *rp) |
|
int i; |
int i; |
|
|
asir_assert(ARG0(arg),O_N,"prime"); |
asir_assert(ARG0(arg),O_N,"prime"); |
i = QTOS((Q)ARG0(arg)); |
i = ZTOS((Q)ARG0(arg)); |
if ( i < 0 || i >= 1900 ) |
if ( i < 0 || i >= 1900 ) |
*rp = 0; |
*rp = 0; |
else |
else |
STOQ(sprime[i],*rp); |
STOZ(sprime[i],*rp); |
} |
} |
|
|
void Plprime(NODE arg,Z *rp) |
void Plprime(NODE arg,Z *rp) |
Line 672 void Plprime(NODE arg,Z *rp) |
|
Line 682 void Plprime(NODE arg,Z *rp) |
|
int i,p; |
int i,p; |
|
|
asir_assert(ARG0(arg),O_N,"lprime"); |
asir_assert(ARG0(arg),O_N,"lprime"); |
i = QTOS((Q)ARG0(arg)); |
i = ZTOS((Q)ARG0(arg)); |
if ( i < 0 ) |
if ( i < 0 ) |
*rp = 0; |
*rp = 0; |
else |
else |
p = get_lprime(i); |
p = get_lprime(i); |
STOQ(p,*rp); |
STOZ(p,*rp); |
} |
} |
|
|
|
#if SIZEOF_LONG==8 |
|
void Plprime64(NODE arg,Z *rp) |
|
{ |
|
int i; |
|
mp_limb_t p; |
|
|
|
asir_assert(ARG0(arg),O_N,"lprime64"); |
|
i = ZTOS((Q)ARG0(arg)); |
|
if ( i < 0 ) |
|
*rp = 0; |
|
else |
|
p = get_lprime64(i); |
|
STOZ(p,*rp); |
|
} |
|
#endif |
|
|
extern int up_kara_mag, up_tkara_mag, up_fft_mag; |
extern int up_kara_mag, up_tkara_mag, up_fft_mag; |
|
|
void Pset_upfft(NODE arg,Z *rp) |
void Pset_upfft(NODE arg,Z *rp) |
{ |
{ |
if ( arg ) { |
if ( arg ) { |
asir_assert(ARG0(arg),O_N,"set_upfft"); |
asir_assert(ARG0(arg),O_N,"set_upfft"); |
up_fft_mag = QTOS((Q)ARG0(arg)); |
up_fft_mag = ZTOS((Q)ARG0(arg)); |
} |
} |
STOQ(up_fft_mag,*rp); |
STOZ(up_fft_mag,*rp); |
} |
} |
|
|
void Pset_upkara(NODE arg,Z *rp) |
void Pset_upkara(NODE arg,Z *rp) |
{ |
{ |
if ( arg ) { |
if ( arg ) { |
asir_assert(ARG0(arg),O_N,"set_upkara"); |
asir_assert(ARG0(arg),O_N,"set_upkara"); |
up_kara_mag = QTOS((Q)ARG0(arg)); |
up_kara_mag = ZTOS((Q)ARG0(arg)); |
} |
} |
STOQ(up_kara_mag,*rp); |
STOZ(up_kara_mag,*rp); |
} |
} |
|
|
void Pset_uptkara(NODE arg,Z *rp) |
void Pset_uptkara(NODE arg,Z *rp) |
{ |
{ |
if ( arg ) { |
if ( arg ) { |
asir_assert(ARG0(arg),O_N,"set_uptkara"); |
asir_assert(ARG0(arg),O_N,"set_uptkara"); |
up_tkara_mag = QTOS((Q)ARG0(arg)); |
up_tkara_mag = ZTOS((Q)ARG0(arg)); |
} |
} |
STOQ(up_tkara_mag,*rp); |
STOZ(up_tkara_mag,*rp); |
} |
} |
|
|
extern int up2_kara_mag; |
extern int up2_kara_mag; |
Line 715 void Pset_up2kara(NODE arg,Z *rp) |
|
Line 741 void Pset_up2kara(NODE arg,Z *rp) |
|
{ |
{ |
if ( arg ) { |
if ( arg ) { |
asir_assert(ARG0(arg),O_N,"set_up2kara"); |
asir_assert(ARG0(arg),O_N,"set_up2kara"); |
up2_kara_mag = QTOS((Q)ARG0(arg)); |
up2_kara_mag = ZTOS((Q)ARG0(arg)); |
} |
} |
STOQ(up2_kara_mag,*rp); |
STOZ(up2_kara_mag,*rp); |
} |
} |
|
|
void Pigcdbin(NODE arg,Z *rp) |
void Pigcdbin(NODE arg,Z *rp) |