亚洲欧美第一页_禁久久精品乱码_粉嫩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国产麻豆精品| 99久久免费国产| 在线免费观看不卡av| 欧美午夜寂寞影院| 91精品国产入口| wwwwww.欧美系列| 国产日韩欧美一区二区三区综合| 国产日韩三级在线| 亚洲日本在线看| 日欧美一区二区| 国产精品影音先锋| 99国产精品99久久久久久| 91久久一区二区| 日韩一区二区免费电影| 国产亚洲人成网站| 亚洲激情图片qvod| 九九九精品视频| 波多野结衣一区二区三区| 欧美色倩网站大全免费| 在线不卡免费av| 久久只精品国产| 亚洲视频在线观看一区| 亚洲午夜影视影院在线观看| 老司机精品视频线观看86| 国产精品一区二区在线观看不卡| 成人av小说网| 欧美少妇xxx| 国产三区在线成人av| 亚洲欧美日韩综合aⅴ视频| 日韩福利电影在线| a在线欧美一区| 欧美一区二区福利视频| 亚洲人成精品久久久久久 | 精品美女在线观看| 亚洲欧美偷拍另类a∨色屁股| 亚洲成人tv网| av在线播放成人| 欧美成人一区二区| 亚洲韩国一区二区三区| 国产不卡在线播放| 91精品国产91久久久久久一区二区 | 日韩精品专区在线影院观看| 国产日韩欧美制服另类| 午夜精品爽啪视频| 成人avav在线| 国产日韩欧美一区二区三区乱码| 亚洲成人自拍偷拍| 色天使色偷偷av一区二区| 久久久国产午夜精品 | 久久九九99视频| 日韩电影免费在线| 在线视频观看一区| 国产精品福利一区二区| 狠狠v欧美v日韩v亚洲ⅴ| 欧美日韩综合色| 亚洲欧美色综合| 91日韩在线专区| 欧美激情一区二区| 成人免费高清在线观看| 国产亚洲成aⅴ人片在线观看| 免费精品视频在线| 8v天堂国产在线一区二区| 亚洲精品视频一区二区| 99精品黄色片免费大全| 中文字幕成人在线观看| 成人丝袜视频网| 中文字幕精品在线不卡| 成人激情黄色小说| 国产精品久久国产精麻豆99网站| 国产不卡高清在线观看视频| 国产调教视频一区| 国产成人av电影| 国产精品久久久久9999吃药| 成人午夜视频在线| 国产精品久久久久久福利一牛影视| 国产成人久久精品77777最新版本| www日韩大片| 国产99久久久国产精品潘金网站| 精品国产免费久久| 成人美女视频在线看| 中文字幕一区二区三区四区不卡 | 日本vs亚洲vs韩国一区三区 | 久久精品亚洲精品国产欧美| 韩国av一区二区三区四区| 久久久精品欧美丰满| 成人av集中营| 亚洲国产精品久久人人爱蜜臀| 欧美亚一区二区| 日韩成人免费在线| 久久亚洲二区三区| 岛国av在线一区| 亚洲自拍偷拍图区| 91精品久久久久久久91蜜桃| 精品一区二区免费| 亚洲色欲色欲www| 欧美日韩国产bt| 国产激情91久久精品导航| 国产精品伦理一区二区| 欧美日韩在线免费视频| 精品一区二区国语对白| 亚洲人一二三区| 91麻豆精品国产91久久久| 国产一区二区成人久久免费影院 | 老司机一区二区| 最新国产成人在线观看| 3751色影院一区二区三区| 国产精品亚洲视频| 香蕉影视欧美成人| 国产精品视频一二| 91精品蜜臀在线一区尤物| www.久久精品| 国产一区二区精品久久| 亚洲国产精品一区二区尤物区| 久久久国际精品| 欧美一区二区三区免费在线看| 99综合影院在线| 极品美女销魂一区二区三区| ●精品国产综合乱码久久久久| 日韩欧美www| 欧美色手机在线观看| 岛国精品在线观看| 美国一区二区三区在线播放| 亚洲精品视频观看| 国产精品区一区二区三区 | 国产成人午夜电影网| 五月天久久比比资源色| 一区二区三区中文免费| 日本一区二区高清| 久久免费电影网| 日韩欧美精品在线视频| 欧美日韩成人在线| 91国偷自产一区二区开放时间 | 国产东北露脸精品视频| 男男gaygay亚洲| 亚洲国产成人av| 一区二区三区在线视频免费| 国产精品久久一卡二卡| 国产女同互慰高潮91漫画| 精品捆绑美女sm三区| 日韩一区二区免费电影| 69久久夜色精品国产69蝌蚪网| 欧美在线你懂的| 色94色欧美sute亚洲13| 91久久人澡人人添人人爽欧美| 成人久久久精品乱码一区二区三区| 国产真实乱对白精彩久久| 精品一区二区三区久久久| 久久99精品国产91久久来源| 另类综合日韩欧美亚洲| 美女视频黄 久久| 狠狠色丁香久久婷婷综合_中 | 亚洲一区二区高清| 亚洲自拍偷拍欧美| 亚洲超碰97人人做人人爱| 五月天激情综合网| 久久99这里只有精品| 国产福利一区二区三区视频| 国产成人av电影在线播放| 99r精品视频| 欧美日本免费一区二区三区| 91精品国产高清一区二区三区蜜臀| 91精品国产色综合久久| 久久综合九色综合97婷婷女人| 久久久精品中文字幕麻豆发布| 国产精品萝li| 午夜天堂影视香蕉久久| 国内精品久久久久影院薰衣草| 国产精品一卡二卡| 色综合中文综合网| 久久久久综合网| 中文字幕日本不卡| 亚洲一区二区在线观看视频| 热久久免费视频| 成人性视频网站| 在线观看亚洲专区| 欧美成人bangbros| 国产精品乱码一区二区三区软件 | 美女网站视频久久| 成人av电影在线| 欧美日韩精品福利| 国产欧美日韩在线观看| 一区二区免费在线| 国产资源精品在线观看| 日本精品一区二区三区四区的功能| 欧美一卡2卡3卡4卡| 亚洲欧美日韩中文字幕一区二区三区| 日韩影院免费视频| www.欧美.com| 久久综合狠狠综合久久激情| 亚洲国产三级在线| 成人av午夜电影| 久久综合久久综合久久| 亚洲一区二区三区影院|