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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? zz_pex.cpp

?? 一個比較通用的大數運算庫
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
   long k, i;

   vec_ZZ_pE res;
   res.SetLength(m);

   for (k = 0; k < m; k++) {

      const ZZ_pE& aa = a[k];

      set(t1);
      for (i = k-1; i >= 0; i--) {
         mul(t1, t1, aa);
         add(t1, t1, prod[i]);
      }

      clear(t2);
      for (i = k-1; i >= 0; i--) {
         mul(t2, t2, aa);
         add(t2, t2, res[i]);
      }


      inv(t1, t1);
      sub(t2, b[k], t2);
      mul(t1, t1, t2);

      for (i = 0; i < k; i++) {
         mul(t2, prod[i], t1);
         add(res[i], res[i], t2);
      }

      res[k] = t1;

      if (k < m-1) {
         if (k == 0)
            negate(prod[0], prod[0]);
         else {
            negate(t1, a[k]);
            add(prod[k], t1, prod[k-1]);
            for (i = k-1; i >= 1; i--) {
               mul(t2, prod[i], t1);
               add(prod[i], t2, prod[i-1]);
            }
            mul(prod[0], prod[0], t1);
         }
      }
   }

   while (m > 0 && IsZero(res[m-1])) m--;
   res.SetLength(m);
   f.rep = res;
}
   
void InnerProduct(ZZ_pEX& x, const vec_ZZ_pE& v, long low, long high, 
                   const vec_ZZ_pEX& H, long n, vec_ZZ_pX& t)
{
   ZZ_pX s;
   long i, j;

   for (j = 0; j < n; j++)
      clear(t[j]);

   high = min(high, v.length()-1);
   for (i = low; i <= high; i++) {
      const vec_ZZ_pE& h = H[i-low].rep;
      long m = h.length();
      const ZZ_pX& w = rep(v[i]);

      for (j = 0; j < m; j++) {
         mul(s, w, rep(h[j]));
         add(t[j], t[j], s);
      }
   }

   x.rep.SetLength(n);
   for (j = 0; j < n; j++)
      conv(x.rep[j], t[j]);
   x.normalize();
}



void CompMod(ZZ_pEX& x, const ZZ_pEX& g, const ZZ_pEXArgument& A, 
             const ZZ_pEXModulus& F)
{
   if (deg(g) <= 0) {
      x = g;
      return;
   }


   ZZ_pEX s, t;
   vec_ZZ_pX scratch;
   SetSize(scratch, deg(F), 2*ZZ_pE::degree());

   long m = A.H.length() - 1;
   long l = ((g.rep.length()+m-1)/m) - 1;

   const ZZ_pEX& M = A.H[m];

   InnerProduct(t, g.rep, l*m, l*m + m - 1, A.H, F.n, scratch);
   for (long i = l-1; i >= 0; i--) {
      InnerProduct(s, g.rep, i*m, i*m + m - 1, A.H, F.n, scratch);
      MulMod(t, t, M, F);
      add(t, t, s);
   }

   x = t;
}


void build(ZZ_pEXArgument& A, const ZZ_pEX& h, const ZZ_pEXModulus& F, long m)
{
   long i;

   if (m <= 0 || deg(h) >= F.n)
      Error("build: bad args");

   if (m > F.n) m = F.n;

   if (ZZ_pEXArgBound > 0) {
      double sz = ZZ_p::storage();
      sz = sz*ZZ_pE::degree();
      sz = sz + NTL_VECTOR_HEADER_SIZE + sizeof(vec_ZZ_p);
      sz = sz*F.n;
      sz = sz + NTL_VECTOR_HEADER_SIZE + sizeof(vec_ZZ_pE);
      sz = sz/1024;
      m = min(m, long(ZZ_pEXArgBound/sz));
      m = max(m, 1);
   }


   A.H.SetLength(m+1);

   set(A.H[0]);
   A.H[1] = h;
   for (i = 2; i <= m; i++)
      MulMod(A.H[i], A.H[i-1], h, F);
}

long ZZ_pEXArgBound = 0;




