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

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

?? fft.cpp

?? 一個比較通用的大數運算庫
?? CPP
字號:


#include <NTL/FFT.h>

#include <NTL/new.h>

NTL_START_IMPL

long NumFFTPrimes = 0;



long *FFTPrime = 0;
long **RootTable = 0;
long **RootInvTable = 0;
long **TwoInvTable = 0;
double *FFTPrimeInv = 0;


static
long IsFFTPrime(long n, long& w)
{
   long  m, x, y, z;
   long j, k;

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

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

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

   for (;;) {
      x = RandomBnd(n);

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

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

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

      if (j == k) 
         break;
   }

   /* x^{2^k} = 1 mod n, x^{2^{k-1}} = -1 mod n */

   long TrialBound;

   TrialBound = m >> k;
   if (TrialBound > 0) {
      if (!ProbPrime(n, 5)) return 0;
   
      /* we have to do trial division by special numbers */
   
      TrialBound = SqrRoot(TrialBound);
   
      long a, b;
   
      for (a = 1; a <= TrialBound; a++) {
         b = (a << k) + 1;
         if (n % b == 0) return 0; 
      }
   }

   /* n is an FFT prime */

   for (j = NTL_FFTMaxRoot; j < k; j++)
      x = MulMod(x, x, n);

   w = x;
   return 1;
}


static
void NextFFTPrime(long& q, long& w)
{
   static long m = NTL_FFTMaxRootBnd + 1;
   static long k = 0;

   long t, cand;

   for (;;) {
      if (k == 0) {
         m--;
         if (m < 5) Error("ran out of FFT primes");
         k = 1L << (NTL_SP_NBITS-m-2);
      }

      k--;

      cand = (1L << (NTL_SP_NBITS-1)) + (k << (m+1)) + (1L << m) + 1;

      if (!IsFFTPrime(cand, t)) continue;
      q = cand;
      w = t;
      return;
   }
}


long CalcMaxRoot(long p)
{
   p = p-1;
   long k = 0;
   while ((p & 1) == 0) {
      p = p >> 1;
      k++;
   }

   if (k > NTL_FFTMaxRoot)
      return NTL_FFTMaxRoot;
   else
      return k; 
}


void UseFFTPrime(long index)
{
   if (index < 0 || index > NumFFTPrimes)
      Error("invalid FFT prime index");

   if (index < NumFFTPrimes) return;

   long q, w;

   NextFFTPrime(q, w);

   long mr = CalcMaxRoot(q);

   // tables are allocated in increments of 100

   if (index == 0) { 
      FFTPrime = (long *) NTL_MALLOC(100, sizeof(long), 0);
      RootTable = (long **) NTL_MALLOC(100, sizeof(long *), 0);
      RootInvTable = (long **) NTL_MALLOC(100, sizeof(long *), 0);
      TwoInvTable = (long **) NTL_MALLOC(100, sizeof(long *), 0);
      FFTPrimeInv = (double *) NTL_MALLOC(100, sizeof(double), 0);
   }
   else if ((index % 100) == 0) {
      FFTPrime = (long *) NTL_REALLOC(FFTPrime, index+100, sizeof(long), 0);
      RootTable = (long **) 
                  NTL_REALLOC(RootTable, index+100, sizeof(long *), 0);
      RootInvTable = (long **) 
                     NTL_REALLOC(RootInvTable, index+100, sizeof(long *), 0);
      TwoInvTable = (long **) 
                    NTL_REALLOC(TwoInvTable, index+100, sizeof(long *), 0);
      FFTPrimeInv = (double *) 
                    NTL_REALLOC(FFTPrimeInv, index+100, sizeof(double), 0);
   }

   if (!FFTPrime || !RootTable || !RootInvTable || !TwoInvTable ||
       !FFTPrimeInv) 
      Error("out of space");

   FFTPrime[index] = q;

   long *rt, *rit, *tit;

   if (!(rt = RootTable[index] = (long*) NTL_MALLOC(mr+1, sizeof(long), 0)))
      Error("out of space");
   if (!(rit = RootInvTable[index] = (long*) NTL_MALLOC(mr+1, sizeof(long), 0)))
      Error("out of space");
   if (!(tit = TwoInvTable[index] = (long*) NTL_MALLOC(mr+1, sizeof(long), 0)))
      Error("out of space");

   long j;
   long t;

   rt[mr] = w;
   for (j = mr-1; j >= 0; j--)
      rt[j] = MulMod(rt[j+1], rt[j+1], q);

   rit[mr] = InvMod(w, q);
   for (j = mr-1; j >= 0; j--)
      rit[j] = MulMod(rit[j+1], rit[j+1], q);

   t = InvMod(2, q);
   tit[0] = 1;
   for (j = 1; j <= mr; j++)
      tit[j] = MulMod(tit[j-1], t, q);

   FFTPrimeInv[index] = 1/double(q);

   NumFFTPrimes++;
}
   

