#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 r11289 = a;
        float r11290 = r11289 * r11289;
        float r11291 = b;
        float r11292 = r11291 * r11291;
        float r11293 = r11290 + r11292;
        float r11294 = 2.0f;
        float r11295 = pow(r11293, r11294);
        float r11296 = 4.0f;
        float r11297 = 1.0f;
        float r11298 = r11297 + r11289;
        float r11299 = r11290 * r11298;
        float r11300 = 3.0f;
        float r11301 = r11300 * r11289;
        float r11302 = r11297 - r11301;
        float r11303 = r11292 * r11302;
        float r11304 = r11299 + r11303;
        float r11305 = r11296 * r11304;
        float r11306 = r11295 + r11305;
        float r11307 = r11306 - r11297;
        return r11307;
}

double f_id(double a, double b) {
        double r11308 = a;
        double r11309 = r11308 * r11308;
        double r11310 = b;
        double r11311 = r11310 * r11310;
        double r11312 = r11309 + r11311;
        double r11313 = 2.0;
        double r11314 = pow(r11312, r11313);
        double r11315 = 4.0;
        double r11316 = 1.0;
        double r11317 = r11316 + r11308;
        double r11318 = r11309 * r11317;
        double r11319 = 3.0;
        double r11320 = r11319 * r11308;
        double r11321 = r11316 - r11320;
        double r11322 = r11311 * r11321;
        double r11323 = r11318 + r11322;
        double r11324 = r11315 * r11323;
        double r11325 = r11314 + r11324;
        double r11326 = r11325 - r11316;
        return r11326;
}


double f_of(float a, float b) {
        float r11327 = a;
        float r11328 = r11327 * r11327;
        float r11329 = b;
        float r11330 = r11329 * r11329;
        float r11331 = r11328 + r11330;
        float r11332 = 2.0f;
        float r11333 = pow(r11331, r11332);
        float r11334 = 1.0f;
        float r11335 = r11327 + r11334;
        float r11336 = r11328 * r11335;
        float r11337 = 3.0f;
        float r11338 = r11337 * r11327;
        float r11339 = r11334 - r11338;
        float r11340 = r11330 * r11339;
        float r11341 = r11336 + r11340;
        float r11342 = 4.0f;
        float r11343 = r11341 * r11342;
        float r11344 = r11333 + r11343;
        float r11345 = r11344 - r11334;
        return r11345;
}

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

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 r11365, r11366, r11367, r11368, r11369, r11370, r11371, r11372, r11373, r11374, r11375, r11376, r11377, r11378, r11379, r11380, r11381, r11382, r11383;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r11365);
        mpfr_init(r11366);
        mpfr_init(r11367);
        mpfr_init(r11368);
        mpfr_init(r11369);
        mpfr_init_set_str(r11370, "2", 10, MPFR_RNDN);
        mpfr_init(r11371);
        mpfr_init_set_str(r11372, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11373, "1", 10, MPFR_RNDN);
        mpfr_init(r11374);
        mpfr_init(r11375);
        mpfr_init_set_str(r11376, "3", 10, MPFR_RNDN);
        mpfr_init(r11377);
        mpfr_init(r11378);
        mpfr_init(r11379);
        mpfr_init(r11380);
        mpfr_init(r11381);
        mpfr_init(r11382);
        mpfr_init(r11383);
}

double f_im(double a, double b) {
        mpfr_set_d(r11365, a, MPFR_RNDN);
        mpfr_mul(r11366, r11365, r11365, MPFR_RNDN);
        mpfr_set_d(r11367, b, MPFR_RNDN);
        mpfr_mul(r11368, r11367, r11367, MPFR_RNDN);
        mpfr_add(r11369, r11366, r11368, MPFR_RNDN);
        ;
        mpfr_pow(r11371, r11369, r11370, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11374, r11373, r11365, MPFR_RNDN);
        mpfr_mul(r11375, r11366, r11374, MPFR_RNDN);
        ;
        mpfr_mul(r11377, r11376, r11365, MPFR_RNDN);
        mpfr_sub(r11378, r11373, r11377, MPFR_RNDN);
        mpfr_mul(r11379, r11368, r11378, MPFR_RNDN);
        mpfr_add(r11380, r11375, r11379, MPFR_RNDN);
        mpfr_mul(r11381, r11372, r11380, MPFR_RNDN);
        mpfr_add(r11382, r11371, r11381, MPFR_RNDN);
        mpfr_sub(r11383, r11382, r11373, MPFR_RNDN);
        return mpfr_get_d(r11383, MPFR_RNDN);
}

static mpfr_t r11384, r11385, r11386, r11387, r11388, r11389, r11390, r11391, r11392, r11393, r11394, r11395, r11396, r11397, r11398, r11399, r11400, r11401, r11402;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r11384);
        mpfr_init(r11385);
        mpfr_init(r11386);
        mpfr_init(r11387);
        mpfr_init(r11388);
        mpfr_init_set_str(r11389, "2", 10, MPFR_RNDN);
        mpfr_init(r11390);
        mpfr_init_set_str(r11391, "1", 10, MPFR_RNDN);
        mpfr_init(r11392);
        mpfr_init(r11393);
        mpfr_init_set_str(r11394, "3", 10, MPFR_RNDN);
        mpfr_init(r11395);
        mpfr_init(r11396);
        mpfr_init(r11397);
        mpfr_init(r11398);
        mpfr_init_set_str(r11399, "4", 10, MPFR_RNDN);
        mpfr_init(r11400);
        mpfr_init(r11401);
        mpfr_init(r11402);
}

double f_fm(double a, double b) {
        mpfr_set_d(r11384, a, MPFR_RNDN);
        mpfr_mul(r11385, r11384, r11384, MPFR_RNDN);
        mpfr_set_d(r11386, b, MPFR_RNDN);
        mpfr_mul(r11387, r11386, r11386, MPFR_RNDN);
        mpfr_add(r11388, r11385, r11387, MPFR_RNDN);
        ;
        mpfr_pow(r11390, r11388, r11389, MPFR_RNDN);
        ;
        mpfr_add(r11392, r11384, r11391, MPFR_RNDN);
        mpfr_mul(r11393, r11385, r11392, MPFR_RNDN);
        ;
        mpfr_mul(r11395, r11394, r11384, MPFR_RNDN);
        mpfr_sub(r11396, r11391, r11395, MPFR_RNDN);
        mpfr_mul(r11397, r11387, r11396, MPFR_RNDN);
        mpfr_add(r11398, r11393, r11397, MPFR_RNDN);
        ;
        mpfr_mul(r11400, r11398, r11399, MPFR_RNDN);
        mpfr_add(r11401, r11390, r11400, MPFR_RNDN);
        mpfr_sub(r11402, r11401, r11391, MPFR_RNDN);
        return mpfr_get_d(r11402, MPFR_RNDN);
}

static mpfr_t r11403, r11404, r11405, r11406, r11407, r11408, r11409, r11410, r11411, r11412, r11413, r11414, r11415, r11416, r11417, r11418, r11419, r11420, r11421;

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

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

