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

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

?? lzz_pex.cpp

?? 一個比較通用的大數(shù)運算庫
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
            MulMod(res, res, g, F);
      }

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

      h = res;
      return;
   }

   long k = OptWinSize(n);
   k = min(k, 3);

   vec_zz_pEX v;

   v.SetLength(1L << (k-1));

   v[0] = g;
 
   if (k > 1) {
      zz_pEX t;
      SqrMod(t, g, F);

      for (i = 1; i < (1L << (k-1)); i++)
         MulMod(v[i], v[i-1], t, F);
   }


   long val;
   long cnt;
   long m;

   val = 0;
   for (i = n-1; i >= 0; i--) {
      val = (val << 1) | bit(e, i); 
      if (val == 0)
         SqrMod(res, res, F);
      else if (val >= (1L << (k-1)) || i == 0) {
         cnt = 0;
         while ((val & 1) == 0) {
            val = val >> 1;
            cnt++;
         }

         m = val;
         while (m > 0) {
            SqrMod(res, res, F);
            m = m >> 1;
         }

         MulMod(res, res, v[val >> 1], F);

         while (cnt > 0) {
            SqrMod(res, res, F);
            cnt--;
         }

         val = 0;
      }
   }

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

   h = res;
}

void InvMod(zz_pEX& x, const zz_pEX& a, const zz_pEX& f)
{
   if (deg(a) >= deg(f) || deg(f) == 0) Error("InvMod: bad args");

   zz_pEX d, t;

   XGCD(d, x, t, a, f);
   if (!IsOne(d))
      Error("zz_pEX InvMod: can't compute multiplicative inverse");
}

long InvModStatus(zz_pEX& x, const zz_pEX& a, const zz_pEX& f)
{
   if (deg(a) >= deg(f) || deg(f) == 0) Error("InvModStatus: bad args");
   zz_pEX d, t;

   XGCD(d, x, t, a, f);
   if (!IsOne(d)) {
      x = d;
      return 1;
   }
   else
      return 0;
}


void MulMod(zz_pEX& x, const zz_pEX& a, const zz_pEX& b, const zz_pEX& f)
{
   if (deg(a) >= deg(f) || deg(b) >= deg(f) || deg(f) == 0)
      Error("MulMod: bad args");

   zz_pEX t;

   mul(t, a, b);
   rem(x, t, f);
}

void SqrMod(zz_pEX& x, const zz_pEX& a, const zz_pEX& f)
{
   if (deg(a) >= deg(f) || deg(f) == 0) Error("SqrMod: bad args");

   zz_pEX t;

   sqr(t, a);
   rem(x, t, f);
}


void PowerXMod(zz_pEX& hh, const ZZ& e, const zz_pEXModulus& F)
{
   if (F.n < 0) Error("PowerXMod: uninitialized modulus");

   if (IsZero(e)) {
      set(hh);
      return;
   }

   long n = NumBits(e);
   long i;

   zz_pEX h;

   h.SetMaxLength(F.n);
   set(h);

   for (i = n - 1; i >= 0; i--) {
      SqrMod(h, h, F);
      if (bit(e, i))
         MulByXMod(h, h, F.f);
   }

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

   hh = h;
}


void reverse(zz_pEX& x, const zz_pEX& a, long hi)
{
   if (hi < 0) { clear(x); return; }
   if (NTL_OVERFLOW(hi, 1, 0))
      Error("overflow in reverse");

   if (&x == &a) {
      zz_pEX tmp;
      CopyReverse(tmp, a, hi);
      x = tmp;
   }
   else
      CopyReverse(x, a, hi);
}


void power(zz_pEX& x, const zz_pEX& a, long e)
{
   if (e < 0) {
      Error("power: negative exponent");
   }

   if (e == 0) {
      x = 1;
      return;
   }

   if (a == 0 || a == 1) {
      x = a;
      return;
   }

   long da = deg(a);

   if (da == 0) {
      x = power(ConstTerm(a), e);
      return;
   }

   if (da > (NTL_MAX_LONG-1)/e)
      Error("overflow in power");

   zz_pEX res;
   res.SetMaxLength(da*e + 1);
   res = 1;
   
   long k = NumBits(e);
   long i;

   for (i = k - 1; i >= 0; i--) {
      sqr(res, res);
      if (bit(e, i))
         mul(res, res, a);
   }

   x = res;
}



