#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 r36283 = a;
        float r36284 = r36283 * r36283;
        float r36285 = b;
        float r36286 = r36285 * r36285;
        float r36287 = r36284 + r36286;
        float r36288 = 2;
        float r36289 = pow(r36287, r36288);
        float r36290 = 4;
        float r36291 = 1;
        float r36292 = r36291 + r36283;
        float r36293 = r36284 * r36292;
        float r36294 = 3;
        float r36295 = r36294 * r36283;
        float r36296 = r36291 - r36295;
        float r36297 = r36286 * r36296;
        float r36298 = r36293 + r36297;
        float r36299 = r36290 * r36298;
        float r36300 = r36289 + r36299;
        float r36301 = r36300 - r36291;
        return r36301;
}

double f_id(double a, double b) {
        double r36302 = a;
        double r36303 = r36302 * r36302;
        double r36304 = b;
        double r36305 = r36304 * r36304;
        double r36306 = r36303 + r36305;
        double r36307 = 2;
        double r36308 = pow(r36306, r36307);
        double r36309 = 4;
        double r36310 = 1;
        double r36311 = r36310 + r36302;
        double r36312 = r36303 * r36311;
        double r36313 = 3;
        double r36314 = r36313 * r36302;
        double r36315 = r36310 - r36314;
        double r36316 = r36305 * r36315;
        double r36317 = r36312 + r36316;
        double r36318 = r36309 * r36317;
        double r36319 = r36308 + r36318;
        double r36320 = r36319 - r36310;
        return r36320;
}


double f_of(float a, float b) {
        float r36321 = a;
        float r36322 = r36321 * r36321;
        float r36323 = b;
        float r36324 = r36323 * r36323;
        float r36325 = r36322 + r36324;
        float r36326 = 2;
        float r36327 = pow(r36325, r36326);
        float r36328 = 4;
        float r36329 = 1;
        float r36330 = r36329 + r36321;
        float r36331 = r36322 * r36330;
        float r36332 = 3;
        float r36333 = r36332 * r36321;
        float r36334 = r36329 - r36333;
        float r36335 = r36324 * r36334;
        float r36336 = r36331 + r36335;
        float r36337 = r36328 * r36336;
        float r36338 = r36327 + r36337;
        float r36339 = r36338 - r36329;
        return r36339;
}

double f_od(double a, double b) {
        double r36340 = a;
        double r36341 = r36340 * r36340;
        double r36342 = b;
        double r36343 = r36342 * r36342;
        double r36344 = r36341 + r36343;
        double r36345 = 2;
        double r36346 = pow(r36344, r36345);
        double r36347 = 4;
        double r36348 = 1;
        double r36349 = r36348 + r36340;
        double r36350 = r36341 * r36349;
        double r36351 = 3;
        double r36352 = r36351 * r36340;
        double r36353 = r36348 - r36352;
        double r36354 = r36343 * r36353;
        double r36355 = r36350 + r36354;
        double r36356 = r36347 * r36355;
        double r36357 = r36346 + r36356;
        double r36358 = r36357 - r36348;
        return r36358;
}

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 r36359, r36360, r36361, r36362, r36363, r36364, r36365, r36366, r36367, r36368, r36369, r36370, r36371, r36372, r36373, r36374, r36375, r36376, r36377;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36359);
        mpfr_init(r36360);
        mpfr_init(r36361);
        mpfr_init(r36362);
        mpfr_init(r36363);
        mpfr_init_set_str(r36364, "2", 10, MPFR_RNDN);
        mpfr_init(r36365);
        mpfr_init_set_str(r36366, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36367, "1", 10, MPFR_RNDN);
        mpfr_init(r36368);
        mpfr_init(r36369);
        mpfr_init_set_str(r36370, "3", 10, MPFR_RNDN);
        mpfr_init(r36371);
        mpfr_init(r36372);
        mpfr_init(r36373);
        mpfr_init(r36374);
        mpfr_init(r36375);
        mpfr_init(r36376);
        mpfr_init(r36377);
}

double f_im(double a, double b) {
        mpfr_set_d(r36359, a, MPFR_RNDN);
        mpfr_mul(r36360, r36359, r36359, MPFR_RNDN);
        mpfr_set_d(r36361, b, MPFR_RNDN);
        mpfr_mul(r36362, r36361, r36361, MPFR_RNDN);
        mpfr_add(r36363, r36360, r36362, MPFR_RNDN);
        ;
        mpfr_pow(r36365, r36363, r36364, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36368, r36367, r36359, MPFR_RNDN);
        mpfr_mul(r36369, r36360, r36368, MPFR_RNDN);
        ;
        mpfr_mul(r36371, r36370, r36359, MPFR_RNDN);
        mpfr_sub(r36372, r36367, r36371, MPFR_RNDN);
        mpfr_mul(r36373, r36362, r36372, MPFR_RNDN);
        mpfr_add(r36374, r36369, r36373, MPFR_RNDN);
        mpfr_mul(r36375, r36366, r36374, MPFR_RNDN);
        mpfr_add(r36376, r36365, r36375, MPFR_RNDN);
        mpfr_sub(r36377, r36376, r36367, MPFR_RNDN);
        return mpfr_get_d(r36377, MPFR_RNDN);
}

