#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 r27885 = a;
        float r27886 = r27885 * r27885;
        float r27887 = b;
        float r27888 = r27887 * r27887;
        float r27889 = r27886 + r27888;
        float r27890 = 2;
        float r27891 = pow(r27889, r27890);
        float r27892 = 4;
        float r27893 = 1;
        float r27894 = r27893 - r27885;
        float r27895 = r27886 * r27894;
        float r27896 = 3;
        float r27897 = r27896 + r27885;
        float r27898 = r27888 * r27897;
        float r27899 = r27895 + r27898;
        float r27900 = r27892 * r27899;
        float r27901 = r27891 + r27900;
        float r27902 = r27901 - r27893;
        return r27902;
}

double f_id(double a, double b) {
        double r27903 = a;
        double r27904 = r27903 * r27903;
        double r27905 = b;
        double r27906 = r27905 * r27905;
        double r27907 = r27904 + r27906;
        double r27908 = 2;
        double r27909 = pow(r27907, r27908);
        double r27910 = 4;
        double r27911 = 1;
        double r27912 = r27911 - r27903;
        double r27913 = r27904 * r27912;
        double r27914 = 3;
        double r27915 = r27914 + r27903;
        double r27916 = r27906 * r27915;
        double r27917 = r27913 + r27916;
        double r27918 = r27910 * r27917;
        double r27919 = r27909 + r27918;
        double r27920 = r27919 - r27911;
        return r27920;
}


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

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

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 r27961, r27962, r27963, r27964, r27965, r27966, r27967, r27968, r27969, r27970, r27971, r27972, r27973, r27974, r27975, r27976, r27977, r27978;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r27961);
        mpfr_init(r27962);
        mpfr_init(r27963);
        mpfr_init(r27964);
        mpfr_init(r27965);
        mpfr_init_set_str(r27966, "2", 10, MPFR_RNDN);
        mpfr_init(r27967);
        mpfr_init_set_str(r27968, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27969, "1", 10, MPFR_RNDN);
        mpfr_init(r27970);
        mpfr_init(r27971);
        mpfr_init_set_str(r27972, "3", 10, MPFR_RNDN);
        mpfr_init(r27973);
        mpfr_init(r27974);
        mpfr_init(r27975);
        mpfr_init(r27976);
        mpfr_init(r27977);
        mpfr_init(r27978);
}

double f_im(double a, double b) {
        mpfr_set_d(r27961, a, MPFR_RNDN);
        mpfr_mul(r27962, r27961, r27961, MPFR_RNDN);
        mpfr_set_d(r27963, b, MPFR_RNDN);
        mpfr_mul(r27964, r27963, r27963, MPFR_RNDN);
        mpfr_add(r27965, r27962, r27964, MPFR_RNDN);
        ;
        mpfr_pow(r27967, r27965, r27966, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r27970, r27969, r27961, MPFR_RNDN);
        mpfr_mul(r27971, r27962, r27970, MPFR_RNDN);
        ;
        mpfr_add(r27973, r27972, r27961, MPFR_RNDN);
        mpfr_mul(r27974, r27964, r27973, MPFR_RNDN);
        mpfr_add(r27975, r27971, r27974, MPFR_RNDN);
        mpfr_mul(r27976, r27968, r27975, MPFR_RNDN);
        mpfr_add(r27977, r27967, r27976, MPFR_RNDN);
        mpfr_sub(r27978, r27977, r27969, MPFR_RNDN);
        return mpfr_get_d(r27978, MPFR_RNDN);
}

static mpfr_t r27979, r27980, r27981, r27982, r27983, r27984, r27985, r27986, r27987, r27988, r27989, r27990, r27991, r27992, r27993, r27994, r27995, r27996, r27997, r27998;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init_set_str(r27979, "4", 10, MPFR_RNDN);
        mpfr_init(r27980);
        mpfr_init_set_str(r27981, "1", 10, MPFR_RNDN);
        mpfr_init(r27982);
        mpfr_init(r27983);
        mpfr_init_set_str(r27984, "3", 10, MPFR_RNDN);
        mpfr_init(r27985);
        mpfr_init(r27986);
        mpfr_init(r27987);
        mpfr_init(r27988);
        mpfr_init(r27989);
        mpfr_init(r27990);
        mpfr_init(r27991);
        mpfr_init_set_str(r27992, "2", 10, MPFR_RNDN);
        mpfr_init(r27993);
        mpfr_init(r27994);
        mpfr_init(r27995);
        mpfr_init(r27996);
        mpfr_init(r27997);
        mpfr_init(r27998);
}

double f_fm(double a, double b) {
        ;
        mpfr_set_d(r27980, a, MPFR_RNDN);
        ;
        mpfr_sub(r27982, r27981, r27980, MPFR_RNDN);
        mpfr_mul(r27983, r27980, r27982, MPFR_RNDN);
        ;
        mpfr_add(r27985, r27980, r27984, MPFR_RNDN);
        mpfr_set_d(r27986, b, MPFR_RNDN);
        mpfr_mul(r27987, r27986, r27986, MPFR_RNDN);
        mpfr_mul(r27988, r27985, r27987, MPFR_RNDN);
        mpfr_fma(r27989, r27980, r27983, r27988, MPFR_RNDN);
        mpfr_mul(r27990, r27980, r27986, MPFR_RNDN);
        mpfr_mul(r27991, r27990, r27990, MPFR_RNDN);
        ;
        mpfr_pow(r27993, r27986, r27979, MPFR_RNDN);
        mpfr_pow(r27994, r27980, r27979, MPFR_RNDN);
        mpfr_add(r27995, r27993, r27994, MPFR_RNDN);
        mpfr_fma(r27996, r27991, r27992, r27995, MPFR_RNDN);
        mpfr_fma(r27997, r27979, r27989, r27996, MPFR_RNDN);
        mpfr_sub(r27998, r27997, r27981, MPFR_RNDN);
        return mpfr_get_d(r27998, MPFR_RNDN);
}

static mpfr_t r27999, r28000, r28001, r28002, r28003, r28004, r28005, r28006, r28007, r28008, r28009, r28010, r28011, r28012, r28013, r28014, r28015, r28016, r28017, r28018;

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

double f_dm(double a, double b) {
        ;
        mpfr_set_d(r28000, a, MPFR_RNDN);
        ;
        mpfr_sub(r28002, r28001, r28000, MPFR_RNDN);
        mpfr_mul(r28003, r28000, r28002, MPFR_RNDN);
        ;
        mpfr_add(r28005, r28000, r28004, MPFR_RNDN);
        mpfr_set_d(r28006, b, MPFR_RNDN);
        mpfr_mul(r28007, r28006, r28006, MPFR_RNDN);
        mpfr_mul(r28008, r28005, r28007, MPFR_RNDN);
        mpfr_fma(r28009, r28000, r28003, r28008, MPFR_RNDN);
        mpfr_mul(r28010, r28000, r28006, MPFR_RNDN);
        mpfr_mul(r28011, r28010, r28010, MPFR_RNDN);
        ;
        mpfr_pow(r28013, r28006, r27999, MPFR_RNDN);
        mpfr_pow(r28014, r28000, r27999, MPFR_RNDN);
        mpfr_add(r28015, r28013, r28014, MPFR_RNDN);
        mpfr_fma(r28016, r28011, r28012, r28015, MPFR_RNDN);
        mpfr_fma(r28017, r27999, r28009, r28016, MPFR_RNDN);
        mpfr_sub(r28018, r28017, r28001, MPFR_RNDN);
        return mpfr_get_d(r28018, MPFR_RNDN);
}

