#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 r17685 = a;
        float r17686 = r17685 * r17685;
        float r17687 = b;
        float r17688 = r17687 * r17687;
        float r17689 = r17686 + r17688;
        float r17690 = r17689 * r17689;
        float r17691 = 4.0f;
        float r17692 = 1.0f;
        float r17693 = r17692 + r17685;
        float r17694 = r17686 * r17693;
        float r17695 = 3.0f;
        float r17696 = r17695 * r17685;
        float r17697 = r17692 - r17696;
        float r17698 = r17688 * r17697;
        float r17699 = r17694 + r17698;
        float r17700 = r17691 * r17699;
        float r17701 = r17690 + r17700;
        float r17702 = r17701 - r17692;
        return r17702;
}

double f_id(double a, double b) {
        double r17703 = a;
        double r17704 = r17703 * r17703;
        double r17705 = b;
        double r17706 = r17705 * r17705;
        double r17707 = r17704 + r17706;
        double r17708 = r17707 * r17707;
        double r17709 = 4.0;
        double r17710 = 1.0;
        double r17711 = r17710 + r17703;
        double r17712 = r17704 * r17711;
        double r17713 = 3.0;
        double r17714 = r17713 * r17703;
        double r17715 = r17710 - r17714;
        double r17716 = r17706 * r17715;
        double r17717 = r17712 + r17716;
        double r17718 = r17709 * r17717;
        double r17719 = r17708 + r17718;
        double r17720 = r17719 - r17710;
        return r17720;
}


double f_of(float a, float b) {
        float r17721 = a;
        float r17722 = r17721 * r17721;
        float r17723 = b;
        float r17724 = r17723 * r17723;
        float r17725 = r17722 + r17724;
        float r17726 = sqrt(r17725);
        float r17727 = r17726 * r17726;
        float r17728 = r17727 * r17727;
        float r17729 = 4.0f;
        float r17730 = 1.0f;
        float r17731 = r17730 + r17721;
        float r17732 = r17722 * r17731;
        float r17733 = 3.0f;
        float r17734 = r17733 * r17721;
        float r17735 = r17730 - r17734;
        float r17736 = r17724 * r17735;
        float r17737 = r17732 + r17736;
        float r17738 = r17729 * r17737;
        float r17739 = r17728 + r17738;
        float r17740 = r17739 - r17730;
        return r17740;
}

double f_od(double a, double b) {
        double r17741 = a;
        double r17742 = r17741 * r17741;
        double r17743 = b;
        double r17744 = r17743 * r17743;
        double r17745 = r17742 + r17744;
        double r17746 = sqrt(r17745);
        double r17747 = r17746 * r17746;
        double r17748 = r17747 * r17747;
        double r17749 = 4.0;
        double r17750 = 1.0;
        double r17751 = r17750 + r17741;
        double r17752 = r17742 * r17751;
        double r17753 = 3.0;
        double r17754 = r17753 * r17741;
        double r17755 = r17750 - r17754;
        double r17756 = r17744 * r17755;
        double r17757 = r17752 + r17756;
        double r17758 = r17749 * r17757;
        double r17759 = r17748 + r17758;
        double r17760 = r17759 - r17750;
        return r17760;
}

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 r17761, r17762, r17763, r17764, r17765, r17766, r17767, r17768, r17769, r17770, r17771, r17772, r17773, r17774, r17775, r17776, r17777, r17778;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r17761);
        mpfr_init(r17762);
        mpfr_init(r17763);
        mpfr_init(r17764);
        mpfr_init(r17765);
        mpfr_init(r17766);
        mpfr_init_set_str(r17767, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r17768, "1", 10, MPFR_RNDN);
        mpfr_init(r17769);
        mpfr_init(r17770);
        mpfr_init_set_str(r17771, "3", 10, MPFR_RNDN);
        mpfr_init(r17772);
        mpfr_init(r17773);
        mpfr_init(r17774);
        mpfr_init(r17775);
        mpfr_init(r17776);
        mpfr_init(r17777);
        mpfr_init(r17778);
}

double f_im(double a, double b) {
        mpfr_set_d(r17761, a, MPFR_RNDN);
        mpfr_sqr(r17762, r17761, MPFR_RNDN);
        mpfr_set_d(r17763, b, MPFR_RNDN);
        mpfr_sqr(r17764, r17763, MPFR_RNDN);
        mpfr_add(r17765, r17762, r17764, MPFR_RNDN);
        mpfr_sqr(r17766, r17765, MPFR_RNDN);
        ;
        ;
        mpfr_add(r17769, r17768, r17761, MPFR_RNDN);
        mpfr_mul(r17770, r17762, r17769, MPFR_RNDN);
        ;
        mpfr_mul(r17772, r17771, r17761, MPFR_RNDN);
        mpfr_sub(r17773, r17768, r17772, MPFR_RNDN);
        mpfr_mul(r17774, r17764, r17773, MPFR_RNDN);
        mpfr_add(r17775, r17770, r17774, MPFR_RNDN);
        mpfr_mul(r17776, r17767, r17775, MPFR_RNDN);
        mpfr_add(r17777, r17766, r17776, MPFR_RNDN);
        mpfr_sub(r17778, r17777, r17768, MPFR_RNDN);
        return mpfr_get_d(r17778, MPFR_RNDN);
}

