#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 r36152 = a;
        float r36153 = r36152 * r36152;
        float r36154 = b;
        float r36155 = r36154 * r36154;
        float r36156 = r36153 + r36155;
        float r36157 = 2;
        float r36158 = pow(r36156, r36157);
        float r36159 = 4;
        float r36160 = 1;
        float r36161 = r36160 - r36152;
        float r36162 = r36153 * r36161;
        float r36163 = 3;
        float r36164 = r36163 + r36152;
        float r36165 = r36155 * r36164;
        float r36166 = r36162 + r36165;
        float r36167 = r36159 * r36166;
        float r36168 = r36158 + r36167;
        float r36169 = r36168 - r36160;
        return r36169;
}

double f_id(double a, double b) {
        double r36170 = a;
        double r36171 = r36170 * r36170;
        double r36172 = b;
        double r36173 = r36172 * r36172;
        double r36174 = r36171 + r36173;
        double r36175 = 2;
        double r36176 = pow(r36174, r36175);
        double r36177 = 4;
        double r36178 = 1;
        double r36179 = r36178 - r36170;
        double r36180 = r36171 * r36179;
        double r36181 = 3;
        double r36182 = r36181 + r36170;
        double r36183 = r36173 * r36182;
        double r36184 = r36180 + r36183;
        double r36185 = r36177 * r36184;
        double r36186 = r36176 + r36185;
        double r36187 = r36186 - r36178;
        return r36187;
}


double f_of(float a, float b) {
        float r36188 = a;
        float r36189 = r36188 * r36188;
        float r36190 = b;
        float r36191 = r36190 * r36190;
        float r36192 = r36189 + r36191;
        float r36193 = 2;
        float r36194 = pow(r36192, r36193);
        float r36195 = 4;
        float r36196 = 1;
        float r36197 = r36196 - r36188;
        float r36198 = r36189 * r36197;
        float r36199 = 3;
        float r36200 = r36199 + r36188;
        float r36201 = r36191 * r36200;
        float r36202 = r36198 + r36201;
        float r36203 = r36195 * r36202;
        float r36204 = r36194 + r36203;
        float r36205 = sqrt(r36204);
        float r36206 = r36205 * r36205;
        float r36207 = r36206 - r36196;
        return r36207;
}

double f_od(double a, double b) {
        double r36208 = a;
        double r36209 = r36208 * r36208;
        double r36210 = b;
        double r36211 = r36210 * r36210;
        double r36212 = r36209 + r36211;
        double r36213 = 2;
        double r36214 = pow(r36212, r36213);
        double r36215 = 4;
        double r36216 = 1;
        double r36217 = r36216 - r36208;
        double r36218 = r36209 * r36217;
        double r36219 = 3;
        double r36220 = r36219 + r36208;
        double r36221 = r36211 * r36220;
        double r36222 = r36218 + r36221;
        double r36223 = r36215 * r36222;
        double r36224 = r36214 + r36223;
        double r36225 = sqrt(r36224);
        double r36226 = r36225 * r36225;
        double r36227 = r36226 - r36216;
        return r36227;
}

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 r36228, r36229, r36230, r36231, r36232, r36233, r36234, r36235, r36236, r36237, r36238, r36239, r36240, r36241, r36242, r36243, r36244, r36245;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36228);
        mpfr_init(r36229);
        mpfr_init(r36230);
        mpfr_init(r36231);
        mpfr_init(r36232);
        mpfr_init_set_str(r36233, "2", 10, MPFR_RNDN);
        mpfr_init(r36234);
        mpfr_init_set_str(r36235, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36236, "1", 10, MPFR_RNDN);
        mpfr_init(r36237);
        mpfr_init(r36238);
        mpfr_init_set_str(r36239, "3", 10, MPFR_RNDN);
        mpfr_init(r36240);
        mpfr_init(r36241);
        mpfr_init(r36242);
        mpfr_init(r36243);
        mpfr_init(r36244);
        mpfr_init(r36245);
}

double f_im(double a, double b) {
        mpfr_set_d(r36228, a, MPFR_RNDN);
        mpfr_mul(r36229, r36228, r36228, MPFR_RNDN);
        mpfr_set_d(r36230, b, MPFR_RNDN);
        mpfr_mul(r36231, r36230, r36230, MPFR_RNDN);
        mpfr_add(r36232, r36229, r36231, MPFR_RNDN);
        ;
        mpfr_pow(r36234, r36232, r36233, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36237, r36236, r36228, MPFR_RNDN);
        mpfr_mul(r36238, r36229, r36237, MPFR_RNDN);
        ;
        mpfr_add(r36240, r36239, r36228, MPFR_RNDN);
        mpfr_mul(r36241, r36231, r36240, MPFR_RNDN);
        mpfr_add(r36242, r36238, r36241, MPFR_RNDN);
        mpfr_mul(r36243, r36235, r36242, MPFR_RNDN);
        mpfr_add(r36244, r36234, r36243, MPFR_RNDN);
        mpfr_sub(r36245, r36244, r36236, MPFR_RNDN);
        return mpfr_get_d(r36245, MPFR_RNDN);
}

