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

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

?? lzz_pxfactoring.cpp

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


#include <NTL/lzz_pXFactoring.h>
#include <NTL/vec_vec_lzz_p.h>
#include <NTL/FacVec.h>

#include <NTL/new.h>

NTL_START_IMPL



void SquareFreeDecomp(vec_pair_zz_pX_long& u, const zz_pX& ff)
{
   zz_pX f = ff;

   if (!IsOne(LeadCoeff(f)))
      Error("SquareFreeDecomp: bad args");

   zz_pX r, t, v, tmp1;
   long m, j, finished, done;

   u.SetLength(0);

   if (deg(f) == 0)
      return;

   m = 1;
   finished = 0;

   do {
      j = 1;
      diff(tmp1, f);
      GCD(r, f, tmp1);
      div(t, f, r);

      if (deg(t) > 0) {
         done = 0;
         do {
            GCD(v, r, t);
            div(tmp1, t, v);
            if (deg(tmp1) > 0) append(u, cons(tmp1, j*m));
            if (deg(v) > 0) {
               div(r, r, v);
               t = v;
               j++;
            }
            else
               done = 1;
         } while (!done);
         if (deg(r) == 0) finished = 1;
      }

      if (!finished) {
         /* r is a p-th power */
         long p, k, d;
         p = long(zz_p::modulus());
         d = deg(r)/p;
         f.rep.SetLength(d+1);
         for (k = 0; k <= d; k++) 
            f.rep[k] = r.rep[k*p];
         m = m*p;
      }
   } while (!finished);
}
         


static
void NullSpace(long& r, vec_long& D, vec_vec_zz_p& M, long verbose)
{
   long k, l, n;
   long i, j;
   long pos;
   zz_p t1, t2;
   zz_p *x, *y;

   n = M.length();

   D.SetLength(n);
   for (j = 0; j < n; j++) D[j] = -1;

   long p = zz_p::modulus();
   double pinv = zz_p::ModulusInverse();
   long T1, T2;
   mulmod_precon_t T1pinv;

   r = 0;

   l = 0;
   for (k = 0; k < n; k++) {

      if (verbose && k % 10 == 0) cerr << "+";

      pos = -1;
      for (i = l; i < n; i++) {
         if (!IsZero(M[i][k])) {
            pos = i;
            break;
         }
      }

      if (pos != -1) {
         swap(M[pos], M[l]);

         // make M[l, k] == -1 mod p

         inv(t1, M[l][k]);
         negate(t1, t1);
         for (j = k+1; j < n; j++) {
            mul(M[l][j], M[l][j], t1);
         }

         for (i = l+1; i < n; i++) {
            // M[i] = M[i] + M[l]*M[i,k]

            t1 = M[i][k];

            T1 = rep(t1);
            T1pinv = PrepMulModPrecon(T1, p, pinv); // ((double) T1)*pinv;

            x = M[i].elts() + (k+1);
            y = M[l].elts() + (k+1);

            for (j = k+1; j < n; j++, x++, y++) {
               // *x = *x + (*y)*t1

               T2 = MulModPrecon(rep(*y), T1, p, T1pinv);
               T2 = AddMod(T2, rep(*x), p);
               (*x).LoopHole() = T2;
            }
         }

         D[k] = l;   // variable k is defined by row l
         l++;

      }
      else {
         r++;
      }
   }
}



static
void BuildMatrix(vec_vec_zz_p& M, 
                 long n, const zz_pX& g, const zz_pXModulus& F, long verbose)
{
   long i, j, m;
   zz_pXMultiplier G;
   zz_pX h;

   M.SetLength(n);
   for (i = 0; i < n; i++)
      M[i].SetLength(n);

   build(G, g, F);

   set(h);
   for (j = 0; j < n; j++) {
      if (verbose && j % 10 == 0) cerr << "+";

      m = deg(h);
      for (i = 0; i < n; i++) {
         if (i <= m)
            M[i][j] = h.rep[i];
         else
            clear(M[i][j]);
      }

      if (j < n-1)
         MulMod(h, h, G, F);
   }

   for (i = 0; i < n; i++)
      add(M[i][i], M[i][i], -1);

}



