#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 r28428 = a;
        float r28429 = r28428 * r28428;
        float r28430 = b;
        float r28431 = r28430 * r28430;
        float r28432 = r28429 + r28431;
        float r28433 = 2;
        float r28434 = pow(r28432, r28433);
        float r28435 = 4;
        float r28436 = 1;
        float r28437 = r28436 - r28428;
        float r28438 = r28429 * r28437;
        float r28439 = 3;
        float r28440 = r28439 + r28428;
        float r28441 = r28431 * r28440;
        float r28442 = r28438 + r28441;
        float r28443 = r28435 * r28442;
        float r28444 = r28434 + r28443;
        float r28445 = r28444 - r28436;
        return r28445;
}

double f_id(double a, double b) {
        double r28446 = a;
        double r28447 = r28446 * r28446;
        double r28448 = b;
        double r28449 = r28448 * r28448;
        double r28450 = r28447 + r28449;
        double r28451 = 2;
        double r28452 = pow(r28450, r28451);
        double r28453 = 4;
        double r28454 = 1;
        double r28455 = r28454 - r28446;
        double r28456 = r28447 * r28455;
        double r28457 = 3;
        double r28458 = r28457 + r28446;
        double r28459 = r28449 * r28458;
        double r28460 = r28456 + r28459;
        double r28461 = r28453 * r28460;
        double r28462 = r28452 + r28461;
        double r28463 = r28462 - r28454;
        return r28463;
}


double f_of(float a, float b) {
        float r28464 = a;
        float r28465 = r28464 * r28464;
        float r28466 = b;
        float r28467 = r28466 * r28466;
        float r28468 = r28465 + r28467;
        float r28469 = 2;
        float r28470 = pow(r28468, r28469);
        float r28471 = 4;
        float r28472 = 1;
        float r28473 = r28472 - r28464;
        float r28474 = r28465 * r28473;
        float r28475 = 3;
        float r28476 = r28475 + r28464;
        float r28477 = r28467 * r28476;
        float r28478 = r28474 + r28477;
        float r28479 = r28471 * r28478;
        float r28480 = r28470 + r28479;
        float r28481 = r28480 - r28472;
        return r28481;
}

double f_od(double a, double b) {
        double r28482 = a;
        double r28483 = r28482 * r28482;
        double r28484 = b;
        double r28485 = r28484 * r28484;
        double r28486 = r28483 + r28485;
        double r28487 = 2;
        double r28488 = pow(r28486, r28487);
        double r28489 = 4;
        double r28490 = 1;
        double r28491 = r28490 - r28482;
        double r28492 = r28483 * r28491;
        double r28493 = 3;
        double r28494 = r28493 + r28482;
        double r28495 = r28485 * r28494;
        double r28496 = r28492 + r28495;
        double r28497 = r28489 * r28496;
        double r28498 = r28488 + r28497;
        double r28499 = r28498 - r28490;
        return r28499;
}

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 r28500, r28501, r28502, r28503, r28504, r28505, r28506, r28507, r28508, r28509, r28510, r28511, r28512, r28513, r28514, r28515, r28516, r28517;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r28500);
        mpfr_init(r28501);
        mpfr_init(r28502);
        mpfr_init(r28503);
        mpfr_init(r28504);
        mpfr_init_set_str(r28505, "2", 10, MPFR_RNDN);
        mpfr_init(r28506);
        mpfr_init_set_str(r28507, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28508, "1", 10, MPFR_RNDN);
        mpfr_init(r28509);
        mpfr_init(r28510);
        mpfr_init_set_str(r28511, "3", 10, MPFR_RNDN);
        mpfr_init(r28512);
        mpfr_init(r28513);
        mpfr_init(r28514);
        mpfr_init(r28515);
        mpfr_init(r28516);
        mpfr_init(r28517);
}

double f_im(double a, double b) {
        mpfr_set_d(r28500, a, MPFR_RNDN);
        mpfr_mul(r28501, r28500, r28500, MPFR_RNDN);
        mpfr_set_d(r28502, b, MPFR_RNDN);
        mpfr_mul(r28503, r28502, r28502, MPFR_RNDN);
        mpfr_add(r28504, r28501, r28503, MPFR_RNDN);
        ;
        mpfr_pow(r28506, r28504, r28505, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r28509, r28508, r28500, MPFR_RNDN);
        mpfr_mul(r28510, r28501, r28509, MPFR_RNDN);
        ;
        mpfr_add(r28512, r28511, r28500, MPFR_RNDN);
        mpfr_mul(r28513, r28503, r28512, MPFR_RNDN);
        mpfr_add(r28514, r28510, r28513, MPFR_RNDN);
        mpfr_mul(r28515, r28507, r28514, MPFR_RNDN);
        mpfr_add(r28516, r28506, r28515, MPFR_RNDN);
        mpfr_sub(r28517, r28516, r28508, MPFR_RNDN);
        return mpfr_get_d(r28517, MPFR_RNDN);
}

