#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 r11461 = a;
        float r11462 = r11461 * r11461;
        float r11463 = b;
        float r11464 = r11463 * r11463;
        float r11465 = r11462 + r11464;
        float r11466 = 2.0f;
        float r11467 = pow(r11465, r11466);
        float r11468 = 4.0f;
        float r11469 = 1.0f;
        float r11470 = r11469 - r11461;
        float r11471 = r11462 * r11470;
        float r11472 = 3.0f;
        float r11473 = r11472 + r11461;
        float r11474 = r11464 * r11473;
        float r11475 = r11471 + r11474;
        float r11476 = r11468 * r11475;
        float r11477 = r11467 + r11476;
        float r11478 = r11477 - r11469;
        return r11478;
}

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


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

double f_od(double a, double b) {
        double r11517 = b;
        double r11518 = a;
        double r11519 = r11518 * r11518;
        double r11520 = fma(r11517, r11517, r11519);
        double r11521 = r11517 * r11517;
        double r11522 = r11519 + r11521;
        double r11523 = sqrt(r11522);
        double r11524 = 2.0;
        double r11525 = pow(r11523, r11524);
        double r11526 = 4.0;
        double r11527 = 3.0;
        double r11528 = r11527 + r11518;
        double r11529 = r11528 * r11521;
        double r11530 = 1.0;
        double r11531 = r11530 - r11518;
        double r11532 = r11531 * r11519;
        double r11533 = r11529 + r11532;
        double r11534 = r11526 * r11533;
        double r11535 = fma(r11520, r11525, r11534);
        double r11536 = r11535 - r11530;
        return r11536;
}

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 r11537, r11538, r11539, r11540, r11541, r11542, r11543, r11544, r11545, r11546, r11547, r11548, r11549, r11550, r11551, r11552, r11553, r11554;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        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, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11545, "1", 10, MPFR_RNDN);
        mpfr_init(r11546);
        mpfr_init(r11547);
        mpfr_init_set_str(r11548, "3", 10, MPFR_RNDN);
        mpfr_init(r11549);
        mpfr_init(r11550);
        mpfr_init(r11551);
        mpfr_init(r11552);
        mpfr_init(r11553);
        mpfr_init(r11554);
}

double f_im(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_sub(r11546, r11545, r11537, MPFR_RNDN);
        mpfr_mul(r11547, r11538, r11546, MPFR_RNDN);
        ;
        mpfr_add(r11549, r11548, r11537, MPFR_RNDN);
        mpfr_mul(r11550, r11540, r11549, MPFR_RNDN);
        mpfr_add(r11551, r11547, r11550, MPFR_RNDN);
        mpfr_mul(r11552, r11544, r11551, MPFR_RNDN);
        mpfr_add(r11553, r11543, r11552, MPFR_RNDN);
        mpfr_sub(r11554, r11553, r11545, MPFR_RNDN);
        return mpfr_get_d(r11554, MPFR_RNDN);
}

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

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

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

static mpfr_t r11575, r11576, r11577, r11578, r11579, r11580, r11581, r11582, r11583, r11584, r11585, r11586, r11587, r11588, r11589, r11590, r11591, r11592, r11593, r11594;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11575);
        mpfr_init(r11576);
        mpfr_init(r11577);
        mpfr_init(r11578);
        mpfr_init(r11579);
        mpfr_init(r11580);
        mpfr_init(r11581);
        mpfr_init_set_str(r11582, "2", 10, MPFR_RNDN);
        mpfr_init(r11583);
        mpfr_init_set_str(r11584, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11585, "3", 10, MPFR_RNDN);
        mpfr_init(r11586);
        mpfr_init(r11587);
        mpfr_init_set_str(r11588, "1", 10, MPFR_RNDN);
        mpfr_init(r11589);
        mpfr_init(r11590);
        mpfr_init(r11591);
        mpfr_init(r11592);
        mpfr_init(r11593);
        mpfr_init(r11594);
}

double f_dm(double a, double b) {
        mpfr_set_d(r11575, b, MPFR_RNDN);
        mpfr_set_d(r11576, a, MPFR_RNDN);
        mpfr_mul(r11577, r11576, r11576, MPFR_RNDN);
        mpfr_fma(r11578, r11575, r11575, r11577, MPFR_RNDN);
        mpfr_mul(r11579, r11575, r11575, MPFR_RNDN);
        mpfr_add(r11580, r11577, r11579, MPFR_RNDN);
        mpfr_sqrt(r11581, r11580, MPFR_RNDN);
        ;
        mpfr_pow(r11583, r11581, r11582, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11586, r11585, r11576, MPFR_RNDN);
        mpfr_mul(r11587, r11586, r11579, MPFR_RNDN);
        ;
        mpfr_sub(r11589, r11588, r11576, MPFR_RNDN);
        mpfr_mul(r11590, r11589, r11577, MPFR_RNDN);
        mpfr_add(r11591, r11587, r11590, MPFR_RNDN);
        mpfr_mul(r11592, r11584, r11591, MPFR_RNDN);
        mpfr_fma(r11593, r11578, r11583, r11592, MPFR_RNDN);
        mpfr_sub(r11594, r11593, r11588, MPFR_RNDN);
        return mpfr_get_d(r11594, MPFR_RNDN);
}

