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

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

double f_if(float a, float b) {
        float r35935 = a;
        float r35936 = r35935 * r35935;
        float r35937 = b;
        float r35938 = r35937 * r35937;
        float r35939 = r35936 + r35938;
        float r35940 = 2;
        float r35941 = pow(r35939, r35940);
        float r35942 = 4;
        float r35943 = r35942 * r35938;
        float r35944 = r35941 + r35943;
        float r35945 = 1;
        float r35946 = r35944 - r35945;
        return r35946;
}

double f_id(double a, double b) {
        double r35947 = a;
        double r35948 = r35947 * r35947;
        double r35949 = b;
        double r35950 = r35949 * r35949;
        double r35951 = r35948 + r35950;
        double r35952 = 2;
        double r35953 = pow(r35951, r35952);
        double r35954 = 4;
        double r35955 = r35954 * r35950;
        double r35956 = r35953 + r35955;
        double r35957 = 1;
        double r35958 = r35956 - r35957;
        return r35958;
}


double f_of(float a, float b) {
        float r35959 = a;
        float r35960 = r35959 * r35959;
        float r35961 = b;
        float r35962 = r35961 * r35961;
        float r35963 = r35960 + r35962;
        float r35964 = 2;
        float r35965 = pow(r35963, r35964);
        float r35966 = 4;
        float r35967 = r35966 * r35962;
        float r35968 = r35965 + r35967;
        float r35969 = 1;
        float r35970 = r35968 - r35969;
        return r35970;
}

double f_od(double a, double b) {
        double r35971 = a;
        double r35972 = r35971 * r35971;
        double r35973 = b;
        double r35974 = r35973 * r35973;
        double r35975 = r35972 + r35974;
        double r35976 = 2;
        double r35977 = pow(r35975, r35976);
        double r35978 = 4;
        double r35979 = r35978 * r35974;
        double r35980 = r35977 + r35979;
        double r35981 = 1;
        double r35982 = r35980 - r35981;
        return r35982;
}

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 r35983, r35984, r35985, r35986, r35987, r35988, r35989, r35990, r35991, r35992, r35993, r35994;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r35983);
        mpfr_init(r35984);
        mpfr_init(r35985);
        mpfr_init(r35986);
        mpfr_init(r35987);
        mpfr_init_set_str(r35988, "2", 10, MPFR_RNDN);
        mpfr_init(r35989);
        mpfr_init_set_str(r35990, "4", 10, MPFR_RNDN);
        mpfr_init(r35991);
        mpfr_init(r35992);
        mpfr_init_set_str(r35993, "1", 10, MPFR_RNDN);
        mpfr_init(r35994);
}

double f_im(double a, double b) {
        mpfr_set_d(r35983, a, MPFR_RNDN);
        mpfr_mul(r35984, r35983, r35983, MPFR_RNDN);
        mpfr_set_d(r35985, b, MPFR_RNDN);
        mpfr_mul(r35986, r35985, r35985, MPFR_RNDN);
        mpfr_add(r35987, r35984, r35986, MPFR_RNDN);
        ;
        mpfr_pow(r35989, r35987, r35988, MPFR_RNDN);
        ;
        mpfr_mul(r35991, r35990, r35986, MPFR_RNDN);
        mpfr_add(r35992, r35989, r35991, MPFR_RNDN);
        ;
        mpfr_sub(r35994, r35992, r35993, MPFR_RNDN);
        return mpfr_get_d(r35994, MPFR_RNDN);
}

static mpfr_t r35995, r35996, r35997, r35998, r35999, r36000, r36001, r36002, r36003, r36004, r36005, r36006;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r35995);
        mpfr_init(r35996);
        mpfr_init(r35997);
        mpfr_init(r35998);
        mpfr_init(r35999);
        mpfr_init_set_str(r36000, "2", 10, MPFR_RNDN);
        mpfr_init(r36001);
        mpfr_init_set_str(r36002, "4", 10, MPFR_RNDN);
        mpfr_init(r36003);
        mpfr_init(r36004);
        mpfr_init_set_str(r36005, "1", 10, MPFR_RNDN);
        mpfr_init(r36006);
}

double f_fm(double a, double b) {
        mpfr_set_d(r35995, a, MPFR_RNDN);
        mpfr_mul(r35996, r35995, r35995, MPFR_RNDN);
        mpfr_set_d(r35997, b, MPFR_RNDN);
        mpfr_mul(r35998, r35997, r35997, MPFR_RNDN);
        mpfr_add(r35999, r35996, r35998, MPFR_RNDN);
        ;
        mpfr_pow(r36001, r35999, r36000, MPFR_RNDN);
        ;
        mpfr_mul(r36003, r36002, r35998, MPFR_RNDN);
        mpfr_add(r36004, r36001, r36003, MPFR_RNDN);
        ;
        mpfr_sub(r36006, r36004, r36005, MPFR_RNDN);
        return mpfr_get_d(r36006, MPFR_RNDN);
}

static mpfr_t r36007, r36008, r36009, r36010, r36011, r36012, r36013, r36014, r36015, r36016, r36017, r36018;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36007);
        mpfr_init(r36008);
        mpfr_init(r36009);
        mpfr_init(r36010);
        mpfr_init(r36011);
        mpfr_init_set_str(r36012, "2", 10, MPFR_RNDN);
        mpfr_init(r36013);
        mpfr_init_set_str(r36014, "4", 10, MPFR_RNDN);
        mpfr_init(r36015);
        mpfr_init(r36016);
        mpfr_init_set_str(r36017, "1", 10, MPFR_RNDN);
        mpfr_init(r36018);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36007, a, MPFR_RNDN);
        mpfr_mul(r36008, r36007, r36007, MPFR_RNDN);
        mpfr_set_d(r36009, b, MPFR_RNDN);
        mpfr_mul(r36010, r36009, r36009, MPFR_RNDN);
        mpfr_add(r36011, r36008, r36010, MPFR_RNDN);
        ;
        mpfr_pow(r36013, r36011, r36012, MPFR_RNDN);
        ;
        mpfr_mul(r36015, r36014, r36010, MPFR_RNDN);
        mpfr_add(r36016, r36013, r36015, MPFR_RNDN);
        ;
        mpfr_sub(r36018, r36016, r36017, MPFR_RNDN);
        return mpfr_get_d(r36018, MPFR_RNDN);
}

