#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 r10433 = a;
        float r10434 = r10433 * r10433;
        float r10435 = b;
        float r10436 = r10435 * r10435;
        float r10437 = r10434 + r10436;
        float r10438 = 2.0f;
        float r10439 = pow(r10437, r10438);
        float r10440 = 4.0f;
        float r10441 = 1.0f;
        float r10442 = r10441 + r10433;
        float r10443 = r10434 * r10442;
        float r10444 = 3.0f;
        float r10445 = r10444 * r10433;
        float r10446 = r10441 - r10445;
        float r10447 = r10436 * r10446;
        float r10448 = r10443 + r10447;
        float r10449 = r10440 * r10448;
        float r10450 = r10439 + r10449;
        float r10451 = r10450 - r10441;
        return r10451;
}

double f_id(double a, double b) {
        double r10452 = a;
        double r10453 = r10452 * r10452;
        double r10454 = b;
        double r10455 = r10454 * r10454;
        double r10456 = r10453 + r10455;
        double r10457 = 2.0;
        double r10458 = pow(r10456, r10457);
        double r10459 = 4.0;
        double r10460 = 1.0;
        double r10461 = r10460 + r10452;
        double r10462 = r10453 * r10461;
        double r10463 = 3.0;
        double r10464 = r10463 * r10452;
        double r10465 = r10460 - r10464;
        double r10466 = r10455 * r10465;
        double r10467 = r10462 + r10466;
        double r10468 = r10459 * r10467;
        double r10469 = r10458 + r10468;
        double r10470 = r10469 - r10460;
        return r10470;
}


double f_of(float a, float b) {
        float r10471 = a;
        float r10472 = r10471 * r10471;
        float r10473 = b;
        float r10474 = r10473 * r10473;
        float r10475 = r10472 + r10474;
        float r10476 = 2.0f;
        float r10477 = pow(r10475, r10476);
        float r10478 = 1.0f;
        float r10479 = r10471 + r10478;
        float r10480 = r10472 * r10479;
        float r10481 = 3.0f;
        float r10482 = r10481 * r10471;
        float r10483 = r10478 - r10482;
        float r10484 = r10474 * r10483;
        float r10485 = r10480 + r10484;
        float r10486 = 4.0f;
        float r10487 = r10485 * r10486;
        float r10488 = r10477 + r10487;
        float r10489 = r10488 - r10478;
        return r10489;
}

double f_od(double a, double b) {
        double r10490 = a;
        double r10491 = r10490 * r10490;
        double r10492 = b;
        double r10493 = r10492 * r10492;
        double r10494 = r10491 + r10493;
        double r10495 = 2.0;
        double r10496 = pow(r10494, r10495);
        double r10497 = 1.0;
        double r10498 = r10490 + r10497;
        double r10499 = r10491 * r10498;
        double r10500 = 3.0;
        double r10501 = r10500 * r10490;
        double r10502 = r10497 - r10501;
        double r10503 = r10493 * r10502;
        double r10504 = r10499 + r10503;
        double r10505 = 4.0;
        double r10506 = r10504 * r10505;
        double r10507 = r10496 + r10506;
        double r10508 = r10507 - r10497;
        return r10508;
}

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 r10509, r10510, r10511, r10512, r10513, r10514, r10515, r10516, r10517, r10518, r10519, r10520, r10521, r10522, r10523, r10524, r10525, r10526, r10527;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r10509);
        mpfr_init(r10510);
        mpfr_init(r10511);
        mpfr_init(r10512);
        mpfr_init(r10513);
        mpfr_init_set_str(r10514, "2", 10, MPFR_RNDN);
        mpfr_init(r10515);
        mpfr_init_set_str(r10516, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r10517, "1", 10, MPFR_RNDN);
        mpfr_init(r10518);
        mpfr_init(r10519);
        mpfr_init_set_str(r10520, "3", 10, MPFR_RNDN);
        mpfr_init(r10521);
        mpfr_init(r10522);
        mpfr_init(r10523);
        mpfr_init(r10524);
        mpfr_init(r10525);
        mpfr_init(r10526);
        mpfr_init(r10527);
}

double f_im(double a, double b) {
        mpfr_set_d(r10509, a, MPFR_RNDN);
        mpfr_mul(r10510, r10509, r10509, MPFR_RNDN);
        mpfr_set_d(r10511, b, MPFR_RNDN);
        mpfr_mul(r10512, r10511, r10511, MPFR_RNDN);
        mpfr_add(r10513, r10510, r10512, MPFR_RNDN);
        ;
        mpfr_pow(r10515, r10513, r10514, MPFR_RNDN);
        ;
        ;
        mpfr_add(r10518, r10517, r10509, MPFR_RNDN);
        mpfr_mul(r10519, r10510, r10518, MPFR_RNDN);
        ;
        mpfr_mul(r10521, r10520, r10509, MPFR_RNDN);
        mpfr_sub(r10522, r10517, r10521, MPFR_RNDN);
        mpfr_mul(r10523, r10512, r10522, MPFR_RNDN);
        mpfr_add(r10524, r10519, r10523, MPFR_RNDN);
        mpfr_mul(r10525, r10516, r10524, MPFR_RNDN);
        mpfr_add(r10526, r10515, r10525, MPFR_RNDN);
        mpfr_sub(r10527, r10526, r10517, MPFR_RNDN);
        return mpfr_get_d(r10527, MPFR_RNDN);
}

