#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 r28090 = a;
        float r28091 = r28090 * r28090;
        float r28092 = b;
        float r28093 = r28092 * r28092;
        float r28094 = r28091 + r28093;
        float r28095 = 2;
        float r28096 = pow(r28094, r28095);
        float r28097 = 4;
        float r28098 = 1;
        float r28099 = r28098 - r28090;
        float r28100 = r28091 * r28099;
        float r28101 = 3;
        float r28102 = r28101 + r28090;
        float r28103 = r28093 * r28102;
        float r28104 = r28100 + r28103;
        float r28105 = r28097 * r28104;
        float r28106 = r28096 + r28105;
        float r28107 = r28106 - r28098;
        return r28107;
}

double f_id(double a, double b) {
        double r28108 = a;
        double r28109 = r28108 * r28108;
        double r28110 = b;
        double r28111 = r28110 * r28110;
        double r28112 = r28109 + r28111;
        double r28113 = 2;
        double r28114 = pow(r28112, r28113);
        double r28115 = 4;
        double r28116 = 1;
        double r28117 = r28116 - r28108;
        double r28118 = r28109 * r28117;
        double r28119 = 3;
        double r28120 = r28119 + r28108;
        double r28121 = r28111 * r28120;
        double r28122 = r28118 + r28121;
        double r28123 = r28115 * r28122;
        double r28124 = r28114 + r28123;
        double r28125 = r28124 - r28116;
        return r28125;
}


double f_of(float a, float b) {
        float r28126 = b;
        float r28127 = a;
        float r28128 = hypot(r28126, r28127);
        float r28129 = 3;
        float r28130 = 1;
        float r28131 = r28129 + r28130;
        float r28132 = pow(r28128, r28131);
        float r28133 = 4;
        float r28134 = r28127 * r28127;
        float r28135 = r28130 - r28127;
        float r28136 = r28134 * r28135;
        float r28137 = r28126 * r28126;
        float r28138 = r28129 + r28127;
        float r28139 = r28137 * r28138;
        float r28140 = r28136 + r28139;
        float r28141 = r28133 * r28140;
        float r28142 = r28132 + r28141;
        float r28143 = r28142 - r28130;
        return r28143;
}

double f_od(double a, double b) {
        double r28144 = b;
        double r28145 = a;
        double r28146 = hypot(r28144, r28145);
        double r28147 = 3;
        double r28148 = 1;
        double r28149 = r28147 + r28148;
        double r28150 = pow(r28146, r28149);
        double r28151 = 4;
        double r28152 = r28145 * r28145;
        double r28153 = r28148 - r28145;
        double r28154 = r28152 * r28153;
        double r28155 = r28144 * r28144;
        double r28156 = r28147 + r28145;
        double r28157 = r28155 * r28156;
        double r28158 = r28154 + r28157;
        double r28159 = r28151 * r28158;
        double r28160 = r28150 + r28159;
        double r28161 = r28160 - r28148;
        return r28161;
}

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 r28162, r28163, r28164, r28165, r28166, r28167, r28168, r28169, r28170, r28171, r28172, r28173, r28174, r28175, r28176, r28177, r28178, r28179;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r28162);
        mpfr_init(r28163);
        mpfr_init(r28164);
        mpfr_init(r28165);
        mpfr_init(r28166);
        mpfr_init_set_str(r28167, "2", 10, MPFR_RNDN);
        mpfr_init(r28168);
        mpfr_init_set_str(r28169, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28170, "1", 10, MPFR_RNDN);
        mpfr_init(r28171);
        mpfr_init(r28172);
        mpfr_init_set_str(r28173, "3", 10, MPFR_RNDN);
        mpfr_init(r28174);
        mpfr_init(r28175);
        mpfr_init(r28176);
        mpfr_init(r28177);
        mpfr_init(r28178);
        mpfr_init(r28179);
}

double f_im(double a, double b) {
        mpfr_set_d(r28162, a, MPFR_RNDN);
        mpfr_mul(r28163, r28162, r28162, MPFR_RNDN);
        mpfr_set_d(r28164, b, MPFR_RNDN);
        mpfr_mul(r28165, r28164, r28164, MPFR_RNDN);
        mpfr_add(r28166, r28163, r28165, MPFR_RNDN);
        ;
        mpfr_pow(r28168, r28166, r28167, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r28171, r28170, r28162, MPFR_RNDN);
        mpfr_mul(r28172, r28163, r28171, MPFR_RNDN);
        ;
        mpfr_add(r28174, r28173, r28162, MPFR_RNDN);
        mpfr_mul(r28175, r28165, r28174, MPFR_RNDN);
        mpfr_add(r28176, r28172, r28175, MPFR_RNDN);
        mpfr_mul(r28177, r28169, r28176, MPFR_RNDN);
        mpfr_add(r28178, r28168, r28177, MPFR_RNDN);
        mpfr_sub(r28179, r28178, r28170, MPFR_RNDN);
        return mpfr_get_d(r28179, MPFR_RNDN);
}

