#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 r36677 = a;
        float r36678 = r36677 * r36677;
        float r36679 = b;
        float r36680 = r36679 * r36679;
        float r36681 = r36678 + r36680;
        float r36682 = 2;
        float r36683 = pow(r36681, r36682);
        float r36684 = 4;
        float r36685 = 1;
        float r36686 = r36685 - r36677;
        float r36687 = r36678 * r36686;
        float r36688 = 3;
        float r36689 = r36688 + r36677;
        float r36690 = r36680 * r36689;
        float r36691 = r36687 + r36690;
        float r36692 = r36684 * r36691;
        float r36693 = r36683 + r36692;
        float r36694 = r36693 - r36685;
        return r36694;
}

double f_id(double a, double b) {
        double r36695 = a;
        double r36696 = r36695 * r36695;
        double r36697 = b;
        double r36698 = r36697 * r36697;
        double r36699 = r36696 + r36698;
        double r36700 = 2;
        double r36701 = pow(r36699, r36700);
        double r36702 = 4;
        double r36703 = 1;
        double r36704 = r36703 - r36695;
        double r36705 = r36696 * r36704;
        double r36706 = 3;
        double r36707 = r36706 + r36695;
        double r36708 = r36698 * r36707;
        double r36709 = r36705 + r36708;
        double r36710 = r36702 * r36709;
        double r36711 = r36701 + r36710;
        double r36712 = r36711 - r36703;
        return r36712;
}


double f_of(float a, float b) {
        float r36713 = a;
        float r36714 = r36713 * r36713;
        float r36715 = b;
        float r36716 = r36715 * r36715;
        float r36717 = r36714 + r36716;
        float r36718 = 2;
        float r36719 = pow(r36717, r36718);
        float r36720 = 4;
        float r36721 = 1;
        float r36722 = r36721 - r36713;
        float r36723 = r36714 * r36722;
        float r36724 = 3;
        float r36725 = r36724 + r36713;
        float r36726 = r36716 * r36725;
        float r36727 = r36723 + r36726;
        float r36728 = r36720 * r36727;
        float r36729 = r36719 + r36728;
        float r36730 = r36729 - r36721;
        return r36730;
}

double f_od(double a, double b) {
        double r36731 = a;
        double r36732 = r36731 * r36731;
        double r36733 = b;
        double r36734 = r36733 * r36733;
        double r36735 = r36732 + r36734;
        double r36736 = 2;
        double r36737 = pow(r36735, r36736);
        double r36738 = 4;
        double r36739 = 1;
        double r36740 = r36739 - r36731;
        double r36741 = r36732 * r36740;
        double r36742 = 3;
        double r36743 = r36742 + r36731;
        double r36744 = r36734 * r36743;
        double r36745 = r36741 + r36744;
        double r36746 = r36738 * r36745;
        double r36747 = r36737 + r36746;
        double r36748 = r36747 - r36739;
        return r36748;
}

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 r36749, r36750, r36751, r36752, r36753, r36754, r36755, r36756, r36757, r36758, r36759, r36760, r36761, r36762, r36763, r36764, r36765, r36766;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36749);
        mpfr_init(r36750);
        mpfr_init(r36751);
        mpfr_init(r36752);
        mpfr_init(r36753);
        mpfr_init_set_str(r36754, "2", 10, MPFR_RNDN);
        mpfr_init(r36755);
        mpfr_init_set_str(r36756, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36757, "1", 10, MPFR_RNDN);
        mpfr_init(r36758);
        mpfr_init(r36759);
        mpfr_init_set_str(r36760, "3", 10, MPFR_RNDN);
        mpfr_init(r36761);
        mpfr_init(r36762);
        mpfr_init(r36763);
        mpfr_init(r36764);
        mpfr_init(r36765);
        mpfr_init(r36766);
}

double f_im(double a, double b) {
        mpfr_set_d(r36749, a, MPFR_RNDN);
        mpfr_mul(r36750, r36749, r36749, MPFR_RNDN);
        mpfr_set_d(r36751, b, MPFR_RNDN);
        mpfr_mul(r36752, r36751, r36751, MPFR_RNDN);
        mpfr_add(r36753, r36750, r36752, MPFR_RNDN);
        ;
        mpfr_pow(r36755, r36753, r36754, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36758, r36757, r36749, MPFR_RNDN);
        mpfr_mul(r36759, r36750, r36758, MPFR_RNDN);
        ;
        mpfr_add(r36761, r36760, r36749, MPFR_RNDN);
        mpfr_mul(r36762, r36752, r36761, MPFR_RNDN);
        mpfr_add(r36763, r36759, r36762, MPFR_RNDN);
        mpfr_mul(r36764, r36756, r36763, MPFR_RNDN);
        mpfr_add(r36765, r36755, r36764, MPFR_RNDN);
        mpfr_sub(r36766, r36765, r36757, MPFR_RNDN);
        return mpfr_get_d(r36766, MPFR_RNDN);
}

