[BACK]Return to N.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2018 / engine

File: [local] / OpenXM_contrib2 / asir2018 / engine / N.c (download)

Revision 1.2, Fri Sep 21 07:06:51 2018 UTC (5 years, 7 months ago) by noro
Branch: MAIN
Changes since 1.1: +50 -0 lines

Fixed several bugs.
configure.in -> configure.ac.

#include "gmp.h"

unsigned long mul64(unsigned long a,unsigned long b,unsigned long *c)
{
  unsigned long u;
  u = (unsigned long)mpn_mul_1((mp_limb_t *)c,(mp_limb_t *)&a,1,(mp_limb_t)b);
  c[1] = u;
  return u;
}

unsigned long mod64(unsigned long u,unsigned long l,unsigned long b)
{
  unsigned long q[2],d[2];
  unsigned long r;

  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);
  return r;
}

unsigned long mulmod64(unsigned long a,unsigned long b,unsigned long m)
{
  unsigned long d[2],q[2];
  unsigned long r;

  d[1] = (unsigned long)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);
  return r;
}

unsigned long muladdmod64(unsigned long a,unsigned long b,unsigned long c,unsigned long m)
{
  unsigned long d[2],q[2];
  unsigned long r;

  d[0] = c;
  d[1] = (unsigned long)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);
  return r;
}

unsigned long invmod64(unsigned long a,unsigned long m)
{
  mpz_t x,y,z;

  mpz_init_set_ui(x,a);
  mpz_init_set_ui(y,m);
  mpz_invert(z,x,y);
  return mpz_get_ui(z);
}