static
long RevInc(long a, long k)
{
   long j, m;

   j = k; 
   m = 1L << (k-1);

   while (j && (m & a)) {
      a ^= m;
      m >>= 1;
      j--;
   }
   if (j) a ^= m;
   return a;
}

static
void BitReverseCopy(long *A, const long *a, long k)
{
   static long* mem[NTL_FFTMaxRoot+1];

   long n = 1L << k;
   long* rev;
   long i, j;

   rev = mem[k];
   if (!rev) {
      rev = mem[k] = (long *) NTL_MALLOC(n, sizeof(long), 0);
      if (!rev) Error("out of memory in BitReverseCopy");
      for (i = 0, j = 0; i < n; i++, j = RevInc(j, k))
         rev[i] = j;
   }

   for (i = 0; i < n; i++)
      A[rev[i]] = a[i];
}





/*
 * Our FFT is based on the routine in Cormen, Leiserson, Rivest, and Stein.
 * For very large inputs, it should be relatively cache friendly.
 * The inner loop has been unrolled and pipelined, to exploit any
 * low-level parallelism in the machine.
 */



void FFT(long* A, const long* a, long k, long q, const long* root)

// performs a 2^k-point convolution modulo q

{
   if (k <= 1) {
      if (k == 0) {
	 A[0] = a[0];
	 return;
      }
      if (k == 1) {
	 A[0] = AddMod(a[0], a[1], q);
	 A[1] = SubMod(a[0], a[1], q);
	 return;
      }
   }

   // assume k > 1

   

   static long tab_size = 0;
   static long *wtab = 0;
   static mulmod_precon_t *wqinvtab = 0;

   if (!tab_size) {
      tab_size = k;

      wtab = (long *) NTL_MALLOC(1L << (k-2), sizeof(long), 0);
      wqinvtab = (mulmod_precon_t *) 
                 NTL_MALLOC(1L << (k-2), sizeof(mulmod_precon_t), 0);
      if (!wtab || !wqinvtab) Error("out of space");
   }
   else if (tab_size < k) {
      tab_size = k;

      wtab = (long *) NTL_REALLOC(wtab, 1L << (k-2), sizeof(long), 0);
      wqinvtab = (mulmod_precon_t *) 
                 NTL_REALLOC(wqinvtab, 1L << (k-2), sizeof(mulmod_precon_t), 0);
      if (!wtab || !wqinvtab) Error("out of space");
   }


   double qinv = 1/((double) q);

   wtab[0] = 1;
   wqinvtab[0] = PrepMulModPrecon(1, q, qinv);


   BitReverseCopy(A, a, k);

   long n = 1L << k;

   long s, m, m_half, m_fourth, i, j, t, u, t1, u1, uu, uu1, tt, tt1;

   long w;
   mulmod_precon_t wqinv;

   // s = 1

   for (i = 0; i < n; i += 2) {
      t = A[i + 1];
      u = A[i];
      A[i] = AddMod(u, t, q);
      A[i+1] = SubMod(u, t, q);
   }

   
  
   for (s = 2; s < k; s++) {
      m = 1L << s;
      m_half = 1L << (s-1);
      m_fourth = 1L << (s-2);

      // prepare wtab...

      w = root[s];
      wqinv = PrepMulModPrecon(w, q, qinv);

      for (i = m_half-1, j = m_fourth-1; i >= 0; i -= 2, j--) {
         wtab[i-1] = wtab[j];
         wqinvtab[i-1] = wqinvtab[j];
         wtab[i] = MulModPrecon(wtab[i-1], w, q, wqinv);
         wqinvtab[i] = PrepMulModPrecon(wtab[i], q, qinv);
      }

      for (i = 0; i < n; i+= m) {

          
         t = A[i + m_half];
         u = A[i];
         t1 = MulModPrecon(A[i + 1+ m_half], w, q, wqinv);
         u1 = A[i+1];

         for (j = 0; j < m_half-2; j += 2) {
            tt = MulModPrecon(A[i + j + 2 + m_half], wtab[j+2], q, wqinvtab[j+2]);
            uu = A[i + j + 2];


            tt1 = MulModPrecon(A[i + j + 3+ m_half], wtab[j+3], q, wqinvtab[j+3]);
            uu1 = A[i + j + 3];

            A[i + j] = AddMod(u, t, q);
            A[i + j + m_half] = SubMod(u, t, q);
            A[i + j + 1] = AddMod(u1, t1, q);
            A[i + j + 1 + m_half] = SubMod(u1, t1, q);
            t = tt;
            t1 = tt1;
            u = uu;
            u1 = uu1;
         }


         A[i + j] = AddMod(u, t, q);
         A[i + j + m_half] = SubMod(u, t, q);
         A[i + j + 1] = AddMod(u1, t1, q);
         A[i + j + 1 + m_half] = SubMod(u1, t1, q);



      }
   }


   // s == k...special case

   m = 1L << s;
   m_half = 1L << (s-1);
   m_fourth = 1L << (s-2);


   w = root[s];
   wqinv = PrepMulModPrecon(w, q, qinv);

   // j = 0, 1

   t = A[m_half];
   u = A[0];
   t1 = MulModPrecon(A[1+ m_half], w, q, wqinv);
   u1 = A[1];

   A[0] = AddMod(u, t, q);
   A[m_half] = SubMod(u, t, q);
   A[1] = AddMod(u1, t1, q);
   A[1 + m_half] = SubMod(u1, t1, q);

   for (j = 2; j < m_half; j += 2) {
      t = MulModPrecon(A[j + m_half], wtab[j >> 1], q, wqinvtab[j >> 1]);
      u = A[j];
      t1 = MulModPrecon(A[j + 1+ m_half], wtab[j >> 1], q, 
                        wqinvtab[j >> 1]);
      t1 = MulModPrecon(t1, w, q, wqinv);
      u1 = A[j + 1];

      A[j] = AddMod(u, t, q);
      A[j + m_half] = SubMod(u, t, q);
      A[j + 1] = AddMod(u1, t1, q);
      A[j + 1 + m_half] = SubMod(u1, t1, q);
     
   }
}


