⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g_lll_fp.c

📁 密码大家Shoup写的数论算法c语言实现
💻 C
📖 第 1 页 / 共 3 页
字号:
   for (i = 1; i <= k; i++)      if (!IsFinite(&p[i])) Error("G_LLL_FP...numbers too big");}static double red_fudge = 0;static long log_red = 0;static long verbose = 0;static unsigned long NumSwaps = 0;static double StartTime = 0;static double LastTime = 0;static void G_LLLStatus(long max_k, double t, long m, const mat_ZZ& B){   cerr << "---- G_LLL_FP status ----\n";   cerr << "elapsed time: ";   PrintTime(cerr, t-StartTime);   cerr << ", stage: " << max_k;   cerr << ", rank: " << m;   cerr << ", swaps: " << NumSwaps << "\n";   ZZ t1;   long i;   double prodlen = 0;   for (i = 1; i <= m; i++) {      InnerProduct(t1, B(i), B(i));      if (!IsZero(t1))         prodlen += log(t1);   }   cerr << "log of prod of lengths: " << prodlen/(2.0*log(2.0)) << "\n";   if (LLLDumpFile) {      cerr << "dumping to " << LLLDumpFile << "...";      ofstream f;      OpenWrite(f, LLLDumpFile);            f << "[";      for (i = 1; i <= m; i++) {         f << B(i) << "\n";      }      f << "]\n";      f.close();      cerr << "\n";   }   LastTime = t;   }static void init_red_fudge(){   long i;   log_red = long(0.50*NTL_DOUBLE_PRECISION);   red_fudge = 1;   for (i = log_red; i > 0; i--)      red_fudge = red_fudge*0.5;}static void inc_red_fudge(){   red_fudge = red_fudge * 2;   log_red--;      cerr << "G_LLL_FP: warning--relaxing reduction (" << log_red << ")\n";   if (log_red < 4)      Error("G_LLL_FP: too much loss of precision...stop!");}#if 0static void print_mus(double **mu, long k){   long i;   for (i = k-1; i >= 1; i--)      cerr << mu[k][i] << " ";   cerr << "\n";}#endifstaticlong ll_G_LLL_FP(mat_ZZ& B, mat_ZZ* U, double delta, long deep,            LLLCheckFct check, double **B1, double **mu,            double **aux,           long m, long init_k, long &quit, GivensCache_FP& cache){   long n = B.NumCols();   long i, j, k, Fc1;   ZZ MU;   double mu1;   double t1;   ZZ T1;   double *tp;   double half_plus_fudge = 0.5 + red_fudge;   quit = 0;   k = init_k;   vec_long in_vec_mem;   in_vec_mem.SetLength(n+1);   long *in_vec = in_vec_mem.elts();   double *max_b;   max_b = NTL_NEW_OP double [m+1];   if (!max_b) Error("out of memory in lll_G_LLL_FP");   for (i = 1; i <= m; i++)      max_b[i] = max_abs(B1[i], n);   long in_float;   long counter;   long trigger_index;   long small_trigger;   long cnt;   long max_k = 0;   double tt;   long swap_cnt = 0;   cache.flush();   while (k <= m) {      if (k > max_k) {         max_k = k;         swap_cnt = 0;      }      if (verbose) {         tt = GetTime();         if (tt > LastTime + LLLStatusInterval)            G_LLLStatus(max_k, tt, m, B);      }      GivensComputeGS(B1, mu, aux, k, n, cache);      if (swap_cnt > 200000) {         cerr << "G_LLL_FP: swap loop?\n";         swap_cnt = 0;      }      counter = 0;      trigger_index = k;      small_trigger = 0;      cnt = 0;      long sz=0, new_sz;      do {         // size reduction         counter++;         if ((counter & 127) == 0) {            new_sz = 0;            for (j = 1; j <= n; j++)               new_sz += NumBits(B(k,j));            if ((counter >> 7) == 1 || new_sz < sz) {               sz = new_sz;            }            else {               cerr << "G_LLL_FP: warning--infinite loop? (" << k << ")\n";            }         }         Fc1 = 0;            for (j = k-1; j >= 1; j--) {            t1 = fabs(mu[k][j]);            if (t1 > half_plus_fudge) {                if (!Fc1) {                  if (j > trigger_index ||                       (j == trigger_index && small_trigger)) {                     cnt++;                     if (cnt > 10) {                        inc_red_fudge();                        half_plus_fudge = 0.5 + red_fudge;                        cnt = 0;                     }                  }                  trigger_index = j;                  small_trigger = (t1 < 4);                  Fc1 = 1;                  RowTransformStart(B1[k], in_vec, in_float, n);               }                                 mu1 = mu[k][j];               if (mu1 >= 0)                  mu1 = ceil(mu1-0.5);               else                  mu1 = floor(mu1+0.5);                  double *mu_k = mu[k];               double *mu_j = mu[j];                  if (mu1 == 1) {                  for (i = 1; i <= j-1; i++)                     mu_k[i] -= mu_j[i];               }               else if (mu1 == -1) {                  for (i = 1; i <= j-1; i++)                     mu_k[i] += mu_j[i];               }               else {                  for (i = 1; i <= j-1; i++)                     mu_k[i] -= mu1*mu_j[i];               }                  mu_k[j] -= mu1;                  conv(MU, mu1);               RowTransform(B(k), B(j), MU, mu1, B1[k], B1[j], in_vec,                            max_b[k], max_b[j], in_float);               if (U) RowTransform((*U)(k), (*U)(j), MU);            }         }         if (Fc1) {            RowTransformFinish(B(k), B1[k], in_vec);            max_b[k] = max_abs(B1[k], n);            cache.touch();            GivensComputeGS(B1, mu, aux, k, n, cache);         }      } while (Fc1);      if (check && (*check)(B(k)))          quit = 1;      if (IsZero(B(k))) {         for (i = k; i < m; i++) {            // swap i, i+1            swap(B(i), B(i+1));            tp = B1[i]; B1[i] = B1[i+1]; B1[i+1] = tp;            t1 = max_b[i]; max_b[i] = max_b[i+1]; max_b[i+1] = t1;            if (U) swap((*U)(i), (*U)(i+1));         }         cache.flush();         m--;         if (quit) break;         continue;      }      if (quit) break;      if (deep > 0) {         // deep insertions         Error("sorry...deep insertions not implemented");      } // end deep insertions      // test G_LLL reduction condition      if (k > 1 &&          sqrt(delta - mu[k][k-1]*mu[k][k-1])*fabs(mu[k-1][k-1]) >          fabs(mu[k][k])) {         // swap rows k, k-1         swap(B(k), B(k-1));         tp = B1[k]; B1[k] = B1[k-1]; B1[k-1] = tp;         t1 = max_b[k]; max_b[k] = max_b[k-1]; max_b[k-1] = t1;         if (U) swap((*U)(k), (*U)(k-1));         cache.swap();         k--;         NumSwaps++;         swap_cnt++;         // cout << "-\n";      }      else {         cache.incr();         k++;         // cout << "+\n";      }   }   if (verbose) {      G_LLLStatus(m+1, GetTime(), m, B);   }   delete [] max_b;   return m;}staticlong G_LLL_FP(mat_ZZ& B, mat_ZZ* U, double delta, long deep,            LLLCheckFct check){   long m = B.NumRows();   long n = B.NumCols();   long i, j;   long new_m, dep, quit;   ZZ MU;   ZZ T1;   init_red_fudge();   if (U) ident(*U, m);   double **B1;  // approximates B   typedef double *doubleptr;   B1 = NTL_NEW_OP doubleptr[m+1];   if (!B1) Error("G_LLL_FP: out of memory");   for (i = 1; i <= m; i++) {      B1[i] = NTL_NEW_OP double[n+1];      if (!B1[i]) Error("G_LLL_FP: out of memory");   }   double **mu;   mu = NTL_NEW_OP doubleptr[m+1];   if (!mu) Error("G_LLL_FP: out of memory");   for (i = 1; i <= m; i++) {      mu[i] = NTL_NEW_OP double[n+2];      if (!mu[i]) Error("G_LLL_FP: out of memory");   }   double **aux;   aux = NTL_NEW_OP doubleptr[m+1];   if (!aux) Error("G_LLL_FP: out of memory");   for (i = 1; i <= m; i++) {      aux[i] = NTL_NEW_OP double[n+1];      if (!aux[i]) Error("G_LLL_FP: out of memory");   }   for (i = 1; i <=m; i++)      for (j = 1; j <= n; j++)          conv(B1[i][j], B(i, j));            for (i = 1; i <= m; i++)       for (j = 1; j <= n; j++)         if (!IsFinite(&B1[i][j]))             Error("G_LLL_FP: numbers too big...use G_LLL_XD");   GivensCache_FP cache(m, n);   new_m = ll_G_LLL_FP(B, U, delta, deep, check, B1, mu, aux, m, 1, quit, cache);   dep = m - new_m;   m = new_m;   if (dep > 0) {      // for consistency, we move all of the zero rows to the front      for (i = 0; i < m; i++) {         swap(B(m+dep-i), B(m-i));         if (U) swap((*U)(m+dep-i), (*U)(m-i));      }   }   // clean-up   for (i = 1; i <= m; i++) {      delete [] B1[i];   }   delete [] B1;   for (i = 1; i <= m; i++) {      delete [] mu[i];   }   delete [] mu;   for (i = 1; i <= m; i++) {      delete [] aux[i];   }   delete [] aux;   return m;}         long G_LLL_FP(mat_ZZ& B, double delta, long deep, LLLCheckFct check,            long verb){   verbose = verb;   NumSwaps = 0;   if (verbose) {      StartTime = GetTime();      LastTime = StartTime;   }   if (delta < 0.50 || delta >= 1) Error("G_LLL_FP: bad delta");   if (deep < 0) Error("G_LLL_FP: bad deep");   return G_LLL_FP(B, 0, delta, deep, check);}long G_LLL_FP(mat_ZZ& B, mat_ZZ& U, double delta, long deep,            LLLCheckFct check, long verb){   verbose = verb;   NumSwaps = 0;   if (verbose) {      StartTime = GetTime();      LastTime = StartTime;   }   if (delta < 0.50 || delta >= 1) Error("G_LLL_FP: bad delta");   if (deep < 0) Error("G_LLL_FP: bad deep");   return G_LLL_FP(B, &U, delta, deep, check);}static vec_double G_BKZConstant;staticvoid ComputeG_BKZConstant(long beta, long p){   const double c_PI = 3.14159265358979323846264338328;   const double LogPI = 1.14472988584940017414342735135;   G_BKZConstant.SetLength(beta-1);   vec_double Log;   Log.SetLength(beta);   long i, j, k;   double x, y;   for (j = 1; j <= beta; j++)      Log(j) = log(double(j));   for (i = 1; i <= beta-1; i++) {      // First, we compute x = gamma(i/2)^{2/i}      k = i/2;      if ((i & 1) == 0) { // i even         x = 0;         for (j = 1; j <= k; j++)            x = x + Log(j);                   x = x * (1/double(k));         x = exp(x);      }      else { // i odd         x = 0;         for (j = k + 2; j <= 2*k + 2; j++)            x = x + Log(j);         x = 0.5*LogPI + x - 2*(k+1)*Log(2);         x = x * (2.0/double(i));         x = exp(x);      }      // Second, we compute y = 2^{2*p/i}      y = -(2*p/double(i))*Log(2);      y = exp(y);      G_BKZConstant(i) = x*y/c_PI;   }}static vec_double G_BKZThresh;static void ComputeG_BKZThresh(double *c, long beta){   G_BKZThresh.SetLength(beta-1);   long i;   double x;   x = 0;   for (i = 1; i <= beta-1; i++) {      x += log(c[i-1]);      G_BKZThresh(i) = exp(x/double(i))*G_BKZConstant(i);      if (!IsFinite(&G_BKZThresh(i))) G_BKZThresh(i) = 0;   }}static void G_BKZStatus(double tt, double enum_time, long NumIterations,                long NumTrivial, long NumNonTrivial, long NumNoOps, long m,                const mat_ZZ& B){   cerr << "---- G_BKZ_FP status ----\n";   cerr << "elapsed time: ";   PrintTime(cerr, tt-StartTime);   cerr << ", enum time: ";   PrintTime(cerr, enum_time);   cerr << ", iter: " << NumIterations << "\n";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -