#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 r27543 = a;
        float r27544 = r27543 * r27543;
        float r27545 = b;
        float r27546 = r27545 * r27545;
        float r27547 = r27544 + r27546;
        float r27548 = 2;
        float r27549 = pow(r27547, r27548);
        float r27550 = 4;
        float r27551 = 1;
        float r27552 = r27551 + r27543;
        float r27553 = r27544 * r27552;
        float r27554 = 3;
        float r27555 = r27554 * r27543;
        float r27556 = r27551 - r27555;
        float r27557 = r27546 * r27556;
        float r27558 = r27553 + r27557;
        float r27559 = r27550 * r27558;
        float r27560 = r27549 + r27559;
        float r27561 = r27560 - r27551;
        return r27561;
}

double f_id(double a, double b) {
        double r27562 = a;
        double r27563 = r27562 * r27562;
        double r27564 = b;
        double r27565 = r27564 * r27564;
        double r27566 = r27563 + r27565;
        double r27567 = 2;
        double r27568 = pow(r27566, r27567);
        double r27569 = 4;
        double r27570 = 1;
        double r27571 = r27570 + r27562;
        double r27572 = r27563 * r27571;
        double r27573 = 3;
        double r27574 = r27573 * r27562;
        double r27575 = r27570 - r27574;
        double r27576 = r27565 * r27575;
        double r27577 = r27572 + r27576;
        double r27578 = r27569 * r27577;
        double r27579 = r27568 + r27578;
        double r27580 = r27579 - r27570;
        return r27580;
}


double f_of(float a, float b) {
        float r27581 = b;
        float r27582 = a;
        float r27583 = hypot(r27581, r27582);
        float r27584 = 3;
        float r27585 = 1;
        float r27586 = r27584 + r27585;
        float r27587 = pow(r27583, r27586);
        float r27588 = 4;
        float r27589 = r27582 * r27582;
        float r27590 = r27585 + r27582;
        float r27591 = r27589 * r27590;
        float r27592 = r27581 * r27581;
        float r27593 = r27584 * r27582;
        float r27594 = r27585 - r27593;
        float r27595 = r27592 * r27594;
        float r27596 = r27591 + r27595;
        float r27597 = r27588 * r27596;
        float r27598 = r27587 + r27597;
        float r27599 = r27598 - r27585;
        return r27599;
}

double f_od(double a, double b) {
        double r27600 = b;
        double r27601 = a;
        double r27602 = hypot(r27600, r27601);
        double r27603 = 3;
        double r27604 = 1;
        double r27605 = r27603 + r27604;
        double r27606 = pow(r27602, r27605);
        double r27607 = 4;
        double r27608 = r27601 * r27601;
        double r27609 = r27604 + r27601;
        double r27610 = r27608 * r27609;
        double r27611 = r27600 * r27600;
        double r27612 = r27603 * r27601;
        double r27613 = r27604 - r27612;
        double r27614 = r27611 * r27613;
        double r27615 = r27610 + r27614;
        double r27616 = r27607 * r27615;
        double r27617 = r27606 + r27616;
        double r27618 = r27617 - r27604;
        return r27618;
}

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 r27619, r27620, r27621, r27622, r27623, r27624, r27625, r27626, r27627, r27628, r27629, r27630, r27631, r27632, r27633, r27634, r27635, r27636, r27637;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r27619);
        mpfr_init(r27620);
        mpfr_init(r27621);
        mpfr_init(r27622);
        mpfr_init(r27623);
        mpfr_init_set_str(r27624, "2", 10, MPFR_RNDN);
        mpfr_init(r27625);
        mpfr_init_set_str(r27626, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27627, "1", 10, MPFR_RNDN);
        mpfr_init(r27628);
        mpfr_init(r27629);
        mpfr_init_set_str(r27630, "3", 10, MPFR_RNDN);
        mpfr_init(r27631);
        mpfr_init(r27632);
        mpfr_init(r27633);
        mpfr_init(r27634);
        mpfr_init(r27635);
        mpfr_init(r27636);
        mpfr_init(r27637);
}

double f_im(double a, double b) {
        mpfr_set_d(r27619, a, MPFR_RNDN);
        mpfr_mul(r27620, r27619, r27619, MPFR_RNDN);
        mpfr_set_d(r27621, b, MPFR_RNDN);
        mpfr_mul(r27622, r27621, r27621, MPFR_RNDN);
        mpfr_add(r27623, r27620, r27622, MPFR_RNDN);
        ;
        mpfr_pow(r27625, r27623, r27624, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27628, r27627, r27619, MPFR_RNDN);
        mpfr_mul(r27629, r27620, r27628, MPFR_RNDN);
        ;
        mpfr_mul(r27631, r27630, r27619, MPFR_RNDN);
        mpfr_sub(r27632, r27627, r27631, MPFR_RNDN);
        mpfr_mul(r27633, r27622, r27632, MPFR_RNDN);
        mpfr_add(r27634, r27629, r27633, MPFR_RNDN);
        mpfr_mul(r27635, r27626, r27634, MPFR_RNDN);
        mpfr_add(r27636, r27625, r27635, MPFR_RNDN);
        mpfr_sub(r27637, r27636, r27627, MPFR_RNDN);
        return mpfr_get_d(r27637, MPFR_RNDN);
}

