#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 r11000 = a;
        float r11001 = r11000 * r11000;
        float r11002 = b;
        float r11003 = r11002 * r11002;
        float r11004 = r11001 + r11003;
        float r11005 = 2;
        float r11006 = pow(r11004, r11005);
        float r11007 = 4;
        float r11008 = 1;
        float r11009 = r11008 + r11000;
        float r11010 = r11001 * r11009;
        float r11011 = 3;
        float r11012 = r11011 * r11000;
        float r11013 = r11008 - r11012;
        float r11014 = r11003 * r11013;
        float r11015 = r11010 + r11014;
        float r11016 = r11007 * r11015;
        float r11017 = r11006 + r11016;
        float r11018 = r11017 - r11008;
        return r11018;
}

double f_id(double a, double b) {
        double r11019 = a;
        double r11020 = r11019 * r11019;
        double r11021 = b;
        double r11022 = r11021 * r11021;
        double r11023 = r11020 + r11022;
        double r11024 = 2;
        double r11025 = pow(r11023, r11024);
        double r11026 = 4;
        double r11027 = 1;
        double r11028 = r11027 + r11019;
        double r11029 = r11020 * r11028;
        double r11030 = 3;
        double r11031 = r11030 * r11019;
        double r11032 = r11027 - r11031;
        double r11033 = r11022 * r11032;
        double r11034 = r11029 + r11033;
        double r11035 = r11026 * r11034;
        double r11036 = r11025 + r11035;
        double r11037 = r11036 - r11027;
        return r11037;
}


double f_of(float a, float b) {
        float r11038 = a;
        float r11039 = 4;
        float r11040 = fma(r11038, r11039, r11039);
        float r11041 = r11040 * r11038;
        float r11042 = b;
        float r11043 = hypot(r11038, r11042);
        float r11044 = 1;
        float r11045 = 3;
        float r11046 = r11044 + r11045;
        float r11047 = pow(r11043, r11046);
        float r11048 = fma(r11041, r11038, r11047);
        float r11049 = r11042 * r11042;
        float r11050 = r11045 * r11038;
        float r11051 = r11044 - r11050;
        float r11052 = r11049 * r11051;
        float r11053 = r11039 * r11052;
        float r11054 = r11048 + r11053;
        float r11055 = r11054 - r11044;
        return r11055;
}

double f_od(double a, double b) {
        double r11056 = a;
        double r11057 = 4;
        double r11058 = fma(r11056, r11057, r11057);
        double r11059 = r11058 * r11056;
        double r11060 = b;
        double r11061 = hypot(r11056, r11060);
        double r11062 = 1;
        double r11063 = 3;
        double r11064 = r11062 + r11063;
        double r11065 = pow(r11061, r11064);
        double r11066 = fma(r11059, r11056, r11065);
        double r11067 = r11060 * r11060;
        double r11068 = r11063 * r11056;
        double r11069 = r11062 - r11068;
        double r11070 = r11067 * r11069;
        double r11071 = r11057 * r11070;
        double r11072 = r11066 + r11071;
        double r11073 = r11072 - r11062;
        return r11073;
}

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 r11074, r11075, r11076, r11077, r11078, r11079, r11080, r11081, r11082, r11083, r11084, r11085, r11086, r11087, r11088, r11089, r11090, r11091, r11092;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r11074);
        mpfr_init(r11075);
        mpfr_init(r11076);
        mpfr_init(r11077);
        mpfr_init(r11078);
        mpfr_init_set_str(r11079, "2", 10, MPFR_RNDN);
        mpfr_init(r11080);
        mpfr_init_set_str(r11081, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11082, "1", 10, MPFR_RNDN);
        mpfr_init(r11083);
        mpfr_init(r11084);
        mpfr_init_set_str(r11085, "3", 10, MPFR_RNDN);
        mpfr_init(r11086);
        mpfr_init(r11087);
        mpfr_init(r11088);
        mpfr_init(r11089);
        mpfr_init(r11090);
        mpfr_init(r11091);
        mpfr_init(r11092);
}

double f_im(double a, double b) {
        mpfr_set_d(r11074, a, MPFR_RNDN);
        mpfr_mul(r11075, r11074, r11074, MPFR_RNDN);
        mpfr_set_d(r11076, b, MPFR_RNDN);
        mpfr_mul(r11077, r11076, r11076, MPFR_RNDN);
        mpfr_add(r11078, r11075, r11077, MPFR_RNDN);
        ;
        mpfr_pow(r11080, r11078, r11079, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11083, r11082, r11074, MPFR_RNDN);
        mpfr_mul(r11084, r11075, r11083, MPFR_RNDN);
        ;
        mpfr_mul(r11086, r11085, r11074, MPFR_RNDN);
        mpfr_sub(r11087, r11082, r11086, MPFR_RNDN);
        mpfr_mul(r11088, r11077, r11087, MPFR_RNDN);
        mpfr_add(r11089, r11084, r11088, MPFR_RNDN);
        mpfr_mul(r11090, r11081, r11089, MPFR_RNDN);
        mpfr_add(r11091, r11080, r11090, MPFR_RNDN);
        mpfr_sub(r11092, r11091, r11082, MPFR_RNDN);
        return mpfr_get_d(r11092, MPFR_RNDN);
}

