您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ CNST_LIMB函数代码示例

51自学网 2021-06-01 20:03:21
  C++
这篇教程C++ CNST_LIMB函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中CNST_LIMB函数的典型用法代码示例。如果您正苦于以下问题:C++ CNST_LIMB函数的具体用法?C++ CNST_LIMB怎么用?C++ CNST_LIMB使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了CNST_LIMB函数的30个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: check_limb

voidcheck_limb (void){  int        i;  mp_limb_t  limb;  mpz_t      z;  char       *s;  check_one ("0", "%Md", CNST_LIMB(0));  check_one ("1", "%Md", CNST_LIMB(1));  /* "i" many 1 bits, tested against mpz_get_str in decimal and hex */  limb = 1;  mpz_init_set_ui (z, 1L);  for (i = 1; i <= GMP_LIMB_BITS; i++)    {      s = mpz_get_str (NULL, 10, z);      check_one (s, "%Mu", limb);      (*__gmp_free_func) (s, strlen (s) + 1);      s = mpz_get_str (NULL, 16, z);      check_one (s, "%Mx", limb);      (*__gmp_free_func) (s, strlen (s) + 1);      s = mpz_get_str (NULL, -16, z);      check_one (s, "%MX", limb);      (*__gmp_free_func) (s, strlen (s) + 1);      limb = 2*limb + 1;      mpz_mul_2exp (z, z, 1L);      mpz_add_ui (z, z, 1L);    }  mpz_clear (z);}
开发者ID:applesnake,项目名称:cocotron-tools-gpl3,代码行数:35,


示例2: tc4_rshift_inplace

void tc4_rshift_inplace(mp_ptr rp, mp_size_t * rn, mp_size_t bits){   if (*rn)	{		if ((*rn) > 0) 		{			mpn_rshift(rp, rp, *rn, bits);	      if (rp[(*rn) - 1] == CNST_LIMB(0)) (*rn)--;		} else 		{			mpn_rshift(rp, rp, -(*rn), bits);	      if (rp[-(*rn) - 1] == CNST_LIMB(0)) (*rn)++;		}	}}
开发者ID:BrianGladman,项目名称:mpir,代码行数:15,


示例3: check_0x81c25113

