#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 r27841 = a;
        float r27842 = r27841 * r27841;
        float r27843 = b;
        float r27844 = r27843 * r27843;
        float r27845 = r27842 + r27844;
        float r27846 = 2;
        float r27847 = pow(r27845, r27846);
        float r27848 = 4;
        float r27849 = 1;
        float r27850 = r27849 - r27841;
        float r27851 = r27842 * r27850;
        float r27852 = 3;
        float r27853 = r27852 + r27841;
        float r27854 = r27844 * r27853;
        float r27855 = r27851 + r27854;
        float r27856 = r27848 * r27855;
        float r27857 = r27847 + r27856;
        float r27858 = r27857 - r27849;
        return r27858;
}

double f_id(double a, double b) {
        double r27859 = a;
        double r27860 = r27859 * r27859;
        double r27861 = b;
        double r27862 = r27861 * r27861;
        double r27863 = r27860 + r27862;
        double r27864 = 2;
        double r27865 = pow(r27863, r27864);
        double r27866 = 4;
        double r27867 = 1;
        double r27868 = r27867 - r27859;
        double r27869 = r27860 * r27868;
        double r27870 = 3;
        double r27871 = r27870 + r27859;
        double r27872 = r27862 * r27871;
        double r27873 = r27869 + r27872;
        double r27874 = r27866 * r27873;
        double r27875 = r27865 + r27874;
        double r27876 = r27875 - r27867;
        return r27876;
}


double f_of(float a, float b) {
        float r27877 = a;
        float r27878 = r27877 * r27877;
        float r27879 = b;
        float r27880 = r27879 * r27879;
        float r27881 = r27878 + r27880;
        float r27882 = 2;
        float r27883 = pow(r27881, r27882);
        float r27884 = 4;
        float r27885 = 1;
        float r27886 = r27885 - r27877;
        float r27887 = r27878 * r27886;
        float r27888 = 3;
        float r27889 = r27888 + r27877;
        float r27890 = r27880 * r27889;
        float r27891 = r27887 + r27890;
        float r27892 = r27884 * r27891;
        float r27893 = r27883 + r27892;
        float r27894 = sqrt(r27893);
        float r27895 = r27894 * r27894;
        float r27896 = r27895 - r27885;
        return r27896;
}

double f_od(double a, double b) {
        double r27897 = a;
        double r27898 = r27897 * r27897;
        double r27899 = b;
        double r27900 = r27899 * r27899;
        double r27901 = r27898 + r27900;
        double r27902 = 2;
        double r27903 = pow(r27901, r27902);
        double r27904 = 4;
        double r27905 = 1;
        double r27906 = r27905 - r27897;
        double r27907 = r27898 * r27906;
        double r27908 = 3;
        double r27909 = r27908 + r27897;
        double r27910 = r27900 * r27909;
        double r27911 = r27907 + r27910;
        double r27912 = r27904 * r27911;
        double r27913 = r27903 + r27912;
        double r27914 = sqrt(r27913);
        double r27915 = r27914 * r27914;
        double r27916 = r27915 - r27905;
        return r27916;
}

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 r27917, r27918, r27919, r27920, r27921, r27922, r27923, r27924, r27925, r27926, r27927, r27928, r27929, r27930, r27931, r27932, r27933, r27934;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r27917);
        mpfr_init(r27918);
        mpfr_init(r27919);
        mpfr_init(r27920);
        mpfr_init(r27921);
        mpfr_init_set_str(r27922, "2", 10, MPFR_RNDN);
        mpfr_init(r27923);
        mpfr_init_set_str(r27924, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27925, "1", 10, MPFR_RNDN);
        mpfr_init(r27926);
        mpfr_init(r27927);
        mpfr_init_set_str(r27928, "3", 10, MPFR_RNDN);
        mpfr_init(r27929);
        mpfr_init(r27930);
        mpfr_init(r27931);
        mpfr_init(r27932);
        mpfr_init(r27933);
        mpfr_init(r27934);
}

double f_im(double a, double b) {
        mpfr_set_d(r27917, a, MPFR_RNDN);
        mpfr_mul(r27918, r27917, r27917, MPFR_RNDN);
        mpfr_set_d(r27919, b, MPFR_RNDN);
        mpfr_mul(r27920, r27919, r27919, MPFR_RNDN);
        mpfr_add(r27921, r27918, r27920, MPFR_RNDN);
        ;
        mpfr_pow(r27923, r27921, r27922, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r27926, r27925, r27917, MPFR_RNDN);
        mpfr_mul(r27927, r27918, r27926, MPFR_RNDN);
        ;
        mpfr_add(r27929, r27928, r27917, MPFR_RNDN);
        mpfr_mul(r27930, r27920, r27929, MPFR_RNDN);
        mpfr_add(r27931, r27927, r27930, MPFR_RNDN);
        mpfr_mul(r27932, r27924, r27931, MPFR_RNDN);
        mpfr_add(r27933, r27923, r27932, MPFR_RNDN);
        mpfr_sub(r27934, r27933, r27925, MPFR_RNDN);
        return mpfr_get_d(r27934, MPFR_RNDN);
}

