亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? gf2ex.cpp

?? 一個比較通用的大數(shù)運算庫
?? CPP
?? 第 1 頁 / 共 5 頁
字號:


#include <NTL/GF2EX.h>
#include <NTL/vec_vec_GF2.h>

#include <NTL/new.h>

NTL_START_IMPL



const GF2EX& GF2EX::zero()
{
   static GF2EX z;
   return z;
}



istream& operator>>(istream& s, GF2EX& x)
{
   s >> x.rep;
   x.normalize();
   return s;
}

ostream& operator<<(ostream& s, const GF2EX& a)
{
   return s << a.rep;
}


void GF2EX::normalize()
{
   long n;
   const GF2E* p;

   n = rep.length();
   if (n == 0) return;
   p = rep.elts() + n;
   while (n > 0 && IsZero(*--p)) {
      n--;
   }
   rep.SetLength(n);
}


long IsZero(const GF2EX& a)
{
   return a.rep.length() == 0;
}


long IsOne(const GF2EX& a)
{
    return a.rep.length() == 1 && IsOne(a.rep[0]);
}

void GetCoeff(GF2E& x, const GF2EX& a, long i)
{
   if (i < 0 || i > deg(a))
      clear(x);
   else
      x = a.rep[i];
}

void SetCoeff(GF2EX& x, long i, const GF2E& a)
{
   long j, m;

   if (i < 0) 
      Error("SetCoeff: negative index");

   if (NTL_OVERFLOW(i, 1, 0))
      Error("overflow in SetCoeff");

   m = deg(x);

   if (i > m) {
      /* careful: a may alias a coefficient of x */

      long alloc = x.rep.allocated();

      if (alloc > 0 && i >= alloc) {
         GF2E aa = a;
         x.rep.SetLength(i+1);
         x.rep[i] = aa;
      }
      else {
         x.rep.SetLength(i+1);
         x.rep[i] = a;
      }

      for (j = m+1; j < i; j++)
         clear(x.rep[j]);
   }
   else
      x.rep[i] = a;

   x.normalize();
}

void SetCoeff(GF2EX& x, long i, GF2 a)
{
   if (i < 0)
      Error("SetCoeff: negative index");

   if (a == 1)
      SetCoeff(x, i);
   else
      SetCoeff(x, i, GF2E::zero());
}

void SetCoeff(GF2EX& x, long i, long a)
{
   if (i < 0)
      Error("SetCoeff: negative index");

   if ((a & 1) == 1)
      SetCoeff(x, i);
   else
      SetCoeff(x, i, GF2E::zero());
}

void SetCoeff(GF2EX& x, long i)
{
   long j, m;

   if (i < 0) 
      Error("coefficient index out of range");

   if (NTL_OVERFLOW(i, 1, 0))
      Error("overflow in SetCoeff");

   m = deg(x);

   if (i > m) {
      x.rep.SetLength(i+1);
      for (j = m+1; j < i; j++)
         clear(x.rep[j]);
   }
   set(x.rep[i]);
   x.normalize();
}


void SetX(GF2EX& x)
{
   clear(x);
   SetCoeff(x, 1);
}


long IsX(const GF2EX& a)
{
   return deg(a) == 1 && IsOne(LeadCoeff(a)) && IsZero(ConstTerm(a));
}
      
      

const GF2E& coeff(const GF2EX& a, long i)
{
   if (i < 0 || i > deg(a))
      return GF2E::zero();
   else
      return a.rep[i];
}


const GF2E& LeadCoeff(const GF2EX& a)
{
   if (IsZero(a))
      return GF2E::zero();
   else
      return a.rep[deg(a)];
}

const GF2E& ConstTerm(const GF2EX& a)
{
   if (IsZero(a))
      return GF2E::zero();
   else
      return a.rep[0];
}



void conv(GF2EX& x, const GF2E& a)
{
   if (IsZero(a))
      x.rep.SetLength(0);
   else {
      x.rep.SetLength(1);
      x.rep[0] = a;
   }
}

void conv(GF2EX& x, long a)
{
   if (a & 1)
      set(x);
   else
      clear(x);
}

void conv(GF2EX& x, GF2 a)
{
   if (a == 1)
      set(x);
   else
      clear(x);
}

void conv(GF2EX& x, const ZZ& a)
{
   if (IsOdd(a))
      set(x);
   else
      clear(x);
}

void conv(GF2EX& x, const GF2X& aa)
{
   GF2X a = aa; // in case a aliases the rep of a coefficient of x
   
   long n = deg(a)+1;
   long i;

   x.rep.SetLength(n);
   for (i = 0; i < n; i++)
      conv(x.rep[i], coeff(a, i));
}