static
void FastTraceVec(vec_zz_pE& S, const zz_pEXModulus& f)
{
   long n = deg(f);

   zz_pEX x = reverse(-LeftShift(reverse(diff(reverse(f)), n-1), n-1)/f, n-1);

   S.SetLength(n);
   S[0] = n;

   long i;
   for (i = 1; i < n; i++)
      S[i] = coeff(x, i);
}


void PlainTraceVec(vec_zz_pE& S, const zz_pEX& ff)
{
   if (deg(ff) <= 0)
      Error("TraceVec: bad args");

   zz_pEX f;
   f = ff;

   MakeMonic(f);

   long n = deg(f);

   S.SetLength(n);

   if (n == 0)
      return;

   long k, i;
   zz_pX acc, t;
   zz_pE t1;

   S[0] = n;

   for (k = 1; k < n; k++) {
      mul(acc, rep(f.rep[n-k]), k);

      for (i = 1; i < k; i++) {
         mul(t, rep(f.rep[n-i]), rep(S[k-i]));
         add(acc, acc, t);
      }

      conv(t1, acc);
      negate(S[k], t1);
   }
}

void TraceVec(vec_zz_pE& S, const zz_pEX& f)
{
   if (deg(f) < zz_pE::DivCross())
      PlainTraceVec(S, f);
   else
      FastTraceVec(S, f);
}

static
void ComputeTraceVec(const zz_pEXModulus& F)
{
   vec_zz_pE& S = *((vec_zz_pE *) &F.tracevec);

   if (S.length() > 0)
      return;

   if (F.method == zz_pEX_MOD_PLAIN) {
      PlainTraceVec(S, F.f);
   }
   else {
      FastTraceVec(S, F);
   }
}

void TraceMod(zz_pE& x, const zz_pEX& a, const zz_pEXModulus& F)
{
   long n = F.n;

   if (deg(a) >= n)
      Error("trace: bad args");

   if (F.tracevec.length() == 0) 
      ComputeTraceVec(F);

   InnerProduct(x, a.rep, F.tracevec);
}

void TraceMod(zz_pE& x, const zz_pEX& a, const zz_pEX& f)
{
   if (deg(a) >= deg(f) || deg(f) <= 0)
      Error("trace: bad args");

   project(x, TraceVec(f), a);
}


void PlainResultant(zz_pE& rres, const zz_pEX& a, const zz_pEX& b)
{
   zz_pE res;
 
   if (IsZero(a) || IsZero(b))
      clear(res);
   else if (deg(a) == 0 && deg(b) == 0) 
      set(res);
   else {
      long d0, d1, d2;
      zz_pE lc;
      set(res);

      long n = max(deg(a),deg(b)) + 1;
      zz_pEX u(INIT_SIZE, n), v(INIT_SIZE, n);
      vec_zz_pX tmp;
      SetSize(tmp, n, 2*zz_pE::degree());

      u = a;
      v = b;

      for (;;) {
         d0 = deg(u);
         d1 = deg(v);
         lc = LeadCoeff(v);

         PlainRem(u, u, v, tmp);
         swap(u, v);

         d2 = deg(v);
         if (d2 >= 0) {
            power(lc, lc, d0-d2);
            mul(res, res, lc);
            if (d0 & d1 & 1) negate(res, res);
         }
         else {
            if (d1 == 0) {
               power(lc, lc, d0);
               mul(res, res, lc);
            }
            else
               clear(res);
        
            break;
         }
      }

      rres = res;
   }
}

void resultant(zz_pE& rres, const zz_pEX& a, const zz_pEX& b)
{
   PlainResultant(rres, a, b); 
}


void NormMod(zz_pE& x, const zz_pEX& a, const zz_pEX& f)
{
   if (deg(f) <= 0 || deg(a) >= deg(f)) 
      Error("norm: bad args");

   if (IsZero(a)) {
      clear(x);
      return;
   }

   zz_pE t;
   resultant(t, f, a);
   if (!IsOne(LeadCoeff(f))) {
      zz_pE t1;
      power(t1, LeadCoeff(f), deg(a));
      inv(t1, t1);
      mul(t, t, t1);
   }

   x = t;
}



