#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 r11716 = a;
        float r11717 = r11716 * r11716;
        float r11718 = b;
        float r11719 = r11718 * r11718;
        float r11720 = r11717 + r11719;
        float r11721 = 2;
        float r11722 = pow(r11720, r11721);
        float r11723 = 4;
        float r11724 = 1;
        float r11725 = r11724 - r11716;
        float r11726 = r11717 * r11725;
        float r11727 = 3;
        float r11728 = r11727 + r11716;
        float r11729 = r11719 * r11728;
        float r11730 = r11726 + r11729;
        float r11731 = r11723 * r11730;
        float r11732 = r11722 + r11731;
        float r11733 = r11732 - r11724;
        return r11733;
}

double f_id(double a, double b) {
        double r11734 = a;
        double r11735 = r11734 * r11734;
        double r11736 = b;
        double r11737 = r11736 * r11736;
        double r11738 = r11735 + r11737;
        double r11739 = 2;
        double r11740 = pow(r11738, r11739);
        double r11741 = 4;
        double r11742 = 1;
        double r11743 = r11742 - r11734;
        double r11744 = r11735 * r11743;
        double r11745 = 3;
        double r11746 = r11745 + r11734;
        double r11747 = r11737 * r11746;
        double r11748 = r11744 + r11747;
        double r11749 = r11741 * r11748;
        double r11750 = r11740 + r11749;
        double r11751 = r11750 - r11742;
        return r11751;
}


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

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

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 r11790, r11791, r11792, r11793, r11794, r11795, r11796, r11797, r11798, r11799, r11800, r11801, r11802, r11803, r11804, r11805, r11806, r11807;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r11790);
        mpfr_init(r11791);
        mpfr_init(r11792);
        mpfr_init(r11793);
        mpfr_init(r11794);
        mpfr_init_set_str(r11795, "2", 10, MPFR_RNDN);
        mpfr_init(r11796);
        mpfr_init_set_str(r11797, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11798, "1", 10, MPFR_RNDN);
        mpfr_init(r11799);
        mpfr_init(r11800);
        mpfr_init_set_str(r11801, "3", 10, MPFR_RNDN);
        mpfr_init(r11802);
        mpfr_init(r11803);
        mpfr_init(r11804);
        mpfr_init(r11805);
        mpfr_init(r11806);
        mpfr_init(r11807);
}

double f_im(double a, double b) {
        mpfr_set_d(r11790, a, MPFR_RNDN);
        mpfr_mul(r11791, r11790, r11790, MPFR_RNDN);
        mpfr_set_d(r11792, b, MPFR_RNDN);
        mpfr_mul(r11793, r11792, r11792, MPFR_RNDN);
        mpfr_add(r11794, r11791, r11793, MPFR_RNDN);
        ;
        mpfr_pow(r11796, r11794, r11795, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r11799, r11798, r11790, MPFR_RNDN);
        mpfr_mul(r11800, r11791, r11799, MPFR_RNDN);
        ;
        mpfr_add(r11802, r11801, r11790, MPFR_RNDN);
        mpfr_mul(r11803, r11793, r11802, MPFR_RNDN);
        mpfr_add(r11804, r11800, r11803, MPFR_RNDN);
        mpfr_mul(r11805, r11797, r11804, MPFR_RNDN);
        mpfr_add(r11806, r11796, r11805, MPFR_RNDN);
        mpfr_sub(r11807, r11806, r11798, MPFR_RNDN);
        return mpfr_get_d(r11807, MPFR_RNDN);
}

static mpfr_t r11808, r11809, r11810, r11811, r11812, r11813, r11814, r11815, r11816, r11817, r11818, r11819, r11820, r11821, r11822, r11823, r11824, r11825, r11826;

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

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

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

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

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