void conv(GF2EX& x, const vec_GF2E& a)
{
   x.rep = a;
   x.normalize();
}


void add(GF2EX& x, const GF2EX& a, const GF2EX& b)
{
   long da = deg(a);
   long db = deg(b);
   long minab = min(da, db);
   long maxab = max(da, db);
   x.rep.SetLength(maxab+1);

   long i;
   const GF2E *ap, *bp; 
   GF2E* xp;

   for (i = minab+1, ap = a.rep.elts(), bp = b.rep.elts(), xp = x.rep.elts();
        i; i--, ap++, bp++, xp++)
      add(*xp, (*ap), (*bp));

   if (da > minab && &x != &a)
      for (i = da-minab; i; i--, xp++, ap++)
         *xp = *ap;
   else if (db > minab && &x != &b)
      for (i = db-minab; i; i--, xp++, bp++)
         *xp = *bp;
   else
      x.normalize();
}

void add(GF2EX& x, const GF2EX& a, const GF2E& b)
{
   long n = a.rep.length();
   if (n == 0) {
      conv(x, b);
   }
   else if (&x == &a) {
      add(x.rep[0], a.rep[0], b);
      x.normalize();
   }
   else if (x.rep.MaxLength() == 0) {
      x = a;
      add(x.rep[0], a.rep[0], b);
      x.normalize();
   }
   else {
      // ugly...b could alias a coeff of x

      GF2E *xp = x.rep.elts();
      add(xp[0], a.rep[0], b);
      x.rep.SetLength(n);
      xp = x.rep.elts();
      const GF2E *ap = a.rep.elts();
      long i;
      for (i = 1; i < n; i++)
         xp[i] = ap[i];
      x.normalize();
   }
}

void add(GF2EX& x, const GF2EX& a, GF2 b)
{
   if (a.rep.length() == 0) {
      conv(x, b);
   }
   else {
      if (&x != &a) x = a;
      add(x.rep[0], x.rep[0], b);
      x.normalize();
   }
}

void add(GF2EX& x, const GF2EX& a, long b)
{
   if (a.rep.length() == 0) {
      conv(x, b);
   }
   else {
      if (&x != &a) x = a;
      add(x.rep[0], x.rep[0], b);
      x.normalize();
   }
}


void PlainMul(GF2EX& x, const GF2EX& a, const GF2EX& b)
{
   long da = deg(a);
   long db = deg(b);

   if (da < 0 || db < 0) {
      clear(x);
      return;
   }

   if (&a == &b) {
      sqr(x, a);
      return;
   }

   long d = da+db;

   const GF2E *ap, *bp;
   GF2E *xp;
   
   GF2EX la, lb;

   if (&x == &a) {
      la = a;
      ap = la.rep.elts();
   }
   else
      ap = a.rep.elts();

   if (&x == &b) {
      lb = b;
      bp = lb.rep.elts();
   }
   else
      bp = b.rep.elts();

   x.rep.SetLength(d+1);

   xp = x.rep.elts();

   long i, j, jmin, jmax;
   GF2X t, accum;

   for (i = 0; i <= d; i++) {
      jmin = max(0, i-db);
      jmax = min(da, i);
      clear(accum);
      for (j = jmin; j <= jmax; j++) {
	 mul(t, rep(ap[j]), rep(bp[i-j]));
	 add(accum, accum, t);
      }
      conv(xp[i], accum);
   }
   x.normalize();
}


void sqr(GF2EX& x, const GF2EX& a)
{
   long da = deg(a);

   if (da < 0) {
      clear(x);
      return;
   }

   x.rep.SetLength(2*da+1);
   long i;

   for (i = da; i > 0; i--) {
      sqr(x.rep[2*i], a.rep[i]);
      clear(x.rep[2*i-1]);
   }

   sqr(x.rep[0], a.rep[0]);

   x.normalize();
}



static 
void PlainMul1(GF2X *xp, const GF2X *ap, long sa, const GF2X& b)
{
   long i;

   for (i = 0; i < sa; i++)
      mul(xp[i], ap[i], b);
}




static inline
void q_add(GF2X& x, const GF2X& a, const GF2X& b)

// This is a quick-and-dirty add rotine used by the karatsuba routine.
// It assumes that the output already has enough space allocated,
// thus avoiding any procedure calls.
// WARNING: it also accesses the underlying WordVector representation
// directly...that is dirty!.
// It shaves a few percent off the running time.

