#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 r24667 = a;
        float r24668 = r24667 * r24667;
        float r24669 = b;
        float r24670 = r24669 * r24669;
        float r24671 = r24668 + r24670;
        float r24672 = 2;
        float r24673 = pow(r24671, r24672);
        float r24674 = 4;
        float r24675 = 1;
        float r24676 = r24675 + r24667;
        float r24677 = r24668 * r24676;
        float r24678 = 3;
        float r24679 = r24678 * r24667;
        float r24680 = r24675 - r24679;
        float r24681 = r24670 * r24680;
        float r24682 = r24677 + r24681;
        float r24683 = r24674 * r24682;
        float r24684 = r24673 + r24683;
        float r24685 = r24684 - r24675;
        return r24685;
}

double f_id(double a, double b) {
        double r24686 = a;
        double r24687 = r24686 * r24686;
        double r24688 = b;
        double r24689 = r24688 * r24688;
        double r24690 = r24687 + r24689;
        double r24691 = 2;
        double r24692 = pow(r24690, r24691);
        double r24693 = 4;
        double r24694 = 1;
        double r24695 = r24694 + r24686;
        double r24696 = r24687 * r24695;
        double r24697 = 3;
        double r24698 = r24697 * r24686;
        double r24699 = r24694 - r24698;
        double r24700 = r24689 * r24699;
        double r24701 = r24696 + r24700;
        double r24702 = r24693 * r24701;
        double r24703 = r24692 + r24702;
        double r24704 = r24703 - r24694;
        return r24704;
}


double f_of(float a, float b) {
        float r24705 = a;
        float r24706 = r24705 * r24705;
        float r24707 = b;
        float r24708 = r24707 * r24707;
        float r24709 = r24706 + r24708;
        float r24710 = 2;
        float r24711 = pow(r24709, r24710);
        float r24712 = 4;
        float r24713 = 1;
        float r24714 = r24713 + r24705;
        float r24715 = r24706 * r24714;
        float r24716 = 3;
        float r24717 = r24716 * r24705;
        float r24718 = r24713 - r24717;
        float r24719 = r24708 * r24718;
        float r24720 = r24715 + r24719;
        float r24721 = r24712 * r24720;
        float r24722 = r24711 + r24721;
        float r24723 = r24722 - r24713;
        return r24723;
}

double f_od(double a, double b) {
        double r24724 = a;
        double r24725 = r24724 * r24724;
        double r24726 = b;
        double r24727 = r24726 * r24726;
        double r24728 = r24725 + r24727;
        double r24729 = 2;
        double r24730 = pow(r24728, r24729);
        double r24731 = 4;
        double r24732 = 1;
        double r24733 = r24732 + r24724;
        double r24734 = r24725 * r24733;
        double r24735 = 3;
        double r24736 = r24735 * r24724;
        double r24737 = r24732 - r24736;
        double r24738 = r24727 * r24737;
        double r24739 = r24734 + r24738;
        double r24740 = r24731 * r24739;
        double r24741 = r24730 + r24740;
        double r24742 = r24741 - r24732;
        return r24742;
}

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 r24743, r24744, r24745, r24746, r24747, r24748, r24749, r24750, r24751, r24752, r24753, r24754, r24755, r24756, r24757, r24758, r24759, r24760, r24761;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r24743);
        mpfr_init(r24744);
        mpfr_init(r24745);
        mpfr_init(r24746);
        mpfr_init(r24747);
        mpfr_init_set_str(r24748, "2", 10, MPFR_RNDN);
        mpfr_init(r24749);
        mpfr_init_set_str(r24750, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r24751, "1", 10, MPFR_RNDN);
        mpfr_init(r24752);
        mpfr_init(r24753);
        mpfr_init_set_str(r24754, "3", 10, MPFR_RNDN);
        mpfr_init(r24755);
        mpfr_init(r24756);
        mpfr_init(r24757);
        mpfr_init(r24758);
        mpfr_init(r24759);
        mpfr_init(r24760);
        mpfr_init(r24761);
}

double f_im(double a, double b) {
        mpfr_set_d(r24743, a, MPFR_RNDN);
        mpfr_mul(r24744, r24743, r24743, MPFR_RNDN);
        mpfr_set_d(r24745, b, MPFR_RNDN);
        mpfr_mul(r24746, r24745, r24745, MPFR_RNDN);
        mpfr_add(r24747, r24744, r24746, MPFR_RNDN);
        ;
        mpfr_pow(r24749, r24747, r24748, MPFR_RNDN);
        ;
        ;
        mpfr_add(r24752, r24751, r24743, MPFR_RNDN);
        mpfr_mul(r24753, r24744, r24752, MPFR_RNDN);
        ;
        mpfr_mul(r24755, r24754, r24743, MPFR_RNDN);
        mpfr_sub(r24756, r24751, r24755, MPFR_RNDN);
        mpfr_mul(r24757, r24746, r24756, MPFR_RNDN);
        mpfr_add(r24758, r24753, r24757, MPFR_RNDN);
        mpfr_mul(r24759, r24750, r24758, MPFR_RNDN);
        mpfr_add(r24760, r24749, r24759, MPFR_RNDN);
        mpfr_sub(r24761, r24760, r24751, MPFR_RNDN);
        return mpfr_get_d(r24761, MPFR_RNDN);
}

