#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 r27607 = a;
        float r27608 = r27607 * r27607;
        float r27609 = b;
        float r27610 = r27609 * r27609;
        float r27611 = r27608 + r27610;
        float r27612 = 2;
        float r27613 = pow(r27611, r27612);
        float r27614 = 4;
        float r27615 = 1;
        float r27616 = r27615 + r27607;
        float r27617 = r27608 * r27616;
        float r27618 = 3;
        float r27619 = r27618 * r27607;
        float r27620 = r27615 - r27619;
        float r27621 = r27610 * r27620;
        float r27622 = r27617 + r27621;
        float r27623 = r27614 * r27622;
        float r27624 = r27613 + r27623;
        float r27625 = r27624 - r27615;
        return r27625;
}

double f_id(double a, double b) {
        double r27626 = a;
        double r27627 = r27626 * r27626;
        double r27628 = b;
        double r27629 = r27628 * r27628;
        double r27630 = r27627 + r27629;
        double r27631 = 2;
        double r27632 = pow(r27630, r27631);
        double r27633 = 4;
        double r27634 = 1;
        double r27635 = r27634 + r27626;
        double r27636 = r27627 * r27635;
        double r27637 = 3;
        double r27638 = r27637 * r27626;
        double r27639 = r27634 - r27638;
        double r27640 = r27629 * r27639;
        double r27641 = r27636 + r27640;
        double r27642 = r27633 * r27641;
        double r27643 = r27632 + r27642;
        double r27644 = r27643 - r27634;
        return r27644;
}


double f_of(float a, float b) {
        float r27645 = a;
        float r27646 = r27645 * r27645;
        float r27647 = b;
        float r27648 = r27647 * r27647;
        float r27649 = r27646 + r27648;
        float r27650 = 2;
        float r27651 = pow(r27649, r27650);
        float r27652 = 4;
        float r27653 = 1;
        float r27654 = r27653 + r27645;
        float r27655 = r27646 * r27654;
        float r27656 = 3;
        float r27657 = r27656 * r27645;
        float r27658 = r27653 - r27657;
        float r27659 = r27648 * r27658;
        float r27660 = r27655 + r27659;
        float r27661 = r27652 * r27660;
        float r27662 = r27651 + r27661;
        float r27663 = r27662 - r27653;
        return r27663;
}

double f_od(double a, double b) {
        double r27664 = a;
        double r27665 = r27664 * r27664;
        double r27666 = b;
        double r27667 = r27666 * r27666;
        double r27668 = r27665 + r27667;
        double r27669 = 2;
        double r27670 = pow(r27668, r27669);
        double r27671 = 4;
        double r27672 = 1;
        double r27673 = r27672 + r27664;
        double r27674 = r27665 * r27673;
        double r27675 = 3;
        double r27676 = r27675 * r27664;
        double r27677 = r27672 - r27676;
        double r27678 = r27667 * r27677;
        double r27679 = r27674 + r27678;
        double r27680 = r27671 * r27679;
        double r27681 = r27670 + r27680;
        double r27682 = r27681 - r27672;
        return r27682;
}

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 r27683, r27684, r27685, r27686, r27687, r27688, r27689, r27690, r27691, r27692, r27693, r27694, r27695, r27696, r27697, r27698, r27699, r27700, r27701;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r27683);
        mpfr_init(r27684);
        mpfr_init(r27685);
        mpfr_init(r27686);
        mpfr_init(r27687);
        mpfr_init_set_str(r27688, "2", 10, MPFR_RNDN);
        mpfr_init(r27689);
        mpfr_init_set_str(r27690, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27691, "1", 10, MPFR_RNDN);
        mpfr_init(r27692);
        mpfr_init(r27693);
        mpfr_init_set_str(r27694, "3", 10, MPFR_RNDN);
        mpfr_init(r27695);
        mpfr_init(r27696);
        mpfr_init(r27697);
        mpfr_init(r27698);
        mpfr_init(r27699);
        mpfr_init(r27700);
        mpfr_init(r27701);
}

double f_im(double a, double b) {
        mpfr_set_d(r27683, a, MPFR_RNDN);
        mpfr_mul(r27684, r27683, r27683, MPFR_RNDN);
        mpfr_set_d(r27685, b, MPFR_RNDN);
        mpfr_mul(r27686, r27685, r27685, MPFR_RNDN);
        mpfr_add(r27687, r27684, r27686, MPFR_RNDN);
        ;
        mpfr_pow(r27689, r27687, r27688, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27692, r27691, r27683, MPFR_RNDN);
        mpfr_mul(r27693, r27684, r27692, MPFR_RNDN);
        ;
        mpfr_mul(r27695, r27694, r27683, MPFR_RNDN);
        mpfr_sub(r27696, r27691, r27695, MPFR_RNDN);
        mpfr_mul(r27697, r27686, r27696, MPFR_RNDN);
        mpfr_add(r27698, r27693, r27697, MPFR_RNDN);
        mpfr_mul(r27699, r27690, r27698, MPFR_RNDN);
        mpfr_add(r27700, r27689, r27699, MPFR_RNDN);
        mpfr_sub(r27701, r27700, r27691, MPFR_RNDN);
        return mpfr_get_d(r27701, MPFR_RNDN);
}

