#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 r36524 = a;
        float r36525 = r36524 * r36524;
        float r36526 = b;
        float r36527 = r36526 * r36526;
        float r36528 = r36525 + r36527;
        float r36529 = 2;
        float r36530 = pow(r36528, r36529);
        float r36531 = 4;
        float r36532 = 1;
        float r36533 = r36532 + r36524;
        float r36534 = r36525 * r36533;
        float r36535 = 3;
        float r36536 = r36535 * r36524;
        float r36537 = r36532 - r36536;
        float r36538 = r36527 * r36537;
        float r36539 = r36534 + r36538;
        float r36540 = r36531 * r36539;
        float r36541 = r36530 + r36540;
        float r36542 = r36541 - r36532;
        return r36542;
}

double f_id(double a, double b) {
        double r36543 = a;
        double r36544 = r36543 * r36543;
        double r36545 = b;
        double r36546 = r36545 * r36545;
        double r36547 = r36544 + r36546;
        double r36548 = 2;
        double r36549 = pow(r36547, r36548);
        double r36550 = 4;
        double r36551 = 1;
        double r36552 = r36551 + r36543;
        double r36553 = r36544 * r36552;
        double r36554 = 3;
        double r36555 = r36554 * r36543;
        double r36556 = r36551 - r36555;
        double r36557 = r36546 * r36556;
        double r36558 = r36553 + r36557;
        double r36559 = r36550 * r36558;
        double r36560 = r36549 + r36559;
        double r36561 = r36560 - r36551;
        return r36561;
}


double f_of(float a, float b) {
        float r36562 = a;
        float r36563 = r36562 * r36562;
        float r36564 = b;
        float r36565 = r36564 * r36564;
        float r36566 = r36563 + r36565;
        float r36567 = 2;
        float r36568 = pow(r36566, r36567);
        float r36569 = 4;
        float r36570 = 1;
        float r36571 = r36570 + r36562;
        float r36572 = r36563 * r36571;
        float r36573 = 3;
        float r36574 = r36573 * r36562;
        float r36575 = r36570 - r36574;
        float r36576 = r36565 * r36575;
        float r36577 = r36572 + r36576;
        float r36578 = r36569 * r36577;
        float r36579 = r36568 + r36578;
        float r36580 = r36579 - r36570;
        return r36580;
}

double f_od(double a, double b) {
        double r36581 = a;
        double r36582 = r36581 * r36581;
        double r36583 = b;
        double r36584 = r36583 * r36583;
        double r36585 = r36582 + r36584;
        double r36586 = 2;
        double r36587 = pow(r36585, r36586);
        double r36588 = 4;
        double r36589 = 1;
        double r36590 = r36589 + r36581;
        double r36591 = r36582 * r36590;
        double r36592 = 3;
        double r36593 = r36592 * r36581;
        double r36594 = r36589 - r36593;
        double r36595 = r36584 * r36594;
        double r36596 = r36591 + r36595;
        double r36597 = r36588 * r36596;
        double r36598 = r36587 + r36597;
        double r36599 = r36598 - r36589;
        return r36599;
}

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 r36600, r36601, r36602, r36603, r36604, r36605, r36606, r36607, r36608, r36609, r36610, r36611, r36612, r36613, r36614, r36615, r36616, r36617, r36618;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36600);
        mpfr_init(r36601);
        mpfr_init(r36602);
        mpfr_init(r36603);
        mpfr_init(r36604);
        mpfr_init_set_str(r36605, "2", 10, MPFR_RNDN);
        mpfr_init(r36606);
        mpfr_init_set_str(r36607, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36608, "1", 10, MPFR_RNDN);
        mpfr_init(r36609);
        mpfr_init(r36610);
        mpfr_init_set_str(r36611, "3", 10, MPFR_RNDN);
        mpfr_init(r36612);
        mpfr_init(r36613);
        mpfr_init(r36614);
        mpfr_init(r36615);
        mpfr_init(r36616);
        mpfr_init(r36617);
        mpfr_init(r36618);
}

double f_im(double a, double b) {
        mpfr_set_d(r36600, a, MPFR_RNDN);
        mpfr_mul(r36601, r36600, r36600, MPFR_RNDN);
        mpfr_set_d(r36602, b, MPFR_RNDN);
        mpfr_mul(r36603, r36602, r36602, MPFR_RNDN);
        mpfr_add(r36604, r36601, r36603, MPFR_RNDN);
        ;
        mpfr_pow(r36606, r36604, r36605, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36609, r36608, r36600, MPFR_RNDN);
        mpfr_mul(r36610, r36601, r36609, MPFR_RNDN);
        ;
        mpfr_mul(r36612, r36611, r36600, MPFR_RNDN);
        mpfr_sub(r36613, r36608, r36612, MPFR_RNDN);
        mpfr_mul(r36614, r36603, r36613, MPFR_RNDN);
        mpfr_add(r36615, r36610, r36614, MPFR_RNDN);
        mpfr_mul(r36616, r36607, r36615, MPFR_RNDN);
        mpfr_add(r36617, r36606, r36616, MPFR_RNDN);
        mpfr_sub(r36618, r36617, r36608, MPFR_RNDN);
        return mpfr_get_d(r36618, MPFR_RNDN);
}

