#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 r27848 = a;
        float r27849 = r27848 * r27848;
        float r27850 = b;
        float r27851 = r27850 * r27850;
        float r27852 = r27849 + r27851;
        float r27853 = 2;
        float r27854 = pow(r27852, r27853);
        float r27855 = 4;
        float r27856 = 1;
        float r27857 = r27856 + r27848;
        float r27858 = r27849 * r27857;
        float r27859 = 3;
        float r27860 = r27859 * r27848;
        float r27861 = r27856 - r27860;
        float r27862 = r27851 * r27861;
        float r27863 = r27858 + r27862;
        float r27864 = r27855 * r27863;
        float r27865 = r27854 + r27864;
        float r27866 = r27865 - r27856;
        return r27866;
}

double f_id(double a, double b) {
        double r27867 = a;
        double r27868 = r27867 * r27867;
        double r27869 = b;
        double r27870 = r27869 * r27869;
        double r27871 = r27868 + r27870;
        double r27872 = 2;
        double r27873 = pow(r27871, r27872);
        double r27874 = 4;
        double r27875 = 1;
        double r27876 = r27875 + r27867;
        double r27877 = r27868 * r27876;
        double r27878 = 3;
        double r27879 = r27878 * r27867;
        double r27880 = r27875 - r27879;
        double r27881 = r27870 * r27880;
        double r27882 = r27877 + r27881;
        double r27883 = r27874 * r27882;
        double r27884 = r27873 + r27883;
        double r27885 = r27884 - r27875;
        return r27885;
}


double f_of(float a, float b) {
        float r27886 = a;
        float r27887 = r27886 * r27886;
        float r27888 = b;
        float r27889 = r27888 * r27888;
        float r27890 = r27887 + r27889;
        float r27891 = 2;
        float r27892 = pow(r27890, r27891);
        float r27893 = 4;
        float r27894 = 1;
        float r27895 = r27894 + r27886;
        float r27896 = r27887 * r27895;
        float r27897 = 3;
        float r27898 = r27897 * r27886;
        float r27899 = r27894 - r27898;
        float r27900 = r27889 * r27899;
        float r27901 = r27896 + r27900;
        float r27902 = r27893 * r27901;
        float r27903 = r27892 + r27902;
        float r27904 = r27903 - r27894;
        return r27904;
}

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

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 r27924, r27925, r27926, r27927, r27928, r27929, r27930, r27931, r27932, r27933, r27934, r27935, r27936, r27937, r27938, r27939, r27940, r27941, r27942;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r27924);
        mpfr_init(r27925);
        mpfr_init(r27926);
        mpfr_init(r27927);
        mpfr_init(r27928);
        mpfr_init_set_str(r27929, "2", 10, MPFR_RNDN);
        mpfr_init(r27930);
        mpfr_init_set_str(r27931, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27932, "1", 10, MPFR_RNDN);
        mpfr_init(r27933);
        mpfr_init(r27934);
        mpfr_init_set_str(r27935, "3", 10, MPFR_RNDN);
        mpfr_init(r27936);
        mpfr_init(r27937);
        mpfr_init(r27938);
        mpfr_init(r27939);
        mpfr_init(r27940);
        mpfr_init(r27941);
        mpfr_init(r27942);
}

double f_im(double a, double b) {
        mpfr_set_d(r27924, a, MPFR_RNDN);
        mpfr_mul(r27925, r27924, r27924, MPFR_RNDN);
        mpfr_set_d(r27926, b, MPFR_RNDN);
        mpfr_mul(r27927, r27926, r27926, MPFR_RNDN);
        mpfr_add(r27928, r27925, r27927, MPFR_RNDN);
        ;
        mpfr_pow(r27930, r27928, r27929, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27933, r27932, r27924, MPFR_RNDN);
        mpfr_mul(r27934, r27925, r27933, MPFR_RNDN);
        ;
        mpfr_mul(r27936, r27935, r27924, MPFR_RNDN);
        mpfr_sub(r27937, r27932, r27936, MPFR_RNDN);
        mpfr_mul(r27938, r27927, r27937, MPFR_RNDN);
        mpfr_add(r27939, r27934, r27938, MPFR_RNDN);
        mpfr_mul(r27940, r27931, r27939, MPFR_RNDN);
        mpfr_add(r27941, r27930, r27940, MPFR_RNDN);
        mpfr_sub(r27942, r27941, r27932, MPFR_RNDN);
        return mpfr_get_d(r27942, MPFR_RNDN);
}

static mpfr_t r27943, r27944, r27945, r27946, r27947, r27948, r27949, r27950, r27951, r27952, r27953, r27954, r27955, r27956, r27957, r27958, r27959, r27960, r27961;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27943);
        mpfr_init(r27944);
        mpfr_init(r27945);
        mpfr_init(r27946);
        mpfr_init(r27947);
        mpfr_init_set_str(r27948, "2", 10, MPFR_RNDN);
        mpfr_init(r27949);
        mpfr_init_set_str(r27950, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27951, "1", 10, MPFR_RNDN);
        mpfr_init(r27952);
        mpfr_init(r27953);
        mpfr_init_set_str(r27954, "3", 10, MPFR_RNDN);
        mpfr_init(r27955);
        mpfr_init(r27956);
        mpfr_init(r27957);
        mpfr_init(r27958);
        mpfr_init(r27959);
        mpfr_init(r27960);
        mpfr_init(r27961);
}

double f_fm(double a, double b) {
        mpfr_set_d(r27943, a, MPFR_RNDN);
        mpfr_mul(r27944, r27943, r27943, MPFR_RNDN);
        mpfr_set_d(r27945, b, MPFR_RNDN);
        mpfr_mul(r27946, r27945, r27945, MPFR_RNDN);
        mpfr_add(r27947, r27944, r27946, MPFR_RNDN);
        ;
        mpfr_pow(r27949, r27947, r27948, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27952, r27951, r27943, MPFR_RNDN);
        mpfr_mul(r27953, r27944, r27952, MPFR_RNDN);
        ;
        mpfr_mul(r27955, r27954, r27943, MPFR_RNDN);
        mpfr_sub(r27956, r27951, r27955, MPFR_RNDN);
        mpfr_mul(r27957, r27946, r27956, MPFR_RNDN);
        mpfr_add(r27958, r27953, r27957, MPFR_RNDN);
        mpfr_mul(r27959, r27950, r27958, MPFR_RNDN);
        mpfr_add(r27960, r27949, r27959, MPFR_RNDN);
        mpfr_sub(r27961, r27960, r27951, MPFR_RNDN);
        return mpfr_get_d(r27961, MPFR_RNDN);
}

static mpfr_t r27962, r27963, r27964, r27965, r27966, r27967, r27968, r27969, r27970, r27971, r27972, r27973, r27974, r27975, r27976, r27977, r27978, r27979, r27980;

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

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

