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

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

?? zz.cpp

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


#include <NTL/ZZ.h>
#include <NTL/vec_ZZ.h>


#include <NTL/new.h>



NTL_START_IMPL




const ZZ& ZZ::zero()
{
   static ZZ z;
   return z;
}


const ZZ& ZZ_expo(long e)
{
   static ZZ expo_helper;
   conv(expo_helper, e);
   return expo_helper;
}




void AddMod(ZZ& x, const ZZ& a, long b, const ZZ& n)
{
   static ZZ B;
   conv(B, b);
   AddMod(x, a, B, n);
}


void SubMod(ZZ& x, const ZZ& a, long b, const ZZ& n)
{
   static ZZ B;
   conv(B, b);
   SubMod(x, a, B, n);
}

void SubMod(ZZ& x, long a, const ZZ& b, const ZZ& n)
{
   static ZZ A;
   conv(A, a);
   SubMod(x, A, b, n);
}



// ****** input and output

static long iodigits = 0;
static long ioradix = 0;

// iodigits is the greatest integer such that 10^{iodigits} < NTL_WSP_BOUND
// ioradix = 10^{iodigits}

static void InitZZIO()
{
   long x;

   x = (NTL_WSP_BOUND-1)/10;
   iodigits = 0;
   ioradix = 1;

   while (x) {
      x = x / 10;
      iodigits++;
      ioradix = ioradix * 10;
   }

   if (iodigits <= 0) Error("problem with I/O");
}

istream& operator>>(istream& s, ZZ& x)
{
   long c;
   long cval;
   long sign;
   long ndigits;
   long acc;
   static ZZ a;

   if (!s) Error("bad ZZ input");

   if (!iodigits) InitZZIO();

   a = 0;

   SkipWhiteSpace(s);
   c = s.peek();

   if (c == '-') {
      sign = -1;
      s.get();
      c = s.peek();
   }
   else
      sign = 1;

   cval = CharToIntVal(c);

   if (cval < 0 || cval > 9) Error("bad ZZ input");

   ndigits = 0;
   acc = 0;
   while (cval >= 0 && cval <= 9) {
      acc = acc*10 + cval;
      ndigits++;

      if (ndigits == iodigits) {
         mul(a, a, ioradix);
         add(a, a, acc);
         ndigits = 0;
         acc = 0;
      }

      s.get();
      c = s.peek();
      cval = CharToIntVal(c);
   }

   if (ndigits != 0) {
      long mpy = 1;
      while (ndigits > 0) {
         mpy = mpy * 10;
         ndigits--;
      }

      mul(a, a, mpy);
      add(a, a, acc);
   }

   if (sign == -1)
      negate(a, a);

   x = a;

   return s;
}


// The class _ZZ_local_stack should be defined in an empty namespace,
// but since I don't want to rely on namespaces, we just give it a funny 
// name to avoid accidental name clashes.

struct _ZZ_local_stack {
   long top;
   long alloc;
   long *elts;

   _ZZ_local_stack() { top = -1; alloc = 0; elts = 0; }
   ~_ZZ_local_stack() { }

   long pop() { return elts[top--]; }
   long empty() { return (top == -1); }
   void push(long x);
};

void _ZZ_local_stack::push(long x)
{
   if (alloc == 0) {
      alloc = 100;
      elts = (long *) NTL_MALLOC(alloc, sizeof(long), 0);
   }

   top++;

   if (top + 1 > alloc) {
      alloc = 2*alloc;
      elts = (long *) NTL_REALLOC(elts, alloc, sizeof(long), 0);
   }

   if (!elts) {
      Error("out of space in ZZ output");
   }

   elts[top] = x;
}


static
void PrintDigits(ostream& s, long d, long justify)
{
   static char *buf = 0;

   if (!buf) {
      buf = (char *) NTL_MALLOC(iodigits, 1, 0);
      if (!buf) Error("out of memory");
   }

   long i = 0;

   while (d) {
      buf[i] = IntValToChar(d % 10);
      d = d / 10;
      i++;
   }

   if (justify) {
      long j = iodigits - i;
      while (j > 0) {
         s << "0";
         j--;
      }
   }

   while (i > 0) {
      i--;
      s << buf[i];
   }
}
      

   

