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

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

double f_if(float a, float b) {
        float r11429 = a;
        float r11430 = r11429 * r11429;
        float r11431 = b;
        float r11432 = r11431 * r11431;
        float r11433 = r11430 + r11432;
        float r11434 = 2.0f;
        float r11435 = pow(r11433, r11434);
        float r11436 = 4.0f;
        float r11437 = 1.0f;
        float r11438 = r11437 - r11429;
        float r11439 = r11430 * r11438;
        float r11440 = 3.0f;
        float r11441 = r11440 + r11429;
        float r11442 = r11432 * r11441;
        float r11443 = r11439 + r11442;
        float r11444 = r11436 * r11443;
        float r11445 = r11435 + r11444;
        float r11446 = r11445 - r11437;
        return r11446;
}

double f_id(double a, double b) {
        double r11447 = a;
        double r11448 = r11447 * r11447;
        double r11449 = b;
        double r11450 = r11449 * r11449;
        double r11451 = r11448 + r11450;
        double r11452 = 2.0;
        double r11453 = pow(r11451, r11452);
        double r11454 = 4.0;
        double r11455 = 1.0;
        double r11456 = r11455 - r11447;
        double r11457 = r11448 * r11456;
        double r11458 = 3.0;
        double r11459 = r11458 + r11447;
        double r11460 = r11450 * r11459;
        double r11461 = r11457 + r11460;
        double r11462 = r11454 * r11461;
        double r11463 = r11453 + r11462;
        double r11464 = r11463 - r11455;
        return r11464;
}


double f_of(float a, float b) {
        float r11465 = a;
        float r11466 = r11465 * r11465;
        float r11467 = b;
        float r11468 = r11467 * r11467;
        float r11469 = r11466 + r11468;
        float r11470 = 2.0f;
        float r11471 = pow(r11469, r11470);
        float r11472 = 3.0f;
        float r11473 = r11465 + r11472;
        float r11474 = r11473 * r11468;
        float r11475 = 1.0f;
        float r11476 = r11475 - r11465;
        float r11477 = r11466 * r11476;
        float r11478 = r11474 + r11477;
        float r11479 = 4.0f;
        float r11480 = r11478 * r11479;
        float r11481 = r11471 + r11480;
        float r11482 = sqrt(r11481);
        float r11483 = r11482 * r11482;
        float r11484 = r11483 - r11475;
        return r11484;
}

double f_od(double a, double b) {
        double r11485 = a;
        double r11486 = r11485 * r11485;
        double r11487 = b;
        double r11488 = r11487 * r11487;
        double r11489 = r11486 + r11488;
        double r11490 = 2.0;
        double r11491 = pow(r11489, r11490);
        double r11492 = 3.0;
        double r11493 = r11485 + r11492;
        double r11494 = r11493 * r11488;
        double r11495 = 1.0;
        double r11496 = r11495 - r11485;
        double r11497 = r11486 * r11496;
        double r11498 = r11494 + r11497;
        double r11499 = 4.0;
        double r11500 = r11498 * r11499;
        double r11501 = r11491 + r11500;
        double r11502 = sqrt(r11501);
        double r11503 = r11502 * r11502;
        double r11504 = r11503 - r11495;
        return r11504;
}

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 r11505, r11506, r11507, r11508, r11509, r11510, r11511, r11512, r11513, r11514, r11515, r11516, r11517, r11518, r11519, r11520, r11521, r11522;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r11505);
        mpfr_init(r11506);
        mpfr_init(r11507);
        mpfr_init(r11508);
        mpfr_init(r11509);
        mpfr_init_set_str(r11510, "2", 10, MPFR_RNDN);
        mpfr_init(r11511);
        mpfr_init_set_str(r11512, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11513, "1", 10, MPFR_RNDN);
        mpfr_init(r11514);
        mpfr_init(r11515);
        mpfr_init_set_str(r11516, "3", 10, MPFR_RNDN);
        mpfr_init(r11517);
        mpfr_init(r11518);
        mpfr_init(r11519);
        mpfr_init(r11520);
        mpfr_init(r11521);
        mpfr_init(r11522);
}

double f_im(double a, double b) {
        mpfr_set_d(r11505, a, MPFR_RNDN);
        mpfr_mul(r11506, r11505, r11505, MPFR_RNDN);
        mpfr_set_d(r11507, b, MPFR_RNDN);
        mpfr_mul(r11508, r11507, r11507, MPFR_RNDN);
        mpfr_add(r11509, r11506, r11508, MPFR_RNDN);
        ;
        mpfr_pow(r11511, r11509, r11510, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r11514, r11513, r11505, MPFR_RNDN);
        mpfr_mul(r11515, r11506, r11514, MPFR_RNDN);
        ;
        mpfr_add(r11517, r11516, r11505, MPFR_RNDN);
        mpfr_mul(r11518, r11508, r11517, MPFR_RNDN);
        mpfr_add(r11519, r11515, r11518, MPFR_RNDN);
        mpfr_mul(r11520, r11512, r11519, MPFR_RNDN);
        mpfr_add(r11521, r11511, r11520, MPFR_RNDN);
        mpfr_sub(r11522, r11521, r11513, MPFR_RNDN);
        return mpfr_get_d(r11522, MPFR_RNDN);
}

