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

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

?? zz_px1.cpp

?? 一個比較通用的大數運算庫
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
}


void ProbMinPolyMod(ZZ_pX& h, const ZZ_pX& g, const ZZ_pXModulus& F, long m) 
{
   long n = F.n;
   if (m < 1 || m > n) Error("ProbMinPoly: bad args");
   
   long i;
   vec_ZZ_p R(INIT_SIZE, n);

   for (i = 0; i < n; i++) random(R[i]);
   DoMinPolyMod(h, g, F, m, R);
}

void MinPolyMod(ZZ_pX& hh, const ZZ_pX& g, const ZZ_pXModulus& F, long m) 
{
   ZZ_pX 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 */

   long i;

   ZZ_pX h2, h3;
   ZZ_pXMultiplier H1;
   vec_ZZ_p R(INIT_SIZE, n);

   for (;;) {
      R.SetLength(n);
      for (i = 0; i < n; i++) random(R[i]);
      build(H1, h1, F);
      UpdateMap(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_pX& h, const ZZ_pX& g, const ZZ_pXModulus& F, long m) 
{
   vec_ZZ_p R(INIT_SIZE, 1);
   if (m < 1 || m > F.n) Error("IrredPoly: bad args");

   set(R[0]);
   DoMinPolyMod(h, g, F, m, R);
}



void diff(ZZ_pX& x, const ZZ_pX& 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_pX& x)
{
   if (IsZero(x))
      return;

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

   ZZ_p t;

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


      
void PlainMulTrunc(ZZ_pX& x, const ZZ_pX& a, const ZZ_pX& b, long n)
{
   ZZ_pX y;
   mul(y, a, b);
   trunc(x, y, n);
}


void FFTMulTrunc(ZZ_pX& x, const ZZ_pX& a, const ZZ_pX& b, long n)
{
   if (IsZero(a) || IsZero(b)) {
      clear(x);
      return;
   }

   long d = deg(a) + deg(b);
   if (n > d + 1)
      n = d + 1;

   long k = NextPowerOfTwo(d + 1);
   FFTRep R1(INIT_SIZE, k), R2(INIT_SIZE, k);

   ToFFTRep(R1, a, k);
   ToFFTRep(R2, b, k);
   mul(R1, R1, R2);
   FromFFTRep(x, R1, 0, n-1);
}

void MulTrunc(ZZ_pX& x, const ZZ_pX& a, const ZZ_pX& b, long n)
{
   if (n < 0) Error("MulTrunc: bad args");

   if (deg(a) <= NTL_ZZ_pX_FFT_CROSSOVER || deg(b) <= NTL_ZZ_pX_FFT_CROSSOVER)
      PlainMulTrunc(x, a, b, n);
   else
      FFTMulTrunc(x, a, b, n);
}

      
void PlainSqrTrunc(ZZ_pX& x, const ZZ_pX& a, long n)
{
   ZZ_pX y;
   sqr(y, a);
   trunc(x, y, n);
}


void FFTSqrTrunc(ZZ_pX& x, const ZZ_pX& a, long n)
{
   if (IsZero(a)) {
      clear(x);
      return;
   }

   long d = 2*deg(a);
   if (n > d + 1)
      n = d + 1;

   long k = NextPowerOfTwo(d + 1);
   FFTRep R1(INIT_SIZE, k);

   ToFFTRep(R1, a, k);
   mul(R1, R1, R1);
   FromFFTRep(x, R1, 0, n-1);
}

void SqrTrunc(ZZ_pX& x, const ZZ_pX& a, long n)
{
   if (n < 0) Error("SqrTrunc: bad args");

   if (deg(a) <= NTL_ZZ_pX_FFT_CROSSOVER)
      PlainSqrTrunc(x, a, n);
   else
      FFTSqrTrunc(x, a, n);
}


void FastTraceVec(vec_ZZ_p& S, const ZZ_pX& f)
{
   long n = deg(f);

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

   if (n == 0) {
      S.SetLength(0);
      return;
   }

   if (n == 1) {
      S.SetLength(1);
      set(S[0]);
      return;
   }
   
   long i;
   ZZ_pX f1;

   f1.rep.SetLength(n-1);
   for (i = 0; i <= n-2; i++)
      f1.rep[i] = f.rep[n-i];
   f1.normalize();

   ZZ_pX f2;
   f2.rep.SetLength(n-1);
   for (i = 0; i <= n-2; i++)
      mul(f2.rep[i], f.rep[n-1-i], i+1);
   f2.normalize();

   ZZ_pX f3;
   InvTrunc(f3, f1, n-1);
   MulTrunc(f3, f3, f2, n-1);

   S.SetLength(n);

   S[0] = n;
   for (i = 1; i < n; i++)
      negate(S[i], coeff(f3, i-1));
}


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

   ZZ_pX f;
   f = ff;

   MakeMonic(f);

   long n = deg(f);

   S.SetLength(n);

   if (n == 0)
      return;

   long k, i;
   ZZ acc, t;
   ZZ_p 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_p& S, const ZZ_pX& f)
{
   if (deg(f) <= NTL_ZZ_pX_TRACE_CROSSOVER)
      PlainTraceVec(S, f);
   else
      FastTraceVec(S, f);
}

void ComputeTraceVec(const ZZ_pXModulus& F)
{
   vec_ZZ_p& S = *((vec_ZZ_p *) &F.tracevec);

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

   if (!F.UseFFT) {
      PlainTraceVec(S, F.f);
      return;
   }

   long i;
   long n = F.n;

   FFTRep R;
   ZZ_pX P, g;

   g.rep.SetLength(n-1);
   for (i = 1; i < n; i++)
      mul(g.rep[n-i-1], F.f.rep[n-i], i); 
   g.normalize();

   ToFFTRep(R, g, F.l);
   mul(R, R, F.HRep);
   FromFFTRep(P, R, n-2, 2*n-4);

   S.SetLength(n);

   S[0] = n;
   for (i = 1; i < n; i++)
      negate(S[i], coeff(P, n-1-i));
}

void TraceMod(ZZ_p& x, const ZZ_pX& a, const ZZ_pXModulus& 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_p& x, const ZZ_pX& a, const ZZ_pX& f)
{
   if (deg(a) >= deg(f) || deg(f) <= 0)
      Error("trace: bad args");

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

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

      long n = max(deg(a),deg(b)) + 1;
      ZZ_pX u(INIT_SIZE, n), v(INIT_SIZE, n);
      ZZVec tmp(n, ZZ_pInfo->ExtendedModulusSize);

      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 ResIterHalfGCD(ZZ_pXMatrix& M_out, ZZ_pX& U, ZZ_pX& V, long d_red,
                    vec_ZZ_p& cvec, vec_long& dvec)
{
   M_out(0,0).SetMaxLength(d_red);
   M_out(0,1).SetMaxLength(d_red);
   M_out(1,0).SetMaxLength(d_red);
   M_out(1,1).SetMaxLength(d_red);

   set(M_out(0,0));   clear(M_out(0,1));
   clear(M_out(1,0)); set(M_out(1,1));

   long goal = deg(U) - d_red;

   if (deg(V) <= goal)
      return;

   ZZVec tmp(deg(U)+1, ZZ_pInfo->ExtendedModulusSize);
   ZZ_pX Q, t(INIT_SIZE, d_red);


   while (deg(V) > goal) {
      append(cvec, LeadCoeff(V));
      append(dvec, dvec[dvec.length()-1]-deg(U)+deg(V));
      PlainDivRem(Q, U, U, V, tmp);
      swap(U, V);

      mul(t, Q, M_out(1,0));
      sub(t, M_out(0,0), t);
      M_out(0,0) = M_out(1,0);
      M_out(1,0) = t;

      mul(t, Q, M_out(1,1));
      sub(t, M_out(0,1), t);
      M_out(0,1) = M_out(1,1);
      M_out(1,1) = t;
   }
}
   


void ResHalfGCD(ZZ_pXMatrix& M_out, const ZZ_pX& U, const ZZ_pX& V, long d_red,
                vec_ZZ_p& cvec, vec_long& dvec)
{
   if (IsZero(V) || deg(V) <= deg(U) - d_red) {
      set(M_out(0,0));   clear(M_out(0,1));
      clear(M_out(1,0)); set(M_out(1,1));
 
      return;
   }


   long n = deg(U) - 2*d_red + 2;
   if (n < 0) n = 0;

   ZZ_pX U1, V1;

   RightShift(U1, U, n);
   RightShift(V1, V, n);

   if (d_red <= NTL_ZZ_pX_HalfGCD_CROSSOVER) { 
      ResIterHalfGCD(M_out, U1, V1, d_red, cvec, dvec);
      return;
   }

   long d1 = (d_red + 1)/2;
   if (d1 < 1) d1 = 1;
   if (d1 >= d_red) d1 = d_red - 1;

   ZZ_pXMatrix M1;

   ResHalfGCD(M1, U1, V1, d1, cvec, dvec);
   mul(U1, V1, M1);

   long d2 = deg(V1) - deg(U) + n + d_red;

   if (IsZero(V1) || d2 <= 0) {
      M_out = M1;
      return;
   }


   ZZ_pX Q;
   ZZ_pXMatrix M2;

   append(cvec, LeadCoeff(V1));
   append(dvec, dvec[dvec.length()-1]-deg(U1)+deg(V1));
   DivRem(Q, U1, U1, V1);
   swap(U1, V1);

   ResHalfGCD(M2, U1, V1, d2, cvec, dvec);

   ZZ_pX t(INIT_SIZE, deg(M1(1,1))+deg(Q)+1);

   mul(t, Q, M1(1,0));
   sub(t, M1(0,0), t);
   swap(M1(0,0), M1(1,0));
   swap(M1(1,0), t);

   t.kill();

   t.SetMaxLength(deg(M1(1,1))+deg(Q)+1);

   mul(t, Q, M1(1,1));
   sub(t, M1(0,1), t);
   swap(M1(0,1), M1(1,1));
   swap(M1(1,1), t);

   t.kill();

   mul(M_out, M2, M1); 
}

void ResHalfGCD(ZZ_pX& U, ZZ_pX& V, vec_ZZ_p& cvec, vec_long& dvec)
{
   long d_red = (deg(U)+1)/2;

   if (IsZero(V) || deg(V) <= deg(U) - d_red) {
      return;
   }

   long du = deg(U);


   long d1 = (d_red + 1)/2;
   if (d1 < 1) d1 = 1;
   if (d1 >= d_red) d1 = d_red - 1;

   ZZ_pXMatrix M1;

   ResHalfGCD(M1, U, V, d1, cvec, dvec);
   mul(U, V, M1);

   long d2 = deg(V) - du + d_red;

   if (IsZero(V) || d2 <= 0) {
      return;
   }

   M1(0,0).kill();
   M1(0,1).kill();
   M1(1,0).kill();
   M1(1,1).kill();


   ZZ_pX Q;

   append(cvec, LeadCoeff(V));
   append(dvec, dvec[dvec.length()-1]-deg(U)+deg(V));
   DivRem(Q, U, U, V);
   swap(U, V);

   ResHalfGCD(M1, U, V, d2, cvec, dvec);

   mul(U, V, M1); 
}


void resultant(ZZ_p& rres, const ZZ_pX& u, const ZZ_pX& v)
{
   if (deg(u) <= NTL_ZZ_pX_GCD_CROSSOVER || deg(v) <= NTL_ZZ_pX_GCD_CROSSOVER) { 
      PlainResultant(rres, u, v);
      return;
   }

   ZZ_pX u1, v1;

   u1 = u;
   v1 = v;

   ZZ_p res, t;
   set(res);

   if (deg(u1) == deg(v1)) {
      rem(u1, u1, v1);
      swap(u1, v1);

      if (IsZero(v1)) {
         clear(rres);
         return;
      }

      power(t, LeadCoeff(u1), deg(u1) - deg(v1));
      mul(res, res, t);
      if (deg(u1) & 1)
         negate(res, res);
   }
   else if (deg(u1) < deg(v1)) {
      swap(u1, v1);
      if (deg(u1) & deg(v1) & 1)
         negate(res, res);
   }

   // deg(u1) > deg(v1) && v1 != 0

   vec_ZZ_p cvec;
   vec_long  dvec;

   cvec.SetMaxLength(deg(v1)+2);
   dvec.SetMaxLength(deg(v1)+2);

   append(cvec, LeadCoeff(u1));
   append(dvec, deg(u1));


   while (deg(u1) > NTL_ZZ_pX_GCD_CROSSOVER && !IsZero(v1)) { 
      ResHalfGCD(u1, v1, cvec, dvec);

      if (!IsZero(v1)) {
         append(cvec, LeadCoeff(v1));
         append(dvec, deg(v1));
         rem(u1, u1, v1);
         swap(u1, v1);
      }
   }

   if (IsZero(v1) && deg(u1) > 0) {
      clear(rres);
      return;
   }

   long i, l;
   l = dvec.length();

   if (deg(u1) == 0) {
      // we went all the way...

      for (i = 0; i <= l-3; i++) {
         power(t, cvec[i+1], dvec[i]-dvec[i+2]);
         mul(res, res, t);
         if (dvec[i] & dvec[i+1] & 1)
            negate(res, res);
      }

      power(t, cvec[l-1], dvec[l-2]);
      mul(res, res, t);
   }
   else {
      for (i = 0; i <= l-3; i++) {
         power(t, cvec[i+1], dvec[i]-dvec[i+2]);
         mul(res, res, t);
         if (dvec[i] & dvec[i+1] & 1)
            negate(res, res);
      }

      power(t, cvec[l-1], dvec[l-2]-deg(v1));
      mul(res, res, t);
      if (dvec[l-2] & dvec[l-1] & 1)
         negate(res, res);

      PlainResultant(t, u1, v1);
      mul(res, res, t);
   }

   rres = res;
}

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

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

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

   x = t;
}

NTL_END_IMPL

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美久久久久久久久久| 亚洲国产一二三| 亚洲狠狠丁香婷婷综合久久久| 午夜国产精品一区| 不卡一二三区首页| 久久女同性恋中文字幕| 日韩黄色小视频| 在线看国产日韩| 亚洲同性同志一二三专区| 国产九色精品成人porny| 精品视频在线免费| 亚洲久本草在线中文字幕| 国产精品中文字幕欧美| 日韩欧美一区二区在线视频| 一区二区三区不卡视频在线观看| 风间由美中文字幕在线看视频国产欧美| 欧美高清视频不卡网| 一区二区三区四区视频精品免费| 成人永久免费视频| 欧美激情综合五月色丁香| 久久激情五月激情| 日韩色视频在线观看| 亚洲成a人在线观看| 欧美视频第二页| 亚洲午夜成aⅴ人片| 91福利视频在线| 亚洲精品乱码久久久久久黑人 | 欧美日韩在线播放三区四区| 中文字幕不卡在线| 国产不卡视频一区二区三区| 久久这里只有精品首页| 国产在线一区二区| www一区二区| 国产美女精品一区二区三区| 久久久久亚洲综合| 国产精品性做久久久久久| 国产人伦精品一区二区| 丁香网亚洲国际| 中文字幕乱码久久午夜不卡| 99视频一区二区三区| 17c精品麻豆一区二区免费| 99久久777色| 洋洋成人永久网站入口| 欧美日韩国产一区| 丝袜亚洲另类丝袜在线| 欧美一区二区视频观看视频| 看片的网站亚洲| 国产亚洲综合色| 99久久er热在这里只有精品15 | 狠狠色丁香婷综合久久| 久久色中文字幕| 99久久精品国产导航| 夜夜揉揉日日人人青青一国产精品| 欧美图区在线视频| 激情小说欧美图片| 国产精品伦一区| 欧美日韩国产电影| 国产麻豆91精品| 亚洲欧美日韩精品久久久久| 51精品秘密在线观看| 捆绑紧缚一区二区三区视频| 亚洲国产岛国毛片在线| 欧美日韩精品免费观看视频| 久久成人av少妇免费| 国产精品卡一卡二卡三| 欧美剧情片在线观看| 国产精品综合在线视频| 亚洲第一会所有码转帖| 久久嫩草精品久久久精品| 91国在线观看| 国产一区二区精品久久99| 亚洲国产精品一区二区www在线| 精品少妇一区二区三区在线播放 | 欧美日韩高清影院| 国产盗摄女厕一区二区三区| 亚洲人成网站精品片在线观看 | 综合久久国产九一剧情麻豆| 欧美电影一区二区| 不卡的av中国片| 免费的国产精品| 亚洲精品综合在线| 久久久久久**毛片大全| 欧美日韩大陆在线| 色综合久久中文字幕综合网| 国产精品一区二区91| 日韩高清不卡一区二区三区| 亚洲免费观看高清完整版在线观看| 日韩欧美国产午夜精品| 欧亚洲嫩模精品一区三区| 91精品国产综合久久久久久久久久| 国产乱子伦视频一区二区三区| 午夜激情一区二区| 一区二区三区在线免费观看| 久久人人97超碰com| 91精品国产欧美一区二区18| 欧美性大战久久久| www.激情成人| 成人在线视频首页| 高清av一区二区| 国产成人在线色| 国产一区二区三区免费观看| 美女视频一区在线观看| 婷婷六月综合网| 亚洲电影你懂得| 亚洲bdsm女犯bdsm网站| 一区二区三区四区不卡视频| 亚洲欧洲精品一区二区三区不卡| 欧美激情一区二区在线| 国产亚洲综合色| 国产精品美女久久久久高潮| 国产视频在线观看一区二区三区| xfplay精品久久| 国产亚洲一二三区| 国产精品美女久久久久久久| 国产精品丝袜黑色高跟| 国产精品欧美久久久久无广告| 欧美国产精品一区二区三区| 国产日韩影视精品| 国产精品久久久久久亚洲伦| 国产精品理论在线观看| 国产精品毛片高清在线完整版 | 亚洲不卡av一区二区三区| 亚洲国产日韩a在线播放| 天堂资源在线中文精品| 视频一区欧美精品| 黄色小说综合网站| 国产成人鲁色资源国产91色综| 国产成人精品免费看| 99久久99久久精品国产片果冻| 一本一道波多野结衣一区二区| 欧美亚洲综合网| 欧美久久久久久蜜桃| 2014亚洲片线观看视频免费| 久久久久久久综合日本| 亚洲欧洲成人自拍| 亚洲一区二区中文在线| 免费不卡在线观看| 菠萝蜜视频在线观看一区| 91福利精品视频| 日韩欧美成人一区| 中文字幕一区二区三区精华液 | 自拍偷拍欧美精品| 亚洲成人先锋电影| 久久av中文字幕片| 91麻豆国产在线观看| 91精品婷婷国产综合久久竹菊| 久久影院视频免费| 亚洲综合一区二区三区| 九九国产精品视频| 色婷婷精品久久二区二区蜜臀av| 91.xcao| 日本一区二区视频在线| 亚洲成人精品在线观看| 国产一区999| 欧美日韩精品一区二区| 中文字幕第一区二区| 日日夜夜精品视频天天综合网| 成人免费的视频| 欧美一区二区三区四区五区| 亚洲图片激情小说| 国产精品正在播放| 在线电影一区二区三区| 中文字幕在线观看一区| 热久久免费视频| 欧洲一区二区av| 国产精品久久久久久久久快鸭| 日一区二区三区| 在线免费不卡视频| 欧美韩日一区二区三区| 另类的小说在线视频另类成人小视频在线| 99久久久国产精品免费蜜臀| 亚洲精品一区二区三区蜜桃下载 | 国产精品原创巨作av| 欧美精选一区二区| 亚洲欧美视频在线观看视频| 国产成人免费视频精品含羞草妖精| 欧美日韩精品久久久| 综合久久给合久久狠狠狠97色| 经典三级一区二区| 欧美一区二区三区日韩| 夜夜精品视频一区二区| 99精品欧美一区二区蜜桃免费| 久久精品人人爽人人爽| 激情综合色丁香一区二区| 91精品在线观看入口| 视频一区视频二区中文字幕| 欧美在线免费观看视频| 亚洲精品国产品国语在线app| 夫妻av一区二区| 国产女主播视频一区二区| 国产乱子伦视频一区二区三区| 精品黑人一区二区三区久久 | 亚洲一区视频在线观看视频| 91免费版在线| 亚洲天堂a在线| av网站免费线看精品| 中文字幕av不卡| av电影一区二区| 亚洲视频 欧洲视频| 91同城在线观看|