{
   _ntl_ulong *xp = x.xrep.elts();
   const _ntl_ulong *ap = a.xrep.elts();
   const _ntl_ulong *bp = b.xrep.elts();

   long sa = ap[-1];
   long sb = bp[-1];

   long i;

   if (sa == sb) {
      for (i = 0; i < sa; i++)
         xp[i] = ap[i] ^ bp[i];

      i = sa-1;
      while (i >= 0 && !xp[i]) i--;
      xp[-1] = i+1;
   }
   else if (sa < sb) {
      for (i = 0; i < sa; i++)
         xp[i] = ap[i] ^ bp[i];

      for (; i < sb; i++)
         xp[i] = bp[i];

      xp[-1] = sb;
   }
   else { // sa > sb
      for (i = 0; i < sb; i++)
         xp[i] = ap[i] ^ bp[i];

      for (; i < sa; i++)
         xp[i] = ap[i];

      xp[-1] = sa;
   }
}


static inline
void q_copy(GF2X& x, const GF2X& a)
// see comments for q_add above

{
   _ntl_ulong *xp = x.xrep.elts();
   const _ntl_ulong *ap = a.xrep.elts();

   long sa = ap[-1];
   long i;

   for (i = 0; i < sa; i++)
      xp[i] = ap[i];

   xp[-1] = sa;
}



static
void KarFold(GF2X *T, const GF2X *b, long sb, long hsa)
{
   long m = sb - hsa;
   long i;

   for (i = 0; i < m; i++)
      q_add(T[i], b[i], b[hsa+i]);

   for (i = m; i < hsa; i++)
      q_copy(T[i], b[i]);
}


static
void KarAdd(GF2X *T, const GF2X *b, long sb)
{
   long i;

   for (i = 0; i < sb; i++)
      q_add(T[i], T[i], b[i]);
}

static
void KarFix(GF2X *c, const GF2X *b, long sb, long hsa)
{
   long i;

   for (i = 0; i < hsa; i++)
      q_copy(c[i], b[i]);

   for (i = hsa; i < sb; i++)
      q_add(c[i], c[i], b[i]);
}



static
void KarMul(GF2X *c, const GF2X *a, 
            long sa, const GF2X *b, long sb, GF2X *stk)
{
   if (sa < sb) {
      { long t = sa; sa = sb; sb = t; }
      { const GF2X *t = a; a = b; b = t; }
   }

   if (sb == 1) {  
      if (sa == 1) 
         mul(*c, *a, *b);
      else
         PlainMul1(c, a, sa, *b);

      return;
   }

   if (sb == 2 && sa == 2) {
      mul(c[0], a[0], b[0]);
      mul(c[2], a[1], b[1]);
      q_add(stk[0], a[0], a[1]);
      q_add(stk[1], b[0], b[1]);
      mul(c[1], stk[0], stk[1]);
      q_add(c[1], c[1], c[0]);
      q_add(c[1], c[1], c[2]);
      
      return;
   }

   long hsa = (sa + 1) >> 1;

   if (hsa < sb) {
      /* normal case */

      long hsa2 = hsa << 1;

      GF2X *T1, *T2, *T3;

      T1 = stk; stk += hsa;
      T2 = stk; stk += hsa;
      T3 = stk; stk += hsa2 - 1;

      /* compute T1 = a_lo + a_hi */

      KarFold(T1, a, sa, hsa);

      /* compute T2 = b_lo + b_hi */

      KarFold(T2, b, sb, hsa);

      /* recursively compute T3 = T1 * T2 */

      KarMul(T3, T1, hsa, T2, hsa, stk);

      /* recursively compute a_hi * b_hi into high part of c */
      /* and subtract from T3 */

      KarMul(c + hsa2, a+hsa, sa-hsa, b+hsa, sb-hsa, stk);
      KarAdd(T3, c + hsa2, sa + sb - hsa2 - 1);


      /* recursively compute a_lo*b_lo into low part of c */
      /* and subtract from T3 */

      KarMul(c, a, hsa, b, hsa, stk);
      KarAdd(T3, c, hsa2 - 1);

      clear(c[hsa2 - 1]);

      /* finally, add T3 * X^{hsa} to c */

      KarAdd(c+hsa, T3, hsa2-1);
   }
   else {
      /* degenerate case */

      GF2X *T;

      T = stk; stk += hsa + sb - 1;

      /* recursively compute b*a_hi into high part of c */

      KarMul(c + hsa, a + hsa, sa - hsa, b, sb, stk);

      /* recursively compute b*a_lo into T */

      KarMul(T, a, hsa, b, sb, stk);

      KarFix(c, T, hsa + sb - 1, hsa);
   }
}

