#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 r27531 = a;
        float r27532 = r27531 * r27531;
        float r27533 = b;
        float r27534 = r27533 * r27533;
        float r27535 = r27532 + r27534;
        float r27536 = 2;
        float r27537 = pow(r27535, r27536);
        float r27538 = 4;
        float r27539 = 1;
        float r27540 = r27539 + r27531;
        float r27541 = r27532 * r27540;
        float r27542 = 3;
        float r27543 = r27542 * r27531;
        float r27544 = r27539 - r27543;
        float r27545 = r27534 * r27544;
        float r27546 = r27541 + r27545;
        float r27547 = r27538 * r27546;
        float r27548 = r27537 + r27547;
        float r27549 = r27548 - r27539;
        return r27549;
}

double f_id(double a, double b) {
        double r27550 = a;
        double r27551 = r27550 * r27550;
        double r27552 = b;
        double r27553 = r27552 * r27552;
        double r27554 = r27551 + r27553;
        double r27555 = 2;
        double r27556 = pow(r27554, r27555);
        double r27557 = 4;
        double r27558 = 1;
        double r27559 = r27558 + r27550;
        double r27560 = r27551 * r27559;
        double r27561 = 3;
        double r27562 = r27561 * r27550;
        double r27563 = r27558 - r27562;
        double r27564 = r27553 * r27563;
        double r27565 = r27560 + r27564;
        double r27566 = r27557 * r27565;
        double r27567 = r27556 + r27566;
        double r27568 = r27567 - r27558;
        return r27568;
}


double f_of(float a, float b) {
        float r27569 = b;
        float r27570 = a;
        float r27571 = hypot(r27569, r27570);
        float r27572 = 3;
        float r27573 = 1;
        float r27574 = r27572 + r27573;
        float r27575 = pow(r27571, r27574);
        float r27576 = 4;
        float r27577 = r27570 * r27570;
        float r27578 = r27573 + r27570;
        float r27579 = r27577 * r27578;
        float r27580 = r27569 * r27569;
        float r27581 = r27572 * r27570;
        float r27582 = r27573 - r27581;
        float r27583 = r27580 * r27582;
        float r27584 = r27579 + r27583;
        float r27585 = r27576 * r27584;
        float r27586 = r27575 + r27585;
        float r27587 = r27586 - r27573;
        return r27587;
}

double f_od(double a, double b) {
        double r27588 = b;
        double r27589 = a;
        double r27590 = hypot(r27588, r27589);
        double r27591 = 3;
        double r27592 = 1;
        double r27593 = r27591 + r27592;
        double r27594 = pow(r27590, r27593);
        double r27595 = 4;
        double r27596 = r27589 * r27589;
        double r27597 = r27592 + r27589;
        double r27598 = r27596 * r27597;
        double r27599 = r27588 * r27588;
        double r27600 = r27591 * r27589;
        double r27601 = r27592 - r27600;
        double r27602 = r27599 * r27601;
        double r27603 = r27598 + r27602;
        double r27604 = r27595 * r27603;
        double r27605 = r27594 + r27604;
        double r27606 = r27605 - r27592;
        return r27606;
}

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 r27607, r27608, r27609, r27610, r27611, r27612, r27613, r27614, r27615, r27616, r27617, r27618, r27619, r27620, r27621, r27622, r27623, r27624, r27625;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r27607);
        mpfr_init(r27608);
        mpfr_init(r27609);
        mpfr_init(r27610);
        mpfr_init(r27611);
        mpfr_init_set_str(r27612, "2", 10, MPFR_RNDN);
        mpfr_init(r27613);
        mpfr_init_set_str(r27614, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27615, "1", 10, MPFR_RNDN);
        mpfr_init(r27616);
        mpfr_init(r27617);
        mpfr_init_set_str(r27618, "3", 10, MPFR_RNDN);
        mpfr_init(r27619);
        mpfr_init(r27620);
        mpfr_init(r27621);
        mpfr_init(r27622);
        mpfr_init(r27623);
        mpfr_init(r27624);
        mpfr_init(r27625);
}

double f_im(double a, double b) {
        mpfr_set_d(r27607, a, MPFR_RNDN);
        mpfr_mul(r27608, r27607, r27607, MPFR_RNDN);
        mpfr_set_d(r27609, b, MPFR_RNDN);
        mpfr_mul(r27610, r27609, r27609, MPFR_RNDN);
        mpfr_add(r27611, r27608, r27610, MPFR_RNDN);
        ;
        mpfr_pow(r27613, r27611, r27612, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27616, r27615, r27607, MPFR_RNDN);
        mpfr_mul(r27617, r27608, r27616, MPFR_RNDN);
        ;
        mpfr_mul(r27619, r27618, r27607, MPFR_RNDN);
        mpfr_sub(r27620, r27615, r27619, MPFR_RNDN);
        mpfr_mul(r27621, r27610, r27620, MPFR_RNDN);
        mpfr_add(r27622, r27617, r27621, MPFR_RNDN);
        mpfr_mul(r27623, r27614, r27622, MPFR_RNDN);
        mpfr_add(r27624, r27613, r27623, MPFR_RNDN);
        mpfr_sub(r27625, r27624, r27615, MPFR_RNDN);
        return mpfr_get_d(r27625, MPFR_RNDN);
}

