#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 r36391 = a;
        float r36392 = r36391 * r36391;
        float r36393 = b;
        float r36394 = r36393 * r36393;
        float r36395 = r36392 + r36394;
        float r36396 = 2;
        float r36397 = pow(r36395, r36396);
        float r36398 = 4;
        float r36399 = 1;
        float r36400 = r36399 + r36391;
        float r36401 = r36392 * r36400;
        float r36402 = 3;
        float r36403 = r36402 * r36391;
        float r36404 = r36399 - r36403;
        float r36405 = r36394 * r36404;
        float r36406 = r36401 + r36405;
        float r36407 = r36398 * r36406;
        float r36408 = r36397 + r36407;
        float r36409 = r36408 - r36399;
        return r36409;
}

double f_id(double a, double b) {
        double r36410 = a;
        double r36411 = r36410 * r36410;
        double r36412 = b;
        double r36413 = r36412 * r36412;
        double r36414 = r36411 + r36413;
        double r36415 = 2;
        double r36416 = pow(r36414, r36415);
        double r36417 = 4;
        double r36418 = 1;
        double r36419 = r36418 + r36410;
        double r36420 = r36411 * r36419;
        double r36421 = 3;
        double r36422 = r36421 * r36410;
        double r36423 = r36418 - r36422;
        double r36424 = r36413 * r36423;
        double r36425 = r36420 + r36424;
        double r36426 = r36417 * r36425;
        double r36427 = r36416 + r36426;
        double r36428 = r36427 - r36418;
        return r36428;
}


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

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

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 r36467, r36468, r36469, r36470, r36471, r36472, r36473, r36474, r36475, r36476, r36477, r36478, r36479, r36480, r36481, r36482, r36483, r36484, r36485;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36467);
        mpfr_init(r36468);
        mpfr_init(r36469);
        mpfr_init(r36470);
        mpfr_init(r36471);
        mpfr_init_set_str(r36472, "2", 10, MPFR_RNDN);
        mpfr_init(r36473);
        mpfr_init_set_str(r36474, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36475, "1", 10, MPFR_RNDN);
        mpfr_init(r36476);
        mpfr_init(r36477);
        mpfr_init_set_str(r36478, "3", 10, MPFR_RNDN);
        mpfr_init(r36479);
        mpfr_init(r36480);
        mpfr_init(r36481);
        mpfr_init(r36482);
        mpfr_init(r36483);
        mpfr_init(r36484);
        mpfr_init(r36485);
}

double f_im(double a, double b) {
        mpfr_set_d(r36467, a, MPFR_RNDN);
        mpfr_mul(r36468, r36467, r36467, MPFR_RNDN);
        mpfr_set_d(r36469, b, MPFR_RNDN);
        mpfr_mul(r36470, r36469, r36469, MPFR_RNDN);
        mpfr_add(r36471, r36468, r36470, MPFR_RNDN);
        ;
        mpfr_pow(r36473, r36471, r36472, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36476, r36475, r36467, MPFR_RNDN);
        mpfr_mul(r36477, r36468, r36476, MPFR_RNDN);
        ;
        mpfr_mul(r36479, r36478, r36467, MPFR_RNDN);
        mpfr_sub(r36480, r36475, r36479, MPFR_RNDN);
        mpfr_mul(r36481, r36470, r36480, MPFR_RNDN);
        mpfr_add(r36482, r36477, r36481, MPFR_RNDN);
        mpfr_mul(r36483, r36474, r36482, MPFR_RNDN);
        mpfr_add(r36484, r36473, r36483, MPFR_RNDN);
        mpfr_sub(r36485, r36484, r36475, MPFR_RNDN);
        return mpfr_get_d(r36485, MPFR_RNDN);
}

static mpfr_t r36486, r36487, r36488, r36489, r36490, r36491, r36492, r36493, r36494, r36495, r36496, r36497, r36498, r36499, r36500, r36501, r36502, r36503, r36504;

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

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

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

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

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

