#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 r36327 = a;
        float r36328 = r36327 * r36327;
        float r36329 = b;
        float r36330 = r36329 * r36329;
        float r36331 = r36328 + r36330;
        float r36332 = 2;
        float r36333 = pow(r36331, r36332);
        float r36334 = 4;
        float r36335 = r36334 * r36330;
        float r36336 = r36333 + r36335;
        float r36337 = 1;
        float r36338 = r36336 - r36337;
        return r36338;
}

double f_id(double a, double b) {
        double r36339 = a;
        double r36340 = r36339 * r36339;
        double r36341 = b;
        double r36342 = r36341 * r36341;
        double r36343 = r36340 + r36342;
        double r36344 = 2;
        double r36345 = pow(r36343, r36344);
        double r36346 = 4;
        double r36347 = r36346 * r36342;
        double r36348 = r36345 + r36347;
        double r36349 = 1;
        double r36350 = r36348 - r36349;
        return r36350;
}


double f_of(float a, float b) {
        float r36351 = a;
        float r36352 = r36351 * r36351;
        float r36353 = b;
        float r36354 = r36353 * r36353;
        float r36355 = r36352 + r36354;
        float r36356 = 2;
        float r36357 = pow(r36355, r36356);
        float r36358 = 4;
        float r36359 = r36358 * r36354;
        float r36360 = r36357 + r36359;
        float r36361 = 1;
        float r36362 = r36360 - r36361;
        return r36362;
}

double f_od(double a, double b) {
        double r36363 = a;
        double r36364 = r36363 * r36363;
        double r36365 = b;
        double r36366 = r36365 * r36365;
        double r36367 = r36364 + r36366;
        double r36368 = 2;
        double r36369 = pow(r36367, r36368);
        double r36370 = 4;
        double r36371 = r36370 * r36366;
        double r36372 = r36369 + r36371;
        double r36373 = 1;
        double r36374 = r36372 - r36373;
        return r36374;
}

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 r36375, r36376, r36377, r36378, r36379, r36380, r36381, r36382, r36383, r36384, r36385, r36386;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36375);
        mpfr_init(r36376);
        mpfr_init(r36377);
        mpfr_init(r36378);
        mpfr_init(r36379);
        mpfr_init_set_str(r36380, "2", 10, MPFR_RNDN);
        mpfr_init(r36381);
        mpfr_init_set_str(r36382, "4", 10, MPFR_RNDN);
        mpfr_init(r36383);
        mpfr_init(r36384);
        mpfr_init_set_str(r36385, "1", 10, MPFR_RNDN);
        mpfr_init(r36386);
}

double f_im(double a, double b) {
        mpfr_set_d(r36375, a, MPFR_RNDN);
        mpfr_mul(r36376, r36375, r36375, MPFR_RNDN);
        mpfr_set_d(r36377, b, MPFR_RNDN);
        mpfr_mul(r36378, r36377, r36377, MPFR_RNDN);
        mpfr_add(r36379, r36376, r36378, MPFR_RNDN);
        ;
        mpfr_pow(r36381, r36379, r36380, MPFR_RNDN);
        ;
        mpfr_mul(r36383, r36382, r36378, MPFR_RNDN);
        mpfr_add(r36384, r36381, r36383, MPFR_RNDN);
        ;
        mpfr_sub(r36386, r36384, r36385, MPFR_RNDN);
        return mpfr_get_d(r36386, MPFR_RNDN);
}

static mpfr_t r36387, r36388, r36389, r36390, r36391, r36392, r36393, r36394, r36395, r36396, r36397, r36398;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36387);
        mpfr_init(r36388);
        mpfr_init(r36389);
        mpfr_init(r36390);
        mpfr_init(r36391);
        mpfr_init_set_str(r36392, "2", 10, MPFR_RNDN);
        mpfr_init(r36393);
        mpfr_init_set_str(r36394, "4", 10, MPFR_RNDN);
        mpfr_init(r36395);
        mpfr_init(r36396);
        mpfr_init_set_str(r36397, "1", 10, MPFR_RNDN);
        mpfr_init(r36398);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36387, a, MPFR_RNDN);
        mpfr_mul(r36388, r36387, r36387, MPFR_RNDN);
        mpfr_set_d(r36389, b, MPFR_RNDN);
        mpfr_mul(r36390, r36389, r36389, MPFR_RNDN);
        mpfr_add(r36391, r36388, r36390, MPFR_RNDN);
        ;
        mpfr_pow(r36393, r36391, r36392, MPFR_RNDN);
        ;
        mpfr_mul(r36395, r36394, r36390, MPFR_RNDN);
        mpfr_add(r36396, r36393, r36395, MPFR_RNDN);
        ;
        mpfr_sub(r36398, r36396, r36397, MPFR_RNDN);
        return mpfr_get_d(r36398, MPFR_RNDN);
}

static mpfr_t r36399, r36400, r36401, r36402, r36403, r36404, r36405, r36406, r36407, r36408, r36409, r36410;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36399);
        mpfr_init(r36400);
        mpfr_init(r36401);
        mpfr_init(r36402);
        mpfr_init(r36403);
        mpfr_init_set_str(r36404, "2", 10, MPFR_RNDN);
        mpfr_init(r36405);
        mpfr_init_set_str(r36406, "4", 10, MPFR_RNDN);
        mpfr_init(r36407);
        mpfr_init(r36408);
        mpfr_init_set_str(r36409, "1", 10, MPFR_RNDN);
        mpfr_init(r36410);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36399, a, MPFR_RNDN);
        mpfr_mul(r36400, r36399, r36399, MPFR_RNDN);
        mpfr_set_d(r36401, b, MPFR_RNDN);
        mpfr_mul(r36402, r36401, r36401, MPFR_RNDN);
        mpfr_add(r36403, r36400, r36402, MPFR_RNDN);
        ;
        mpfr_pow(r36405, r36403, r36404, MPFR_RNDN);
        ;
        mpfr_mul(r36407, r36406, r36402, MPFR_RNDN);
        mpfr_add(r36408, r36405, r36407, MPFR_RNDN);
        ;
        mpfr_sub(r36410, r36408, r36409, MPFR_RNDN);
        return mpfr_get_d(r36410, MPFR_RNDN);
}

