// Computes z = Delta(q) (see Cohen). static void compute_Delta(mpc_t z, mpc_t q) { int d; int n; int power; mpc_t z0, z1, z2; mpc_init(z0); mpc_init(z1); mpc_init(z2); mpc_set_ui(z0, 1); d = -1; for(n=1; n<100; n++) { power = n *(3 * n - 1) / 2; mpc_pow_ui(z1, q, power); mpc_pow_ui(z2, q, n); mpc_mul(z2, z2, z1); mpc_add(z1, z1, z2); if (d) { mpc_sub(z0, z0, z1); d = 0; } else { mpc_add(z0, z0, z1); d = 1; } } mpc_pow_ui(z0, z0, 24); mpc_mul(z, z0, q); mpc_clear(z0); mpc_clear(z1); mpc_clear(z2); }
static PyObject * GMPy_Complex_Add(PyObject *x, PyObject *y, CTXT_Object *context) { MPC_Object *result = NULL; CHECK_CONTEXT(context); if (!(result = GMPy_MPC_New(0, 0, context))) { /* LCOV_EXCL_START */ return NULL; /* LCOV_EXCL_STOP */ } if (MPC_Check(x) && MPC_Check(y)) { SET_MPC_MPC_WAS_NAN(context, x, y); result->rc = mpc_add(result->c, MPC(x), MPC(y), GET_MPC_ROUND(context)); _GMPy_MPC_Cleanup(&result, context); return (PyObject*)result; } if (IS_COMPLEX(x) && IS_COMPLEX(y)) { MPC_Object *tempx = NULL, *tempy = NULL; if (!(tempx = GMPy_MPC_From_Complex(x, 1, 1, context)) || !(tempy = GMPy_MPC_From_Complex(y, 1, 1, context))) { /* LCOV_EXCL_START */ Py_XDECREF((PyObject*)tempx); Py_XDECREF((PyObject*)tempy); Py_DECREF((PyObject*)result); return NULL; /* LCOV_EXCL_STOP */ } SET_MPC_MPC_WAS_NAN(context, tempx, tempy); result->rc = mpc_add(result->c, tempx->c, tempy->c, GET_MPC_ROUND(context)); Py_DECREF((PyObject*)tempx); Py_DECREF((PyObject*)tempy); _GMPy_MPC_Cleanup(&result, context); return (PyObject*)result; } /* LCOV_EXCL_START */ Py_DECREF((PyObject*)result); SYSTEM_ERROR("Internal error in GMPy_Complex_Add()."); return NULL; /* LCOV_EXCL_STOP */ }
static void check_ternary_value (void) { mpc_t x, y, z; mpfr_prec_t prec; mpc_init2 (x, 2); mpc_init2 (y, 2); mpc_init2 (z, 2); for (prec = 2; prec <= 1000; prec++) { mpc_set_prec (x, prec); mpc_set_prec (y, prec); mpc_set_ui (x, 1, MPC_RNDNN); mpc_mul_2ui (x, x, (unsigned long int) prec, MPC_RNDNN); mpc_set_ui (y, 1, MPC_RNDNN); if (mpc_add (z, x, y, MPC_RNDNN) == 0) { fprintf (stderr, "Error in mpc_add: 2^(-prec)+1 cannot be exact\n"); exit (1); } } mpc_clear (x); mpc_clear (y); mpc_clear (z); }
void ovm_dd_add(oregister_t *l, oregister_t *r) { switch (r->t) { case t_void: break; case t_word: l->v.dd += r->v.w; break; case t_float: l->v.dd += r->v.d; break; case t_mpz: l->v.dd += mpz_get_d(ozr(r)); break; case t_rat: l->v.dd += rat_get_d(r->v.r); break; case t_mpq: l->v.dd += mpq_get_d(oqr(r)); break; case t_mpr: l->t = t_mpc; mpc_set_d_d(occ(l), real(l->v.dd), imag(l->v.dd), thr_rndc); mpc_set_fr(occ(r), orr(r), thr_rndc); mpc_add(occ(l), occ(l), occ(r), thr_rndc); break; case t_cdd: l->v.dd += r->v.dd; check_cdd(l); break; case t_cqq: real(r->v.dd) = mpq_get_d(oqr(r)); imag(r->v.dd) = mpq_get_d(oqi(r)); l->v.dd += r->v.dd; check_cdd(l); break; case t_mpc: l->t = t_mpc; mpc_set_d_d(occ(l), real(l->v.dd), imag(l->v.dd), thr_rndc); mpc_add(occ(l), occ(l), occ(r), thr_rndc); check_mpc(l); break; default: ovm_raise(except_not_a_number); } }
void add_diff(Sequence seq, size_t N) { Sequence hseq = seq + N / 2, end = seq + N; while (hseq < end) { mpc_set(temp, seq, RND); //temp = *seq mpc_add(seq, seq, hseq, RND); //*seq += *hseq mpc_sub(hseq, temp, hseq, RND); //*hseq = temp - *hseq seq++, hseq++; } }
void ovm_q_add(oregister_t *l, oregister_t *r) { switch (r->t) { case t_void: break; case t_word: mpq_set_si(oqr(r), r->v.w, 1); mpq_add(oqr(l), oqr(l), oqr(r)); check_mpq(l); break; case t_float: l->t = t_float; l->v.d = mpq_get_d(oqr(l)) + r->v.d; break; case t_mpz: mpz_set_ui(ozs(r), 1); mpq_add(oqr(l), oqr(l), oqr(r)); check_mpq(l); break; case t_rat: mpq_set_si(oqr(r), rat_num(r->v.r), rat_den(r->v.r)); mpq_add(oqr(l), oqr(l), oqr(r)); check_mpq(l); break; case t_mpq: mpq_add(oqr(l), oqr(l), oqr(r)); check_mpq(l); break; case t_mpr: l->t = t_mpr; mpfr_set_q(orr(l), oqr(l), thr_rnd); mpfr_add(orr(l), orr(l), orr(r), thr_rnd); break; case t_cdd: l->t = t_cdd; l->v.dd = mpq_get_d(oqr(l)) + r->v.dd; break; case t_cqq: l->t = t_cqq; mpq_set_ui(oqi(l), 0, 1); cqq_add(oqq(l), oqq(l), oqq(r)); check_cqq(l); break; case t_mpc: l->t = t_mpc; mpc_set_q(occ(l), oqr(l), thr_rndc); mpc_add(occ(l), occ(l), occ(r), thr_rndc); break; default: ovm_raise(except_not_a_number); } }
static PyObject * GMPy_Complex_Add(PyObject *x, PyObject *y, CTXT_Object *context) { MPC_Object *result; CHECK_CONTEXT(context); if (!(result = GMPy_MPC_New(0, 0, context))) return NULL; if (MPC_Check(x) && MPC_Check(y)) { result->rc = mpc_add(result->c, MPC(x), MPC(y), GET_MPC_ROUND(context)); goto done; } if (IS_COMPLEX(x) && IS_COMPLEX(y)) { MPC_Object *tempx, *tempy; tempx = GMPy_MPC_From_Complex(x, 1, 1, context); tempy = GMPy_MPC_From_Complex(y, 1, 1, context); if (!tempx || !tempy) { Py_XDECREF((PyObject*)tempx); Py_XDECREF((PyObject*)tempy); Py_DECREF((PyObject*)result); return NULL; } result->rc = mpc_add(result->c, tempx->c, tempy->c, GET_MPC_ROUND(context)); Py_DECREF((PyObject*)tempx); Py_DECREF((PyObject*)tempy); goto done; } Py_DECREF((PyObject*)result); Py_RETURN_NOTIMPLEMENTED; done: GMPY_MPC_CLEANUP(result, context, "addition"); return (PyObject*)result; }
SEXP R_mpc_add(SEXP e1, SEXP e2) { mpc_t *z1 = (mpc_t *)R_ExternalPtrAddr(e1); mpc_t *z = (mpc_t *)malloc(sizeof(mpc_t)); if (z == NULL) { Rf_error("Could not allocate memory for MPC type."); } if (Rf_inherits(e2, "mpc")) { mpc_t *z2 = (mpc_t *)R_ExternalPtrAddr(e2); mpfr_prec_t real_prec, imag_prec; Rmpc_get_max_prec(&real_prec, &imag_prec, *z1, *z2); mpc_init3(*z, real_prec, imag_prec); mpc_add(*z, *z1, *z2, Rmpc_get_rounding()); } else if (Rf_isInteger(e2)) { mpc_init2(*z, mpc_get_prec(*z1)); mpc_add_ui(*z, *z1, INTEGER(e2)[0], Rmpc_get_rounding()); } else if (Rf_isNumeric(e2)) { mpfr_t x; mpfr_init2(x, 53); // We use GMP_RNDN rather than MPFR_RNDN for compatibility // with mpfr 2.4.x and earlier as well as more modern versions. mpfr_set_d(x, REAL(e2)[0], GMP_RNDN); /* Max of mpc precision z2 and 53 from e2. */ Rprintf("Precision: %d\n", mpc_get_prec(*z1)); mpc_init2(*z, max(mpc_get_prec(*z1), 53)); mpc_add_fr(*z, *z1, x, Rmpc_get_rounding()); } else { /* TODO(mstokely): Add support for mpfr types here. */ free(z); Rf_error("Invalid second operand for mpc addition."); } SEXP retVal = PROTECT(R_MakeExternalPtr((void *)z, Rf_install("mpc ptr"), R_NilValue)); Rf_setAttrib(retVal, R_ClassSymbol, Rf_mkString("mpc")); R_RegisterCFinalizerEx(retVal, mpcFinalizer, TRUE); UNPROTECT(1); return retVal; }
/* * These functions operate on complex and complex */ mpcomplex operator+(const mpcomplex& a, const mpcomplex& b) { mpc_t value; mpc_init3( value , a.mpc_prec, a.mpc_prec ); mpc_add(value, a.mpc_val, b.mpc_val, a.default_rnd); return mpcomplex(value); }
mpcomplex& mpcomplex::operator+=( const mpcomplex& a) { mpc_add(mpc_val, mpc_val, a.mpc_val, default_rnd); return *this; }
// See Cohen; my D is -D in his notation. size_t pbc_hilbert(mpz_t **arr, int D) { int a, b; int t; int B = (int)floor(sqrt((double) D / 3.0)); mpc_t alpha; mpc_t j; mpf_t sqrtD; mpf_t f0; darray_t Pz; mpc_t z0, z1, z2; double d = 1.0; int h = 1; int jcount = 1; // Compute required precision. b = D % 2; for (;;) { t = (b*b + D) / 4; a = b; if (a <= 1) { a = 1; goto step535_4; } step535_3: if (!(t % a)) { jcount++; if ((a == b) || (a*a == t) || !b) { d += 1.0 / ((double) a); h++; } else { d += 2.0 / ((double) a); h+=2; } } step535_4: a++; if (a * a <= t) { goto step535_3; } else { b += 2; if (b > B) break; } } //printf("modulus: %f\n", exp(3.14159265358979 * sqrt(D)) * d * 0.5); d *= sqrt(D) * 3.14159265358979 / log(2); precision_init((int)(d + 34)); pbc_info("class number %d, %d bit precision", h, (int) d + 34); darray_init(Pz); mpc_init(alpha); mpc_init(j); mpc_init(z0); mpc_init(z1); mpc_init(z2); mpf_init(sqrtD); mpf_init(f0); mpf_sqrt_ui(sqrtD, D); b = D % 2; h = 0; for (;;) { t = (b*b + D) / 4; if (b > 1) { a = b; } else { a = 1; } step3: if (t % a) { step4: a++; if (a * a <= t) goto step3; } else { // a, b, t/a are coeffs of an appropriate primitive reduced positive // definite form. // Compute j((-b + sqrt{-D})/(2a)). h++; pbc_info("[%d/%d] a b c = %d %d %d", h, jcount, a, b, t/a); mpf_set_ui(f0, 1); mpf_div_ui(f0, f0, 2 * a); mpf_mul(mpc_im(alpha), sqrtD, f0); mpf_mul_ui(f0, f0, b); mpf_neg(mpc_re(alpha), f0); compute_j(j, alpha); if (0) { int i; for (i=Pz->count - 1; i>=0; i--) { printf("P %d = ", i); mpc_out_str(stdout, 10, 4, Pz->item[i]); printf("\n"); } } if (a == b || a * a == t || !b) { // P *= X - j int i, n; mpc_ptr p0; p0 = (mpc_ptr) pbc_malloc(sizeof(mpc_t)); mpc_init(p0); mpc_neg(p0, j); n = Pz->count; if (n) { mpc_set(z1, Pz->item[0]); mpc_add(Pz->item[0], z1, p0); for (i=1; i<n; i++) { mpc_mul(z0, z1, p0); mpc_set(z1, Pz->item[i]); mpc_add(Pz->item[i], z1, z0); } mpc_mul(p0, p0, z1); } darray_append(Pz, p0); } else { // P *= X^2 - 2 Re(j) X + |j|^2 int i, n; mpc_ptr p0, p1; p0 = (mpc_ptr) pbc_malloc(sizeof(mpc_t)); p1 = (mpc_ptr) pbc_malloc(sizeof(mpc_t)); mpc_init(p0); mpc_init(p1); // p1 = - 2 Re(j) mpf_mul_ui(f0, mpc_re(j), 2); mpf_neg(f0, f0); mpf_set(mpc_re(p1), f0); // p0 = |j|^2 mpf_mul(f0, mpc_re(j), mpc_re(j)); mpf_mul(mpc_re(p0), mpc_im(j), mpc_im(j)); mpf_add(mpc_re(p0), mpc_re(p0), f0); n = Pz->count; if (!n) { } else if (n == 1) { mpc_set(z1, Pz->item[0]); mpc_add(Pz->item[0], z1, p1); mpc_mul(p1, z1, p1); mpc_add(p1, p1, p0); mpc_mul(p0, p0, z1); } else { mpc_set(z2, Pz->item[0]); mpc_set(z1, Pz->item[1]); mpc_add(Pz->item[0], z2, p1); mpc_mul(z0, z2, p1); mpc_add(Pz->item[1], z1, z0); mpc_add(Pz->item[1], Pz->item[1], p0); for (i=2; i<n; i++) { mpc_mul(z0, z1, p1); mpc_mul(alpha, z2, p0); mpc_set(z2, z1); mpc_set(z1, Pz->item[i]); mpc_add(alpha, alpha, z0); mpc_add(Pz->item[i], z1, alpha); } mpc_mul(z0, z2, p0); mpc_mul(p1, p1, z1); mpc_add(p1, p1, z0); mpc_mul(p0, p0, z1); } darray_append(Pz, p1); darray_append(Pz, p0); } goto step4; } b+=2; if (b > B) break; } // Round polynomial and assign. int k = 0; { *arr = pbc_malloc(sizeof(mpz_t) * (Pz->count + 1)); int i; for (i=Pz->count - 1; i>=0; i--) { if (mpf_sgn(mpc_re(Pz->item[i])) < 0) { mpf_set_d(f0, -0.5); } else { mpf_set_d(f0, 0.5); } mpf_add(f0, f0, mpc_re(Pz->item[i])); mpz_init((*arr)[k]); mpz_set_f((*arr)[k], f0); k++; mpc_clear(Pz->item[i]); pbc_free(Pz->item[i]); } mpz_init((*arr)[k]); mpz_set_ui((*arr)[k], 1); k++; } darray_clear(Pz); mpc_clear(z0); mpc_clear(z1); mpc_clear(z2); mpf_clear(f0); mpf_clear(sqrtD); mpc_clear(alpha); mpc_clear(j); precision_clear(); return k; }
void Lib_Mpcr_Add(MpcrPtr f, MpcrPtr g, MpcrPtr h, long rnd) { mpc_add( (mpc_ptr) f, (mpc_ptr) g, (mpc_ptr) h, (mpc_rnd_t) rnd); }