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

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

?? lzz_pxfactoring.cpp

?? 一個比較通用的大數運算庫
?? 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人在线观看导航 | 欧美精品一区在线观看| 国产精品女主播在线观看| 婷婷中文字幕综合| aaa国产一区| 久久亚洲一级片| 天堂久久久久va久久久久| 9i看片成人免费高清| 日韩视频免费观看高清完整版 | 午夜不卡av免费| 9久草视频在线视频精品| 精品国产乱码91久久久久久网站| 一区二区三区四区高清精品免费观看| 国产大陆a不卡| 精品国产一区二区三区久久影院| 五月激情六月综合| 欧美午夜精品理论片a级按摩| 国产精品久久久久久久久免费桃花 | 久久久久久久国产精品影院| 日韩电影免费在线看| 在线视频一区二区免费| 亚洲人成网站精品片在线观看| 国产老肥熟一区二区三区| 精品成人在线观看| 激情五月播播久久久精品| 日韩限制级电影在线观看| 日韩激情视频在线观看| 欧美日韩精品电影| 亚洲大片免费看| 欧美日韩综合在线| 视频一区欧美精品| 欧美精品乱码久久久久久按摩| 亚洲一区二区三区精品在线| 91精品1区2区| 香蕉乱码成人久久天堂爱免费| 欧美性色aⅴ视频一区日韩精品| 亚洲猫色日本管| 欧美中文字幕一二三区视频| 有坂深雪av一区二区精品| 欧美四级电影在线观看| 日韩中文字幕一区二区三区| 欧美一区二区在线观看| 久久国产视频网| 欧美国产综合一区二区| 91在线视频免费观看| 亚洲最大色网站| 555www色欧美视频| 激情综合网av| 国产精品久久久久久久久果冻传媒 | 91国产福利在线| 日本vs亚洲vs韩国一区三区 | 欧美美女激情18p| 免费观看成人鲁鲁鲁鲁鲁视频| 日韩精品一区二区三区四区| 国产综合色视频| 国产精品久久久久9999吃药| 在线亚洲高清视频| 美女高潮久久久| 久久久久久久久久久久电影| 91丨国产丨九色丨pron| 午夜影视日本亚洲欧洲精品| 久久久精品综合| 色婷婷国产精品综合在线观看| 亚洲1区2区3区4区| 国产清纯美女被跳蛋高潮一区二区久久w | 秋霞国产午夜精品免费视频| 欧美大肚乱孕交hd孕妇| bt7086福利一区国产| 亚洲18影院在线观看| 久久久噜噜噜久久人人看| 91视频观看视频| 麻豆91精品视频| 亚洲欧美日韩国产另类专区| 欧美一级高清片| 成人av电影在线网| 日韩精品色哟哟| 18欧美乱大交hd1984| 日韩欧美国产高清| 91国在线观看| 成人的网站免费观看| 日本成人中文字幕| 一区二区三区四区精品在线视频| 精品乱码亚洲一区二区不卡| 色哟哟在线观看一区二区三区| 理论电影国产精品| 亚洲尤物在线视频观看| 国产欧美日韩另类一区| 日韩欧美一区二区在线视频| 97久久精品人人澡人人爽| 狠狠色狠狠色综合| 亚洲gay无套男同| 一区二区三区在线视频播放| 中文在线一区二区| 久久久久久久免费视频了| 欧美日韩国产在线播放网站| 97se亚洲国产综合在线| 国产精品99久久久久久久vr| 美女视频黄 久久| 日韩黄色免费电影| 午夜久久久久久久久久一区二区| 国产精品短视频| 国产欧美一区二区三区沐欲| 精品国产欧美一区二区| 欧美一区二区美女| 欧美日韩三级一区| 在线精品视频一区二区三四| 成人激情电影免费在线观看| 丁香婷婷综合色啪| 国产成人高清在线| 国产精品 日产精品 欧美精品| 国产一区三区三区| 国内精品免费在线观看| 国产精品一二三在| 国产成人免费视频精品含羞草妖精| 国产一区二区影院| 韩国v欧美v亚洲v日本v| 麻豆成人av在线| 国产在线观看免费一区| 国产成人精品亚洲日本在线桃色| 国产精品综合一区二区三区| 国产福利91精品| av日韩在线网站| 日本乱人伦aⅴ精品| 色欧美88888久久久久久影院| 91麻豆自制传媒国产之光| 99久久er热在这里只有精品66| 色噜噜狠狠色综合欧洲selulu| 91免费在线看| 欧美久久久久中文字幕| 日韩一区二区在线观看视频 | 在线综合+亚洲+欧美中文字幕| 欧美日韩1区2区| 欧美一级片免费看| 久久精品男人的天堂| 国产精品理伦片| 亚洲精品中文在线| 日韩国产欧美一区二区三区| 精品无码三级在线观看视频| 丁香亚洲综合激情啪啪综合| 欧美亚洲图片小说| 欧美一区二区国产| 中文一区二区在线观看| 尤物av一区二区| 亚洲午夜久久久| 九九**精品视频免费播放| 国产v日产∨综合v精品视频| 91官网在线免费观看| 日韩欧美一区二区免费| 成人h动漫精品一区二区| 狠狠色狠狠色综合系列| 国产另类ts人妖一区二区| 国产精品99久久不卡二区| 国产精品亚洲午夜一区二区三区| 国产成人综合亚洲网站| 97精品超碰一区二区三区| 91猫先生在线| 欧美精品一区二区在线观看| 国产精品久久毛片av大全日韩| 亚洲视频小说图片| 精品一区二区免费视频| 色综合久久综合| 精品国产成人在线影院 | 亚洲国产视频在线| 国产69精品久久久久777| 欧美午夜电影在线播放| 久久久亚洲精品石原莉奈| 亚洲美女偷拍久久| 丰满放荡岳乱妇91ww| 欧美一区二区女人| 亚洲午夜电影在线| 99久久精品国产精品久久| 欧美mv和日韩mv的网站| 亚洲综合色在线| 色综合久久综合中文综合网| 国产精品国产自产拍高清av| 成人综合日日夜夜| 久久久不卡网国产精品二区| 韩国av一区二区| 欧美日韩一区二区三区四区五区| 亚洲色图在线视频| 精品88久久久久88久久久| 日韩一区和二区| 久久99国内精品| 亚洲成人综合在线| 亚洲免费高清视频在线| 日本一区二区三区免费乱视频| 91亚洲精品一区二区乱码| 69堂亚洲精品首页| 天天综合网天天综合色| 欧美亚洲综合一区| 欧美a一区二区| 国产欧美一区在线| 欧美日韩国产中文| 国产精品美女久久久久久久| 亚洲永久精品大片| 亚洲www啪成人一区二区麻豆 | 国产精品乱码久久久久久|