#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 r17492 = a;
        float r17493 = r17492 * r17492;
        float r17494 = b;
        float r17495 = r17494 * r17494;
        float r17496 = r17493 + r17495;
        float r17497 = r17496 * r17496;
        float r17498 = 4.0f;
        float r17499 = 1.0f;
        float r17500 = r17499 + r17492;
        float r17501 = r17493 * r17500;
        float r17502 = 3.0f;
        float r17503 = r17502 * r17492;
        float r17504 = r17499 - r17503;
        float r17505 = r17495 * r17504;
        float r17506 = r17501 + r17505;
        float r17507 = r17498 * r17506;
        float r17508 = r17497 + r17507;
        float r17509 = r17508 - r17499;
        return r17509;
}

double f_id(double a, double b) {
        double r17510 = a;
        double r17511 = r17510 * r17510;
        double r17512 = b;
        double r17513 = r17512 * r17512;
        double r17514 = r17511 + r17513;
        double r17515 = r17514 * r17514;
        double r17516 = 4.0;
        double r17517 = 1.0;
        double r17518 = r17517 + r17510;
        double r17519 = r17511 * r17518;
        double r17520 = 3.0;
        double r17521 = r17520 * r17510;
        double r17522 = r17517 - r17521;
        double r17523 = r17513 * r17522;
        double r17524 = r17519 + r17523;
        double r17525 = r17516 * r17524;
        double r17526 = r17515 + r17525;
        double r17527 = r17526 - r17517;
        return r17527;
}


double f_of(float a, float b) {
        float r17528 = 1.0f;
        float r17529 = a;
        float r17530 = 3.0f;
        float r17531 = r17529 * r17530;
        float r17532 = r17528 - r17531;
        float r17533 = b;
        float r17534 = r17533 * r17533;
        float r17535 = fma(r17529, r17529, r17529);
        float r17536 = r17535 * r17529;
        float r17537 = fma(r17532, r17534, r17536);
        float r17538 = 4.0f;
        float r17539 = 2.0f;
        float r17540 = r17533 * r17539;
        float r17541 = r17540 * r17533;
        float r17542 = r17529 * r17529;
        float r17543 = pow(r17529, r17538);
        float r17544 = pow(r17533, r17538);
        float r17545 = r17543 + r17544;
        float r17546 = fma(r17541, r17542, r17545);
        float r17547 = fma(r17537, r17538, r17546);
        float r17548 = r17547 - r17528;
        return r17548;
}

double f_od(double a, double b) {
        double r17549 = 1.0;
        double r17550 = a;
        double r17551 = 3.0;
        double r17552 = r17550 * r17551;
        double r17553 = r17549 - r17552;
        double r17554 = b;
        double r17555 = r17554 * r17554;
        double r17556 = fma(r17550, r17550, r17550);
        double r17557 = r17556 * r17550;
        double r17558 = fma(r17553, r17555, r17557);
        double r17559 = 4.0;
        double r17560 = 2.0;
        double r17561 = r17554 * r17560;
        double r17562 = r17561 * r17554;
        double r17563 = r17550 * r17550;
        double r17564 = pow(r17550, r17559);
        double r17565 = pow(r17554, r17559);
        double r17566 = r17564 + r17565;
        double r17567 = fma(r17562, r17563, r17566);
        double r17568 = fma(r17558, r17559, r17567);
        double r17569 = r17568 - r17549;
        return r17569;
}

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 r17570, r17571, r17572, r17573, r17574, r17575, r17576, r17577, r17578, r17579, r17580, r17581, r17582, r17583, r17584, r17585, r17586, r17587;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r17570);
        mpfr_init(r17571);
        mpfr_init(r17572);
        mpfr_init(r17573);
        mpfr_init(r17574);
        mpfr_init(r17575);
        mpfr_init_set_str(r17576, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r17577, "1", 10, MPFR_RNDN);
        mpfr_init(r17578);
        mpfr_init(r17579);
        mpfr_init_set_str(r17580, "3", 10, MPFR_RNDN);
        mpfr_init(r17581);
        mpfr_init(r17582);
        mpfr_init(r17583);
        mpfr_init(r17584);
        mpfr_init(r17585);
        mpfr_init(r17586);
        mpfr_init(r17587);
}

double f_im(double a, double b) {
        mpfr_set_d(r17570, a, MPFR_RNDN);
        mpfr_sqr(r17571, r17570, MPFR_RNDN);
        mpfr_set_d(r17572, b, MPFR_RNDN);
        mpfr_sqr(r17573, r17572, MPFR_RNDN);
        mpfr_add(r17574, r17571, r17573, MPFR_RNDN);
        mpfr_sqr(r17575, r17574, MPFR_RNDN);
        ;
        ;
        mpfr_add(r17578, r17577, r17570, MPFR_RNDN);
        mpfr_mul(r17579, r17571, r17578, MPFR_RNDN);
        ;
        mpfr_mul(r17581, r17580, r17570, MPFR_RNDN);
        mpfr_sub(r17582, r17577, r17581, MPFR_RNDN);
        mpfr_mul(r17583, r17573, r17582, MPFR_RNDN);
        mpfr_add(r17584, r17579, r17583, MPFR_RNDN);
        mpfr_mul(r17585, r17576, r17584, MPFR_RNDN);
        mpfr_add(r17586, r17575, r17585, MPFR_RNDN);
        mpfr_sub(r17587, r17586, r17577, MPFR_RNDN);
        return mpfr_get_d(r17587, MPFR_RNDN);
}