void CompMod(ZZ_pEX& x, const ZZ_pEX& g, const ZZ_pEX& h, const ZZ_pEXModulus& F)
   // x = g(h) mod f
{
   long m = SqrRoot(g.rep.length());

   if (m == 0) {
      clear(x);
      return;
   }

   ZZ_pEXArgument A;

   build(A, h, F, m);

   CompMod(x, g, A, F);
}




void Comp2Mod(ZZ_pEX& x1, ZZ_pEX& x2, const ZZ_pEX& g1, const ZZ_pEX& g2,
              const ZZ_pEX& h, const ZZ_pEXModulus& F)

{
   long m = SqrRoot(g1.rep.length() + g2.rep.length());

   if (m == 0) {
      clear(x1);
      clear(x2);
      return;
   }

   ZZ_pEXArgument A;

   build(A, h, F, m);

   ZZ_pEX xx1, xx2;

   CompMod(xx1, g1, A, F);
   CompMod(xx2, g2, A, F);

   x1 = xx1;
   x2 = xx2;
}

void Comp3Mod(ZZ_pEX& x1, ZZ_pEX& x2, ZZ_pEX& x3, 
              const ZZ_pEX& g1, const ZZ_pEX& g2, const ZZ_pEX& g3,
              const ZZ_pEX& h, const ZZ_pEXModulus& F)

{
   long m = SqrRoot(g1.rep.length() + g2.rep.length() + g3.rep.length());

   if (m == 0) {
      clear(x1);
      clear(x2);
      clear(x3);
      return;
   }

   ZZ_pEXArgument A;

   build(A, h, F, m);

   ZZ_pEX xx1, xx2, xx3;

   CompMod(xx1, g1, A, F);
   CompMod(xx2, g2, A, F);
   CompMod(xx3, g3, A, F);

   x1 = xx1;
   x2 = xx2;
   x3 = xx3;
}

void build(ZZ_pEXTransMultiplier& B, const ZZ_pEX& b, const ZZ_pEXModulus& F)
{
   long db = deg(b);

   if (db >= F.n) Error("build TransMultiplier: bad args");

   ZZ_pEX t;

   LeftShift(t, b, F.n-1);
   div(t, t, F);

   // we optimize for low degree b

   long d;

   d = deg(t);
   if (d < 0)
      B.shamt_fbi = 0;
   else
      B.shamt_fbi = F.n-2 - d; 

   CopyReverse(B.fbi, t, d);

   // The following code optimizes the case when 
   // f = X^n + low degree poly

   trunc(t, F.f, F.n);
   d = deg(t);
   if (d < 0)
      B.shamt = 0;
   else
      B.shamt = d;

   CopyReverse(B.f0, t, d);

   if (db < 0)
      B.shamt_b = 0;
   else
      B.shamt_b = db;

   CopyReverse(B.b, b, db);
}

void TransMulMod(ZZ_pEX& x, const ZZ_pEX& a, const ZZ_pEXTransMultiplier& B,
               const ZZ_pEXModulus& F)
{
   if (deg(a) >= F.n) Error("TransMulMod: bad args");

   ZZ_pEX t1, t2;

   mul(t1, a, B.b);
   RightShift(t1, t1, B.shamt_b);

   mul(t2, a, B.f0);
   RightShift(t2, t2, B.shamt);
   trunc(t2, t2, F.n-1);

   mul(t2, t2, B.fbi);
   if (B.shamt_fbi > 0) LeftShift(t2, t2, B.shamt_fbi);
   trunc(t2, t2, F.n-1);
   LeftShift(t2, t2, 1);

   sub(x, t1, t2);
}


void ShiftSub(ZZ_pEX& U, const ZZ_pEX& V, long n)
// assumes input does not alias output
{
   if (IsZero(V))
      return;

   long du = deg(U);
   long dv = deg(V);

   long d = max(du, n+dv);

   U.rep.SetLength(d+1);
   long i;

   for (i = du+1; i <= d; i++)
      clear(U.rep[i]);

   for (i = 0; i <= dv; i++)
      sub(U.rep[i+n], U.rep[i+n], V.rep[i]);

   U.normalize();
}


