#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 r36411 = a;
        float r36412 = r36411 * r36411;
        float r36413 = b;
        float r36414 = r36413 * r36413;
        float r36415 = r36412 + r36414;
        float r36416 = 2;
        float r36417 = pow(r36415, r36416);
        float r36418 = 4;
        float r36419 = 1;
        float r36420 = r36419 + r36411;
        float r36421 = r36412 * r36420;
        float r36422 = 3;
        float r36423 = r36422 * r36411;
        float r36424 = r36419 - r36423;
        float r36425 = r36414 * r36424;
        float r36426 = r36421 + r36425;
        float r36427 = r36418 * r36426;
        float r36428 = r36417 + r36427;
        float r36429 = r36428 - r36419;
        return r36429;
}

double f_id(double a, double b) {
        double r36430 = a;
        double r36431 = r36430 * r36430;
        double r36432 = b;
        double r36433 = r36432 * r36432;
        double r36434 = r36431 + r36433;
        double r36435 = 2;
        double r36436 = pow(r36434, r36435);
        double r36437 = 4;
        double r36438 = 1;
        double r36439 = r36438 + r36430;
        double r36440 = r36431 * r36439;
        double r36441 = 3;
        double r36442 = r36441 * r36430;
        double r36443 = r36438 - r36442;
        double r36444 = r36433 * r36443;
        double r36445 = r36440 + r36444;
        double r36446 = r36437 * r36445;
        double r36447 = r36436 + r36446;
        double r36448 = r36447 - r36438;
        return r36448;
}


double f_of(float a, float b) {
        float r36449 = a;
        float r36450 = r36449 * r36449;
        float r36451 = b;
        float r36452 = r36451 * r36451;
        float r36453 = r36450 + r36452;
        float r36454 = 2;
        float r36455 = pow(r36453, r36454);
        float r36456 = 4;
        float r36457 = 1;
        float r36458 = r36457 + r36449;
        float r36459 = r36450 * r36458;
        float r36460 = 3;
        float r36461 = r36460 * r36449;
        float r36462 = r36457 - r36461;
        float r36463 = r36452 * r36462;
        float r36464 = r36459 + r36463;
        float r36465 = r36456 * r36464;
        float r36466 = r36455 + r36465;
        float r36467 = r36466 - r36457;
        return r36467;
}

double f_od(double a, double b) {
        double r36468 = a;
        double r36469 = r36468 * r36468;
        double r36470 = b;
        double r36471 = r36470 * r36470;
        double r36472 = r36469 + r36471;
        double r36473 = 2;
        double r36474 = pow(r36472, r36473);
        double r36475 = 4;
        double r36476 = 1;
        double r36477 = r36476 + r36468;
        double r36478 = r36469 * r36477;
        double r36479 = 3;
        double r36480 = r36479 * r36468;
        double r36481 = r36476 - r36480;
        double r36482 = r36471 * r36481;
        double r36483 = r36478 + r36482;
        double r36484 = r36475 * r36483;
        double r36485 = r36474 + r36484;
        double r36486 = r36485 - r36476;
        return r36486;
}

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 r36487, r36488, r36489, r36490, r36491, r36492, r36493, r36494, r36495, r36496, r36497, r36498, r36499, r36500, r36501, r36502, r36503, r36504, r36505;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36487);
        mpfr_init(r36488);
        mpfr_init(r36489);
        mpfr_init(r36490);
        mpfr_init(r36491);
        mpfr_init_set_str(r36492, "2", 10, MPFR_RNDN);
        mpfr_init(r36493);
        mpfr_init_set_str(r36494, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36495, "1", 10, MPFR_RNDN);
        mpfr_init(r36496);
        mpfr_init(r36497);
        mpfr_init_set_str(r36498, "3", 10, MPFR_RNDN);
        mpfr_init(r36499);
        mpfr_init(r36500);
        mpfr_init(r36501);
        mpfr_init(r36502);
        mpfr_init(r36503);
        mpfr_init(r36504);
        mpfr_init(r36505);
}

double f_im(double a, double b) {
        mpfr_set_d(r36487, a, MPFR_RNDN);
        mpfr_mul(r36488, r36487, r36487, MPFR_RNDN);
        mpfr_set_d(r36489, b, MPFR_RNDN);
        mpfr_mul(r36490, r36489, r36489, MPFR_RNDN);
        mpfr_add(r36491, r36488, r36490, MPFR_RNDN);
        ;
        mpfr_pow(r36493, r36491, r36492, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36496, r36495, r36487, MPFR_RNDN);
        mpfr_mul(r36497, r36488, r36496, MPFR_RNDN);
        ;
        mpfr_mul(r36499, r36498, r36487, MPFR_RNDN);
        mpfr_sub(r36500, r36495, r36499, MPFR_RNDN);
        mpfr_mul(r36501, r36490, r36500, MPFR_RNDN);
        mpfr_add(r36502, r36497, r36501, MPFR_RNDN);
        mpfr_mul(r36503, r36494, r36502, MPFR_RNDN);
        mpfr_add(r36504, r36493, r36503, MPFR_RNDN);
        mpfr_sub(r36505, r36504, r36495, MPFR_RNDN);
        return mpfr_get_d(r36505, MPFR_RNDN);
}

