#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 r27572 = a;
        float r27573 = r27572 * r27572;
        float r27574 = b;
        float r27575 = r27574 * r27574;
        float r27576 = r27573 + r27575;
        float r27577 = 2;
        float r27578 = pow(r27576, r27577);
        float r27579 = 4;
        float r27580 = 1;
        float r27581 = r27580 + r27572;
        float r27582 = r27573 * r27581;
        float r27583 = 3;
        float r27584 = r27583 * r27572;
        float r27585 = r27580 - r27584;
        float r27586 = r27575 * r27585;
        float r27587 = r27582 + r27586;
        float r27588 = r27579 * r27587;
        float r27589 = r27578 + r27588;
        float r27590 = r27589 - r27580;
        return r27590;
}

double f_id(double a, double b) {
        double r27591 = a;
        double r27592 = r27591 * r27591;
        double r27593 = b;
        double r27594 = r27593 * r27593;
        double r27595 = r27592 + r27594;
        double r27596 = 2;
        double r27597 = pow(r27595, r27596);
        double r27598 = 4;
        double r27599 = 1;
        double r27600 = r27599 + r27591;
        double r27601 = r27592 * r27600;
        double r27602 = 3;
        double r27603 = r27602 * r27591;
        double r27604 = r27599 - r27603;
        double r27605 = r27594 * r27604;
        double r27606 = r27601 + r27605;
        double r27607 = r27598 * r27606;
        double r27608 = r27597 + r27607;
        double r27609 = r27608 - r27599;
        return r27609;
}


double f_of(float a, float b) {
        float r27610 = b;
        float r27611 = a;
        float r27612 = hypot(r27610, r27611);
        float r27613 = 3;
        float r27614 = 1;
        float r27615 = r27613 + r27614;
        float r27616 = pow(r27612, r27615);
        float r27617 = 4;
        float r27618 = r27611 * r27611;
        float r27619 = r27614 + r27611;
        float r27620 = r27618 * r27619;
        float r27621 = r27610 * r27610;
        float r27622 = r27613 * r27611;
        float r27623 = r27614 - r27622;
        float r27624 = r27621 * r27623;
        float r27625 = r27620 + r27624;
        float r27626 = r27617 * r27625;
        float r27627 = r27616 + r27626;
        float r27628 = r27627 - r27614;
        return r27628;
}

double f_od(double a, double b) {
        double r27629 = b;
        double r27630 = a;
        double r27631 = hypot(r27629, r27630);
        double r27632 = 3;
        double r27633 = 1;
        double r27634 = r27632 + r27633;
        double r27635 = pow(r27631, r27634);
        double r27636 = 4;
        double r27637 = r27630 * r27630;
        double r27638 = r27633 + r27630;
        double r27639 = r27637 * r27638;
        double r27640 = r27629 * r27629;
        double r27641 = r27632 * r27630;
        double r27642 = r27633 - r27641;
        double r27643 = r27640 * r27642;
        double r27644 = r27639 + r27643;
        double r27645 = r27636 * r27644;
        double r27646 = r27635 + r27645;
        double r27647 = r27646 - r27633;
        return r27647;
}

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 r27648, r27649, r27650, r27651, r27652, r27653, r27654, r27655, r27656, r27657, r27658, r27659, r27660, r27661, r27662, r27663, r27664, r27665, r27666;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r27648);
        mpfr_init(r27649);
        mpfr_init(r27650);
        mpfr_init(r27651);
        mpfr_init(r27652);
        mpfr_init_set_str(r27653, "2", 10, MPFR_RNDN);
        mpfr_init(r27654);
        mpfr_init_set_str(r27655, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27656, "1", 10, MPFR_RNDN);
        mpfr_init(r27657);
        mpfr_init(r27658);
        mpfr_init_set_str(r27659, "3", 10, MPFR_RNDN);
        mpfr_init(r27660);
        mpfr_init(r27661);
        mpfr_init(r27662);
        mpfr_init(r27663);
        mpfr_init(r27664);
        mpfr_init(r27665);
        mpfr_init(r27666);
}

double f_im(double a, double b) {
        mpfr_set_d(r27648, a, MPFR_RNDN);
        mpfr_mul(r27649, r27648, r27648, MPFR_RNDN);
        mpfr_set_d(r27650, b, MPFR_RNDN);
        mpfr_mul(r27651, r27650, r27650, MPFR_RNDN);
        mpfr_add(r27652, r27649, r27651, MPFR_RNDN);
        ;
        mpfr_pow(r27654, r27652, r27653, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27657, r27656, r27648, MPFR_RNDN);
        mpfr_mul(r27658, r27649, r27657, MPFR_RNDN);
        ;
        mpfr_mul(r27660, r27659, r27648, MPFR_RNDN);
        mpfr_sub(r27661, r27656, r27660, MPFR_RNDN);
        mpfr_mul(r27662, r27651, r27661, MPFR_RNDN);
        mpfr_add(r27663, r27658, r27662, MPFR_RNDN);
        mpfr_mul(r27664, r27655, r27663, MPFR_RNDN);
        mpfr_add(r27665, r27654, r27664, MPFR_RNDN);
        mpfr_sub(r27666, r27665, r27656, MPFR_RNDN);
        return mpfr_get_d(r27666, MPFR_RNDN);
}

