#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "Bouland and Aaronson, Equation (26)";

double f_if(float a, float b) {
        float r27612 = a;
        float r27613 = r27612 * r27612;
        float r27614 = b;
        float r27615 = r27614 * r27614;
        float r27616 = r27613 + r27615;
        float r27617 = 2;
        float r27618 = pow(r27616, r27617);
        float r27619 = 4;
        float r27620 = r27619 * r27615;
        float r27621 = r27618 + r27620;
        float r27622 = 1;
        float r27623 = r27621 - r27622;
        return r27623;
}

double f_id(double a, double b) {
        double r27624 = a;
        double r27625 = r27624 * r27624;
        double r27626 = b;
        double r27627 = r27626 * r27626;
        double r27628 = r27625 + r27627;
        double r27629 = 2;
        double r27630 = pow(r27628, r27629);
        double r27631 = 4;
        double r27632 = r27631 * r27627;
        double r27633 = r27630 + r27632;
        double r27634 = 1;
        double r27635 = r27633 - r27634;
        return r27635;
}


double f_of(float a, float b) {
        float r27636 = b;
        float r27637 = 4;
        float r27638 = pow(r27636, r27637);
        float r27639 = a;
        float r27640 = pow(r27639, r27637);
        float r27641 = r27638 + r27640;
        float r27642 = 1;
        float r27643 = r27641 - r27642;
        float r27644 = 2;
        float r27645 = r27639 * r27644;
        float r27646 = r27639 * r27645;
        float r27647 = r27637 + r27646;
        float r27648 = r27636 * r27636;
        float r27649 = r27647 * r27648;
        float r27650 = r27643 + r27649;
        return r27650;
}

double f_od(double a, double b) {
        double r27651 = b;
        double r27652 = 4;
        double r27653 = pow(r27651, r27652);
        double r27654 = a;
        double r27655 = pow(r27654, r27652);
        double r27656 = r27653 + r27655;
        double r27657 = 1;
        double r27658 = r27656 - r27657;
        double r27659 = 2;
        double r27660 = r27654 * r27659;
        double r27661 = r27654 * r27660;
        double r27662 = r27652 + r27661;
        double r27663 = r27651 * r27651;
        double r27664 = r27662 * r27663;
        double r27665 = r27658 + r27664;
        return r27665;
}

void mpfr_fmod2(mpfr_t r, mpfr_t n, mpfr_t d, mpfr_rnd_t rmd) {
        mpfr_fmod(r, n, d, rmd);
        if (mpfr_cmp_ui(r, 0) < 0) mpfr_add(r, r, d, rmd);
}


static mpfr_t r27666, r27667, r27668, r27669, r27670, r27671, r27672, r27673, r27674, r27675, r27676, r27677;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r27666);
        mpfr_init(r27667);
        mpfr_init(r27668);
        mpfr_init(r27669);
        mpfr_init(r27670);
        mpfr_init_set_str(r27671, "2", 10, MPFR_RNDN);
        mpfr_init(r27672);
        mpfr_init_set_str(r27673, "4", 10, MPFR_RNDN);
        mpfr_init(r27674);
        mpfr_init(r27675);
        mpfr_init_set_str(r27676, "1", 10, MPFR_RNDN);
        mpfr_init(r27677);
}

double f_im(double a, double b) {
        mpfr_set_d(r27666, a, MPFR_RNDN);
        mpfr_mul(r27667, r27666, r27666, MPFR_RNDN);
        mpfr_set_d(r27668, b, MPFR_RNDN);
        mpfr_mul(r27669, r27668, r27668, MPFR_RNDN);
        mpfr_add(r27670, r27667, r27669, MPFR_RNDN);
        ;
        mpfr_pow(r27672, r27670, r27671, MPFR_RNDN);
        ;
        mpfr_mul(r27674, r27673, r27669, MPFR_RNDN);
        mpfr_add(r27675, r27672, r27674, MPFR_RNDN);
        ;
        mpfr_sub(r27677, r27675, r27676, MPFR_RNDN);
        return mpfr_get_d(r27677, MPFR_RNDN);
}

