#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 r35941 = a;
        float r35942 = r35941 * r35941;
        float r35943 = b;
        float r35944 = r35943 * r35943;
        float r35945 = r35942 + r35944;
        float r35946 = 2;
        float r35947 = pow(r35945, r35946);
        float r35948 = 4;
        float r35949 = 1;
        float r35950 = r35949 + r35941;
        float r35951 = r35942 * r35950;
        float r35952 = 3;
        float r35953 = r35952 * r35941;
        float r35954 = r35949 - r35953;
        float r35955 = r35944 * r35954;
        float r35956 = r35951 + r35955;
        float r35957 = r35948 * r35956;
        float r35958 = r35947 + r35957;
        float r35959 = r35958 - r35949;
        return r35959;
}

double f_id(double a, double b) {
        double r35960 = a;
        double r35961 = r35960 * r35960;
        double r35962 = b;
        double r35963 = r35962 * r35962;
        double r35964 = r35961 + r35963;
        double r35965 = 2;
        double r35966 = pow(r35964, r35965);
        double r35967 = 4;
        double r35968 = 1;
        double r35969 = r35968 + r35960;
        double r35970 = r35961 * r35969;
        double r35971 = 3;
        double r35972 = r35971 * r35960;
        double r35973 = r35968 - r35972;
        double r35974 = r35963 * r35973;
        double r35975 = r35970 + r35974;
        double r35976 = r35967 * r35975;
        double r35977 = r35966 + r35976;
        double r35978 = r35977 - r35968;
        return r35978;
}


double f_of(float a, float b) {
        float r35979 = a;
        float r35980 = r35979 * r35979;
        float r35981 = b;
        float r35982 = r35981 * r35981;
        float r35983 = r35980 + r35982;
        float r35984 = 2;
        float r35985 = pow(r35983, r35984);
        float r35986 = 4;
        float r35987 = 1;
        float r35988 = r35987 + r35979;
        float r35989 = r35980 * r35988;
        float r35990 = 3;
        float r35991 = r35990 * r35979;
        float r35992 = r35987 - r35991;
        float r35993 = r35982 * r35992;
        float r35994 = r35989 + r35993;
        float r35995 = r35986 * r35994;
        float r35996 = r35985 + r35995;
        float r35997 = r35996 - r35987;
        return r35997;
}

double f_od(double a, double b) {
        double r35998 = a;
        double r35999 = r35998 * r35998;
        double r36000 = b;
        double r36001 = r36000 * r36000;
        double r36002 = r35999 + r36001;
        double r36003 = 2;
        double r36004 = pow(r36002, r36003);
        double r36005 = 4;
        double r36006 = 1;
        double r36007 = r36006 + r35998;
        double r36008 = r35999 * r36007;
        double r36009 = 3;
        double r36010 = r36009 * r35998;
        double r36011 = r36006 - r36010;
        double r36012 = r36001 * r36011;
        double r36013 = r36008 + r36012;
        double r36014 = r36005 * r36013;
        double r36015 = r36004 + r36014;
        double r36016 = r36015 - r36006;
        return r36016;
}

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 r36017, r36018, r36019, r36020, r36021, r36022, r36023, r36024, r36025, r36026, r36027, r36028, r36029, r36030, r36031, r36032, r36033, r36034, r36035;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36017);
        mpfr_init(r36018);
        mpfr_init(r36019);
        mpfr_init(r36020);
        mpfr_init(r36021);
        mpfr_init_set_str(r36022, "2", 10, MPFR_RNDN);
        mpfr_init(r36023);
        mpfr_init_set_str(r36024, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36025, "1", 10, MPFR_RNDN);
        mpfr_init(r36026);
        mpfr_init(r36027);
        mpfr_init_set_str(r36028, "3", 10, MPFR_RNDN);
        mpfr_init(r36029);
        mpfr_init(r36030);
        mpfr_init(r36031);
        mpfr_init(r36032);
        mpfr_init(r36033);
        mpfr_init(r36034);
        mpfr_init(r36035);
}

double f_im(double a, double b) {
        mpfr_set_d(r36017, a, MPFR_RNDN);
        mpfr_mul(r36018, r36017, r36017, MPFR_RNDN);
        mpfr_set_d(r36019, b, MPFR_RNDN);
        mpfr_mul(r36020, r36019, r36019, MPFR_RNDN);
        mpfr_add(r36021, r36018, r36020, MPFR_RNDN);
        ;
        mpfr_pow(r36023, r36021, r36022, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36026, r36025, r36017, MPFR_RNDN);
        mpfr_mul(r36027, r36018, r36026, MPFR_RNDN);
        ;
        mpfr_mul(r36029, r36028, r36017, MPFR_RNDN);
        mpfr_sub(r36030, r36025, r36029, MPFR_RNDN);
        mpfr_mul(r36031, r36020, r36030, MPFR_RNDN);
        mpfr_add(r36032, r36027, r36031, MPFR_RNDN);
        mpfr_mul(r36033, r36024, r36032, MPFR_RNDN);
        mpfr_add(r36034, r36023, r36033, MPFR_RNDN);
        mpfr_sub(r36035, r36034, r36025, MPFR_RNDN);
        return mpfr_get_d(r36035, MPFR_RNDN);
}