// tower stuff...



void InnerProduct(zz_pEX& x, const vec_zz_p& v, long low, long high,
                   const vec_zz_pEX& H, long n, vec_zz_pE& t)
{
   zz_pE 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_p& w = v[i];

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

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

   x.normalize();
}



void CompTower(zz_pEX& x, const zz_pX& g, const zz_pEXArgument& A,
             const zz_pEXModulus& F)
{
   if (deg(g) <= 0) {
      conv(x, g);
      return;
   }


   zz_pEX s, t;
   vec_zz_pE scratch;
   scratch.SetLength(deg(F));

   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 CompTower(zz_pEX& x, const zz_pX& 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);

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

void PrepareProjection(vec_vec_zz_p& tt, const vec_zz_pE& s,
                       const vec_zz_p& proj)
{
   long l = s.length();
   tt.SetLength(l);

   zz_pXMultiplier M;
   long i;

   for (i = 0; i < l; i++) {
      build(M, rep(s[i]), zz_pE::modulus());
      UpdateMap(tt[i], proj, M, zz_pE::modulus());
   }
}

void ProjectedInnerProduct(zz_p& x, const vec_zz_pE& a, 
                           const vec_vec_zz_p& b)
{
   long n = min(a.length(), b.length());

   zz_p t, res;

   res = 0;

   long i;
   for (i = 0; i < n; i++) {
      project(t, b[i], rep(a[i]));
      res += t;
   }

   x = res;
}


   
void PrecomputeProj(vec_zz_p& proj, const zz_pX& f)
{
   long n = deg(f);

   if (n <= 0) Error("PrecomputeProj: bad args");

   if (ConstTerm(f) != 0) {
      proj.SetLength(1);
      proj[0] = 1;
   }
   else {
      proj.SetLength(n);
      clear(proj);
      proj[n-1] = 1;
   }
}


void ProjectPowersTower(vec_zz_p& x, const vec_zz_pE& a, long k,
                   const zz_pEXArgument& H, const zz_pEXModulus& F,
                   const vec_zz_p& proj)

{
   long n = F.n;

   if (a.length() > n || k < 0 || NTL_OVERFLOW(k, 1, 0))
      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);

   vec_zz_pE s(INIT_SIZE, n);
   s = a;

   x.SetLength(k);

   vec_vec_zz_p tt;

   for (long i = 0; i <= l; i++) {
      long m1 = min(m, k-i*m);
      zz_p* w = &x[i*m];

      PrepareProjection(tt, s, proj);

      for (long j = 0; j < m1; j++)
         ProjectedInnerProduct(w[j], H.H[j].rep, tt);
      if (i < l)
         UpdateMap(s, s, M, F);
   }
}




void ProjectPowersTower(vec_zz_p& x, const vec_zz_pE& a, long k,
                   const zz_pEX& h, const zz_pEXModulus& F,
                   const vec_zz_p& proj)

{
   if (a.length() > F.n || k < 0) Error("ProjectPowers: bad args");

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

   long m = SqrRoot(k);

   zz_pEXArgument H;

   build(H, h, F, m);
   ProjectPowersTower(x, a, k, H, F, proj);
}


