#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 r36716 = a;
        float r36717 = r36716 * r36716;
        float r36718 = b;
        float r36719 = r36718 * r36718;
        float r36720 = r36717 + r36719;
        float r36721 = 2;
        float r36722 = pow(r36720, r36721);
        float r36723 = 4;
        float r36724 = 1;
        float r36725 = r36724 + r36716;
        float r36726 = r36717 * r36725;
        float r36727 = 3;
        float r36728 = r36727 * r36716;
        float r36729 = r36724 - r36728;
        float r36730 = r36719 * r36729;
        float r36731 = r36726 + r36730;
        float r36732 = r36723 * r36731;
        float r36733 = r36722 + r36732;
        float r36734 = r36733 - r36724;
        return r36734;
}

double f_id(double a, double b) {
        double r36735 = a;
        double r36736 = r36735 * r36735;
        double r36737 = b;
        double r36738 = r36737 * r36737;
        double r36739 = r36736 + r36738;
        double r36740 = 2;
        double r36741 = pow(r36739, r36740);
        double r36742 = 4;
        double r36743 = 1;
        double r36744 = r36743 + r36735;
        double r36745 = r36736 * r36744;
        double r36746 = 3;
        double r36747 = r36746 * r36735;
        double r36748 = r36743 - r36747;
        double r36749 = r36738 * r36748;
        double r36750 = r36745 + r36749;
        double r36751 = r36742 * r36750;
        double r36752 = r36741 + r36751;
        double r36753 = r36752 - r36743;
        return r36753;
}


double f_of(float a, float b) {
        float r36754 = a;
        float r36755 = r36754 * r36754;
        float r36756 = b;
        float r36757 = r36756 * r36756;
        float r36758 = r36755 + r36757;
        float r36759 = 2;
        float r36760 = pow(r36758, r36759);
        float r36761 = 4;
        float r36762 = 1;
        float r36763 = r36762 + r36754;
        float r36764 = r36755 * r36763;
        float r36765 = 3;
        float r36766 = r36765 * r36754;
        float r36767 = r36762 - r36766;
        float r36768 = r36757 * r36767;
        float r36769 = r36764 + r36768;
        float r36770 = r36761 * r36769;
        float r36771 = r36760 + r36770;
        float r36772 = r36771 - r36762;
        return r36772;
}

double f_od(double a, double b) {
        double r36773 = a;
        double r36774 = r36773 * r36773;
        double r36775 = b;
        double r36776 = r36775 * r36775;
        double r36777 = r36774 + r36776;
        double r36778 = 2;
        double r36779 = pow(r36777, r36778);
        double r36780 = 4;
        double r36781 = 1;
        double r36782 = r36781 + r36773;
        double r36783 = r36774 * r36782;
        double r36784 = 3;
        double r36785 = r36784 * r36773;
        double r36786 = r36781 - r36785;
        double r36787 = r36776 * r36786;
        double r36788 = r36783 + r36787;
        double r36789 = r36780 * r36788;
        double r36790 = r36779 + r36789;
        double r36791 = r36790 - r36781;
        return r36791;
}

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 r36792, r36793, r36794, r36795, r36796, r36797, r36798, r36799, r36800, r36801, r36802, r36803, r36804, r36805, r36806, r36807, r36808, r36809, r36810;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36792);
        mpfr_init(r36793);
        mpfr_init(r36794);
        mpfr_init(r36795);
        mpfr_init(r36796);
        mpfr_init_set_str(r36797, "2", 10, MPFR_RNDN);
        mpfr_init(r36798);
        mpfr_init_set_str(r36799, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36800, "1", 10, MPFR_RNDN);
        mpfr_init(r36801);
        mpfr_init(r36802);
        mpfr_init_set_str(r36803, "3", 10, MPFR_RNDN);
        mpfr_init(r36804);
        mpfr_init(r36805);
        mpfr_init(r36806);
        mpfr_init(r36807);
        mpfr_init(r36808);
        mpfr_init(r36809);
        mpfr_init(r36810);
}

double f_im(double a, double b) {
        mpfr_set_d(r36792, a, MPFR_RNDN);
        mpfr_mul(r36793, r36792, r36792, MPFR_RNDN);
        mpfr_set_d(r36794, b, MPFR_RNDN);
        mpfr_mul(r36795, r36794, r36794, MPFR_RNDN);
        mpfr_add(r36796, r36793, r36795, MPFR_RNDN);
        ;
        mpfr_pow(r36798, r36796, r36797, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36801, r36800, r36792, MPFR_RNDN);
        mpfr_mul(r36802, r36793, r36801, MPFR_RNDN);
        ;
        mpfr_mul(r36804, r36803, r36792, MPFR_RNDN);
        mpfr_sub(r36805, r36800, r36804, MPFR_RNDN);
        mpfr_mul(r36806, r36795, r36805, MPFR_RNDN);
        mpfr_add(r36807, r36802, r36806, MPFR_RNDN);
        mpfr_mul(r36808, r36799, r36807, MPFR_RNDN);
        mpfr_add(r36809, r36798, r36808, MPFR_RNDN);
        mpfr_sub(r36810, r36809, r36800, MPFR_RNDN);
        return mpfr_get_d(r36810, MPFR_RNDN);
}

