#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 r11731 = a;
        float r11732 = r11731 * r11731;
        float r11733 = b;
        float r11734 = r11733 * r11733;
        float r11735 = r11732 + r11734;
        float r11736 = 2;
        float r11737 = pow(r11735, r11736);
        float r11738 = 4;
        float r11739 = 1;
        float r11740 = r11739 + r11731;
        float r11741 = r11732 * r11740;
        float r11742 = 3;
        float r11743 = r11742 * r11731;
        float r11744 = r11739 - r11743;
        float r11745 = r11734 * r11744;
        float r11746 = r11741 + r11745;
        float r11747 = r11738 * r11746;
        float r11748 = r11737 + r11747;
        float r11749 = r11748 - r11739;
        return r11749;
}

double f_id(double a, double b) {
        double r11750 = a;
        double r11751 = r11750 * r11750;
        double r11752 = b;
        double r11753 = r11752 * r11752;
        double r11754 = r11751 + r11753;
        double r11755 = 2;
        double r11756 = pow(r11754, r11755);
        double r11757 = 4;
        double r11758 = 1;
        double r11759 = r11758 + r11750;
        double r11760 = r11751 * r11759;
        double r11761 = 3;
        double r11762 = r11761 * r11750;
        double r11763 = r11758 - r11762;
        double r11764 = r11753 * r11763;
        double r11765 = r11760 + r11764;
        double r11766 = r11757 * r11765;
        double r11767 = r11756 + r11766;
        double r11768 = r11767 - r11758;
        return r11768;
}


double f_of(float a, float b) {
        float r11769 = a;
        float r11770 = r11769 * r11769;
        float r11771 = b;
        float r11772 = r11771 * r11771;
        float r11773 = r11770 + r11772;
        float r11774 = 2;
        float r11775 = pow(r11773, r11774);
        float r11776 = 4;
        float r11777 = 1;
        float r11778 = r11777 + r11769;
        float r11779 = r11770 * r11778;
        float r11780 = 3;
        float r11781 = r11780 * r11769;
        float r11782 = r11777 - r11781;
        float r11783 = r11772 * r11782;
        float r11784 = r11779 + r11783;
        float r11785 = r11776 * r11784;
        float r11786 = r11775 + r11785;
        float r11787 = r11786 - r11777;
        return r11787;
}

double f_od(double a, double b) {
        double r11788 = a;
        double r11789 = r11788 * r11788;
        double r11790 = b;
        double r11791 = r11790 * r11790;
        double r11792 = r11789 + r11791;
        double r11793 = 2;
        double r11794 = pow(r11792, r11793);
        double r11795 = 4;
        double r11796 = 1;
        double r11797 = r11796 + r11788;
        double r11798 = r11789 * r11797;
        double r11799 = 3;
        double r11800 = r11799 * r11788;
        double r11801 = r11796 - r11800;
        double r11802 = r11791 * r11801;
        double r11803 = r11798 + r11802;
        double r11804 = r11795 * r11803;
        double r11805 = r11794 + r11804;
        double r11806 = r11805 - r11796;
        return r11806;
}

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 r11807, r11808, r11809, r11810, r11811, r11812, r11813, r11814, r11815, r11816, r11817, r11818, r11819, r11820, r11821, r11822, r11823, r11824, r11825;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r11807);
        mpfr_init(r11808);
        mpfr_init(r11809);
        mpfr_init(r11810);
        mpfr_init(r11811);
        mpfr_init_set_str(r11812, "2", 10, MPFR_RNDN);
        mpfr_init(r11813);
        mpfr_init_set_str(r11814, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11815, "1", 10, MPFR_RNDN);
        mpfr_init(r11816);
        mpfr_init(r11817);
        mpfr_init_set_str(r11818, "3", 10, MPFR_RNDN);
        mpfr_init(r11819);
        mpfr_init(r11820);
        mpfr_init(r11821);
        mpfr_init(r11822);
        mpfr_init(r11823);
        mpfr_init(r11824);
        mpfr_init(r11825);
}

double f_im(double a, double b) {
        mpfr_set_d(r11807, a, MPFR_RNDN);
        mpfr_mul(r11808, r11807, r11807, MPFR_RNDN);
        mpfr_set_d(r11809, b, MPFR_RNDN);
        mpfr_mul(r11810, r11809, r11809, MPFR_RNDN);
        mpfr_add(r11811, r11808, r11810, MPFR_RNDN);
        ;
        mpfr_pow(r11813, r11811, r11812, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11816, r11815, r11807, MPFR_RNDN);
        mpfr_mul(r11817, r11808, r11816, MPFR_RNDN);
        ;
        mpfr_mul(r11819, r11818, r11807, MPFR_RNDN);
        mpfr_sub(r11820, r11815, r11819, MPFR_RNDN);
        mpfr_mul(r11821, r11810, r11820, MPFR_RNDN);
        mpfr_add(r11822, r11817, r11821, MPFR_RNDN);
        mpfr_mul(r11823, r11814, r11822, MPFR_RNDN);
        mpfr_add(r11824, r11813, r11823, MPFR_RNDN);
        mpfr_sub(r11825, r11824, r11815, MPFR_RNDN);
        return mpfr_get_d(r11825, MPFR_RNDN);
}

