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

double f_id(double a, double b) {
        double r36169 = a;
        double r36170 = r36169 * r36169;
        double r36171 = b;
        double r36172 = r36171 * r36171;
        double r36173 = r36170 + r36172;
        double r36174 = 2;
        double r36175 = pow(r36173, r36174);
        double r36176 = 4;
        double r36177 = 1;
        double r36178 = r36177 + r36169;
        double r36179 = r36170 * r36178;
        double r36180 = 3;
        double r36181 = r36180 * r36169;
        double r36182 = r36177 - r36181;
        double r36183 = r36172 * r36182;
        double r36184 = r36179 + r36183;
        double r36185 = r36176 * r36184;
        double r36186 = r36175 + r36185;
        double r36187 = r36186 - r36177;
        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 = r36196 - r36200;
        float r36202 = r36191 * r36201;
        float r36203 = r36198 + r36202;
        float r36204 = r36195 * r36203;
        float r36205 = r36194 + r36204;
        float r36206 = r36205 - r36196;
        return r36206;
}

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

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

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

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

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

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

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

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

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

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