static mpfr_t r36811, r36812, r36813, r36814, r36815, r36816, r36817, r36818, r36819, r36820, r36821, r36822, r36823, r36824, r36825, r36826, r36827, r36828, r36829;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36811);
        mpfr_init(r36812);
        mpfr_init(r36813);
        mpfr_init(r36814);
        mpfr_init(r36815);
        mpfr_init_set_str(r36816, "2", 10, MPFR_RNDN);
        mpfr_init(r36817);
        mpfr_init_set_str(r36818, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36819, "1", 10, MPFR_RNDN);
        mpfr_init(r36820);
        mpfr_init(r36821);
        mpfr_init_set_str(r36822, "3", 10, MPFR_RNDN);
        mpfr_init(r36823);
        mpfr_init(r36824);
        mpfr_init(r36825);
        mpfr_init(r36826);
        mpfr_init(r36827);
        mpfr_init(r36828);
        mpfr_init(r36829);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36811, a, MPFR_RNDN);
        mpfr_mul(r36812, r36811, r36811, MPFR_RNDN);
        mpfr_set_d(r36813, b, MPFR_RNDN);
        mpfr_mul(r36814, r36813, r36813, MPFR_RNDN);
        mpfr_add(r36815, r36812, r36814, MPFR_RNDN);
        ;
        mpfr_pow(r36817, r36815, r36816, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36820, r36819, r36811, MPFR_RNDN);
        mpfr_mul(r36821, r36812, r36820, MPFR_RNDN);
        ;
        mpfr_mul(r36823, r36822, r36811, MPFR_RNDN);
        mpfr_sub(r36824, r36819, r36823, MPFR_RNDN);
        mpfr_mul(r36825, r36814, r36824, MPFR_RNDN);
        mpfr_add(r36826, r36821, r36825, MPFR_RNDN);
        mpfr_mul(r36827, r36818, r36826, MPFR_RNDN);
        mpfr_add(r36828, r36817, r36827, MPFR_RNDN);
        mpfr_sub(r36829, r36828, r36819, MPFR_RNDN);
        return mpfr_get_d(r36829, MPFR_RNDN);
}

static mpfr_t r36830, r36831, r36832, r36833, r36834, r36835, r36836, r36837, r36838, r36839, r36840, r36841, r36842, r36843, r36844, r36845, r36846, r36847, r36848;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36830);
        mpfr_init(r36831);
        mpfr_init(r36832);
        mpfr_init(r36833);
        mpfr_init(r36834);
        mpfr_init_set_str(r36835, "2", 10, MPFR_RNDN);
        mpfr_init(r36836);
        mpfr_init_set_str(r36837, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36838, "1", 10, MPFR_RNDN);
        mpfr_init(r36839);
        mpfr_init(r36840);
        mpfr_init_set_str(r36841, "3", 10, MPFR_RNDN);
        mpfr_init(r36842);
        mpfr_init(r36843);
        mpfr_init(r36844);
        mpfr_init(r36845);
        mpfr_init(r36846);
        mpfr_init(r36847);
        mpfr_init(r36848);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36830, a, MPFR_RNDN);
        mpfr_mul(r36831, r36830, r36830, MPFR_RNDN);
        mpfr_set_d(r36832, b, MPFR_RNDN);
        mpfr_mul(r36833, r36832, r36832, MPFR_RNDN);
        mpfr_add(r36834, r36831, r36833, MPFR_RNDN);
        ;
        mpfr_pow(r36836, r36834, r36835, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36839, r36838, r36830, MPFR_RNDN);
        mpfr_mul(r36840, r36831, r36839, MPFR_RNDN);
        ;
        mpfr_mul(r36842, r36841, r36830, MPFR_RNDN);
        mpfr_sub(r36843, r36838, r36842, MPFR_RNDN);
        mpfr_mul(r36844, r36833, r36843, MPFR_RNDN);
        mpfr_add(r36845, r36840, r36844, MPFR_RNDN);
        mpfr_mul(r36846, r36837, r36845, MPFR_RNDN);
        mpfr_add(r36847, r36836, r36846, MPFR_RNDN);
        mpfr_sub(r36848, r36847, r36838, MPFR_RNDN);
        return mpfr_get_d(r36848, MPFR_RNDN);
}