static
void RecFindRoots(vec_zz_p& x, const zz_pX& f)
{
   if (deg(f) == 0) return;

   if (deg(f) == 1) {
      long k = x.length();
      x.SetLength(k+1);
      negate(x[k], ConstTerm(f));
      return;
   }
      
   zz_pX h;

   zz_p r;

   long p1 = zz_p::modulus() >> 1;

   {
      zz_pXModulus F;
      build(F, f);

      do {
         random(r);
         PowerXPlusAMod(h, r, p1, F);
         add(h, h, -1);
         GCD(h, h, f);
      } while (deg(h) <= 0 || deg(h) == deg(f));
   }

   RecFindRoots(x, h);
   div(h, f, h); 
   RecFindRoots(x, h);
}

void FindRoots(vec_zz_p& x, const zz_pX& ff)
{
   zz_pX f = ff;

   x.SetMaxLength(deg(f));
   x.SetLength(0);
   RecFindRoots(x, f);
}


static
void RandomBasisElt(zz_pX& g, const vec_long& D, 
                    const vec_vec_zz_p& M)
{
   zz_p t1, t2;

   long n = D.length();

   long i, j, s;

   g.rep.SetLength(n);

   vec_zz_p& v = g.rep;

   for (j = n-1; j >= 0; j--) {
      if (D[j] == -1)
         random(v[j]);
      else {
         i = D[j];

         // v[j] = sum_{s=j+1}^{n-1} v[s]*M[i,s]

         clear(t1);

         for (s = j+1; s < n; s++) {
            mul(t2, v[s], M[i][s]);
            add(t1, t1, t2);
         }

         v[j] = t1;
      }
   }

   g.normalize();
}



static
void split(zz_pX& f1, zz_pX& g1, zz_pX& f2, zz_pX& g2,
           const zz_pX& f, const zz_pX& g, 
           const vec_zz_p& roots, long lo, long mid)
{
   long r = mid-lo+1;

   zz_pXModulus F;
   build(F, f);

   vec_zz_p lroots(INIT_SIZE, r);
   long i;

   for (i = 0; i < r; i++)
      lroots[i] = roots[lo+i];


   zz_pX h, a, d;
   BuildFromRoots(h, lroots);
   CompMod(a, h, g, F);


   GCD(f1, a, f);
   
   div(f2, f, f1);

   rem(g1, g, f1);
   rem(g2, g, f2);
}

static
void RecFindFactors(vec_zz_pX& factors, const zz_pX& f, const zz_pX& g,
                    const vec_zz_p& roots, long lo, long hi)
{
   long r = hi-lo+1;

   if (r == 0) return;

   if (r == 1) {
      append(factors, f);
      return;
   }

   zz_pX f1, g1, f2, g2;

   long mid = (lo+hi)/2;

   split(f1, g1, f2, g2, f, g, roots, lo, mid);

   RecFindFactors(factors, f1, g1, roots, lo, mid);
   RecFindFactors(factors, f2, g2, roots, mid+1, hi);
}


static
void FindFactors(vec_zz_pX& factors, const zz_pX& f, const zz_pX& g,
                 const vec_zz_p& roots)
{
   long r = roots.length();

   factors.SetMaxLength(r);
   factors.SetLength(0);

   RecFindFactors(factors, f, g, roots, 0, r-1);
}

#if 0

static
void IterFindFactors(vec_zz_pX& factors, const zz_pX& f,
                     const zz_pX& g, const vec_zz_p& roots)
{
   long r = roots.length();
   long i;
   zz_pX h;

   factors.SetLength(r);

   for (i = 0; i < r; i++) {
      sub(h, g, roots[i]);
      GCD(factors[i], f, h);
   }
}

#endif

   

