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

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

?? zzxfactoring.cpp

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

#include <NTL/ZZXFactoring.h>
#include <NTL/lzz_pXFactoring.h>
#include <NTL/vec_vec_long.h>
#include <NTL/vec_vec_ulong.h>
#include <NTL/vec_double.h>

#include <NTL/LLL.h>

#include <NTL/new.h>

NTL_START_IMPL

long ZZXFac_van_Hoeij = 1;

static
long ok_to_abandon = 0;

struct LocalInfoT {
   long n;
   long NumPrimes;
   long NumFactors;
   vec_long p;
   vec_vec_long pattern;
   ZZ PossibleDegrees;
   PrimeSeq s;
};



static
void mul(ZZ_pX& x, vec_ZZ_pX& a)
// this performs multiplications in close-to-optimal order,
// and kills a in the process
{
   long n = a.length();

   // first, deal with some trivial cases

   if (n == 0) {
      set(x);
      a.kill();
      return;
   }
   else if (n == 1) {
      x = a[0];
      a.kill();
      return;
   }

   long i, j;

   // assume n > 1 and all a[i]'s are nonzero

   // sort into non-increasing degrees

   for (i = 1; i <= n - 1; i++)
      for (j = 0; j <= n - i - 1; j++)
         if (deg(a[j]) < deg(a[j+1]))
            swap(a[j], a[j+1]);

   ZZ_pX g;

   while (n > 1) {
      // replace smallest two poly's by their product
      mul(g, a[n-2], a[n-1]);
      a[n-2].kill();
      a[n-1].kill();
      swap(g, a[n-2]);
      n--;

      // re-establish order

      i = n-1;
      while (i > 0 && deg(a[i-1]) < deg(a[i])) {
         swap(a[i-1], a[i]);
         i--;
      }
   }

   x = a[0];

   a[0].kill();
   a.SetLength(0);
}


void mul(ZZX& x, const vec_pair_ZZX_long& a)
{
   long l = a.length();
   ZZX res;
   long i, j;

   set(res);
   for (i = 0; i < l; i++)
      for (j = 0; j < a[i].b; j++)
         mul(res, res, a[i].a);

   x = res;
}


void SquareFreeDecomp(vec_pair_ZZX_long& u, const ZZX& ff)
// input is primitive 
{
   ZZX f = ff;

   ZZX d, v, w, s, t1;
   long i;

   u.SetLength(0);

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

   diff(t1, f);
   GCD(d, f, t1);

   if (deg(d) == 0) {
      append(u, cons(f, 1));
      return;
   }

   divide(v, f, d); 
   divide(w, t1, d);
   i = 0;

   for (;;) {
      i = i + 1;

      diff(t1, v);
      sub(s, w, t1);

      if (IsZero(s)) {
         if (deg(v) != 0) append(u, cons(v, i));
         return;
      }

      GCD(d, v, s);
      divide(v, v, d);
      divide(w, s, d);

      if (deg(d) != 0) append(u, cons(d, i));
   }
}




static
void HenselLift(ZZX& Gout, ZZX& Hout, ZZX& Aout, ZZX& Bout,
                const ZZX& f, const ZZX& g, const ZZX& h,
                const ZZX& a, const ZZX& b, const ZZ& p) 
{
   ZZX c, g1, h1, G, H, A, B;

   mul(c, g, h);
   sub(c, f, c);

   if (!divide(c, c, p))
      Error("inexact division");

   ZZ_pX cc, gg, hh, aa, bb, tt, gg1, hh1;

   conv(cc, c);
   conv(gg, g);
   conv(hh, h);
   conv(aa, a);
   conv(bb, b);

   ZZ_pXModulus GG;
   ZZ_pXModulus HH;

   build(GG, gg);
   build(HH, hh);

   ZZ_pXMultiplier AA;
   ZZ_pXMultiplier BB;

   build(AA, aa, HH);
   build(BB, bb, GG);

   rem(gg1, cc, GG);
   MulMod(gg1, gg1, BB, GG);
   
   rem(hh1, cc, HH);
   MulMod(hh1, hh1, AA, HH);

   conv(g1, gg1);
   mul(g1, g1, p);
   add(G, g, g1);

   conv(h1, hh1);
   mul(h1, h1, p);
   add(H, h, h1);

   /* lift inverses */

   ZZX t1, t2, r;

   mul(t1, a, G);
   mul(t2, b, H);
   add(t1, t1, t2);
   add(t1, t1, -1);
   negate(t1, t1);

   if (!divide(r, t1, p))
      Error("inexact division");

   ZZ_pX rr, aa1, bb1;

   conv(rr, r);
   
   rem(aa1, rr, HH);
   MulMod(aa1, aa1, AA, HH);
   rem(bb1, rr, GG);
   MulMod(bb1, bb1, BB, GG);

   ZZX a1, b1;

   conv(a1, aa1);
   mul(a1, a1, p);
   add(A, a, a1);

   conv(b1, bb1);
   mul(b1, b1, p);
   add(B, b, b1);

   Gout = G;
   Hout = H;
   Aout = A;
   Bout = B;
}