void ExtractBits(_ntl_ulong *cp, const _ntl_ulong *ap, long k, long n)

// extract k bits from a at position n

{
   long sc = (k + NTL_BITS_PER_LONG-1)/NTL_BITS_PER_LONG;

   long wn = n/NTL_BITS_PER_LONG;
   long bn = n - wn*NTL_BITS_PER_LONG;

   long i;

   if (bn == 0) {
      for (i = 0; i < sc; i++)
         cp[i] = ap[i+wn];
   }
   else {
      for (i = 0; i < sc-1; i++)
         cp[i] = (ap[i+wn] >> bn) | (ap[i+wn+1] << (NTL_BITS_PER_LONG - bn));

      if ((k + n) % NTL_BITS_PER_LONG != 0)
         cp[sc-1] = (ap[sc+wn-1] >> bn)|(ap[sc+wn] << (NTL_BITS_PER_LONG - bn));
      else
         cp[sc-1] = ap[sc+wn-1] >> bn;
   }

   long p = k % NTL_BITS_PER_LONG;
   if (p != 0) 
      cp[sc-1] &= ((1UL << p) - 1UL);

}


void KronSubst(GF2X& aa, const GF2EX& a)
{
   long sa = a.rep.length();
   long blocksz = 2*GF2E::degree() - 1;

   long saa = sa*blocksz;

   long wsaa = (saa + NTL_BITS_PER_LONG-1)/NTL_BITS_PER_LONG;

   aa.xrep.SetLength(wsaa+1);

   _ntl_ulong *paa = aa.xrep.elts();


   long i;
   for (i = 0; i < wsaa+1; i++)
      paa[i] = 0;

   for (i = 0; i < sa; i++) 
      ShiftAdd(paa, rep(a.rep[i]).xrep.elts(), rep(a.rep[i]).xrep.length(),
               blocksz*i);

   aa.normalize(); 
}