static mpfr_t r24762, r24763, r24764, r24765, r24766, r24767, r24768, r24769, r24770, r24771, r24772, r24773, r24774, r24775, r24776, r24777, r24778, r24779, r24780;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r24762);
        mpfr_init(r24763);
        mpfr_init(r24764);
        mpfr_init(r24765);
        mpfr_init(r24766);
        mpfr_init_set_str(r24767, "2", 10, MPFR_RNDN);
        mpfr_init(r24768);
        mpfr_init_set_str(r24769, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r24770, "1", 10, MPFR_RNDN);
        mpfr_init(r24771);
        mpfr_init(r24772);
        mpfr_init_set_str(r24773, "3", 10, MPFR_RNDN);
        mpfr_init(r24774);
        mpfr_init(r24775);
        mpfr_init(r24776);
        mpfr_init(r24777);
        mpfr_init(r24778);
        mpfr_init(r24779);
        mpfr_init(r24780);
}

double f_fm(double a, double b) {
        mpfr_set_d(r24762, a, MPFR_RNDN);
        mpfr_mul(r24763, r24762, r24762, MPFR_RNDN);
        mpfr_set_d(r24764, b, MPFR_RNDN);
        mpfr_mul(r24765, r24764, r24764, MPFR_RNDN);
        mpfr_add(r24766, r24763, r24765, MPFR_RNDN);
        ;
        mpfr_pow(r24768, r24766, r24767, MPFR_RNDN);
        ;
        ;
        mpfr_add(r24771, r24770, r24762, MPFR_RNDN);
        mpfr_mul(r24772, r24763, r24771, MPFR_RNDN);
        ;
        mpfr_mul(r24774, r24773, r24762, MPFR_RNDN);
        mpfr_sub(r24775, r24770, r24774, MPFR_RNDN);
        mpfr_mul(r24776, r24765, r24775, MPFR_RNDN);
        mpfr_add(r24777, r24772, r24776, MPFR_RNDN);
        mpfr_mul(r24778, r24769, r24777, MPFR_RNDN);
        mpfr_add(r24779, r24768, r24778, MPFR_RNDN);
        mpfr_sub(r24780, r24779, r24770, MPFR_RNDN);
        return mpfr_get_d(r24780, MPFR_RNDN);
}

static mpfr_t r24781, r24782, r24783, r24784, r24785, r24786, r24787, r24788, r24789, r24790, r24791, r24792, r24793, r24794, r24795, r24796, r24797, r24798, r24799;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r24781);
        mpfr_init(r24782);
        mpfr_init(r24783);
        mpfr_init(r24784);
        mpfr_init(r24785);
        mpfr_init_set_str(r24786, "2", 10, MPFR_RNDN);
        mpfr_init(r24787);
        mpfr_init_set_str(r24788, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r24789, "1", 10, MPFR_RNDN);
        mpfr_init(r24790);
        mpfr_init(r24791);
        mpfr_init_set_str(r24792, "3", 10, MPFR_RNDN);
        mpfr_init(r24793);
        mpfr_init(r24794);
        mpfr_init(r24795);
        mpfr_init(r24796);
        mpfr_init(r24797);
        mpfr_init(r24798);
        mpfr_init(r24799);
}

double f_dm(double a, double b) {
        mpfr_set_d(r24781, a, MPFR_RNDN);
        mpfr_mul(r24782, r24781, r24781, MPFR_RNDN);
        mpfr_set_d(r24783, b, MPFR_RNDN);
        mpfr_mul(r24784, r24783, r24783, MPFR_RNDN);
        mpfr_add(r24785, r24782, r24784, MPFR_RNDN);
        ;
        mpfr_pow(r24787, r24785, r24786, MPFR_RNDN);
        ;
        ;
        mpfr_add(r24790, r24789, r24781, MPFR_RNDN);
        mpfr_mul(r24791, r24782, r24790, MPFR_RNDN);
        ;
        mpfr_mul(r24793, r24792, r24781, MPFR_RNDN);
        mpfr_sub(r24794, r24789, r24793, MPFR_RNDN);
        mpfr_mul(r24795, r24784, r24794, MPFR_RNDN);
        mpfr_add(r24796, r24791, r24795, MPFR_RNDN);
        mpfr_mul(r24797, r24788, r24796, MPFR_RNDN);
        mpfr_add(r24798, r24787, r24797, MPFR_RNDN);
        mpfr_sub(r24799, r24798, r24789, MPFR_RNDN);
        return mpfr_get_d(r24799, MPFR_RNDN);
}