static mpfr_t r27626, r27627, r27628, r27629, r27630, r27631, r27632, r27633, r27634, r27635, r27636, r27637, r27638, r27639, r27640, r27641, r27642, r27643, r27644;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r27626);
        mpfr_init(r27627);
        mpfr_init(r27628);
        mpfr_init_set_str(r27629, "3", 10, MPFR_RNDN);
        mpfr_init_set_str(r27630, "1", 10, MPFR_RNDN);
        mpfr_init(r27631);
        mpfr_init(r27632);
        mpfr_init_set_str(r27633, "4", 10, MPFR_RNDN);
        mpfr_init(r27634);
        mpfr_init(r27635);
        mpfr_init(r27636);
        mpfr_init(r27637);
        mpfr_init(r27638);
        mpfr_init(r27639);
        mpfr_init(r27640);
        mpfr_init(r27641);
        mpfr_init(r27642);
        mpfr_init(r27643);
        mpfr_init(r27644);
}

double f_fm(double a, double b) {
        mpfr_set_d(r27626, b, MPFR_RNDN);
        mpfr_set_d(r27627, a, MPFR_RNDN);
        mpfr_hypot(r27628, r27626, r27627, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27631, r27629, r27630, MPFR_RNDN);
        mpfr_pow(r27632, r27628, r27631, MPFR_RNDN);
        ;
        mpfr_mul(r27634, r27627, r27627, MPFR_RNDN);
        mpfr_add(r27635, r27630, r27627, MPFR_RNDN);
        mpfr_mul(r27636, r27634, r27635, MPFR_RNDN);
        mpfr_mul(r27637, r27626, r27626, MPFR_RNDN);
        mpfr_mul(r27638, r27629, r27627, MPFR_RNDN);
        mpfr_sub(r27639, r27630, r27638, MPFR_RNDN);
        mpfr_mul(r27640, r27637, r27639, MPFR_RNDN);
        mpfr_add(r27641, r27636, r27640, MPFR_RNDN);
        mpfr_mul(r27642, r27633, r27641, MPFR_RNDN);
        mpfr_add(r27643, r27632, r27642, MPFR_RNDN);
        mpfr_sub(r27644, r27643, r27630, MPFR_RNDN);
        return mpfr_get_d(r27644, MPFR_RNDN);
}

static mpfr_t r27645, r27646, r27647, r27648, r27649, r27650, r27651, r27652, r27653, r27654, r27655, r27656, r27657, r27658, r27659, r27660, r27661, r27662, r27663;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r27645);
        mpfr_init(r27646);
        mpfr_init(r27647);
        mpfr_init_set_str(r27648, "3", 10, MPFR_RNDN);
        mpfr_init_set_str(r27649, "1", 10, MPFR_RNDN);
        mpfr_init(r27650);
        mpfr_init(r27651);
        mpfr_init_set_str(r27652, "4", 10, MPFR_RNDN);
        mpfr_init(r27653);
        mpfr_init(r27654);
        mpfr_init(r27655);
        mpfr_init(r27656);
        mpfr_init(r27657);
        mpfr_init(r27658);
        mpfr_init(r27659);
        mpfr_init(r27660);
        mpfr_init(r27661);
        mpfr_init(r27662);
        mpfr_init(r27663);
}

double f_dm(double a, double b) {
        mpfr_set_d(r27645, b, MPFR_RNDN);
        mpfr_set_d(r27646, a, MPFR_RNDN);
        mpfr_hypot(r27647, r27645, r27646, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27650, r27648, r27649, MPFR_RNDN);
        mpfr_pow(r27651, r27647, r27650, MPFR_RNDN);
        ;
        mpfr_mul(r27653, r27646, r27646, MPFR_RNDN);
        mpfr_add(r27654, r27649, r27646, MPFR_RNDN);
        mpfr_mul(r27655, r27653, r27654, MPFR_RNDN);
        mpfr_mul(r27656, r27645, r27645, MPFR_RNDN);
        mpfr_mul(r27657, r27648, r27646, MPFR_RNDN);
        mpfr_sub(r27658, r27649, r27657, MPFR_RNDN);
        mpfr_mul(r27659, r27656, r27658, MPFR_RNDN);
        mpfr_add(r27660, r27655, r27659, MPFR_RNDN);
        mpfr_mul(r27661, r27652, r27660, MPFR_RNDN);
        mpfr_add(r27662, r27651, r27661, MPFR_RNDN);
        mpfr_sub(r27663, r27662, r27649, MPFR_RNDN);
        return mpfr_get_d(r27663, MPFR_RNDN);
}