static mpfr_t r10528, r10529, r10530, r10531, r10532, r10533, r10534, r10535, r10536, r10537, r10538, r10539, r10540, r10541, r10542, r10543, r10544, r10545, r10546;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r10528);
        mpfr_init(r10529);
        mpfr_init(r10530);
        mpfr_init(r10531);
        mpfr_init(r10532);
        mpfr_init_set_str(r10533, "2", 10, MPFR_RNDN);
        mpfr_init(r10534);
        mpfr_init_set_str(r10535, "1", 10, MPFR_RNDN);
        mpfr_init(r10536);
        mpfr_init(r10537);
        mpfr_init_set_str(r10538, "3", 10, MPFR_RNDN);
        mpfr_init(r10539);
        mpfr_init(r10540);
        mpfr_init(r10541);
        mpfr_init(r10542);
        mpfr_init_set_str(r10543, "4", 10, MPFR_RNDN);
        mpfr_init(r10544);
        mpfr_init(r10545);
        mpfr_init(r10546);
}

double f_fm(double a, double b) {
        mpfr_set_d(r10528, a, MPFR_RNDN);
        mpfr_mul(r10529, r10528, r10528, MPFR_RNDN);
        mpfr_set_d(r10530, b, MPFR_RNDN);
        mpfr_mul(r10531, r10530, r10530, MPFR_RNDN);
        mpfr_add(r10532, r10529, r10531, MPFR_RNDN);
        ;
        mpfr_pow(r10534, r10532, r10533, MPFR_RNDN);
        ;
        mpfr_add(r10536, r10528, r10535, MPFR_RNDN);
        mpfr_mul(r10537, r10529, r10536, MPFR_RNDN);
        ;
        mpfr_mul(r10539, r10538, r10528, MPFR_RNDN);
        mpfr_sub(r10540, r10535, r10539, MPFR_RNDN);
        mpfr_mul(r10541, r10531, r10540, MPFR_RNDN);
        mpfr_add(r10542, r10537, r10541, MPFR_RNDN);
        ;
        mpfr_mul(r10544, r10542, r10543, MPFR_RNDN);
        mpfr_add(r10545, r10534, r10544, MPFR_RNDN);
        mpfr_sub(r10546, r10545, r10535, MPFR_RNDN);
        return mpfr_get_d(r10546, MPFR_RNDN);
}

static mpfr_t r10547, r10548, r10549, r10550, r10551, r10552, r10553, r10554, r10555, r10556, r10557, r10558, r10559, r10560, r10561, r10562, r10563, r10564, r10565;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r10547);
        mpfr_init(r10548);
        mpfr_init(r10549);
        mpfr_init(r10550);
        mpfr_init(r10551);
        mpfr_init_set_str(r10552, "2", 10, MPFR_RNDN);
        mpfr_init(r10553);
        mpfr_init_set_str(r10554, "1", 10, MPFR_RNDN);
        mpfr_init(r10555);
        mpfr_init(r10556);
        mpfr_init_set_str(r10557, "3", 10, MPFR_RNDN);
        mpfr_init(r10558);
        mpfr_init(r10559);
        mpfr_init(r10560);
        mpfr_init(r10561);
        mpfr_init_set_str(r10562, "4", 10, MPFR_RNDN);
        mpfr_init(r10563);
        mpfr_init(r10564);
        mpfr_init(r10565);
}

double f_dm(double a, double b) {
        mpfr_set_d(r10547, a, MPFR_RNDN);
        mpfr_mul(r10548, r10547, r10547, MPFR_RNDN);
        mpfr_set_d(r10549, b, MPFR_RNDN);
        mpfr_mul(r10550, r10549, r10549, MPFR_RNDN);
        mpfr_add(r10551, r10548, r10550, MPFR_RNDN);
        ;
        mpfr_pow(r10553, r10551, r10552, MPFR_RNDN);
        ;
        mpfr_add(r10555, r10547, r10554, MPFR_RNDN);
        mpfr_mul(r10556, r10548, r10555, MPFR_RNDN);
        ;
        mpfr_mul(r10558, r10557, r10547, MPFR_RNDN);
        mpfr_sub(r10559, r10554, r10558, MPFR_RNDN);
        mpfr_mul(r10560, r10550, r10559, MPFR_RNDN);
        mpfr_add(r10561, r10556, r10560, MPFR_RNDN);
        ;
        mpfr_mul(r10563, r10561, r10562, MPFR_RNDN);
        mpfr_add(r10564, r10553, r10563, MPFR_RNDN);
        mpfr_sub(r10565, r10564, r10554, MPFR_RNDN);
        return mpfr_get_d(r10565, MPFR_RNDN);
}