void SFBerlekamp(vec_zz_pX& factors, const zz_pX& ff, long verbose)
{
   zz_pX f = ff;

   if (!IsOne(LeadCoeff(f)))
      Error("SFBerlekamp: bad args");

   if (deg(f) == 0) {
      factors.SetLength(0);
      return;
   }

   if (deg(f) == 1) {
      factors.SetLength(1);
      factors[0] = f;
      return;
   }

   double t;

   long p;

   p = zz_p::modulus();

   long n = deg(f);

   zz_pXModulus F;

   build(F, f);

   zz_pX g, h;

   if (verbose) { cerr << "computing X^p..."; t = GetTime(); }
   PowerXMod(g, p, F);
   if (verbose) { cerr << (GetTime()-t) << "\n"; }

   vec_long D;
   long r;

   vec_vec_zz_p M;

   if (verbose) { cerr << "building matrix..."; t = GetTime(); }
   BuildMatrix(M, n, g, F, verbose);
   if (verbose) { cerr << (GetTime()-t) << "\n"; }

   if (verbose) { cerr << "diagonalizing..."; t = GetTime(); }
   NullSpace(r, D, M, verbose);
   if (verbose) { cerr << (GetTime()-t) << "\n"; }


   if (verbose) cerr << "number of factors = " << r << "\n";

   if (r == 1) {
      factors.SetLength(1);
      factors[0] = f;
      return;
   }

   if (verbose) { cerr << "factor extraction..."; t = GetTime(); }

   vec_zz_p roots;

   RandomBasisElt(g, D, M);
   MinPolyMod(h, g, F, r);
   if (deg(h) == r) M.kill();
   FindRoots(roots, h);
   FindFactors(factors, f, g, roots);

   zz_pX g1;
   vec_zz_pX S, S1;
   long i;

   while (factors.length() < r) {
      if (verbose) cerr << "+";
      RandomBasisElt(g, D, M);
      S.kill();
      for (i = 0; i < factors.length(); i++) {
         const zz_pX& f = factors[i];
         if (deg(f) == 1) {
            append(S, f);
            continue;
         }
         build(F, f);
         rem(g1, g, F);
         if (deg(g1) <= 0) {
            append(S, f);
            continue;
         }
         MinPolyMod(h, g1, F, min(deg(f), r-factors.length()+1));
         FindRoots(roots, h);
         S1.kill();
         FindFactors(S1, f, g1, roots);
         append(S, S1);
      }
      swap(factors, S);
   }

   if (verbose) { cerr << (GetTime()-t) << "\n"; }

   if (verbose) {
      cerr << "degrees:";
      long i;
      for (i = 0; i < factors.length(); i++)
         cerr << " " << deg(factors[i]);
      cerr << "\n";
   }
}


void berlekamp(vec_pair_zz_pX_long& factors, const zz_pX& f, long verbose)
{
   double t;
   vec_pair_zz_pX_long sfd;
   vec_zz_pX x;

   if (!IsOne(LeadCoeff(f)))
      Error("berlekamp: bad args");

   if (verbose) { cerr << "square-free decomposition..."; t = GetTime(); }
   SquareFreeDecomp(sfd, f);
   if (verbose) cerr << (GetTime()-t) << "\n";

   factors.SetLength(0);

   long i, j;

   for (i = 0; i < sfd.length(); i++) {
      if (verbose) {
         cerr << "factoring multiplicity " << sfd[i].b 
              << ", deg = " << deg(sfd[i].a) << "\n";
      }

      SFBerlekamp(x, sfd[i].a, verbose);

      for (j = 0; j < x.length(); j++)
         append(factors, cons(x[j], sfd[i].b));
   }
}



static
void AddFactor(vec_pair_zz_pX_long& factors, const zz_pX& g, long d, long verbose)
{
   if (verbose)
      cerr << "degree=" << d << ", number=" << deg(g)/d << "\n";
   append(factors, cons(g, d));
}

static
void ProcessTable(zz_pX& f, vec_pair_zz_pX_long& factors, 
                  const zz_pXModulus& F, long limit, const vec_zz_pX& tbl,
                  long d, long verbose)

{
   if (limit == 0) return;

   if (verbose) cerr << "+";

   zz_pX t1;

   if (limit == 1) {
      GCD(t1, f, tbl[0]);
      if (deg(t1) > 0) {
         AddFactor(factors, t1, d, verbose);
         div(f, f, t1);
      }

      return;
   }

   long i;

   t1 = tbl[0];
   for (i = 1; i < limit; i++)
      MulMod(t1, t1, tbl[i], F);

   GCD(t1, f, t1);

   if (deg(t1) == 0) return;

   div(f, f, t1);

   zz_pX t2;

   i = 0;
   d = d - limit + 1;

   while (2*d <= deg(t1)) {
      GCD(t2, tbl[i], t1); 
      if (deg(t2) > 0) {
         AddFactor(factors, t2, d, verbose);
         div(t1, t1, t2);
      }

      i++;
      d++;
   }

   if (deg(t1) > 0)
      AddFactor(factors, t1, deg(t1), verbose);
}


