#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 r27245 = a;
        float r27246 = r27245 * r27245;
        float r27247 = b;
        float r27248 = r27247 * r27247;
        float r27249 = r27246 + r27248;
        float r27250 = 2;
        float r27251 = pow(r27249, r27250);
        float r27252 = 4;
        float r27253 = 1;
        float r27254 = r27253 + r27245;
        float r27255 = r27246 * r27254;
        float r27256 = 3;
        float r27257 = r27256 * r27245;
        float r27258 = r27253 - r27257;
        float r27259 = r27248 * r27258;
        float r27260 = r27255 + r27259;
        float r27261 = r27252 * r27260;
        float r27262 = r27251 + r27261;
        float r27263 = r27262 - r27253;
        return r27263;
}

double f_id(double a, double b) {
        double r27264 = a;
        double r27265 = r27264 * r27264;
        double r27266 = b;
        double r27267 = r27266 * r27266;
        double r27268 = r27265 + r27267;
        double r27269 = 2;
        double r27270 = pow(r27268, r27269);
        double r27271 = 4;
        double r27272 = 1;
        double r27273 = r27272 + r27264;
        double r27274 = r27265 * r27273;
        double r27275 = 3;
        double r27276 = r27275 * r27264;
        double r27277 = r27272 - r27276;
        double r27278 = r27267 * r27277;
        double r27279 = r27274 + r27278;
        double r27280 = r27271 * r27279;
        double r27281 = r27270 + r27280;
        double r27282 = r27281 - r27272;
        return r27282;
}


double f_of(float a, float b) {
        float r27283 = a;
        float r27284 = r27283 * r27283;
        float r27285 = b;
        float r27286 = r27285 * r27285;
        float r27287 = r27284 + r27286;
        float r27288 = 2;
        float r27289 = pow(r27287, r27288);
        float r27290 = 4;
        float r27291 = 1;
        float r27292 = r27291 + r27283;
        float r27293 = r27284 * r27292;
        float r27294 = 3;
        float r27295 = r27294 * r27283;
        float r27296 = r27291 - r27295;
        float r27297 = r27286 * r27296;
        float r27298 = r27293 + r27297;
        float r27299 = r27290 * r27298;
        float r27300 = r27289 + r27299;
        float r27301 = sqrt(r27300);
        float r27302 = r27301 * r27301;
        float r27303 = r27302 - r27291;
        return r27303;
}

double f_od(double a, double b) {
        double r27304 = a;
        double r27305 = r27304 * r27304;
        double r27306 = b;
        double r27307 = r27306 * r27306;
        double r27308 = r27305 + r27307;
        double r27309 = 2;
        double r27310 = pow(r27308, r27309);
        double r27311 = 4;
        double r27312 = 1;
        double r27313 = r27312 + r27304;
        double r27314 = r27305 * r27313;
        double r27315 = 3;
        double r27316 = r27315 * r27304;
        double r27317 = r27312 - r27316;
        double r27318 = r27307 * r27317;
        double r27319 = r27314 + r27318;
        double r27320 = r27311 * r27319;
        double r27321 = r27310 + r27320;
        double r27322 = sqrt(r27321);
        double r27323 = r27322 * r27322;
        double r27324 = r27323 - r27312;
        return r27324;
}

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 r27325, r27326, r27327, r27328, r27329, r27330, r27331, r27332, r27333, r27334, r27335, r27336, r27337, r27338, r27339, r27340, r27341, r27342, r27343;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r27325);
        mpfr_init(r27326);
        mpfr_init(r27327);
        mpfr_init(r27328);
        mpfr_init(r27329);
        mpfr_init_set_str(r27330, "2", 10, MPFR_RNDN);
        mpfr_init(r27331);
        mpfr_init_set_str(r27332, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27333, "1", 10, MPFR_RNDN);
        mpfr_init(r27334);
        mpfr_init(r27335);
        mpfr_init_set_str(r27336, "3", 10, MPFR_RNDN);
        mpfr_init(r27337);
        mpfr_init(r27338);
        mpfr_init(r27339);
        mpfr_init(r27340);
        mpfr_init(r27341);
        mpfr_init(r27342);
        mpfr_init(r27343);
}

double f_im(double a, double b) {
        mpfr_set_d(r27325, a, MPFR_RNDN);
        mpfr_mul(r27326, r27325, r27325, MPFR_RNDN);
        mpfr_set_d(r27327, b, MPFR_RNDN);
        mpfr_mul(r27328, r27327, r27327, MPFR_RNDN);
        mpfr_add(r27329, r27326, r27328, MPFR_RNDN);
        ;
        mpfr_pow(r27331, r27329, r27330, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27334, r27333, r27325, MPFR_RNDN);
        mpfr_mul(r27335, r27326, r27334, MPFR_RNDN);
        ;
        mpfr_mul(r27337, r27336, r27325, MPFR_RNDN);
        mpfr_sub(r27338, r27333, r27337, MPFR_RNDN);
        mpfr_mul(r27339, r27328, r27338, MPFR_RNDN);
        mpfr_add(r27340, r27335, r27339, MPFR_RNDN);
        mpfr_mul(r27341, r27332, r27340, MPFR_RNDN);
        mpfr_add(r27342, r27331, r27341, MPFR_RNDN);
        mpfr_sub(r27343, r27342, r27333, MPFR_RNDN);
        return mpfr_get_d(r27343, MPFR_RNDN);
}

