#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 r36207 = a;
        float r36208 = r36207 * r36207;
        float r36209 = b;
        float r36210 = r36209 * r36209;
        float r36211 = r36208 + r36210;
        float r36212 = 2;
        float r36213 = pow(r36211, r36212);
        float r36214 = 4;
        float r36215 = 1;
        float r36216 = r36215 - r36207;
        float r36217 = r36208 * r36216;
        float r36218 = 3;
        float r36219 = r36218 + r36207;
        float r36220 = r36210 * r36219;
        float r36221 = r36217 + r36220;
        float r36222 = r36214 * r36221;
        float r36223 = r36213 + r36222;
        float r36224 = r36223 - r36215;
        return r36224;
}

double f_id(double a, double b) {
        double r36225 = a;
        double r36226 = r36225 * r36225;
        double r36227 = b;
        double r36228 = r36227 * r36227;
        double r36229 = r36226 + r36228;
        double r36230 = 2;
        double r36231 = pow(r36229, r36230);
        double r36232 = 4;
        double r36233 = 1;
        double r36234 = r36233 - r36225;
        double r36235 = r36226 * r36234;
        double r36236 = 3;
        double r36237 = r36236 + r36225;
        double r36238 = r36228 * r36237;
        double r36239 = r36235 + r36238;
        double r36240 = r36232 * r36239;
        double r36241 = r36231 + r36240;
        double r36242 = r36241 - r36233;
        return r36242;
}


double f_of(float a, float b) {
        float r36243 = a;
        float r36244 = r36243 * r36243;
        float r36245 = b;
        float r36246 = r36245 * r36245;
        float r36247 = r36244 + r36246;
        float r36248 = 2;
        float r36249 = pow(r36247, r36248);
        float r36250 = 4;
        float r36251 = 1;
        float r36252 = r36251 - r36243;
        float r36253 = r36244 * r36252;
        float r36254 = 3;
        float r36255 = r36254 + r36243;
        float r36256 = r36246 * r36255;
        float r36257 = r36253 + r36256;
        float r36258 = r36250 * r36257;
        float r36259 = r36249 + r36258;
        float r36260 = r36259 - r36251;
        return r36260;
}

double f_od(double a, double b) {
        double r36261 = a;
        double r36262 = r36261 * r36261;
        double r36263 = b;
        double r36264 = r36263 * r36263;
        double r36265 = r36262 + r36264;
        double r36266 = 2;
        double r36267 = pow(r36265, r36266);
        double r36268 = 4;
        double r36269 = 1;
        double r36270 = r36269 - r36261;
        double r36271 = r36262 * r36270;
        double r36272 = 3;
        double r36273 = r36272 + r36261;
        double r36274 = r36264 * r36273;
        double r36275 = r36271 + r36274;
        double r36276 = r36268 * r36275;
        double r36277 = r36267 + r36276;
        double r36278 = r36277 - r36269;
        return r36278;
}

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 r36279, r36280, r36281, r36282, r36283, r36284, r36285, r36286, r36287, r36288, r36289, r36290, r36291, r36292, r36293, r36294, r36295, r36296;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36279);
        mpfr_init(r36280);
        mpfr_init(r36281);
        mpfr_init(r36282);
        mpfr_init(r36283);
        mpfr_init_set_str(r36284, "2", 10, MPFR_RNDN);
        mpfr_init(r36285);
        mpfr_init_set_str(r36286, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36287, "1", 10, MPFR_RNDN);
        mpfr_init(r36288);
        mpfr_init(r36289);
        mpfr_init_set_str(r36290, "3", 10, MPFR_RNDN);
        mpfr_init(r36291);
        mpfr_init(r36292);
        mpfr_init(r36293);
        mpfr_init(r36294);
        mpfr_init(r36295);
        mpfr_init(r36296);
}

double f_im(double a, double b) {
        mpfr_set_d(r36279, a, MPFR_RNDN);
        mpfr_mul(r36280, r36279, r36279, MPFR_RNDN);
        mpfr_set_d(r36281, b, MPFR_RNDN);
        mpfr_mul(r36282, r36281, r36281, MPFR_RNDN);
        mpfr_add(r36283, r36280, r36282, MPFR_RNDN);
        ;
        mpfr_pow(r36285, r36283, r36284, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36288, r36287, r36279, MPFR_RNDN);
        mpfr_mul(r36289, r36280, r36288, MPFR_RNDN);
        ;
        mpfr_add(r36291, r36290, r36279, MPFR_RNDN);
        mpfr_mul(r36292, r36282, r36291, MPFR_RNDN);
        mpfr_add(r36293, r36289, r36292, MPFR_RNDN);
        mpfr_mul(r36294, r36286, r36293, MPFR_RNDN);
        mpfr_add(r36295, r36285, r36294, MPFR_RNDN);
        mpfr_sub(r36296, r36295, r36287, MPFR_RNDN);
        return mpfr_get_d(r36296, MPFR_RNDN);
}