static mpfr_t r27702, r27703, r27704, r27705, r27706, r27707, r27708, r27709, r27710, r27711, r27712, r27713, r27714, r27715, r27716, r27717, r27718, r27719, r27720;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r27702);
        mpfr_init(r27703);
        mpfr_init(r27704);
        mpfr_init(r27705);
        mpfr_init(r27706);
        mpfr_init_set_str(r27707, "2", 10, MPFR_RNDN);
        mpfr_init(r27708);
        mpfr_init_set_str(r27709, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27710, "1", 10, MPFR_RNDN);
        mpfr_init(r27711);
        mpfr_init(r27712);
        mpfr_init_set_str(r27713, "3", 10, MPFR_RNDN);
        mpfr_init(r27714);
        mpfr_init(r27715);
        mpfr_init(r27716);
        mpfr_init(r27717);
        mpfr_init(r27718);
        mpfr_init(r27719);
        mpfr_init(r27720);
}

double f_fm(double a, double b) {
        mpfr_set_d(r27702, a, MPFR_RNDN);
        mpfr_mul(r27703, r27702, r27702, MPFR_RNDN);
        mpfr_set_d(r27704, b, MPFR_RNDN);
        mpfr_mul(r27705, r27704, r27704, MPFR_RNDN);
        mpfr_add(r27706, r27703, r27705, MPFR_RNDN);
        ;
        mpfr_pow(r27708, r27706, r27707, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27711, r27710, r27702, MPFR_RNDN);
        mpfr_mul(r27712, r27703, r27711, MPFR_RNDN);
        ;
        mpfr_mul(r27714, r27713, r27702, MPFR_RNDN);
        mpfr_sub(r27715, r27710, r27714, MPFR_RNDN);
        mpfr_mul(r27716, r27705, r27715, MPFR_RNDN);
        mpfr_add(r27717, r27712, r27716, MPFR_RNDN);
        mpfr_mul(r27718, r27709, r27717, MPFR_RNDN);
        mpfr_add(r27719, r27708, r27718, MPFR_RNDN);
        mpfr_sub(r27720, r27719, r27710, MPFR_RNDN);
        return mpfr_get_d(r27720, MPFR_RNDN);
}

static mpfr_t r27721, r27722, r27723, r27724, r27725, r27726, r27727, r27728, r27729, r27730, r27731, r27732, r27733, r27734, r27735, r27736, r27737, r27738, r27739;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r27721);
        mpfr_init(r27722);
        mpfr_init(r27723);
        mpfr_init(r27724);
        mpfr_init(r27725);
        mpfr_init_set_str(r27726, "2", 10, MPFR_RNDN);
        mpfr_init(r27727);
        mpfr_init_set_str(r27728, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27729, "1", 10, MPFR_RNDN);
        mpfr_init(r27730);
        mpfr_init(r27731);
        mpfr_init_set_str(r27732, "3", 10, MPFR_RNDN);
        mpfr_init(r27733);
        mpfr_init(r27734);
        mpfr_init(r27735);
        mpfr_init(r27736);
        mpfr_init(r27737);
        mpfr_init(r27738);
        mpfr_init(r27739);
}

double f_dm(double a, double b) {
        mpfr_set_d(r27721, a, MPFR_RNDN);
        mpfr_mul(r27722, r27721, r27721, MPFR_RNDN);
        mpfr_set_d(r27723, b, MPFR_RNDN);
        mpfr_mul(r27724, r27723, r27723, MPFR_RNDN);
        mpfr_add(r27725, r27722, r27724, MPFR_RNDN);
        ;
        mpfr_pow(r27727, r27725, r27726, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27730, r27729, r27721, MPFR_RNDN);
        mpfr_mul(r27731, r27722, r27730, MPFR_RNDN);
        ;
        mpfr_mul(r27733, r27732, r27721, MPFR_RNDN);
        mpfr_sub(r27734, r27729, r27733, MPFR_RNDN);
        mpfr_mul(r27735, r27724, r27734, MPFR_RNDN);
        mpfr_add(r27736, r27731, r27735, MPFR_RNDN);
        mpfr_mul(r27737, r27728, r27736, MPFR_RNDN);
        mpfr_add(r27738, r27727, r27737, MPFR_RNDN);
        mpfr_sub(r27739, r27738, r27729, MPFR_RNDN);
        return mpfr_get_d(r27739, MPFR_RNDN);
}

