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

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

double f_if(float a, float b) {
        float r27542 = a;
        float r27543 = r27542 * r27542;
        float r27544 = b;
        float r27545 = r27544 * r27544;
        float r27546 = r27543 + r27545;
        float r27547 = 2;
        float r27548 = pow(r27546, r27547);
        float r27549 = 4;
        float r27550 = r27549 * r27545;
        float r27551 = r27548 + r27550;
        float r27552 = 1;
        float r27553 = r27551 - r27552;
        return r27553;
}

double f_id(double a, double b) {
        double r27554 = a;
        double r27555 = r27554 * r27554;
        double r27556 = b;
        double r27557 = r27556 * r27556;
        double r27558 = r27555 + r27557;
        double r27559 = 2;
        double r27560 = pow(r27558, r27559);
        double r27561 = 4;
        double r27562 = r27561 * r27557;
        double r27563 = r27560 + r27562;
        double r27564 = 1;
        double r27565 = r27563 - r27564;
        return r27565;
}


double f_of(float a, float b) {
        float r27566 = a;
        float r27567 = r27566 * r27566;
        float r27568 = 4.801699443824738e-27;
        bool r27569 = r27567 <= r27568;
        float r27570 = 4;
        float r27571 = b;
        float r27572 = r27570 * r27571;
        float r27573 = pow(r27571, r27570);
        float r27574 = 1;
        float r27575 = r27573 - r27574;
        float r27576 = fma(r27572, r27571, r27575);
        float r27577 = 2;
        float r27578 = r27577 * r27566;
        float r27579 = fma(r27578, r27566, r27570);
        float r27580 = r27571 * r27571;
        float r27581 = pow(r27566, r27570);
        float r27582 = r27581 - r27574;
        float r27583 = fma(r27579, r27580, r27582);
        float r27584 = r27569 ? r27576 : r27583;
        return r27584;
}

double f_od(double a, double b) {
        double r27585 = a;
        double r27586 = r27585 * r27585;
        double r27587 = 4.801699443824738e-27;
        bool r27588 = r27586 <= r27587;
        double r27589 = 4;
        double r27590 = b;
        double r27591 = r27589 * r27590;
        double r27592 = pow(r27590, r27589);
        double r27593 = 1;
        double r27594 = r27592 - r27593;
        double r27595 = fma(r27591, r27590, r27594);
        double r27596 = 2;
        double r27597 = r27596 * r27585;
        double r27598 = fma(r27597, r27585, r27589);
        double r27599 = r27590 * r27590;
        double r27600 = pow(r27585, r27589);
        double r27601 = r27600 - r27593;
        double r27602 = fma(r27598, r27599, r27601);
        double r27603 = r27588 ? r27595 : r27602;
        return r27603;
}

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 r27604, r27605, r27606, r27607, r27608, r27609, r27610, r27611, r27612, r27613, r27614, r27615;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r27604);
        mpfr_init(r27605);
        mpfr_init(r27606);
        mpfr_init(r27607);
        mpfr_init(r27608);
        mpfr_init_set_str(r27609, "2", 10, MPFR_RNDN);
        mpfr_init(r27610);
        mpfr_init_set_str(r27611, "4", 10, MPFR_RNDN);
        mpfr_init(r27612);
        mpfr_init(r27613);
        mpfr_init_set_str(r27614, "1", 10, MPFR_RNDN);
        mpfr_init(r27615);
}

double f_im(double a, double b) {
        mpfr_set_d(r27604, a, MPFR_RNDN);
        mpfr_mul(r27605, r27604, r27604, MPFR_RNDN);
        mpfr_set_d(r27606, b, MPFR_RNDN);
        mpfr_mul(r27607, r27606, r27606, MPFR_RNDN);
        mpfr_add(r27608, r27605, r27607, MPFR_RNDN);
        ;
        mpfr_pow(r27610, r27608, r27609, MPFR_RNDN);
        ;
        mpfr_mul(r27612, r27611, r27607, MPFR_RNDN);
        mpfr_add(r27613, r27610, r27612, MPFR_RNDN);
        ;
        mpfr_sub(r27615, r27613, r27614, MPFR_RNDN);
        return mpfr_get_d(r27615, MPFR_RNDN);
}