static mpfr_t r36506, r36507, r36508, r36509, r36510, r36511, r36512, r36513, r36514, r36515, r36516, r36517, r36518, r36519, r36520, r36521, r36522, r36523, r36524;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36506);
        mpfr_init(r36507);
        mpfr_init(r36508);
        mpfr_init(r36509);
        mpfr_init(r36510);
        mpfr_init_set_str(r36511, "2", 10, MPFR_RNDN);
        mpfr_init(r36512);
        mpfr_init_set_str(r36513, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36514, "1", 10, MPFR_RNDN);
        mpfr_init(r36515);
        mpfr_init(r36516);
        mpfr_init_set_str(r36517, "3", 10, MPFR_RNDN);
        mpfr_init(r36518);
        mpfr_init(r36519);
        mpfr_init(r36520);
        mpfr_init(r36521);
        mpfr_init(r36522);
        mpfr_init(r36523);
        mpfr_init(r36524);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36506, a, MPFR_RNDN);
        mpfr_mul(r36507, r36506, r36506, MPFR_RNDN);
        mpfr_set_d(r36508, b, MPFR_RNDN);
        mpfr_mul(r36509, r36508, r36508, MPFR_RNDN);
        mpfr_add(r36510, r36507, r36509, MPFR_RNDN);
        ;
        mpfr_pow(r36512, r36510, r36511, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36515, r36514, r36506, MPFR_RNDN);
        mpfr_mul(r36516, r36507, r36515, MPFR_RNDN);
        ;
        mpfr_mul(r36518, r36517, r36506, MPFR_RNDN);
        mpfr_sub(r36519, r36514, r36518, MPFR_RNDN);
        mpfr_mul(r36520, r36509, r36519, MPFR_RNDN);
        mpfr_add(r36521, r36516, r36520, MPFR_RNDN);
        mpfr_mul(r36522, r36513, r36521, MPFR_RNDN);
        mpfr_add(r36523, r36512, r36522, MPFR_RNDN);
        mpfr_sub(r36524, r36523, r36514, MPFR_RNDN);
        return mpfr_get_d(r36524, MPFR_RNDN);
}

static mpfr_t r36525, r36526, r36527, r36528, r36529, r36530, r36531, r36532, r36533, r36534, r36535, r36536, r36537, r36538, r36539, r36540, r36541, r36542, r36543;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36525);
        mpfr_init(r36526);
        mpfr_init(r36527);
        mpfr_init(r36528);
        mpfr_init(r36529);
        mpfr_init_set_str(r36530, "2", 10, MPFR_RNDN);
        mpfr_init(r36531);
        mpfr_init_set_str(r36532, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36533, "1", 10, MPFR_RNDN);
        mpfr_init(r36534);
        mpfr_init(r36535);
        mpfr_init_set_str(r36536, "3", 10, MPFR_RNDN);
        mpfr_init(r36537);
        mpfr_init(r36538);
        mpfr_init(r36539);
        mpfr_init(r36540);
        mpfr_init(r36541);
        mpfr_init(r36542);
        mpfr_init(r36543);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36525, a, MPFR_RNDN);
        mpfr_mul(r36526, r36525, r36525, MPFR_RNDN);
        mpfr_set_d(r36527, b, MPFR_RNDN);
        mpfr_mul(r36528, r36527, r36527, MPFR_RNDN);
        mpfr_add(r36529, r36526, r36528, MPFR_RNDN);
        ;
        mpfr_pow(r36531, r36529, r36530, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36534, r36533, r36525, MPFR_RNDN);
        mpfr_mul(r36535, r36526, r36534, MPFR_RNDN);
        ;
        mpfr_mul(r36537, r36536, r36525, MPFR_RNDN);
        mpfr_sub(r36538, r36533, r36537, MPFR_RNDN);
        mpfr_mul(r36539, r36528, r36538, MPFR_RNDN);
        mpfr_add(r36540, r36535, r36539, MPFR_RNDN);
        mpfr_mul(r36541, r36532, r36540, MPFR_RNDN);
        mpfr_add(r36542, r36531, r36541, MPFR_RNDN);
        mpfr_sub(r36543, r36542, r36533, MPFR_RNDN);
        return mpfr_get_d(r36543, MPFR_RNDN);
}

