#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 r11328 = a;
        float r11329 = r11328 * r11328;
        float r11330 = b;
        float r11331 = r11330 * r11330;
        float r11332 = r11329 + r11331;
        float r11333 = 2.0f;
        float r11334 = pow(r11332, r11333);
        float r11335 = 4.0f;
        float r11336 = 1.0f;
        float r11337 = r11336 + r11328;
        float r11338 = r11329 * r11337;
        float r11339 = 3.0f;
        float r11340 = r11339 * r11328;
        float r11341 = r11336 - r11340;
        float r11342 = r11331 * r11341;
        float r11343 = r11338 + r11342;
        float r11344 = r11335 * r11343;
        float r11345 = r11334 + r11344;
        float r11346 = r11345 - r11336;
        return r11346;
}

double f_id(double a, double b) {
        double r11347 = a;
        double r11348 = r11347 * r11347;
        double r11349 = b;
        double r11350 = r11349 * r11349;
        double r11351 = r11348 + r11350;
        double r11352 = 2.0;
        double r11353 = pow(r11351, r11352);
        double r11354 = 4.0;
        double r11355 = 1.0;
        double r11356 = r11355 + r11347;
        double r11357 = r11348 * r11356;
        double r11358 = 3.0;
        double r11359 = r11358 * r11347;
        double r11360 = r11355 - r11359;
        double r11361 = r11350 * r11360;
        double r11362 = r11357 + r11361;
        double r11363 = r11354 * r11362;
        double r11364 = r11353 + r11363;
        double r11365 = r11364 - r11355;
        return r11365;
}


double f_of(float a, float b) {
        float r11366 = a;
        float r11367 = r11366 * r11366;
        float r11368 = b;
        float r11369 = r11368 * r11368;
        float r11370 = r11367 + r11369;
        float r11371 = 2.0f;
        float r11372 = pow(r11370, r11371);
        float r11373 = 1.0f;
        float r11374 = r11366 + r11373;
        float r11375 = r11367 * r11374;
        float r11376 = 3.0f;
        float r11377 = r11376 * r11366;
        float r11378 = r11373 - r11377;
        float r11379 = r11369 * r11378;
        float r11380 = r11375 + r11379;
        float r11381 = 4.0f;
        float r11382 = r11380 * r11381;
        float r11383 = r11372 + r11382;
        float r11384 = r11383 - r11373;
        return r11384;
}

double f_od(double a, double b) {
        double r11385 = a;
        double r11386 = r11385 * r11385;
        double r11387 = b;
        double r11388 = r11387 * r11387;
        double r11389 = r11386 + r11388;
        double r11390 = 2.0;
        double r11391 = pow(r11389, r11390);
        double r11392 = 1.0;
        double r11393 = r11385 + r11392;
        double r11394 = r11386 * r11393;
        double r11395 = 3.0;
        double r11396 = r11395 * r11385;
        double r11397 = r11392 - r11396;
        double r11398 = r11388 * r11397;
        double r11399 = r11394 + r11398;
        double r11400 = 4.0;
        double r11401 = r11399 * r11400;
        double r11402 = r11391 + r11401;
        double r11403 = r11402 - r11392;
        return r11403;
}

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 r11404, r11405, r11406, r11407, r11408, r11409, r11410, r11411, r11412, r11413, r11414, r11415, r11416, r11417, r11418, r11419, r11420, r11421, r11422;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r11404);
        mpfr_init(r11405);
        mpfr_init(r11406);
        mpfr_init(r11407);
        mpfr_init(r11408);
        mpfr_init_set_str(r11409, "2", 10, MPFR_RNDN);
        mpfr_init(r11410);
        mpfr_init_set_str(r11411, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11412, "1", 10, MPFR_RNDN);
        mpfr_init(r11413);
        mpfr_init(r11414);
        mpfr_init_set_str(r11415, "3", 10, MPFR_RNDN);
        mpfr_init(r11416);
        mpfr_init(r11417);
        mpfr_init(r11418);
        mpfr_init(r11419);
        mpfr_init(r11420);
        mpfr_init(r11421);
        mpfr_init(r11422);
}

double f_im(double a, double b) {
        mpfr_set_d(r11404, a, MPFR_RNDN);
        mpfr_mul(r11405, r11404, r11404, MPFR_RNDN);
        mpfr_set_d(r11406, b, MPFR_RNDN);
        mpfr_mul(r11407, r11406, r11406, MPFR_RNDN);
        mpfr_add(r11408, r11405, r11407, MPFR_RNDN);
        ;
        mpfr_pow(r11410, r11408, r11409, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11413, r11412, r11404, MPFR_RNDN);
        mpfr_mul(r11414, r11405, r11413, MPFR_RNDN);
        ;
        mpfr_mul(r11416, r11415, r11404, MPFR_RNDN);
        mpfr_sub(r11417, r11412, r11416, MPFR_RNDN);
        mpfr_mul(r11418, r11407, r11417, MPFR_RNDN);
        mpfr_add(r11419, r11414, r11418, MPFR_RNDN);
        mpfr_mul(r11420, r11411, r11419, MPFR_RNDN);
        mpfr_add(r11421, r11410, r11420, MPFR_RNDN);
        mpfr_sub(r11422, r11421, r11412, MPFR_RNDN);
        return mpfr_get_d(r11422, MPFR_RNDN);
}

