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

double f_id(double a, double b) {
        double r36303 = a;
        double r36304 = r36303 * r36303;
        double r36305 = b;
        double r36306 = r36305 * r36305;
        double r36307 = r36304 + r36306;
        double r36308 = 2;
        double r36309 = pow(r36307, r36308);
        double r36310 = 4;
        double r36311 = 1;
        double r36312 = r36311 - r36303;
        double r36313 = r36304 * r36312;
        double r36314 = 3;
        double r36315 = r36314 + r36303;
        double r36316 = r36306 * r36315;
        double r36317 = r36313 + r36316;
        double r36318 = r36310 * r36317;
        double r36319 = r36309 + r36318;
        double r36320 = r36319 - r36311;
        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 = r36324 * r36333;
        float r36335 = r36331 + r36334;
        float r36336 = r36328 * r36335;
        float r36337 = r36327 + r36336;
        float r36338 = r36337 - r36329;
        return r36338;
}

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

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

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

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

static mpfr_t r36375, r36376, r36377, r36378, r36379, r36380, r36381, r36382, r36383, r36384, r36385, r36386, r36387, r36388, r36389, r36390, r36391, r36392;

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

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

static mpfr_t r36393, r36394, r36395, r36396, r36397, r36398, r36399, r36400, r36401, r36402, r36403, r36404, r36405, r36406, r36407, r36408, r36409, r36410;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36393);
        mpfr_init(r36394);
        mpfr_init(r36395);
        mpfr_init(r36396);
        mpfr_init(r36397);
        mpfr_init_set_str(r36398, "2", 10, MPFR_RNDN);
        mpfr_init(r36399);
        mpfr_init_set_str(r36400, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36401, "1", 10, MPFR_RNDN);
        mpfr_init(r36402);
        mpfr_init(r36403);
        mpfr_init_set_str(r36404, "3", 10, MPFR_RNDN);
        mpfr_init(r36405);
        mpfr_init(r36406);
        mpfr_init(r36407);
        mpfr_init(r36408);
        mpfr_init(r36409);
        mpfr_init(r36410);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36393, a, MPFR_RNDN);
        mpfr_mul(r36394, r36393, r36393, MPFR_RNDN);
        mpfr_set_d(r36395, b, MPFR_RNDN);
        mpfr_mul(r36396, r36395, r36395, MPFR_RNDN);
        mpfr_add(r36397, r36394, r36396, MPFR_RNDN);
        ;
        mpfr_pow(r36399, r36397, r36398, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36402, r36401, r36393, MPFR_RNDN);
        mpfr_mul(r36403, r36394, r36402, MPFR_RNDN);
        ;
        mpfr_add(r36405, r36404, r36393, MPFR_RNDN);
        mpfr_mul(r36406, r36396, r36405, MPFR_RNDN);
        mpfr_add(r36407, r36403, r36406, MPFR_RNDN);
        mpfr_mul(r36408, r36400, r36407, MPFR_RNDN);
        mpfr_add(r36409, r36399, r36408, MPFR_RNDN);
        mpfr_sub(r36410, r36409, r36401, MPFR_RNDN);
        return mpfr_get_d(r36410, MPFR_RNDN);
}

