#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 r18366 = a;
        float r18367 = r18366 * r18366;
        float r18368 = b;
        float r18369 = r18368 * r18368;
        float r18370 = r18367 + r18369;
        float r18371 = r18370 * r18370;
        float r18372 = 4.0f;
        float r18373 = 1.0f;
        float r18374 = r18373 + r18366;
        float r18375 = r18367 * r18374;
        float r18376 = 3.0f;
        float r18377 = r18376 * r18366;
        float r18378 = r18373 - r18377;
        float r18379 = r18369 * r18378;
        float r18380 = r18375 + r18379;
        float r18381 = r18372 * r18380;
        float r18382 = r18371 + r18381;
        float r18383 = r18382 - r18373;
        return r18383;
}

double f_id(double a, double b) {
        double r18384 = a;
        double r18385 = r18384 * r18384;
        double r18386 = b;
        double r18387 = r18386 * r18386;
        double r18388 = r18385 + r18387;
        double r18389 = r18388 * r18388;
        double r18390 = 4.0;
        double r18391 = 1.0;
        double r18392 = r18391 + r18384;
        double r18393 = r18385 * r18392;
        double r18394 = 3.0;
        double r18395 = r18394 * r18384;
        double r18396 = r18391 - r18395;
        double r18397 = r18387 * r18396;
        double r18398 = r18393 + r18397;
        double r18399 = r18390 * r18398;
        double r18400 = r18389 + r18399;
        double r18401 = r18400 - r18391;
        return r18401;
}


double f_of(float a, float b) {
        float r18402 = 1.0f;
        float r18403 = a;
        float r18404 = 3.0f;
        float r18405 = r18403 * r18404;
        float r18406 = r18402 - r18405;
        float r18407 = b;
        float r18408 = r18407 * r18407;
        float r18409 = fma(r18403, r18403, r18403);
        float r18410 = r18409 * r18403;
        float r18411 = fma(r18406, r18408, r18410);
        float r18412 = 4.0f;
        float r18413 = 2.0f;
        float r18414 = r18407 * r18413;
        float r18415 = r18414 * r18407;
        float r18416 = r18403 * r18403;
        float r18417 = pow(r18403, r18412);
        float r18418 = pow(r18407, r18412);
        float r18419 = r18417 + r18418;
        float r18420 = fma(r18415, r18416, r18419);
        float r18421 = fma(r18411, r18412, r18420);
        float r18422 = r18421 - r18402;
        return r18422;
}

double f_od(double a, double b) {
        double r18423 = 1.0;
        double r18424 = a;
        double r18425 = 3.0;
        double r18426 = r18424 * r18425;
        double r18427 = r18423 - r18426;
        double r18428 = b;
        double r18429 = r18428 * r18428;
        double r18430 = fma(r18424, r18424, r18424);
        double r18431 = r18430 * r18424;
        double r18432 = fma(r18427, r18429, r18431);
        double r18433 = 4.0;
        double r18434 = 2.0;
        double r18435 = r18428 * r18434;
        double r18436 = r18435 * r18428;
        double r18437 = r18424 * r18424;
        double r18438 = pow(r18424, r18433);
        double r18439 = pow(r18428, r18433);
        double r18440 = r18438 + r18439;
        double r18441 = fma(r18436, r18437, r18440);
        double r18442 = fma(r18432, r18433, r18441);
        double r18443 = r18442 - r18423;
        return r18443;
}

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 r18444, r18445, r18446, r18447, r18448, r18449, r18450, r18451, r18452, r18453, r18454, r18455, r18456, r18457, r18458, r18459, r18460, r18461;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r18444);
        mpfr_init(r18445);
        mpfr_init(r18446);
        mpfr_init(r18447);
        mpfr_init(r18448);
        mpfr_init(r18449);
        mpfr_init_set_str(r18450, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r18451, "1", 10, MPFR_RNDN);
        mpfr_init(r18452);
        mpfr_init(r18453);
        mpfr_init_set_str(r18454, "3", 10, MPFR_RNDN);
        mpfr_init(r18455);
        mpfr_init(r18456);
        mpfr_init(r18457);
        mpfr_init(r18458);
        mpfr_init(r18459);
        mpfr_init(r18460);
        mpfr_init(r18461);
}

double f_im(double a, double b) {
        mpfr_set_d(r18444, a, MPFR_RNDN);
        mpfr_sqr(r18445, r18444, MPFR_RNDN);
        mpfr_set_d(r18446, b, MPFR_RNDN);
        mpfr_sqr(r18447, r18446, MPFR_RNDN);
        mpfr_add(r18448, r18445, r18447, MPFR_RNDN);
        mpfr_sqr(r18449, r18448, MPFR_RNDN);
        ;
        ;
        mpfr_add(r18452, r18451, r18444, MPFR_RNDN);
        mpfr_mul(r18453, r18445, r18452, MPFR_RNDN);
        ;
        mpfr_mul(r18455, r18454, r18444, MPFR_RNDN);
        mpfr_sub(r18456, r18451, r18455, MPFR_RNDN);
        mpfr_mul(r18457, r18447, r18456, MPFR_RNDN);
        mpfr_add(r18458, r18453, r18457, MPFR_RNDN);
        mpfr_mul(r18459, r18450, r18458, MPFR_RNDN);
        mpfr_add(r18460, r18449, r18459, MPFR_RNDN);
        mpfr_sub(r18461, r18460, r18451, MPFR_RNDN);
        return mpfr_get_d(r18461, MPFR_RNDN);
}