static mpfr_t r11423, r11424, r11425, r11426, r11427, r11428, r11429, r11430, r11431, r11432, r11433, r11434, r11435, r11436, r11437, r11438, r11439, r11440, r11441;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r11423);
        mpfr_init(r11424);
        mpfr_init(r11425);
        mpfr_init(r11426);
        mpfr_init(r11427);
        mpfr_init_set_str(r11428, "2", 10, MPFR_RNDN);
        mpfr_init(r11429);
        mpfr_init_set_str(r11430, "1", 10, MPFR_RNDN);
        mpfr_init(r11431);
        mpfr_init(r11432);
        mpfr_init_set_str(r11433, "3", 10, MPFR_RNDN);
        mpfr_init(r11434);
        mpfr_init(r11435);
        mpfr_init(r11436);
        mpfr_init(r11437);
        mpfr_init_set_str(r11438, "4", 10, MPFR_RNDN);
        mpfr_init(r11439);
        mpfr_init(r11440);
        mpfr_init(r11441);
}

double f_fm(double a, double b) {
        mpfr_set_d(r11423, a, MPFR_RNDN);
        mpfr_mul(r11424, r11423, r11423, MPFR_RNDN);
        mpfr_set_d(r11425, b, MPFR_RNDN);
        mpfr_mul(r11426, r11425, r11425, MPFR_RNDN);
        mpfr_add(r11427, r11424, r11426, MPFR_RNDN);
        ;
        mpfr_pow(r11429, r11427, r11428, MPFR_RNDN);
        ;
        mpfr_add(r11431, r11423, r11430, MPFR_RNDN);
        mpfr_mul(r11432, r11424, r11431, MPFR_RNDN);
        ;
        mpfr_mul(r11434, r11433, r11423, MPFR_RNDN);
        mpfr_sub(r11435, r11430, r11434, MPFR_RNDN);
        mpfr_mul(r11436, r11426, r11435, MPFR_RNDN);
        mpfr_add(r11437, r11432, r11436, MPFR_RNDN);
        ;
        mpfr_mul(r11439, r11437, r11438, MPFR_RNDN);
        mpfr_add(r11440, r11429, r11439, MPFR_RNDN);
        mpfr_sub(r11441, r11440, r11430, MPFR_RNDN);
        return mpfr_get_d(r11441, MPFR_RNDN);
}

static mpfr_t r11442, r11443, r11444, r11445, r11446, r11447, r11448, r11449, r11450, r11451, r11452, r11453, r11454, r11455, r11456, r11457, r11458, r11459, r11460;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r11442);
        mpfr_init(r11443);
        mpfr_init(r11444);
        mpfr_init(r11445);
        mpfr_init(r11446);
        mpfr_init_set_str(r11447, "2", 10, MPFR_RNDN);
        mpfr_init(r11448);
        mpfr_init_set_str(r11449, "1", 10, MPFR_RNDN);
        mpfr_init(r11450);
        mpfr_init(r11451);
        mpfr_init_set_str(r11452, "3", 10, MPFR_RNDN);
        mpfr_init(r11453);
        mpfr_init(r11454);
        mpfr_init(r11455);
        mpfr_init(r11456);
        mpfr_init_set_str(r11457, "4", 10, MPFR_RNDN);
        mpfr_init(r11458);
        mpfr_init(r11459);
        mpfr_init(r11460);
}

double f_dm(double a, double b) {
        mpfr_set_d(r11442, a, MPFR_RNDN);
        mpfr_mul(r11443, r11442, r11442, MPFR_RNDN);
        mpfr_set_d(r11444, b, MPFR_RNDN);
        mpfr_mul(r11445, r11444, r11444, MPFR_RNDN);
        mpfr_add(r11446, r11443, r11445, MPFR_RNDN);
        ;
        mpfr_pow(r11448, r11446, r11447, MPFR_RNDN);
        ;
        mpfr_add(r11450, r11442, r11449, MPFR_RNDN);
        mpfr_mul(r11451, r11443, r11450, MPFR_RNDN);
        ;
        mpfr_mul(r11453, r11452, r11442, MPFR_RNDN);
        mpfr_sub(r11454, r11449, r11453, MPFR_RNDN);
        mpfr_mul(r11455, r11445, r11454, MPFR_RNDN);
        mpfr_add(r11456, r11451, r11455, MPFR_RNDN);
        ;
        mpfr_mul(r11458, r11456, r11457, MPFR_RNDN);
        mpfr_add(r11459, r11448, r11458, MPFR_RNDN);
        mpfr_sub(r11460, r11459, r11449, MPFR_RNDN);
        return mpfr_get_d(r11460, MPFR_RNDN);
}