void UpdateMap(vec_ZZ_pE& x, const vec_ZZ_pE& a,
         const ZZ_pEXTransMultiplier& B, const ZZ_pEXModulus& F)
{
   ZZ_pEX xx;
   TransMulMod(xx, to_ZZ_pEX(a), B, F);
   x = xx.rep;
}

static
void ProjectPowers(vec_ZZ_pE& x, const ZZ_pEX& a, long k, 
                   const ZZ_pEXArgument& H, const ZZ_pEXModulus& F)
{
   if (k < 0 || NTL_OVERFLOW(k, 1, 0) || deg(a) >= F.n) 
      Error("ProjectPowers: bad args");

   long m = H.H.length()-1;
   long l = (k+m-1)/m - 1;

   ZZ_pEXTransMultiplier M;
   build(M, H.H[m], F);

   ZZ_pEX s;
   s = a;

   x.SetLength(k);

   long i;

   for (i = 0; i <= l; i++) {
      long m1 = min(m, k-i*m);
      for (long j = 0; j < m1; j++)
         InnerProduct(x[i*m+j], H.H[j].rep, s.rep);
      if (i < l)
         TransMulMod(s, s, M, F);
   }
}

static
void ProjectPowers(vec_ZZ_pE& x, const ZZ_pEX& a, long k, const ZZ_pEX& h, 
                   const ZZ_pEXModulus& F)
{
   if (k < 0 || deg(a) >= F.n || deg(h) >= F.n)
      Error("ProjectPowers: bad args");

   if (k == 0) {
      x.SetLength(0);;
      return;
   }

   long m = SqrRoot(k);

   ZZ_pEXArgument H;
   build(H, h, F, m);

   ProjectPowers(x, a, k, H, F);
}

void ProjectPowers(vec_ZZ_pE& x, const vec_ZZ_pE& a, long k,
                   const ZZ_pEXArgument& H, const ZZ_pEXModulus& F)
{
   ProjectPowers(x, to_ZZ_pEX(a), k, H, F);
}

void ProjectPowers(vec_ZZ_pE& x, const vec_ZZ_pE& a, long k,
                   const ZZ_pEX& h, const ZZ_pEXModulus& F)
{
   ProjectPowers(x, to_ZZ_pEX(a), k, h, F);
}




void BerlekampMassey(ZZ_pEX& h, const vec_ZZ_pE& a, long m)
{
   ZZ_pEX Lambda, Sigma, Temp;
   long L;
   ZZ_pE Delta, Delta1, t1;
   long shamt;

   // cerr << "*** " << m << "\n";

   Lambda.SetMaxLength(m+1);
   Sigma.SetMaxLength(m+1);
   Temp.SetMaxLength(m+1);

   L = 0;
   set(Lambda);
   clear(Sigma);
   set(Delta);
   shamt = 0;

   long i, r, dl;

   for (r = 1; r <= 2*m; r++) {
      // cerr << r << "--";
      clear(Delta1);
      dl = deg(Lambda);
      for (i = 0; i <= dl; i++) {
         mul(t1, Lambda.rep[i], a[r-i-1]);
         add(Delta1, Delta1, t1);
      }

      if (IsZero(Delta1)) {
         shamt++;
         // cerr << "case 1: " << deg(Lambda) << " " << deg(Sigma) << " " << shamt << "\n";
      }
      else if (2*L < r) {
         div(t1, Delta1, Delta);
         mul(Temp, Sigma, t1);
         Sigma = Lambda;
         ShiftSub(Lambda, Temp, shamt+1);
         shamt = 0;
         L = r-L;
         Delta = Delta1;
         // cerr << "case 2: " << deg(Lambda) << " " << deg(Sigma) << " " << shamt << "\n";
      }
      else {
         shamt++;
         div(t1, Delta1, Delta);
         mul(Temp, Sigma, t1);
         ShiftSub(Lambda, Temp, shamt);
         // cerr << "case 3: " << deg(Lambda) << " " << deg(Sigma) << " " << shamt << "\n";
      }
   }

   // cerr << "finished: " << L << " " << deg(Lambda) << "\n"; 

   dl = deg(Lambda);
   h.rep.SetLength(L + 1);

   for (i = 0; i < L - dl; i++)
      clear(h.rep[i]);

   for (i = L - dl; i <= L; i++)
      h.rep[i] = Lambda.rep[L - i];
}