static mpfr_t r17779, r17780, r17781, r17782, r17783, r17784, r17785, r17786, r17787, r17788, r17789, r17790, r17791, r17792, r17793, r17794, r17795, r17796, r17797, r17798;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r17779);
        mpfr_init(r17780);
        mpfr_init(r17781);
        mpfr_init(r17782);
        mpfr_init(r17783);
        mpfr_init(r17784);
        mpfr_init(r17785);
        mpfr_init(r17786);
        mpfr_init_set_str(r17787, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r17788, "1", 10, MPFR_RNDN);
        mpfr_init(r17789);
        mpfr_init(r17790);
        mpfr_init_set_str(r17791, "3", 10, MPFR_RNDN);
        mpfr_init(r17792);
        mpfr_init(r17793);
        mpfr_init(r17794);
        mpfr_init(r17795);
        mpfr_init(r17796);
        mpfr_init(r17797);
        mpfr_init(r17798);
}

double f_fm(double a, double b) {
        mpfr_set_d(r17779, a, MPFR_RNDN);
        mpfr_sqr(r17780, r17779, MPFR_RNDN);
        mpfr_set_d(r17781, b, MPFR_RNDN);
        mpfr_sqr(r17782, r17781, MPFR_RNDN);
        mpfr_add(r17783, r17780, r17782, MPFR_RNDN);
        mpfr_sqrt(r17784, r17783, MPFR_RNDN);
        mpfr_mul(r17785, r17784, r17784, MPFR_RNDN);
        mpfr_sqr(r17786, r17785, MPFR_RNDN);
        ;
        ;
        mpfr_add(r17789, r17788, r17779, MPFR_RNDN);
        mpfr_mul(r17790, r17780, r17789, MPFR_RNDN);
        ;
        mpfr_mul(r17792, r17791, r17779, MPFR_RNDN);
        mpfr_sub(r17793, r17788, r17792, MPFR_RNDN);
        mpfr_mul(r17794, r17782, r17793, MPFR_RNDN);
        mpfr_add(r17795, r17790, r17794, MPFR_RNDN);
        mpfr_mul(r17796, r17787, r17795, MPFR_RNDN);
        mpfr_add(r17797, r17786, r17796, MPFR_RNDN);
        mpfr_sub(r17798, r17797, r17788, MPFR_RNDN);
        return mpfr_get_d(r17798, MPFR_RNDN);
}

static mpfr_t r17799, r17800, r17801, r17802, r17803, r17804, r17805, r17806, r17807, r17808, r17809, r17810, r17811, r17812, r17813, r17814, r17815, r17816, r17817, r17818;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r17799);
        mpfr_init(r17800);
        mpfr_init(r17801);
        mpfr_init(r17802);
        mpfr_init(r17803);
        mpfr_init(r17804);
        mpfr_init(r17805);
        mpfr_init(r17806);
        mpfr_init_set_str(r17807, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r17808, "1", 10, MPFR_RNDN);
        mpfr_init(r17809);
        mpfr_init(r17810);
        mpfr_init_set_str(r17811, "3", 10, MPFR_RNDN);
        mpfr_init(r17812);
        mpfr_init(r17813);
        mpfr_init(r17814);
        mpfr_init(r17815);
        mpfr_init(r17816);
        mpfr_init(r17817);
        mpfr_init(r17818);
}

double f_dm(double a, double b) {
        mpfr_set_d(r17799, a, MPFR_RNDN);
        mpfr_sqr(r17800, r17799, MPFR_RNDN);
        mpfr_set_d(r17801, b, MPFR_RNDN);
        mpfr_sqr(r17802, r17801, MPFR_RNDN);
        mpfr_add(r17803, r17800, r17802, MPFR_RNDN);
        mpfr_sqrt(r17804, r17803, MPFR_RNDN);
        mpfr_mul(r17805, r17804, r17804, MPFR_RNDN);
        mpfr_sqr(r17806, r17805, MPFR_RNDN);
        ;
        ;
        mpfr_add(r17809, r17808, r17799, MPFR_RNDN);
        mpfr_mul(r17810, r17800, r17809, MPFR_RNDN);
        ;
        mpfr_mul(r17812, r17811, r17799, MPFR_RNDN);
        mpfr_sub(r17813, r17808, r17812, MPFR_RNDN);
        mpfr_mul(r17814, r17802, r17813, MPFR_RNDN);
        mpfr_add(r17815, r17810, r17814, MPFR_RNDN);
        mpfr_mul(r17816, r17807, r17815, MPFR_RNDN);
        mpfr_add(r17817, r17806, r17816, MPFR_RNDN);
        mpfr_sub(r17818, r17817, r17808, MPFR_RNDN);
        return mpfr_get_d(r17818, MPFR_RNDN);
}