static mpfr_t r18462, r18463, r18464, r18465, r18466, r18467, r18468, r18469, r18470, r18471, r18472, r18473, r18474, r18475, r18476, r18477, r18478, r18479, r18480, r18481, r18482;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init_set_str(r18462, "1", 10, MPFR_RNDN);
        mpfr_init(r18463);
        mpfr_init_set_str(r18464, "3", 10, MPFR_RNDN);
        mpfr_init(r18465);
        mpfr_init(r18466);
        mpfr_init(r18467);
        mpfr_init(r18468);
        mpfr_init(r18469);
        mpfr_init(r18470);
        mpfr_init(r18471);
        mpfr_init_set_str(r18472, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r18473, "2", 10, MPFR_RNDN);
        mpfr_init(r18474);
        mpfr_init(r18475);
        mpfr_init(r18476);
        mpfr_init(r18477);
        mpfr_init(r18478);
        mpfr_init(r18479);
        mpfr_init(r18480);
        mpfr_init(r18481);
        mpfr_init(r18482);
}

double f_fm(double a, double b) {
        ;
        mpfr_set_d(r18463, a, MPFR_RNDN);
        ;
        mpfr_mul(r18465, r18463, r18464, MPFR_RNDN);
        mpfr_sub(r18466, r18462, r18465, MPFR_RNDN);
        mpfr_set_d(r18467, b, MPFR_RNDN);
        mpfr_sqr(r18468, r18467, MPFR_RNDN);
        mpfr_fma(r18469, r18463, r18463, r18463, MPFR_RNDN);
        mpfr_mul(r18470, r18469, r18463, MPFR_RNDN);
        mpfr_fma(r18471, r18466, r18468, r18470, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r18474, r18467, r18473, MPFR_RNDN);
        mpfr_mul(r18475, r18474, r18467, MPFR_RNDN);
        mpfr_mul(r18476, r18463, r18463, MPFR_RNDN);
        mpfr_pow(r18477, r18463, r18472, MPFR_RNDN);
        mpfr_pow(r18478, r18467, r18472, MPFR_RNDN);
        mpfr_add(r18479, r18477, r18478, MPFR_RNDN);
        mpfr_fma(r18480, r18475, r18476, r18479, MPFR_RNDN);
        mpfr_fma(r18481, r18471, r18472, r18480, MPFR_RNDN);
        mpfr_sub(r18482, r18481, r18462, MPFR_RNDN);
        return mpfr_get_d(r18482, MPFR_RNDN);
}

static mpfr_t r18483, r18484, r18485, r18486, r18487, r18488, r18489, r18490, r18491, r18492, r18493, r18494, r18495, r18496, r18497, r18498, r18499, r18500, r18501, r18502, r18503;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init_set_str(r18483, "1", 10, MPFR_RNDN);
        mpfr_init(r18484);
        mpfr_init_set_str(r18485, "3", 10, MPFR_RNDN);
        mpfr_init(r18486);
        mpfr_init(r18487);
        mpfr_init(r18488);
        mpfr_init(r18489);
        mpfr_init(r18490);
        mpfr_init(r18491);
        mpfr_init(r18492);
        mpfr_init_set_str(r18493, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r18494, "2", 10, MPFR_RNDN);
        mpfr_init(r18495);
        mpfr_init(r18496);
        mpfr_init(r18497);
        mpfr_init(r18498);
        mpfr_init(r18499);
        mpfr_init(r18500);
        mpfr_init(r18501);
        mpfr_init(r18502);
        mpfr_init(r18503);
}

double f_dm(double a, double b) {
        ;
        mpfr_set_d(r18484, a, MPFR_RNDN);
        ;
        mpfr_mul(r18486, r18484, r18485, MPFR_RNDN);
        mpfr_sub(r18487, r18483, r18486, MPFR_RNDN);
        mpfr_set_d(r18488, b, MPFR_RNDN);
        mpfr_sqr(r18489, r18488, MPFR_RNDN);
        mpfr_fma(r18490, r18484, r18484, r18484, MPFR_RNDN);
        mpfr_mul(r18491, r18490, r18484, MPFR_RNDN);
        mpfr_fma(r18492, r18487, r18489, r18491, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r18495, r18488, r18494, MPFR_RNDN);
        mpfr_mul(r18496, r18495, r18488, MPFR_RNDN);
        mpfr_mul(r18497, r18484, r18484, MPFR_RNDN);
        mpfr_pow(r18498, r18484, r18493, MPFR_RNDN);
        mpfr_pow(r18499, r18488, r18493, MPFR_RNDN);
        mpfr_add(r18500, r18498, r18499, MPFR_RNDN);
        mpfr_fma(r18501, r18496, r18497, r18500, MPFR_RNDN);
        mpfr_fma(r18502, r18492, r18493, r18501, MPFR_RNDN);
        mpfr_sub(r18503, r18502, r18483, MPFR_RNDN);
        return mpfr_get_d(r18503, MPFR_RNDN);
}

