#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 r28030 = a;
        float r28031 = r28030 * r28030;
        float r28032 = b;
        float r28033 = r28032 * r28032;
        float r28034 = r28031 + r28033;
        float r28035 = 2;
        float r28036 = pow(r28034, r28035);
        float r28037 = 4;
        float r28038 = 1;
        float r28039 = r28038 + r28030;
        float r28040 = r28031 * r28039;
        float r28041 = 3;
        float r28042 = r28041 * r28030;
        float r28043 = r28038 - r28042;
        float r28044 = r28033 * r28043;
        float r28045 = r28040 + r28044;
        float r28046 = r28037 * r28045;
        float r28047 = r28036 + r28046;
        float r28048 = r28047 - r28038;
        return r28048;
}

double f_id(double a, double b) {
        double r28049 = a;
        double r28050 = r28049 * r28049;
        double r28051 = b;
        double r28052 = r28051 * r28051;
        double r28053 = r28050 + r28052;
        double r28054 = 2;
        double r28055 = pow(r28053, r28054);
        double r28056 = 4;
        double r28057 = 1;
        double r28058 = r28057 + r28049;
        double r28059 = r28050 * r28058;
        double r28060 = 3;
        double r28061 = r28060 * r28049;
        double r28062 = r28057 - r28061;
        double r28063 = r28052 * r28062;
        double r28064 = r28059 + r28063;
        double r28065 = r28056 * r28064;
        double r28066 = r28055 + r28065;
        double r28067 = r28066 - r28057;
        return r28067;
}


double f_of(float a, float b) {
        float r28068 = a;
        float r28069 = r28068 * r28068;
        float r28070 = b;
        float r28071 = r28070 * r28070;
        float r28072 = r28069 + r28071;
        float r28073 = 2;
        float r28074 = pow(r28072, r28073);
        float r28075 = 4;
        float r28076 = 1;
        float r28077 = r28076 + r28068;
        float r28078 = r28069 * r28077;
        float r28079 = 3;
        float r28080 = r28079 * r28068;
        float r28081 = r28076 - r28080;
        float r28082 = r28071 * r28081;
        float r28083 = r28078 + r28082;
        float r28084 = r28075 * r28083;
        float r28085 = r28074 + r28084;
        float r28086 = sqrt(r28085);
        float r28087 = r28086 * r28086;
        float r28088 = r28087 - r28076;
        return r28088;
}

double f_od(double a, double b) {
        double r28089 = a;
        double r28090 = r28089 * r28089;
        double r28091 = b;
        double r28092 = r28091 * r28091;
        double r28093 = r28090 + r28092;
        double r28094 = 2;
        double r28095 = pow(r28093, r28094);
        double r28096 = 4;
        double r28097 = 1;
        double r28098 = r28097 + r28089;
        double r28099 = r28090 * r28098;
        double r28100 = 3;
        double r28101 = r28100 * r28089;
        double r28102 = r28097 - r28101;
        double r28103 = r28092 * r28102;
        double r28104 = r28099 + r28103;
        double r28105 = r28096 * r28104;
        double r28106 = r28095 + r28105;
        double r28107 = sqrt(r28106);
        double r28108 = r28107 * r28107;
        double r28109 = r28108 - r28097;
        return r28109;
}

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 r28110, r28111, r28112, r28113, r28114, r28115, r28116, r28117, r28118, r28119, r28120, r28121, r28122, r28123, r28124, r28125, r28126, r28127, r28128;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r28110);
        mpfr_init(r28111);
        mpfr_init(r28112);
        mpfr_init(r28113);
        mpfr_init(r28114);
        mpfr_init_set_str(r28115, "2", 10, MPFR_RNDN);
        mpfr_init(r28116);
        mpfr_init_set_str(r28117, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28118, "1", 10, MPFR_RNDN);
        mpfr_init(r28119);
        mpfr_init(r28120);
        mpfr_init_set_str(r28121, "3", 10, MPFR_RNDN);
        mpfr_init(r28122);
        mpfr_init(r28123);
        mpfr_init(r28124);
        mpfr_init(r28125);
        mpfr_init(r28126);
        mpfr_init(r28127);
        mpfr_init(r28128);
}

double f_im(double a, double b) {
        mpfr_set_d(r28110, a, MPFR_RNDN);
        mpfr_mul(r28111, r28110, r28110, MPFR_RNDN);
        mpfr_set_d(r28112, b, MPFR_RNDN);
        mpfr_mul(r28113, r28112, r28112, MPFR_RNDN);
        mpfr_add(r28114, r28111, r28113, MPFR_RNDN);
        ;
        mpfr_pow(r28116, r28114, r28115, MPFR_RNDN);
        ;
        ;
        mpfr_add(r28119, r28118, r28110, MPFR_RNDN);
        mpfr_mul(r28120, r28111, r28119, MPFR_RNDN);
        ;
        mpfr_mul(r28122, r28121, r28110, MPFR_RNDN);
        mpfr_sub(r28123, r28118, r28122, MPFR_RNDN);
        mpfr_mul(r28124, r28113, r28123, MPFR_RNDN);
        mpfr_add(r28125, r28120, r28124, MPFR_RNDN);
        mpfr_mul(r28126, r28117, r28125, MPFR_RNDN);
        mpfr_add(r28127, r28116, r28126, MPFR_RNDN);
        mpfr_sub(r28128, r28127, r28118, MPFR_RNDN);
        return mpfr_get_d(r28128, MPFR_RNDN);
}