void TraceMap(zz_pX& w, const zz_pX& a, long d, const zz_pXModulus& F, 
              const zz_pX& b)

{
   if (d < 0) Error("TraceMap: bad args");

   zz_pX y, z, t;

   z = b;
   y = a;
   clear(w);

   while (d) {
      if (d == 1) {
         if (IsZero(w)) 
            w = y;
         else {
            CompMod(w, w, z, F);
            add(w, w, y);
         }
      }
      else if ((d & 1) == 0) {
         Comp2Mod(z, t, z, y, z, F);
         add(y, t, y);
      }
      else if (IsZero(w)) {
         w = y;
         Comp2Mod(z, t, z, y, z, F);
         add(y, t, y);
      }
      else {
         Comp3Mod(z, t, w, z, y, w, z, F);
         add(w, w, y);
         add(y, t, y);
      }

      d = d >> 1;
   }
}


void PowerCompose(zz_pX& y, const zz_pX& h, long q, const zz_pXModulus& F)
{
   if (q < 0) Error("PowerCompose: bad args");

   zz_pX z(INIT_SIZE, F.n);
   long sw;

   z = h;
   SetX(y);

   while (q) {
      sw = 0;

      if (q > 1) sw = 2;
      if (q & 1) {
         if (IsX(y))
            y = z;
         else
            sw = sw | 1;
      }

      switch (sw) {
      case 0:
         break;

      case 1:
         CompMod(y, y, z, F);
         break;

      case 2:
         CompMod(z, z, z, F);
         break;

      case 3:
         Comp2Mod(y, z, y, z, z, F);
         break;
      }

      q = q >> 1;
   }
}


