void UseFFTPrime(long index) { long numprimes = FFTTables_store.length(); if (index < 0 || index > numprimes) Error("invalid FFT prime index"); if (index < numprimes) return; // index == numprimes long q, w; NextFFTPrime(q, w); FFTTables_store.SetLength(numprimes+1); FFTTables = FFTTables_store.elts(); FFTTables[numprimes] = NTL_NEW_OP FFTPrimeInfo(); if (!FFTTables[numprimes]) Error("out of memory in UseFFTPrime"); FFTPrimeInfo& info = *FFTTables[numprimes]; long bigtab = 0; #ifdef NTL_FFT_BIGTAB if (index < NTL_FFT_BIGTAB_LIMIT) bigtab = 1; #endif InitFFTPrimeInfo(info, q, w, bigtab); info.zz_p_context = Build_zz_pInfo(&info); // initialize data structures for the legacy inteface NumFFTPrimes = FFTTables_store.length(); FFTPrime_store.SetLength(NumFFTPrimes); FFTPrime = FFTPrime_store.elts(); FFTPrime[NumFFTPrimes-1] = q; FFTPrimeInv_store.SetLength(NumFFTPrimes); FFTPrimeInv = FFTPrimeInv_store.elts(); FFTPrimeInv[NumFFTPrimes-1] = 1/((double) q); }
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); }