#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 r30465393 = a;
        float r30465394 = r30465393 * r30465393;
        float r30465395 = b;
        float r30465396 = r30465395 * r30465395;
        float r30465397 = r30465394 + r30465396;
        float r30465398 = 2;
        float r30465399 = pow(r30465397, r30465398);
        float r30465400 = 4;
        float r30465401 = 1;
        float r30465402 = r30465401 - r30465393;
        float r30465403 = r30465394 * r30465402;
        float r30465404 = 3;
        float r30465405 = r30465404 + r30465393;
        float r30465406 = r30465396 * r30465405;
        float r30465407 = r30465403 + r30465406;
        float r30465408 = r30465400 * r30465407;
        float r30465409 = r30465399 + r30465408;
        float r30465410 = r30465409 - r30465401;
        return r30465410;
}

double f_id(double a, double b) {
        double r30465411 = a;
        double r30465412 = r30465411 * r30465411;
        double r30465413 = b;
        double r30465414 = r30465413 * r30465413;
        double r30465415 = r30465412 + r30465414;
        double r30465416 = 2;
        double r30465417 = pow(r30465415, r30465416);
        double r30465418 = 4;
        double r30465419 = 1;
        double r30465420 = r30465419 - r30465411;
        double r30465421 = r30465412 * r30465420;
        double r30465422 = 3;
        double r30465423 = r30465422 + r30465411;
        double r30465424 = r30465414 * r30465423;
        double r30465425 = r30465421 + r30465424;
        double r30465426 = r30465418 * r30465425;
        double r30465427 = r30465417 + r30465426;
        double r30465428 = r30465427 - r30465419;
        return r30465428;
}


double f_of(float a, float b) {
        float r30465429 = a;
        float r30465430 = r30465429 * r30465429;
        float r30465431 = b;
        float r30465432 = r30465431 * r30465431;
        float r30465433 = r30465430 + r30465432;
        float r30465434 = 2;
        float r30465435 = pow(r30465433, r30465434);
        float r30465436 = 4;
        float r30465437 = 1;
        float r30465438 = r30465437 - r30465429;
        float r30465439 = r30465430 * r30465438;
        float r30465440 = 3;
        float r30465441 = r30465440 + r30465429;
        float r30465442 = r30465432 * r30465441;
        float r30465443 = r30465439 + r30465442;
        float r30465444 = r30465436 * r30465443;
        float r30465445 = r30465435 + r30465444;
        float r30465446 = r30465445 - r30465437;
        return r30465446;
}

double f_od(double a, double b) {
        double r30465447 = a;
        double r30465448 = r30465447 * r30465447;
        double r30465449 = b;
        double r30465450 = r30465449 * r30465449;
        double r30465451 = r30465448 + r30465450;
        double r30465452 = 2;
        double r30465453 = pow(r30465451, r30465452);
        double r30465454 = 4;
        double r30465455 = 1;
        double r30465456 = r30465455 - r30465447;
        double r30465457 = r30465448 * r30465456;
        double r30465458 = 3;
        double r30465459 = r30465458 + r30465447;
        double r30465460 = r30465450 * r30465459;
        double r30465461 = r30465457 + r30465460;
        double r30465462 = r30465454 * r30465461;
        double r30465463 = r30465453 + r30465462;
        double r30465464 = r30465463 - r30465455;
        return r30465464;
}

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 r30465465, r30465466, r30465467, r30465468, r30465469, r30465470, r30465471, r30465472, r30465473, r30465474, r30465475, r30465476, r30465477, r30465478, r30465479, r30465480, r30465481, r30465482;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r30465465);
        mpfr_init(r30465466);
        mpfr_init(r30465467);
        mpfr_init(r30465468);
        mpfr_init(r30465469);
        mpfr_init_set_str(r30465470, "2", 10, MPFR_RNDN);
        mpfr_init(r30465471);
        mpfr_init_set_str(r30465472, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r30465473, "1", 10, MPFR_RNDN);
        mpfr_init(r30465474);
        mpfr_init(r30465475);
        mpfr_init_set_str(r30465476, "3", 10, MPFR_RNDN);
        mpfr_init(r30465477);
        mpfr_init(r30465478);
        mpfr_init(r30465479);
        mpfr_init(r30465480);
        mpfr_init(r30465481);
        mpfr_init(r30465482);
}

double f_im(double a, double b) {
        mpfr_set_d(r30465465, a, MPFR_RNDN);
        mpfr_mul(r30465466, r30465465, r30465465, MPFR_RNDN);
        mpfr_set_d(r30465467, b, MPFR_RNDN);
        mpfr_mul(r30465468, r30465467, r30465467, MPFR_RNDN);
        mpfr_add(r30465469, r30465466, r30465468, MPFR_RNDN);
        ;
        mpfr_pow(r30465471, r30465469, r30465470, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r30465474, r30465473, r30465465, MPFR_RNDN);
        mpfr_mul(r30465475, r30465466, r30465474, MPFR_RNDN);
        ;
        mpfr_add(r30465477, r30465476, r30465465, MPFR_RNDN);
        mpfr_mul(r30465478, r30465468, r30465477, MPFR_RNDN);
        mpfr_add(r30465479, r30465475, r30465478, MPFR_RNDN);
        mpfr_mul(r30465480, r30465472, r30465479, MPFR_RNDN);
        mpfr_add(r30465481, r30465471, r30465480, MPFR_RNDN);
        mpfr_sub(r30465482, r30465481, r30465473, MPFR_RNDN);
        return mpfr_get_d(r30465482, MPFR_RNDN);
}