NTL_END_IMPL

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区男人的天堂| 久久亚洲免费视频| 国产亚洲人成网站| 日韩中文欧美在线| 欧美日韩在线播放三区四区| 亚洲日本在线观看| 成人三级伦理片| 2020国产精品| 欧美日韩电影一区| 日韩电影免费在线观看网站| 欧美一区二区三区在线| 成人av网在线| 亚洲精品久久久久久国产精华液| aa级大片欧美| 亚洲精品视频免费观看| 久久精品亚洲一区二区三区浴池| 欧美日韩国产精品成人| 一本一本大道香蕉久在线精品 | 日韩精品综合一本久道在线视频| 日本中文在线一区| 亚洲精品美腿丝袜| 中文字幕不卡三区| 91视频.com| 美女在线观看视频一区二区| 日韩精品一区二区三区中文不卡 | 国产精品资源站在线| 国产免费久久精品| 色猫猫国产区一区二在线视频| 亚洲黄色在线视频| 亚洲欧美综合色| 欧美日韩激情一区二区| 91色婷婷久久久久合中文| 成人小视频在线观看| 国产真实乱对白精彩久久| 国产精品久久久久永久免费观看| 欧美亚洲免费在线一区| 国产乱理伦片在线观看夜一区| 日韩高清不卡在线| 日韩电影在线看| 午夜精品福利在线| 国产欧美一区二区精品秋霞影院 | 欧美日韩精品三区| 69堂亚洲精品首页| av亚洲精华国产精华精华| 成人丝袜18视频在线观看| 国产xxx精品视频大全| 香蕉久久夜色精品国产使用方法 | 欧美性生活影院| 欧美无乱码久久久免费午夜一区| 在线视频中文字幕一区二区| 国产在线麻豆精品观看| 国产剧情一区在线| 成人18视频日本| 91久久免费观看| 欧美精选在线播放| 在线观看欧美黄色| 欧美男人的天堂一二区| 在线不卡的av| 精品国产91洋老外米糕| 欧美三级乱人伦电影| 日韩一区二区在线免费观看| 99国产一区二区三精品乱码| 国产乱子伦视频一区二区三区 | 成人性生交大片免费看中文| 成人国产视频在线观看| 日本高清不卡在线观看| 欧美群妇大交群的观看方式| 亚洲精品一区二区三区香蕉| 国产精品二三区| 首页综合国产亚洲丝袜| 国产伦精品一区二区三区视频青涩| 午夜精品久久久久久久99樱桃| 免费成人av资源网| 琪琪久久久久日韩精品| 国产剧情一区在线| 色猫猫国产区一区二在线视频| 91精品国产麻豆国产自产在线 | 五月婷婷色综合| 久久激情五月激情| 蜜乳av一区二区三区| 国产成人夜色高潮福利影视| 久久99国产精品免费网站| 日本亚洲天堂网| 成人综合婷婷国产精品久久蜜臀 | 色域天天综合网| 欧美一区二区国产| 亚洲婷婷综合色高清在线| 日韩高清电影一区| 99精品热视频| 精品日韩在线一区| 久久网站最新地址| 亚洲男人天堂av网| 亚洲午夜免费福利视频| 亚洲午夜视频在线观看| 激情文学综合插| 欧美日韩和欧美的一区二区| 国产亚洲欧美中文| 日韩一区精品视频| 91蜜桃在线观看| 日韩欧美国产电影| 亚洲一区视频在线观看视频| 日日摸夜夜添夜夜添精品视频| 国产美女一区二区| 91精品国产综合久久久久久| 中文字幕亚洲综合久久菠萝蜜| 蜜桃精品视频在线| 欧美日韩中文国产| 综合av第一页| 国产乱码精品一区二区三区av| 欧美日韩精品欧美日韩精品| 亚洲日本在线看| 粉嫩在线一区二区三区视频| 欧美不卡在线视频| 图片区小说区区亚洲影院| 色呦呦网站一区| 中文字幕av一区二区三区免费看| 免费不卡在线视频| 欧美老女人第四色| 亚洲综合在线免费观看| 偷偷要91色婷婷| 91网站视频在线观看| 国产精品久久久久影院老司 | 亚洲精品自拍动漫在线| 国产精品中文字幕日韩精品| 欧美草草影院在线视频| 麻豆精品在线播放| 制服丝袜中文字幕一区| 丝袜a∨在线一区二区三区不卡| 91免费观看视频在线| 亚洲免费在线看| 91女神在线视频| 亚洲少妇30p| 91污片在线观看| 亚洲精品免费电影| 在线免费视频一区二区| 亚洲综合一二三区| 欧美亚洲动漫制服丝袜| 亚洲图片自拍偷拍| 欧美精品在线一区二区| 日本亚洲最大的色成网站www| 欧美一区二区三区不卡| 久久疯狂做爰流白浆xx| 久久伊人蜜桃av一区二区| 国产乱码一区二区三区| 中文字幕av在线一区二区三区| 成人国产一区二区三区精品| 亚洲精品中文在线观看| 91国模大尺度私拍在线视频| 一区二区三区资源| 欧美色大人视频| 日韩成人免费看| 久久影院午夜片一区| 丁香激情综合五月| 亚洲欧美日韩成人高清在线一区| 日本道色综合久久| 日本欧美肥老太交大片| 久久久久久久久久久99999| 亚洲成人免费观看| 日韩欧美在线一区二区三区| 久久精品国产秦先生| 国产精品私人自拍| 国内成+人亚洲+欧美+综合在线| 2021国产精品久久精品| 播五月开心婷婷综合| 亚洲一区二区三区四区五区中文| 欧美精品视频www在线观看| 久久99精品国产91久久来源| 中文字幕欧美激情| 欧美日韩mp4| 国产高清精品久久久久| 亚洲精品中文字幕在线观看| 欧美一级免费大片| 国产成人av网站| 亚洲一区二区三区在线看| 日韩欧美视频一区| av亚洲精华国产精华| 日韩av不卡在线观看| 国产蜜臀av在线一区二区三区| 欧美婷婷六月丁香综合色| 久久精品国产久精国产爱| ㊣最新国产の精品bt伙计久久| 欧美欧美欧美欧美首页| 成人视屏免费看| 丝袜美腿一区二区三区| 国产精品天美传媒沈樵| 欧美精品第1页| 99久久久久久| 国产中文字幕一区| 亚洲成av人片在线| 国产精品日日摸夜夜摸av| 欧美高清视频www夜色资源网| 国产盗摄一区二区| 水野朝阳av一区二区三区| 亚洲欧美一区二区在线观看| 日韩欧美国产一区二区在线播放| 色综合久久综合| 国产成人精品影视| 免费不卡在线视频| 午夜精品久久久久久久99樱桃| 中文字幕亚洲成人|