// Computes q = exp(2 pi i tau). static void compute_q(mpc_t q, mpc_t tau) { mpc_t z0; mpf_t f0, f1; mpf_ptr fp0; pbc_mpui pwr; mpc_init(z0); mpf_init(f0); mpf_init(f1); //compute z0 = 2 pi i tau mpc_set(z0, tau); //first remove integral part of Re(tau) //since exp(2 pi i) = 1 //it seems |Re(tau)| < 1 anyway? fp0 = mpc_re(z0); mpf_trunc(f1, fp0); mpf_sub(fp0, fp0, f1); mpc_mul_mpf(z0, z0, pi); mpc_mul_ui(z0, z0, 2); mpc_muli(z0, z0); //compute q = exp(z0); //first write z0 = A + a + b i //where A is a (negative) integer //and a, b are in [-1, 1] //compute e^A separately fp0 = mpc_re(z0); pwr = mpf_get_ui(fp0); mpf_pow_ui(f0, recipeulere, pwr); mpf_add_ui(fp0, fp0, pwr); mpf_exp(f1, mpc_re(z0)); mpf_mul(f0, f1, f0); mpc_cis(q, mpc_im(z0)); /* old_mpc_exp(q, z0); */ mpc_mul_mpf(q, q, f0); mpc_clear(z0); mpf_clear(f0); mpf_clear(f1); }
void fft_init(size_t N, mpfr_prec_t prec) { if (prec) precision = prec; if (N) LEN = N; twid_fact = (Sequence) calloc(LEN, sizeof(mpc_t)); mpfr_init_set_d(ZERO, 0.0, MPFR_RNDA); mpfr_init2(tmp, precision); mpfr_const_pi(tmp, MPFR_RNDA); mpfr_mul_si(tmp, tmp, -2, MPFR_RNDA); mpfr_div_ui(tmp, tmp, N, MPFR_RNDA); mpc_init2(min2pii, precision); mpc_set_fr_fr(min2pii, ZERO, tmp, RND); mpc_init2(temp, precision); new_seq = (Sequence) calloc(N, sizeof(mpc_t)); size_t n = N / 2; while (n--) { mpc_init2(twid_fact + n, precision); mpc_mul_ui(twid_fact + n, min2pii, n, RND); mpc_exp(twid_fact + n, twid_fact + n, RND); } }
mpcomplex operator*(const long int& a, const mpcomplex& b) { mpc_t value; mpc_init3( value , b.mpc_prec, b.mpc_prec ); mpc_mul_ui(value, b.mpc_val, a, b.default_rnd); return mpcomplex(value); }
void Lib_Mpcr_Mul_Ui(MpcrPtr f, MpcrPtr g, unsigned int x, long rnd) { mpc_mul_ui( (mpc_ptr) f, (mpc_ptr) g, x, (mpc_rnd_t) rnd); }