static void NextFFTPrime(long& q, long& w) { NTL_THREAD_LOCAL static long m = NTL_FFTMaxRootBnd + 1; NTL_THREAD_LOCAL 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; } }
zz_pInfoT::zz_pInfoT(INIT_USER_FFT_TYPE, long q) { long w; if (!IsFFTPrime(q, w)) LogicError("invalid user supplied prime"); p = q; pinv = 1/((double) q); p_info_owner.make(); p_info = p_info_owner.get(); bool bigtab = false; #ifdef NTL_FFT_BIGTAB bigtab = true; #endif InitFFTPrimeInfo(*p_info, q, w, bigtab); NumPrimes = 1; PrimeCnt = 0; MaxRoot = CalcMaxRoot(p); }