void MinPolySeq(ZZ_pEX& h, const vec_ZZ_pE& a, long m)
{
   if (m < 0 || NTL_OVERFLOW(m, 1, 0)) Error("MinPoly: bad args");
   if (a.length() < 2*m) Error("MinPoly: sequence too short");

   BerlekampMassey(h, a, m);
}


void DoMinPolyMod(ZZ_pEX& h, const ZZ_pEX& g, const ZZ_pEXModulus& F, long m, 
               const ZZ_pEX& R)
{
   vec_ZZ_pE x;

   ProjectPowers(x, R, 2*m, g, F);
   MinPolySeq(h, x, m);
}

void ProbMinPolyMod(ZZ_pEX& h, const ZZ_pEX& g, const ZZ_pEXModulus& F, long m)
{
   long n = F.n;
   if (m < 1 || m > n) Error("ProbMinPoly: bad args");

   ZZ_pEX R;
   random(R, n);

   DoMinPolyMod(h, g, F, m, R);
}

void ProbMinPolyMod(ZZ_pEX& h, const ZZ_pEX& g, const ZZ_pEXModulus& F)
{
   ProbMinPolyMod(h, g, F, F.n);
}

void MinPolyMod(ZZ_pEX& hh, const ZZ_pEX& g, const ZZ_pEXModulus& F, long m)
{
   ZZ_pEX h, h1;
   long n = F.n;
   if (m < 1 || m > n) Error("MinPoly: bad args");

   /* probabilistically compute min-poly */

   ProbMinPolyMod(h, g, F, m);
   if (deg(h) == m) { hh = h; return; }
   CompMod(h1, h, g, F);
   if (IsZero(h1)) { hh = h; return; }

   /* not completely successful...must iterate */

   ZZ_pEX h2, h3;
   ZZ_pEX R;
   ZZ_pEXTransMultiplier H1;
   

   for (;;) {
      random(R, n);
      build(H1, h1, F);
      TransMulMod(R, R, H1, F);
      DoMinPolyMod(h2, g, F, m-deg(h), R);

      mul(h, h, h2);
      if (deg(h) == m) { hh = h; return; }
      CompMod(h3, h2, g, F);
      MulMod(h1, h3, h1, F);
      if (IsZero(h1)) { hh = h; return; }
   }
}

void IrredPolyMod(ZZ_pEX& h, const ZZ_pEX& g, const ZZ_pEXModulus& F, long m)
{
   if (m < 1 || m > F.n) Error("IrredPoly: bad args");

   ZZ_pEX R;
   set(R);

   DoMinPolyMod(h, g, F, m, R);
}



void IrredPolyMod(ZZ_pEX& h, const ZZ_pEX& g, const ZZ_pEXModulus& F)
{
   IrredPolyMod(h, g, F, F.n);
}



void MinPolyMod(ZZ_pEX& hh, const ZZ_pEX& g, const ZZ_pEXModulus& F)
{
   MinPolyMod(hh, g, F, F.n);
}

void diff(ZZ_pEX& x, const ZZ_pEX& a)
{
   long n = deg(a);
   long i;

   if (n <= 0) {
      clear(x);
      return;
   }

   if (&x != &a)
      x.rep.SetLength(n);

   for (i = 0; i <= n-1; i++) {
      mul(x.rep[i], a.rep[i+1], i+1);
   }

   if (&x == &a)
      x.rep.SetLength(n);

   x.normalize();
}



void MakeMonic(ZZ_pEX& x)
{
   if (IsZero(x))
      return;

   if (IsOne(LeadCoeff(x)))
      return;

   ZZ_pE t;

   inv(t, LeadCoeff(x));
   mul(x, x, t);
}


long divide(ZZ_pEX& q, const ZZ_pEX& a, const ZZ_pEX& b)
{
   if (IsZero(b)) {
      if (IsZero(a)) {
         clear(q);
         return 1;
      }
      else
         return 0;
   }

   ZZ_pEX lq, r;
   DivRem(lq, r, a, b);
   if (!IsZero(r)) return 0; 
   q = lq;
   return 1;
}