static mpfr_t r11093, r11094, r11095, r11096, r11097, r11098, r11099, r11100, r11101, r11102, r11103, r11104, r11105, r11106, r11107, r11108, r11109, r11110;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11093);
        mpfr_init_set_str(r11094, "4", 10, MPFR_RNDN);
        mpfr_init(r11095);
        mpfr_init(r11096);
        mpfr_init(r11097);
        mpfr_init(r11098);
        mpfr_init_set_str(r11099, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r11100, "3", 10, MPFR_RNDN);
        mpfr_init(r11101);
        mpfr_init(r11102);
        mpfr_init(r11103);
        mpfr_init(r11104);
        mpfr_init(r11105);
        mpfr_init(r11106);
        mpfr_init(r11107);
        mpfr_init(r11108);
        mpfr_init(r11109);
        mpfr_init(r11110);
}

double f_fm(double a, double b) {
        mpfr_set_d(r11093, a, MPFR_RNDN);
        ;
        mpfr_fma(r11095, r11093, r11094, r11094, MPFR_RNDN);
        mpfr_mul(r11096, r11095, r11093, MPFR_RNDN);
        mpfr_set_d(r11097, b, MPFR_RNDN);
        mpfr_hypot(r11098, r11093, r11097, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11101, r11099, r11100, MPFR_RNDN);
        mpfr_pow(r11102, r11098, r11101, MPFR_RNDN);
        mpfr_fma(r11103, r11096, r11093, r11102, MPFR_RNDN);
        mpfr_mul(r11104, r11097, r11097, MPFR_RNDN);
        mpfr_mul(r11105, r11100, r11093, MPFR_RNDN);
        mpfr_sub(r11106, r11099, r11105, MPFR_RNDN);
        mpfr_mul(r11107, r11104, r11106, MPFR_RNDN);
        mpfr_mul(r11108, r11094, r11107, MPFR_RNDN);
        mpfr_add(r11109, r11103, r11108, MPFR_RNDN);
        mpfr_sub(r11110, r11109, r11099, MPFR_RNDN);
        return mpfr_get_d(r11110, MPFR_RNDN);
}

static mpfr_t r11111, r11112, r11113, r11114, r11115, r11116, r11117, r11118, r11119, r11120, r11121, r11122, r11123, r11124, r11125, r11126, r11127, r11128;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11111);
        mpfr_init_set_str(r11112, "4", 10, MPFR_RNDN);
        mpfr_init(r11113);
        mpfr_init(r11114);
        mpfr_init(r11115);
        mpfr_init(r11116);
        mpfr_init_set_str(r11117, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r11118, "3", 10, MPFR_RNDN);
        mpfr_init(r11119);
        mpfr_init(r11120);
        mpfr_init(r11121);
        mpfr_init(r11122);
        mpfr_init(r11123);
        mpfr_init(r11124);
        mpfr_init(r11125);
        mpfr_init(r11126);
        mpfr_init(r11127);
        mpfr_init(r11128);
}

double f_dm(double a, double b) {
        mpfr_set_d(r11111, a, MPFR_RNDN);
        ;
        mpfr_fma(r11113, r11111, r11112, r11112, MPFR_RNDN);
        mpfr_mul(r11114, r11113, r11111, MPFR_RNDN);
        mpfr_set_d(r11115, b, MPFR_RNDN);
        mpfr_hypot(r11116, r11111, r11115, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11119, r11117, r11118, MPFR_RNDN);
        mpfr_pow(r11120, r11116, r11119, MPFR_RNDN);
        mpfr_fma(r11121, r11114, r11111, r11120, MPFR_RNDN);
        mpfr_mul(r11122, r11115, r11115, MPFR_RNDN);
        mpfr_mul(r11123, r11118, r11111, MPFR_RNDN);
        mpfr_sub(r11124, r11117, r11123, MPFR_RNDN);
        mpfr_mul(r11125, r11122, r11124, MPFR_RNDN);
        mpfr_mul(r11126, r11112, r11125, MPFR_RNDN);
        mpfr_add(r11127, r11121, r11126, MPFR_RNDN);
        mpfr_sub(r11128, r11127, r11117, MPFR_RNDN);
        return mpfr_get_d(r11128, MPFR_RNDN);
}