static mpfr_t r36036, r36037, r36038, r36039, r36040, r36041, r36042, r36043, r36044, r36045, r36046, r36047, r36048, r36049, r36050, r36051, r36052, r36053, r36054;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36036);
        mpfr_init(r36037);
        mpfr_init(r36038);
        mpfr_init(r36039);
        mpfr_init(r36040);
        mpfr_init_set_str(r36041, "2", 10, MPFR_RNDN);
        mpfr_init(r36042);
        mpfr_init_set_str(r36043, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36044, "1", 10, MPFR_RNDN);
        mpfr_init(r36045);
        mpfr_init(r36046);
        mpfr_init_set_str(r36047, "3", 10, MPFR_RNDN);
        mpfr_init(r36048);
        mpfr_init(r36049);
        mpfr_init(r36050);
        mpfr_init(r36051);
        mpfr_init(r36052);
        mpfr_init(r36053);
        mpfr_init(r36054);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36036, a, MPFR_RNDN);
        mpfr_mul(r36037, r36036, r36036, MPFR_RNDN);
        mpfr_set_d(r36038, b, MPFR_RNDN);
        mpfr_mul(r36039, r36038, r36038, MPFR_RNDN);
        mpfr_add(r36040, r36037, r36039, MPFR_RNDN);
        ;
        mpfr_pow(r36042, r36040, r36041, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36045, r36044, r36036, MPFR_RNDN);
        mpfr_mul(r36046, r36037, r36045, MPFR_RNDN);
        ;
        mpfr_mul(r36048, r36047, r36036, MPFR_RNDN);
        mpfr_sub(r36049, r36044, r36048, MPFR_RNDN);
        mpfr_mul(r36050, r36039, r36049, MPFR_RNDN);
        mpfr_add(r36051, r36046, r36050, MPFR_RNDN);
        mpfr_mul(r36052, r36043, r36051, MPFR_RNDN);
        mpfr_add(r36053, r36042, r36052, MPFR_RNDN);
        mpfr_sub(r36054, r36053, r36044, MPFR_RNDN);
        return mpfr_get_d(r36054, MPFR_RNDN);
}

static mpfr_t r36055, r36056, r36057, r36058, r36059, r36060, r36061, r36062, r36063, r36064, r36065, r36066, r36067, r36068, r36069, r36070, r36071, r36072, r36073;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36055);
        mpfr_init(r36056);
        mpfr_init(r36057);
        mpfr_init(r36058);
        mpfr_init(r36059);
        mpfr_init_set_str(r36060, "2", 10, MPFR_RNDN);
        mpfr_init(r36061);
        mpfr_init_set_str(r36062, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36063, "1", 10, MPFR_RNDN);
        mpfr_init(r36064);
        mpfr_init(r36065);
        mpfr_init_set_str(r36066, "3", 10, MPFR_RNDN);
        mpfr_init(r36067);
        mpfr_init(r36068);
        mpfr_init(r36069);
        mpfr_init(r36070);
        mpfr_init(r36071);
        mpfr_init(r36072);
        mpfr_init(r36073);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36055, a, MPFR_RNDN);
        mpfr_mul(r36056, r36055, r36055, MPFR_RNDN);
        mpfr_set_d(r36057, b, MPFR_RNDN);
        mpfr_mul(r36058, r36057, r36057, MPFR_RNDN);
        mpfr_add(r36059, r36056, r36058, MPFR_RNDN);
        ;
        mpfr_pow(r36061, r36059, r36060, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36064, r36063, r36055, MPFR_RNDN);
        mpfr_mul(r36065, r36056, r36064, MPFR_RNDN);
        ;
        mpfr_mul(r36067, r36066, r36055, MPFR_RNDN);
        mpfr_sub(r36068, r36063, r36067, MPFR_RNDN);
        mpfr_mul(r36069, r36058, r36068, MPFR_RNDN);
        mpfr_add(r36070, r36065, r36069, MPFR_RNDN);
        mpfr_mul(r36071, r36062, r36070, MPFR_RNDN);
        mpfr_add(r36072, r36061, r36071, MPFR_RNDN);
        mpfr_sub(r36073, r36072, r36063, MPFR_RNDN);
        return mpfr_get_d(r36073, MPFR_RNDN);
}

