#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 r36544 = a;
        float r36545 = r36544 * r36544;
        float r36546 = b;
        float r36547 = r36546 * r36546;
        float r36548 = r36545 + r36547;
        float r36549 = 2;
        float r36550 = pow(r36548, r36549);
        float r36551 = 4;
        float r36552 = 1;
        float r36553 = r36552 + r36544;
        float r36554 = r36545 * r36553;
        float r36555 = 3;
        float r36556 = r36555 * r36544;
        float r36557 = r36552 - r36556;
        float r36558 = r36547 * r36557;
        float r36559 = r36554 + r36558;
        float r36560 = r36551 * r36559;
        float r36561 = r36550 + r36560;
        float r36562 = r36561 - r36552;
        return r36562;
}

double f_id(double a, double b) {
        double r36563 = a;
        double r36564 = r36563 * r36563;
        double r36565 = b;
        double r36566 = r36565 * r36565;
        double r36567 = r36564 + r36566;
        double r36568 = 2;
        double r36569 = pow(r36567, r36568);
        double r36570 = 4;
        double r36571 = 1;
        double r36572 = r36571 + r36563;
        double r36573 = r36564 * r36572;
        double r36574 = 3;
        double r36575 = r36574 * r36563;
        double r36576 = r36571 - r36575;
        double r36577 = r36566 * r36576;
        double r36578 = r36573 + r36577;
        double r36579 = r36570 * r36578;
        double r36580 = r36569 + r36579;
        double r36581 = r36580 - r36571;
        return r36581;
}


double f_of(float a, float b) {
        float r36582 = a;
        float r36583 = r36582 * r36582;
        float r36584 = b;
        float r36585 = r36584 * r36584;
        float r36586 = r36583 + r36585;
        float r36587 = 2;
        float r36588 = pow(r36586, r36587);
        float r36589 = 4;
        float r36590 = 1;
        float r36591 = r36590 + r36582;
        float r36592 = r36583 * r36591;
        float r36593 = 3;
        float r36594 = r36593 * r36582;
        float r36595 = r36590 - r36594;
        float r36596 = r36585 * r36595;
        float r36597 = r36592 + r36596;
        float r36598 = r36589 * r36597;
        float r36599 = r36588 + r36598;
        float r36600 = r36599 - r36590;
        return r36600;
}

double f_od(double a, double b) {
        double r36601 = a;
        double r36602 = r36601 * r36601;
        double r36603 = b;
        double r36604 = r36603 * r36603;
        double r36605 = r36602 + r36604;
        double r36606 = 2;
        double r36607 = pow(r36605, r36606);
        double r36608 = 4;
        double r36609 = 1;
        double r36610 = r36609 + r36601;
        double r36611 = r36602 * r36610;
        double r36612 = 3;
        double r36613 = r36612 * r36601;
        double r36614 = r36609 - r36613;
        double r36615 = r36604 * r36614;
        double r36616 = r36611 + r36615;
        double r36617 = r36608 * r36616;
        double r36618 = r36607 + r36617;
        double r36619 = r36618 - r36609;
        return r36619;
}

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 r36620, r36621, r36622, r36623, r36624, r36625, r36626, r36627, r36628, r36629, r36630, r36631, r36632, r36633, r36634, r36635, r36636, r36637, r36638;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36620);
        mpfr_init(r36621);
        mpfr_init(r36622);
        mpfr_init(r36623);
        mpfr_init(r36624);
        mpfr_init_set_str(r36625, "2", 10, MPFR_RNDN);
        mpfr_init(r36626);
        mpfr_init_set_str(r36627, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36628, "1", 10, MPFR_RNDN);
        mpfr_init(r36629);
        mpfr_init(r36630);
        mpfr_init_set_str(r36631, "3", 10, MPFR_RNDN);
        mpfr_init(r36632);
        mpfr_init(r36633);
        mpfr_init(r36634);
        mpfr_init(r36635);
        mpfr_init(r36636);
        mpfr_init(r36637);
        mpfr_init(r36638);
}

double f_im(double a, double b) {
        mpfr_set_d(r36620, a, MPFR_RNDN);
        mpfr_mul(r36621, r36620, r36620, MPFR_RNDN);
        mpfr_set_d(r36622, b, MPFR_RNDN);
        mpfr_mul(r36623, r36622, r36622, MPFR_RNDN);
        mpfr_add(r36624, r36621, r36623, MPFR_RNDN);
        ;
        mpfr_pow(r36626, r36624, r36625, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36629, r36628, r36620, MPFR_RNDN);
        mpfr_mul(r36630, r36621, r36629, MPFR_RNDN);
        ;
        mpfr_mul(r36632, r36631, r36620, MPFR_RNDN);
        mpfr_sub(r36633, r36628, r36632, MPFR_RNDN);
        mpfr_mul(r36634, r36623, r36633, MPFR_RNDN);
        mpfr_add(r36635, r36630, r36634, MPFR_RNDN);
        mpfr_mul(r36636, r36627, r36635, MPFR_RNDN);
        mpfr_add(r36637, r36626, r36636, MPFR_RNDN);
        mpfr_sub(r36638, r36637, r36628, MPFR_RNDN);
        return mpfr_get_d(r36638, MPFR_RNDN);
}