static mpfr_t r27638, r27639, r27640, r27641, r27642, r27643, r27644, r27645, r27646, r27647, r27648, r27649, r27650, r27651, r27652, r27653, r27654, r27655, r27656;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27638);
        mpfr_init(r27639);
        mpfr_init(r27640);
        mpfr_init_set_str(r27641, "3", 10, MPFR_RNDN);
        mpfr_init_set_str(r27642, "1", 10, MPFR_RNDN);
        mpfr_init(r27643);
        mpfr_init(r27644);
        mpfr_init_set_str(r27645, "4", 10, MPFR_RNDN);
        mpfr_init(r27646);
        mpfr_init(r27647);
        mpfr_init(r27648);
        mpfr_init(r27649);
        mpfr_init(r27650);
        mpfr_init(r27651);
        mpfr_init(r27652);
        mpfr_init(r27653);
        mpfr_init(r27654);
        mpfr_init(r27655);
        mpfr_init(r27656);
}

double f_fm(double a, double b) {
        mpfr_set_d(r27638, b, MPFR_RNDN);
        mpfr_set_d(r27639, a, MPFR_RNDN);
        mpfr_hypot(r27640, r27638, r27639, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27643, r27641, r27642, MPFR_RNDN);
        mpfr_pow(r27644, r27640, r27643, MPFR_RNDN);
        ;
        mpfr_mul(r27646, r27639, r27639, MPFR_RNDN);
        mpfr_add(r27647, r27642, r27639, MPFR_RNDN);
        mpfr_mul(r27648, r27646, r27647, MPFR_RNDN);
        mpfr_mul(r27649, r27638, r27638, MPFR_RNDN);
        mpfr_mul(r27650, r27641, r27639, MPFR_RNDN);
        mpfr_sub(r27651, r27642, r27650, MPFR_RNDN);
        mpfr_mul(r27652, r27649, r27651, MPFR_RNDN);
        mpfr_add(r27653, r27648, r27652, MPFR_RNDN);
        mpfr_mul(r27654, r27645, r27653, MPFR_RNDN);
        mpfr_add(r27655, r27644, r27654, MPFR_RNDN);
        mpfr_sub(r27656, r27655, r27642, MPFR_RNDN);
        return mpfr_get_d(r27656, MPFR_RNDN);
}

static mpfr_t r27657, r27658, r27659, r27660, r27661, r27662, r27663, r27664, r27665, r27666, r27667, r27668, r27669, r27670, r27671, r27672, r27673, r27674, r27675;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27657);
        mpfr_init(r27658);
        mpfr_init(r27659);
        mpfr_init_set_str(r27660, "3", 10, MPFR_RNDN);
        mpfr_init_set_str(r27661, "1", 10, MPFR_RNDN);
        mpfr_init(r27662);
        mpfr_init(r27663);
        mpfr_init_set_str(r27664, "4", 10, MPFR_RNDN);
        mpfr_init(r27665);
        mpfr_init(r27666);
        mpfr_init(r27667);
        mpfr_init(r27668);
        mpfr_init(r27669);
        mpfr_init(r27670);
        mpfr_init(r27671);
        mpfr_init(r27672);
        mpfr_init(r27673);
        mpfr_init(r27674);
        mpfr_init(r27675);
}

double f_dm(double a, double b) {
        mpfr_set_d(r27657, b, MPFR_RNDN);
        mpfr_set_d(r27658, a, MPFR_RNDN);
        mpfr_hypot(r27659, r27657, r27658, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27662, r27660, r27661, MPFR_RNDN);
        mpfr_pow(r27663, r27659, r27662, MPFR_RNDN);
        ;
        mpfr_mul(r27665, r27658, r27658, MPFR_RNDN);
        mpfr_add(r27666, r27661, r27658, MPFR_RNDN);
        mpfr_mul(r27667, r27665, r27666, MPFR_RNDN);
        mpfr_mul(r27668, r27657, r27657, MPFR_RNDN);
        mpfr_mul(r27669, r27660, r27658, MPFR_RNDN);
        mpfr_sub(r27670, r27661, r27669, MPFR_RNDN);
        mpfr_mul(r27671, r27668, r27670, MPFR_RNDN);
        mpfr_add(r27672, r27667, r27671, MPFR_RNDN);
        mpfr_mul(r27673, r27664, r27672, MPFR_RNDN);
        mpfr_add(r27674, r27663, r27673, MPFR_RNDN);
        mpfr_sub(r27675, r27674, r27661, MPFR_RNDN);
        return mpfr_get_d(r27675, MPFR_RNDN);
}