static mpfr_t r36297, r36298, r36299, r36300, r36301, r36302, r36303, r36304, r36305, r36306, r36307, r36308, r36309, r36310, r36311, r36312, r36313, r36314;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36297);
        mpfr_init(r36298);
        mpfr_init(r36299);
        mpfr_init(r36300);
        mpfr_init(r36301);
        mpfr_init_set_str(r36302, "2", 10, MPFR_RNDN);
        mpfr_init(r36303);
        mpfr_init_set_str(r36304, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36305, "1", 10, MPFR_RNDN);
        mpfr_init(r36306);
        mpfr_init(r36307);
        mpfr_init_set_str(r36308, "3", 10, MPFR_RNDN);
        mpfr_init(r36309);
        mpfr_init(r36310);
        mpfr_init(r36311);
        mpfr_init(r36312);
        mpfr_init(r36313);
        mpfr_init(r36314);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36297, a, MPFR_RNDN);
        mpfr_mul(r36298, r36297, r36297, MPFR_RNDN);
        mpfr_set_d(r36299, b, MPFR_RNDN);
        mpfr_mul(r36300, r36299, r36299, MPFR_RNDN);
        mpfr_add(r36301, r36298, r36300, MPFR_RNDN);
        ;
        mpfr_pow(r36303, r36301, r36302, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36306, r36305, r36297, MPFR_RNDN);
        mpfr_mul(r36307, r36298, r36306, MPFR_RNDN);
        ;
        mpfr_add(r36309, r36308, r36297, MPFR_RNDN);
        mpfr_mul(r36310, r36300, r36309, MPFR_RNDN);
        mpfr_add(r36311, r36307, r36310, MPFR_RNDN);
        mpfr_mul(r36312, r36304, r36311, MPFR_RNDN);
        mpfr_add(r36313, r36303, r36312, MPFR_RNDN);
        mpfr_sub(r36314, r36313, r36305, MPFR_RNDN);
        return mpfr_get_d(r36314, MPFR_RNDN);
}

static mpfr_t r36315, r36316, r36317, r36318, r36319, r36320, r36321, r36322, r36323, r36324, r36325, r36326, r36327, r36328, r36329, r36330, r36331, r36332;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36315);
        mpfr_init(r36316);
        mpfr_init(r36317);
        mpfr_init(r36318);
        mpfr_init(r36319);
        mpfr_init_set_str(r36320, "2", 10, MPFR_RNDN);
        mpfr_init(r36321);
        mpfr_init_set_str(r36322, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36323, "1", 10, MPFR_RNDN);
        mpfr_init(r36324);
        mpfr_init(r36325);
        mpfr_init_set_str(r36326, "3", 10, MPFR_RNDN);
        mpfr_init(r36327);
        mpfr_init(r36328);
        mpfr_init(r36329);
        mpfr_init(r36330);
        mpfr_init(r36331);
        mpfr_init(r36332);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36315, a, MPFR_RNDN);
        mpfr_mul(r36316, r36315, r36315, MPFR_RNDN);
        mpfr_set_d(r36317, b, MPFR_RNDN);
        mpfr_mul(r36318, r36317, r36317, MPFR_RNDN);
        mpfr_add(r36319, r36316, r36318, MPFR_RNDN);
        ;
        mpfr_pow(r36321, r36319, r36320, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36324, r36323, r36315, MPFR_RNDN);
        mpfr_mul(r36325, r36316, r36324, MPFR_RNDN);
        ;
        mpfr_add(r36327, r36326, r36315, MPFR_RNDN);
        mpfr_mul(r36328, r36318, r36327, MPFR_RNDN);
        mpfr_add(r36329, r36325, r36328, MPFR_RNDN);
        mpfr_mul(r36330, r36322, r36329, MPFR_RNDN);
        mpfr_add(r36331, r36321, r36330, MPFR_RNDN);
        mpfr_sub(r36332, r36331, r36323, MPFR_RNDN);
        return mpfr_get_d(r36332, MPFR_RNDN);
}