static mpfr_t r28518, r28519, r28520, r28521, r28522, r28523, r28524, r28525, r28526, r28527, r28528, r28529, r28530, r28531, r28532, r28533, r28534, r28535;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r28518);
        mpfr_init(r28519);
        mpfr_init(r28520);
        mpfr_init(r28521);
        mpfr_init(r28522);
        mpfr_init_set_str(r28523, "2", 10, MPFR_RNDN);
        mpfr_init(r28524);
        mpfr_init_set_str(r28525, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28526, "1", 10, MPFR_RNDN);
        mpfr_init(r28527);
        mpfr_init(r28528);
        mpfr_init_set_str(r28529, "3", 10, MPFR_RNDN);
        mpfr_init(r28530);
        mpfr_init(r28531);
        mpfr_init(r28532);
        mpfr_init(r28533);
        mpfr_init(r28534);
        mpfr_init(r28535);
}

double f_fm(double a, double b) {
        mpfr_set_d(r28518, a, MPFR_RNDN);
        mpfr_mul(r28519, r28518, r28518, MPFR_RNDN);
        mpfr_set_d(r28520, b, MPFR_RNDN);
        mpfr_mul(r28521, r28520, r28520, MPFR_RNDN);
        mpfr_add(r28522, r28519, r28521, MPFR_RNDN);
        ;
        mpfr_pow(r28524, r28522, r28523, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r28527, r28526, r28518, MPFR_RNDN);
        mpfr_mul(r28528, r28519, r28527, MPFR_RNDN);
        ;
        mpfr_add(r28530, r28529, r28518, MPFR_RNDN);
        mpfr_mul(r28531, r28521, r28530, MPFR_RNDN);
        mpfr_add(r28532, r28528, r28531, MPFR_RNDN);
        mpfr_mul(r28533, r28525, r28532, MPFR_RNDN);
        mpfr_add(r28534, r28524, r28533, MPFR_RNDN);
        mpfr_sub(r28535, r28534, r28526, MPFR_RNDN);
        return mpfr_get_d(r28535, MPFR_RNDN);
}

static mpfr_t r28536, r28537, r28538, r28539, r28540, r28541, r28542, r28543, r28544, r28545, r28546, r28547, r28548, r28549, r28550, r28551, r28552, r28553;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r28536);
        mpfr_init(r28537);
        mpfr_init(r28538);
        mpfr_init(r28539);
        mpfr_init(r28540);
        mpfr_init_set_str(r28541, "2", 10, MPFR_RNDN);
        mpfr_init(r28542);
        mpfr_init_set_str(r28543, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28544, "1", 10, MPFR_RNDN);
        mpfr_init(r28545);
        mpfr_init(r28546);
        mpfr_init_set_str(r28547, "3", 10, MPFR_RNDN);
        mpfr_init(r28548);
        mpfr_init(r28549);
        mpfr_init(r28550);
        mpfr_init(r28551);
        mpfr_init(r28552);
        mpfr_init(r28553);
}

double f_dm(double a, double b) {
        mpfr_set_d(r28536, a, MPFR_RNDN);
        mpfr_mul(r28537, r28536, r28536, MPFR_RNDN);
        mpfr_set_d(r28538, b, MPFR_RNDN);
        mpfr_mul(r28539, r28538, r28538, MPFR_RNDN);
        mpfr_add(r28540, r28537, r28539, MPFR_RNDN);
        ;
        mpfr_pow(r28542, r28540, r28541, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r28545, r28544, r28536, MPFR_RNDN);
        mpfr_mul(r28546, r28537, r28545, MPFR_RNDN);
        ;
        mpfr_add(r28548, r28547, r28536, MPFR_RNDN);
        mpfr_mul(r28549, r28539, r28548, MPFR_RNDN);
        mpfr_add(r28550, r28546, r28549, MPFR_RNDN);
        mpfr_mul(r28551, r28543, r28550, MPFR_RNDN);
        mpfr_add(r28552, r28542, r28551, MPFR_RNDN);
        mpfr_sub(r28553, r28552, r28544, MPFR_RNDN);
        return mpfr_get_d(r28553, MPFR_RNDN);
}