static
void HenselLift1(ZZX& Gout, ZZX& Hout, 
                const ZZX& f, const ZZX& g, const ZZX& h,
                const ZZX& a, const ZZX& b, const ZZ& p) 
{
   ZZX c, g1, h1, G, H;

   mul(c, g, h);
   sub(c, f, c);

   if (!divide(c, c, p))
      Error("inexact division");

   ZZ_pX cc, gg, hh, aa, bb, tt, gg1, hh1;

   conv(cc, c);
   conv(gg, g);
   conv(hh, h);
   conv(aa, a);
   conv(bb, b);

   ZZ_pXModulus GG;
   ZZ_pXModulus HH;

   build(GG, gg);
   build(HH, hh);

   rem(gg1, cc, GG);
   MulMod(gg1, gg1, bb, GG);
   
   rem(hh1, cc, HH);
   MulMod(hh1, hh1, aa, HH);

   conv(g1, gg1);
   mul(g1, g1, p);
   add(G, g, g1);

   conv(h1, hh1);
   mul(h1, h1, p);
   add(H, h, h1);

   Gout = G;
   Hout = H;
}

static
void BuildTree(vec_long& link, vec_ZZX& v, vec_ZZX& w,
               const vec_zz_pX& a)
{
   long k = a.length();

   if (k < 2) Error("bad arguments to BuildTree");

   vec_zz_pX V, W;

   V.SetLength(2*k-2);
   W.SetLength(2*k-2);
   link.SetLength(2*k-2);

   long i, j, s;
   long minp, mind;

   for (i = 0; i < k; i++) {
      V[i] = a[i];
      link[i] = -(i+1);
   }

   for (j = 0; j < 2*k-4; j += 2) {
      minp = j;
      mind = deg(V[j]);

      for (s = j+1; s < i; s++)
         if (deg(V[s]) < mind) {
            minp = s;
            mind = deg(V[s]);
         }

      swap(V[j], V[minp]);
      swap(link[j], link[minp]);

      minp = j+1;
      mind = deg(V[j+1]);

      for (s = j+2; s < i; s++)
         if (deg(V[s]) < mind) {
            minp = s;
            mind = deg(V[s]);
         }

      swap(V[j+1], V[minp]);
      swap(link[j+1], link[minp]);

      mul(V[i], V[j], V[j+1]);
      link[i] = j;
      i++;
   }

   zz_pX d;

   for (j = 0; j < 2*k-2; j += 2) {
      XGCD(d, W[j], W[j+1], V[j], V[j+1]);
      if (!IsOne(d))
         Error("relatively prime polynomials expected");
   }

   v.SetLength(2*k-2);
   for (j = 0; j < 2*k-2; j++)
      conv(v[j], V[j]);

   w.SetLength(2*k-2);
   for (j = 0; j < 2*k-2; j++)
      conv(w[j], W[j]);
}

static
void RecTreeLift(const vec_long& link, vec_ZZX& v, vec_ZZX& w,
                 const ZZ& p, const ZZX& f, long j, long inv)
{
   if (j < 0) return;

   if (inv)
      HenselLift(v[j], v[j+1], w[j], w[j+1],
                 f, v[j], v[j+1], w[j], w[j+1], p);
   else
      HenselLift1(v[j], v[j+1], f, v[j], v[j+1], w[j], w[j+1], p);

   RecTreeLift(link, v, w, p, v[j], link[j], inv);
   RecTreeLift(link, v, w, p, v[j+1], link[j+1], inv);
}