static mpfr_t r36619, r36620, r36621, r36622, r36623, r36624, r36625, r36626, r36627, r36628, r36629, r36630, r36631, r36632, r36633, r36634, r36635, r36636, r36637;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36619);
        mpfr_init(r36620);
        mpfr_init(r36621);
        mpfr_init(r36622);
        mpfr_init(r36623);
        mpfr_init_set_str(r36624, "2", 10, MPFR_RNDN);
        mpfr_init(r36625);
        mpfr_init_set_str(r36626, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36627, "1", 10, MPFR_RNDN);
        mpfr_init(r36628);
        mpfr_init(r36629);
        mpfr_init_set_str(r36630, "3", 10, MPFR_RNDN);
        mpfr_init(r36631);
        mpfr_init(r36632);
        mpfr_init(r36633);
        mpfr_init(r36634);
        mpfr_init(r36635);
        mpfr_init(r36636);
        mpfr_init(r36637);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36619, a, MPFR_RNDN);
        mpfr_mul(r36620, r36619, r36619, MPFR_RNDN);
        mpfr_set_d(r36621, b, MPFR_RNDN);
        mpfr_mul(r36622, r36621, r36621, MPFR_RNDN);
        mpfr_add(r36623, r36620, r36622, MPFR_RNDN);
        ;
        mpfr_pow(r36625, r36623, r36624, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36628, r36627, r36619, MPFR_RNDN);
        mpfr_mul(r36629, r36620, r36628, MPFR_RNDN);
        ;
        mpfr_mul(r36631, r36630, r36619, MPFR_RNDN);
        mpfr_sub(r36632, r36627, r36631, MPFR_RNDN);
        mpfr_mul(r36633, r36622, r36632, MPFR_RNDN);
        mpfr_add(r36634, r36629, r36633, MPFR_RNDN);
        mpfr_mul(r36635, r36626, r36634, MPFR_RNDN);
        mpfr_add(r36636, r36625, r36635, MPFR_RNDN);
        mpfr_sub(r36637, r36636, r36627, MPFR_RNDN);
        return mpfr_get_d(r36637, MPFR_RNDN);
}

static mpfr_t r36638, r36639, r36640, r36641, r36642, r36643, r36644, r36645, r36646, r36647, r36648, r36649, r36650, r36651, r36652, r36653, r36654, r36655, r36656;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36638);
        mpfr_init(r36639);
        mpfr_init(r36640);
        mpfr_init(r36641);
        mpfr_init(r36642);
        mpfr_init_set_str(r36643, "2", 10, MPFR_RNDN);
        mpfr_init(r36644);
        mpfr_init_set_str(r36645, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36646, "1", 10, MPFR_RNDN);
        mpfr_init(r36647);
        mpfr_init(r36648);
        mpfr_init_set_str(r36649, "3", 10, MPFR_RNDN);
        mpfr_init(r36650);
        mpfr_init(r36651);
        mpfr_init(r36652);
        mpfr_init(r36653);
        mpfr_init(r36654);
        mpfr_init(r36655);
        mpfr_init(r36656);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36638, a, MPFR_RNDN);
        mpfr_mul(r36639, r36638, r36638, MPFR_RNDN);
        mpfr_set_d(r36640, b, MPFR_RNDN);
        mpfr_mul(r36641, r36640, r36640, MPFR_RNDN);
        mpfr_add(r36642, r36639, r36641, MPFR_RNDN);
        ;
        mpfr_pow(r36644, r36642, r36643, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36647, r36646, r36638, MPFR_RNDN);
        mpfr_mul(r36648, r36639, r36647, MPFR_RNDN);
        ;
        mpfr_mul(r36650, r36649, r36638, MPFR_RNDN);
        mpfr_sub(r36651, r36646, r36650, MPFR_RNDN);
        mpfr_mul(r36652, r36641, r36651, MPFR_RNDN);
        mpfr_add(r36653, r36648, r36652, MPFR_RNDN);
        mpfr_mul(r36654, r36645, r36653, MPFR_RNDN);
        mpfr_add(r36655, r36644, r36654, MPFR_RNDN);
        mpfr_sub(r36656, r36655, r36646, MPFR_RNDN);
        return mpfr_get_d(r36656, MPFR_RNDN);
}