void DoMinPolyTower(zz_pX& h, const zz_pEX& g, const zz_pEXModulus& F, long m,
               const vec_zz_pE& R, const vec_zz_p& proj)
{
   vec_zz_p x;

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


void ProbMinPolyTower(zz_pX& h, const zz_pEX& g, const zz_pEXModulus& F, 
                      long m)
{
   long n = F.n;
   if (m < 1 || m > n*zz_pE::degree()) Error("ProbMinPoly: bad args");

   vec_zz_pE R;
   R.SetLength(n);
   long i;
   for (i = 0; i < n; i++)
      random(R[i]);

   vec_zz_p proj;
   PrecomputeProj(proj, zz_pE::modulus());

   DoMinPolyTower(h, g, F, m, R, proj);
}


void ProbMinPolyTower(zz_pX& h, const zz_pEX& g, const zz_pEXModulus& F, 
                      long m, const vec_zz_p& proj)
{
   long n = F.n;
   if (m < 1 || m > n*zz_pE::degree()) Error("ProbMinPoly: bad args");

   vec_zz_pE R;
   R.SetLength(n);
   long i;
   for (i = 0; i < n; i++)
      random(R[i]);

   DoMinPolyTower(h, g, F, m, R, proj);
}

void MinPolyTower(zz_pX& hh, const zz_pEX& g, const zz_pEXModulus& F, long m)
{
   zz_pX h;
   zz_pEX h1;
   long n = F.n;
   if (m < 1 || m > n*zz_pE::degree()) {
      Error("MinPoly: bad args");
   }

   vec_zz_p proj;
   PrecomputeProj(proj, zz_pE::modulus());

   /* probabilistically compute min-poly */

   ProbMinPolyTower(h, g, F, m, proj);
   if (deg(h) == m) { hh = h; return; }
   CompTower(h1, h, g, F);
   if (IsZero(h1)) { hh = h; return; }

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

   long i;

   zz_pX h2;
   zz_pEX h3;
   vec_zz_pE R;
   zz_pEXTransMultiplier H1;
   

   for (;;) {
      R.SetLength(n);
      for (i = 0; i < n; i++) random(R[i]);
      build(H1, h1, F);
      UpdateMap(R, R, H1, F);
      DoMinPolyTower(h2, g, F, m-deg(h), R, proj);

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

void IrredPolyTower(zz_pX& h, const zz_pEX& g, const zz_pEXModulus& F, long m)
{
   if (m < 1 || m > deg(F)*zz_pE::degree()) Error("IrredPoly: bad args");

   vec_zz_pE R;
   R.SetLength(1);
   R[0] = 1;

   vec_zz_p proj;
   proj.SetLength(1);
   proj[0] = 1;

   DoMinPolyTower(h, g, F, m, R, proj);
}

NTL_END_IMPL

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久国产人妖系列| 亚洲私人影院在线观看| 人人精品人人爱| 欧美一区二区三区视频在线观看| 天堂成人免费av电影一区| 欧美日韩视频第一区| 日韩激情一二三区| 欧美videossexotv100| 国产美女精品一区二区三区| 中文字幕一区不卡| 欧美日韩国产成人在线91| 蜜臀av性久久久久av蜜臀妖精| 日韩精品自拍偷拍| 国产91丝袜在线播放0| 中文字幕制服丝袜一区二区三区| 91婷婷韩国欧美一区二区| 亚洲一级二级在线| 日韩精品一区二区三区视频 | 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲视频资源在线| 欧美夫妻性生活| 国产精品一二三四| 日韩美女久久久| 日韩一区二区麻豆国产| 成人黄色在线网站| 日本不卡视频一二三区| 国产女主播一区| 欧美日韩一区在线| 成人夜色视频网站在线观看| 亚洲一区二区偷拍精品| 欧美v日韩v国产v| 色哟哟日韩精品| 国内精品免费在线观看| 亚洲一区免费在线观看| 久久久不卡影院| 在线播放中文一区| av电影在线观看完整版一区二区| 日日嗨av一区二区三区四区| 中文无字幕一区二区三区| 欧美日韩久久久久久| 成人午夜视频网站| 蜜臀91精品一区二区三区| 亚洲人精品一区| 一区二区三区欧美日| 欧美成人精品二区三区99精品| 91啪亚洲精品| 粗大黑人巨茎大战欧美成人| 蜜臀av国产精品久久久久| 一区二区不卡在线播放| 国产精品丝袜一区| 欧美mv日韩mv国产| 欧美日韩视频在线第一区| 99久久夜色精品国产网站| 国产一区二区三区四区五区入口| 午夜在线成人av| 一区二区三区丝袜| 国产精品理伦片| 久久影院午夜论| 精品免费99久久| 日韩亚洲欧美在线| 欧美视频中文一区二区三区在线观看| 国产v综合v亚洲欧| 国产在线精品视频| 极品销魂美女一区二区三区| 日韩电影免费在线观看网站| 亚洲va欧美va天堂v国产综合| 亚洲美女视频在线观看| 亚洲国产精华液网站w| 久久九九99视频| 久久―日本道色综合久久| 精品福利一二区| 精品美女在线播放| 26uuu色噜噜精品一区二区| 欧美一区二区福利在线| 91精品国产免费| 日韩美女一区二区三区| 精品国产一区二区三区忘忧草| 日韩丝袜美女视频| 日韩欧美亚洲国产精品字幕久久久 | 日韩欧美你懂的| 91精品国产一区二区人妖| 欧美精品亚洲二区| 欧美精品九九99久久| 91精品国产91久久久久久一区二区 | 精品一区精品二区高清| 精品在线免费观看| 国产麻豆91精品| 波波电影院一区二区三区| 91免费版在线| 欧美影院午夜播放| 91精品在线一区二区| 精品乱人伦小说| 国产无人区一区二区三区| 亚洲欧美怡红院| 亚洲男人天堂av网| 午夜欧美在线一二页| 捆绑调教一区二区三区| 国产精品一二三四五| www..com久久爱| 久久久综合网站| 国产精品久久久久久久久晋中| 亚洲视频中文字幕| 日韩国产欧美三级| 国产成人亚洲综合a∨婷婷 | 亚洲国产日韩一级| 麻豆国产精品官网| 99久久久国产精品| 91麻豆精品91久久久久久清纯| 精品国产精品网麻豆系列| 国产精品免费视频网站| 亚洲国产精品自拍| 国产精品一区二区免费不卡| 一本一本久久a久久精品综合麻豆| 91 com成人网| 欧美激情综合在线| 午夜久久久影院| 成人免费黄色在线| 欧美日韩的一区二区| 国产日韩av一区| 亚洲成av人片一区二区梦乃| 国产成人a级片| 91精品视频网| 日韩一区在线播放| 捆绑紧缚一区二区三区视频| 一本色道久久综合精品竹菊| 欧美一区二区三区小说| 亚洲人成7777| 国产精品一区二区不卡| 欧美精品v国产精品v日韩精品 | 亚洲一二三四久久| 国产成人综合在线| 日韩一区二区三区四区五区六区| 国产精品久久久久影院色老大 | 国产传媒日韩欧美成人| 欧美精品乱码久久久久久| 成人欧美一区二区三区黑人麻豆 | 免费成人在线观看| 91国内精品野花午夜精品| 久久久久久免费毛片精品| 日韩国产欧美在线观看| 91黄色免费网站| 国产精品乱子久久久久| 韩国在线一区二区| 日韩视频中午一区| 亚洲黄网站在线观看| 99精品欧美一区二区三区小说 | 日韩成人av影视| 一本色道久久综合狠狠躁的推荐| 国产欧美日韩亚州综合 | 国产欧美日韩综合| 精品在线一区二区三区| 亚洲欧美在线aaa| 成人一区二区三区视频| 久久奇米777| 韩国av一区二区三区四区| 日韩你懂的在线观看| 麻豆91在线播放| 欧美一区二区三区白人| 三级亚洲高清视频| 欧美精品色综合| 婷婷综合在线观看| 制服丝袜在线91| 日韩成人午夜电影| 56国语精品自产拍在线观看| 午夜精品久久久| 91精品国产综合久久久蜜臀粉嫩| 亚洲成年人影院| 欧美精品丝袜久久久中文字幕| 五月综合激情网| 欧美浪妇xxxx高跟鞋交| 日韩中文字幕av电影| 日韩一二在线观看| 欧美aaaaa成人免费观看视频| 欧美一区二区视频免费观看| 日本欧美加勒比视频| 日韩欧美亚洲一区二区| 韩日av一区二区| 欧美国产日韩在线观看| av福利精品导航| 亚洲高清免费在线| 欧美一区二区观看视频| 国产成人午夜精品5599| 国产精品久久国产精麻豆99网站| 99国产精品视频免费观看| 一区二区成人在线| 91精品欧美久久久久久动漫| 韩国精品一区二区| 中文字幕欧美一| 欧美日韩亚洲高清一区二区| 久久精品国产亚洲a| 亚洲国产精品ⅴa在线观看| 91福利国产成人精品照片| 亚洲高清不卡在线观看| 亚洲精品一区二区三区在线观看| 成人av网在线| 亚洲成人av资源| 久久人人爽爽爽人久久久| 色婷婷激情一区二区三区| 青青草精品视频| 国产精品女人毛片|