static mpfr_t r30465483, r30465484, r30465485, r30465486, r30465487, r30465488, r30465489, r30465490, r30465491, r30465492, r30465493, r30465494, r30465495, r30465496, r30465497, r30465498, r30465499, r30465500;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r30465483);
        mpfr_init(r30465484);
        mpfr_init(r30465485);
        mpfr_init(r30465486);
        mpfr_init(r30465487);
        mpfr_init_set_str(r30465488, "2", 10, MPFR_RNDN);
        mpfr_init(r30465489);
        mpfr_init_set_str(r30465490, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r30465491, "1", 10, MPFR_RNDN);
        mpfr_init(r30465492);
        mpfr_init(r30465493);
        mpfr_init_set_str(r30465494, "3", 10, MPFR_RNDN);
        mpfr_init(r30465495);
        mpfr_init(r30465496);
        mpfr_init(r30465497);
        mpfr_init(r30465498);
        mpfr_init(r30465499);
        mpfr_init(r30465500);
}

double f_fm(double a, double b) {
        mpfr_set_d(r30465483, a, MPFR_RNDN);
        mpfr_mul(r30465484, r30465483, r30465483, MPFR_RNDN);
        mpfr_set_d(r30465485, b, MPFR_RNDN);
        mpfr_mul(r30465486, r30465485, r30465485, MPFR_RNDN);
        mpfr_add(r30465487, r30465484, r30465486, MPFR_RNDN);
        ;
        mpfr_pow(r30465489, r30465487, r30465488, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r30465492, r30465491, r30465483, MPFR_RNDN);
        mpfr_mul(r30465493, r30465484, r30465492, MPFR_RNDN);
        ;
        mpfr_add(r30465495, r30465494, r30465483, MPFR_RNDN);
        mpfr_mul(r30465496, r30465486, r30465495, MPFR_RNDN);
        mpfr_add(r30465497, r30465493, r30465496, MPFR_RNDN);
        mpfr_mul(r30465498, r30465490, r30465497, MPFR_RNDN);
        mpfr_add(r30465499, r30465489, r30465498, MPFR_RNDN);
        mpfr_sub(r30465500, r30465499, r30465491, MPFR_RNDN);
        return mpfr_get_d(r30465500, MPFR_RNDN);
}

static mpfr_t r30465501, r30465502, r30465503, r30465504, r30465505, r30465506, r30465507, r30465508, r30465509, r30465510, r30465511, r30465512, r30465513, r30465514, r30465515, r30465516, r30465517, r30465518;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r30465501);
        mpfr_init(r30465502);
        mpfr_init(r30465503);
        mpfr_init(r30465504);
        mpfr_init(r30465505);
        mpfr_init_set_str(r30465506, "2", 10, MPFR_RNDN);
        mpfr_init(r30465507);
        mpfr_init_set_str(r30465508, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r30465509, "1", 10, MPFR_RNDN);
        mpfr_init(r30465510);
        mpfr_init(r30465511);
        mpfr_init_set_str(r30465512, "3", 10, MPFR_RNDN);
        mpfr_init(r30465513);
        mpfr_init(r30465514);
        mpfr_init(r30465515);
        mpfr_init(r30465516);
        mpfr_init(r30465517);
        mpfr_init(r30465518);
}

double f_dm(double a, double b) {
        mpfr_set_d(r30465501, a, MPFR_RNDN);
        mpfr_mul(r30465502, r30465501, r30465501, MPFR_RNDN);
        mpfr_set_d(r30465503, b, MPFR_RNDN);
        mpfr_mul(r30465504, r30465503, r30465503, MPFR_RNDN);
        mpfr_add(r30465505, r30465502, r30465504, MPFR_RNDN);
        ;
        mpfr_pow(r30465507, r30465505, r30465506, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r30465510, r30465509, r30465501, MPFR_RNDN);
        mpfr_mul(r30465511, r30465502, r30465510, MPFR_RNDN);
        ;
        mpfr_add(r30465513, r30465512, r30465501, MPFR_RNDN);
        mpfr_mul(r30465514, r30465504, r30465513, MPFR_RNDN);
        mpfr_add(r30465515, r30465511, r30465514, MPFR_RNDN);
        mpfr_mul(r30465516, r30465508, r30465515, MPFR_RNDN);
        mpfr_add(r30465517, r30465507, r30465516, MPFR_RNDN);
        mpfr_sub(r30465518, r30465517, r30465509, MPFR_RNDN);
        return mpfr_get_d(r30465518, MPFR_RNDN);
}