static mpfr_t r11523, r11524, r11525, r11526, r11527, r11528, r11529, r11530, r11531, r11532, r11533, r11534, r11535, r11536, r11537, r11538, r11539, r11540, r11541, r11542;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11523);
        mpfr_init(r11524);
        mpfr_init(r11525);
        mpfr_init(r11526);
        mpfr_init(r11527);
        mpfr_init_set_str(r11528, "2", 10, MPFR_RNDN);
        mpfr_init(r11529);
        mpfr_init_set_str(r11530, "3", 10, MPFR_RNDN);
        mpfr_init(r11531);
        mpfr_init(r11532);
        mpfr_init_set_str(r11533, "1", 10, MPFR_RNDN);
        mpfr_init(r11534);
        mpfr_init(r11535);
        mpfr_init(r11536);
        mpfr_init_set_str(r11537, "4", 10, MPFR_RNDN);
        mpfr_init(r11538);
        mpfr_init(r11539);
        mpfr_init(r11540);
        mpfr_init(r11541);
        mpfr_init(r11542);
}

double f_fm(double a, double b) {
        mpfr_set_d(r11523, a, MPFR_RNDN);
        mpfr_mul(r11524, r11523, r11523, MPFR_RNDN);
        mpfr_set_d(r11525, b, MPFR_RNDN);
        mpfr_mul(r11526, r11525, r11525, MPFR_RNDN);
        mpfr_add(r11527, r11524, r11526, MPFR_RNDN);
        ;
        mpfr_pow(r11529, r11527, r11528, MPFR_RNDN);
        ;
        mpfr_add(r11531, r11523, r11530, MPFR_RNDN);
        mpfr_mul(r11532, r11531, r11526, MPFR_RNDN);
        ;
        mpfr_sub(r11534, r11533, r11523, MPFR_RNDN);
        mpfr_mul(r11535, r11524, r11534, MPFR_RNDN);
        mpfr_add(r11536, r11532, r11535, MPFR_RNDN);
        ;
        mpfr_mul(r11538, r11536, r11537, MPFR_RNDN);
        mpfr_add(r11539, r11529, r11538, MPFR_RNDN);
        mpfr_sqrt(r11540, r11539, MPFR_RNDN);
        mpfr_mul(r11541, r11540, r11540, MPFR_RNDN);
        mpfr_sub(r11542, r11541, r11533, MPFR_RNDN);
        return mpfr_get_d(r11542, MPFR_RNDN);
}

static mpfr_t r11543, r11544, r11545, r11546, r11547, r11548, r11549, r11550, r11551, r11552, r11553, r11554, r11555, r11556, r11557, r11558, r11559, r11560, r11561, r11562;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11543);
        mpfr_init(r11544);
        mpfr_init(r11545);
        mpfr_init(r11546);
        mpfr_init(r11547);
        mpfr_init_set_str(r11548, "2", 10, MPFR_RNDN);
        mpfr_init(r11549);
        mpfr_init_set_str(r11550, "3", 10, MPFR_RNDN);
        mpfr_init(r11551);
        mpfr_init(r11552);
        mpfr_init_set_str(r11553, "1", 10, MPFR_RNDN);
        mpfr_init(r11554);
        mpfr_init(r11555);
        mpfr_init(r11556);
        mpfr_init_set_str(r11557, "4", 10, MPFR_RNDN);
        mpfr_init(r11558);
        mpfr_init(r11559);
        mpfr_init(r11560);
        mpfr_init(r11561);
        mpfr_init(r11562);
}

double f_dm(double a, double b) {
        mpfr_set_d(r11543, a, MPFR_RNDN);
        mpfr_mul(r11544, r11543, r11543, MPFR_RNDN);
        mpfr_set_d(r11545, b, MPFR_RNDN);
        mpfr_mul(r11546, r11545, r11545, MPFR_RNDN);
        mpfr_add(r11547, r11544, r11546, MPFR_RNDN);
        ;
        mpfr_pow(r11549, r11547, r11548, MPFR_RNDN);
        ;
        mpfr_add(r11551, r11543, r11550, MPFR_RNDN);
        mpfr_mul(r11552, r11551, r11546, MPFR_RNDN);
        ;
        mpfr_sub(r11554, r11553, r11543, MPFR_RNDN);
        mpfr_mul(r11555, r11544, r11554, MPFR_RNDN);
        mpfr_add(r11556, r11552, r11555, MPFR_RNDN);
        ;
        mpfr_mul(r11558, r11556, r11557, MPFR_RNDN);
        mpfr_add(r11559, r11549, r11558, MPFR_RNDN);
        mpfr_sqrt(r11560, r11559, MPFR_RNDN);
        mpfr_mul(r11561, r11560, r11560, MPFR_RNDN);
        mpfr_sub(r11562, r11561, r11553, MPFR_RNDN);
        return mpfr_get_d(r11562, MPFR_RNDN);
}