ostream& operator<<(ostream& s, const ZZ& a)
{
   static ZZ b;
   static _ZZ_local_stack S;
   long r;
   long k;

   if (!iodigits) InitZZIO();

   b = a;

   k = sign(b);

   if (k == 0) {
      s << "0";
      return s;
   }

   if (k < 0) {
      s << "-";
      negate(b, b);
   }

   do {
      r = DivRem(b, b, ioradix);
      S.push(r);
   } while (!IsZero(b));

   r = S.pop();
   PrintDigits(s, r, 0);

   while (!S.empty()) {
      r = S.pop();
      PrintDigits(s, r, 1);
   }
      
   return s;
}



long GCD(long a, long b)
{
   long u, v, t, x;

   if (a < 0) {
      if (a < -NTL_MAX_LONG) Error("GCD: integer overflow");
      a = -a;
   }

   if (b < 0) {
      if (b < -NTL_MAX_LONG) Error("GCD: integer overflow");
      b = -b;
   }


   if (b==0)
      x = a;
   else {
      u = a;
      v = b;
      do {
         t = u % v;
         u = v; 
         v = t;
      } while (v != 0);

      x = u;
   }

   return x;
}

         

void XGCD(long& d, long& s, long& t, long a, long b)
{
   long  u, v, u0, v0, u1, v1, u2, v2, q, r;

   long aneg = 0, bneg = 0;

   if (a < 0) {
      if (a < -NTL_MAX_LONG) Error("XGCD: integer overflow");
      a = -a;
      aneg = 1;
   }

   if (b < 0) {
      if (b < -NTL_MAX_LONG) Error("XGCD: integer overflow");
      b = -b;
      bneg = 1;
   }

   u1=1; v1=0;
   u2=0; v2=1;
   u = a; v = b;

   while (v != 0) {
      q = u / v;
      r = u % v;
      u = v;
      v = r;
      u0 = u2;
      v0 = v2;
      u2 =  u1 - q*u2;
      v2 = v1- q*v2;
      u1 = u0;
      v1 = v0;
   }

   if (aneg)
      u1 = -u1;

   if (bneg)
      v1 = -v1;

   d = u;
   s = u1;
   t = v1;
}
   

long InvMod(long a, long n)
{
   long d, s, t;

   XGCD(d, s, t, a, n);
   if (d != 1) Error("InvMod: inverse undefined");
   if (s < 0)
      return s + n;
   else
      return s;
}


long PowerMod(long a, long ee, long n)
{
   long x, y;

   unsigned long e;

   if (ee < 0)
      e = - ((unsigned long) ee);
   else
      e = ee;

   x = 1;
   y = a;
   while (e) {
      if (e & 1) x = MulMod(x, y, n);
      y = MulMod(y, y, n);
      e = e >> 1;
   }

   if (ee < 0) x = InvMod(x, n);

   return x;
}

long ProbPrime(long n, long NumTests)
{
   long m, x, y, z;
   long i, j, k;

   if (n <= 1) return 0;


   if (n == 2) return 1;
   if (n % 2 == 0) return 0;

   if (n == 3) return 1;
   if (n % 3 == 0) return 0;

   if (n == 5) return 1;
   if (n % 5 == 0) return 0;

   if (n == 7) return 1;
   if (n % 7 == 0) return 0;

   if (n >= NTL_SP_BOUND) {
      return ProbPrime(to_ZZ(n), NumTests);
   }

   m = n - 1;
   k = 0;
   while((m & 1) == 0) {
      m = m >> 1;
      k++;
   }

   // n - 1 == 2^k * m, m odd

   for (i = 0; i < NumTests; i++) {
      do {
         x = RandomBnd(n);
      } while (x == 0);
      // x == 0 is not a useful candidtae for a witness!


      if (x == 0) continue;
      z = PowerMod(x, m, n);
      if (z == 1) continue;
   
      j = 0;
      do {
         y = z;
         z = MulMod(y, y, n);
         j++;
      } while (j != k && z != 1);

      if (z != 1 || y !=  n-1) return 0;
   }

   return 1;
}


