void interp(HyperCube<zz_p>& cube, const Vec< copied_ptr<FFTHelper> >& multiEvalPoints) { zz_pX tmp1; Vec<zz_p> tmp2; recursiveInterp(CubeSlice<zz_p>(cube), multiEvalPoints, 0, tmp1, tmp2); // result is not normalized, so we fix that now... long k = multiEvalPoints.length(); zz_p m_inv = conv<zz_p>(1); for (long d = 0; d < k; d++) m_inv *= multiEvalPoints[d]->get_m_inv(); cube.getData() *= m_inv; }
void recursiveInterp(const CubeSlice<zz_p>& s, const Vec< copied_ptr<FFTHelper> >& multiEvalPoints, long d, zz_pX& tmp1, Vec<zz_p>& tmp2) { long numDims = s.getNumDims(); assert(numDims > 0); long posBnd = s.getProd(1); for (long pos = 0; pos < posBnd; pos++) { getHyperColumn(tmp2, s, pos); multiEvalPoints[d]->iFFT(tmp1, tmp2, false); // do not normalize setHyperColumn(tmp1.rep, s, pos, zz_p::zero()); } if (numDims > 1) { long dim0 = s.getDim(0); for (long i = 0; i < dim0; i++) recursiveInterp(CubeSlice<zz_p>(s, i), multiEvalPoints, d+1, tmp1, tmp2); } }