long ProbIrredTest(const zz_pX& f, long iter)
{
   long n = deg(f);

   if (n <= 0) return 0;
   if (n == 1) return 1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产污污免费网站入口 | 久久一夜天堂av一区二区三区| 亚洲一区二区三区中文字幕| 99在线热播精品免费| 国产精品国产成人国产三级| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲人成在线播放网站岛国| 欧美私人免费视频| 日韩精品一级中文字幕精品视频免费观看 | 亚洲欧美自拍偷拍色图| 91在线观看污| 亚洲午夜免费电影| 欧美一区二区不卡视频| 狠狠色丁香久久婷婷综| 国产精品国产馆在线真实露脸 | 欧美伊人久久久久久久久影院| 偷拍与自拍一区| 国产女主播视频一区二区| 99免费精品在线观看| 偷拍自拍另类欧美| 国产人久久人人人人爽| 在线视频一区二区三区| 奇米色一区二区| 国产精品色在线| 欧美日韩中文一区| 国产真实乱子伦精品视频| 中文字幕av一区二区三区高| 欧美体内she精高潮| 国产在线一区二区综合免费视频| 国产精品久久久久影院老司| 欧美日韩精品欧美日韩精品| 国产成人在线色| 日日夜夜精品视频天天综合网| 久久久久青草大香线综合精品| 日本韩国一区二区三区视频| 久久66热偷产精品| 一区二区三区免费看视频| 欧美xxxxxxxxx| 欧美四级电影在线观看| 高清成人在线观看| 奇米精品一区二区三区四区| 中文在线一区二区| 日韩欧美国产综合一区| 9人人澡人人爽人人精品| 免费观看在线综合| 亚洲最大的成人av| 欧美国产一区二区在线观看| 8v天堂国产在线一区二区| 波多野结衣精品在线| 激情综合色综合久久| 亚洲一区二区三区四区的 | 91丨porny丨最新| 久久精品国内一区二区三区| 亚洲综合一区二区精品导航| 国产婷婷色一区二区三区| 51久久夜色精品国产麻豆| 91看片淫黄大片一级在线观看| 麻豆国产精品777777在线| 午夜精品久久久久久久久久 | 91麻豆蜜桃一区二区三区| 免费xxxx性欧美18vr| 午夜伊人狠狠久久| 一区二区三区不卡在线观看| 国产精品久久久久久久浪潮网站| 26uuu久久天堂性欧美| 欧美一区二区三区啪啪| 91精品国产福利在线观看| 欧美日韩国产乱码电影| 成人久久18免费网站麻豆| 久久9热精品视频| 久久精品噜噜噜成人88aⅴ| 日日夜夜精品视频天天综合网| 亚洲 欧美综合在线网络| 日韩美女啊v在线免费观看| 日本一区二区三区四区| 久久久精品影视| xf在线a精品一区二区视频网站| 91一区二区三区在线观看| 美女视频网站久久| 国产精品电影一区二区| 久久久久久久免费视频了| 日韩欧美电影在线| 欧美亚洲国产怡红院影院| 国产99精品国产| 国产精品中文字幕欧美| 全国精品久久少妇| 一色桃子久久精品亚洲| 自拍偷在线精品自拍偷无码专区 | 日韩精品每日更新| 亚洲高清在线视频| 亚洲一区二区三区在线| 一区二区三区日韩欧美| 中文字幕一区三区| 国产精品久久久久久一区二区三区| 日韩欧美中文一区| 欧美日韩激情一区| 在线免费亚洲电影| 色爱区综合激月婷婷| 精品亚洲欧美一区| 青青草国产成人99久久| 五月婷婷欧美视频| 首页国产欧美久久| 秋霞影院一区二区| 亚洲一级在线观看| 亚洲天天做日日做天天谢日日欢| 亚洲女同一区二区| 亚洲激情一二三区| 亚洲成va人在线观看| 日韩av一区二| 极品瑜伽女神91| 国产精华液一区二区三区| 国产一区在线不卡| 91蜜桃免费观看视频| 91首页免费视频| 欧美午夜一区二区| 欧美一区二区在线观看| 日韩三级视频中文字幕| 久久色.com| 亚洲国产精品99久久久久久久久 | 亚洲美女区一区| 亚洲第一成人在线| 亚洲尤物视频在线| 国产精品99久久久久| 成人18精品视频| 欧美自拍丝袜亚洲| 制服丝袜av成人在线看| 精品久久久久久无| 一色桃子久久精品亚洲| 日韩精品一卡二卡三卡四卡无卡| 成人av在线播放网站| 欧美怡红院视频| 亚洲精品一线二线三线| 国产精品美女久久久久久久久久久 | 国产经典欧美精品| 91在线高清观看| 日韩欧美国产综合在线一区二区三区 | 中文字幕在线不卡| 青青草国产成人99久久| 成人禁用看黄a在线| 91国产福利在线| 亚洲综合色视频| 国产在线不卡视频| 欧美午夜一区二区三区免费大片| 久久伊人蜜桃av一区二区| 亚洲一区二区高清| 岛国av在线一区| 欧美精品一区二区三区很污很色的| 中文字幕一区二区在线观看| 奇米影视7777精品一区二区| 99在线精品一区二区三区| 精品欧美黑人一区二区三区| 亚洲激情图片qvod| 91丨九色丨国产丨porny| 欧美xxxx在线观看| 午夜电影一区二区| 99精品视频在线观看免费| 欧美成人伊人久久综合网| 亚洲精品视频在线| av一二三不卡影片| 久久久久青草大香线综合精品| 亚洲高清在线精品| 色综合久久久久久久久久久| 久久久不卡网国产精品一区| 日本欧美韩国一区三区| 欧美日本精品一区二区三区| 亚洲乱码国产乱码精品精小说 | 国产午夜亚洲精品午夜鲁丝片| 免费高清视频精品| 色94色欧美sute亚洲线路一ni | 中文在线免费一区三区高中清不卡| 免费成人性网站| 欧美精品黑人性xxxx| 亚洲男人的天堂av| 成人久久18免费网站麻豆 | 精品国产不卡一区二区三区| 久久97超碰国产精品超碰| 制服.丝袜.亚洲.另类.中文 | 粗大黑人巨茎大战欧美成人| 精品免费一区二区三区| 奇米在线7777在线精品| 欧美日韩国产一区| 亚洲精品午夜久久久| 91国产免费观看| 亚洲精品亚洲人成人网| 色婷婷国产精品久久包臀| 136国产福利精品导航| 国产69精品久久久久777| 精品欧美一区二区三区精品久久| 国产成人综合在线| 国产色爱av资源综合区| 国产盗摄女厕一区二区三区| 精品国产乱码久久| 国产精品自拍av| 国产亚洲精品aa| voyeur盗摄精品| 亚洲美女屁股眼交3| 91麻豆国产福利在线观看| 亚洲黄色在线视频| 欧美日韩成人一区二区| 午夜欧美2019年伦理|