long MillerWitness(const ZZ& n, const ZZ& x)
{
   ZZ m, y, z;
   long j, k;

   if (x == 0) return 0;

   add(m, n, -1);
   k = MakeOdd(m);
   // n - 1 == 2^k * m, m odd

   PowerMod(z, x, m, n);
   if (z == 1) return 0;

   j = 0;
   do {
      y = z;
      SqrMod(z, y, n);
      j++;
   } while (j != k && z != 1);

   if (z != 1) return 1;
   add(y, y, 1);
   if (y != n) return 1;
   return 0;
}


// ComputePrimeBound computes a reasonable bound for trial
// division in the Miller-Rabin test.
// It is computed a bit on the "low" side, since being a bit
// low doesn't hurt much, but being too high can hurt a lot.

static
long ComputePrimeBound(long bn)
{
   long wn = (bn+NTL_ZZ_NBITS-1)/NTL_ZZ_NBITS;

   long fn;

   if (wn <= 36)
      fn = wn/4 + 1;
   else
      fn = long(1.67*sqrt(double(wn)));

   long prime_bnd;

   if (NumBits(bn) + NumBits(fn) > NTL_SP_NBITS)
      prime_bnd = NTL_SP_BOUND;
   else
      prime_bnd = bn*fn;

   return prime_bnd;
}


long ProbPrime(const ZZ& n, long NumTrials)
{
   if (n <= 1) return 0;

   if (n.SinglePrecision()) {
      return ProbPrime(to_long(n), NumTrials);
   }


   long prime_bnd = ComputePrimeBound(NumBits(n));


   PrimeSeq s;
   long p;

   p = s.next();
   while (p && p < prime_bnd) {
      if (rem(n, p) == 0)
         return 0;

      p = s.next();
   }

   ZZ W;
   W = 2;

   // first try W == 2....the exponentiation
   // algorithm runs slightly faster in this case

   if (MillerWitness(n, W))
      return 0;


   long i;

   for (i = 0; i < NumTrials; i++) {
      do {
         RandomBnd(W, n);
      } while (W == 0);
      // W == 0 is not a useful candidate for a witness!

      if (MillerWitness(n, W)) 
         return 0;
   }

   return 1;
}


void RandomPrime(ZZ& n, long l, long NumTrials)
{
   if (l <= 1)
      Error("RandomPrime: l out of range");

   if (l == 2) {
      if (RandomBnd(2))
         n = 3;
      else
         n = 2;

      return;
   }

   do {
      RandomLen(n, l);
      if (!IsOdd(n)) add(n, n, 1);
   } while (!ProbPrime(n, NumTrials));
}

void NextPrime(ZZ& n, const ZZ& m, long NumTrials)
{
   ZZ x;

   if (m <= 2) {
      n = 2;
      return;
   }

   x = m;

   while (!ProbPrime(x, NumTrials))
      add(x, x, 1);

   n = x;
}

long NextPrime(long m, long NumTrials)
{
   long x;

   if (m <= 2) 
      return 2;

   x = m;

   while (x < NTL_SP_BOUND && !ProbPrime(x, NumTrials))
      x++;

   if (x >= NTL_SP_BOUND)
      Error("NextPrime: no more primes");

   return x;
}



long NextPowerOfTwo(long m)
{
   long k; 
   unsigned long n, um;

   if (m < 0) return 0;

   um = m;
   n = 1;
   k = 0;

   while (n < um) {
      n = n << 1;
      k++;
   }

   if (k >= NTL_BITS_PER_LONG-1)
      Error("NextPowerOfTwo: overflow");

   return k;
}



long NumBits(long a)
{
   unsigned long aa;
   if (a < 0) 
      aa = - ((unsigned long) a);
   else
      aa = a;

   long k = 0;
   while (aa) {
      k++;
      aa = aa >> 1;
   }

   return k;
}


long bit(long a, long k)
{
   unsigned long aa;
   if (a < 0)
      aa = - ((unsigned long) a);
   else
      aa = a;

   if (k < 0 || k >= NTL_BITS_PER_LONG) 
      return 0;
   else
      return long((aa >> k) & 1);
}



