#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 r11296 = a;
        float r11297 = r11296 * r11296;
        float r11298 = b;
        float r11299 = r11298 * r11298;
        float r11300 = r11297 + r11299;
        float r11301 = 2.0f;
        float r11302 = pow(r11300, r11301);
        float r11303 = 4.0f;
        float r11304 = 1.0f;
        float r11305 = r11304 + r11296;
        float r11306 = r11297 * r11305;
        float r11307 = 3.0f;
        float r11308 = r11307 * r11296;
        float r11309 = r11304 - r11308;
        float r11310 = r11299 * r11309;
        float r11311 = r11306 + r11310;
        float r11312 = r11303 * r11311;
        float r11313 = r11302 + r11312;
        float r11314 = r11313 - r11304;
        return r11314;
}

double f_id(double a, double b) {
        double r11315 = a;
        double r11316 = r11315 * r11315;
        double r11317 = b;
        double r11318 = r11317 * r11317;
        double r11319 = r11316 + r11318;
        double r11320 = 2.0;
        double r11321 = pow(r11319, r11320);
        double r11322 = 4.0;
        double r11323 = 1.0;
        double r11324 = r11323 + r11315;
        double r11325 = r11316 * r11324;
        double r11326 = 3.0;
        double r11327 = r11326 * r11315;
        double r11328 = r11323 - r11327;
        double r11329 = r11318 * r11328;
        double r11330 = r11325 + r11329;
        double r11331 = r11322 * r11330;
        double r11332 = r11321 + r11331;
        double r11333 = r11332 - r11323;
        return r11333;
}


double f_of(float a, float b) {
        float r11334 = a;
        float r11335 = r11334 * r11334;
        float r11336 = b;
        float r11337 = r11336 * r11336;
        float r11338 = r11335 + r11337;
        float r11339 = 2.0f;
        float r11340 = pow(r11338, r11339);
        float r11341 = 1.0f;
        float r11342 = r11334 + r11341;
        float r11343 = r11335 * r11342;
        float r11344 = 3.0f;
        float r11345 = r11344 * r11334;
        float r11346 = r11341 - r11345;
        float r11347 = r11337 * r11346;
        float r11348 = r11343 + r11347;
        float r11349 = 4.0f;
        float r11350 = r11348 * r11349;
        float r11351 = r11340 + r11350;
        float r11352 = r11351 - r11341;
        return r11352;
}

double f_od(double a, double b) {
        double r11353 = a;
        double r11354 = r11353 * r11353;
        double r11355 = b;
        double r11356 = r11355 * r11355;
        double r11357 = r11354 + r11356;
        double r11358 = 2.0;
        double r11359 = pow(r11357, r11358);
        double r11360 = 1.0;
        double r11361 = r11353 + r11360;
        double r11362 = r11354 * r11361;
        double r11363 = 3.0;
        double r11364 = r11363 * r11353;
        double r11365 = r11360 - r11364;
        double r11366 = r11356 * r11365;
        double r11367 = r11362 + r11366;
        double r11368 = 4.0;
        double r11369 = r11367 * r11368;
        double r11370 = r11359 + r11369;
        double r11371 = r11370 - r11360;
        return r11371;
}

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 r11372, r11373, r11374, r11375, r11376, r11377, r11378, r11379, r11380, r11381, r11382, r11383, r11384, r11385, r11386, r11387, r11388, r11389, r11390;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r11372);
        mpfr_init(r11373);
        mpfr_init(r11374);
        mpfr_init(r11375);
        mpfr_init(r11376);
        mpfr_init_set_str(r11377, "2", 10, MPFR_RNDN);
        mpfr_init(r11378);
        mpfr_init_set_str(r11379, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11380, "1", 10, MPFR_RNDN);
        mpfr_init(r11381);
        mpfr_init(r11382);
        mpfr_init_set_str(r11383, "3", 10, MPFR_RNDN);
        mpfr_init(r11384);
        mpfr_init(r11385);
        mpfr_init(r11386);
        mpfr_init(r11387);
        mpfr_init(r11388);
        mpfr_init(r11389);
        mpfr_init(r11390);
}

double f_im(double a, double b) {
        mpfr_set_d(r11372, a, MPFR_RNDN);
        mpfr_mul(r11373, r11372, r11372, MPFR_RNDN);
        mpfr_set_d(r11374, b, MPFR_RNDN);
        mpfr_mul(r11375, r11374, r11374, MPFR_RNDN);
        mpfr_add(r11376, r11373, r11375, MPFR_RNDN);
        ;
        mpfr_pow(r11378, r11376, r11377, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11381, r11380, r11372, MPFR_RNDN);
        mpfr_mul(r11382, r11373, r11381, MPFR_RNDN);
        ;
        mpfr_mul(r11384, r11383, r11372, MPFR_RNDN);
        mpfr_sub(r11385, r11380, r11384, MPFR_RNDN);
        mpfr_mul(r11386, r11375, r11385, MPFR_RNDN);
        mpfr_add(r11387, r11382, r11386, MPFR_RNDN);
        mpfr_mul(r11388, r11379, r11387, MPFR_RNDN);
        mpfr_add(r11389, r11378, r11388, MPFR_RNDN);
        mpfr_sub(r11390, r11389, r11380, MPFR_RNDN);
        return mpfr_get_d(r11390, MPFR_RNDN);
}

