#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "Bouland and Aaronson, Equation (24)";

double f_if(float a, float b) {
        float r36416 = a;
        float r36417 = r36416 * r36416;
        float r36418 = b;
        float r36419 = r36418 * r36418;
        float r36420 = r36417 + r36419;
        float r36421 = 2;
        float r36422 = pow(r36420, r36421);
        float r36423 = 4;
        float r36424 = 1;
        float r36425 = r36424 - r36416;
        float r36426 = r36417 * r36425;
        float r36427 = 3;
        float r36428 = r36427 + r36416;
        float r36429 = r36419 * r36428;
        float r36430 = r36426 + r36429;
        float r36431 = r36423 * r36430;
        float r36432 = r36422 + r36431;
        float r36433 = r36432 - r36424;
        return r36433;
}

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


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

double f_od(double a, double b) {
        double r36472 = a;
        double r36473 = r36472 * r36472;
        double r36474 = b;
        double r36475 = r36474 * r36474;
        double r36476 = r36473 + r36475;
        double r36477 = 2;
        double r36478 = pow(r36476, r36477);
        double r36479 = 4;
        double r36480 = 1;
        double r36481 = r36480 - r36472;
        double r36482 = r36473 * r36481;
        double r36483 = 3;
        double r36484 = r36483 + r36472;
        double r36485 = r36475 * r36484;
        double r36486 = r36482 + r36485;
        double r36487 = r36479 * r36486;
        double r36488 = r36478 + r36487;
        double r36489 = sqrt(r36488);
        double r36490 = r36489 * r36489;
        double r36491 = r36490 - r36480;
        return r36491;
}

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 r36492, r36493, r36494, r36495, r36496, r36497, r36498, r36499, r36500, r36501, r36502, r36503, r36504, r36505, r36506, r36507, r36508, r36509;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36492);
        mpfr_init(r36493);
        mpfr_init(r36494);
        mpfr_init(r36495);
        mpfr_init(r36496);
        mpfr_init_set_str(r36497, "2", 10, MPFR_RNDN);
        mpfr_init(r36498);
        mpfr_init_set_str(r36499, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36500, "1", 10, MPFR_RNDN);
        mpfr_init(r36501);
        mpfr_init(r36502);
        mpfr_init_set_str(r36503, "3", 10, MPFR_RNDN);
        mpfr_init(r36504);
        mpfr_init(r36505);
        mpfr_init(r36506);
        mpfr_init(r36507);
        mpfr_init(r36508);
        mpfr_init(r36509);
}

double f_im(double a, double b) {
        mpfr_set_d(r36492, a, MPFR_RNDN);
        mpfr_mul(r36493, r36492, r36492, MPFR_RNDN);
        mpfr_set_d(r36494, b, MPFR_RNDN);
        mpfr_mul(r36495, r36494, r36494, MPFR_RNDN);
        mpfr_add(r36496, r36493, r36495, MPFR_RNDN);
        ;
        mpfr_pow(r36498, r36496, r36497, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36501, r36500, r36492, MPFR_RNDN);
        mpfr_mul(r36502, r36493, r36501, MPFR_RNDN);
        ;
        mpfr_add(r36504, r36503, r36492, MPFR_RNDN);
        mpfr_mul(r36505, r36495, r36504, MPFR_RNDN);
        mpfr_add(r36506, r36502, r36505, MPFR_RNDN);
        mpfr_mul(r36507, r36499, r36506, MPFR_RNDN);
        mpfr_add(r36508, r36498, r36507, MPFR_RNDN);
        mpfr_sub(r36509, r36508, r36500, MPFR_RNDN);
        return mpfr_get_d(r36509, MPFR_RNDN);
}

