void fft (vector<cmplx> & a, bool invert) { int n = (int) a.size(); for (int i=1, j=0; i<n; ++i) { int bit = n >> 1; for (; j>=bit; bit>>=1) j -= bit; j += bit; if (i < j) swap (a[i], a[j]); } for (int len=2; len<=n; len<<=1) { double ang = 2*PI/len * (invert ? -1 : 1); cmplx wlen (cos(ang), sin(ang)); for (int i=0; i<n; i+=len) { cmplx w (1); for (int j=0; j<len/2; ++j) { cmplx u = a[i+j], v = a[i+j+len/2] * w; a[i+j] = u + v; a[i+j+len/2] = u - v; w *= wlen; } } } if (invert) for (int i=0; i<n; ++i) a[i] /= n; }
void Algorithms::FastFourierTransform(std::vector<std::complex<long double> > & a, bool invert){ int n = (int) a.size(); int lg_n = 0; while ((1 << lg_n) < n) ++lg_n; for (int i=0; i<n; ++i) if (i < rev(i,lg_n)) std::swap (a[i], a[rev(i,lg_n)]); for (int len=2; len<=n; len<<=1) { long double ang = 2*PI/len * (invert ? -1 : 1); std::complex<long double> wlen (cos(ang), sin(ang)); for (int i=0; i<n; i+=len) { std::complex<long double> w (1); for (int j=0; j<len/2; ++j) { std::complex<long double> u = a[i+j], v = a[i+j+len/2] * w; a[i+j] = u + v; a[i+j+len/2] = u - v; w *= wlen; } } } if (invert) for (int i=0; i<n; ++i) a[i] /= n; }
void fft (std::vector<base> &arr, bool invert) { int cnt = static_cast<int>(arr.size()); for (int i = 1, j = 0; i < cnt; ++i) { int bit = cnt >> 1; for (; j >= bit; bit >>= 1) { j -= bit; } j += bit; if (i < j) std::swap (arr[i], arr[j]); } for (int len = 2; len <= cnt; len <<= 1) { double ang = 2 * 3.14159265359 / len * (invert ? -1 : 1); base wlen (cos(ang), sin(ang)); for (int i = 0; i < cnt; i += len) { base w(1, 0); for (int j = 0; j < len / 2; ++j) { base u = arr[i + j], v = arr[i + j + len / 2] * w; arr[i + j] = u + v; arr[i + j + len / 2] = u - v; w *= wlen; } } } if (invert) for (int i = 0; i < cnt; ++i) { arr[i] /= cnt; } }
/* Cast the operand to the specified type function cast(type: Type) : Object */ static EjsAny *castRegExp(Ejs *ejs, EjsRegExp *rp, EjsType *type) { wchar *pattern; char *flags; ssize len, flen; int i, j; switch (type->sid) { case S_Boolean: return ESV(true); case S_String: flags = makeFlags(rp); len = wlen(rp->pattern); flen = wlen(flags); pattern = mprAlloc((len * 2 + flen + 1) * sizeof(wchar)); /* Convert to a form that is a valid, parsable as regular expression literal */ pattern[0] = '/'; for (i = 0, j = 1; i < len; i++) { if (rp->pattern[i] == '/') { pattern[j++] = '\\'; } pattern[j++] = rp->pattern[i]; } pattern[j++] = '/'; for (i = 0; i < flen; i++) { pattern[j++] = flags[i]; } pattern[j] = 0; return ejsCreateStringFromAsc(ejs, pattern); default: ejsThrowTypeError(ejs, "Cannot cast to this type"); return 0; } return 0; }
//hightest speed :) bool CFourier::FFT( std::vector<complex_double> &a, bool inv ) { int n = (int) a.size(); //invert bits in lg_n based number and reorder data in a sequence for (int i=1, j=0; i<n; ++i) { int bit = n >> 1; for (; j>=bit; bit>>=1) j -= bit; j += bit; if (i < j) std::swap(a[i], a[j]); } //work with blocks of len elements double *ImPartSourceTable = inv ? ImPartTable_reverse : ImPartTable_direct; for (int len = 2, lgn = 0; len <= n; len <<= 1, lgn++) { complex_double wlen(RPartTable[lgn], ImPartSourceTable[lgn]); //butterfly on each element in block for (int i = 0; i < n; i+=len){ complex_double w(1.0); for (int j = 0; j < len/2; ++j){ complex_double u = a[i+j], v = a[i+j+len/2] * w; a[i+j] = u + v; a[i+j+len/2] = u - v; w *= wlen; } } } if (inv){ for (int i = 0; i < n; ++i) a[i] /= n; } return true; }
static EjsString *regex_getSource(Ejs *ejs, EjsRegExp *rp, int argc, EjsObj **argv) { return ejsCreateString(ejs, rp->pattern, wlen(rp->pattern)); }
EjsArray *ejsCaptureStack(Ejs *ejs, int uplevels) { EjsFrame *fp; EjsState *state; EjsArray *stack; wchar *source; EjsObj *frame; char *filename; int index, lineNumber; assert(ejs); stack = ejsCreateArray(ejs, 0); index = 0; for (state = ejs->state; state; state = state->prev) { for (fp = state->fp; fp; fp = fp->caller) { if (uplevels-- <= 0) { frame = ejsCreateEmptyPot(ejs); if (ejsGetDebugInfo(ejs, (EjsFunction*) fp, fp->pc, &filename, &lineNumber, &source) >= 0) { ejsSetPropertyByName(ejs, frame, EN("filename"), ejsCreatePathFromAsc(ejs, filename)); ejsSetPropertyByName(ejs, frame, EN("lineno"), ejsCreateNumber(ejs, lineNumber)); ejsSetPropertyByName(ejs, frame, EN("code"), ejsCreateString(ejs, source, wlen(source))); } else { ejsSetPropertyByName(ejs, frame, EN("filename"), EST(undefined)); } ejsSetPropertyByName(ejs, frame, EN("func"), fp->function.name); ejsSetProperty(ejs, stack, index++, frame); } } } return stack; }