#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 r36657 = a;
        float r36658 = r36657 * r36657;
        float r36659 = b;
        float r36660 = r36659 * r36659;
        float r36661 = r36658 + r36660;
        float r36662 = 2;
        float r36663 = pow(r36661, r36662);
        float r36664 = 4;
        float r36665 = 1;
        float r36666 = r36665 - r36657;
        float r36667 = r36658 * r36666;
        float r36668 = 3;
        float r36669 = r36668 + r36657;
        float r36670 = r36660 * r36669;
        float r36671 = r36667 + r36670;
        float r36672 = r36664 * r36671;
        float r36673 = r36663 + r36672;
        float r36674 = r36673 - r36665;
        return r36674;
}

double f_id(double a, double b) {
        double r36675 = a;
        double r36676 = r36675 * r36675;
        double r36677 = b;
        double r36678 = r36677 * r36677;
        double r36679 = r36676 + r36678;
        double r36680 = 2;
        double r36681 = pow(r36679, r36680);
        double r36682 = 4;
        double r36683 = 1;
        double r36684 = r36683 - r36675;
        double r36685 = r36676 * r36684;
        double r36686 = 3;
        double r36687 = r36686 + r36675;
        double r36688 = r36678 * r36687;
        double r36689 = r36685 + r36688;
        double r36690 = r36682 * r36689;
        double r36691 = r36681 + r36690;
        double r36692 = r36691 - r36683;
        return r36692;
}


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

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

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 r36733, r36734, r36735, r36736, r36737, r36738, r36739, r36740, r36741, r36742, r36743, r36744, r36745, r36746, r36747, r36748, r36749, r36750;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36733);
        mpfr_init(r36734);
        mpfr_init(r36735);
        mpfr_init(r36736);
        mpfr_init(r36737);
        mpfr_init_set_str(r36738, "2", 10, MPFR_RNDN);
        mpfr_init(r36739);
        mpfr_init_set_str(r36740, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36741, "1", 10, MPFR_RNDN);
        mpfr_init(r36742);
        mpfr_init(r36743);
        mpfr_init_set_str(r36744, "3", 10, MPFR_RNDN);
        mpfr_init(r36745);
        mpfr_init(r36746);
        mpfr_init(r36747);
        mpfr_init(r36748);
        mpfr_init(r36749);
        mpfr_init(r36750);
}

double f_im(double a, double b) {
        mpfr_set_d(r36733, a, MPFR_RNDN);
        mpfr_mul(r36734, r36733, r36733, MPFR_RNDN);
        mpfr_set_d(r36735, b, MPFR_RNDN);
        mpfr_mul(r36736, r36735, r36735, MPFR_RNDN);
        mpfr_add(r36737, r36734, r36736, MPFR_RNDN);
        ;
        mpfr_pow(r36739, r36737, r36738, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36742, r36741, r36733, MPFR_RNDN);
        mpfr_mul(r36743, r36734, r36742, MPFR_RNDN);
        ;
        mpfr_add(r36745, r36744, r36733, MPFR_RNDN);
        mpfr_mul(r36746, r36736, r36745, MPFR_RNDN);
        mpfr_add(r36747, r36743, r36746, MPFR_RNDN);
        mpfr_mul(r36748, r36740, r36747, MPFR_RNDN);
        mpfr_add(r36749, r36739, r36748, MPFR_RNDN);
        mpfr_sub(r36750, r36749, r36741, MPFR_RNDN);
        return mpfr_get_d(r36750, MPFR_RNDN);
}

static mpfr_t r36751, r36752, r36753, r36754, r36755, r36756, r36757, r36758, r36759, r36760, r36761, r36762, r36763, r36764, r36765, r36766, r36767, r36768, r36769, r36770;

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

double f_fm(double a, double b) {
        mpfr_set_d(r36751, a, MPFR_RNDN);
        mpfr_mul(r36752, r36751, r36751, MPFR_RNDN);
        mpfr_set_d(r36753, b, MPFR_RNDN);
        mpfr_mul(r36754, r36753, r36753, MPFR_RNDN);
        mpfr_add(r36755, r36752, r36754, MPFR_RNDN);
        ;
        mpfr_pow(r36757, r36755, r36756, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36760, r36759, r36751, MPFR_RNDN);
        mpfr_mul(r36761, r36752, r36760, MPFR_RNDN);
        ;
        mpfr_add(r36763, r36762, r36751, MPFR_RNDN);
        mpfr_mul(r36764, r36754, r36763, MPFR_RNDN);
        mpfr_add(r36765, r36761, r36764, MPFR_RNDN);
        mpfr_mul(r36766, r36758, r36765, MPFR_RNDN);
        mpfr_add(r36767, r36757, r36766, MPFR_RNDN);
        mpfr_sqrt(r36768, r36767, MPFR_RNDN);
        mpfr_mul(r36769, r36768, r36768, MPFR_RNDN);
        mpfr_sub(r36770, r36769, r36759, MPFR_RNDN);
        return mpfr_get_d(r36770, MPFR_RNDN);
}

static mpfr_t r36771, r36772, r36773, r36774, r36775, r36776, r36777, r36778, r36779, r36780, r36781, r36782, r36783, r36784, r36785, r36786, r36787, r36788, r36789, r36790;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36771);
        mpfr_init(r36772);
        mpfr_init(r36773);
        mpfr_init(r36774);
        mpfr_init(r36775);
        mpfr_init_set_str(r36776, "2", 10, MPFR_RNDN);
        mpfr_init(r36777);
        mpfr_init_set_str(r36778, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36779, "1", 10, MPFR_RNDN);
        mpfr_init(r36780);
        mpfr_init(r36781);
        mpfr_init_set_str(r36782, "3", 10, MPFR_RNDN);
        mpfr_init(r36783);
        mpfr_init(r36784);
        mpfr_init(r36785);
        mpfr_init(r36786);
        mpfr_init(r36787);
        mpfr_init(r36788);
        mpfr_init(r36789);
        mpfr_init(r36790);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36771, a, MPFR_RNDN);
        mpfr_mul(r36772, r36771, r36771, MPFR_RNDN);
        mpfr_set_d(r36773, b, MPFR_RNDN);
        mpfr_mul(r36774, r36773, r36773, MPFR_RNDN);
        mpfr_add(r36775, r36772, r36774, MPFR_RNDN);
        ;
        mpfr_pow(r36777, r36775, r36776, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36780, r36779, r36771, MPFR_RNDN);
        mpfr_mul(r36781, r36772, r36780, MPFR_RNDN);
        ;
        mpfr_add(r36783, r36782, r36771, MPFR_RNDN);
        mpfr_mul(r36784, r36774, r36783, MPFR_RNDN);
        mpfr_add(r36785, r36781, r36784, MPFR_RNDN);
        mpfr_mul(r36786, r36778, r36785, MPFR_RNDN);
        mpfr_add(r36787, r36777, r36786, MPFR_RNDN);
        mpfr_sqrt(r36788, r36787, MPFR_RNDN);
        mpfr_mul(r36789, r36788, r36788, MPFR_RNDN);
        mpfr_sub(r36790, r36789, r36779, MPFR_RNDN);
        return mpfr_get_d(r36790, MPFR_RNDN);
}

