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

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

double f_if(float a, float b) {
        float r11442 = a;
        float r11443 = r11442 * r11442;
        float r11444 = b;
        float r11445 = r11444 * r11444;
        float r11446 = r11443 + r11445;
        float r11447 = 2.0f;
        float r11448 = pow(r11446, r11447);
        float r11449 = 4.0f;
        float r11450 = 1.0f;
        float r11451 = r11450 + r11442;
        float r11452 = r11443 * r11451;
        float r11453 = 3.0f;
        float r11454 = r11453 * r11442;
        float r11455 = r11450 - r11454;
        float r11456 = r11445 * r11455;
        float r11457 = r11452 + r11456;
        float r11458 = r11449 * r11457;
        float r11459 = r11448 + r11458;
        float r11460 = r11459 - r11450;
        return r11460;
}

double f_id(double a, double b) {
        double r11461 = a;
        double r11462 = r11461 * r11461;
        double r11463 = b;
        double r11464 = r11463 * r11463;
        double r11465 = r11462 + r11464;
        double r11466 = 2.0;
        double r11467 = pow(r11465, r11466);
        double r11468 = 4.0;
        double r11469 = 1.0;
        double r11470 = r11469 + r11461;
        double r11471 = r11462 * r11470;
        double r11472 = 3.0;
        double r11473 = r11472 * r11461;
        double r11474 = r11469 - r11473;
        double r11475 = r11464 * r11474;
        double r11476 = r11471 + r11475;
        double r11477 = r11468 * r11476;
        double r11478 = r11467 + r11477;
        double r11479 = r11478 - r11469;
        return r11479;
}


double f_of(float a, float b) {
        float r11480 = a;
        float r11481 = r11480 * r11480;
        float r11482 = b;
        float r11483 = r11482 * r11482;
        float r11484 = r11481 + r11483;
        float r11485 = 2.0f;
        float r11486 = pow(r11484, r11485);
        float r11487 = 1.0f;
        float r11488 = r11480 + r11487;
        float r11489 = r11481 * r11488;
        float r11490 = 3.0f;
        float r11491 = r11490 * r11480;
        float r11492 = r11487 - r11491;
        float r11493 = r11483 * r11492;
        float r11494 = r11489 + r11493;
        float r11495 = 4.0f;
        float r11496 = r11494 * r11495;
        float r11497 = r11486 + r11496;
        float r11498 = r11497 - r11487;
        return r11498;
}

double f_od(double a, double b) {
        double r11499 = a;
        double r11500 = r11499 * r11499;
        double r11501 = b;
        double r11502 = r11501 * r11501;
        double r11503 = r11500 + r11502;
        double r11504 = 2.0;
        double r11505 = pow(r11503, r11504);
        double r11506 = 1.0;
        double r11507 = r11499 + r11506;
        double r11508 = r11500 * r11507;
        double r11509 = 3.0;
        double r11510 = r11509 * r11499;
        double r11511 = r11506 - r11510;
        double r11512 = r11502 * r11511;
        double r11513 = r11508 + r11512;
        double r11514 = 4.0;
        double r11515 = r11513 * r11514;
        double r11516 = r11505 + r11515;
        double r11517 = r11516 - r11506;
        return r11517;
}

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 r11518, r11519, r11520, r11521, r11522, r11523, r11524, r11525, r11526, r11527, r11528, r11529, r11530, r11531, r11532, r11533, r11534, r11535, r11536;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r11518);
        mpfr_init(r11519);
        mpfr_init(r11520);
        mpfr_init(r11521);
        mpfr_init(r11522);
        mpfr_init_set_str(r11523, "2", 10, MPFR_RNDN);
        mpfr_init(r11524);
        mpfr_init_set_str(r11525, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11526, "1", 10, MPFR_RNDN);
        mpfr_init(r11527);
        mpfr_init(r11528);
        mpfr_init_set_str(r11529, "3", 10, MPFR_RNDN);
        mpfr_init(r11530);
        mpfr_init(r11531);
        mpfr_init(r11532);
        mpfr_init(r11533);
        mpfr_init(r11534);
        mpfr_init(r11535);
        mpfr_init(r11536);
}

double f_im(double a, double b) {
        mpfr_set_d(r11518, a, MPFR_RNDN);
        mpfr_mul(r11519, r11518, r11518, MPFR_RNDN);
        mpfr_set_d(r11520, b, MPFR_RNDN);
        mpfr_mul(r11521, r11520, r11520, MPFR_RNDN);
        mpfr_add(r11522, r11519, r11521, MPFR_RNDN);
        ;
        mpfr_pow(r11524, r11522, r11523, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11527, r11526, r11518, MPFR_RNDN);
        mpfr_mul(r11528, r11519, r11527, MPFR_RNDN);
        ;
        mpfr_mul(r11530, r11529, r11518, MPFR_RNDN);
        mpfr_sub(r11531, r11526, r11530, MPFR_RNDN);
        mpfr_mul(r11532, r11521, r11531, MPFR_RNDN);
        mpfr_add(r11533, r11528, r11532, MPFR_RNDN);
        mpfr_mul(r11534, r11525, r11533, MPFR_RNDN);
        mpfr_add(r11535, r11524, r11534, MPFR_RNDN);
        mpfr_sub(r11536, r11535, r11526, MPFR_RNDN);
        return mpfr_get_d(r11536, MPFR_RNDN);
}