static mpfr_t r36767, r36768, r36769, r36770, r36771, r36772, r36773, r36774, r36775, r36776, r36777, r36778, r36779, r36780, r36781, r36782, r36783, r36784;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36767);
        mpfr_init(r36768);
        mpfr_init(r36769);
        mpfr_init(r36770);
        mpfr_init(r36771);
        mpfr_init_set_str(r36772, "2", 10, MPFR_RNDN);
        mpfr_init(r36773);
        mpfr_init_set_str(r36774, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36775, "1", 10, MPFR_RNDN);
        mpfr_init(r36776);
        mpfr_init(r36777);
        mpfr_init_set_str(r36778, "3", 10, MPFR_RNDN);
        mpfr_init(r36779);
        mpfr_init(r36780);
        mpfr_init(r36781);
        mpfr_init(r36782);
        mpfr_init(r36783);
        mpfr_init(r36784);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36767, a, MPFR_RNDN);
        mpfr_mul(r36768, r36767, r36767, MPFR_RNDN);
        mpfr_set_d(r36769, b, MPFR_RNDN);
        mpfr_mul(r36770, r36769, r36769, MPFR_RNDN);
        mpfr_add(r36771, r36768, r36770, MPFR_RNDN);
        ;
        mpfr_pow(r36773, r36771, r36772, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36776, r36775, r36767, MPFR_RNDN);
        mpfr_mul(r36777, r36768, r36776, MPFR_RNDN);
        ;
        mpfr_add(r36779, r36778, r36767, MPFR_RNDN);
        mpfr_mul(r36780, r36770, r36779, MPFR_RNDN);
        mpfr_add(r36781, r36777, r36780, MPFR_RNDN);
        mpfr_mul(r36782, r36774, r36781, MPFR_RNDN);
        mpfr_add(r36783, r36773, r36782, MPFR_RNDN);
        mpfr_sub(r36784, r36783, r36775, MPFR_RNDN);
        return mpfr_get_d(r36784, MPFR_RNDN);
}

static mpfr_t r36785, r36786, r36787, r36788, r36789, r36790, r36791, r36792, r36793, r36794, r36795, r36796, r36797, r36798, r36799, r36800, r36801, r36802;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36785);
        mpfr_init(r36786);
        mpfr_init(r36787);
        mpfr_init(r36788);
        mpfr_init(r36789);
        mpfr_init_set_str(r36790, "2", 10, MPFR_RNDN);
        mpfr_init(r36791);
        mpfr_init_set_str(r36792, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36793, "1", 10, MPFR_RNDN);
        mpfr_init(r36794);
        mpfr_init(r36795);
        mpfr_init_set_str(r36796, "3", 10, MPFR_RNDN);
        mpfr_init(r36797);
        mpfr_init(r36798);
        mpfr_init(r36799);
        mpfr_init(r36800);
        mpfr_init(r36801);
        mpfr_init(r36802);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36785, a, MPFR_RNDN);
        mpfr_mul(r36786, r36785, r36785, MPFR_RNDN);
        mpfr_set_d(r36787, b, MPFR_RNDN);
        mpfr_mul(r36788, r36787, r36787, MPFR_RNDN);
        mpfr_add(r36789, r36786, r36788, MPFR_RNDN);
        ;
        mpfr_pow(r36791, r36789, r36790, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36794, r36793, r36785, MPFR_RNDN);
        mpfr_mul(r36795, r36786, r36794, MPFR_RNDN);
        ;
        mpfr_add(r36797, r36796, r36785, MPFR_RNDN);
        mpfr_mul(r36798, r36788, r36797, MPFR_RNDN);
        mpfr_add(r36799, r36795, r36798, MPFR_RNDN);
        mpfr_mul(r36800, r36792, r36799, MPFR_RNDN);
        mpfr_add(r36801, r36791, r36800, MPFR_RNDN);
        mpfr_sub(r36802, r36801, r36793, MPFR_RNDN);
        return mpfr_get_d(r36802, MPFR_RNDN);
}

