#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "Bouland and Aaronson, Equation (26)";

double f_if(float a, float b) {
        float r27938 = a;
        float r27939 = r27938 * r27938;
        float r27940 = b;
        float r27941 = r27940 * r27940;
        float r27942 = r27939 + r27941;
        float r27943 = 2;
        float r27944 = pow(r27942, r27943);
        float r27945 = 4;
        float r27946 = r27945 * r27941;
        float r27947 = r27944 + r27946;
        float r27948 = 1;
        float r27949 = r27947 - r27948;
        return r27949;
}

double f_id(double a, double b) {
        double r27950 = a;
        double r27951 = r27950 * r27950;
        double r27952 = b;
        double r27953 = r27952 * r27952;
        double r27954 = r27951 + r27953;
        double r27955 = 2;
        double r27956 = pow(r27954, r27955);
        double r27957 = 4;
        double r27958 = r27957 * r27953;
        double r27959 = r27956 + r27958;
        double r27960 = 1;
        double r27961 = r27959 - r27960;
        return r27961;
}


double f_of(float a, float b) {
        float r27962 = a;
        float r27963 = r27962 * r27962;
        float r27964 = b;
        float r27965 = r27964 * r27964;
        float r27966 = r27963 + r27965;
        float r27967 = 2;
        float r27968 = pow(r27966, r27967);
        float r27969 = 4;
        float r27970 = r27969 * r27965;
        float r27971 = r27968 + r27970;
        float r27972 = sqrt(r27971);
        float r27973 = r27972 * r27972;
        float r27974 = 1;
        float r27975 = r27973 - r27974;
        return r27975;
}

double f_od(double a, double b) {
        double r27976 = a;
        double r27977 = r27976 * r27976;
        double r27978 = b;
        double r27979 = r27978 * r27978;
        double r27980 = r27977 + r27979;
        double r27981 = 2;
        double r27982 = pow(r27980, r27981);
        double r27983 = 4;
        double r27984 = r27983 * r27979;
        double r27985 = r27982 + r27984;
        double r27986 = sqrt(r27985);
        double r27987 = r27986 * r27986;
        double r27988 = 1;
        double r27989 = r27987 - r27988;
        return r27989;
}

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 r27990, r27991, r27992, r27993, r27994, r27995, r27996, r27997, r27998, r27999, r28000, r28001;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r27990);
        mpfr_init(r27991);
        mpfr_init(r27992);
        mpfr_init(r27993);
        mpfr_init(r27994);
        mpfr_init_set_str(r27995, "2", 10, MPFR_RNDN);
        mpfr_init(r27996);
        mpfr_init_set_str(r27997, "4", 10, MPFR_RNDN);
        mpfr_init(r27998);
        mpfr_init(r27999);
        mpfr_init_set_str(r28000, "1", 10, MPFR_RNDN);
        mpfr_init(r28001);
}

double f_im(double a, double b) {
        mpfr_set_d(r27990, a, MPFR_RNDN);
        mpfr_mul(r27991, r27990, r27990, MPFR_RNDN);
        mpfr_set_d(r27992, b, MPFR_RNDN);
        mpfr_mul(r27993, r27992, r27992, MPFR_RNDN);
        mpfr_add(r27994, r27991, r27993, MPFR_RNDN);
        ;
        mpfr_pow(r27996, r27994, r27995, MPFR_RNDN);
        ;
        mpfr_mul(r27998, r27997, r27993, MPFR_RNDN);
        mpfr_add(r27999, r27996, r27998, MPFR_RNDN);
        ;
        mpfr_sub(r28001, r27999, r28000, MPFR_RNDN);
        return mpfr_get_d(r28001, MPFR_RNDN);
}

static mpfr_t r28002, r28003, r28004, r28005, r28006, r28007, r28008, r28009, r28010, r28011, r28012, r28013, r28014, r28015;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r28002);
        mpfr_init(r28003);
        mpfr_init(r28004);
        mpfr_init(r28005);
        mpfr_init(r28006);
        mpfr_init_set_str(r28007, "2", 10, MPFR_RNDN);
        mpfr_init(r28008);
        mpfr_init_set_str(r28009, "4", 10, MPFR_RNDN);
        mpfr_init(r28010);
        mpfr_init(r28011);
        mpfr_init(r28012);
        mpfr_init(r28013);
        mpfr_init_set_str(r28014, "1", 10, MPFR_RNDN);
        mpfr_init(r28015);
}

double f_fm(double a, double b) {
        mpfr_set_d(r28002, a, MPFR_RNDN);
        mpfr_mul(r28003, r28002, r28002, MPFR_RNDN);
        mpfr_set_d(r28004, b, MPFR_RNDN);
        mpfr_mul(r28005, r28004, r28004, MPFR_RNDN);
        mpfr_add(r28006, r28003, r28005, MPFR_RNDN);
        ;
        mpfr_pow(r28008, r28006, r28007, MPFR_RNDN);
        ;
        mpfr_mul(r28010, r28009, r28005, MPFR_RNDN);
        mpfr_add(r28011, r28008, r28010, MPFR_RNDN);
        mpfr_sqrt(r28012, r28011, MPFR_RNDN);
        mpfr_mul(r28013, r28012, r28012, MPFR_RNDN);
        ;
        mpfr_sub(r28015, r28013, r28014, MPFR_RNDN);
        return mpfr_get_d(r28015, MPFR_RNDN);
}

static mpfr_t r28016, r28017, r28018, r28019, r28020, r28021, r28022, r28023, r28024, r28025, r28026, r28027, r28028, r28029;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r28016);
        mpfr_init(r28017);
        mpfr_init(r28018);
        mpfr_init(r28019);
        mpfr_init(r28020);
        mpfr_init_set_str(r28021, "2", 10, MPFR_RNDN);
        mpfr_init(r28022);
        mpfr_init_set_str(r28023, "4", 10, MPFR_RNDN);
        mpfr_init(r28024);
        mpfr_init(r28025);
        mpfr_init(r28026);
        mpfr_init(r28027);
        mpfr_init_set_str(r28028, "1", 10, MPFR_RNDN);
        mpfr_init(r28029);
}

double f_dm(double a, double b) {
        mpfr_set_d(r28016, a, MPFR_RNDN);
        mpfr_mul(r28017, r28016, r28016, MPFR_RNDN);
        mpfr_set_d(r28018, b, MPFR_RNDN);
        mpfr_mul(r28019, r28018, r28018, MPFR_RNDN);
        mpfr_add(r28020, r28017, r28019, MPFR_RNDN);
        ;
        mpfr_pow(r28022, r28020, r28021, MPFR_RNDN);
        ;
        mpfr_mul(r28024, r28023, r28019, MPFR_RNDN);
        mpfr_add(r28025, r28022, r28024, MPFR_RNDN);
        mpfr_sqrt(r28026, r28025, MPFR_RNDN);
        mpfr_mul(r28027, r28026, r28026, MPFR_RNDN);
        ;
        mpfr_sub(r28029, r28027, r28028, MPFR_RNDN);
        return mpfr_get_d(r28029, MPFR_RNDN);
}

