version 1.2, 2018/09/21 07:06:51 |
version 1.3, 2018/10/01 05:49:06 |
|
|
|
/* $OpenXM$ */ |
#include "gmp.h" |
#include "gmp.h" |
|
|
unsigned long mul64(unsigned long a,unsigned long b,unsigned long *c) |
mp_limb_t mul64(mp_limb_t a,mp_limb_t b,mp_limb_t *c) |
{ |
{ |
unsigned long u; |
mp_limb_t u; |
u = (unsigned long)mpn_mul_1((mp_limb_t *)c,(mp_limb_t *)&a,1,(mp_limb_t)b); |
u = (mp_limb_t)mpn_mul_1((mp_limb_t *)c,(mp_limb_t *)&a,1,(mp_limb_t)b); |
c[1] = u; |
c[1] = u; |
return u; |
return u; |
} |
} |
|
|
unsigned long mod64(unsigned long u,unsigned long l,unsigned long b) |
mp_limb_t mod64(mp_limb_t u,mp_limb_t l,mp_limb_t b) |
{ |
{ |
unsigned long q[2],d[2]; |
mp_limb_t q[2],d[2]; |
unsigned long r; |
mp_limb_t r; |
|
|
d[0] = l; d[1] = u; |
d[0] = l; d[1] = u; |
r = (unsigned long)mpn_divmod_1((mp_limb_t *)q,(mp_limb_t *)d,2,(mp_limb_t)b); |
r = (mp_limb_t)mpn_divmod_1((mp_limb_t *)q,(mp_limb_t *)d,2,(mp_limb_t)b); |
return r; |
return r; |
} |
} |
|
|
unsigned long mulmod64(unsigned long a,unsigned long b,unsigned long m) |
mp_limb_t mulmod64(mp_limb_t a,mp_limb_t b,mp_limb_t m) |
{ |
{ |
unsigned long d[2],q[2]; |
mp_limb_t d[2],q[2]; |
unsigned long r; |
mp_limb_t r; |
|
|
d[1] = (unsigned long)mpn_mul_1(d,(mp_limb_t *)&a,1,(mp_limb_t)b); |
d[1] = (mp_limb_t)mpn_mul_1(d,(mp_limb_t *)&a,1,(mp_limb_t)b); |
r = (unsigned long)mpn_divmod_1((mp_limb_t *)q,(mp_limb_t *)d,2,(mp_limb_t)m); |
r = (mp_limb_t)mpn_divmod_1((mp_limb_t *)q,(mp_limb_t *)d,2,(mp_limb_t)m); |
return r; |
return r; |
} |
} |
|
|
unsigned long muladdmod64(unsigned long a,unsigned long b,unsigned long c,unsigned long m) |
mp_limb_t muladdmod64(mp_limb_t a,mp_limb_t b,mp_limb_t c,mp_limb_t m) |
{ |
{ |
unsigned long d[2],q[2]; |
mp_limb_t d[2],q[2]; |
unsigned long r; |
mp_limb_t r; |
|
|
d[0] = c; |
d[0] = c; |
d[1] = (unsigned long)mpn_addmul_1(d,(mp_limb_t *)&a,1,(mp_limb_t)b); |
d[1] = (mp_limb_t)mpn_addmul_1(d,(mp_limb_t *)&a,1,(mp_limb_t)b); |
r = (unsigned long)mpn_divmod_1((mp_limb_t *)q,(mp_limb_t *)d,2,(mp_limb_t)m); |
r = (mp_limb_t)mpn_divmod_1((mp_limb_t *)q,(mp_limb_t *)d,2,(mp_limb_t)m); |
return r; |
return r; |
} |
} |
|
|
unsigned long invmod64(unsigned long a,unsigned long m) |
mp_limb_t invmod64(mp_limb_t a,mp_limb_t m) |
{ |
{ |
mpz_t x,y,z; |
mpz_t x,y,z; |
|
|
mpz_init_set_ui(x,a); |
mpz_init_set_ui(x,a); |
mpz_init_set_ui(y,m); |
mpz_init_set_ui(y,m); |
|
mpz_init(z); |
mpz_invert(z,x,y); |
mpz_invert(z,x,y); |
return mpz_get_ui(z); |
return mpz_get_ui(z); |
} |
} |