static mpfr_t r17588, r17589, r17590, r17591, r17592, r17593, r17594, r17595, r17596, r17597, r17598, r17599, r17600, r17601, r17602, r17603, r17604, r17605, r17606, r17607, r17608;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init_set_str(r17588, "1", 10, MPFR_RNDN);
        mpfr_init(r17589);
        mpfr_init_set_str(r17590, "3", 10, MPFR_RNDN);
        mpfr_init(r17591);
        mpfr_init(r17592);
        mpfr_init(r17593);
        mpfr_init(r17594);
        mpfr_init(r17595);
        mpfr_init(r17596);
        mpfr_init(r17597);
        mpfr_init_set_str(r17598, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r17599, "2", 10, MPFR_RNDN);
        mpfr_init(r17600);
        mpfr_init(r17601);
        mpfr_init(r17602);
        mpfr_init(r17603);
        mpfr_init(r17604);
        mpfr_init(r17605);
        mpfr_init(r17606);
        mpfr_init(r17607);
        mpfr_init(r17608);
}

double f_fm(double a, double b) {
        ;
        mpfr_set_d(r17589, a, MPFR_RNDN);
        ;
        mpfr_mul(r17591, r17589, r17590, MPFR_RNDN);
        mpfr_sub(r17592, r17588, r17591, MPFR_RNDN);
        mpfr_set_d(r17593, b, MPFR_RNDN);
        mpfr_sqr(r17594, r17593, MPFR_RNDN);
        mpfr_fma(r17595, r17589, r17589, r17589, MPFR_RNDN);
        mpfr_mul(r17596, r17595, r17589, MPFR_RNDN);
        mpfr_fma(r17597, r17592, r17594, r17596, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r17600, r17593, r17599, MPFR_RNDN);
        mpfr_mul(r17601, r17600, r17593, MPFR_RNDN);
        mpfr_mul(r17602, r17589, r17589, MPFR_RNDN);
        mpfr_pow(r17603, r17589, r17598, MPFR_RNDN);
        mpfr_pow(r17604, r17593, r17598, MPFR_RNDN);
        mpfr_add(r17605, r17603, r17604, MPFR_RNDN);
        mpfr_fma(r17606, r17601, r17602, r17605, MPFR_RNDN);
        mpfr_fma(r17607, r17597, r17598, r17606, MPFR_RNDN);
        mpfr_sub(r17608, r17607, r17588, MPFR_RNDN);
        return mpfr_get_d(r17608, MPFR_RNDN);
}

static mpfr_t r17609, r17610, r17611, r17612, r17613, r17614, r17615, r17616, r17617, r17618, r17619, r17620, r17621, r17622, r17623, r17624, r17625, r17626, r17627, r17628, r17629;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init_set_str(r17609, "1", 10, MPFR_RNDN);
        mpfr_init(r17610);
        mpfr_init_set_str(r17611, "3", 10, MPFR_RNDN);
        mpfr_init(r17612);
        mpfr_init(r17613);
        mpfr_init(r17614);
        mpfr_init(r17615);
        mpfr_init(r17616);
        mpfr_init(r17617);
        mpfr_init(r17618);
        mpfr_init_set_str(r17619, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r17620, "2", 10, MPFR_RNDN);
        mpfr_init(r17621);
        mpfr_init(r17622);
        mpfr_init(r17623);
        mpfr_init(r17624);
        mpfr_init(r17625);
        mpfr_init(r17626);
        mpfr_init(r17627);
        mpfr_init(r17628);
        mpfr_init(r17629);
}

double f_dm(double a, double b) {
        ;
        mpfr_set_d(r17610, a, MPFR_RNDN);
        ;
        mpfr_mul(r17612, r17610, r17611, MPFR_RNDN);
        mpfr_sub(r17613, r17609, r17612, MPFR_RNDN);
        mpfr_set_d(r17614, b, MPFR_RNDN);
        mpfr_sqr(r17615, r17614, MPFR_RNDN);
        mpfr_fma(r17616, r17610, r17610, r17610, MPFR_RNDN);
        mpfr_mul(r17617, r17616, r17610, MPFR_RNDN);
        mpfr_fma(r17618, r17613, r17615, r17617, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r17621, r17614, r17620, MPFR_RNDN);
        mpfr_mul(r17622, r17621, r17614, MPFR_RNDN);
        mpfr_mul(r17623, r17610, r17610, MPFR_RNDN);
        mpfr_pow(r17624, r17610, r17619, MPFR_RNDN);
        mpfr_pow(r17625, r17614, r17619, MPFR_RNDN);
        mpfr_add(r17626, r17624, r17625, MPFR_RNDN);
        mpfr_fma(r17627, r17622, r17623, r17626, MPFR_RNDN);
        mpfr_fma(r17628, r17618, r17619, r17627, MPFR_RNDN);
        mpfr_sub(r17629, r17628, r17609, MPFR_RNDN);
        return mpfr_get_d(r17629, MPFR_RNDN);
}