static mpfr_t r11537, r11538, r11539, r11540, r11541, r11542, r11543, r11544, r11545, r11546, r11547, r11548, r11549, r11550, r11551, r11552, r11553, r11554, r11555;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r11537);
        mpfr_init(r11538);
        mpfr_init(r11539);
        mpfr_init(r11540);
        mpfr_init(r11541);
        mpfr_init_set_str(r11542, "2", 10, MPFR_RNDN);
        mpfr_init(r11543);
        mpfr_init_set_str(r11544, "1", 10, MPFR_RNDN);
        mpfr_init(r11545);
        mpfr_init(r11546);
        mpfr_init_set_str(r11547, "3", 10, MPFR_RNDN);
        mpfr_init(r11548);
        mpfr_init(r11549);
        mpfr_init(r11550);
        mpfr_init(r11551);
        mpfr_init_set_str(r11552, "4", 10, MPFR_RNDN);
        mpfr_init(r11553);
        mpfr_init(r11554);
        mpfr_init(r11555);
}

double f_fm(double a, double b) {
        mpfr_set_d(r11537, a, MPFR_RNDN);
        mpfr_mul(r11538, r11537, r11537, MPFR_RNDN);
        mpfr_set_d(r11539, b, MPFR_RNDN);
        mpfr_mul(r11540, r11539, r11539, MPFR_RNDN);
        mpfr_add(r11541, r11538, r11540, MPFR_RNDN);
        ;
        mpfr_pow(r11543, r11541, r11542, MPFR_RNDN);
        ;
        mpfr_add(r11545, r11537, r11544, MPFR_RNDN);
        mpfr_mul(r11546, r11538, r11545, MPFR_RNDN);
        ;
        mpfr_mul(r11548, r11547, r11537, MPFR_RNDN);
        mpfr_sub(r11549, r11544, r11548, MPFR_RNDN);
        mpfr_mul(r11550, r11540, r11549, MPFR_RNDN);
        mpfr_add(r11551, r11546, r11550, MPFR_RNDN);
        ;
        mpfr_mul(r11553, r11551, r11552, MPFR_RNDN);
        mpfr_add(r11554, r11543, r11553, MPFR_RNDN);
        mpfr_sub(r11555, r11554, r11544, MPFR_RNDN);
        return mpfr_get_d(r11555, MPFR_RNDN);
}

static mpfr_t r11556, r11557, r11558, r11559, r11560, r11561, r11562, r11563, r11564, r11565, r11566, r11567, r11568, r11569, r11570, r11571, r11572, r11573, r11574;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r11556);
        mpfr_init(r11557);
        mpfr_init(r11558);
        mpfr_init(r11559);
        mpfr_init(r11560);
        mpfr_init_set_str(r11561, "2", 10, MPFR_RNDN);
        mpfr_init(r11562);
        mpfr_init_set_str(r11563, "1", 10, MPFR_RNDN);
        mpfr_init(r11564);
        mpfr_init(r11565);
        mpfr_init_set_str(r11566, "3", 10, MPFR_RNDN);
        mpfr_init(r11567);
        mpfr_init(r11568);
        mpfr_init(r11569);
        mpfr_init(r11570);
        mpfr_init_set_str(r11571, "4", 10, MPFR_RNDN);
        mpfr_init(r11572);
        mpfr_init(r11573);
        mpfr_init(r11574);
}

double f_dm(double a, double b) {
        mpfr_set_d(r11556, a, MPFR_RNDN);
        mpfr_mul(r11557, r11556, r11556, MPFR_RNDN);
        mpfr_set_d(r11558, b, MPFR_RNDN);
        mpfr_mul(r11559, r11558, r11558, MPFR_RNDN);
        mpfr_add(r11560, r11557, r11559, MPFR_RNDN);
        ;
        mpfr_pow(r11562, r11560, r11561, MPFR_RNDN);
        ;
        mpfr_add(r11564, r11556, r11563, MPFR_RNDN);
        mpfr_mul(r11565, r11557, r11564, MPFR_RNDN);
        ;
        mpfr_mul(r11567, r11566, r11556, MPFR_RNDN);
        mpfr_sub(r11568, r11563, r11567, MPFR_RNDN);
        mpfr_mul(r11569, r11559, r11568, MPFR_RNDN);
        mpfr_add(r11570, r11565, r11569, MPFR_RNDN);
        ;
        mpfr_mul(r11572, r11570, r11571, MPFR_RNDN);
        mpfr_add(r11573, r11562, r11572, MPFR_RNDN);
        mpfr_sub(r11574, r11573, r11563, MPFR_RNDN);
        return mpfr_get_d(r11574, MPFR_RNDN);
}

