#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 r30465168 = a;
        float r30465169 = r30465168 * r30465168;
        float r30465170 = b;
        float r30465171 = r30465170 * r30465170;
        float r30465172 = r30465169 + r30465171;
        float r30465173 = 2;
        float r30465174 = pow(r30465172, r30465173);
        float r30465175 = 4;
        float r30465176 = r30465175 * r30465171;
        float r30465177 = r30465174 + r30465176;
        float r30465178 = 1;
        float r30465179 = r30465177 - r30465178;
        return r30465179;
}

double f_id(double a, double b) {
        double r30465180 = a;
        double r30465181 = r30465180 * r30465180;
        double r30465182 = b;
        double r30465183 = r30465182 * r30465182;
        double r30465184 = r30465181 + r30465183;
        double r30465185 = 2;
        double r30465186 = pow(r30465184, r30465185);
        double r30465187 = 4;
        double r30465188 = r30465187 * r30465183;
        double r30465189 = r30465186 + r30465188;
        double r30465190 = 1;
        double r30465191 = r30465189 - r30465190;
        return r30465191;
}


double f_of(float a, float b) {
        float r30465192 = a;
        float r30465193 = r30465192 * r30465192;
        float r30465194 = b;
        float r30465195 = r30465194 * r30465194;
        float r30465196 = r30465193 + r30465195;
        float r30465197 = 2;
        float r30465198 = pow(r30465196, r30465197);
        float r30465199 = 4;
        float r30465200 = r30465199 * r30465195;
        float r30465201 = r30465198 + r30465200;
        float r30465202 = 1;
        float r30465203 = r30465201 - r30465202;
        return r30465203;
}

double f_od(double a, double b) {
        double r30465204 = a;
        double r30465205 = r30465204 * r30465204;
        double r30465206 = b;
        double r30465207 = r30465206 * r30465206;
        double r30465208 = r30465205 + r30465207;
        double r30465209 = 2;
        double r30465210 = pow(r30465208, r30465209);
        double r30465211 = 4;
        double r30465212 = r30465211 * r30465207;
        double r30465213 = r30465210 + r30465212;
        double r30465214 = 1;
        double r30465215 = r30465213 - r30465214;
        return r30465215;
}

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 r30465216, r30465217, r30465218, r30465219, r30465220, r30465221, r30465222, r30465223, r30465224, r30465225, r30465226, r30465227;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r30465216);
        mpfr_init(r30465217);
        mpfr_init(r30465218);
        mpfr_init(r30465219);
        mpfr_init(r30465220);
        mpfr_init_set_str(r30465221, "2", 10, MPFR_RNDN);
        mpfr_init(r30465222);
        mpfr_init_set_str(r30465223, "4", 10, MPFR_RNDN);
        mpfr_init(r30465224);
        mpfr_init(r30465225);
        mpfr_init_set_str(r30465226, "1", 10, MPFR_RNDN);
        mpfr_init(r30465227);
}

double f_im(double a, double b) {
        mpfr_set_d(r30465216, a, MPFR_RNDN);
        mpfr_mul(r30465217, r30465216, r30465216, MPFR_RNDN);
        mpfr_set_d(r30465218, b, MPFR_RNDN);
        mpfr_mul(r30465219, r30465218, r30465218, MPFR_RNDN);
        mpfr_add(r30465220, r30465217, r30465219, MPFR_RNDN);
        ;
        mpfr_pow(r30465222, r30465220, r30465221, MPFR_RNDN);
        ;
        mpfr_mul(r30465224, r30465223, r30465219, MPFR_RNDN);
        mpfr_add(r30465225, r30465222, r30465224, MPFR_RNDN);
        ;
        mpfr_sub(r30465227, r30465225, r30465226, MPFR_RNDN);
        return mpfr_get_d(r30465227, MPFR_RNDN);
}

static mpfr_t r30465228, r30465229, r30465230, r30465231, r30465232, r30465233, r30465234, r30465235, r30465236, r30465237, r30465238, r30465239;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r30465228);
        mpfr_init(r30465229);
        mpfr_init(r30465230);
        mpfr_init(r30465231);
        mpfr_init(r30465232);
        mpfr_init_set_str(r30465233, "2", 10, MPFR_RNDN);
        mpfr_init(r30465234);
        mpfr_init_set_str(r30465235, "4", 10, MPFR_RNDN);
        mpfr_init(r30465236);
        mpfr_init(r30465237);
        mpfr_init_set_str(r30465238, "1", 10, MPFR_RNDN);
        mpfr_init(r30465239);
}

double f_fm(double a, double b) {
        mpfr_set_d(r30465228, a, MPFR_RNDN);
        mpfr_mul(r30465229, r30465228, r30465228, MPFR_RNDN);
        mpfr_set_d(r30465230, b, MPFR_RNDN);
        mpfr_mul(r30465231, r30465230, r30465230, MPFR_RNDN);
        mpfr_add(r30465232, r30465229, r30465231, MPFR_RNDN);
        ;
        mpfr_pow(r30465234, r30465232, r30465233, MPFR_RNDN);
        ;
        mpfr_mul(r30465236, r30465235, r30465231, MPFR_RNDN);
        mpfr_add(r30465237, r30465234, r30465236, MPFR_RNDN);
        ;
        mpfr_sub(r30465239, r30465237, r30465238, MPFR_RNDN);
        return mpfr_get_d(r30465239, MPFR_RNDN);
}

static mpfr_t r30465240, r30465241, r30465242, r30465243, r30465244, r30465245, r30465246, r30465247, r30465248, r30465249, r30465250, r30465251;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r30465240);
        mpfr_init(r30465241);
        mpfr_init(r30465242);
        mpfr_init(r30465243);
        mpfr_init(r30465244);
        mpfr_init_set_str(r30465245, "2", 10, MPFR_RNDN);
        mpfr_init(r30465246);
        mpfr_init_set_str(r30465247, "4", 10, MPFR_RNDN);
        mpfr_init(r30465248);
        mpfr_init(r30465249);
        mpfr_init_set_str(r30465250, "1", 10, MPFR_RNDN);
        mpfr_init(r30465251);
}

double f_dm(double a, double b) {
        mpfr_set_d(r30465240, a, MPFR_RNDN);
        mpfr_mul(r30465241, r30465240, r30465240, MPFR_RNDN);
        mpfr_set_d(r30465242, b, MPFR_RNDN);
        mpfr_mul(r30465243, r30465242, r30465242, MPFR_RNDN);
        mpfr_add(r30465244, r30465241, r30465243, MPFR_RNDN);
        ;
        mpfr_pow(r30465246, r30465244, r30465245, MPFR_RNDN);
        ;
        mpfr_mul(r30465248, r30465247, r30465243, MPFR_RNDN);
        mpfr_add(r30465249, r30465246, r30465248, MPFR_RNDN);
        ;
        mpfr_sub(r30465251, r30465249, r30465250, MPFR_RNDN);
        return mpfr_get_d(r30465251, MPFR_RNDN);
}

