UNPKG

ts-scikit

Version:

A scientific toolkit written in Typescript

1,422 lines 158 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FftPfa = void 0; const utils_1 = require("../utils"); /** * A prime-factor (PFA) complex-to-complex FFT. * <p> * The FFT length nfft must be composed of mutually prime factors from the * set { 2, 3, 4, 5, 7, 8, 9, 11, 13, 16 }. This restriction implies n * cannot exceed 720720 = 5 * 7 * 9 * 11 * 13 * 16. * <p> * References: * <ul><li> * Temperton, C., 1985, Implementation of a self-sorting in-place prime * factor fft algorithm: Journal of Computational Physics, v. 58, * p. 283-299. * </li><li> * Temperton, C., 1988, A new set of minimum-add rotated rotated dft * modules: Journal of Computational Physics, v. 75, p. 190-198. * </li></ul> */ class FftPfa { /** * Determines whether the specified FFT length is valid. * @param nfft the FFT length. * @returns true, if FFT length is value; false, otherwise. */ static IsValidNFFT(nfft) { return utils_1.binarySearch(this._ntable, nfft) >= 0; } /** * Returns an FFT length optimized for memory. * <p> * The FFT length will be the smallest valid length that is not less than * the specified length n. * @param n the lower bound on FFT length. * @returns the FFT length. */ static SmallNFFT(n) { utils_1.Check.argument(n <= 720720, 'n does not exceed 720720'); let i = utils_1.binarySearch(this._ntable, n); if (i < 0) { i = -(i + 1); } return this._ntable[i]; } /** * Returns an FFT length optimized for speed. * <p> * The FFT length will be the fastest valid length that is not less than * the specified length n. * @param n the lower bound on FFT length. * @returns the FFT length. */ static FastNFFT(n) { utils_1.Check.argument(n <= 720720, 'n does not exceed 720720'); let ifast = utils_1.binarySearch(this._ntable, n); if (ifast < 0) { ifast = -(ifast + 1); } let nfast = this._ntable[ifast]; const nstop = 2 * nfast; let cfast = this._ctable[ifast]; for (let i = ifast + 1; i < this._NTABLE && this._ntable[i] < nstop; i++) { if (this._ctable[i] < cfast) { cfast = this._ctable[i]; nfast = this._ntable[i]; } } return nfast; } /** * Prime-factor complex-to-complex FFT for 1D arrays. * @param sign the sign of the exponent in the Fourier transform. * @param nfft the FFT length. * @param z array[2*nfft] of nfft packed complex numbers. */ static Transform(sign, nfft, z) { // What is left of n after dividing by factors. let nleft = nfft; // Loop over all possible factors, from largest to smallest. for (let jfac = 0; jfac < this._NFAC; jfac++) { // Skip the current factor if not a mutually prime factor of n. const ifac = Math.floor(this._kfac[jfac]); const ndiv = Math.floor(nleft / ifac); if (ndiv * ifac !== nleft) { continue; } // What is left of n (nleft), and n divided by the current factor (m). nleft = ndiv; const m = Math.floor(nfft / ifac); // Rotation factor mu and stride mm. let mu = 0; let mm = 0; for (let kfac = 1; kfac <= ifac && mm % ifac !== 1; ++kfac) { mu = kfac; mm = kfac * m; } if (sign < 0) { mu = ifac - mu; } // Array stride, bound, and indices. const jinc = 2 * mm; const jmax = 2 * nfft; const j0 = 0; const j1 = j0 + jinc; // Factor 2. if (ifac === 2) { this._pfa2(z, m, j0, j1); continue; } const j2 = (j1 + jinc) % jmax; // Factor 3. if (ifac === 3) { this._pfa3(z, mu, m, j0, j1, j2); continue; } const j3 = (j2 + jinc) % jmax; // Factor 4. if (ifac === 4) { this._pfa4(z, mu, m, j0, j1, j2, j3); continue; } const j4 = (j3 + jinc) % jmax; // Factor 5. if (ifac === 5) { this._pfa5(z, mu, m, j0, j1, j2, j3, j4); continue; } const j5 = (j4 + jinc) % jmax; const j6 = (j5 + jinc) % jmax; // Factor 7. if (ifac === 7) { this._pfa7(z, mu, m, j0, j1, j2, j3, j4, j5, j6); continue; } const j7 = (j6 + jinc) % jmax; // Factor 8. if (ifac === 8) { this._pfa8(z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7); continue; } const j8 = (j7 + jinc) % jmax; // Factor 9. if (ifac === 9) { this._pfa9(z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8); continue; } const j9 = (j8 + jinc) % jmax; const j10 = (j9 + jinc) % jmax; // Factor 11. if (ifac === 11) { this._pfa11(z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10); continue; } const j11 = (j10 + jinc) % jmax; const j12 = (j11 + jinc) % jmax; // Factor 13. if (ifac === 13) { this._pfa13(z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12); continue; } const j13 = (j12 + jinc) % jmax; const j14 = (j13 + jinc) % jmax; const j15 = (j14 + jinc) % jmax; // Factor 16. if (ifac === 16) { this._pfa16(z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15); } } } /** * Prime-factor complex-to-complex multiple FFT. * <p> * Performs multiple transforms across the 2nd (slowest) dimension of a 2-D * array. In this version, z[0:nfft-1][0,2,4,...] contains the real parts, * and z[0:nfft-1][1,3,5,...] contains the imaginary parts. * @param sign the sign of the exponent in the Fourier transform. * @param n1 the number of transforms (fast dimension). * @param nfft the FFT length (slow dimension). * @param z array[nfft][2*n1] of n1*nfft packed complex numbers */ static Transform2a(sign, n1, nfft, z) { // What is left of n after dividing by factors. let nleft = nfft; // Loop over all possible factors, from largest to smallest. for (let jfac = 0; jfac < this._NFAC; ++jfac) { // Skip the current factor, if not a mutually prime factor of n const ifac = this._kfac[jfac]; const ndiv = nleft / ifac; if (ndiv * ifac !== nleft) continue; // What is left of n (nleft), and n divided by the current factor (m). nleft = ndiv; const m = nfft / ifac; // Rotation factor mu and stride mm. let mu = 0; let mm = 0; for (let kfac = 1; kfac <= ifac && mm % ifac !== 1; ++kfac) { mu = kfac; mm = kfac * m; } if (sign < 0) mu = ifac - mu; // Array stride, bound, and indices. const jinc = mm; const jmax = nfft; const j0 = 0; const j1 = j0 + jinc; // Factor 2. if (ifac === 2) { this._pfa2a(n1, z, m, j0, j1); continue; } const j2 = (j1 + jinc) % jmax; // Factor 3. if (ifac === 3) { this._pfa3a(n1, z, mu, m, j0, j1, j2); continue; } const j3 = (j2 + jinc) % jmax; // Factor 4. if (ifac === 4) { this._pfa4a(n1, z, mu, m, j0, j1, j2, j3); continue; } const j4 = (j3 + jinc) % jmax; // Factor 5. if (ifac === 5) { this._pfa5a(n1, z, mu, m, j0, j1, j2, j3, j4); continue; } const j5 = (j4 + jinc) % jmax; const j6 = (j5 + jinc) % jmax; // Factor 7. if (ifac === 7) { this._pfa7a(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6); continue; } const j7 = (j6 + jinc) % jmax; // Factor 8. if (ifac === 8) { this._pfa8a(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7); continue; } const j8 = (j7 + jinc) % jmax; // Factor 9. if (ifac === 9) { this._pfa9a(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8); continue; } const j9 = (j8 + jinc) % jmax; const j10 = (j9 + jinc) % jmax; // Factor 11. if (ifac === 11) { this._pfa11a(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10); continue; } const j11 = (j10 + jinc) % jmax; const j12 = (j11 + jinc) % jmax; // Factor 13. if (ifac === 13) { this._pfa13a(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12); continue; } const j13 = (j12 + jinc) % jmax; const j14 = (j13 + jinc) % jmax; const j15 = (j14 + jinc) % jmax; // Factor 16. if (ifac === 16) { this._pfa16a(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15); } } } /** * Prime-factor complex-to-complex multiple FFT. * <p> * Performs multiple transforms across the 2nd (slowest) dimension of a 2-D * array. In this version, z[0,2,4,...][0:n1-1] contains the real parts, * and z[1,3,5,...][0:n1-1] contains the imaginary parts. * @param sign the sign of the exponent in the Fourier transform. * @param n1 the number of transforms (fast dimension). * @param nfft the FFT length (slow dimension). * @param z array[nfft*2[n1] of nfft*n1 complex numbers. */ static Transform2b(sign, n1, nfft, z) { // What is left of n after dividing by factors. let nleft = nfft; // Loop over all possible factors, from largest to smallest. for (let jfac = 0; jfac < this._NFAC; ++jfac) { // Skip the current factor, if not a mutually prime factor of n const ifac = this._kfac[jfac]; const ndiv = nleft / ifac; if (ndiv * ifac !== nleft) continue; // What is left of n (nleft), and n divided by the current factor (m). nleft = ndiv; const m = nfft / ifac; // Rotation factor mu and stride mm. let mu = 0; let mm = 0; for (let kfac = 1; kfac <= ifac && mm % ifac !== 1; ++kfac) { mu = kfac; mm = kfac * m; } if (sign < 0) mu = ifac - mu; // Array stride, bound, and indices. const jinc = 2 * mm; const jmax = 2 * nfft; const j0 = 0; const j1 = j0 + jinc; // Factor 2. if (ifac === 2) { this._pfa2b(n1, z, m, j0, j1); continue; } const j2 = (j1 + jinc) % jmax; // Factor 3. if (ifac === 3) { this._pfa3b(n1, z, mu, m, j0, j1, j2); continue; } const j3 = (j2 + jinc) % jmax; // Factor 4. if (ifac === 4) { this._pfa4b(n1, z, mu, m, j0, j1, j2, j3); continue; } const j4 = (j3 + jinc) % jmax; // Factor 5. if (ifac === 5) { this._pfa5b(n1, z, mu, m, j0, j1, j2, j3, j4); continue; } const j5 = (j4 + jinc) % jmax; const j6 = (j5 + jinc) % jmax; // Factor 7. if (ifac === 7) { this._pfa7b(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6); continue; } const j7 = (j6 + jinc) % jmax; // Factor 8. if (ifac === 8) { this._pfa8b(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7); continue; } const j8 = (j7 + jinc) % jmax; // Factor 9. if (ifac === 9) { this._pfa9b(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8); continue; } const j9 = (j8 + jinc) % jmax; const j10 = (j9 + jinc) % jmax; // Factor 11. if (ifac === 11) { this._pfa11b(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10); continue; } const j11 = (j10 + jinc) % jmax; const j12 = (j11 + jinc) % jmax; // Factor 13. if (ifac === 13) { this._pfa13b(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12); continue; } const j13 = (j12 + jinc) % jmax; const j14 = (j13 + jinc) % jmax; const j15 = (j14 + jinc) % jmax; // Factor 16. if (ifac === 16) { this._pfa16b(n1, z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15); } } } static _pfa2(z, m, j0, j1) { for (let i = 0; i < m; i++) { const t1r = z[j0] - z[j1]; const t1i = z[j0 + 1] - z[j1 + 1]; z[j0] = z[j0] + z[j1]; z[j0 + 1] = z[j0 + 1] + z[j1 + 1]; z[j1] = t1r; z[j1 + 1] = t1i; const jt = j1 + 2; j1 = j0 + 2; j0 = jt; } } static _pfa3(z, mu, m, j0, j1, j2) { let c1; if (mu === 1) { c1 = this._P866; } else { c1 = -this._P866; } for (let i = 0; i < m; i++) { const t1r = z[j1] + z[j2]; const t1i = z[j1 + 1] + z[j2 + 1]; const y1r = z[j0] - 0.5 * t1r; const y1i = z[j0 + 1] - 0.5 * t1i; const y2r = c1 * (z[j1] - z[j2]); const y2i = c1 * (z[j1 + 1] - z[j2 + 1]); z[j0] = z[j0] + t1r; z[j0 + 1] = z[j0 + 1] + t1i; z[j1] = y1r - y2i; z[j1 + 1] = y1i + y2r; z[j2] = y1r + y2i; z[j2 + 1] = y1i - y2r; const jt = j2 + 2; j2 = j1 + 2; j1 = j0 + 2; j0 = jt; } } static _pfa4(z, mu, m, j0, j1, j2, j3) { let c1; if (mu === 1) { c1 = this._PONE; } else { c1 = -this._PONE; } for (let i = 0; i < m; i++) { const t1r = z[j0] + z[j2]; const t1i = z[j0 + 1] + z[j2 + 1]; const t2r = z[j1] + z[j3]; const t2i = z[j1 + 1] + z[j3 + 1]; const y1r = z[j0] - z[j2]; const y1i = z[j0 + 1] - z[j2 + 1]; const y3r = c1 * (z[j1] - z[j3]); const y3i = c1 * (z[j1 + 1] - z[j3 + 1]); z[j0] = t1r + t2r; z[j0 + 1] = t1i + t2i; z[j1] = y1r - y3i; z[j1 + 1] = y1i + y3r; z[j2] = t1r - t2r; z[j2 + 1] = t1i - t2i; z[j3] = y1r + y3i; z[j3 + 1] = y1i - y3r; const jt = j3 + 2; j3 = j2 + 2; j2 = j1 + 2; j1 = j0 + 2; j0 = jt; } } static _pfa5(z, mu, m, j0, j1, j2, j3, j4) { let c1, c2, c3; if (mu === 1) { c1 = this._P559; c2 = this._P951; c3 = this._P587; } else if (mu === 2) { c1 = -this._P559; c2 = this._P587; c3 = -this._P951; } else if (mu === 3) { c1 = -this._P559; c2 = -this._P587; c3 = this._P951; } else { c1 = this._P559; c2 = -this._P951; c3 = -this._P587; } for (let i = 0; i < m; i++) { const t1r = z[j1] + z[j4]; const t1i = z[j1 + 1] + z[j4 + 1]; const t2r = z[j2] + z[j3]; const t2i = z[j2 + 1] + z[j3 + 1]; const t3r = z[j1] - z[j4]; const t3i = z[j1 + 1] - z[j4 + 1]; const t4r = z[j2] - z[j3]; const t4i = z[j2 + 1] - z[j3 + 1]; const t5r = t1r + t2r; const t5i = t1i + t2i; const t6r = c1 * (t1r - t2r); const t6i = c1 * (t1i - t2i); const t7r = z[j0] - 0.25 * t5r; const t7i = z[j0 + 1] - 0.25 * t5i; const y1r = t7r + t6r; const y1i = t7i + t6i; const y2r = t7r - t6r; const y2i = t7i - t6i; const y3r = c3 * t3r - c2 * t4r; const y3i = c3 * t3i - c2 * t4i; const y4r = c2 * t3r + c3 * t4r; const y4i = c2 * t3i + c3 * t4i; z[j0] = z[j0] + t5r; z[j0 + 1] = z[j0 + 1] + t5i; z[j1] = y1r - y4i; z[j1 + 1] = y1i + y4r; z[j2] = y2r - y3i; z[j2 + 1] = y2i + y3r; z[j3] = y2r + y3i; z[j3 + 1] = y2i - y3r; z[j4] = y1r + y4i; z[j4 + 1] = y1i - y4r; const jt = j4 + 2; j4 = j3 + 2; j3 = j2 + 2; j2 = j1 + 2; j1 = j0 + 2; j0 = jt; } } static _pfa7(z, mu, m, j0, j1, j2, j3, j4, j5, j6) { let c1, c2, c3, c4, c5, c6; if (mu === 1) { c1 = this._P623; c2 = -this._P222; c3 = -this._P900; c4 = this._P781; c5 = this._P974; c6 = this._P433; } else if (mu === 2) { c1 = -this._P222; c2 = -this._P900; c3 = this._P623; c4 = this._P974; c5 = -this._P433; c6 = -this._P781; } else if (mu === 3) { c1 = -this._P900; c2 = this._P623; c3 = -this._P222; c4 = this._P433; c5 = -this._P781; c6 = this._P974; } else if (mu === 4) { c1 = -this._P900; c2 = this._P623; c3 = -this._P222; c4 = -this._P433; c5 = this._P781; c6 = -this._P974; } else if (mu === 5) { c1 = -this._P222; c2 = -this._P900; c3 = this._P623; c4 = -this._P974; c5 = this._P433; c6 = this._P781; } else { c1 = this._P623; c2 = -this._P222; c3 = -this._P900; c4 = -this._P781; c5 = -this._P974; c6 = -this._P433; } for (let i = 0; i < m; i++) { const t1r = z[j1] + z[j6]; const t1i = z[j1 + 1] + z[j6 + 1]; const t2r = z[j2] + z[j5]; const t2i = z[j2 + 1] + z[j5 + 1]; const t3r = z[j3] + z[j4]; const t3i = z[j3 + 1] + z[j4 + 1]; const t4r = z[j1] - z[j6]; const t4i = z[j1 + 1] - z[j6 + 1]; const t5r = z[j2] - z[j5]; const t5i = z[j2 + 1] - z[j5 + 1]; const t6r = z[j3] - z[j4]; const t6i = z[j3 + 1] - z[j4 + 1]; const t7r = z[j0] - 0.5 * t3r; const t7i = z[j0 + 1] - 0.5 * t3i; const t8r = t1r - t3r; const t8i = t1i - t3i; const t9r = t2r - t3r; const t9i = t2i - t3i; const y1r = t7r + c1 * t8r + c2 * t9r; const y1i = t7i + c1 * t8i + c2 * t9i; const y2r = t7r + c2 * t8r + c3 * t9r; const y2i = t7i + c2 * t8i + c3 * t9i; const y3r = t7r + c3 * t8r + c1 * t9r; const y3i = t7i + c3 * t8i + c1 * t9i; const y4r = c6 * t4r - c4 * t5r + c5 * t6r; const y4i = c6 * t4i - c4 * t5i + c5 * t6i; const y5r = c5 * t4r - c6 * t5r - c4 * t6r; const y5i = c5 * t4i - c6 * t5i - c4 * t6i; const y6r = c4 * t4r + c5 * t5r + c6 * t6r; const y6i = c4 * t4i + c5 * t5i + c6 * t6i; z[j0] = z[j0] + t1r + t2r + t3r; z[j0 + 1] = z[j0 + 1] + t1i + t2i + t3i; z[j1] = y1r - y6i; z[j1 + 1] = y1i + y6r; z[j2] = y2r - y5i; z[j2 + 1] = y2i + y5r; z[j3] = y3r - y4i; z[j3 + 1] = y3i + y4r; z[j4] = y3r + y4i; z[j4 + 1] = y3i - y4r; z[j5] = y2r + y5i; z[j5 + 1] = y2i - y5r; z[j6] = y1r + y6i; z[j6 + 1] = y1i - y6r; const jt = j6 + 2; j6 = j5 + 2; j5 = j4 + 2; j4 = j3 + 2; j3 = j2 + 2; j2 = j1 + 2; j1 = j0 + 2; j0 = jt; } } static _pfa8(z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7) { let c1, c2, c3; if (mu === 1) { c1 = this._PONE; c2 = this._P707; } else if (mu === 3) { c1 = -this._PONE; c2 = -this._P707; } else if (mu === 5) { c1 = this._PONE; c2 = -this._P707; } else { c1 = -this._PONE; c2 = this._P707; } c3 = c1 * c2; for (let i = 0; i < m; i++) { const t1r = z[j0] + z[j4]; const t1i = z[j0 + 1] + z[j4 + 1]; const t2r = z[j0] - z[j4]; const t2i = z[j0 + 1] - z[j4 + 1]; const t3r = z[j1] + z[j5]; const t3i = z[j1 + 1] + z[j5 + 1]; const t4r = z[j1] - z[j5]; const t4i = z[j1 + 1] - z[j5 + 1]; const t5r = z[j2] + z[j6]; const t5i = z[j2 + 1] + z[j6 + 1]; const t6r = c1 * (z[j2] - z[j6]); const t6i = c1 * (z[j2 + 1] - z[j6 + 1]); const t7r = z[j3] + z[j7]; const t7i = z[j3 + 1] + z[j7 + 1]; const t8r = z[j3] - z[j7]; const t8i = z[j3 + 1] - z[j7 + 1]; const t9r = t1r + t5r; const t9i = t1i + t5i; const t10r = t3r + t7r; const t10i = t3i + t7i; const t11r = c2 * (t4r - t8r); const t11i = c2 * (t4i - t8i); const t12r = c3 * (t4r + t8r); const t12i = c3 * (t4i + t8i); const y1r = t2r + t11r; const y1i = t2i + t11i; const y2r = t1r - t5r; const y2i = t1i - t5i; const y3r = t2r - t11r; const y3i = t2i - t11i; const y5r = t12r - t6r; const y5i = t12i - t6i; const y6r = c1 * (t3r - t7r); const y6i = c1 * (t3i - t7i); const y7r = t12r + t6r; const y7i = t12i + t6i; z[j0] = t9r + t10r; z[j0 + 1] = t9i + t10i; z[j1] = y1r - y7i; z[j1 + 1] = y1i + y7r; z[j2] = y2r - y6i; z[j2 + 1] = y2i + y6r; z[j3] = y3r - y5i; z[j3 + 1] = y3i + y5r; z[j4] = t9r - t10r; z[j4 + 1] = t9i - t10i; z[j5] = y3r + y5i; z[j5 + 1] = y3i - y5r; z[j6] = y2r + y6i; z[j6 + 1] = y2i - y6r; z[j7] = y1r + y7i; z[j7 + 1] = y1i - y7r; const jt = j7 + 2; j7 = j6 + 2; j6 = j5 + 2; j5 = j4 + 2; j4 = j3 + 2; j3 = j2 + 2; j2 = j1 + 2; j1 = j0 + 2; j0 = jt; } } static _pfa9(z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8) { let c1, c2, c3, c4, c5, c6, c7, c8, c9; if (mu === 1) { c1 = this._P866; c2 = this._P766; c3 = this._P642; c4 = this._P173; c5 = this._P984; } else if (mu === 2) { c1 = -this._P866; c2 = this._P173; c3 = this._P984; c4 = -this._P939; c5 = this._P342; } else if (mu === 4) { c1 = this._P866; c2 = -this._P939; c3 = this._P342; c4 = this._P766; c5 = -this._P642; } else if (mu === 5) { c1 = -this._P866; c2 = -this._P939; c3 = -this._P342; c4 = this._P766; c5 = this._P642; } else if (mu === 7) { c1 = this._P866; c2 = this._P173; c3 = -this._P984; c4 = -this._P939; c5 = -this._P342; } else { c1 = -this._P866; c2 = this._P766; c3 = -this._P642; c4 = this._P173; c5 = -this._P984; } c6 = c1 * c2; c7 = c1 * c3; c8 = c1 * c4; c9 = c1 * c5; for (let i = 0; i < m; i++) { const t1r = z[j3] + z[j6]; const t1i = z[j3 + 1] + z[j6 + 1]; const t2r = z[j0] - 0.5 * t1r; const t2i = z[j0 + 1] - 0.5 * t1i; const t3r = c1 * (z[j3] - z[j6]); const t3i = c1 * (z[j3 + 1] - z[j6 + 1]); const t4r = z[j0] + t1r; const t4i = z[j0 + 1] + t1i; const t5r = z[j4] + z[j7]; const t5i = z[j4 + 1] + z[j7 + 1]; const t6r = z[j1] - 0.5 * t5r; const t6i = z[j1 + 1] - 0.5 * t5i; const t7r = z[j4] - z[j7]; const t7i = z[j4 + 1] - z[j7 + 1]; const t8r = z[j1] + t5r; const t8i = z[j1 + 1] + t5i; const t9r = z[j2] + z[j5]; const t9i = z[j2 + 1] + z[j5 + 1]; const t10r = z[j8] - 0.5 * t9r; const t10i = z[j8 + 1] - 0.5 * t9i; const t11r = z[j2] - z[j5]; const t11i = z[j2 + 1] - z[j5 + 1]; const t12r = z[j8] + t9r; const t12i = z[j8 + 1] + t9i; const t13r = t8r + t12r; const t13i = t8i + t12i; const t14r = t6r + t10r; const t14i = t6i + t10i; const t15r = t6r - t10r; const t15i = t6i - t10i; const t16r = t7r + t11r; const t16i = t7i + t11i; const t17r = t7r - t11r; const t17i = t7i - t11i; const t18r = c2 * t14r - c7 * t17r; const t18i = c2 * t14i - c7 * t17i; const t19r = c4 * t14r + c9 * t17r; const t19i = c4 * t14i + c9 * t17i; const t20r = c3 * t15r + c6 * t16r; const t20i = c3 * t15i + c6 * t16i; const t21r = c5 * t15r - c8 * t16r; const t21i = c5 * t15i - c8 * t16i; const t22r = t18r + t19r; const t22i = t18i + t19i; const t23r = t20r - t21r; const t23i = t20i - t21i; const y1r = t2r + t18r; const y1i = t2i + t18i; const y2r = t2r + t19r; const y2i = t2i + t19i; const y3r = t4r - 0.5 * t13r; const y3i = t4i - 0.5 * t13i; const y4r = t2r - t22r; const y4i = t2i - t22i; const y5r = t3r - t23r; const y5i = t3i - t23i; const y6r = c1 * (t8r - t12r); const y6i = c1 * (t8i - t12i); const y7r = t21r - t3r; const y7i = t21i - t3i; const y8r = t3r + t20r; const y8i = t3i + t20i; z[j0] = t4r + t13r; z[j0 + 1] = t4i + t13i; z[j1] = y1r - y8i; z[j1 + 1] = y1i + y8r; z[j2] = y2r - y7i; z[j2 + 1] = y2i + y7r; z[j3] = y3r - y6i; z[j3 + 1] = y3i + y6r; z[j4] = y4r - y5i; z[j4 + 1] = y4i + y5r; z[j5] = y4r + y5i; z[j5 + 1] = y4i - y5r; z[j6] = y3r + y6i; z[j6 + 1] = y3i - y6r; z[j7] = y2r + y7i; z[j7 + 1] = y2i - y7r; z[j8] = y1r + y8i; z[j8 + 1] = y1i - y8r; const jt = j8 + 2; j8 = j7 + 2; j7 = j6 + 2; j6 = j5 + 2; j5 = j4 + 2; j4 = j3 + 2; j3 = j2 + 2; j2 = j1 + 2; j1 = j0 + 2; j0 = jt; } } static _pfa11(z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10) { let c1, c2, c3, c4, c5, c6, c7, c8, c9, c10; if (mu === 1) { c1 = this._P841; c2 = this._P415; c3 = -this._P142; c4 = -this._P654; c5 = -this._P959; c6 = this._P540; c7 = this._P909; c8 = this._P989; c9 = this._P755; c10 = this._P281; } else if (mu === 2) { c1 = this._P415; c2 = -this._P654; c3 = -this._P959; c4 = -this._P142; c5 = this._P841; c6 = this._P909; c7 = this._P755; c8 = -this._P281; c9 = -this._P989; c10 = -this._P540; } else if (mu === 3) { c1 = -this._P142; c2 = -this._P959; c3 = this._P415; c4 = this._P841; c5 = -this._P654; c6 = this._P989; c7 = -this._P281; c8 = -this._P909; c9 = this._P540; c10 = this._P755; } else if (mu === 4) { c1 = -this._P654; c2 = -this._P142; c3 = this._P841; c4 = -this._P959; c5 = this._P415; c6 = this._P755; c7 = -this._P989; c8 = this._P540; c9 = this._P281; c10 = -this._P909; } else if (mu === 5) { c1 = -this._P959; c2 = this._P841; c3 = -this._P654; c4 = this._P415; c5 = -this._P142; c6 = this._P281; c7 = -this._P540; c8 = this._P755; c9 = -this._P909; c10 = this._P989; } else if (mu === 6) { c1 = -this._P959; c2 = this._P841; c3 = -this._P654; c4 = this._P415; c5 = -this._P142; c6 = -this._P281; c7 = this._P540; c8 = -this._P755; c9 = this._P909; c10 = -this._P989; } else if (mu === 7) { c1 = -this._P654; c2 = -this._P142; c3 = this._P841; c4 = -this._P959; c5 = this._P415; c6 = -this._P755; c7 = this._P989; c8 = -this._P540; c9 = -this._P281; c10 = this._P909; } else if (mu === 8) { c1 = -this._P142; c2 = -this._P959; c3 = this._P415; c4 = this._P841; c5 = -this._P654; c6 = -this._P989; c7 = this._P281; c8 = this._P909; c9 = -this._P540; c10 = -this._P755; } else if (mu === 9) { c1 = this._P415; c2 = -this._P654; c3 = -this._P959; c4 = -this._P142; c5 = this._P841; c6 = -this._P909; c7 = -this._P755; c8 = this._P281; c9 = this._P989; c10 = this._P540; } else { c1 = this._P841; c2 = this._P415; c3 = -this._P142; c4 = -this._P654; c5 = -this._P959; c6 = -this._P540; c7 = -this._P909; c8 = -this._P989; c9 = -this._P755; c10 = -this._P281; } for (let i = 0; i < m; i++) { const t1r = z[j1] + z[j10]; const t1i = z[j1 + 1] + z[j10 + 1]; const t2r = z[j2] + z[j9]; const t2i = z[j2 + 1] + z[j9 + 1]; const t3r = z[j3] + z[j8]; const t3i = z[j3 + 1] + z[j8 + 1]; const t4r = z[j4] + z[j7]; const t4i = z[j4 + 1] + z[j7 + 1]; const t5r = z[j5] + z[j6]; const t5i = z[j5 + 1] + z[j6 + 1]; const t6r = z[j1] - z[j10]; const t6i = z[j1 + 1] - z[j10 + 1]; const t7r = z[j2] - z[j9]; const t7i = z[j2 + 1] - z[j9 + 1]; const t8r = z[j3] - z[j8]; const t8i = z[j3 + 1] - z[j8 + 1]; const t9r = z[j4] - z[j7]; const t9i = z[j4 + 1] - z[j7 + 1]; const t10r = z[j5] - z[j6]; const t10i = z[j5 + 1] - z[j6 + 1]; const t11r = z[j0] - 0.5 * t5r; const t11i = z[j0 + 1] - 0.5 * t5i; const t12r = t1r - t5r; const t12i = t1i - t5i; const t13r = t2r - t5r; const t13i = t2i - t5i; const t14r = t3r - t5r; const t14i = t3i - t5i; const t15r = t4r - t5r; const t15i = t4i - t5i; const y1r = t11r + c1 * t12r + c2 * t13r + c3 * t14r + c4 * t15r; const y1i = t11i + c1 * t12i + c2 * t13i + c3 * t14i + c4 * t15i; const y2r = t11r + c2 * t12r + c4 * t13r + c5 * t14r + c3 * t15r; const y2i = t11i + c2 * t12i + c4 * t13i + c5 * t14i + c3 * t15i; const y3r = t11r + c3 * t12r + c5 * t13r + c2 * t14r + c1 * t15r; const y3i = t11i + c3 * t12i + c5 * t13i + c2 * t14i + c1 * t15i; const y4r = t11r + c4 * t12r + c3 * t13r + c1 * t14r + c5 * t15r; const y4i = t11i + c4 * t12i + c3 * t13i + c1 * t14i + c5 * t15i; const y5r = t11r + c5 * t12r + c1 * t13r + c4 * t14r + c2 * t15r; const y5i = t11i + c5 * t12i + c1 * t13i + c4 * t14i + c2 * t15i; const y6r = c10 * t6r - c6 * t7r + c9 * t8r - c7 * t9r + c8 * t10r; const y6i = c10 * t6i - c6 * t7i + c9 * t8i - c7 * t9i + c8 * t10i; const y7r = c9 * t6r - c8 * t7r + c6 * t8r + c10 * t9r - c7 * t10r; const y7i = c9 * t6i - c8 * t7i + c6 * t8i + c10 * t9i - c7 * t10i; const y8r = c8 * t6r - c10 * t7r - c7 * t8r + c6 * t9r + c9 * t10r; const y8i = c8 * t6i - c10 * t7i - c7 * t8i + c6 * t9i + c9 * t10i; const y9r = c7 * t6r + c9 * t7r - c10 * t8r - c8 * t9r - c6 * t10r; const y9i = c7 * t6i + c9 * t7i - c10 * t8i - c8 * t9i - c6 * t10i; const y10r = c6 * t6r + c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r; const y10i = c6 * t6i + c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i; z[j0] = z[j0] + t1r + t2r + t3r + t4r + t5r; z[j0 + 1] = z[j0 + 1] + t1i + t2i + t3i + t4i + t5i; z[j1] = y1r - y10i; z[j1 + 1] = y1i + y10r; z[j2] = y2r - y9i; z[j2 + 1] = y2i + y9r; z[j3] = y3r - y8i; z[j3 + 1] = y3i + y8r; z[j4] = y4r - y7i; z[j4 + 1] = y4i + y7r; z[j5] = y5r - y6i; z[j5 + 1] = y5i + y6r; z[j6] = y5r + y6i; z[j6 + 1] = y5i - y6r; z[j7] = y4r + y7i; z[j7 + 1] = y4i - y7r; z[j8] = y3r + y8i; z[j8 + 1] = y3i - y8r; z[j9] = y2r + y9i; z[j9 + 1] = y2i - y9r; z[j10] = y1r + y10i; z[j10 + 1] = y1i - y10r; const jt = j10 + 2; j10 = j9 + 2; j9 = j8 + 2; j8 = j7 + 2; j7 = j6 + 2; j6 = j5 + 2; j5 = j4 + 2; j4 = j3 + 2; j3 = j2 + 2; j2 = j1 + 2; j1 = j0 + 2; j0 = jt; } } static _pfa13(z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12) { let c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12; if (mu === 1) { c1 = this._P885; c2 = this._P568; c3 = this._P120; c4 = -this._P354; c5 = -this._P748; c6 = -this._P970; c7 = this._P464; c8 = this._P822; c9 = this._P992; c10 = this._P935; c11 = this._P663; c12 = this._P239; } else if (mu === 2) { c1 = this._P568; c2 = -this._P354; c3 = -this._P970; c4 = -this._P748; c5 = this._P120; c6 = this._P885; c7 = this._P822; c8 = this._P935; c9 = this._P239; c10 = -this._P663; c11 = -this._P992; c12 = -this._P464; } else if (mu === 3) { c1 = this._P120; c2 = -this._P970; c3 = -this._P354; c4 = this._P885; c5 = this._P568; c6 = -this._P748; c7 = this._P992; c8 = this._P239; c9 = -this._P935; c10 = -this._P464; c11 = this._P822; c12 = this._P663; } else if (mu === 4) { c1 = -this._P354; c2 = -this._P748; c3 = this._P885; c4 = this._P120; c5 = -this._P970; c6 = this._P568; c7 = this._P935; c8 = -this._P663; c9 = -this._P464; c10 = this._P992; c11 = -this._P239; c12 = -this._P822; } else if (mu === 5) { c1 = -this._P748; c2 = this._P120; c3 = this._P568; c4 = -this._P970; c5 = this._P885; c6 = -this._P354; c7 = this._P663; c8 = -this._P992; c9 = this._P822; c10 = -this._P239; c11 = -this._P464; c12 = this._P935; } else if (mu === 6) { c1 = -this._P970; c2 = this._P885; c3 = -this._P748; c4 = this._P568; c5 = -this._P354; c6 = this._P120; c7 = this._P239; c8 = -this._P464; c9 = this._P663; c10 = -this._P822; c11 = this._P935; c12 = -this._P992; } else if (mu === 7) { c1 = -this._P970; c2 = this._P885; c3 = -this._P748; c4 = this._P568; c5 = -this._P354; c6 = this._P120; c7 = -this._P239; c8 = this._P464; c9 = -this._P663; c10 = this._P822; c11 = -this._P935; c12 = this._P992; } else if (mu === 8) { c1 = -this._P748; c2 = this._P120; c3 = this._P568; c4 = -this._P970; c5 = this._P885; c6 = -this._P354; c7 = -this._P663; c8 = this._P992; c9 = -this._P822; c10 = this._P239; c11 = this._P464; c12 = -this._P935; } else if (mu === 9) { c1 = -this._P354; c2 = -this._P748; c3 = this._P885; c4 = this._P120; c5 = -this._P970; c6 = this._P568; c7 = -this._P935; c8 = this._P663; c9 = this._P464; c10 = -this._P992; c11 = this._P239; c12 = this._P822; } else if (mu === 10) { c1 = this._P120; c2 = -this._P970; c3 = -this._P354; c4 = this._P885; c5 = this._P568; c6 = -this._P748; c7 = -this._P992; c8 = -this._P239; c9 = this._P935; c10 = this._P464; c11 = -this._P822; c12 = -this._P663; } else if (mu === 11) { c1 = this._P568; c2 = -this._P354; c3 = -this._P970; c4 = -this._P748; c5 = this._P120; c6 = this._P885; c7 = -this._P822; c8 = -this._P935; c9 = -this._P239; c10 = this._P663; c11 = this._P992; c12 = this._P464; } else { c1 = this._P885; c2 = this._P568; c3 = this._P120; c4 = -this._P354; c5 = -this._P748; c6 = -this._P970; c7 = -this._P464; c8 = -this._P822; c9 = -this._P992; c10 = -this._P935; c11 = -this._P663; c12 = -this._P239; } for (let i = 0; i < m; i++) { const t1r = z[j1] + z[j12]; const t1i = z[j1 + 1] + z[j12 + 1]; const t2r = z[j2] + z[j11]; const t2i = z[j2 + 1] + z[j11 + 1]; const t3r = z[j3] + z[j10]; const t3i = z[j3 + 1] + z[j10 + 1]; const t4r = z[j4] + z[j9]; const t4i = z[j4 + 1] + z[j9 + 1]; const t5r = z[j5] + z[j8]; const t5i = z[j5 + 1] + z[j8 + 1]; const t6r = z[j6] + z[j7]; const t6i = z[j6 + 1] + z[j7 + 1]; const t7r = z[j1] - z[j12]; const t7i = z[j1 + 1] - z[j12 + 1]; const t8r = z[j2] - z[j11]; const t8i = z[j2 + 1] - z[j11 + 1]; const t9r = z[j3] - z[j10]; const t9i = z[j3 + 1] - z[j10 + 1]; const t10r = z[j4] - z[j9]; const t10i = z[j4 + 1] - z[j9 + 1]; const t11r = z[j5] - z[j8]; const t11i = z[j5 + 1] - z[j8 + 1]; const t12r = z[j6] - z[j7]; const t12i = z[j6 + 1] - z[j7 + 1]; const t13r = z[j0] - 0.5 * t6r; const t13i = z[j0 + 1] - 0.5 * t6i; const t14r = t1r - t6r; const t14i = t1i - t6i; const t15r = t2r - t6r; const t15i = t2i - t6i; const t16r = t3r - t6r; const t16i = t3i - t6i; const t17r = t4r - t6r; const t17i = t4i - t6i; const t18r = t5r - t6r; const t18i = t5i - t6i; const y1r = t13r + c1 * t14r + c2 * t15r + c3 * t16r + c4 * t17r + c5 * t18r; const y1i = t13i + c1 * t14i + c2 * t15i + c3 * t16i + c4 * t17i + c5 * t18i; const y2r = t13r + c2 * t14r + c4 * t15r + c6 * t16r + c5 * t17r + c3 * t18r; const y2i = t13i + c2 * t14i + c4 * t15i + c6 * t16i + c5 * t17i + c3 * t18i; const y3r = t13r + c3 * t14r + c6 * t15r + c4 * t16r + c1 * t17r + c2 * t18r; const y3i = t13i + c3 * t14i + c6 * t15i + c4 * t16i + c1 * t17i + c2 * t18i; const y4r = t13r + c4 * t14r + c5 * t15r + c1 * t16r + c3 * t17r + c6 * t18r; const y4i = t13i + c4 * t14i + c5 * t15i + c1 * t16i + c3 * t17i + c6 * t18i; const y5r = t13r + c5 * t14r + c3 * t15r + c2 * t16r + c6 * t17r + c1 * t18r; const y5i = t13i + c5 * t14i + c3 * t15i + c2 * t16i + c6 * t17i + c1 * t18i; const y6r = t13r + c6 * t14r + c1 * t15r + c5 * t16r + c2 * t17r + c4 * t18r; const y6i = t13i + c6 * t14i + c1 * t15i + c5 * t16i + c2 * t17i + c4 * t18i; const y7r = c12 * t7r - c7 * t8r + c11 * t9r - c8 * t10r + c10 * t11r - c9 * t12r; const y7i = c12 * t7i - c7 * t8i + c11 * t9i - c8 * t10i + c10 * t11i - c9 * t12i; const y8r = c11 * t7r - c9 * t8r + c8 * t9r - c12 * t10r - c7 * t11r + c10 * t12r; const y8i = c11 * t7i - c9 * t8i + c8 * t9i - c12 * t10i - c7 * t11i + c10 * t12i; const y9r = c10 * t7r - c11 * t8r - c7 * t9r + c9 * t10r - c12 * t11r - c8 * t12r; const y9i = c10 * t7i - c11 * t8i - c7 * t9i + c9 * t10i - c12 * t11i - c8 * t12i; const y10r = c9 * t7r + c12 * t8r - c10 * t9r - c7 * t10r + c8 * t11r + c11 * t12r; const y10i = c9 * t7i + c12 * t8i - c10 * t9i - c7 * t10i + c8 * t11i + c11 * t12i; const y11r = c8 * t7r + c10 * t8r + c12 * t9r - c11 * t10r - c9 * t11r - c7 * t12r; const y11i = c8 * t7i + c10 * t8i + c12 * t9i - c11 * t10i - c9 * t11i - c7 * t12i; const y12r = c7 * t7r + c8 * t8r + c9 * t9r + c10 * t10r + c11 * t11r + c12 * t12r; const y12i = c7 * t7i + c8 * t8i + c9 * t9i + c10 * t10i + c11 * t11i + c12 * t12i; z[j0] = z[j0] + t1r + t2r + t3r + t4r + t5r + t6r; z[j0 + 1] = z[j0 + 1] + t1i + t2i + t3i + t4i + t5i + t6i; z[j1] = y1r - y12i; z[j1 + 1] = y1i + y12r; z[j2] = y2r - y11i; z[j2 + 1] = y2i + y11r; z[j3] = y3r - y10i; z[j3 + 1] = y3i + y10r; z[j4] = y4r - y9i; z[j4 + 1] = y4i + y9r; z[j5] = y5r - y8i; z[j5 + 1] = y5i + y8r; z[j6] = y6r - y7i; z[j6 + 1] = y6i + y7r; z[j7] = y6r + y7i; z[j7 + 1] = y6i - y7r; z[j8] = y5r + y8i; z[j8 + 1] = y5i - y8r; z[j9] = y4r + y9i; z[j9 + 1] = y4i - y9r; z[j10] = y3r + y10i; z[j10 + 1] = y3i - y10r; z[j11] = y2r + y11i; z[j11 + 1] = y2i - y11r; z[j12] = y1r + y12i; z[j12 + 1] = y1i - y12r; const jt = j12 + 2; j12 = j11 + 2; j11 = j10 + 2; j10 = j9 + 2; j9 = j8 + 2; j8 = j7 + 2; j7 = j6 + 2; j6 = j5 + 2; j5 = j4 + 2; j4 = j3 + 2; j3 = j2 + 2; j2 = j1 + 2; j1 = j0 + 2; j0 = jt; } } static _pfa16(z, mu, m, j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15) { let c1, c2, c3, c4, c5, c6, c7; if (mu === 1) { c1 = this._PONE; c2 = this._P923; c3 = this._P382; c4 = this._P707; } else if (mu === 3) { c1 = -this._PONE; c2 = this._P382; c3 = this._P923; c4 = -this._P707; } else if (mu === 5) { c1 = this._PONE; c2 = -this._P382; c3 = this._P923; c4 = -this._P707; } else if (mu === 7) { c1 = -this._PONE; c2 = -this._P923; c3 = this._P382; c4 = this._P707; } else if (mu === 9) { c1 = this._PONE; c2 = -this._P923; c3 = -this._P382; c4 = this._P707; } else if (mu === 11) { c1 = -this._PONE; c2 = -this._P382; c3 = -this._P923; c4 = -this._P707; } else if (mu === 13) { c1 = this._PONE; c2 = this._P382; c3 = -this._P923; c4 = -this._P707; } else { c1 = -this._PONE; c2 = this._P923; c3 = -this._P382; c4 = this._P707; } c5 = c1 * c4; c6 = c1 * c3; c7 = c1 * c2; for (let i = 0; i < m; i++) { const t1r = z[j0] + z[j8]; const t1i = z[j0 + 1] + z[j8 + 1]; const t2r = z[j4] + z[j12]; const t2i = z[j4 + 1] + z[j12 + 1]; const t3r = z[j0] - z[j8]; const t3i = z[j0 + 1] - z[j8 + 1]; const t4r = c1 * (z[j4] - z[j12]); const t4i = c1 * (z[j4 + 1] - z[j12 + 1]); const t5r = t1r + t2r; const t5i = t1i + t2i; const t6r = t1r - t2r; const t6i = t1i - t2i; const t7r = z[j1] + z[j9]; const t7i = z[j1 + 1] + z[j9 + 1]; const t8r = z[j5] + z[j13]; const t8i = z[j5 + 1] + z[j13 + 1]; const t9r = z[j1] - z[j9]; const t9i = z[j1 + 1] - z[j9 + 1]; const t10r = z[j5] - z[j13]; const t10i = z[j5 + 1] - z[j13 + 1]; const t11r = t7r + t8r; const t11i = t7i + t8i; const t12r = t7r - t8r; const t12i = t7i - t8i; const t13r = z[j2] + z[j10]; const t13i = z[j2 + 1] + z[j10 + 1]; const t14r = z[j6] + z[j14]; const t14i = z[j6 + 1] + z[j14 + 1]; const t15r = z[j2] - z[j10]; const t15i = z[j2 + 1] - z[j10 + 1]; const t16r = z[j6] - z[j14]; const t16i = z[j6 + 1] - z[j14 + 1]; const t17r = t13r + t14r; const t17i = t13i + t14i; const t18r = c4 * (t15r - t16r); const t18i = c4 * (t15i - t16i); const t19r = c5 * (t15r + t16r); const t19i = c5 * (t15i + t16i); const t20r = c1 * (t13r - t14r); const t20i = c1 * (t13i - t14i); const t21r = z[j3] + z[j11]; const t21i = z[j3 + 1] + z[j11 + 1]; const t22r = z[j7] + z[j15]; const t22i = z[j7 + 1] + z[j15 + 1]; const t23r = z[j3] -