static mpfr_t r36639, r36640, r36641, r36642, r36643, r36644, r36645, r36646, r36647, r36648, r36649, r36650, r36651, r36652, r36653, r36654, r36655, r36656, r36657;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36639);
        mpfr_init(r36640);
        mpfr_init(r36641);
        mpfr_init(r36642);
        mpfr_init(r36643);
        mpfr_init_set_str(r36644, "2", 10, MPFR_RNDN);
        mpfr_init(r36645);
        mpfr_init_set_str(r36646, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36647, "1", 10, MPFR_RNDN);
        mpfr_init(r36648);
        mpfr_init(r36649);
        mpfr_init_set_str(r36650, "3", 10, MPFR_RNDN);
        mpfr_init(r36651);
        mpfr_init(r36652);
        mpfr_init(r36653);
        mpfr_init(r36654);
        mpfr_init(r36655);
        mpfr_init(r36656);
        mpfr_init(r36657);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36639, a, MPFR_RNDN);
        mpfr_mul(r36640, r36639, r36639, MPFR_RNDN);
        mpfr_set_d(r36641, b, MPFR_RNDN);
        mpfr_mul(r36642, r36641, r36641, MPFR_RNDN);
        mpfr_add(r36643, r36640, r36642, MPFR_RNDN);
        ;
        mpfr_pow(r36645, r36643, r36644, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36648, r36647, r36639, MPFR_RNDN);
        mpfr_mul(r36649, r36640, r36648, MPFR_RNDN);
        ;
        mpfr_mul(r36651, r36650, r36639, MPFR_RNDN);
        mpfr_sub(r36652, r36647, r36651, MPFR_RNDN);
        mpfr_mul(r36653, r36642, r36652, MPFR_RNDN);
        mpfr_add(r36654, r36649, r36653, MPFR_RNDN);
        mpfr_mul(r36655, r36646, r36654, MPFR_RNDN);
        mpfr_add(r36656, r36645, r36655, MPFR_RNDN);
        mpfr_sub(r36657, r36656, r36647, MPFR_RNDN);
        return mpfr_get_d(r36657, MPFR_RNDN);
}

static mpfr_t r36658, r36659, r36660, r36661, r36662, r36663, r36664, r36665, r36666, r36667, r36668, r36669, r36670, r36671, r36672, r36673, r36674, r36675, r36676;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36658);
        mpfr_init(r36659);
        mpfr_init(r36660);
        mpfr_init(r36661);
        mpfr_init(r36662);
        mpfr_init_set_str(r36663, "2", 10, MPFR_RNDN);
        mpfr_init(r36664);
        mpfr_init_set_str(r36665, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36666, "1", 10, MPFR_RNDN);
        mpfr_init(r36667);
        mpfr_init(r36668);
        mpfr_init_set_str(r36669, "3", 10, MPFR_RNDN);
        mpfr_init(r36670);
        mpfr_init(r36671);
        mpfr_init(r36672);
        mpfr_init(r36673);
        mpfr_init(r36674);
        mpfr_init(r36675);
        mpfr_init(r36676);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36658, a, MPFR_RNDN);
        mpfr_mul(r36659, r36658, r36658, MPFR_RNDN);
        mpfr_set_d(r36660, b, MPFR_RNDN);
        mpfr_mul(r36661, r36660, r36660, MPFR_RNDN);
        mpfr_add(r36662, r36659, r36661, MPFR_RNDN);
        ;
        mpfr_pow(r36664, r36662, r36663, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36667, r36666, r36658, MPFR_RNDN);
        mpfr_mul(r36668, r36659, r36667, MPFR_RNDN);
        ;
        mpfr_mul(r36670, r36669, r36658, MPFR_RNDN);
        mpfr_sub(r36671, r36666, r36670, MPFR_RNDN);
        mpfr_mul(r36672, r36661, r36671, MPFR_RNDN);
        mpfr_add(r36673, r36668, r36672, MPFR_RNDN);
        mpfr_mul(r36674, r36665, r36673, MPFR_RNDN);
        mpfr_add(r36675, r36664, r36674, MPFR_RNDN);
        mpfr_sub(r36676, r36675, r36666, MPFR_RNDN);
        return mpfr_get_d(r36676, MPFR_RNDN);
}