static mpfr_t r27616, r27617, r27618, r27619, r27620, r27621, r27622, r27623, r27624, r27625, r27626, r27627, r27628, r27629, r27630, r27631, r27632, r27633, r27634;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r27616);
        mpfr_init(r27617);
        mpfr_init_set_str(r27618, "4.801699443824738e-27", 10, MPFR_RNDN);
        mpfr_init(r27619);
        mpfr_init_set_str(r27620, "4", 10, MPFR_RNDN);
        mpfr_init(r27621);
        mpfr_init(r27622);
        mpfr_init(r27623);
        mpfr_init_set_str(r27624, "1", 10, MPFR_RNDN);
        mpfr_init(r27625);
        mpfr_init(r27626);
        mpfr_init_set_str(r27627, "2", 10, MPFR_RNDN);
        mpfr_init(r27628);
        mpfr_init(r27629);
        mpfr_init(r27630);
        mpfr_init(r27631);
        mpfr_init(r27632);
        mpfr_init(r27633);
        mpfr_init(r27634);
}

double f_fm(double a, double b) {
        mpfr_set_d(r27616, a, MPFR_RNDN);
        mpfr_mul(r27617, r27616, r27616, MPFR_RNDN);
        ;
        mpfr_set_si(r27619, mpfr_cmp(r27617, r27618) <= 0, MPFR_RNDN);
        ;
        mpfr_set_d(r27621, b, MPFR_RNDN);
        mpfr_mul(r27622, r27620, r27621, MPFR_RNDN);
        mpfr_pow(r27623, r27621, r27620, MPFR_RNDN);
        ;
        mpfr_sub(r27625, r27623, r27624, MPFR_RNDN);
        mpfr_fma(r27626, r27622, r27621, r27625, MPFR_RNDN);
        ;
        mpfr_mul(r27628, r27627, r27616, MPFR_RNDN);
        mpfr_fma(r27629, r27628, r27616, r27620, MPFR_RNDN);
        mpfr_mul(r27630, r27621, r27621, MPFR_RNDN);
        mpfr_pow(r27631, r27616, r27620, MPFR_RNDN);
        mpfr_sub(r27632, r27631, r27624, MPFR_RNDN);
        mpfr_fma(r27633, r27629, r27630, r27632, MPFR_RNDN);
        if (mpfr_get_si(r27619, MPFR_RNDN)) { mpfr_set(r27634, r27626, MPFR_RNDN); } else { mpfr_set(r27634, r27633, MPFR_RNDN); };
        return mpfr_get_d(r27634, MPFR_RNDN);
}

static mpfr_t r27635, r27636, r27637, r27638, r27639, r27640, r27641, r27642, r27643, r27644, r27645, r27646, r27647, r27648, r27649, r27650, r27651, r27652, r27653;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r27635);
        mpfr_init(r27636);
        mpfr_init_set_str(r27637, "4.801699443824738e-27", 10, MPFR_RNDN);
        mpfr_init(r27638);
        mpfr_init_set_str(r27639, "4", 10, MPFR_RNDN);
        mpfr_init(r27640);
        mpfr_init(r27641);
        mpfr_init(r27642);
        mpfr_init_set_str(r27643, "1", 10, MPFR_RNDN);
        mpfr_init(r27644);
        mpfr_init(r27645);
        mpfr_init_set_str(r27646, "2", 10, MPFR_RNDN);
        mpfr_init(r27647);
        mpfr_init(r27648);
        mpfr_init(r27649);
        mpfr_init(r27650);
        mpfr_init(r27651);
        mpfr_init(r27652);
        mpfr_init(r27653);
}

double f_dm(double a, double b) {
        mpfr_set_d(r27635, a, MPFR_RNDN);
        mpfr_mul(r27636, r27635, r27635, MPFR_RNDN);
        ;
        mpfr_set_si(r27638, mpfr_cmp(r27636, r27637) <= 0, MPFR_RNDN);
        ;
        mpfr_set_d(r27640, b, MPFR_RNDN);
        mpfr_mul(r27641, r27639, r27640, MPFR_RNDN);
        mpfr_pow(r27642, r27640, r27639, MPFR_RNDN);
        ;
        mpfr_sub(r27644, r27642, r27643, MPFR_RNDN);
        mpfr_fma(r27645, r27641, r27640, r27644, MPFR_RNDN);
        ;
        mpfr_mul(r27647, r27646, r27635, MPFR_RNDN);
        mpfr_fma(r27648, r27647, r27635, r27639, MPFR_RNDN);
        mpfr_mul(r27649, r27640, r27640, MPFR_RNDN);
        mpfr_pow(r27650, r27635, r27639, MPFR_RNDN);
        mpfr_sub(r27651, r27650, r27643, MPFR_RNDN);
        mpfr_fma(r27652, r27648, r27649, r27651, MPFR_RNDN);
        if (mpfr_get_si(r27638, MPFR_RNDN)) { mpfr_set(r27653, r27645, MPFR_RNDN); } else { mpfr_set(r27653, r27652, MPFR_RNDN); };
        return mpfr_get_d(r27653, MPFR_RNDN);
}