long divide(const ZZ_pEX& a, const ZZ_pEX& b)
{
   if (IsZero(b)) return IsZero(a);
   ZZ_pEX lq, r;
   DivRem(lq, r, a, b);
   if (!IsZero(r)) return 0; 
   return 1;
}



static
long OptWinSize(long n)
// finds k that minimizes n/(k+1) + 2^{k-1}

{
   long k;
   double v, v_new;


   v = n/2.0 + 1.0;
   k = 1;

   for (;;) {
      v_new = n/(double(k+2)) + double(1L << k);
      if (v_new >= v) break;
      v = v_new;
      k++;
   }

   return k;
}
      


void PowerMod(ZZ_pEX& h, const ZZ_pEX& g, const ZZ& e, const ZZ_pEXModulus& F)
// h = g^e mod f using "sliding window" algorithm
{
   if (deg(g) >= F.n) Error("PowerMod: bad args");

   if (e == 0) {
      set(h);
      return;
   }

   if (e == 1) {
      h = g;
      return;
   }

   if (e == -1) {
      InvMod(h, g, F);
      return;
   }

   if (e == 2) {
      SqrMod(h, g, F);
      return;
   }

   if (e == -2) {
      SqrMod(h, g, F);
      InvMod(h, h, F);
      return;
   }


   long n = NumBits(e);

   ZZ_pEX res;
   res.SetMaxLength(F.n);
   set(res);

   long i;

   if (n < 16) {
      // plain square-and-multiply algorithm

      for (i = n - 1; i >= 0; i--) {
         SqrMod(res, res, F);
         if (bit(e, i))
            MulMod(res, res, g, F);
      }

      if (e < 0) InvMod(res, res, F);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美电影免费观看高清完整版在线观看| 亚洲国产aⅴ成人精品无吗| 欧美在线制服丝袜| 91视频在线看| 成人激情开心网| 成人精品视频.| 97久久超碰精品国产| www.欧美色图| 色吊一区二区三区| 欧美网站大全在线观看| 欧美日韩国产综合一区二区三区| 欧美日韩午夜精品| 4438x亚洲最大成人网| 日韩视频一区在线观看| 精品少妇一区二区三区免费观看 | 色综合视频在线观看| 99久久婷婷国产| 欧美乱妇15p| 精品国产一二三| 国产欧美一区二区精品秋霞影院 | 亚洲天堂2014| 亚洲电影一级黄| 久国产精品韩国三级视频| 成人性生交大合| 欧美视频一区二| 精品美女被调教视频大全网站| 91精品国产欧美一区二区成人 | 99久久精品免费观看| 高清不卡一二三区| 91高清在线观看| 欧美大片一区二区三区| 久久精品在这里| 亚洲亚洲人成综合网络| 欧美a级理论片| 成人美女视频在线看| 欧美日韩精品欧美日韩精品一| 精品少妇一区二区三区日产乱码| 中文字幕亚洲区| 久久超级碰视频| 日本乱人伦aⅴ精品| 久久久三级国产网站| 一区二区三区不卡视频在线观看| 国产一区激情在线| 欧美日韩日日夜夜| 亚洲欧美国产77777| 国模套图日韩精品一区二区| 色天天综合色天天久久| 久久亚区不卡日本| 青娱乐精品视频在线| 91老司机福利 在线| 欧美国产日韩精品免费观看| 午夜精品影院在线观看| 99天天综合性| 精品国产91久久久久久久妲己| 亚洲最新视频在线观看| 成人91在线观看| 国产日产精品1区| 紧缚捆绑精品一区二区| 欧美精品久久99久久在免费线| 国产精品不卡一区二区三区| 国产精品资源网站| 精品免费国产一区二区三区四区| 亚洲午夜精品网| 91久久久免费一区二区| 综合精品久久久| 成人激情校园春色| 国产日韩欧美不卡在线| 国产精品亚洲成人| 国产婷婷色一区二区三区四区| 琪琪一区二区三区| 69av一区二区三区| 日本欧美加勒比视频| 欧美精品v国产精品v日韩精品| 亚洲国产精品自拍| 欧美妇女性影城| 日本亚洲天堂网| 欧美一区二区三区四区高清| 日本aⅴ免费视频一区二区三区 | 欧美一区二区在线免费播放| 日本不卡1234视频| 亚洲欧美另类图片小说| 久久在线观看免费| 在线播放中文一区| 91香蕉视频黄| 国产mv日韩mv欧美| 免费成人你懂的| 亚洲国产精品久久久男人的天堂| 欧美韩国一区二区| 日韩精品一区二区三区老鸭窝| 色噜噜夜夜夜综合网| 国产成人免费在线| 久久99国产精品免费网站| 奇米影视一区二区三区小说| 中文字幕亚洲一区二区av在线| 精品精品欲导航| 欧美日韩二区三区| 欧美性大战xxxxx久久久| 一本大道综合伊人精品热热| 国产xxx精品视频大全| 狠狠色丁香久久婷婷综合丁香| 亚洲va欧美va人人爽午夜| 综合久久给合久久狠狠狠97色 | 成人的网站免费观看| 极品美女销魂一区二区三区免费| 天天影视涩香欲综合网| 亚洲九九爱视频| 亚洲色图.com| 日韩一区有码在线| 国产精品你懂的| 国产精品久久看| 中文字幕av一区二区三区免费看| 精品乱码亚洲一区二区不卡| 日韩视频免费直播| 欧美一区二区三区视频免费| 日韩一区二区视频在线观看| 日韩亚洲欧美成人一区| 日韩精品一区二区三区中文不卡| 欧美成人vps| 久久久久久电影| 国产日韩综合av| 欧美激情一区二区三区蜜桃视频 | 性欧美大战久久久久久久久| 国产三级一区二区三区| 欧美高清性hdvideosex| 成人av影视在线观看| 国内成人免费视频| 奇米综合一区二区三区精品视频| 亚洲日本一区二区三区| 欧美精品一区二区不卡| 9191久久久久久久久久久| 91小视频免费观看| 不卡av在线免费观看| 国产乱码精品1区2区3区| 午夜在线成人av| 亚洲成人一区在线| 亚洲欧洲日本在线| 国产精品免费网站在线观看| 精品国产一区二区三区四区四 | 国产乱码字幕精品高清av| 午夜精品久久久久久久蜜桃app| 91精品国产综合久久小美女| 日韩精品一区二区三区中文不卡| 国产情人综合久久777777| 亚洲三级在线播放| 免费三级欧美电影| 成人免费电影视频| 91精品国模一区二区三区| 久久久不卡影院| 樱花影视一区二区| 国产麻豆一精品一av一免费| 色香色香欲天天天影视综合网| 欧美一级久久久久久久大片| 国产精品久久久久7777按摩| 日韩高清一区在线| 91女人视频在线观看| 日韩欧美国产三级| 亚洲乱码国产乱码精品精98午夜| 奇米影视7777精品一区二区| 成人激情小说乱人伦| 日韩欧美黄色影院| 亚洲伊人色欲综合网| 国产成人免费av在线| 欧美一区二区三区四区高清| 中文字幕一区av| 国产精品一区二区不卡| 欧美日韩高清不卡| 亚洲欧美国产高清| 国产91富婆露脸刺激对白| 91精品欧美综合在线观看最新| 亚洲欧洲综合另类| 国产精品影视网| 日韩欧美一二三区| 亚洲午夜国产一区99re久久| 99视频国产精品| 久久久www成人免费无遮挡大片 | 亚洲久本草在线中文字幕| 国产麻豆一精品一av一免费| 宅男在线国产精品| 亚洲一区二区精品3399| 91在线视频观看| 国产精品午夜在线观看| 国内外成人在线| 日韩欧美成人午夜| 视频一区二区欧美| 欧美日韩五月天| 亚洲成人一二三| 欧美日韩国产高清一区二区三区 | 亚洲妇熟xx妇色黄| 日韩福利视频网| 成人sese在线| 欧美一区二区三区性视频| 国产精品天美传媒沈樵| 午夜精品视频一区| 成人免费高清在线| 欧美成人欧美edvon| 亚洲国产日韩一级| 国产成人啪免费观看软件| 91精品国产高清一区二区三区| 国产欧美日韩三区| 美女视频黄a大片欧美|