void KronMul(GF2EX& x, const GF2EX& a, const GF2EX& b)
{
   if (a == 0 || b == 0) {
      clear(x);
      return;
   }

   GF2X aa, bb, xx;

   long sx = deg(a) + deg(b) + 1;
   long blocksz = 2*GF2E::degree() - 1;

   if (NTL_OVERFLOW(blocksz, sx, 0))
      Error("overflow in GF2EX KronMul");

   KronSubst(aa, a);
   KronSubst(bb, b);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人h精品动漫一区二区三区| 亚洲精品视频在线观看网站| 免费人成在线不卡| 在线播放亚洲一区| 美国欧美日韩国产在线播放| 制服丝袜亚洲精品中文字幕| 青青草伊人久久| 精品国产三级电影在线观看| 国产乱码精品一区二区三区忘忧草 | 欧美日韩国产美| 亚瑟在线精品视频| 日韩一区二区中文字幕| 国产在线一区观看| 中文幕一区二区三区久久蜜桃| 成人18视频日本| 亚洲一级二级三级| 欧美va亚洲va在线观看蝴蝶网| 精品一二线国产| 亚洲欧洲性图库| 欧美三级在线视频| 国产一区二区三区不卡在线观看| 亚洲成a天堂v人片| 久久伊99综合婷婷久久伊| 波多野结衣亚洲| 亚洲第四色夜色| 久久精品视频在线看| 一本到一区二区三区| 免费高清在线一区| 亚洲欧洲日韩一区二区三区| 欧美群妇大交群中文字幕| 国内欧美视频一区二区| 一区二区三区日韩在线观看| 欧美不卡一区二区| 色香蕉久久蜜桃| 国产在线精品免费| 国产精品一区二区久激情瑜伽| 亚洲免费观看视频| 久久众筹精品私拍模特| 欧美综合久久久| 国产激情视频一区二区三区欧美 | 成人网在线免费视频| 亚洲电影视频在线| 国产精品久久看| 欧美精品一区二区久久久| 在线观看免费亚洲| 韩国一区二区三区| 成人精品鲁一区一区二区| 日日夜夜精品免费视频| ㊣最新国产の精品bt伙计久久| 欧美一区二区三区日韩视频| 91小视频在线观看| 国产成人啪免费观看软件 | 综合在线观看色| 久久伊99综合婷婷久久伊| 欧美日韩亚洲综合在线 | 亚洲欧美日韩综合aⅴ视频| 欧美大片在线观看| 欧美视频自拍偷拍| 色综合久久中文综合久久97| 国产自产高清不卡| 久久草av在线| 日日骚欧美日韩| 亚洲国产日产av| 亚洲精品高清在线观看| 亚洲人成影院在线观看| 中文字幕国产一区| 中国av一区二区三区| 国产欧美一区在线| 久久久久综合网| 久久亚洲一区二区三区明星换脸| 亚洲久本草在线中文字幕| 欧美激情一区三区| 中文字幕不卡在线播放| 国产日韩精品一区二区三区在线| 欧美va亚洲va国产综合| 欧美α欧美αv大片| 精品福利在线导航| 日韩久久久久久| 欧美成人艳星乳罩| xfplay精品久久| 精品国精品自拍自在线| 久久影视一区二区| 国产欧美一区二区三区沐欲| 国产日韩影视精品| 国产精品免费aⅴ片在线观看| 国产精品免费aⅴ片在线观看| 天天色 色综合| 日韩精品视频网站| 美女国产一区二区| 国产精品99久久久久久久女警 | 天天av天天翘天天综合网色鬼国产| 一区二区三区在线免费观看| 亚洲成a人v欧美综合天堂| 婷婷综合在线观看| 另类调教123区| 国产成人精品三级麻豆| 不卡av免费在线观看| 欧美影视一区二区三区| 欧美美女一区二区在线观看| 亚洲欧美电影院| 日本在线不卡视频| 蜜臀久久99精品久久久久宅男| 精品一区二区三区香蕉蜜桃 | 国产日韩欧美在线一区| 18成人在线观看| 日韩黄色片在线观看| 久久99国产精品麻豆| 99在线热播精品免费| 欧美色视频一区| 久久一二三国产| 亚洲免费资源在线播放| 日本不卡一二三区黄网| 国产·精品毛片| 国产欧美一区二区精品性色超碰| 中文字幕一区二区不卡| 免费看欧美女人艹b| 不卡高清视频专区| 欧美一区二区三区啪啪| 中文字幕亚洲区| 青娱乐精品视频在线| 福利一区二区在线| 3d动漫精品啪啪1区2区免费| 中文字幕欧美日韩一区| 偷窥少妇高潮呻吟av久久免费| 国产精品一区二区不卡| 欧美日韩不卡一区二区| 国产午夜精品福利| 天天综合日日夜夜精品| 99国产精品久久| 久久午夜免费电影| 国产精品亚洲午夜一区二区三区 | 91玉足脚交白嫩脚丫在线播放| 欧美日韩一区二区在线观看| 久久久久久黄色| 一区二区国产视频| 国产宾馆实践打屁股91| 91精品国产全国免费观看| 国产精品毛片高清在线完整版| 日本欧美一区二区| 91成人免费在线| 国产视频一区在线播放| 久久精品国产亚洲一区二区三区| 久久久另类综合| 免费视频一区二区| 欧美影视一区二区三区| 中文字幕一区在线观看视频| 国产精品一卡二| 精品国产免费久久| 日韩国产在线观看| 欧美日韩精品一区二区三区 | 五月天亚洲精品| av亚洲精华国产精华精华 | 欧美色国产精品| 亚洲人亚洲人成电影网站色| 国产一区二区三区免费播放| 亚洲女与黑人做爰| 国产成人av福利| 337p日本欧洲亚洲大胆色噜噜| 免费观看一级欧美片| 欧美体内she精高潮| 亚洲资源中文字幕| 91美女片黄在线观看| 亚洲人成在线观看一区二区| 成人黄色777网| 国产精品久久久久影院| 成人一级片在线观看| 久久久国产精品麻豆| 国产成人免费9x9x人网站视频| 欧美videofree性高清杂交| 久久精品72免费观看| 精品福利一二区| 国产激情视频一区二区在线观看 | 亚洲色图欧洲色图婷婷| 92精品国产成人观看免费| 亚洲人xxxx| 91福利视频网站| 日本免费新一区视频| 久久嫩草精品久久久久| 国产成人在线色| 亚洲欧美区自拍先锋| 欧美日韩一区视频| 久久99精品视频| 久久精品日产第一区二区三区高清版 | 国产精品羞羞答答xxdd| 日日夜夜一区二区| 日韩视频一区二区三区在线播放| 久久精品国产网站| 国产精品视频在线看| 色综合久久久久久久久| 视频一区二区三区在线| 欧美tickle裸体挠脚心vk| 成人综合日日夜夜| 一区二区三区电影在线播| 日韩一区二区在线观看视频播放| 激情五月婷婷综合| 亚洲欧洲另类国产综合| 欧美性xxxxxxxx| 久久精品噜噜噜成人av农村| 中文字幕不卡在线| 欧美日韩一级黄|