static mpfr_t r27667, r27668, r27669, r27670, r27671, r27672, r27673, r27674, r27675, r27676, r27677, r27678, r27679, r27680, r27681, r27682, r27683, r27684, r27685;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27667);
        mpfr_init(r27668);
        mpfr_init(r27669);
        mpfr_init_set_str(r27670, "3", 10, MPFR_RNDN);
        mpfr_init_set_str(r27671, "1", 10, MPFR_RNDN);
        mpfr_init(r27672);
        mpfr_init(r27673);
        mpfr_init_set_str(r27674, "4", 10, MPFR_RNDN);
        mpfr_init(r27675);
        mpfr_init(r27676);
        mpfr_init(r27677);
        mpfr_init(r27678);
        mpfr_init(r27679);
        mpfr_init(r27680);
        mpfr_init(r27681);
        mpfr_init(r27682);
        mpfr_init(r27683);
        mpfr_init(r27684);
        mpfr_init(r27685);
}

double f_fm(double a, double b) {
        mpfr_set_d(r27667, b, MPFR_RNDN);
        mpfr_set_d(r27668, a, MPFR_RNDN);
        mpfr_hypot(r27669, r27667, r27668, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27672, r27670, r27671, MPFR_RNDN);
        mpfr_pow(r27673, r27669, r27672, MPFR_RNDN);
        ;
        mpfr_mul(r27675, r27668, r27668, MPFR_RNDN);
        mpfr_add(r27676, r27671, r27668, MPFR_RNDN);
        mpfr_mul(r27677, r27675, r27676, MPFR_RNDN);
        mpfr_mul(r27678, r27667, r27667, MPFR_RNDN);
        mpfr_mul(r27679, r27670, r27668, MPFR_RNDN);
        mpfr_sub(r27680, r27671, r27679, MPFR_RNDN);
        mpfr_mul(r27681, r27678, r27680, MPFR_RNDN);
        mpfr_add(r27682, r27677, r27681, MPFR_RNDN);
        mpfr_mul(r27683, r27674, r27682, MPFR_RNDN);
        mpfr_add(r27684, r27673, r27683, MPFR_RNDN);
        mpfr_sub(r27685, r27684, r27671, MPFR_RNDN);
        return mpfr_get_d(r27685, MPFR_RNDN);
}

static mpfr_t r27686, r27687, r27688, r27689, r27690, r27691, r27692, r27693, r27694, r27695, r27696, r27697, r27698, r27699, r27700, r27701, r27702, r27703, r27704;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27686);
        mpfr_init(r27687);
        mpfr_init(r27688);
        mpfr_init_set_str(r27689, "3", 10, MPFR_RNDN);
        mpfr_init_set_str(r27690, "1", 10, MPFR_RNDN);
        mpfr_init(r27691);
        mpfr_init(r27692);
        mpfr_init_set_str(r27693, "4", 10, MPFR_RNDN);
        mpfr_init(r27694);
        mpfr_init(r27695);
        mpfr_init(r27696);
        mpfr_init(r27697);
        mpfr_init(r27698);
        mpfr_init(r27699);
        mpfr_init(r27700);
        mpfr_init(r27701);
        mpfr_init(r27702);
        mpfr_init(r27703);
        mpfr_init(r27704);
}

double f_dm(double a, double b) {
        mpfr_set_d(r27686, b, MPFR_RNDN);
        mpfr_set_d(r27687, a, MPFR_RNDN);
        mpfr_hypot(r27688, r27686, r27687, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27691, r27689, r27690, MPFR_RNDN);
        mpfr_pow(r27692, r27688, r27691, MPFR_RNDN);
        ;
        mpfr_mul(r27694, r27687, r27687, MPFR_RNDN);
        mpfr_add(r27695, r27690, r27687, MPFR_RNDN);
        mpfr_mul(r27696, r27694, r27695, MPFR_RNDN);
        mpfr_mul(r27697, r27686, r27686, MPFR_RNDN);
        mpfr_mul(r27698, r27689, r27687, MPFR_RNDN);
        mpfr_sub(r27699, r27690, r27698, MPFR_RNDN);
        mpfr_mul(r27700, r27697, r27699, MPFR_RNDN);
        mpfr_add(r27701, r27696, r27700, MPFR_RNDN);
        mpfr_mul(r27702, r27693, r27701, MPFR_RNDN);
        mpfr_add(r27703, r27692, r27702, MPFR_RNDN);
        mpfr_sub(r27704, r27703, r27690, MPFR_RNDN);
        return mpfr_get_d(r27704, MPFR_RNDN);
}