static mpfr_t r36246, r36247, r36248, r36249, r36250, r36251, r36252, r36253, r36254, r36255, r36256, r36257, r36258, r36259, r36260, r36261, r36262, r36263, r36264, r36265;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36246);
        mpfr_init(r36247);
        mpfr_init(r36248);
        mpfr_init(r36249);
        mpfr_init(r36250);
        mpfr_init_set_str(r36251, "2", 10, MPFR_RNDN);
        mpfr_init(r36252);
        mpfr_init_set_str(r36253, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36254, "1", 10, MPFR_RNDN);
        mpfr_init(r36255);
        mpfr_init(r36256);
        mpfr_init_set_str(r36257, "3", 10, MPFR_RNDN);
        mpfr_init(r36258);
        mpfr_init(r36259);
        mpfr_init(r36260);
        mpfr_init(r36261);
        mpfr_init(r36262);
        mpfr_init(r36263);
        mpfr_init(r36264);
        mpfr_init(r36265);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36246, a, MPFR_RNDN);
        mpfr_mul(r36247, r36246, r36246, MPFR_RNDN);
        mpfr_set_d(r36248, b, MPFR_RNDN);
        mpfr_mul(r36249, r36248, r36248, MPFR_RNDN);
        mpfr_add(r36250, r36247, r36249, MPFR_RNDN);
        ;
        mpfr_pow(r36252, r36250, r36251, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36255, r36254, r36246, MPFR_RNDN);
        mpfr_mul(r36256, r36247, r36255, MPFR_RNDN);
        ;
        mpfr_add(r36258, r36257, r36246, MPFR_RNDN);
        mpfr_mul(r36259, r36249, r36258, MPFR_RNDN);
        mpfr_add(r36260, r36256, r36259, MPFR_RNDN);
        mpfr_mul(r36261, r36253, r36260, MPFR_RNDN);
        mpfr_add(r36262, r36252, r36261, MPFR_RNDN);
        mpfr_sqrt(r36263, r36262, MPFR_RNDN);
        mpfr_mul(r36264, r36263, r36263, MPFR_RNDN);
        mpfr_sub(r36265, r36264, r36254, MPFR_RNDN);
        return mpfr_get_d(r36265, MPFR_RNDN);
}

static mpfr_t r36266, r36267, r36268, r36269, r36270, r36271, r36272, r36273, r36274, r36275, r36276, r36277, r36278, r36279, r36280, r36281, r36282, r36283, r36284, r36285;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36266);
        mpfr_init(r36267);
        mpfr_init(r36268);
        mpfr_init(r36269);
        mpfr_init(r36270);
        mpfr_init_set_str(r36271, "2", 10, MPFR_RNDN);
        mpfr_init(r36272);
        mpfr_init_set_str(r36273, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36274, "1", 10, MPFR_RNDN);
        mpfr_init(r36275);
        mpfr_init(r36276);
        mpfr_init_set_str(r36277, "3", 10, MPFR_RNDN);
        mpfr_init(r36278);
        mpfr_init(r36279);
        mpfr_init(r36280);
        mpfr_init(r36281);
        mpfr_init(r36282);
        mpfr_init(r36283);
        mpfr_init(r36284);
        mpfr_init(r36285);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36266, a, MPFR_RNDN);
        mpfr_mul(r36267, r36266, r36266, MPFR_RNDN);
        mpfr_set_d(r36268, b, MPFR_RNDN);
        mpfr_mul(r36269, r36268, r36268, MPFR_RNDN);
        mpfr_add(r36270, r36267, r36269, MPFR_RNDN);
        ;
        mpfr_pow(r36272, r36270, r36271, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r36275, r36274, r36266, MPFR_RNDN);
        mpfr_mul(r36276, r36267, r36275, MPFR_RNDN);
        ;
        mpfr_add(r36278, r36277, r36266, MPFR_RNDN);
        mpfr_mul(r36279, r36269, r36278, MPFR_RNDN);
        mpfr_add(r36280, r36276, r36279, MPFR_RNDN);
        mpfr_mul(r36281, r36273, r36280, MPFR_RNDN);
        mpfr_add(r36282, r36272, r36281, MPFR_RNDN);
        mpfr_sqrt(r36283, r36282, MPFR_RNDN);
        mpfr_mul(r36284, r36283, r36283, MPFR_RNDN);
        mpfr_sub(r36285, r36284, r36274, MPFR_RNDN);
        return mpfr_get_d(r36285, MPFR_RNDN);
}