static mpfr_t r27935, r27936, r27937, r27938, r27939, r27940, r27941, r27942, r27943, r27944, r27945, r27946, r27947, r27948, r27949, r27950, r27951, r27952, r27953, r27954;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27935);
        mpfr_init(r27936);
        mpfr_init(r27937);
        mpfr_init(r27938);
        mpfr_init(r27939);
        mpfr_init_set_str(r27940, "2", 10, MPFR_RNDN);
        mpfr_init(r27941);
        mpfr_init_set_str(r27942, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27943, "1", 10, MPFR_RNDN);
        mpfr_init(r27944);
        mpfr_init(r27945);
        mpfr_init_set_str(r27946, "3", 10, MPFR_RNDN);
        mpfr_init(r27947);
        mpfr_init(r27948);
        mpfr_init(r27949);
        mpfr_init(r27950);
        mpfr_init(r27951);
        mpfr_init(r27952);
        mpfr_init(r27953);
        mpfr_init(r27954);
}

double f_fm(double a, double b) {
        mpfr_set_d(r27935, a, MPFR_RNDN);
        mpfr_mul(r27936, r27935, r27935, MPFR_RNDN);
        mpfr_set_d(r27937, b, MPFR_RNDN);
        mpfr_mul(r27938, r27937, r27937, MPFR_RNDN);
        mpfr_add(r27939, r27936, r27938, MPFR_RNDN);
        ;
        mpfr_pow(r27941, r27939, r27940, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r27944, r27943, r27935, MPFR_RNDN);
        mpfr_mul(r27945, r27936, r27944, MPFR_RNDN);
        ;
        mpfr_add(r27947, r27946, r27935, MPFR_RNDN);
        mpfr_mul(r27948, r27938, r27947, MPFR_RNDN);
        mpfr_add(r27949, r27945, r27948, MPFR_RNDN);
        mpfr_mul(r27950, r27942, r27949, MPFR_RNDN);
        mpfr_add(r27951, r27941, r27950, MPFR_RNDN);
        mpfr_sqrt(r27952, r27951, MPFR_RNDN);
        mpfr_mul(r27953, r27952, r27952, MPFR_RNDN);
        mpfr_sub(r27954, r27953, r27943, MPFR_RNDN);
        return mpfr_get_d(r27954, MPFR_RNDN);
}

static mpfr_t r27955, r27956, r27957, r27958, r27959, r27960, r27961, r27962, r27963, r27964, r27965, r27966, r27967, r27968, r27969, r27970, r27971, r27972, r27973, r27974;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27955);
        mpfr_init(r27956);
        mpfr_init(r27957);
        mpfr_init(r27958);
        mpfr_init(r27959);
        mpfr_init_set_str(r27960, "2", 10, MPFR_RNDN);
        mpfr_init(r27961);
        mpfr_init_set_str(r27962, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27963, "1", 10, MPFR_RNDN);
        mpfr_init(r27964);
        mpfr_init(r27965);
        mpfr_init_set_str(r27966, "3", 10, MPFR_RNDN);
        mpfr_init(r27967);
        mpfr_init(r27968);
        mpfr_init(r27969);
        mpfr_init(r27970);
        mpfr_init(r27971);
        mpfr_init(r27972);
        mpfr_init(r27973);
        mpfr_init(r27974);
}

double f_dm(double a, double b) {
        mpfr_set_d(r27955, a, MPFR_RNDN);
        mpfr_mul(r27956, r27955, r27955, MPFR_RNDN);
        mpfr_set_d(r27957, b, MPFR_RNDN);
        mpfr_mul(r27958, r27957, r27957, MPFR_RNDN);
        mpfr_add(r27959, r27956, r27958, MPFR_RNDN);
        ;
        mpfr_pow(r27961, r27959, r27960, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r27964, r27963, r27955, MPFR_RNDN);
        mpfr_mul(r27965, r27956, r27964, MPFR_RNDN);
        ;
        mpfr_add(r27967, r27966, r27955, MPFR_RNDN);
        mpfr_mul(r27968, r27958, r27967, MPFR_RNDN);
        mpfr_add(r27969, r27965, r27968, MPFR_RNDN);
        mpfr_mul(r27970, r27962, r27969, MPFR_RNDN);
        mpfr_add(r27971, r27961, r27970, MPFR_RNDN);
        mpfr_sqrt(r27972, r27971, MPFR_RNDN);
        mpfr_mul(r27973, r27972, r27972, MPFR_RNDN);
        mpfr_sub(r27974, r27973, r27963, MPFR_RNDN);
        return mpfr_get_d(r27974, MPFR_RNDN);
}