static mpfr_t r27344, r27345, r27346, r27347, r27348, r27349, r27350, r27351, r27352, r27353, r27354, r27355, r27356, r27357, r27358, r27359, r27360, r27361, r27362, r27363, r27364;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27344);
        mpfr_init(r27345);
        mpfr_init(r27346);
        mpfr_init(r27347);
        mpfr_init(r27348);
        mpfr_init_set_str(r27349, "2", 10, MPFR_RNDN);
        mpfr_init(r27350);
        mpfr_init_set_str(r27351, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27352, "1", 10, MPFR_RNDN);
        mpfr_init(r27353);
        mpfr_init(r27354);
        mpfr_init_set_str(r27355, "3", 10, MPFR_RNDN);
        mpfr_init(r27356);
        mpfr_init(r27357);
        mpfr_init(r27358);
        mpfr_init(r27359);
        mpfr_init(r27360);
        mpfr_init(r27361);
        mpfr_init(r27362);
        mpfr_init(r27363);
        mpfr_init(r27364);
}

double f_fm(double a, double b) {
        mpfr_set_d(r27344, a, MPFR_RNDN);
        mpfr_mul(r27345, r27344, r27344, MPFR_RNDN);
        mpfr_set_d(r27346, b, MPFR_RNDN);
        mpfr_mul(r27347, r27346, r27346, MPFR_RNDN);
        mpfr_add(r27348, r27345, r27347, MPFR_RNDN);
        ;
        mpfr_pow(r27350, r27348, r27349, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27353, r27352, r27344, MPFR_RNDN);
        mpfr_mul(r27354, r27345, r27353, MPFR_RNDN);
        ;
        mpfr_mul(r27356, r27355, r27344, MPFR_RNDN);
        mpfr_sub(r27357, r27352, r27356, MPFR_RNDN);
        mpfr_mul(r27358, r27347, r27357, MPFR_RNDN);
        mpfr_add(r27359, r27354, r27358, MPFR_RNDN);
        mpfr_mul(r27360, r27351, r27359, MPFR_RNDN);
        mpfr_add(r27361, r27350, r27360, MPFR_RNDN);
        mpfr_sqrt(r27362, r27361, MPFR_RNDN);
        mpfr_mul(r27363, r27362, r27362, MPFR_RNDN);
        mpfr_sub(r27364, r27363, r27352, MPFR_RNDN);
        return mpfr_get_d(r27364, MPFR_RNDN);
}

static mpfr_t r27365, r27366, r27367, r27368, r27369, r27370, r27371, r27372, r27373, r27374, r27375, r27376, r27377, r27378, r27379, r27380, r27381, r27382, r27383, r27384, r27385;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27365);
        mpfr_init(r27366);
        mpfr_init(r27367);
        mpfr_init(r27368);
        mpfr_init(r27369);
        mpfr_init_set_str(r27370, "2", 10, MPFR_RNDN);
        mpfr_init(r27371);
        mpfr_init_set_str(r27372, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27373, "1", 10, MPFR_RNDN);
        mpfr_init(r27374);
        mpfr_init(r27375);
        mpfr_init_set_str(r27376, "3", 10, MPFR_RNDN);
        mpfr_init(r27377);
        mpfr_init(r27378);
        mpfr_init(r27379);
        mpfr_init(r27380);
        mpfr_init(r27381);
        mpfr_init(r27382);
        mpfr_init(r27383);
        mpfr_init(r27384);
        mpfr_init(r27385);
}

double f_dm(double a, double b) {
        mpfr_set_d(r27365, a, MPFR_RNDN);
        mpfr_mul(r27366, r27365, r27365, MPFR_RNDN);
        mpfr_set_d(r27367, b, MPFR_RNDN);
        mpfr_mul(r27368, r27367, r27367, MPFR_RNDN);
        mpfr_add(r27369, r27366, r27368, MPFR_RNDN);
        ;
        mpfr_pow(r27371, r27369, r27370, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27374, r27373, r27365, MPFR_RNDN);
        mpfr_mul(r27375, r27366, r27374, MPFR_RNDN);
        ;
        mpfr_mul(r27377, r27376, r27365, MPFR_RNDN);
        mpfr_sub(r27378, r27373, r27377, MPFR_RNDN);
        mpfr_mul(r27379, r27368, r27378, MPFR_RNDN);
        mpfr_add(r27380, r27375, r27379, MPFR_RNDN);
        mpfr_mul(r27381, r27372, r27380, MPFR_RNDN);
        mpfr_add(r27382, r27371, r27381, MPFR_RNDN);
        mpfr_sqrt(r27383, r27382, MPFR_RNDN);
        mpfr_mul(r27384, r27383, r27383, MPFR_RNDN);
        mpfr_sub(r27385, r27384, r27373, MPFR_RNDN);
        return mpfr_get_d(r27385, MPFR_RNDN);
}

