private static final long[][] vandermonde (long[] smp, long[] evl, int mA, int mB) {
        int nrows = mA + mB;
        int ncols = nrows + 1;
        long[] pv = new long[(mA>mB?mA:mB) + 1];
        long[][] result = new long[nrows][ncols];

        pv[0] = 1;
        for (int i = 0; i < nrows; i++) {
            for (int j = 1; j < pv.length; j++) pv[j] = PF.mul(pv[j-1],smp[i]);
            for (int j = 0; j < mA; j++) result[i][j] = pv[j];
            for (int j = 0; j < mB; j++) 
                result[i][mA + j] = PF.mul(PF.neg(evl[i]), pv[j]);
            result[i][mA + mB] = PF.sub(PF.mul(evl[i], pv[mB]), pv[mA]);
        }
        return result;
    }