static mpfr_t r11391, r11392, r11393, r11394, r11395, r11396, r11397, r11398, r11399, r11400, r11401, r11402, r11403, r11404, r11405, r11406, r11407, r11408, r11409;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11391);
        mpfr_init(r11392);
        mpfr_init(r11393);
        mpfr_init(r11394);
        mpfr_init(r11395);
        mpfr_init_set_str(r11396, "2", 10, MPFR_RNDN);
        mpfr_init(r11397);
        mpfr_init_set_str(r11398, "1", 10, MPFR_RNDN);
        mpfr_init(r11399);
        mpfr_init(r11400);
        mpfr_init_set_str(r11401, "3", 10, MPFR_RNDN);
        mpfr_init(r11402);
        mpfr_init(r11403);
        mpfr_init(r11404);
        mpfr_init(r11405);
        mpfr_init_set_str(r11406, "4", 10, MPFR_RNDN);
        mpfr_init(r11407);
        mpfr_init(r11408);
        mpfr_init(r11409);
}

double f_fm(double a, double b) {
        mpfr_set_d(r11391, a, MPFR_RNDN);
        mpfr_mul(r11392, r11391, r11391, MPFR_RNDN);
        mpfr_set_d(r11393, b, MPFR_RNDN);
        mpfr_mul(r11394, r11393, r11393, MPFR_RNDN);
        mpfr_add(r11395, r11392, r11394, MPFR_RNDN);
        ;
        mpfr_pow(r11397, r11395, r11396, MPFR_RNDN);
        ;
        mpfr_add(r11399, r11391, r11398, MPFR_RNDN);
        mpfr_mul(r11400, r11392, r11399, MPFR_RNDN);
        ;
        mpfr_mul(r11402, r11401, r11391, MPFR_RNDN);
        mpfr_sub(r11403, r11398, r11402, MPFR_RNDN);
        mpfr_mul(r11404, r11394, r11403, MPFR_RNDN);
        mpfr_add(r11405, r11400, r11404, MPFR_RNDN);
        ;
        mpfr_mul(r11407, r11405, r11406, MPFR_RNDN);
        mpfr_add(r11408, r11397, r11407, MPFR_RNDN);
        mpfr_sub(r11409, r11408, r11398, MPFR_RNDN);
        return mpfr_get_d(r11409, MPFR_RNDN);
}

static mpfr_t r11410, r11411, r11412, r11413, r11414, r11415, r11416, r11417, r11418, r11419, r11420, r11421, r11422, r11423, r11424, r11425, r11426, r11427, r11428;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11410);
        mpfr_init(r11411);
        mpfr_init(r11412);
        mpfr_init(r11413);
        mpfr_init(r11414);
        mpfr_init_set_str(r11415, "2", 10, MPFR_RNDN);
        mpfr_init(r11416);
        mpfr_init_set_str(r11417, "1", 10, MPFR_RNDN);
        mpfr_init(r11418);
        mpfr_init(r11419);
        mpfr_init_set_str(r11420, "3", 10, MPFR_RNDN);
        mpfr_init(r11421);
        mpfr_init(r11422);
        mpfr_init(r11423);
        mpfr_init(r11424);
        mpfr_init_set_str(r11425, "4", 10, MPFR_RNDN);
        mpfr_init(r11426);
        mpfr_init(r11427);
        mpfr_init(r11428);
}

double f_dm(double a, double b) {
        mpfr_set_d(r11410, a, MPFR_RNDN);
        mpfr_mul(r11411, r11410, r11410, MPFR_RNDN);
        mpfr_set_d(r11412, b, MPFR_RNDN);
        mpfr_mul(r11413, r11412, r11412, MPFR_RNDN);
        mpfr_add(r11414, r11411, r11413, MPFR_RNDN);
        ;
        mpfr_pow(r11416, r11414, r11415, MPFR_RNDN);
        ;
        mpfr_add(r11418, r11410, r11417, MPFR_RNDN);
        mpfr_mul(r11419, r11411, r11418, MPFR_RNDN);
        ;
        mpfr_mul(r11421, r11420, r11410, MPFR_RNDN);
        mpfr_sub(r11422, r11417, r11421, MPFR_RNDN);
        mpfr_mul(r11423, r11413, r11422, MPFR_RNDN);
        mpfr_add(r11424, r11419, r11423, MPFR_RNDN);
        ;
        mpfr_mul(r11426, r11424, r11425, MPFR_RNDN);
        mpfr_add(r11427, r11416, r11426, MPFR_RNDN);
        mpfr_sub(r11428, r11427, r11417, MPFR_RNDN);
        return mpfr_get_d(r11428, MPFR_RNDN);
}