/* ARM gcc 2.95.4 was seen generating bad code for ulong->double   conversions, resulting in for instance 0x81c25113 incorrectly converted.   This test exercises that value, to see mpn_get_d has avoided the   problem.  */voidcheck_0x81c25113 (void){#if GMP_NUMB_BITS >= 32  double     want = 2176995603.0;  double     got;  mp_limb_t  np[4];  mp_size_t  nsize;  long       exp;  if (tests_dbl_mant_bits() < 32)    return;  for (nsize = 1; nsize <= numberof (np); nsize++)    {      refmpn_zero (np, nsize-1);      np[nsize-1] = CNST_LIMB(0x81c25113);      exp = - (nsize-1) * GMP_NUMB_BITS;      got = mpn_get_d (np, nsize, (mp_size_t) 0, exp);      if (got != want)        {          printf  ("mpn_get_d wrong on 2176995603 (0x81c25113)/n");          printf  ("  nsize  %ld/n", (long) nsize);          printf  ("  exp    %ld/n", exp);          d_trace ("  got    ", got);          d_trace ("  want   ", want);          abort ();        }    }#endif}
开发者ID:qsnake,项目名称:mpir,代码行数:35,


示例4: mpz_divisible_2exp_p

intmpz_divisible_2exp_p (mpz_srcptr a, unsigned long d){  unsigned long  i, dlimbs, dbits;  mp_ptr         ap;  mp_limb_t      dmask;  mp_size_t      asize;  asize = ABSIZ(a);  dlimbs = d / GMP_NUMB_BITS;  /* if d covers the whole of a, then only a==0 is divisible */  if (asize <= dlimbs)    return asize == 0;  /* whole limbs must be zero */  ap = PTR(a);  for (i = 0; i < dlimbs; i++)    if (ap[i] != 0)      return 0;  /* left over bits must be zero */  dbits = d % GMP_NUMB_BITS;  dmask = (CNST_LIMB(1) << dbits) - 1;  return (ap[dlimbs] & dmask) == 0;}
开发者ID:mahdiz,项目名称:mpclib,代码行数:26,


示例5: REGPARM_ATTR

REGPARM_ATTR (1) static voidcfdiv_q_2exp (mpz_ptr w, mpz_srcptr u, mp_bitcnt_t cnt, int dir){  mp_size_t  wsize, usize, abs_usize, limb_cnt, i;  mp_srcptr  up;  mp_ptr     wp;  mp_limb_t  round, rmask;  usize = SIZ (u);  abs_usize = ABS (usize);  limb_cnt = cnt / GMP_NUMB_BITS;  wsize = abs_usize - limb_cnt;  if (wsize <= 0)    {      /* u < 2**cnt, so result 1, 0 or -1 according to rounding */      PTR(w)[0] = 1;      SIZ(w) = (usize == 0 || (usize ^ dir) < 0 ? 0 : dir);      return;    }  /* +1 limb to allow for mpn_add_1 below */  MPZ_REALLOC (w, wsize+1);  /* Check for rounding if direction matches u sign.     Set round if we're skipping non-zero limbs.  */  up = PTR(u);  round = 0;  rmask = ((usize ^ dir) >= 0 ? MP_LIMB_T_MAX : 0);  if (rmask != 0)    for (i = 0; i < limb_cnt && round == 0; i++)      round = up[i];  wp = PTR(w);  cnt %= GMP_NUMB_BITS;  if (cnt != 0)    {      round |= rmask & mpn_rshift (wp, up + limb_cnt, wsize, cnt);      wsize -= (wp[wsize - 1] == 0);    }  else    MPN_COPY_INCR (wp, up + limb_cnt, wsize);  if (round != 0)    {      if (wsize != 0)	{	  mp_limb_t cy;	  cy = mpn_add_1 (wp, wp, wsize, CNST_LIMB(1));	  wp[wsize] = cy;	  wsize += cy;	}      else	{	  /* We shifted something to zero.  */	  wp[0] = 1;	  wsize = 1;	}    }  SIZ(w) = (usize >= 0 ? wsize : -wsize);}
开发者ID:AllardJ,项目名称:Tomato,代码行数:60,


示例6: tc4_divexact_by3

void tc4_divexact_by3(mp_ptr rp, mp_size_t * rn, mp_ptr x, mp_size_t xn){	if (xn)	{		mp_size_t xu = ABS(xn);		mpn_divexact_by3(rp, x, xu);		if (xn > 0)		{			if (rp[xu - 1] == CNST_LIMB(0)) *rn = xn - 1;			else *rn = xn;		} else		{			if (rp[xu - 1] == CNST_LIMB(0)) *rn = xn + 1;			else *rn = xn;		}		} else *rn = 0;}
开发者ID:BrianGladman,项目名称:mpir,代码行数:17,


示例7: tc4_divexact_by15

void tc4_divexact_by15(mp_ptr rp, mp_size_t * rn, mp_ptr x, mp_size_t xn){	if (xn)	{		mp_size_t xu = ABS(xn);		mpn_divexact_byfobm1(rp, x, xu, CNST_LIMB(15), CNST_LIMB((~0)/15)); /* works for 32 and 64 bits */		if (xn > 0)		{			if (rp[xu - 1] == CNST_LIMB(0)) *rn = xn - 1;			else *rn = xn;		} else		{			if (rp[xu - 1] == CNST_LIMB(0)) *rn = xn + 1;			else *rn = xn;		}		} else *rn = 0;}
开发者ID:BrianGladman,项目名称:mpir,代码行数:17,


示例8: DO_mpn_addlsh_n

static mp_limb_tDO_mpn_addlsh_n(mp_ptr dst, mp_srcptr src, mp_size_t n, unsigned int s, mp_ptr ws){#if USE_MUL_1 && 0  return mpn_addmul_1(dst,src,n,CNST_LIMB(1) <<(s));#else  mp_limb_t __cy;  __cy = mpn_lshift(ws,src,n,s);  return    __cy + mpn_add_n(dst,dst,ws,n);#endif}
开发者ID:AlexeiSheplyakov,项目名称:gmp.pkg,代码行数:11,


示例9: gmp_rrandomb

static voidgmp_rrandomb (mp_ptr rp, gmp_randstate_t rstate, mpir_ui nbits){  mpir_ui bi;  mp_limb_t ranm;		/* buffer for random bits */  unsigned cap_chunksize, chunksize;  mp_size_t i;  /* Set entire result to 111..1  */  i = (nbits + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS - 1;  rp[i] = GMP_NUMB_MAX >> (GMP_NUMB_BITS - (nbits % GMP_NUMB_BITS)) % GMP_NUMB_BITS;  for (i = i - 1; i >= 0; i--)    rp[i] = GMP_NUMB_MAX;  _gmp_rand (&ranm, rstate, BITS_PER_RANDCALL);  cap_chunksize = nbits / (ranm % 4 + 1);  cap_chunksize += cap_chunksize == 0; /* make it at least 1 */  bi = nbits;  for (;;)    {      _gmp_rand (&ranm, rstate, BITS_PER_RANDCALL);      chunksize = 1 + ranm % cap_chunksize;      bi = (bi < chunksize) ? 0 : bi - chunksize;      if (bi == 0)	break;			/* low chunk is ...1 */      rp[bi / GMP_NUMB_BITS] ^= CNST_LIMB (1) << bi % GMP_NUMB_BITS;      _gmp_rand (&ranm, rstate, BITS_PER_RANDCALL);      chunksize = 1 + ranm % cap_chunksize;      bi = (bi < chunksize) ? 0 : bi - chunksize;      mpn_incr_u (rp + bi / GMP_NUMB_BITS, CNST_LIMB (1) << bi % GMP_NUMB_BITS);      if (bi == 0)	break;			/* low chunk is ...0 */    }}
开发者ID:Masuzu,项目名称:RumourPropagation,代码行数:41,


示例10: check_twobits

voidcheck_twobits (void){#define TWOBITS(a, b) /  ((CNST_LIMB(1) << (a)) | (CNST_LIMB(1) << (b)))  refmpn_zero (x, SIZE);  x[0] = TWOBITS (1, 0);  check ();  refmpn_zero (x, SIZE);  x[0] = TWOBITS (GMP_NUMB_BITS-1, 1);  check ();  refmpn_zero (x, SIZE);  x[0] = CNST_LIMB(1);  x[1] = CNST_LIMB(1);  check ();  refmpn_zero (x, SIZE);  x[0] = CNST_LIMB(1) << (GMP_NUMB_BITS-1);  x[1] = CNST_LIMB(1);  check ();  refmpn_zero (x, SIZE);  x[1] = TWOBITS (1, 0);  check ();  refmpn_zero (x, SIZE);  x[1] = CNST_LIMB(1);  x[2] = CNST_LIMB(1);  check ();}
开发者ID:AllardJ,项目名称:Tomato,代码行数:33,


示例11: mpn_invert

voidmpn_invert (mp_ptr ip, mp_srcptr dp, mp_size_t n, mp_ptr scratch){  ASSERT (n > 0);  ASSERT (dp[n-1] & GMP_NUMB_HIGHBIT);  ASSERT (! MPN_OVERLAP_P (ip, n, dp, n));  ASSERT (! MPN_OVERLAP_P (ip, n, scratch, mpn_invertappr_itch(n)));  ASSERT (! MPN_OVERLAP_P (dp, n, scratch, mpn_invertappr_itch(n)));  if (n == 1)    invert_limb (*ip, *dp);  else if (BELOW_THRESHOLD (n, INV_APPR_THRESHOLD))    {	/* Maximum scratch needed by this branch: 2*n */	mp_size_t i;	mp_ptr xp;	xp = scratch;				/* 2 * n limbs */	/* n > 1 here */	i = n;	do	  xp[--i] = GMP_NUMB_MAX;	while (i);	mpn_com (xp + n, dp, n);	if (n == 2) {	  mpn_divrem_2 (ip, 0, xp, 4, dp);	} else {	  gmp_pi1_t inv;	  invert_pi1 (inv, dp[n-1], dp[n-2]);	  /* FIXME: should we use dcpi1_div_q, for big sizes? */	  mpn_sbpi1_div_q (ip, xp, 2 * n, dp, n, inv.inv32);	}    }  else { /* Use approximated inverse; correct the result if needed. */      mp_limb_t e; /* The possible error in the approximate inverse */      ASSERT ( mpn_invert_itch (n) >= mpn_invertappr_itch (n) );      e = mpn_ni_invertappr (ip, dp, n, scratch);      if (UNLIKELY (e)) { /* Assume the error can only be "0" (no error) or "1". */	/* Code to detect and correct the "off by one" approximation. */	mpn_mul_n (scratch, ip, dp, n);	e = mpn_add_n (scratch, scratch, dp, n); /* FIXME: we only need e.*/	if (LIKELY(e)) /* The high part can not give a carry by itself. */	  e = mpn_add_nc (scratch + n, scratch + n, dp, n, e); /* FIXME:e */	/* If the value was wrong (no carry), correct it (increment). */	e ^= CNST_LIMB (1);	MPN_INCR_U (ip, n, e);      }  }}
开发者ID:AaronNGray,项目名称:texlive-libs,代码行数:51,


示例12: mpz_fake_bits

/* Create a fake mpz consisting of just a single 1 bit, with totbits being   the total number of bits, inclusive of that 1 bit.  */voidmpz_fake_bits (mpz_ptr z, unsigned long totbits){  static mp_limb_t  n;  unsigned long     zero_bits, zero_limbs;  zero_bits = totbits - 1;  zero_limbs = zero_bits / GMP_NUMB_BITS;  zero_bits %= GMP_NUMB_BITS;  SIZ(z) = zero_limbs + 1;  PTR(z) = (&n) - (SIZ(z) - 1);  n = CNST_LIMB(1) << zero_bits;  ASSERT_ALWAYS (mpz_sizeinbase (z, 2) == totbits);}
开发者ID:KrisChaplin,项目名称:LRT2x4_v1.0.2.06_GPL_source,代码行数:18,


示例13: check_twobit

/* Exercise values 2^n+1, while such a value fits the mantissa of a double. */voidcheck_twobit (void){  int        i, mant_bits;  double     got, want;  mp_size_t  nsize, sign;  mp_ptr     np;  mant_bits = tests_dbl_mant_bits ();  if (mant_bits == 0)    return;  np = refmpn_malloc_limbs (BITS_TO_LIMBS (mant_bits));  want = 3.0;  for (i = 1; i < mant_bits; i++)    {      nsize = BITS_TO_LIMBS (i+1);      refmpn_zero (np, nsize);      np[i/GMP_NUMB_BITS] = CNST_LIMB(1) << (i % GMP_NUMB_BITS);      np[0] |= 1;      for (sign = 0; sign >= -1; sign--)        {          got = mpn_get_d (np, nsize, sign, 0);          if (got != want)            {              printf    ("mpn_get_d wrong on 2^%d + 1/n", i);              printf    ("   sign     %ld/n", (long) sign);              mpn_trace ("   n        ", np, nsize);              printf    ("   nsize    %ld/n", (long) nsize);              d_trace   ("   want     ", want);              d_trace   ("   got      ", got);              abort();            }          want = -want;        }      want = 2.0 * want - 1.0;    }  free (np);}
开发者ID:qsnake,项目名称:mpir,代码行数:43,


示例14: gmp_randinit_lc_2exp

voidgmp_randinit_lc_2exp (gmp_randstate_t rstate,		      mpz_srcptr a,		      unsigned long int c,		      mp_bitcnt_t m2exp){  gmp_rand_lc_struct *p;  mp_size_t seedn = BITS_TO_LIMBS (m2exp);  ASSERT_ALWAYS (m2exp != 0);  p = __GMP_ALLOCATE_FUNC_TYPE (1, gmp_rand_lc_struct);  RNG_STATE (rstate) = (void *) p;  RNG_FNPTR (rstate) = (void *) &Linear_Congruential_Generator;  /* allocate m2exp bits of space for p->_mp_seed, and initial seed "1" */  mpz_init2 (p->_mp_seed, m2exp);  MPN_ZERO (PTR (p->_mp_seed), seedn);  SIZ (p->_mp_seed) = seedn;  PTR (p->_mp_seed)[0] = 1;  /* "a", forced to 0 to 2^m2exp-1 */  mpz_init (p->_mp_a);  mpz_fdiv_r_2exp (p->_mp_a, a, m2exp);  /* Avoid SIZ(a) == 0 to avoid checking for special case in lc().  */  if (SIZ (p->_mp_a) == 0)    {      SIZ (p->_mp_a) = 1;      PTR (p->_mp_a)[0] = CNST_LIMB (0);    }  MPN_SET_UI (p->_cp, p->_cn, c);  /* Internally we may discard any bits of c above m2exp.  The following     code ensures that __GMPN_ADD in lc() will always work.  */  if (seedn < p->_cn)    p->_cn = (p->_cp[0] != 0);  p->_mp_m2exp = m2exp;}
开发者ID:bsmr-common-lisp,项目名称:xcl,代码行数:41,


示例15: tc4_addmul_1

void tc4_addmul_1(mp_ptr wp, mp_size_t * wn, mp_srcptr xp, mp_size_t xn, mp_limb_t y){  mp_size_t  sign, wu, xu, ws, new_wn, min_size, dsize;  mp_limb_t  cy;  /* w unaffected if x==0 or y==0 */  if (xn == 0 || y == 0)    return;  sign = xn;  xu = ABS (xn);  ws = *wn;  if (*wn == 0)  {      /* nothing to add to, just set x*y, "sign" gives the sign */      cy = mpn_mul_1 (wp, xp, xu, y);      if (cy)		{			wp[xu] = cy;         xu = xu + 1;		}       *wn = (sign >= 0 ? xu : -xu);      return;  }    sign ^= *wn;  wu = ABS (*wn);  new_wn = MAX (wu, xu);  min_size = MIN (wu, xu);  if (sign >= 0)  {      /* addmul of absolute values */      cy = mpn_addmul_1 (wp, xp, min_size, y);            dsize = xu - wu;#if HAVE_NATIVE_mpn_mul_1c      if (dsize > 0)        cy = mpn_mul_1c (wp + min_size, xp + min_size, dsize, y, cy);      else if (dsize < 0)      {          dsize = -dsize;          cy = mpn_add_1 (wp + min_size, wp + min_size, dsize, cy);      }#else      if (dsize != 0)      {          mp_limb_t cy2;          if (dsize > 0)            cy2 = mpn_mul_1 (wp + min_size, xp + min_size, dsize, y);          else          {              dsize = -dsize;              cy2 = 0;          }          cy = cy2 + mpn_add_1 (wp + min_size, wp + min_size, dsize, cy);      }#endif      if (cy)		{			wp[dsize + min_size] = cy;         new_wn ++;		}   } else   {      /* submul of absolute values */      cy = mpn_submul_1 (wp, xp, min_size, y);      if (wu >= xu)      {          /* if w bigger than x, then propagate borrow through it */          if (wu != xu)            cy = mpn_sub_1 (wp + xu, wp + xu, wu - xu, cy);          if (cy != 0)          {              /* Borrow out of w, take twos complement negative to get                 absolute value, flip sign of w.  */              wp[new_wn] = ~-cy;  /* extra limb is 0-cy */              mpn_not (wp, new_wn);              new_wn++;              MPN_INCR_U (wp, new_wn, CNST_LIMB(1));              ws = -*wn;          }      } else /* wu < xu */      {          /* x bigger than w, so want x*y-w.  Submul has given w-x*y, so             take twos complement and use an mpn_mul_1 for the rest.  */          mp_limb_t  cy2;          /* -(-cy*b^n + w-x*y) = (cy-1)*b^n + ~(w-x*y) + 1 */          mpn_not (wp, wu);          cy += mpn_add_1 (wp, wp, wu, CNST_LIMB(1));          cy -= 1;//.........这里部分代码省略.........
开发者ID:BrianGladman,项目名称:mpir,代码行数:101,


示例16: mpz_combit

voidmpz_combit (mpz_ptr d, mp_bitcnt_t bit_index){  mp_size_t dsize = SIZ(d);  mp_ptr dp = PTR(d);  mp_size_t limb_index = bit_index / GMP_NUMB_BITS;  mp_limb_t bit = (CNST_LIMB (1) << (bit_index % GMP_NUMB_BITS));  /* Check for the most common case: Positive input, no realloc or     normalization needed. */  if (limb_index + 1 < dsize)    dp[limb_index] ^= bit;  /* Check for the hairy case. d < 0, and we have all zero bits to the     right of the bit to toggle. */  else if (limb_index < -dsize	   && (limb_index == 0 || mpn_zero_p (dp, limb_index))	   && (dp[limb_index] & (bit - 1)) == 0)    {      ASSERT (dsize < 0);      dsize = -dsize;      if (dp[limb_index] & bit)	{	  /* We toggle the least significant one bit. Corresponds to	     an add, with potential carry propagation, on the absolute	     value. */	  dp = MPZ_REALLOC (d, 1 + dsize);	  dp[dsize] = 0;	  MPN_INCR_U (dp + limb_index, 1 + dsize - limb_index, bit);	  SIZ(d) = - dsize - dp[dsize];	}      else	{	  /* We toggle a zero bit, subtract from the absolute value. */	  MPN_DECR_U (dp + limb_index, dsize - limb_index, bit);	  /* The absolute value shrinked by at most one bit. */	  dsize -= dp[dsize - 1] == 0;	  ASSERT (dsize > 0 && dp[dsize - 1] != 0);	  SIZ (d) = -dsize;	}    }  else    {      /* Simple case: Toggle the bit in the absolute value. */      dsize = ABS(dsize);      if (limb_index < dsize)	{	  mp_limb_t	 dlimb;	  dlimb = dp[limb_index] ^ bit;	  dp[limb_index] = dlimb;	  /* Can happen only when limb_index = dsize - 1. Avoid SIZ(d)	     bookkeeping in the common case. */	  if (UNLIKELY ((dlimb == 0) + limb_index == dsize)) /* dsize == limb_index + 1 */	    {	      /* high limb became zero, must normalize */	      MPN_NORMALIZE (dp, limb_index);	      SIZ (d) = SIZ (d) >= 0 ? limb_index : -limb_index;	    }	}      else	{	  dp = MPZ_REALLOC (d, limb_index + 1);	  MPN_ZERO(dp + dsize, limb_index - dsize);	  dp[limb_index++] = bit;	  SIZ(d) = SIZ(d) >= 0 ? limb_index : -limb_index;	}    }}
开发者ID:AaronNGray,项目名称:texlive-libs,代码行数:71,


示例17: r_string

mp_limb_tr_string (const char *s){  const char  *s_orig = s;  long        n;  if (strcmp (s, "aas") == 0)    return GMP_NUMB_0xAA;  {    mpz_t      z;    mp_limb_t  l;    int        set, siz;    mpz_init (z);    set = mpz_set_str (z, s, 0);    siz = SIZ(z);    l = (siz == 0 ? 0 : siz > 0 ? PTR(z)[0] : -PTR(z)[0]);    mpz_clear (z);    if (set == 0)      {        if (siz > 1 || siz < -1)          printf ("Warning, r parameter %s truncated to %d bits/n",                  s_orig, BITS_PER_MP_LIMB);        return l;      }  }  if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))    n = strtoul (s+2, (char **) &s, 16);  else    n = strtol (s, (char **) &s, 10);  if (strcmp (s, "bits") == 0)    {      mp_limb_t  l;      if (n > BITS_PER_MP_LIMB)        {          fprintf (stderr, "%ld bit parameter invalid (max %d bits)/n",                    n, BITS_PER_MP_LIMB);          exit (1);        }      mpn_random (&l, 1);      return (l | (CNST_LIMB(1) << (n-1))) & LIMB_ONES(n);    }  else  if (strcmp (s, "ones") == 0)    {      if (n > BITS_PER_MP_LIMB)        {          fprintf (stderr, "%ld bit parameter invalid (max %d bits)/n",                    n, BITS_PER_MP_LIMB);          exit (1);        }      return LIMB_ONES (n);    }  else if (*s != '/0')    {      fprintf (stderr, "invalid r parameter: %s/n", s_orig);      exit (1);    }  return n;}
开发者ID:Masuzu,项目名称:RumourPropagation,代码行数:63,


示例18: REGPARM_ATTR

REGPARM_ATTR (1) static voidcfdiv_r_2exp (mpz_ptr w, mpz_srcptr u, unsigned long cnt, int dir){  mp_size_t  usize, abs_usize, limb_cnt, i;  mp_srcptr  up;  mp_ptr     wp;  mp_limb_t  high;  usize = SIZ(u);  if (usize == 0)    {      SIZ(w) = 0;      return;    }  limb_cnt = cnt / GMP_NUMB_BITS;  cnt %= GMP_NUMB_BITS;  abs_usize = ABS (usize);  /* MPZ_REALLOC(w) below is only when w!=u, so we can fetch PTR(u) here     nice and early */  up = PTR(u);  if ((usize ^ dir) < 0)    {      /* Round towards zero, means just truncate */      if (w == u)        {          /* if already smaller than limb_cnt then do nothing */          if (abs_usize <= limb_cnt)            return;          wp = PTR(w);        }      else        {          i = MIN (abs_usize, limb_cnt+1);          MPZ_REALLOC (w, i);          wp = PTR(w);          MPN_COPY (wp, up, i);          /* if smaller than limb_cnt then only the copy is needed */          if (abs_usize <= limb_cnt)            {              SIZ(w) = usize;              return;            }        }    }  else    {      /* Round away from zero, means twos complement if non-zero */      /* if u!=0 and smaller than divisor, then must negate */      if (abs_usize <= limb_cnt)        goto negate;      /* if non-zero low limb, then must negate */      for (i = 0; i < limb_cnt; i++)        if (up[i] != 0)          goto negate;      /* if non-zero partial limb, then must negate */      if ((up[limb_cnt] & LOW_MASK (cnt)) != 0)        goto negate;      /* otherwise low bits of u are zero, so that's the result */      SIZ(w) = 0;      return;    negate:      /* twos complement negation to get 2**cnt-u */      MPZ_REALLOC (w, limb_cnt+1);      up = PTR(u);      wp = PTR(w);      /* Ones complement */      i = MIN (abs_usize, limb_cnt+1);      mpn_com_n (wp, up, i);      for ( ; i <= limb_cnt; i++)        wp[i] = GMP_NUMB_MAX;      /* Twos complement.  Since u!=0 in the relevant part, the twos         complement never gives 0 and a carry, so can use MPN_INCR_U. */      MPN_INCR_U (wp, limb_cnt+1, CNST_LIMB(1));      usize = -usize;    }  /* Mask the high limb */  high = wp[limb_cnt];  high &= LOW_MASK (cnt);  wp[limb_cnt] = high;  /* Strip any consequent high zeros */  while (high == 0)    {      limb_cnt--;      if (limb_cnt < 0)//.........这里部分代码省略.........
开发者ID:STAR111,项目名称:GCC_parser,代码行数:101,


示例19: mpf_ceil_or_floor

static voidmpf_ceil_or_floor (mpf_ptr r, mpf_srcptr u, int dir){  mp_ptr     rp, up, p;  mp_size_t  size, asize, prec;  mp_exp_t   exp;  size = SIZ(u);  if (size == 0)    {    zero:      SIZ(r) = 0;      EXP(r) = 0;      return;    }  rp = PTR(r);  exp = EXP(u);  if (exp <= 0)    {      /* u is only a fraction */      if ((size ^ dir) < 0)        goto zero;      rp[0] = 1;      EXP(r) = 1;      SIZ(r) = dir;      return;    }  EXP(r) = exp;  up = PTR(u);  asize = ABS (size);  up += asize;  /* skip fraction part of u */  asize = MIN (asize, exp);  /* don't lose precision in the copy */  prec = PREC (r) + 1;  /* skip excess over target precision */  asize = MIN (asize, prec);  up -= asize;  if ((size ^ dir) >= 0)    {      /* rounding direction matches sign, must increment if ignored part is         non-zero */      for (p = PTR(u); p != up; p++)        {          if (*p != 0)            {              if (mpn_add_1 (rp, up, asize, CNST_LIMB(1)))                {                  /* was all 0xFF..FFs, which have become zeros, giving just                     a carry */                  rp[0] = 1;                  asize = 1;                  EXP(r)++;                }              SIZ(r) = (size >= 0 ? asize : -asize);              return;            }        }    }  SIZ(r) = (size >= 0 ? asize : -asize);  if (rp != up)    MPN_COPY_INCR (rp, up, asize);}
开发者ID:argp,项目名称:gmp-win32,代码行数:71,


示例20: check_limbdata

voidcheck_limbdata (void){#define M  GMP_NUMB_MAX    static const struct {    mp_exp_t       exp;    mp_size_t      size;    mp_limb_t      d[10];    unsigned long  want;  } data[] = {    /* in the comments here, a "_" indicates a digit (ie. limb) position not       included in the d data, and therefore zero */    { 0, 0, { 0 }, 0L },    /* 0 */    { 1,  1, { 1 }, 1L },   /* 1 */    { 1, -1, { 1 }, -1L },  /* -1 */    { 0,  1, { 1 }, 0L },   /* .1 */    { 0, -1, { 1 }, 0L },   /* -.1 */    { -1,  1, { 1 }, 0L },  /* ._1 */    { -1, -1, { 1 }, 0L },  /* -._1 */    { -999,          1, { 1 }, 0L },   /* .___1 small */    { MP_EXP_T_MIN,  1, { 1 }, 0L },   /* .____1 very small */    { 999,          1, { 1 }, 0L },    /* 1____. big */    { MP_EXP_T_MAX, 1, { 1 }, 0L },    /* 1_____. very big */    { 1, 2, { 999, 2 }, 2L },                  /* 2.9 */    { 5, 8, { 7, 8, 9, 3, 0, 0, 0, 1 }, 3L },  /* 10003.987 */    { 2, 2, { M, M },    LONG_MAX }, /* FF. */    { 2, 2, { M, M, M }, LONG_MAX }, /* FF.F */    { 3, 3, { M, M, M }, LONG_MAX }, /* FFF. */#if GMP_NUMB_BITS >= BITS_PER_ULONG    /* normal case, numb bigger than long */    { 2,  1, { 1 },    0L },      /* 1_. */    { 2,  2, { 0, 1 }, 0L },      /* 10. */    { 2,  2, { 999, 1 }, 999L },  /* 19. */    { 3,  2, { 999, 1 }, 0L },    /* 19_. */#else    /* nails case, numb smaller than long */    { 2,  1, { 1 }, 1L << GMP_NUMB_BITS },  /* 1_. */    { 3,  1, { 1 }, 0L },                   /* 1__. */    { 2,  2, { 99, 1 },    99L + (1L << GMP_NUMB_BITS) },  /* 19. */    { 3,  2, { 1, 99 },    1L << GMP_NUMB_BITS },          /* 91_. */    { 3,  3, { 0, 1, 99 }, 1L << GMP_NUMB_BITS },          /* 910. */#endif  };  mpf_t          f;  unsigned long  got;  int            i;  mp_limb_t      buf[20 + numberof(data[i].d)];  for (i = 0; i < numberof (data); i++)    {      refmpn_fill (buf, 10, CNST_LIMB(0xDEADBEEF));      refmpn_copy (buf+10, data[i].d, ABS(data[i].size));      refmpn_fill (buf+10+ABS(data[i].size), 10, CNST_LIMB(0xDEADBEEF));      PTR(f) = buf+10;      EXP(f) = data[i].exp;      SIZ(f) = data[i].size;      PREC(f) = numberof (data[i].d);      MPF_CHECK_FORMAT (f);      got = mpf_get_si (f);      if (got != data[i].want)        {          printf    ("mpf_get_si wrong at limb data[%d]/n", i);          mpf_trace ("  f", f);          mpn_trace ("  d", data[i].d, data[i].size);          printf    ("  size %ld/n", (long) data[i].size);          printf    ("  exp %ld/n", (long) data[i].exp);          printf    ("  got   %lu (0x%lX)/n", got, got);          printf    ("  want  %lu (0x%lX)/n", data[i].want, data[i].want);          abort();        }    }}
开发者ID:KrisChaplin,项目名称:LRT2x4_v1.0.2.06_GPL_source,代码行数:90,


示例21: mpn_sqrmod_bnm1

//.........这里部分代码省略.........	  xp[n] = mpn_mul_fft (xp, n, ap1, anp, ap1, anp, k);	else if (UNLIKELY (ap1 == a0))	  {	    ASSERT (anp <= n);	    ASSERT (2*anp > n);	    mpn_sqr (xp, a0, an);	    anp = 2*an - n;	    cy = mpn_sub (xp, xp, n, xp + n, anp);	    xp[n] = 0;	    MPN_INCR_U (xp, n+1, cy);	  }	else	  mpn_bc_sqrmod_bnp1 (xp, ap1, n, xp);      }      /* Here the CRT recomposition begins.	 xm <- (xp + xm)/2 = (xp + xm)B^n/2 mod (B^n-1)	 Division by 2 is a bitwise rotation.	 Assumes xp normalised mod (B^n+1).	 The residue class [0] is represented by [B^n-1]; except when	 both input are ZERO.      */#if HAVE_NATIVE_mpn_rsh1add_n || HAVE_NATIVE_mpn_rsh1add_nc#if HAVE_NATIVE_mpn_rsh1add_nc      cy = mpn_rsh1add_nc(rp, rp, xp, n, xp[n]); /* B^n = 1 */      hi = cy << (GMP_NUMB_BITS - 1);      cy = 0;      /* next update of rp[n-1] will set cy = 1 only if rp[n-1]+=hi	 overflows, i.e. a further increment will not overflow again. */#else /* ! _nc */      cy = xp[n] + mpn_rsh1add_n(rp, rp, xp, n); /* B^n = 1 */      hi = (cy<<(GMP_NUMB_BITS-1))&GMP_NUMB_MASK; /* (cy&1) << ... */      cy >>= 1;      /* cy = 1 only if xp[n] = 1 i.e. {xp,n} = ZERO, this implies that	 the rsh1add was a simple rshift: the top bit is 0. cy=1 => hi=0. */#endif#if GMP_NAIL_BITS == 0      add_ssaaaa(cy, rp[n-1], cy, rp[n-1], CNST_LIMB(0), hi);#else      cy += (hi & rp[n-1]) >> (GMP_NUMB_BITS-1);      rp[n-1] ^= hi;#endif#else /* ! HAVE_NATIVE_mpn_rsh1add_n */#if HAVE_NATIVE_mpn_add_nc      cy = mpn_add_nc(rp, rp, xp, n, xp[n]);#else /* ! _nc */      cy = xp[n] + mpn_add_n(rp, rp, xp, n); /* xp[n] == 1 implies {xp,n} == ZERO */#endif      cy += (rp[0]&1);      mpn_rshift(rp, rp, n, 1);      ASSERT (cy <= 2);      hi = (cy<<(GMP_NUMB_BITS-1))&GMP_NUMB_MASK; /* (cy&1) << ... */      cy >>= 1;      /* We can have cy != 0 only if hi = 0... */      ASSERT ((rp[n-1] & GMP_NUMB_HIGHBIT) == 0);      rp[n-1] |= hi;      /* ... rp[n-1] + cy can not overflow, the following INCR is correct. */#endif      ASSERT (cy <= 1);      /* Next increment can not overflow, read the previous comments about cy. */      ASSERT ((cy == 0) || ((rp[n-1] & GMP_NUMB_HIGHBIT) == 0));      MPN_INCR_U(rp, n, cy);      /* Compute the highest half:	 ([(xp + xm)/2 mod (B^n-1)] - xp ) * B^n       */      if (UNLIKELY (2*an < rn))	{	  /* Note that in this case, the only way the result can equal	     zero mod B^{rn} - 1 is if the input is zero, and	     then the output of both the recursive calls and this CRT	     reconstruction is zero, not B^{rn} - 1. */	  cy = mpn_sub_n (rp + n, rp, xp, 2*an - n);	  /* FIXME: This subtraction of the high parts is not really	     necessary, we do it to get the carry out, and for sanity	     checking. */	  cy = xp[n] + mpn_sub_nc (xp + 2*an - n, rp + 2*an - n,				   xp + 2*an - n, rn - 2*an, cy);	  ASSERT (mpn_zero_p (xp + 2*an - n+1, rn - 1 - 2*an));	  cy = mpn_sub_1 (rp, rp, 2*an, cy);	  ASSERT (cy == (xp + 2*an - n)[0]);	}      else	{	  cy = xp[n] + mpn_sub_n (rp + n, rp, xp, n);	  /* cy = 1 only if {xp,n+1} is not ZERO, i.e. {rp,n} is not ZERO.	     DECR will affect _at most_ the lowest n limbs. */	  MPN_DECR_U (rp, 2*n, cy);	}#undef a0#undef a1#undef xp#undef sp1    }}
开发者ID:jiguosong,项目名称:trampoline,代码行数:101,


示例22: mpf_ui_sub

//.........这里部分代码省略.........	      MPN_COPY (rp, vp, vsize);	      rsize = vsize;	      negate ^= 1;	      goto done;	    }	  if (up[0] != 0)	    break;	  up++, usize--;	}      ASSERT (usize > 0 && vsize > 0);      TMP_MARK;      tp = TMP_ALLOC_LIMBS (prec);      /* uuuu     |  uuuu     |  uuuu     |  uuuu     |  uuuu    */      /* vvvvvvv  |  vv       |    vvvvv  |    v      |       vv */      if (usize > ediff)	{	  /* U and V partially overlaps.  */	  if (ediff == 0)	    {	      ASSERT (usize == 1 && vsize >= 1 && ulimb == *up); /* usize is 1>ediff, vsize >= 1 */	      if (1 < vsize)		{		  /* u        */		  /* vvvvvvv  */		  rsize = vsize;		  vsize -= 1;		  /* mpn_cmp (up, vp + vsize - usize, usize) > 0 */		  if (ulimb > vp[vsize])		    {		      tp[vsize] = ulimb - vp[vsize] - 1;		      ASSERT_CARRY (mpn_neg (tp, vp, vsize));		    }		  else		    {		      /* vvvvvvv  */  /* Swap U and V. */		      /* u        */		      MPN_COPY (tp, vp, vsize);		      tp[vsize] = vp[vsize] - ulimb;		      negate = 1;		    }		}	      else /* vsize == usize == 1 */		{		  /* u     */		  /* v     */		  rsize = 1;		  negate = ulimb < vp[0];		  tp[0] = negate ? vp[0] - ulimb: ulimb - vp[0];		}	    }	  else	    {	      ASSERT (vsize + ediff <= usize);	      ASSERT (vsize == 1 && usize >= 2 && ulimb == *vp);		{		  /* uuuu     */		  /*   v      */		  mp_size_t size;		  size = usize - ediff - 1;		  MPN_COPY (tp, up, size);		  ASSERT_NOCARRY (mpn_sub_1 (tp + size, up + size, usize - size, ulimb));		  rsize = usize;		}		/* Other cases are not possible */		/* uuuu     */		/*   vvvvv  */	    }	}      else	{	  /* uuuu     */	  /*      vv  */	  mp_size_t size, i;	  ASSERT_CARRY (mpn_neg (tp, vp, vsize));	  rsize = vsize + ediff;	  size = rsize - usize;	  for (i = vsize; i < size; i++)	    tp[i] = GMP_NUMB_MAX;	  ASSERT_NOCARRY (mpn_sub_1 (tp + size, up, usize, CNST_LIMB (1)));	}      /* Full normalize.  Optimize later.  */      while (rsize != 0 && tp[rsize - 1] == 0)	{	  rsize--;	  uexp--;	}      MPN_COPY (rp, tp, rsize);      TMP_FREE;    } done:  r->_mp_size = negate ? -rsize : rsize;  r->_mp_exp = uexp;#endif}
开发者ID:AaronNGray,项目名称:texlive-libs,代码行数:101,


示例23: lc

static unsigned long intlc (mp_ptr rp, gmp_randstate_t rstate){  mp_ptr tp, seedp, ap;  mp_size_t ta;  mp_size_t tn, seedn, an;  unsigned long int m2exp;  unsigned long int bits;  int cy;  mp_size_t xn;  gmp_rand_lc_struct *p;  TMP_DECL;  p = (gmp_rand_lc_struct *) RNG_STATE (rstate);  m2exp = p->_mp_m2exp;  seedp = PTR (p->_mp_seed);  seedn = SIZ (p->_mp_seed);  ap = PTR (p->_mp_a);  an = SIZ (p->_mp_a);  /* Allocate temporary storage.  Let there be room for calculation of     (A * seed + C) % M, or M if bigger than that.  */  TMP_MARK;  ta = an + seedn + 1;  tn = BITS_TO_LIMBS (m2exp);  if (ta <= tn) /* that is, if (ta < tn + 1) */    {      mp_size_t tmp = an + seedn;      ta = tn + 1;      tp = (mp_ptr) TMP_ALLOC (ta * BYTES_PER_MP_LIMB);      MPN_ZERO (&tp[tmp], ta - tmp); /* mpn_mul won't zero it out.  */    }  else    tp = (mp_ptr) TMP_ALLOC (ta * BYTES_PER_MP_LIMB);  /* t = a * seed.  NOTE: an is always > 0; see initialization.  */  ASSERT (seedn >= an && an > 0);  mpn_mul (tp, seedp, seedn, ap, an);  /* t = t + c.  NOTE: tn is always >= p->_cn (precondition for __GMPN_ADD);     see initialization.  */  ASSERT (tn >= p->_cn);  __GMPN_ADD (cy, tp, tp, tn, p->_cp, p->_cn);  /* t = t % m */  tp[m2exp / GMP_NUMB_BITS] &= (CNST_LIMB (1) << m2exp % GMP_NUMB_BITS) - 1;  /* Save result as next seed.  */  MPN_COPY (PTR (p->_mp_seed), tp, tn);  /* Discard the lower m2exp/2 of the result.  */  bits = m2exp / 2;  xn = bits / GMP_NUMB_BITS;  tn -= xn;  if (tn > 0)    {      unsigned int cnt = bits % GMP_NUMB_BITS;      if (cnt != 0)	{	  mpn_rshift (tp, tp + xn, tn, cnt);	  MPN_COPY_INCR (rp, tp, xn + 1);	}      else			/* Even limb boundary.  */	MPN_COPY_INCR (rp, tp + xn, tn);    }  TMP_FREE;  /* Return number of valid bits in the result.  */  return (m2exp + 1) / 2;}
开发者ID:bsmr-common-lisp,项目名称:xcl,代码行数:77,


示例24: mpn_div_qr_1n_pi1

mp_limb_tmpn_div_qr_1n_pi1 (mp_ptr qp, mp_srcptr up, mp_size_t n, mp_limb_t u1,		   mp_limb_t d, mp_limb_t dinv){  mp_limb_t B2;  mp_limb_t u0, u2;  mp_limb_t q0, q1;  mp_limb_t p0, p1;  mp_limb_t t;  mp_size_t j;  ASSERT (d & GMP_LIMB_HIGHBIT);  ASSERT (n > 0);  ASSERT (u1 < d);  if (n == 1)    {      udiv_qrnnd_preinv (qp[0], u1, u1, up[0], d, dinv);      return u1;    }  /* FIXME: Could be precomputed */  B2 = -d*dinv;  umul_ppmm (q1, q0, dinv, u1);  umul_ppmm (p1, p0, B2, u1);  q1 += u1;  ASSERT (q1 >= u1);  u0 = up[n-1];	/* Early read, to allow qp == up. */  qp[n-1] = q1;  add_mssaaaa (u2, u1, u0, u0, up[n-2], p1, p0);  /* FIXME: Keep q1 in a variable between iterations, to reduce number     of memory accesses. */  for (j = n-2; j-- > 0; )    {      mp_limb_t q2, cy;      /* Additions for the q update:       *	+-------+       *        |u1 * v |       *        +---+---+       *        | u1|       *    +---+---+       *    | 1 | v |  (conditional on u2)       *    +---+---+       *        | 1 |  (conditional on u0 + u2 B2 carry)       *        +---+       * +      | q0|       *   -+---+---+---+       *    | q2| q1| q0|       *    +---+---+---+      */      umul_ppmm (p1, t, u1, dinv);      add_ssaaaa (q2, q1, -u2, u2 & dinv, CNST_LIMB(0), u1);      add_ssaaaa (q2, q1, q2, q1, CNST_LIMB(0), p1);      add_ssaaaa (q2, q1, q2, q1, CNST_LIMB(0), q0);      q0 = t;      umul_ppmm (p1, p0, u1, B2);      ADDC_LIMB (cy, u0, u0, u2 & B2);      u0 -= (-cy) & d;      /* Final q update */      add_ssaaaa (q2, q1, q2, q1, CNST_LIMB(0), cy);      qp[j+1] = q1;      MPN_INCR_U (qp+j+2, n-j-2, q2);      add_mssaaaa (u2, u1, u0, u0, up[j], p1, p0);    }  q1 = (u2 > 0);  u1 -= (-q1) & d;  t = (u1 >= d);  q1 += t;  u1 -= (-t) & d;  udiv_qrnnd_preinv (t, u0, u1, u0, d, dinv);  add_ssaaaa (q1, q0, q1, q0, CNST_LIMB(0), t);  MPN_INCR_U (qp+1, n-1, q1);  qp[0] = q0;  return u0;}
开发者ID:AllardJ,项目名称:Tomato,代码行数:87,


示例25: mpn_toom4_sqr_n

voidmpn_toom4_sqr_n (mp_ptr rp, mp_srcptr up, mp_size_t n){  mp_size_t len1, ind;  mp_limb_t cy, r30, r31;  mp_ptr tp;  mp_size_t a0n, a1n, a2n, a3n, sn, n1, n2, n3, n4, n5, n6, n7, n8, n9, rpn, t4;  len1 = n;  ASSERT (n >= 1);  MPN_NORMALIZE(up, len1);    sn = (n - 1) / 4 + 1;  /* a0 - a3 are defined in mpn_toom4_mul_n above */     TC4_NORM(a0, a0n, sn);	TC4_NORM(a1, a1n, sn);	TC4_NORM(a2, a2n, sn);	TC4_NORM(a3, a3n, n - 3*sn);    t4 = 2*sn+2; // allows mult of 2 integers of sn + 1 limbs   tp = __GMP_ALLOCATE_FUNC_LIMBS(4*t4 + 4*(sn + 1));   tc4_add_unsigned(u5, &n5, a3, a3n, a1, a1n);    tc4_add_unsigned(u4, &n4, a2, a2n, a0, a0n); 	tc4_add_unsigned(u2, &n2, u4, n4, u5, n5);    tc4_sub(u3, &n3, u4, n4, u5, n5);	SQR_TC4(r4, n4, u3, n3);   SQR_TC4_UNSIGNED(r3, n3, u2, n2);		tc4_lshift(r1, &n1, a0, a0n, 3);	tc4_addlsh1_unsigned(r1, &n1, a2, a2n); 	tc4_lshift(r2, &n8, a1, a1n, 2);   tc4_add(r2, &n8, r2, n8, a3, a3n);   tc4_add(u4, &n9, r1, n1, r2, n8);   tc4_sub(u5, &n5, r1, n1, r2, n8);   	r30 = r3[0];	if (!n3) r30 = CNST_LIMB(0);   r31 = r3[1];	SQR_TC4(r6, n6, u5, n5);   SQR_TC4_UNSIGNED(r5, n5, u4, n9);   r3[1] = r31;   tc4_lshift(u2, &n8, a3, a3n, 3);   tc4_addmul_1(u2, &n8, a2, a2n, 4);	tc4_addlsh1_unsigned(u2, &n8, a1, a1n);	tc4_add(u2, &n8, u2, n8, a0, a0n);   	SQR_TC4_UNSIGNED(r2, n2, u2, n8);   SQR_TC4_UNSIGNED(r1, n1, a3, a3n);   SQR_TC4_UNSIGNED(r7, n7, a0, a0n);	TC4_DENORM(r1, n1,  t4 - 1);   TC4_DENORM(r2, n2,  t4 - 1);   if (n3)     TC4_DENORM(r3, n3,  t4 - 1);   else {     /* MPN_ZERO defeats gcc 4.1.2 here, hence the explicit for loop */     for (ind = 1 ; ind < t4 - 1; ind++)        (r3)[ind] = CNST_LIMB(0);   }   TC4_DENORM(r4, n4,  t4 - 1);   TC4_DENORM(r5, n5,  t4 - 1);   TC4_DENORM(r6, n6,  t4 - 1);   TC4_DENORM(r7, n7,  t4 - 2); // we treat r7 differently (it cannot exceed t4-2 in length)/*	rp        rp1          rp2           rp3          rp4           rp5         rp6           rp7<----------- r7-----------><------------r5-------------->                                                                   <-------------r3------------->              <-------------r6------------->                        < -----------r2------------>{           }                                         <-------------r4-------------->         <--------------r1---->*/	mpn_toom4_interpolate(rp, &rpn, sn, tp, t4 - 1, n4, n6, r30);	if (rpn != 2*n) 	{		MPN_ZERO((rp + rpn), 2*n - rpn);	}   __GMP_FREE_FUNC_LIMBS (tp, 4*t4 + 4*(sn+1));}
开发者ID:BrianGladman,项目名称:mpir,代码行数:88,


示例26:

#include "mpir.h"#include "gmp-impl.h"#if GMP_NUMB_BITS == 32const struct bases mp_bases[257] ={  /*   0 */ { 0, 0.0, 0 },  /*   1 */ { 0, 1e37, 0 },  /*   2 */ { 32, 1.0000000000000000, 0x1 },  /*   3 */ { 20, 0.6309297535714574, CNST_LIMB(0xcfd41b91), CNST_LIMB(0x3b563c24) },  /*   4 */ { 16, 0.5000000000000000, 0x2 },  /*   5 */ { 13, 0.4306765580733931, CNST_LIMB(0x48c27395), CNST_LIMB(0xc25c2684) },  /*   6 */ { 12, 0.3868528072345416, CNST_LIMB(0x81bf1000), CNST_LIMB(0xf91bd1b6) },  /*   7 */ { 11, 0.3562071871080222, CNST_LIMB(0x75db9c97), CNST_LIMB(0x1607a2cb) },  /*   8 */ { 10, 0.3333333333333334, 0x3 },  /*   9 */ { 10, 0.3154648767857287, CNST_LIMB(0xcfd41b91), CNST_LIMB(0x3b563c24) },  /*  10 */ { 9, 0.3010299956639811, CNST_LIMB(0x3b9aca00), CNST_LIMB(0x12e0be82) },  /*  11 */ { 9, 0.2890648263178878, CNST_LIMB(0x8c8b6d2b), CNST_LIMB(0xd24cde04) },  /*  12 */ { 8, 0.2789429456511298, CNST_LIMB(0x19a10000), CNST_LIMB(0x3fa39ab5) },  /*  13 */ { 8, 0.2702381544273197, CNST_LIMB(0x309f1021), CNST_LIMB(0x50f8ac5f) },  /*  14 */ { 8, 0.2626495350371936, CNST_LIMB(0x57f6c100), CNST_LIMB(0x74843b1e) },  /*  15 */ { 8, 0.2559580248098155, CNST_LIMB(0x98c29b81), CNST_LIMB(0xad0326c2) },  /*  16 */ { 8, 0.2500000000000000, 0x4 },  /*  17 */ { 7, 0.2446505421182260, CNST_LIMB(0x18754571), CNST_LIMB(0x4ef0b6bd) },  /*  18 */ { 7, 0.2398124665681315, CNST_LIMB(0x247dbc80), CNST_LIMB(0xc0fc48a1) },  /*  19 */ { 7, 0.2354089133666382, CNST_LIMB(0x3547667b), CNST_LIMB(0x33838942) },  /*  20 */ { 7, 0.2313782131597592, CNST_LIMB(0x4c4b4000), CNST_LIMB(0xad7f29ab) },  /*  21 */ { 7, 0.2276702486969530, CNST_LIMB(0x6b5a6e1d), CNST_LIMB(0x313c3d15) },  /*  22 */ { 7, 0.2242438242175754, CNST_LIMB(0x94ace180), CNST_LIMB(0xb8cca9e0) },
开发者ID:BrianGladman,项目名称:mpir,代码行数:30,


示例27: p

/*   Toom 4 interpolation. Interpolates the value at 2^(sn*B) of a 	polynomial p(x) with 7 coefficients given the values 	p(oo), p(2), p(1), p(-1), 2^6*p(1/2), 2^6*p(-1/2), p(0).	The output is placed in rp and the final number of limbs of the	output is given in rpn.	The 4th and 6th values may be negative, and if so, n4 and n6 	should be set to a negative value respectively.   To save space we pass r3, r5, r7 in place in the output rp.	The other r's are stored separately in space tp.	The low limb of r3 is stored in r30, as it will be overwritten	by the high limb of r5.rp          rp1          rp2           rp3          rp4           rp5         rp6           rp7<----------- r7-----------><------------r5-------------->                                                                  <-------------r3------------->   We assume that r1 is stored at tp, r2 at (tp + t4), r4 at (tp + 2*t4) 	and r6 (tp + 3*t4). Each of these r's has t4 = s4 + 1 limbs allocated.*/void mpn_toom4_interpolate(mp_ptr rp, mp_size_t * rpn, mp_size_t sn,  		       mp_ptr tp, mp_size_t s4, mp_size_t n4, mp_size_t n6, mp_limb_t r30){	mp_size_t n1, n2, n3, n5, n7, t4;	mp_limb_t saved, saved2, cy;   t4 = s4 + 1;    	mpn_add_n(r2, r2, r5, s4);   if (n6 < 0) 		mpn_add_n(r6, r5, r6, s4);	else      mpn_sub_n(r6, r5, r6, s4);	/* r6 is now in twos complement format */	saved = r3[0];	r3[0] = r30;	if (n4 < 0) 		mpn_add_n(r4, r3, r4, s4);	else      mpn_sub_n(r4, r3, r4, s4);	r3[0] = saved;	/* r4 is now in twos complement format */		mpn_sub_n(r5, r5, r1, s4);#if HAVE_NATIVE_mpn_sublsh_n	r5[s4-1] -= mpn_sublsh_n(r5, r5, r7, s4-1, 6);#else	r5[s4-1] -= mpn_submul_1(r5, r7, s4-1, 64);#endif      TC4_RSHIFT1(r4, s4); 		saved = r3[0];	r3[0] = r30;	mpn_sub_n(r3, r3, r4, s4);	r30 = r3[0];	r3[0] = saved;	mpn_double(r5, s4); 	mpn_sub_n(r5, r5, r6, s4);   saved = r3[0];	r3[0] = r30;	mpn_submul_1(r2, r3, s4, 65);   r3[0] = saved;		saved2 = r7[s4-1];	r7[s4-1] = CNST_LIMB(0); // r7 is always positive so no sign extend needed	saved = r3[0];	r3[0] = r30;#if HAVE_NATIVE_mpn_subadd_n	mpn_subadd_n(r3, r3, r7, r1, s4);#else    mpn_sub_n(r3, r3, r7, s4);    mpn_sub_n(r3, r3, r1, s4);#endif	r7[s4-1] = saved2;   r30 = r3[0];	   mpn_addmul_1(r2, r3, s4, 45);#if HAVE_NATIVE_mpn_sublsh_n   cy = mpn_sublsh_n(r5, r5, r3, s4 - 1, 3);#else   cy = mpn_submul_1(r5, r3, s4 - 1, 8);#endif   r3[0] = saved;	r3[0] -= (cy + 8*r3[s4-1]);   	mpn_rshift(r5, r5, s4, 3); 	mpn_divexact_by3(r5, r5, s4);    	mpn_sub_n(r6, r6, r2, s4);#if HAVE_NATIVE_mpn_sublsh_n//.........这里部分代码省略.........
开发者ID:BrianGladman,项目名称:mpir,代码行数:101,


示例28: mpz_congruent_2exp_p

intmpz_congruent_2exp_p (mpz_srcptr a, mpz_srcptr c, mp_bitcnt_t d){  mp_size_t      i, dlimbs;  unsigned       dbits;  mp_ptr         ap, cp;  mp_limb_t      dmask, alimb, climb, sum;  mp_size_t      asize_signed, csize_signed, asize, csize;  if (ABSIZ(a) < ABSIZ(c))    MPZ_SRCPTR_SWAP (a, c);  dlimbs = d / GMP_NUMB_BITS;  dbits = d % GMP_NUMB_BITS;  dmask = (CNST_LIMB(1) << dbits) - 1;  ap = PTR(a);  cp = PTR(c);  asize_signed = SIZ(a);  asize = ABS(asize_signed);  csize_signed = SIZ(c);  csize = ABS(csize_signed);  if (csize_signed == 0)    goto a_zeros;  if ((asize_signed ^ csize_signed) >= 0)    {      /* same signs, direct comparison */      /* a==c for limbs in common */      if (mpn_cmp (ap, cp, MIN (csize, dlimbs)) != 0)        return 0;      /* if that's all of dlimbs, then a==c for remaining bits */      if (csize > dlimbs)        return ((ap[dlimbs]-cp[dlimbs]) & dmask) == 0;    a_zeros:      /* a remains, need all zero bits */      /* if d covers all of a and c, then must be exactly equal */      if (asize <= dlimbs)        return asize == csize;      /* whole limbs zero */      for (i = csize; i < dlimbs; i++)        if (ap[i] != 0)          return 0;      /* partial limb zero */      return (ap[dlimbs] & dmask) == 0;    }  else    {      /* different signs, negated comparison */      /* common low zero limbs, stopping at first non-zeros, which must         match twos complement */      i = 0;      for (;;)        {          ASSERT (i < csize);  /* always have a non-zero limb on c */          alimb = ap[i];          climb = cp[i];          sum = (alimb + climb) & GMP_NUMB_MASK;          if (i >= dlimbs)            return (sum & dmask) == 0;          i++;          /* require both zero, or first non-zeros as twos-complements */          if (sum != 0)            return 0;          if (alimb != 0)            break;        }      /* further limbs matching as ones-complement */      for (;;)        {          if (i >= csize)            break;          alimb = ap[i];          climb = cp[i];          sum = (alimb + climb + 1) & GMP_NUMB_MASK;          if (i >= dlimbs)            return (sum & dmask) == 0;          if (sum != 0)            return 0;          i++;        }//.........这里部分代码省略.........
开发者ID:119,项目名称:aircam-openwrt,代码行数:101,


示例29: mpn_toom_eval_pm2exp

/* Evaluates a polynomial of degree k > 2, in the points +2^shift and -2^shift. */intmpn_toom_eval_pm2exp (mp_ptr xp2, mp_ptr xm2, unsigned k,		      mp_srcptr xp, mp_size_t n, mp_size_t hn, unsigned shift,		      mp_ptr tp){  unsigned i;  int neg;#ifdef HAVE_NATIVE_mpn_addlsh_n  mp_limb_t cy;#endif  ASSERT (k >= 3);  ASSERT (shift*k < GMP_NUMB_BITS);  ASSERT (hn > 0);  ASSERT (hn <= n);  /* The degree k is also the number of full-size coefficients, so   * that last coefficient, of size hn, starts at xp + k*n. */#ifdef HAVE_NATIVE_mpn_addlsh_n  xp2[n] = mpn_addlsh_n (xp2, xp, xp + 2*n, n, 2*shift);  for (i = 4; i < k; i += 2)    xp2[n] += mpn_addlsh_n (xp2, xp2, xp + i*n, n, i*shift);  tp[n] = mpn_lshift (tp, xp+n, n, shift);  for (i = 3; i < k; i+= 2)    tp[n] += mpn_addlsh_n (tp, tp, xp+i*n, n, i*shift);  if (k & 1)    {      cy = mpn_addlsh_n (tp, tp, xp+k*n, hn, k*shift);      MPN_INCR_U (tp + hn, n+1 - hn, cy);    }  else    {      cy = mpn_addlsh_n (xp2, xp2, xp+k*n, hn, k*shift);      MPN_INCR_U (xp2 + hn, n+1 - hn, cy);    }#else /* !HAVE_NATIVE_mpn_addlsh_n */  xp2[n] = mpn_lshift (tp, xp+2*n, n, 2*shift);  xp2[n] += mpn_add_n (xp2, xp, tp, n);  for (i = 4; i < k; i += 2)    {      xp2[n] += mpn_lshift (tp, xp + ((mp_size_t) i)*n, n, i*shift);      xp2[n] += mpn_add_n (xp2, xp2, tp, n);    }  tp[n] = mpn_lshift (tp, xp+n, n, shift);  for (i = 3; i < k; i+= 2)    {      tp[n] += mpn_lshift (xm2, xp + ((mp_size_t) i)*n, n, i*shift);      tp[n] += mpn_add_n (tp, tp, xm2, n);    }  xm2[hn] = mpn_lshift (xm2, xp + ((mp_size_t) k)*n, hn, k*shift);  if (k & 1)    mpn_add (tp, tp, n+1, xm2, hn+1);  else    mpn_add (xp2, xp2, n+1, xm2, hn+1);#endif /* !HAVE_NATIVE_mpn_addlsh_n */  neg = (mpn_cmp (xp2, tp, n + 1) < 0) ? ~0 : 0;#ifdef HAVE_NATIVE_mpn_add_n_sub_n  if (neg)    mpn_add_n_sub_n (xp2, xm2, tp, xp2, n + 1);  else    mpn_add_n_sub_n (xp2, xm2, xp2, tp, n + 1);#else /* !HAVE_NATIVE_mpn_add_n_sub_n */  if (neg)    mpn_sub_n (xm2, tp, xp2, n + 1);  else    mpn_sub_n (xm2, xp2, tp, n + 1);  mpn_add_n (xp2, xp2, tp, n + 1);#endif /* !HAVE_NATIVE_mpn_add_n_sub_n */  /* FIXME: the following asserts are useless if (k+1)*shift >= GMP_LIMB_BITS */  ASSERT ((k+1)*shift >= GMP_LIMB_BITS ||	  xp2[n] < ((CNST_LIMB(1)<<((k+1)*shift))-1)/((CNST_LIMB(1)<<shift)-1));  ASSERT ((k+2)*shift >= GMP_LIMB_BITS ||	  xm2[n] < ((CNST_LIMB(1)<<((k+2)*shift))-((k&1)?(CNST_LIMB(1)<<shift):1))/((CNST_LIMB(1)<<(2*shift))-1));  return neg;}
开发者ID:1984c,项目名称:trampoline,代码行数:88,


示例30: check_functions

voidcheck_functions (void){  mp_limb_t  wp[2], wp2[2], xp[2], yp[2], r;  int  i;  memcpy (&__gmpn_cpuvec, &initial_cpuvec, sizeof (__gmpn_cpuvec));  for (i = 0; i < 2; i++)    {      xp[0] = 123;      yp[0] = 456;      mpn_add_n (wp, xp, yp, (mp_size_t) 1);      ASSERT_ALWAYS (wp[0] == 579);    }  memcpy (&__gmpn_cpuvec, &initial_cpuvec, sizeof (__gmpn_cpuvec));  for (i = 0; i < 2; i++)    {      xp[0] = 123;      wp[0] = 456;      r = mpn_addmul_1 (wp, xp, (mp_size_t) 1, CNST_LIMB(2));      ASSERT_ALWAYS (wp[0] == 702);      ASSERT_ALWAYS (r == 0);    }#if HAVE_NATIVE_mpn_copyd  memcpy (&__gmpn_cpuvec, &initial_cpuvec, sizeof (__gmpn_cpuvec));  for (i = 0; i < 2; i++)    {      xp[0] = 123;      xp[1] = 456;      mpn_copyd (xp+1, xp, (mp_size_t) 1);      ASSERT_ALWAYS (xp[1] == 123);    }#endif#if HAVE_NATIVE_mpn_copyi  memcpy (&__gmpn_cpuvec, &initial_cpuvec, sizeof (__gmpn_cpuvec));  for (i = 0; i < 2; i++)    {      xp[0] = 123;      xp[1] = 456;      mpn_copyi (xp, xp+1, (mp_size_t) 1);      ASSERT_ALWAYS (xp[0] == 456);    }#endif  memcpy (&__gmpn_cpuvec, &initial_cpuvec, sizeof (__gmpn_cpuvec));  for (i = 0; i < 2; i++)    {      xp[0] = 1605;      mpn_divexact_1 (wp, xp, (mp_size_t) 1, CNST_LIMB(5));      ASSERT_ALWAYS (wp[0] == 321);    }  memcpy (&__gmpn_cpuvec, &initial_cpuvec, sizeof (__gmpn_cpuvec));  for (i = 0; i < 2; i++)    {      xp[0] = 1296;      r = mpn_divexact_by3c (wp, xp, (mp_size_t) 1, CNST_LIMB(0));      ASSERT_ALWAYS (wp[0] == 432);      ASSERT_ALWAYS (r == 0);    }  memcpy (&__gmpn_cpuvec, &initial_cpuvec, sizeof (__gmpn_cpuvec));  for (i = 0; i < 2; i++)    {      xp[0] = 578;      r = mpn_divexact_byfobm1 (wp, xp, (mp_size_t) 1, CNST_LIMB(17),CNST_LIMB(-1)/CNST_LIMB(17));      ASSERT_ALWAYS (wp[0] == 34);      ASSERT_ALWAYS (r == 0);    }  memcpy (&__gmpn_cpuvec, &initial_cpuvec, sizeof (__gmpn_cpuvec));  for (i = 0; i < 2; i++)    {      xp[0] = 287;      r = mpn_divrem_1 (wp, (mp_size_t) 1, xp, (mp_size_t) 1, CNST_LIMB(7));      ASSERT_ALWAYS (wp[1] == 41);      ASSERT_ALWAYS (wp[0] == 0);      ASSERT_ALWAYS (r == 0);    }  memcpy (&__gmpn_cpuvec, &initial_cpuvec, sizeof (__gmpn_cpuvec));  for (i = 0; i < 2; i++)    {      xp[0] = 290;      r = mpn_divrem_euclidean_qr_1 (wp, 0, xp, (mp_size_t) 1, CNST_LIMB(7));      ASSERT_ALWAYS (wp[0] == 41);      ASSERT_ALWAYS (r == 3);    }  memcpy (&__gmpn_cpuvec, &initial_cpuvec, sizeof (__gmpn_cpuvec));  for (i = 0; i < 2; i++)    {      xp[0] = 12;      r = mpn_gcd_1 (xp, (mp_size_t) 1, CNST_LIMB(9));      ASSERT_ALWAYS (r == 3);    }//.........这里部分代码省略.........
开发者ID:coapp-packages,项目名称:mpir,代码行数:101,



注:本文中的CNST_LIMB函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ CNetAddr函数代码示例
C++ CNMRException函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。