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

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

?? zz_pxfactoring.cpp

?? 大數運算類
?? CPP
?? 第 1 頁 / 共 3 頁
字號:

#include <NTL/ZZ_pXFactoring.h>
#include <NTL/vec_ZZVec.h>
#include <NTL/fileio.h>
#include <NTL/FacVec.h>

#include <stdio.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;
         conv(p, 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_ZZVec& M, long verbose)
{
   long k, l, n;
   long i, j;
   long pos;
   ZZ t1, t2;
   ZZ *x, *y;

   const ZZ& p = ZZ_p::modulus();

   n = M.length();

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

   r = 0;

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

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

      pos = -1;
      for (i = l; i < n; i++) {
         rem(t1, M[i][k], p);
         M[i][k] = t1;
         if (pos == -1 && !IsZero(t1))
            pos = i;
      }

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

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

         InvMod(t1, M[l][k], p);
         NegateMod(t1, t1, p);
         for (j = k+1; j < n; j++) {
            rem(t2, M[l][j], p);
            MulMod(M[l][j], t2, t1, p);
         }

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

            t1 = M[i][k];   // this is already reduced

            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

               mul(t2, *y, t1);
               add(*x, *x, t2);
            }
         }

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

      }
      else {
         r++;
      }
   }
}



static
void BuildMatrix(vec_ZZVec& M, long n, const ZZ_pX& g, const ZZ_pXModulus& F,
                 long verbose)
{
   long i, j, m;
   ZZ_pXMultiplier G;
   ZZ_pX h;

   ZZ t;
   sqr(t, ZZ_p::modulus());
   mul(t, t, n);

   long size = t.size();

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

   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] = rep(h.rep[i]);
         else
            clear(M[i][j]);
      }

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

   for (i = 0; i < n; i++)
      AddMod(M[i][i], M[i][i], -1, ZZ_p::modulus());

}



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;
   ZZ p1;


   RightShift(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;

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

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


static
void RandomBasisElt(ZZ_pX& g, const vec_long& D, const vec_ZZVec& M)
{
   ZZ 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, rep(v[s]), M[i][s]);
            add(t1, t1, t2);
         }

         conv(v[j], t1);
      }
   }
}



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;

   const ZZ& 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_ZZVec 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)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区精品在线播放| 欧美一区二区在线不卡| 欧美怡红院视频| 日韩午夜av一区| 1024成人网| 国产一区二区成人久久免费影院| 国产精品456| 7777精品伊人久久久大香线蕉完整版| 国产亚洲欧美色| 老色鬼精品视频在线观看播放| 色综合久久久久综合| 久久久久久**毛片大全| 日韩电影在线免费看| 成人h精品动漫一区二区三区| 欧美一级黄色录像| 午夜私人影院久久久久| 97久久精品人人爽人人爽蜜臀| 精品久久久久久综合日本欧美| 亚洲国产精品综合小说图片区| 国产二区国产一区在线观看| 欧美一区二区在线播放| 午夜精品久久久久久久99樱桃| av电影在线不卡| 中文字幕乱码一区二区免费| 久久精品99国产精品| 制服丝袜一区二区三区| 亚洲不卡av一区二区三区| 91精品福利视频| 亚洲日本在线天堂| 91在线无精精品入口| 中文字幕亚洲一区二区av在线| 国产精品一区二区免费不卡 | 亚洲精品国产精品乱码不99| 国产suv精品一区二区三区| 欧美精品一区二区三区蜜桃视频| 日本中文字幕一区二区视频| 7878成人国产在线观看| 日韩av一二三| 欧美电影免费观看完整版| 日本亚洲欧美天堂免费| 日韩欧美中文字幕一区| 国内精品免费**视频| 久久久亚洲国产美女国产盗摄 | 成人国产免费视频| 亚洲欧美一区二区在线观看| 成人在线视频一区二区| 亚洲色图欧美偷拍| 欧洲一区二区av| 日韩精品亚洲一区| 精品区一区二区| 国产成人av福利| 亚洲色图一区二区| 欧美三级电影在线观看| 青娱乐精品视频| www一区二区| eeuss鲁片一区二区三区| 亚洲视频一区二区在线| 欧美日韩国产一级| 韩国精品在线观看| 亚洲欧美色一区| 欧美伦理视频网站| 国产成人在线视频免费播放| 亚洲欧洲日产国产综合网| 欧美日韩一区二区在线视频| 美女视频黄 久久| 国产精品久久久久久久久晋中 | 亚洲综合视频网| 欧美一区二区在线不卡| 国产成a人亚洲精品| 亚洲综合在线观看视频| 精品粉嫩超白一线天av| 色综合天天综合色综合av| 日韩高清在线一区| 国产精品欧美久久久久一区二区 | 日韩一区二区三区视频在线 | 欧美日本在线观看| 成人免费视频网站在线观看| 午夜电影久久久| 国产精品日韩精品欧美在线| 这里是久久伊人| 99re在线视频这里只有精品| 美腿丝袜在线亚洲一区| 亚洲图片另类小说| 欧美成人免费网站| 日本高清成人免费播放| 国产精品综合一区二区三区| 亚洲va国产va欧美va观看| 国产欧美日韩另类视频免费观看| 欧美丝袜丝交足nylons| 成人涩涩免费视频| 久久成人久久爱| 亚洲成a人v欧美综合天堂| 国产精品久久久久一区二区三区共| 在线播放视频一区| 在线看国产一区| 成人永久免费视频| 国内国产精品久久| 老司机精品视频在线| 亚洲高清久久久| 一区二区三区在线免费视频| 国产欧美中文在线| 久久午夜羞羞影院免费观看| 欧美疯狂性受xxxxx喷水图片| 99精品欧美一区二区蜜桃免费| 国产一本一道久久香蕉| 久久国产人妖系列| 美女视频黄频大全不卡视频在线播放| 亚洲国产aⅴ成人精品无吗| 亚洲丝袜自拍清纯另类| 最近中文字幕一区二区三区| 国产喷白浆一区二区三区| 久久综合九色综合97婷婷女人| 欧美高清视频www夜色资源网| 欧美色窝79yyyycom| 91福利在线看| 91福利国产精品| 日本福利一区二区| 欧美亚男人的天堂| 精品视频一区二区不卡| 欧美色倩网站大全免费| 欧美日韩精品电影| 91精品啪在线观看国产60岁| 欧美精品在线一区二区| 欧美一区二区三区在线观看视频| 欧美日韩综合不卡| 欧美疯狂性受xxxxx喷水图片| 在线不卡一区二区| 日韩一区二区精品葵司在线| 精品国内二区三区| 久久五月婷婷丁香社区| 久久久国产精品麻豆| 国产精品水嫩水嫩| 亚洲最色的网站| 天天综合色天天综合| 麻豆成人免费电影| 粉嫩高潮美女一区二区三区| jlzzjlzz国产精品久久| 在线亚洲精品福利网址导航| 欧美色男人天堂| 久久视频一区二区| 最新热久久免费视频| 玉足女爽爽91| 看电视剧不卡顿的网站| 成人一级片在线观看| 日本精品视频一区二区三区| 欧美一区中文字幕| 国产欧美一区二区三区鸳鸯浴| 亚洲欧洲国产日韩| 日韩成人免费电影| 国产精品99久| 欧美成人一区二区三区| 久久久一区二区三区| 亚洲日本护士毛茸茸| 肉肉av福利一精品导航| 国产精品888| 欧美亚一区二区| 国产日本欧洲亚洲| 亚洲成人精品一区| 国产成人在线色| 欧美日韩国产中文| 国产精品入口麻豆原神| 日韩二区三区四区| 91丝袜美腿高跟国产极品老师 | 日本高清视频一区二区| 久久久影院官网| 亚洲国产日韩av| 成人免费看视频| 日韩欧美激情四射| 依依成人综合视频| 国产成人精品三级| 538在线一区二区精品国产| 欧美韩国日本不卡| 老汉av免费一区二区三区| 色综合久久精品| 国产女人水真多18毛片18精品视频 | 亚洲视频每日更新| 国产精品一区二区不卡| 91精品国产麻豆| 亚洲国产欧美在线人成| 99久久精品99国产精品| 国产欧美一区二区三区网站| 免费精品视频最新在线| 欧美性猛交xxxxxxxx| 亚洲欧洲成人精品av97| 国产91精品在线观看| 精品国产一区二区三区四区四| 亚洲与欧洲av电影| 色综合视频在线观看| 中文字幕在线视频一区| 国产一区二区三区高清播放| 日韩一区二区视频在线观看| 一区二区三区在线播放| 91色视频在线| 成人免费在线观看入口| 成人av网址在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 精品亚洲免费视频| 欧美精品一区二| 国产一区91精品张津瑜| 久久久久99精品国产片|