static mpfr_t r36510, r36511, r36512, r36513, r36514, r36515, r36516, r36517, r36518, r36519, r36520, r36521, r36522, r36523, r36524, r36525, r36526, r36527, r36528, r36529;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36510);
        mpfr_init(r36511);
        mpfr_init(r36512);
        mpfr_init(r36513);
        mpfr_init(r36514);
        mpfr_init_set_str(r36515, "2", 10, MPFR_RNDN);
        mpfr_init(r36516);
        mpfr_init_set_str(r36517, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36518, "1", 10, MPFR_RNDN);
        mpfr_init(r36519);
        mpfr_init(r36520);
        mpfr_init_set_str(r36521, "3", 10, MPFR_RNDN);
        mpfr_init(r36522);
        mpfr_init(r36523);
        mpfr_init(r36524);
        mpfr_init(r36525);
        mpfr_init(r36526);
        mpfr_init(r36527);
        mpfr_init(r36528);
        mpfr_init(r36529);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36510, a, MPFR_RNDN);
        mpfr_mul(r36511, r36510, r36510, MPFR_RNDN);
        mpfr_set_d(r36512, b, MPFR_RNDN);
        mpfr_mul(r36513, r36512, r36512, MPFR_RNDN);
        mpfr_add(r36514, r36511, r36513, MPFR_RNDN);
        ;
        mpfr_pow(r36516, r36514, r36515, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36519, r36518, r36510, MPFR_RNDN);
        mpfr_mul(r36520, r36511, r36519, MPFR_RNDN);
        ;
        mpfr_add(r36522, r36521, r36510, MPFR_RNDN);
        mpfr_mul(r36523, r36513, r36522, MPFR_RNDN);
        mpfr_add(r36524, r36520, r36523, MPFR_RNDN);
        mpfr_mul(r36525, r36517, r36524, MPFR_RNDN);
        mpfr_add(r36526, r36516, r36525, MPFR_RNDN);
        mpfr_sqrt(r36527, r36526, MPFR_RNDN);
        mpfr_mul(r36528, r36527, r36527, MPFR_RNDN);
        mpfr_sub(r36529, r36528, r36518, MPFR_RNDN);
        return mpfr_get_d(r36529, MPFR_RNDN);
}

static mpfr_t r36530, r36531, r36532, r36533, r36534, r36535, r36536, r36537, r36538, r36539, r36540, r36541, r36542, r36543, r36544, r36545, r36546, r36547, r36548, r36549;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36530);
        mpfr_init(r36531);
        mpfr_init(r36532);
        mpfr_init(r36533);
        mpfr_init(r36534);
        mpfr_init_set_str(r36535, "2", 10, MPFR_RNDN);
        mpfr_init(r36536);
        mpfr_init_set_str(r36537, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36538, "1", 10, MPFR_RNDN);
        mpfr_init(r36539);
        mpfr_init(r36540);
        mpfr_init_set_str(r36541, "3", 10, MPFR_RNDN);
        mpfr_init(r36542);
        mpfr_init(r36543);
        mpfr_init(r36544);
        mpfr_init(r36545);
        mpfr_init(r36546);
        mpfr_init(r36547);
        mpfr_init(r36548);
        mpfr_init(r36549);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36530, a, MPFR_RNDN);
        mpfr_mul(r36531, r36530, r36530, MPFR_RNDN);
        mpfr_set_d(r36532, b, MPFR_RNDN);
        mpfr_mul(r36533, r36532, r36532, MPFR_RNDN);
        mpfr_add(r36534, r36531, r36533, MPFR_RNDN);
        ;
        mpfr_pow(r36536, r36534, r36535, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36539, r36538, r36530, MPFR_RNDN);
        mpfr_mul(r36540, r36531, r36539, MPFR_RNDN);
        ;
        mpfr_add(r36542, r36541, r36530, MPFR_RNDN);
        mpfr_mul(r36543, r36533, r36542, MPFR_RNDN);
        mpfr_add(r36544, r36540, r36543, MPFR_RNDN);
        mpfr_mul(r36545, r36537, r36544, MPFR_RNDN);
        mpfr_add(r36546, r36536, r36545, MPFR_RNDN);
        mpfr_sqrt(r36547, r36546, MPFR_RNDN);
        mpfr_mul(r36548, r36547, r36547, MPFR_RNDN);
        mpfr_sub(r36549, r36548, r36538, MPFR_RNDN);
        return mpfr_get_d(r36549, MPFR_RNDN);
}