static mpfr_t r11826, r11827, r11828, r11829, r11830, r11831, r11832, r11833, r11834, r11835, r11836, r11837, r11838, r11839, r11840, r11841, r11842, r11843, r11844;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11826);
        mpfr_init(r11827);
        mpfr_init(r11828);
        mpfr_init(r11829);
        mpfr_init(r11830);
        mpfr_init_set_str(r11831, "2", 10, MPFR_RNDN);
        mpfr_init(r11832);
        mpfr_init_set_str(r11833, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11834, "1", 10, MPFR_RNDN);
        mpfr_init(r11835);
        mpfr_init(r11836);
        mpfr_init_set_str(r11837, "3", 10, MPFR_RNDN);
        mpfr_init(r11838);
        mpfr_init(r11839);
        mpfr_init(r11840);
        mpfr_init(r11841);
        mpfr_init(r11842);
        mpfr_init(r11843);
        mpfr_init(r11844);
}

double f_fm(double a, double b) {
        mpfr_set_d(r11826, a, MPFR_RNDN);
        mpfr_mul(r11827, r11826, r11826, MPFR_RNDN);
        mpfr_set_d(r11828, b, MPFR_RNDN);
        mpfr_mul(r11829, r11828, r11828, MPFR_RNDN);
        mpfr_add(r11830, r11827, r11829, MPFR_RNDN);
        ;
        mpfr_pow(r11832, r11830, r11831, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11835, r11834, r11826, MPFR_RNDN);
        mpfr_mul(r11836, r11827, r11835, MPFR_RNDN);
        ;
        mpfr_mul(r11838, r11837, r11826, MPFR_RNDN);
        mpfr_sub(r11839, r11834, r11838, MPFR_RNDN);
        mpfr_mul(r11840, r11829, r11839, MPFR_RNDN);
        mpfr_add(r11841, r11836, r11840, MPFR_RNDN);
        mpfr_mul(r11842, r11833, r11841, MPFR_RNDN);
        mpfr_add(r11843, r11832, r11842, MPFR_RNDN);
        mpfr_sub(r11844, r11843, r11834, MPFR_RNDN);
        return mpfr_get_d(r11844, MPFR_RNDN);
}

static mpfr_t r11845, r11846, r11847, r11848, r11849, r11850, r11851, r11852, r11853, r11854, r11855, r11856, r11857, r11858, r11859, r11860, r11861, r11862, r11863;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11845);
        mpfr_init(r11846);
        mpfr_init(r11847);
        mpfr_init(r11848);
        mpfr_init(r11849);
        mpfr_init_set_str(r11850, "2", 10, MPFR_RNDN);
        mpfr_init(r11851);
        mpfr_init_set_str(r11852, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11853, "1", 10, MPFR_RNDN);
        mpfr_init(r11854);
        mpfr_init(r11855);
        mpfr_init_set_str(r11856, "3", 10, MPFR_RNDN);
        mpfr_init(r11857);
        mpfr_init(r11858);
        mpfr_init(r11859);
        mpfr_init(r11860);
        mpfr_init(r11861);
        mpfr_init(r11862);
        mpfr_init(r11863);
}

double f_dm(double a, double b) {
        mpfr_set_d(r11845, a, MPFR_RNDN);
        mpfr_mul(r11846, r11845, r11845, MPFR_RNDN);
        mpfr_set_d(r11847, b, MPFR_RNDN);
        mpfr_mul(r11848, r11847, r11847, MPFR_RNDN);
        mpfr_add(r11849, r11846, r11848, MPFR_RNDN);
        ;
        mpfr_pow(r11851, r11849, r11850, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11854, r11853, r11845, MPFR_RNDN);
        mpfr_mul(r11855, r11846, r11854, MPFR_RNDN);
        ;
        mpfr_mul(r11857, r11856, r11845, MPFR_RNDN);
        mpfr_sub(r11858, r11853, r11857, MPFR_RNDN);
        mpfr_mul(r11859, r11848, r11858, MPFR_RNDN);
        mpfr_add(r11860, r11855, r11859, MPFR_RNDN);
        mpfr_mul(r11861, r11852, r11860, MPFR_RNDN);
        mpfr_add(r11862, r11851, r11861, MPFR_RNDN);
        mpfr_sub(r11863, r11862, r11853, MPFR_RNDN);
        return mpfr_get_d(r11863, MPFR_RNDN);
}

