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

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

double f_if(float a, float b) {
        float r27925 = a;
        float r27926 = r27925 * r27925;
        float r27927 = b;
        float r27928 = r27927 * r27927;
        float r27929 = r27926 + r27928;
        float r27930 = 2;
        float r27931 = pow(r27929, r27930);
        float r27932 = 4;
        float r27933 = 1;
        float r27934 = r27933 - r27925;
        float r27935 = r27926 * r27934;
        float r27936 = 3;
        float r27937 = r27936 + r27925;
        float r27938 = r27928 * r27937;
        float r27939 = r27935 + r27938;
        float r27940 = r27932 * r27939;
        float r27941 = r27931 + r27940;
        float r27942 = r27941 - r27933;
        return r27942;
}

double f_id(double a, double b) {
        double r27943 = a;
        double r27944 = r27943 * r27943;
        double r27945 = b;
        double r27946 = r27945 * r27945;
        double r27947 = r27944 + r27946;
        double r27948 = 2;
        double r27949 = pow(r27947, r27948);
        double r27950 = 4;
        double r27951 = 1;
        double r27952 = r27951 - r27943;
        double r27953 = r27944 * r27952;
        double r27954 = 3;
        double r27955 = r27954 + r27943;
        double r27956 = r27946 * r27955;
        double r27957 = r27953 + r27956;
        double r27958 = r27950 * r27957;
        double r27959 = r27949 + r27958;
        double r27960 = r27959 - r27951;
        return r27960;
}


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

double f_od(double a, double b) {
        double r27979 = a;
        double r27980 = r27979 * r27979;
        double r27981 = b;
        double r27982 = r27981 * r27981;
        double r27983 = r27980 + r27982;
        double r27984 = 2;
        double r27985 = pow(r27983, r27984);
        double r27986 = 4;
        double r27987 = 1;
        double r27988 = r27987 - r27979;
        double r27989 = r27980 * r27988;
        double r27990 = 3;
        double r27991 = r27990 + r27979;
        double r27992 = r27982 * r27991;
        double r27993 = r27989 + r27992;
        double r27994 = r27986 * r27993;
        double r27995 = r27985 + r27994;
        double r27996 = r27995 - r27987;
        return r27996;
}

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 r27997, r27998, r27999, r28000, r28001, r28002, r28003, r28004, r28005, r28006, r28007, r28008, r28009, r28010, r28011, r28012, r28013, r28014;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r27997);
        mpfr_init(r27998);
        mpfr_init(r27999);
        mpfr_init(r28000);
        mpfr_init(r28001);
        mpfr_init_set_str(r28002, "2", 10, MPFR_RNDN);
        mpfr_init(r28003);
        mpfr_init_set_str(r28004, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28005, "1", 10, MPFR_RNDN);
        mpfr_init(r28006);
        mpfr_init(r28007);
        mpfr_init_set_str(r28008, "3", 10, MPFR_RNDN);
        mpfr_init(r28009);
        mpfr_init(r28010);
        mpfr_init(r28011);
        mpfr_init(r28012);
        mpfr_init(r28013);
        mpfr_init(r28014);
}

double f_im(double a, double b) {
        mpfr_set_d(r27997, a, MPFR_RNDN);
        mpfr_mul(r27998, r27997, r27997, MPFR_RNDN);
        mpfr_set_d(r27999, b, MPFR_RNDN);
        mpfr_mul(r28000, r27999, r27999, MPFR_RNDN);
        mpfr_add(r28001, r27998, r28000, MPFR_RNDN);
        ;
        mpfr_pow(r28003, r28001, r28002, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r28006, r28005, r27997, MPFR_RNDN);
        mpfr_mul(r28007, r27998, r28006, MPFR_RNDN);
        ;
        mpfr_add(r28009, r28008, r27997, MPFR_RNDN);
        mpfr_mul(r28010, r28000, r28009, MPFR_RNDN);
        mpfr_add(r28011, r28007, r28010, MPFR_RNDN);
        mpfr_mul(r28012, r28004, r28011, MPFR_RNDN);
        mpfr_add(r28013, r28003, r28012, MPFR_RNDN);
        mpfr_sub(r28014, r28013, r28005, MPFR_RNDN);
        return mpfr_get_d(r28014, MPFR_RNDN);
}

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

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r28015);
        mpfr_init(r28016);
        mpfr_init(r28017);
        mpfr_init(r28018);
        mpfr_init(r28019);
        mpfr_init_set_str(r28020, "2", 10, MPFR_RNDN);
        mpfr_init(r28021);
        mpfr_init_set_str(r28022, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28023, "1", 10, MPFR_RNDN);
        mpfr_init(r28024);
        mpfr_init(r28025);
        mpfr_init_set_str(r28026, "3", 10, MPFR_RNDN);
        mpfr_init(r28027);
        mpfr_init(r28028);
        mpfr_init(r28029);
        mpfr_init(r28030);
        mpfr_init(r28031);
        mpfr_init(r28032);
}

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

static mpfr_t r28033, r28034, r28035, r28036, r28037, r28038, r28039, r28040, r28041, r28042, r28043, r28044, r28045, r28046, r28047, r28048, r28049, r28050;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r28033);
        mpfr_init(r28034);
        mpfr_init(r28035);
        mpfr_init(r28036);
        mpfr_init(r28037);
        mpfr_init_set_str(r28038, "2", 10, MPFR_RNDN);
        mpfr_init(r28039);
        mpfr_init_set_str(r28040, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28041, "1", 10, MPFR_RNDN);
        mpfr_init(r28042);
        mpfr_init(r28043);
        mpfr_init_set_str(r28044, "3", 10, MPFR_RNDN);
        mpfr_init(r28045);
        mpfr_init(r28046);
        mpfr_init(r28047);
        mpfr_init(r28048);
        mpfr_init(r28049);
        mpfr_init(r28050);
}

double f_dm(double a, double b) {
        mpfr_set_d(r28033, a, MPFR_RNDN);
        mpfr_mul(r28034, r28033, r28033, MPFR_RNDN);
        mpfr_set_d(r28035, b, MPFR_RNDN);
        mpfr_mul(r28036, r28035, r28035, MPFR_RNDN);
        mpfr_add(r28037, r28034, r28036, MPFR_RNDN);
        ;
        mpfr_pow(r28039, r28037, r28038, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r28042, r28041, r28033, MPFR_RNDN);
        mpfr_mul(r28043, r28034, r28042, MPFR_RNDN);
        ;
        mpfr_add(r28045, r28044, r28033, MPFR_RNDN);
        mpfr_mul(r28046, r28036, r28045, MPFR_RNDN);
        mpfr_add(r28047, r28043, r28046, MPFR_RNDN);
        mpfr_mul(r28048, r28040, r28047, MPFR_RNDN);
        mpfr_add(r28049, r28039, r28048, MPFR_RNDN);
        mpfr_sub(r28050, r28049, r28041, MPFR_RNDN);
        return mpfr_get_d(r28050, MPFR_RNDN);
}