static
void TreeLift(const vec_long& link, vec_ZZX& v, vec_ZZX& w, 
              long e0, long e1, const ZZX& f, long inv)

// lift from p^{e0} to p^{e1}

{
   ZZ p0, p1;

   power(p0, zz_p::modulus(), e0);
   power(p1, zz_p::modulus(), e1-e0);

   ZZ_pBak bak;
   bak.save();
   ZZ_p::init(p1);

   RecTreeLift(link, v, w, p0, f, v.length()-2, inv);

   bak.restore();
} 

void MultiLift(vec_ZZX& A, const vec_zz_pX& a, const ZZX& f, long e,
               long verbose)

{
   long k = a.length();
   long i;

   if (k < 2 || e < 1 || NTL_OVERFLOW(e, 1, 0)) Error("MultiLift: bad args");

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

   for (i = 0; i < a.length(); i++)
      if (!IsOne(LeadCoeff(a[i])))
         Error("MultiLift: bad args");

   if (e == 1) {
      A.SetLength(k);
      for (i = 0; i < k; i++)
         conv(A[i], a[i]);
      return;
   }

   vec_long E;
   append(E, e);
   while (e > 1) {
      e = (e+1)/2;
      append(E, e);
   }
   long l = E.length();

   vec_ZZX v, w;
   vec_long link;

   double t;

   if (verbose) {
      cerr << "building tree...";
      t = GetTime();
   }

   BuildTree(link, v, w, a);

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


   for (i = l-1; i > 0; i--) {
      if (verbose) {
         cerr << "lifting to " << E[i-1] << "...";
         t = GetTime();
      }
      
      TreeLift(link, v, w, E[i], E[i-1], f, i != 1);

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

   A.SetLength(k);
   for (i = 0; i < 2*k-2; i++) {
      long t = link[i];
      if (t < 0)
         A[-(t+1)] = v[i];
   }
}

static
void inplace_rev(ZZX& f)
{
   long n = deg(f);
   long i, j;

   i = 0;
   j = n;
   while (i < j) {
      swap(f.rep[i], f.rep[j]);
      i++;
      j--;
   }

   f.normalize();
}

long ZZXFac_InitNumPrimes = 7;
long ZZXFac_MaxNumPrimes = 50;

static 
void RecordPattern(vec_long& pat, vec_pair_zz_pX_long& fac)
{
   long n = pat.length()-1;
   long i;

   for (i = 0; i <= n; i++)
      pat[i] = 0;

   long k = fac.length();

   for (i = 0; i < k; i++) {
      long d = fac[i].b;
      long m = deg(fac[i].a)/d;

      pat[d] = m;
   }
}

static
long NumFactors(const vec_long& pat)
{
   long n = pat.length()-1;

   long i;
   long res = 0;

   for (i = 0; i <= n; i++) 
      res += pat[i];

   return res;
}

static
void CalcPossibleDegrees(ZZ& pd, const vec_long& pat)
{
   long n = pat.length()-1;
   set(pd);

   long d, j;
   ZZ t1;

   for (d = 1; d <= n; d++) 
      for (j = 0; j < pat[d]; j++) {
         LeftShift(t1, pd, d);
         bit_or(pd, pd, t1);
      }
}

static 
void CalcPossibleDegrees(vec_ZZ& S, const vec_ZZ_pX& fac, long k)

// S[i] = possible degrees of the product of any subset of size k
//        among fac[i...], encoded as a bit vector.      

{
   long r = fac.length();

   S.SetLength(r);

   if (r == 0)
      return;

   if (k < 1 || k > r)
      Error("CalcPossibleDegrees: bad args");

   long i, l;
   ZZ old, t1;

   set(S[r-1]);
   LeftShift(S[r-1], S[r-1], deg(fac[r-1]));

   for (i = r-2; i >= 0; i--) {
      set(t1);
      LeftShift(t1, t1, deg(fac[i]));
      bit_or(S[i], t1, S[i+1]);
   }

   for (l = 2; l <= k; l++) {
      old = S[r-l];
      LeftShift(S[r-l], S[r-l+1], deg(fac[r-l]));

      for (i = r-l-1; i >= 0; i--) {
         LeftShift(t1, old, deg(fac[i]));
         old = S[i];
         bit_or(S[i], S[i+1], t1);
      }
   }
}



static
vec_zz_pX *
SmallPrimeFactorization(LocalInfoT& LocalInfo, const ZZX& f,
                            long verbose)

{
   long n = deg(f);
   long i;
   double t;

   LocalInfo.n = n;
   long& NumPrimes = LocalInfo.NumPrimes;
   NumPrimes = 0;

   LocalInfo.NumFactors = 0;

   // some sanity checking...

   if (ZZXFac_InitNumPrimes < 1 || ZZXFac_InitNumPrimes > 10000)
      Error("bad ZZXFac_InitNumPrimes");

   if (ZZXFac_MaxNumPrimes < ZZXFac_InitNumPrimes || ZZXFac_MaxNumPrimes > 10000)
      Error("bad ZZXFac_MaxNumPrimes");

   LocalInfo.p.SetLength(ZZXFac_InitNumPrimes);
   LocalInfo.pattern.SetLength(ZZXFac_InitNumPrimes);
  
   // set bits 0..n of LocalInfo.PossibleDegrees 
   SetBit(LocalInfo.PossibleDegrees, n+1);
   add(LocalInfo.PossibleDegrees, LocalInfo.PossibleDegrees, -1);

   long minr = n+1;
   long irred = 0;

   vec_pair_zz_pX_long *bestfac = 0;
   zz_pX *besth = 0;
   vec_zz_pX *spfactors = 0;
   zz_pContext bestp;
   long bestp_index;

   long maxroot = NextPowerOfTwo(deg(f))+1;

   for (; NumPrimes < ZZXFac_InitNumPrimes;) {
      long p = LocalInfo.s.next();
      if (!p) Error("out of small primes");
      if (divide(LeadCoeff(f), p)) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产欧美另类丝袜| 欧美一区二区三区四区高清| 91精品国产综合久久香蕉麻豆| 337p日本欧洲亚洲大胆色噜噜| 一二三四社区欧美黄| 国产精品一区在线| 日韩女优av电影| 亚洲国产精品一区二区久久| 91免费在线播放| 中文字幕欧美日韩一区| 国产一区二区在线视频| 精品国产免费久久| 丝袜美腿亚洲色图| 精品1区2区3区| 一区二区国产视频| 91婷婷韩国欧美一区二区| 中文在线免费一区三区高中清不卡| 久久国产精品免费| 日韩一卡二卡三卡国产欧美| 日韩电影在线观看网站| 欧美日本韩国一区二区三区视频| 亚洲乱码国产乱码精品精可以看| www.欧美日韩国产在线| 中文字幕精品—区二区四季| 国产成人av电影免费在线观看| 久久一留热品黄| 国产成人精品一区二区三区四区| 欧美本精品男人aⅴ天堂| 麻豆国产精品一区二区三区| 日韩欧美的一区| 精品系列免费在线观看| 欧美精品一区二区高清在线观看| 男人的j进女人的j一区| 日韩欧美久久久| 国产精品白丝jk黑袜喷水| 久久蜜桃av一区二区天堂| 国产电影一区在线| 亚洲欧美在线aaa| 在线观看视频一区二区 | 亚洲精品大片www| 日本丶国产丶欧美色综合| 亚洲综合无码一区二区| 6080午夜不卡| 精品一区二区三区视频| 国产午夜亚洲精品午夜鲁丝片| 成人性生交大片免费看中文| 亚洲丝袜另类动漫二区| 欧美亚洲一区二区在线| 欧美aa在线视频| 久久久久久久久久久电影| www.成人在线| 粉嫩高潮美女一区二区三区| 青青草精品视频| 欧美大片拔萝卜| 国产精品1区2区| 成人欧美一区二区三区白人 | 久久精品久久99精品久久| 欧美成人女星排名| 99久久免费视频.com| 丝袜美腿成人在线| 国产亚洲精品福利| 欧美天堂亚洲电影院在线播放| 玖玖九九国产精品| 亚洲欧美乱综合| 欧美成人精品3d动漫h| 99久久精品免费看国产| 免费成人结看片| 中文字幕制服丝袜一区二区三区 | 色综合久久久久网| 免费久久精品视频| 亚洲六月丁香色婷婷综合久久 | 日韩视频在线永久播放| 成人avav在线| 蜜臀精品久久久久久蜜臀| 亚洲欧美国产高清| 2020日本不卡一区二区视频| 欧美日韩不卡一区二区| a级高清视频欧美日韩| 六月婷婷色综合| 亚洲一区二区高清| 亚洲欧洲另类国产综合| 2欧美一区二区三区在线观看视频| 日本国产一区二区| 懂色av一区二区夜夜嗨| 精品一区二区三区在线播放| 亚洲综合色噜噜狠狠| 亚洲国产成人一区二区三区| 欧美videossexotv100| 欧美日本视频在线| 在线精品视频一区二区| 粉嫩av一区二区三区| 国产原创一区二区三区| 日本视频一区二区三区| 亚洲精品美国一| 成人免费一区二区三区在线观看| 久久久青草青青国产亚洲免观| 在线电影一区二区三区| 在线观看日韩电影| 91丝袜美腿高跟国产极品老师 | 99热国产精品| 成人性视频免费网站| 国产一区二区成人久久免费影院 | 国产视频一区二区三区在线观看| 678五月天丁香亚洲综合网| 欧美三级视频在线播放| 在线观看av不卡| 欧美影片第一页| 在线观看日韩国产| 欧美写真视频网站| 欧美日韩一区二区三区在线| 欧美午夜不卡在线观看免费| 日本韩国一区二区| 欧美午夜不卡在线观看免费| 欧美日韩亚洲国产综合| 欧美日产在线观看| 欧美人伦禁忌dvd放荡欲情| 欧美精品免费视频| 91精品国产91久久久久久最新毛片| 精品视频色一区| 欧美精品丝袜久久久中文字幕| 337p亚洲精品色噜噜噜| 日韩欧美自拍偷拍| 日韩欧美第一区| 久久人人97超碰com| 亚洲国产岛国毛片在线| 亚洲柠檬福利资源导航| 亚洲大片一区二区三区| 强制捆绑调教一区二区| 激情六月婷婷久久| 国产69精品久久99不卡| 91激情五月电影| 欧美精品在线视频| 久久久精品影视| 亚洲精品老司机| 久久精品国产在热久久| 成人综合婷婷国产精品久久蜜臀 | 中文欧美字幕免费| 亚洲久草在线视频| 视频一区视频二区中文| 毛片av中文字幕一区二区| 福利一区二区在线| 欧美午夜寂寞影院| 久久免费精品国产久精品久久久久| 国产精品麻豆99久久久久久| 亚洲一级在线观看| 国产精品夜夜嗨| 在线观看欧美黄色| 精品国产在天天线2019| 亚洲欧美日韩系列| 六月丁香婷婷久久| 91国偷自产一区二区开放时间| 91精品国产综合久久精品麻豆| 久久精品人人做人人爽人人| 亚洲一区二区三区小说| 国产一区999| 精品视频免费看| 国产精品国产三级国产三级人妇 | 偷拍亚洲欧洲综合| 国产成人一级电影| 欧美日韩和欧美的一区二区| 中文av一区特黄| 免费高清不卡av| 色就色 综合激情| 久久久不卡影院| 免费看精品久久片| 日本乱人伦aⅴ精品| 国产精品午夜免费| 裸体在线国模精品偷拍| 欧美午夜精品理论片a级按摩| 国产日产欧美一区| 精品一区二区三区久久| 欧美性三三影院| 综合久久久久综合| 岛国精品在线观看| 精品欧美久久久| 日韩精品久久久久久| 色综合久久天天综合网| 欧美激情一区二区在线| 久久av老司机精品网站导航| 91高清视频在线| 亚洲三级视频在线观看| 国产suv一区二区三区88区| 精品国产91洋老外米糕| 日韩国产欧美在线观看| 欧美日韩卡一卡二| 亚洲精品中文字幕在线观看| 99精品久久免费看蜜臀剧情介绍| 2欧美一区二区三区在线观看视频| 日本视频免费一区| 欧美精三区欧美精三区| 午夜伊人狠狠久久| 欧美日韩在线播放一区| 亚洲第一成人在线| 欧美日韩国产综合视频在线观看 | 亚洲天堂精品在线观看| 成人丝袜高跟foot| 国产精品欧美久久久久无广告| 成人一道本在线| ㊣最新国产の精品bt伙计久久| 成人一区在线看|