#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 r11424 = a;
        float r11425 = r11424 * r11424;
        float r11426 = b;
        float r11427 = r11426 * r11426;
        float r11428 = r11425 + r11427;
        float r11429 = 2;
        float r11430 = pow(r11428, r11429);
        float r11431 = 4;
        float r11432 = 1;
        float r11433 = r11432 + r11424;
        float r11434 = r11425 * r11433;
        float r11435 = 3;
        float r11436 = r11435 * r11424;
        float r11437 = r11432 - r11436;
        float r11438 = r11427 * r11437;
        float r11439 = r11434 + r11438;
        float r11440 = r11431 * r11439;
        float r11441 = r11430 + r11440;
        float r11442 = r11441 - r11432;
        return r11442;
}

double f_id(double a, double b) {
        double r11443 = a;
        double r11444 = r11443 * r11443;
        double r11445 = b;
        double r11446 = r11445 * r11445;
        double r11447 = r11444 + r11446;
        double r11448 = 2;
        double r11449 = pow(r11447, r11448);
        double r11450 = 4;
        double r11451 = 1;
        double r11452 = r11451 + r11443;
        double r11453 = r11444 * r11452;
        double r11454 = 3;
        double r11455 = r11454 * r11443;
        double r11456 = r11451 - r11455;
        double r11457 = r11446 * r11456;
        double r11458 = r11453 + r11457;
        double r11459 = r11450 * r11458;
        double r11460 = r11449 + r11459;
        double r11461 = r11460 - r11451;
        return r11461;
}


double f_of(float a, float b) {
        float r11462 = a;
        float r11463 = r11462 * r11462;
        float r11464 = b;
        float r11465 = r11464 * r11464;
        float r11466 = r11463 + r11465;
        float r11467 = 2;
        float r11468 = pow(r11466, r11467);
        float r11469 = 4;
        float r11470 = 1;
        float r11471 = r11470 + r11462;
        float r11472 = r11463 * r11471;
        float r11473 = 3;
        float r11474 = r11473 * r11462;
        float r11475 = r11470 - r11474;
        float r11476 = r11465 * r11475;
        float r11477 = r11472 + r11476;
        float r11478 = r11469 * r11477;
        float r11479 = r11468 + r11478;
        float r11480 = r11479 - r11470;
        return r11480;
}

double f_od(double a, double b) {
        double r11481 = a;
        double r11482 = r11481 * r11481;
        double r11483 = b;
        double r11484 = r11483 * r11483;
        double r11485 = r11482 + r11484;
        double r11486 = 2;
        double r11487 = pow(r11485, r11486);
        double r11488 = 4;
        double r11489 = 1;
        double r11490 = r11489 + r11481;
        double r11491 = r11482 * r11490;
        double r11492 = 3;
        double r11493 = r11492 * r11481;
        double r11494 = r11489 - r11493;
        double r11495 = r11484 * r11494;
        double r11496 = r11491 + r11495;
        double r11497 = r11488 * r11496;
        double r11498 = r11487 + r11497;
        double r11499 = r11498 - r11489;
        return r11499;
}

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 r11500, r11501, r11502, r11503, r11504, r11505, r11506, r11507, r11508, r11509, r11510, r11511, r11512, r11513, r11514, r11515, r11516, r11517, r11518;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r11500);
        mpfr_init(r11501);
        mpfr_init(r11502);
        mpfr_init(r11503);
        mpfr_init(r11504);
        mpfr_init_set_str(r11505, "2", 10, MPFR_RNDN);
        mpfr_init(r11506);
        mpfr_init_set_str(r11507, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11508, "1", 10, MPFR_RNDN);
        mpfr_init(r11509);
        mpfr_init(r11510);
        mpfr_init_set_str(r11511, "3", 10, MPFR_RNDN);
        mpfr_init(r11512);
        mpfr_init(r11513);
        mpfr_init(r11514);
        mpfr_init(r11515);
        mpfr_init(r11516);
        mpfr_init(r11517);
        mpfr_init(r11518);
}

double f_im(double a, double b) {
        mpfr_set_d(r11500, a, MPFR_RNDN);
        mpfr_mul(r11501, r11500, r11500, MPFR_RNDN);
        mpfr_set_d(r11502, b, MPFR_RNDN);
        mpfr_mul(r11503, r11502, r11502, MPFR_RNDN);
        mpfr_add(r11504, r11501, r11503, MPFR_RNDN);
        ;
        mpfr_pow(r11506, r11504, r11505, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11509, r11508, r11500, MPFR_RNDN);
        mpfr_mul(r11510, r11501, r11509, MPFR_RNDN);
        ;
        mpfr_mul(r11512, r11511, r11500, MPFR_RNDN);
        mpfr_sub(r11513, r11508, r11512, MPFR_RNDN);
        mpfr_mul(r11514, r11503, r11513, MPFR_RNDN);
        mpfr_add(r11515, r11510, r11514, MPFR_RNDN);
        mpfr_mul(r11516, r11507, r11515, MPFR_RNDN);
        mpfr_add(r11517, r11506, r11516, MPFR_RNDN);
        mpfr_sub(r11518, r11517, r11508, MPFR_RNDN);
        return mpfr_get_d(r11518, MPFR_RNDN);
}

static mpfr_t r11519, r11520, r11521, r11522, r11523, r11524, r11525, r11526, r11527, r11528, r11529, r11530, r11531, r11532, r11533, r11534, r11535, r11536, r11537;

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

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

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

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

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

