⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g_lip.c

📁 密码大家Shoup写的数论算法c语言实现
💻 C
📖 第 1 页 / 共 5 页
字号:
	res = 0;	for (i = 0; i < sa; i++)		res += gweights_mp_limb(adata[i]);	return (res);}long _ntl_g2logs(	long aa	){	long i = 0;	unsigned long a;	if (aa < 0)		a = - ((unsigned long) aa);	else		a = aa;	while (a>=256)		i += 8, a >>= 8;	if (a >=16)		i += 4, a >>= 4;	if (a >= 4)		i += 2, a >>= 2;	if (a >= 2)		i += 2;	else if (a >= 1)		i++;	return (i);}long _ntl_g2log(_ntl_gbigint a){   long la;   long t;   if (!a) return 0;   la = SIZE(a);   if (la == 0) return 0;   if (la < 0) la = -la;   COUNT_BITS(t, DATA(a)[la-1]);   return NTL_ZZ_NBITS*(la - 1) + t;}long _ntl_gmakeodd(_ntl_gbigint *nn){   _ntl_gbigint n = *nn;   long shift;   mp_limb_t *ndata;   mp_limb_t i;   if (ZEROP(n))      return (0);   shift = 0;   ndata = DATA(n);   while (ndata[shift] == 0)      shift++;   i = ndata[shift];   shift = NTL_ZZ_NBITS * shift;   while ((i & 1) == 0) {      shift++;      i >>= 1;   }   _ntl_grshift(n, shift, &n);   return shift;}long _ntl_gnumtwos(_ntl_gbigint n){   long shift;   mp_limb_t *ndata;   mp_limb_t i;   if (ZEROP(n))      return (0);   shift = 0;   ndata = DATA(n);   while (ndata[shift] == 0)      shift++;   i = ndata[shift];   shift = NTL_ZZ_NBITS * shift;   while ((i & 1) == 0) {      shift++;      i >>= 1;   }   return shift;}void _ntl_gand(_ntl_gbigint a, _ntl_gbigint b, _ntl_gbigint *cc){   _ntl_gbigint c = *cc;   long sa;   long sb;   long sm;   long i;   mp_limb_t *adata, *bdata, *cdata;   if (ZEROP(a) || ZEROP(b)) {      _ntl_gzero(cc);      return;   }   sa = SIZE(a);   if (sa < 0) sa = -sa;   sb = SIZE(b);   if (sb < 0) sb = -sb;   sm = (sa > sb ? sb : sa);   _ntl_gsetlength(&c, sm);   if (a == *cc) a = c;   if (b == *cc) b = c;   *cc = c;   adata = DATA(a);   bdata = DATA(b);   cdata = DATA(c);   for (i = 0; i < sm; i++)      cdata[i] = adata[i] & bdata[i];   STRIP(sm, cdata);   SIZE(c) = sm;}void _ntl_gxor(_ntl_gbigint a, _ntl_gbigint b, _ntl_gbigint *cc){   _ntl_gbigint c = *cc;   long sa;   long sb;   long sm;   long la;   long i;   mp_limb_t *adata, *bdata, *cdata;   if (ZEROP(a)) {      _ntl_gcopy(b,cc);      _ntl_gabs(cc);      return;   }   if (ZEROP(b)) {      _ntl_gcopy(a,cc);      _ntl_gabs(cc);      return;   }   sa = SIZE(a);   if (sa < 0) sa = -sa;   sb = SIZE(b);   if (sb < 0) sb = -sb;   if (sa > sb) {      la = sa;      sm = sb;   }    else {      la = sb;      sm = sa;   }   _ntl_gsetlength(&c, la);   if (a == *cc) a = c;   if (b == *cc) b = c;   *cc = c;   adata = DATA(a);   bdata = DATA(b);   cdata = DATA(c);   for (i = 0; i < sm; i ++)      cdata[i] = adata[i] ^ bdata[i];   if (sa > sb)      for (;i < la; i++) cdata[i] = adata[i];   else      for (;i < la; i++) cdata[i] = bdata[i];   STRIP(la, cdata);   SIZE(c) = la;}void _ntl_gor(_ntl_gbigint a, _ntl_gbigint b, _ntl_gbigint *cc){   _ntl_gbigint c = *cc;   long sa;   long sb;   long sm;   long la;   long i;   mp_limb_t *adata, *bdata, *cdata;   if (ZEROP(a)) {      _ntl_gcopy(b,cc);      _ntl_gabs(cc);      return;   }   if (ZEROP(b)) {      _ntl_gcopy(a,cc);      _ntl_gabs(cc);      return;   }   sa = SIZE(a);   if (sa < 0) sa = -sa;   sb = SIZE(b);   if (sb < 0) sb = -sb;   if (sa > sb) {      la = sa;      sm = sb;   }    else {      la = sb;      sm = sa;   }   _ntl_gsetlength(&c, la);   if (a == *cc) a = c;   if (b == *cc) b = c;   *cc = c;   adata = DATA(a);   bdata = DATA(b);   cdata = DATA(c);   for (i = 0; i < sm; i ++)      cdata[i] = adata[i] | bdata[i];   if (sa > sb)      for (;i < la; i++) cdata[i] = adata[i];   else      for (;i < la; i++) cdata[i] = bdata[i];   STRIP(la, cdata);   SIZE(c) = la;}void _ntl_gnegate(_ntl_gbigint *aa){   _ntl_gbigint a = *aa;   if (a) SIZE(a) = -SIZE(a);}void _ntl_gintoz(long d, _ntl_gbigint *aa){   _ntl_gbigint a = *aa;   if (d == 0) {      if (a) SIZE(a) = 0;   }   else if (d > 0) {      if (!a) {         _ntl_gsetlength(&a, 1);         *aa = a;      }         SIZE(a) = 1;      DATA(a)[0] = d;   }   else {      if (!a) {         _ntl_gsetlength(&a, 1);         *aa = a;      }         SIZE(a) = -1;      DATA(a)[0] = -((mp_limb_t) d); /* careful! */   }}void _ntl_guintoz(unsigned long d, _ntl_gbigint *aa){   _ntl_gbigint a = *aa;   if (d == 0) {      if (a) SIZE(a) = 0;   }   else {      if (!a) {         _ntl_gsetlength(&a, 1);         *aa = a;      }         SIZE(a) = 1;      DATA(a)[0] = d;   }}long _ntl_gtoint(_ntl_gbigint a){   if (ZEROP(a))       return 0;   if (SIZE(a) > 0)       return DATA(a)[0];   return -DATA(a)[0];}unsigned long _ntl_gtouint(_ntl_gbigint a){   if (ZEROP(a))       return 0;   if (SIZE(a) > 0)       return DATA(a)[0];   return -DATA(a)[0];}long _ntl_gcompare(_ntl_gbigint a, _ntl_gbigint b){   long sa, sb, cmp;   mp_limb_t *adata, *bdata;   if (!a)       sa = 0;   else      sa = SIZE(a);   if (!b)       sb = 0;   else      sb = SIZE(b);   if (sa != sb) {      if (sa > sb)         return 1;      else         return -1;   }   if (sa == 0)      return 0;   adata = DATA(a);   bdata = DATA(b);   if (sa > 0) {      cmp = mpn_cmp(adata, bdata, sa);      if (cmp > 0)         return 1;      else if (cmp < 0)          return -1;      else         return 0;   }   else {      cmp = mpn_cmp(adata, bdata, -sa);      if (cmp > 0)         return -1;      else if (cmp < 0)          return 1;      else         return 0;   }}long _ntl_gsign(_ntl_gbigint a){   long sa;   if (!a) return 0;   sa = SIZE(a);   if (sa > 0) return 1;   if (sa == 0) return 0;   return -1;}void _ntl_gabs(_ntl_gbigint *pa){   _ntl_gbigint a = *pa;   if (!a) return;   if (SIZE(a) < 0) SIZE(a) = -SIZE(a);}long _ntl_gscompare(_ntl_gbigint a, long b){   if (b == 0) {      long sa;      if (!a) return 0;      sa = SIZE(a);      if (sa > 0) return 1;      if (sa == 0) return 0;      return -1;   }   else {      static _ntl_gbigint B = 0;      _ntl_gintoz(b, &B);      return _ntl_gcompare(a, B);   }}void _ntl_glshift(_ntl_gbigint n, long k, _ntl_gbigint *rres){   _ntl_gbigint res;   mp_limb_t *ndata, *resdata, *resdata1;   long limb_cnt, i, sn, nneg, sres;   if (ZEROP(n)) {      _ntl_gzero(rres);      return;   }   if (!k) {      if (n != *rres)         _ntl_gcopy(n, rres);      return;   }   if (k < 0) {      if (k < -NTL_MAX_LONG) ghalt("overflow in _ntl_glshift");      _ntl_grshift(n, -k, rres);      return;   }   GET_SIZE_NEG(sn, nneg, n);   limb_cnt = k/NTL_ZZ_NBITS;   sres = sn + limb_cnt + 1;    res = *rres;   if (MustAlloc(res, sres)) {      _ntl_gsetlength(&res, sres);      if (n == *rres) n = res;      *rres = res;   }   ndata = DATA(n);   resdata = DATA(res);   resdata1 = resdata + limb_cnt;   k %= NTL_ZZ_NBITS;   sres--;   if (k != 0) {      mp_limb_t t = mpn_lshift(resdata1, ndata, sn, k);      if (t != 0) {         resdata[sres] = t;         sres++;      }   }   else {      for (i = sn-1; i >= 0; i--)         resdata1[i] = ndata[i];   }   for (i = 0; i < limb_cnt; i++)      resdata[i] = 0;   if (nneg) sres = -sres;   SIZE(res) = sres;}void _ntl_grshift(_ntl_gbigint n, long k, _ntl_gbigint *rres){   _ntl_gbigint res;   mp_limb_t *ndata, *resdata, *ndata1;   long limb_cnt, i, sn, nneg, sres;   if (ZEROP(n)) {      _ntl_gzero(rres);      return;   }   if (!k) {      if (n != *rres)         _ntl_gcopy(n, rres);      return;   }   if (k < 0) {      if (k < -NTL_MAX_LONG) ghalt("overflow in _ntl_glshift");      _ntl_glshift(n, -k, rres);      return;   }   GET_SIZE_NEG(sn, nneg, n);   limb_cnt = k/NTL_ZZ_NBITS;   sres = sn - limb_cnt;   if (sres <= 0) {      _ntl_gzero(rres);      return;   }   res = *rres;   if (MustAlloc(res, sres)) {      _ntl_gsetlength(&res, sres);      if (n == *rres) n = res;      *rres = res;   }   ndata = DATA(n);   resdata = DATA(res);   ndata1 = ndata + limb_cnt;   k %= NTL_ZZ_NBITS;   if (k != 0) {      mpn_rshift(resdata, ndata1, sres, k);      if (resdata[sres-1] == 0)         sres--;   }   else {      for (i = 0; i < sres; i++)         resdata[i] = ndata1[i];   }   if (nneg) sres = -sres;   SIZE(res) = sres;}      void_ntl_gadd(_ntl_gbigint a, _ntl_gbigint b, _ntl_gbigint *cc){   long sa, aneg, sb, bneg, sc, cmp;   mp_limb_t *adata, *bdata, *cdata, carry;   _ntl_gbigint c;   if (ZEROP(a)) {      _ntl_gcopy(b, cc);      return;   }   if (ZEROP(b)) {      _ntl_gcopy(a, cc);      return;   }   GET_SIZE_NEG(sa, aneg, a);   GET_SIZE_NEG(sb, bneg, b);   if (sa < sb) {      SWAP_BIGINT(a, b);      SWAP_LONG(sa, sb);      SWAP_LONG(aneg, bneg);   }   /* sa >= sb */   c = *cc;   if (aneg == bneg) {      /* same sign => addition */      sc = sa + 1;      if (MustAlloc(c, sc)) {         _ntl_gsetlength(&c, sc);         if (a == *cc) a = c;          if (b == *cc) b = c;         *cc = c;      }      adata = DATA(a);      bdata = DATA(b);      cdata = DATA(c);      carry = mpn_add(cdata, adata, sa, bdata, sb);      if (carry)          cdata[sc-1] = carry;      else         sc--;      if (aneg) sc = -sc;      SIZE(c) = sc;   }   else {      /* opposite sign => subtraction */      sc = sa;      if (MustAlloc(c, sc)) {         _ntl_gsetlength(&c, sc);         if (a == *cc) a = c;          if (b == *cc) b = c;         *cc = c;      }      adata = DATA(a);      bdata = DATA(b);      cdata = DATA(c);      if (sa > sb)          cmp = 1;      else         cmp = mpn_cmp(adata, bdata, sa);      if (cmp == 0) {         SIZE(c) = 0;      }      else {         if (cmp < 0) cmp = 0;         if (cmp > 0) cmp = 1;         /* abs(a) != abs(b) && (abs(a) > abs(b) <=> cmp) */         if (cmp)            mpn_sub(cdata, adata, sa, bdata, sb);         else            mpn_sub(cdata, bdata, sb, adata, sa); /* sa == sb */         STRIP(sc, cdata);         if (aneg == cmp) sc = -sc;         SIZE(c) = sc;      }   }}void_ntl_gsadd(_ntl_gbigint a, long b, _ntl_gbigint *cc){   static _ntl_gbigint B = 0;   _ntl_gintoz(b, &B);   _ntl_gadd(a, B, cc);}void_ntl_gsub(_ntl_gbigint a, _ntl_gbigint b, _ntl_gbigint *cc){   long sa, aneg, sb, bneg, sc, cmp, rev;   mp_limb_t *adata, *bdata, *cdata, carry;   _ntl_gbigint c;   if (ZEROP(a)) {      _ntl_gcopy(b, cc);      c = *cc;      if (c) SIZE(c) = -SIZE(c);       return;   }   if (ZEROP(b)) {      _ntl_gcopy(a, cc);      return;   }   GET_SIZE_NEG(sa, aneg, a);   GET_SIZE_NEG(sb, bneg, b);   if (sa < sb) {      SWAP_BIGINT(a, b);      SWAP_LONG(sa, sb);      SWAP_LONG(aneg, bneg);      rev = 1;   }   else       rev = 0;   /* sa >= sb */   c = *cc;   if (aneg != bneg) {      /* opposite sign => addition */      sc = sa + 1;      if (MustAlloc(c, sc)) {         _ntl_gsetlength(&c, sc);         if (a == *cc) a = c;          if (b == *cc) b = c;         *cc = c;      }      adata = DATA(a);      bdata = DATA(b);      cdata = DATA(c);      carry = mpn_add(cdata, adata, sa, bdata, sb);      if (carry)          cdata[sc-1] = carry;      else         sc--;      if (aneg ^ rev) sc = -sc;      SIZE(c) = sc;   }   else {      /* same sign => subtraction */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -