#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 r36849 = a;
        float r36850 = r36849 * r36849;
        float r36851 = b;
        float r36852 = r36851 * r36851;
        float r36853 = r36850 + r36852;
        float r36854 = 2;
        float r36855 = pow(r36853, r36854);
        float r36856 = 4;
        float r36857 = 1;
        float r36858 = r36857 - r36849;
        float r36859 = r36850 * r36858;
        float r36860 = 3;
        float r36861 = r36860 + r36849;
        float r36862 = r36852 * r36861;
        float r36863 = r36859 + r36862;
        float r36864 = r36856 * r36863;
        float r36865 = r36855 + r36864;
        float r36866 = r36865 - r36857;
        return r36866;
}

double f_id(double a, double b) {
        double r36867 = a;
        double r36868 = r36867 * r36867;
        double r36869 = b;
        double r36870 = r36869 * r36869;
        double r36871 = r36868 + r36870;
        double r36872 = 2;
        double r36873 = pow(r36871, r36872);
        double r36874 = 4;
        double r36875 = 1;
        double r36876 = r36875 - r36867;
        double r36877 = r36868 * r36876;
        double r36878 = 3;
        double r36879 = r36878 + r36867;
        double r36880 = r36870 * r36879;
        double r36881 = r36877 + r36880;
        double r36882 = r36874 * r36881;
        double r36883 = r36873 + r36882;
        double r36884 = r36883 - r36875;
        return r36884;
}


double f_of(float a, float b) {
        float r36885 = a;
        float r36886 = r36885 * r36885;
        float r36887 = b;
        float r36888 = r36887 * r36887;
        float r36889 = r36886 + r36888;
        float r36890 = 2;
        float r36891 = pow(r36889, r36890);
        float r36892 = 4;
        float r36893 = 1;
        float r36894 = r36893 - r36885;
        float r36895 = r36886 * r36894;
        float r36896 = 3;
        float r36897 = r36896 + r36885;
        float r36898 = r36888 * r36897;
        float r36899 = r36895 + r36898;
        float r36900 = r36892 * r36899;
        float r36901 = r36891 + r36900;
        float r36902 = sqrt(r36901);
        float r36903 = r36902 * r36902;
        float r36904 = r36903 - r36893;
        return r36904;
}

double f_od(double a, double b) {
        double r36905 = a;
        double r36906 = r36905 * r36905;
        double r36907 = b;
        double r36908 = r36907 * r36907;
        double r36909 = r36906 + r36908;
        double r36910 = 2;
        double r36911 = pow(r36909, r36910);
        double r36912 = 4;
        double r36913 = 1;
        double r36914 = r36913 - r36905;
        double r36915 = r36906 * r36914;
        double r36916 = 3;
        double r36917 = r36916 + r36905;
        double r36918 = r36908 * r36917;
        double r36919 = r36915 + r36918;
        double r36920 = r36912 * r36919;
        double r36921 = r36911 + r36920;
        double r36922 = sqrt(r36921);
        double r36923 = r36922 * r36922;
        double r36924 = r36923 - r36913;
        return r36924;
}

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 r36925, r36926, r36927, r36928, r36929, r36930, r36931, r36932, r36933, r36934, r36935, r36936, r36937, r36938, r36939, r36940, r36941, r36942;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36925);
        mpfr_init(r36926);
        mpfr_init(r36927);
        mpfr_init(r36928);
        mpfr_init(r36929);
        mpfr_init_set_str(r36930, "2", 10, MPFR_RNDN);
        mpfr_init(r36931);
        mpfr_init_set_str(r36932, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36933, "1", 10, MPFR_RNDN);
        mpfr_init(r36934);
        mpfr_init(r36935);
        mpfr_init_set_str(r36936, "3", 10, MPFR_RNDN);
        mpfr_init(r36937);
        mpfr_init(r36938);
        mpfr_init(r36939);
        mpfr_init(r36940);
        mpfr_init(r36941);
        mpfr_init(r36942);
}

double f_im(double a, double b) {
        mpfr_set_d(r36925, a, MPFR_RNDN);
        mpfr_mul(r36926, r36925, r36925, MPFR_RNDN);
        mpfr_set_d(r36927, b, MPFR_RNDN);
        mpfr_mul(r36928, r36927, r36927, MPFR_RNDN);
        mpfr_add(r36929, r36926, r36928, MPFR_RNDN);
        ;
        mpfr_pow(r36931, r36929, r36930, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36934, r36933, r36925, MPFR_RNDN);
        mpfr_mul(r36935, r36926, r36934, MPFR_RNDN);
        ;
        mpfr_add(r36937, r36936, r36925, MPFR_RNDN);
        mpfr_mul(r36938, r36928, r36937, MPFR_RNDN);
        mpfr_add(r36939, r36935, r36938, MPFR_RNDN);
        mpfr_mul(r36940, r36932, r36939, MPFR_RNDN);
        mpfr_add(r36941, r36931, r36940, MPFR_RNDN);
        mpfr_sub(r36942, r36941, r36933, MPFR_RNDN);
        return mpfr_get_d(r36942, MPFR_RNDN);
}

static mpfr_t r36943, r36944, r36945, r36946, r36947, r36948, r36949, r36950, r36951, r36952, r36953, r36954, r36955, r36956, r36957, r36958, r36959, r36960, r36961, r36962;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36943);
        mpfr_init(r36944);
        mpfr_init(r36945);
        mpfr_init(r36946);
        mpfr_init(r36947);
        mpfr_init_set_str(r36948, "2", 10, MPFR_RNDN);
        mpfr_init(r36949);
        mpfr_init_set_str(r36950, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36951, "1", 10, MPFR_RNDN);
        mpfr_init(r36952);
        mpfr_init(r36953);
        mpfr_init_set_str(r36954, "3", 10, MPFR_RNDN);
        mpfr_init(r36955);
        mpfr_init(r36956);
        mpfr_init(r36957);
        mpfr_init(r36958);
        mpfr_init(r36959);
        mpfr_init(r36960);
        mpfr_init(r36961);
        mpfr_init(r36962);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36943, a, MPFR_RNDN);
        mpfr_mul(r36944, r36943, r36943, MPFR_RNDN);
        mpfr_set_d(r36945, b, MPFR_RNDN);
        mpfr_mul(r36946, r36945, r36945, MPFR_RNDN);
        mpfr_add(r36947, r36944, r36946, MPFR_RNDN);
        ;
        mpfr_pow(r36949, r36947, r36948, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36952, r36951, r36943, MPFR_RNDN);
        mpfr_mul(r36953, r36944, r36952, MPFR_RNDN);
        ;
        mpfr_add(r36955, r36954, r36943, MPFR_RNDN);
        mpfr_mul(r36956, r36946, r36955, MPFR_RNDN);
        mpfr_add(r36957, r36953, r36956, MPFR_RNDN);
        mpfr_mul(r36958, r36950, r36957, MPFR_RNDN);
        mpfr_add(r36959, r36949, r36958, MPFR_RNDN);
        mpfr_sqrt(r36960, r36959, MPFR_RNDN);
        mpfr_mul(r36961, r36960, r36960, MPFR_RNDN);
        mpfr_sub(r36962, r36961, r36951, MPFR_RNDN);
        return mpfr_get_d(r36962, MPFR_RNDN);
}

static mpfr_t r36963, r36964, r36965, r36966, r36967, r36968, r36969, r36970, r36971, r36972, r36973, r36974, r36975, r36976, r36977, r36978, r36979, r36980, r36981, r36982;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36963);
        mpfr_init(r36964);
        mpfr_init(r36965);
        mpfr_init(r36966);
        mpfr_init(r36967);
        mpfr_init_set_str(r36968, "2", 10, MPFR_RNDN);
        mpfr_init(r36969);
        mpfr_init_set_str(r36970, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36971, "1", 10, MPFR_RNDN);
        mpfr_init(r36972);
        mpfr_init(r36973);
        mpfr_init_set_str(r36974, "3", 10, MPFR_RNDN);
        mpfr_init(r36975);
        mpfr_init(r36976);
        mpfr_init(r36977);
        mpfr_init(r36978);
        mpfr_init(r36979);
        mpfr_init(r36980);
        mpfr_init(r36981);
        mpfr_init(r36982);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36963, a, MPFR_RNDN);
        mpfr_mul(r36964, r36963, r36963, MPFR_RNDN);
        mpfr_set_d(r36965, b, MPFR_RNDN);
        mpfr_mul(r36966, r36965, r36965, MPFR_RNDN);
        mpfr_add(r36967, r36964, r36966, MPFR_RNDN);
        ;
        mpfr_pow(r36969, r36967, r36968, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36972, r36971, r36963, MPFR_RNDN);
        mpfr_mul(r36973, r36964, r36972, MPFR_RNDN);
        ;
        mpfr_add(r36975, r36974, r36963, MPFR_RNDN);
        mpfr_mul(r36976, r36966, r36975, MPFR_RNDN);
        mpfr_add(r36977, r36973, r36976, MPFR_RNDN);
        mpfr_mul(r36978, r36970, r36977, MPFR_RNDN);
        mpfr_add(r36979, r36969, r36978, MPFR_RNDN);
        mpfr_sqrt(r36980, r36979, MPFR_RNDN);
        mpfr_mul(r36981, r36980, r36980, MPFR_RNDN);
        mpfr_sub(r36982, r36981, r36971, MPFR_RNDN);
        return mpfr_get_d(r36982, MPFR_RNDN);
}