static mpfr_t r28129, r28130, r28131, r28132, r28133, r28134, r28135, r28136, r28137, r28138, r28139, r28140, r28141, r28142, r28143, r28144, r28145, r28146, r28147, r28148, r28149;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r28129);
        mpfr_init(r28130);
        mpfr_init(r28131);
        mpfr_init(r28132);
        mpfr_init(r28133);
        mpfr_init_set_str(r28134, "2", 10, MPFR_RNDN);
        mpfr_init(r28135);
        mpfr_init_set_str(r28136, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28137, "1", 10, MPFR_RNDN);
        mpfr_init(r28138);
        mpfr_init(r28139);
        mpfr_init_set_str(r28140, "3", 10, MPFR_RNDN);
        mpfr_init(r28141);
        mpfr_init(r28142);
        mpfr_init(r28143);
        mpfr_init(r28144);
        mpfr_init(r28145);
        mpfr_init(r28146);
        mpfr_init(r28147);
        mpfr_init(r28148);
        mpfr_init(r28149);
}

double f_fm(double a, double b) {
        mpfr_set_d(r28129, a, MPFR_RNDN);
        mpfr_mul(r28130, r28129, r28129, MPFR_RNDN);
        mpfr_set_d(r28131, b, MPFR_RNDN);
        mpfr_mul(r28132, r28131, r28131, MPFR_RNDN);
        mpfr_add(r28133, r28130, r28132, MPFR_RNDN);
        ;
        mpfr_pow(r28135, r28133, r28134, MPFR_RNDN);
        ;
        ;
        mpfr_add(r28138, r28137, r28129, MPFR_RNDN);
        mpfr_mul(r28139, r28130, r28138, MPFR_RNDN);
        ;
        mpfr_mul(r28141, r28140, r28129, MPFR_RNDN);
        mpfr_sub(r28142, r28137, r28141, MPFR_RNDN);
        mpfr_mul(r28143, r28132, r28142, MPFR_RNDN);
        mpfr_add(r28144, r28139, r28143, MPFR_RNDN);
        mpfr_mul(r28145, r28136, r28144, MPFR_RNDN);
        mpfr_add(r28146, r28135, r28145, MPFR_RNDN);
        mpfr_sqrt(r28147, r28146, MPFR_RNDN);
        mpfr_mul(r28148, r28147, r28147, MPFR_RNDN);
        mpfr_sub(r28149, r28148, r28137, MPFR_RNDN);
        return mpfr_get_d(r28149, MPFR_RNDN);
}

static mpfr_t r28150, r28151, r28152, r28153, r28154, r28155, r28156, r28157, r28158, r28159, r28160, r28161, r28162, r28163, r28164, r28165, r28166, r28167, r28168, r28169, r28170;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r28150);
        mpfr_init(r28151);
        mpfr_init(r28152);
        mpfr_init(r28153);
        mpfr_init(r28154);
        mpfr_init_set_str(r28155, "2", 10, MPFR_RNDN);
        mpfr_init(r28156);
        mpfr_init_set_str(r28157, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28158, "1", 10, MPFR_RNDN);
        mpfr_init(r28159);
        mpfr_init(r28160);
        mpfr_init_set_str(r28161, "3", 10, MPFR_RNDN);
        mpfr_init(r28162);
        mpfr_init(r28163);
        mpfr_init(r28164);
        mpfr_init(r28165);
        mpfr_init(r28166);
        mpfr_init(r28167);
        mpfr_init(r28168);
        mpfr_init(r28169);
        mpfr_init(r28170);
}

double f_dm(double a, double b) {
        mpfr_set_d(r28150, a, MPFR_RNDN);
        mpfr_mul(r28151, r28150, r28150, MPFR_RNDN);
        mpfr_set_d(r28152, b, MPFR_RNDN);
        mpfr_mul(r28153, r28152, r28152, MPFR_RNDN);
        mpfr_add(r28154, r28151, r28153, MPFR_RNDN);
        ;
        mpfr_pow(r28156, r28154, r28155, MPFR_RNDN);
        ;
        ;
        mpfr_add(r28159, r28158, r28150, MPFR_RNDN);
        mpfr_mul(r28160, r28151, r28159, MPFR_RNDN);
        ;
        mpfr_mul(r28162, r28161, r28150, MPFR_RNDN);
        mpfr_sub(r28163, r28158, r28162, MPFR_RNDN);
        mpfr_mul(r28164, r28153, r28163, MPFR_RNDN);
        mpfr_add(r28165, r28160, r28164, MPFR_RNDN);
        mpfr_mul(r28166, r28157, r28165, MPFR_RNDN);
        mpfr_add(r28167, r28156, r28166, MPFR_RNDN);
        mpfr_sqrt(r28168, r28167, MPFR_RNDN);
        mpfr_mul(r28169, r28168, r28168, MPFR_RNDN);
        mpfr_sub(r28170, r28169, r28158, MPFR_RNDN);
        return mpfr_get_d(r28170, MPFR_RNDN);
}