long divide(ZZ& q, const ZZ& a, const ZZ& b)
{
   static ZZ qq, r;

   if (IsZero(b)) {
      if (IsZero(a)) {
         clear(q);
         return 1;
      }
      else
         return 0;
   }


   if (IsOne(b)) {
      q = a;
      return 1;
   }

   DivRem(qq, r, a, b);
   if (!IsZero(r)) return 0;
   q = qq;
   return 1;
}

long divide(const ZZ& a, const ZZ& b)
{
   static ZZ r;

   if (IsZero(b)) return IsZero(a);
   if (IsOne(b)) return 1;

   rem(r, a, b);
   return IsZero(r);
}

long divide(ZZ& q, const ZZ& a, long b)
{
   static ZZ qq;

   if (!b) {
      if (IsZero(a)) {
         clear(q);
         return 1;
      }
      else
         return 0;
   }

   if (b == 1) {
      q = a;
      return 1;
   }

   long r = DivRem(qq, a, b);
   if (r) return 0;
   q = qq;
   return 1;
}

long divide(const ZZ& a, long b)
{
   if (!b) return IsZero(a);
   if (b == 1) {
      return 1;
   }

   long r = rem(a,  b);
   return (r == 0);
}
   


long RandomPrime_long(long l, long NumTrials)
{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美美女喷水视频| 久久精品99国产精品日本| 亚洲国产婷婷综合在线精品| 成人深夜福利app| 国产欧美日韩麻豆91| 激情综合色播激情啊| 日韩一区二区三区免费看 | 亚洲美女免费视频| 成人短视频下载 | 久久精品人人做人人爽人人| 日韩综合一区二区| 色婷婷综合五月| 亚洲一区二区视频在线观看| 日本精品一区二区三区高清| 一区二区欧美精品| 欧美日韩一级二级| 日本vs亚洲vs韩国一区三区| 91精品国产91久久久久久最新毛片| 亚洲最快最全在线视频| 欧美影视一区二区三区| 亚洲va欧美va人人爽| 欧美另类z0zxhd电影| 久久精品国产免费看久久精品| 欧美日韩一区二区三区免费看| 午夜免费久久看| 精品国产91亚洲一区二区三区婷婷 | 国产一区二区久久| 国产精品网站在线播放| 99这里都是精品| 亚洲国产一区二区a毛片| 欧美一级免费大片| 免费美女久久99| 国产女人18水真多18精品一级做| 91丨九色丨国产丨porny| 亚洲成人综合在线| 久久嫩草精品久久久久| 波多野结衣亚洲| 亚洲国产欧美一区二区三区丁香婷| 欧美区视频在线观看| 午夜a成v人精品| 2020日本不卡一区二区视频| 99在线热播精品免费| 图片区小说区区亚洲影院| 精品国产一区二区三区忘忧草| 国产91在线|亚洲| 丝袜亚洲另类丝袜在线| 久久精品夜夜夜夜久久| 欧美性生活影院| 久久99久久精品欧美| 日本一区二区在线不卡| 在线精品视频免费观看| 国产高清久久久| 午夜精品一区二区三区免费视频 | 本田岬高潮一区二区三区| 亚洲国产综合视频在线观看| 精品人伦一区二区色婷婷| 色综合久久久久| 国产精品自在在线| 亚洲一二三四在线观看| 国产午夜精品一区二区三区视频 | 日韩精品一区二区三区三区免费| 91香蕉视频黄| 国产主播一区二区| 亚洲网友自拍偷拍| 中文字幕视频一区| 欧美mv日韩mv亚洲| 欧美精品一二三| www.日韩av| 国产在线观看一区二区| 亚洲小说欧美激情另类| 国产精品久久久久久一区二区三区 | 亚洲午夜免费视频| 国产女主播一区| 91精品国产品国语在线不卡| 色吊一区二区三区| av网站一区二区三区| 狠狠色丁香婷婷综合久久片| 亚洲一区中文日韩| 国产精品久久久久久久第一福利| 精品久久五月天| 日韩欧美国产一二三区| 欧美日韩一二三区| 欧美性色黄大片| 不卡电影一区二区三区| 国产·精品毛片| 国产成人久久精品77777最新版本| 亚洲va欧美va人人爽午夜| 亚洲精品乱码久久久久| 亚洲欧美综合网| 国产精品卡一卡二卡三| 中文字幕的久久| 综合久久给合久久狠狠狠97色| 国产网站一区二区| 久久久久久久久久久电影| 精品少妇一区二区三区免费观看| 欧美一区二区三区成人| 欧美一区二区日韩一区二区| 欧美一区二区三区四区五区 | 99re热视频精品| 国产成人精品一区二区三区四区| 国产一区二区看久久| 国产91精品一区二区麻豆网站| 国产黑丝在线一区二区三区| 国产不卡免费视频| av不卡在线播放| 欧美午夜精品一区二区三区| 欧美日韩精品二区第二页| 91麻豆精品国产91久久久久久 | 91精品国产综合久久久蜜臀图片| 欧美日韩精品一区二区天天拍小说| 欧美影视一区在线| 欧美一区二区三区免费大片| 欧美成人一区二区三区在线观看| www国产成人| 国产精品伦一区二区三级视频| 国产精品美女久久久久aⅴ国产馆| ...中文天堂在线一区| 一区二区三区毛片| 日日夜夜免费精品视频| 国产真实乱偷精品视频免| 国产精品一区二区久激情瑜伽| 成人激情电影免费在线观看| 日本精品视频一区二区| 欧美自拍偷拍一区| 日韩精品在线网站| 国产精品私人自拍| 亚洲一区精品在线| 国产真实精品久久二三区| 99热这里都是精品| 欧美丰满少妇xxxxx高潮对白 | 国产精品一品二品| 91丨国产丨九色丨pron| 欧美精品一区视频| 久久久精品tv| 午夜精品福利一区二区蜜股av | 日韩亚洲欧美在线| 中文字幕佐山爱一区二区免费| 蜜桃av噜噜一区二区三区小说| www.欧美.com| 国产午夜精品一区二区三区嫩草 | 日日骚欧美日韩| 99久久综合国产精品| 精品国产一区二区三区久久影院 | 欧美成人性战久久| 亚洲国产日日夜夜| 91蜜桃在线免费视频| 337p日本欧洲亚洲大胆精品| 午夜精品久久久久久久久| 99久久精品免费看国产免费软件| 久久这里只有精品6| 日韩电影免费一区| 欧美性欧美巨大黑白大战| 亚洲人成网站影音先锋播放| 国产精品乡下勾搭老头1| 亚洲欧洲另类国产综合| 亚洲大片在线观看| 99riav久久精品riav| 国产色91在线| 国产在线一区二区| 日韩视频中午一区| 亚洲成av人片在www色猫咪| 95精品视频在线| 国产精品久久久久7777按摩| 国内精品不卡在线| 欧美sm美女调教| 激情五月婷婷综合| 久久久久久久久久看片| 国内精品久久久久影院色| 日韩精品专区在线影院重磅| 老司机一区二区| 久久综合色播五月| 国产毛片精品国产一区二区三区| 精品91自产拍在线观看一区| 秋霞成人午夜伦在线观看| 91精品国产一区二区三区| 免费在线视频一区| 久久嫩草精品久久久精品一| 国产最新精品精品你懂的| 国产目拍亚洲精品99久久精品 | 国产精品伊人色| 亚洲国产精品精华液ab| 成人免费视频免费观看| 亚洲色大成网站www久久九九| 欧美剧情片在线观看| 国产91丝袜在线18| 成人激情图片网| 成人欧美一区二区三区| 日本精品免费观看高清观看| 亚洲与欧洲av电影| 欧美另类久久久品| 国内精品免费在线观看| 国产精品高潮呻吟| 欧美男人的天堂一二区| 韩国精品主播一区二区在线观看| 中文字幕精品—区二区四季| 日本国产一区二区| 看片网站欧美日韩| 国产精品国产三级国产普通话三级| 在线免费观看日本一区| 麻豆精品一区二区|