static mpfr_t r28180, r28181, r28182, r28183, r28184, r28185, r28186, r28187, r28188, r28189, r28190, r28191, r28192, r28193, r28194, r28195, r28196, r28197;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r28180);
        mpfr_init(r28181);
        mpfr_init(r28182);
        mpfr_init_set_str(r28183, "3", 10, MPFR_RNDN);
        mpfr_init_set_str(r28184, "1", 10, MPFR_RNDN);
        mpfr_init(r28185);
        mpfr_init(r28186);
        mpfr_init_set_str(r28187, "4", 10, MPFR_RNDN);
        mpfr_init(r28188);
        mpfr_init(r28189);
        mpfr_init(r28190);
        mpfr_init(r28191);
        mpfr_init(r28192);
        mpfr_init(r28193);
        mpfr_init(r28194);
        mpfr_init(r28195);
        mpfr_init(r28196);
        mpfr_init(r28197);
}

double f_fm(double a, double b) {
        mpfr_set_d(r28180, b, MPFR_RNDN);
        mpfr_set_d(r28181, a, MPFR_RNDN);
        mpfr_hypot(r28182, r28180, r28181, MPFR_RNDN);
        ;
        ;
        mpfr_add(r28185, r28183, r28184, MPFR_RNDN);
        mpfr_pow(r28186, r28182, r28185, MPFR_RNDN);
        ;
        mpfr_mul(r28188, r28181, r28181, MPFR_RNDN);
        mpfr_sub(r28189, r28184, r28181, MPFR_RNDN);
        mpfr_mul(r28190, r28188, r28189, MPFR_RNDN);
        mpfr_mul(r28191, r28180, r28180, MPFR_RNDN);
        mpfr_add(r28192, r28183, r28181, MPFR_RNDN);
        mpfr_mul(r28193, r28191, r28192, MPFR_RNDN);
        mpfr_add(r28194, r28190, r28193, MPFR_RNDN);
        mpfr_mul(r28195, r28187, r28194, MPFR_RNDN);
        mpfr_add(r28196, r28186, r28195, MPFR_RNDN);
        mpfr_sub(r28197, r28196, r28184, MPFR_RNDN);
        return mpfr_get_d(r28197, MPFR_RNDN);
}

static mpfr_t r28198, r28199, r28200, r28201, r28202, r28203, r28204, r28205, r28206, r28207, r28208, r28209, r28210, r28211, r28212, r28213, r28214, r28215;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r28198);
        mpfr_init(r28199);
        mpfr_init(r28200);
        mpfr_init_set_str(r28201, "3", 10, MPFR_RNDN);
        mpfr_init_set_str(r28202, "1", 10, MPFR_RNDN);
        mpfr_init(r28203);
        mpfr_init(r28204);
        mpfr_init_set_str(r28205, "4", 10, MPFR_RNDN);
        mpfr_init(r28206);
        mpfr_init(r28207);
        mpfr_init(r28208);
        mpfr_init(r28209);
        mpfr_init(r28210);
        mpfr_init(r28211);
        mpfr_init(r28212);
        mpfr_init(r28213);
        mpfr_init(r28214);
        mpfr_init(r28215);
}

double f_dm(double a, double b) {
        mpfr_set_d(r28198, b, MPFR_RNDN);
        mpfr_set_d(r28199, a, MPFR_RNDN);
        mpfr_hypot(r28200, r28198, r28199, MPFR_RNDN);
        ;
        ;
        mpfr_add(r28203, r28201, r28202, MPFR_RNDN);
        mpfr_pow(r28204, r28200, r28203, MPFR_RNDN);
        ;
        mpfr_mul(r28206, r28199, r28199, MPFR_RNDN);
        mpfr_sub(r28207, r28202, r28199, MPFR_RNDN);
        mpfr_mul(r28208, r28206, r28207, MPFR_RNDN);
        mpfr_mul(r28209, r28198, r28198, MPFR_RNDN);
        mpfr_add(r28210, r28201, r28199, MPFR_RNDN);
        mpfr_mul(r28211, r28209, r28210, MPFR_RNDN);
        mpfr_add(r28212, r28208, r28211, MPFR_RNDN);
        mpfr_mul(r28213, r28205, r28212, MPFR_RNDN);
        mpfr_add(r28214, r28204, r28213, MPFR_RNDN);
        mpfr_sub(r28215, r28214, r28202, MPFR_RNDN);
        return mpfr_get_d(r28215, MPFR_RNDN);
}