static mpfr_t r27678, r27679, r27680, r27681, r27682, r27683, r27684, r27685, r27686, r27687, r27688, r27689, r27690, r27691, r27692;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27678);
        mpfr_init_set_str(r27679, "4", 10, MPFR_RNDN);
        mpfr_init(r27680);
        mpfr_init(r27681);
        mpfr_init(r27682);
        mpfr_init(r27683);
        mpfr_init_set_str(r27684, "1", 10, MPFR_RNDN);
        mpfr_init(r27685);
        mpfr_init_set_str(r27686, "2", 10, MPFR_RNDN);
        mpfr_init(r27687);
        mpfr_init(r27688);
        mpfr_init(r27689);
        mpfr_init(r27690);
        mpfr_init(r27691);
        mpfr_init(r27692);
}

double f_fm(double a, double b) {
        mpfr_set_d(r27678, b, MPFR_RNDN);
        ;
        mpfr_pow(r27680, r27678, r27679, MPFR_RNDN);
        mpfr_set_d(r27681, a, MPFR_RNDN);
        mpfr_pow(r27682, r27681, r27679, MPFR_RNDN);
        mpfr_add(r27683, r27680, r27682, MPFR_RNDN);
        ;
        mpfr_sub(r27685, r27683, r27684, MPFR_RNDN);
        ;
        mpfr_mul(r27687, r27681, r27686, MPFR_RNDN);
        mpfr_mul(r27688, r27681, r27687, MPFR_RNDN);
        mpfr_add(r27689, r27679, r27688, MPFR_RNDN);
        mpfr_mul(r27690, r27678, r27678, MPFR_RNDN);
        mpfr_mul(r27691, r27689, r27690, MPFR_RNDN);
        mpfr_add(r27692, r27685, r27691, MPFR_RNDN);
        return mpfr_get_d(r27692, MPFR_RNDN);
}

static mpfr_t r27693, r27694, r27695, r27696, r27697, r27698, r27699, r27700, r27701, r27702, r27703, r27704, r27705, r27706, r27707;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27693);
        mpfr_init_set_str(r27694, "4", 10, MPFR_RNDN);
        mpfr_init(r27695);
        mpfr_init(r27696);
        mpfr_init(r27697);
        mpfr_init(r27698);
        mpfr_init_set_str(r27699, "1", 10, MPFR_RNDN);
        mpfr_init(r27700);
        mpfr_init_set_str(r27701, "2", 10, MPFR_RNDN);
        mpfr_init(r27702);
        mpfr_init(r27703);
        mpfr_init(r27704);
        mpfr_init(r27705);
        mpfr_init(r27706);
        mpfr_init(r27707);
}

double f_dm(double a, double b) {
        mpfr_set_d(r27693, b, MPFR_RNDN);
        ;
        mpfr_pow(r27695, r27693, r27694, MPFR_RNDN);
        mpfr_set_d(r27696, a, MPFR_RNDN);
        mpfr_pow(r27697, r27696, r27694, MPFR_RNDN);
        mpfr_add(r27698, r27695, r27697, MPFR_RNDN);
        ;
        mpfr_sub(r27700, r27698, r27699, MPFR_RNDN);
        ;
        mpfr_mul(r27702, r27696, r27701, MPFR_RNDN);
        mpfr_mul(r27703, r27696, r27702, MPFR_RNDN);
        mpfr_add(r27704, r27694, r27703, MPFR_RNDN);
        mpfr_mul(r27705, r27693, r27693, MPFR_RNDN);
        mpfr_mul(r27706, r27704, r27705, MPFR_RNDN);
        mpfr_add(r27707, r27700, r27706, MPFR_RNDN);
        return mpfr_get_d(r27707, MPFR_RNDN);
}

