#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 r36499 = a;
        float r36500 = r36499 * r36499;
        float r36501 = b;
        float r36502 = r36501 * r36501;
        float r36503 = r36500 + r36502;
        float r36504 = 2;
        float r36505 = pow(r36503, r36504);
        float r36506 = 4;
        float r36507 = r36506 * r36502;
        float r36508 = r36505 + r36507;
        float r36509 = 1;
        float r36510 = r36508 - r36509;
        return r36510;
}

double f_id(double a, double b) {
        double r36511 = a;
        double r36512 = r36511 * r36511;
        double r36513 = b;
        double r36514 = r36513 * r36513;
        double r36515 = r36512 + r36514;
        double r36516 = 2;
        double r36517 = pow(r36515, r36516);
        double r36518 = 4;
        double r36519 = r36518 * r36514;
        double r36520 = r36517 + r36519;
        double r36521 = 1;
        double r36522 = r36520 - r36521;
        return r36522;
}


double f_of(float a, float b) {
        float r36523 = a;
        float r36524 = r36523 * r36523;
        float r36525 = b;
        float r36526 = r36525 * r36525;
        float r36527 = r36524 + r36526;
        float r36528 = 2;
        float r36529 = pow(r36527, r36528);
        float r36530 = 4;
        float r36531 = r36530 * r36526;
        float r36532 = r36529 + r36531;
        float r36533 = 1;
        float r36534 = r36532 - r36533;
        return r36534;
}

double f_od(double a, double b) {
        double r36535 = a;
        double r36536 = r36535 * r36535;
        double r36537 = b;
        double r36538 = r36537 * r36537;
        double r36539 = r36536 + r36538;
        double r36540 = 2;
        double r36541 = pow(r36539, r36540);
        double r36542 = 4;
        double r36543 = r36542 * r36538;
        double r36544 = r36541 + r36543;
        double r36545 = 1;
        double r36546 = r36544 - r36545;
        return r36546;
}

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 r36547, r36548, r36549, r36550, r36551, r36552, r36553, r36554, r36555, r36556, r36557, r36558;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36547);
        mpfr_init(r36548);
        mpfr_init(r36549);
        mpfr_init(r36550);
        mpfr_init(r36551);
        mpfr_init_set_str(r36552, "2", 10, MPFR_RNDN);
        mpfr_init(r36553);
        mpfr_init_set_str(r36554, "4", 10, MPFR_RNDN);
        mpfr_init(r36555);
        mpfr_init(r36556);
        mpfr_init_set_str(r36557, "1", 10, MPFR_RNDN);
        mpfr_init(r36558);
}

double f_im(double a, double b) {
        mpfr_set_d(r36547, a, MPFR_RNDN);
        mpfr_mul(r36548, r36547, r36547, MPFR_RNDN);
        mpfr_set_d(r36549, b, MPFR_RNDN);
        mpfr_mul(r36550, r36549, r36549, MPFR_RNDN);
        mpfr_add(r36551, r36548, r36550, MPFR_RNDN);
        ;
        mpfr_pow(r36553, r36551, r36552, MPFR_RNDN);
        ;
        mpfr_mul(r36555, r36554, r36550, MPFR_RNDN);
        mpfr_add(r36556, r36553, r36555, MPFR_RNDN);
        ;
        mpfr_sub(r36558, r36556, r36557, MPFR_RNDN);
        return mpfr_get_d(r36558, MPFR_RNDN);
}

static mpfr_t r36559, r36560, r36561, r36562, r36563, r36564, r36565, r36566, r36567, r36568, r36569, r36570;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36559);
        mpfr_init(r36560);
        mpfr_init(r36561);
        mpfr_init(r36562);
        mpfr_init(r36563);
        mpfr_init_set_str(r36564, "2", 10, MPFR_RNDN);
        mpfr_init(r36565);
        mpfr_init_set_str(r36566, "4", 10, MPFR_RNDN);
        mpfr_init(r36567);
        mpfr_init(r36568);
        mpfr_init_set_str(r36569, "1", 10, MPFR_RNDN);
        mpfr_init(r36570);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36559, a, MPFR_RNDN);
        mpfr_mul(r36560, r36559, r36559, MPFR_RNDN);
        mpfr_set_d(r36561, b, MPFR_RNDN);
        mpfr_mul(r36562, r36561, r36561, MPFR_RNDN);
        mpfr_add(r36563, r36560, r36562, MPFR_RNDN);
        ;
        mpfr_pow(r36565, r36563, r36564, MPFR_RNDN);
        ;
        mpfr_mul(r36567, r36566, r36562, MPFR_RNDN);
        mpfr_add(r36568, r36565, r36567, MPFR_RNDN);
        ;
        mpfr_sub(r36570, r36568, r36569, MPFR_RNDN);
        return mpfr_get_d(r36570, MPFR_RNDN);
}

static mpfr_t r36571, r36572, r36573, r36574, r36575, r36576, r36577, r36578, r36579, r36580, r36581, r36582;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36571);
        mpfr_init(r36572);
        mpfr_init(r36573);
        mpfr_init(r36574);
        mpfr_init(r36575);
        mpfr_init_set_str(r36576, "2", 10, MPFR_RNDN);
        mpfr_init(r36577);
        mpfr_init_set_str(r36578, "4", 10, MPFR_RNDN);
        mpfr_init(r36579);
        mpfr_init(r36580);
        mpfr_init_set_str(r36581, "1", 10, MPFR_RNDN);
        mpfr_init(r36582);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36571, a, MPFR_RNDN);
        mpfr_mul(r36572, r36571, r36571, MPFR_RNDN);
        mpfr_set_d(r36573, b, MPFR_RNDN);
        mpfr_mul(r36574, r36573, r36573, MPFR_RNDN);
        mpfr_add(r36575, r36572, r36574, MPFR_RNDN);
        ;
        mpfr_pow(r36577, r36575, r36576, MPFR_RNDN);
        ;
        mpfr_mul(r36579, r36578, r36574, MPFR_RNDN);
        mpfr_add(r36580, r36577, r36579, MPFR_RNDN);
        ;
        mpfr_sub(r36582, r36580, r36581, MPFR_RNDN);
        return mpfr_get_d(r36582, MPFR_RNDN);
}