static mpfr_t r36378, r36379, r36380, r36381, r36382, r36383, r36384, r36385, r36386, r36387, r36388, r36389, r36390, r36391, r36392, r36393, r36394, r36395, r36396;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36378);
        mpfr_init(r36379);
        mpfr_init(r36380);
        mpfr_init(r36381);
        mpfr_init(r36382);
        mpfr_init_set_str(r36383, "2", 10, MPFR_RNDN);
        mpfr_init(r36384);
        mpfr_init_set_str(r36385, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36386, "1", 10, MPFR_RNDN);
        mpfr_init(r36387);
        mpfr_init(r36388);
        mpfr_init_set_str(r36389, "3", 10, MPFR_RNDN);
        mpfr_init(r36390);
        mpfr_init(r36391);
        mpfr_init(r36392);
        mpfr_init(r36393);
        mpfr_init(r36394);
        mpfr_init(r36395);
        mpfr_init(r36396);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36378, a, MPFR_RNDN);
        mpfr_mul(r36379, r36378, r36378, MPFR_RNDN);
        mpfr_set_d(r36380, b, MPFR_RNDN);
        mpfr_mul(r36381, r36380, r36380, MPFR_RNDN);
        mpfr_add(r36382, r36379, r36381, MPFR_RNDN);
        ;
        mpfr_pow(r36384, r36382, r36383, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36387, r36386, r36378, MPFR_RNDN);
        mpfr_mul(r36388, r36379, r36387, MPFR_RNDN);
        ;
        mpfr_mul(r36390, r36389, r36378, MPFR_RNDN);
        mpfr_sub(r36391, r36386, r36390, MPFR_RNDN);
        mpfr_mul(r36392, r36381, r36391, MPFR_RNDN);
        mpfr_add(r36393, r36388, r36392, MPFR_RNDN);
        mpfr_mul(r36394, r36385, r36393, MPFR_RNDN);
        mpfr_add(r36395, r36384, r36394, MPFR_RNDN);
        mpfr_sub(r36396, r36395, r36386, MPFR_RNDN);
        return mpfr_get_d(r36396, MPFR_RNDN);
}

static mpfr_t r36397, r36398, r36399, r36400, r36401, r36402, r36403, r36404, r36405, r36406, r36407, r36408, r36409, r36410, r36411, r36412, r36413, r36414, r36415;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36397);
        mpfr_init(r36398);
        mpfr_init(r36399);
        mpfr_init(r36400);
        mpfr_init(r36401);
        mpfr_init_set_str(r36402, "2", 10, MPFR_RNDN);
        mpfr_init(r36403);
        mpfr_init_set_str(r36404, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36405, "1", 10, MPFR_RNDN);
        mpfr_init(r36406);
        mpfr_init(r36407);
        mpfr_init_set_str(r36408, "3", 10, MPFR_RNDN);
        mpfr_init(r36409);
        mpfr_init(r36410);
        mpfr_init(r36411);
        mpfr_init(r36412);
        mpfr_init(r36413);
        mpfr_init(r36414);
        mpfr_init(r36415);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36397, a, MPFR_RNDN);
        mpfr_mul(r36398, r36397, r36397, MPFR_RNDN);
        mpfr_set_d(r36399, b, MPFR_RNDN);
        mpfr_mul(r36400, r36399, r36399, MPFR_RNDN);
        mpfr_add(r36401, r36398, r36400, MPFR_RNDN);
        ;
        mpfr_pow(r36403, r36401, r36402, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36406, r36405, r36397, MPFR_RNDN);
        mpfr_mul(r36407, r36398, r36406, MPFR_RNDN);
        ;
        mpfr_mul(r36409, r36408, r36397, MPFR_RNDN);
        mpfr_sub(r36410, r36405, r36409, MPFR_RNDN);
        mpfr_mul(r36411, r36400, r36410, MPFR_RNDN);
        mpfr_add(r36412, r36407, r36411, MPFR_RNDN);
        mpfr_mul(r36413, r36404, r36412, MPFR_RNDN);
        mpfr_add(r36414, r36403, r36413, MPFR_RNDN);
        mpfr_sub(r36415, r36414, r36405, MPFR_RNDN);
        return mpfr_get_d(r36415, MPFR_RNDN);
}

