#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 r36123 = a;
        float r36124 = r36123 * r36123;
        float r36125 = b;
        float r36126 = r36125 * r36125;
        float r36127 = r36124 + r36126;
        float r36128 = 2;
        float r36129 = pow(r36127, r36128);
        float r36130 = 4;
        float r36131 = 1;
        float r36132 = r36131 + r36123;
        float r36133 = r36124 * r36132;
        float r36134 = 3;
        float r36135 = r36134 * r36123;
        float r36136 = r36131 - r36135;
        float r36137 = r36126 * r36136;
        float r36138 = r36133 + r36137;
        float r36139 = r36130 * r36138;
        float r36140 = r36129 + r36139;
        float r36141 = r36140 - r36131;
        return r36141;
}

double f_id(double a, double b) {
        double r36142 = a;
        double r36143 = r36142 * r36142;
        double r36144 = b;
        double r36145 = r36144 * r36144;
        double r36146 = r36143 + r36145;
        double r36147 = 2;
        double r36148 = pow(r36146, r36147);
        double r36149 = 4;
        double r36150 = 1;
        double r36151 = r36150 + r36142;
        double r36152 = r36143 * r36151;
        double r36153 = 3;
        double r36154 = r36153 * r36142;
        double r36155 = r36150 - r36154;
        double r36156 = r36145 * r36155;
        double r36157 = r36152 + r36156;
        double r36158 = r36149 * r36157;
        double r36159 = r36148 + r36158;
        double r36160 = r36159 - r36150;
        return r36160;
}


double f_of(float a, float b) {
        float r36161 = a;
        float r36162 = r36161 * r36161;
        float r36163 = b;
        float r36164 = r36163 * r36163;
        float r36165 = r36162 + r36164;
        float r36166 = 2;
        float r36167 = pow(r36165, r36166);
        float r36168 = 4;
        float r36169 = 1;
        float r36170 = r36169 + r36161;
        float r36171 = r36162 * r36170;
        float r36172 = 3;
        float r36173 = r36172 * r36161;
        float r36174 = r36169 - r36173;
        float r36175 = r36164 * r36174;
        float r36176 = r36171 + r36175;
        float r36177 = r36168 * r36176;
        float r36178 = r36167 + r36177;
        float r36179 = r36178 - r36169;
        return r36179;
}

double f_od(double a, double b) {
        double r36180 = a;
        double r36181 = r36180 * r36180;
        double r36182 = b;
        double r36183 = r36182 * r36182;
        double r36184 = r36181 + r36183;
        double r36185 = 2;
        double r36186 = pow(r36184, r36185);
        double r36187 = 4;
        double r36188 = 1;
        double r36189 = r36188 + r36180;
        double r36190 = r36181 * r36189;
        double r36191 = 3;
        double r36192 = r36191 * r36180;
        double r36193 = r36188 - r36192;
        double r36194 = r36183 * r36193;
        double r36195 = r36190 + r36194;
        double r36196 = r36187 * r36195;
        double r36197 = r36186 + r36196;
        double r36198 = r36197 - r36188;
        return r36198;
}

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 r36199, r36200, r36201, r36202, r36203, r36204, r36205, r36206, r36207, r36208, r36209, r36210, r36211, r36212, r36213, r36214, r36215, r36216, r36217;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36199);
        mpfr_init(r36200);
        mpfr_init(r36201);
        mpfr_init(r36202);
        mpfr_init(r36203);
        mpfr_init_set_str(r36204, "2", 10, MPFR_RNDN);
        mpfr_init(r36205);
        mpfr_init_set_str(r36206, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36207, "1", 10, MPFR_RNDN);
        mpfr_init(r36208);
        mpfr_init(r36209);
        mpfr_init_set_str(r36210, "3", 10, MPFR_RNDN);
        mpfr_init(r36211);
        mpfr_init(r36212);
        mpfr_init(r36213);
        mpfr_init(r36214);
        mpfr_init(r36215);
        mpfr_init(r36216);
        mpfr_init(r36217);
}

double f_im(double a, double b) {
        mpfr_set_d(r36199, a, MPFR_RNDN);
        mpfr_mul(r36200, r36199, r36199, MPFR_RNDN);
        mpfr_set_d(r36201, b, MPFR_RNDN);
        mpfr_mul(r36202, r36201, r36201, MPFR_RNDN);
        mpfr_add(r36203, r36200, r36202, MPFR_RNDN);
        ;
        mpfr_pow(r36205, r36203, r36204, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36208, r36207, r36199, MPFR_RNDN);
        mpfr_mul(r36209, r36200, r36208, MPFR_RNDN);
        ;
        mpfr_mul(r36211, r36210, r36199, MPFR_RNDN);
        mpfr_sub(r36212, r36207, r36211, MPFR_RNDN);
        mpfr_mul(r36213, r36202, r36212, MPFR_RNDN);
        mpfr_add(r36214, r36209, r36213, MPFR_RNDN);
        mpfr_mul(r36215, r36206, r36214, MPFR_RNDN);
        mpfr_add(r36216, r36205, r36215, MPFR_RNDN);
        mpfr_sub(r36217, r36216, r36207, MPFR_RNDN);
        return mpfr_get_d(r36217, MPFR_RNDN);
}

static mpfr_t r36218, r36219, r36220, r36221, r36222, r36223, r36224, r36225, r36226, r36227, r36228, r36229, r36230, r36231, r36232, r36233, r36234, r36235, r36236;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36218);
        mpfr_init(r36219);
        mpfr_init(r36220);
        mpfr_init(r36221);
        mpfr_init(r36222);
        mpfr_init_set_str(r36223, "2", 10, MPFR_RNDN);
        mpfr_init(r36224);
        mpfr_init_set_str(r36225, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36226, "1", 10, MPFR_RNDN);
        mpfr_init(r36227);
        mpfr_init(r36228);
        mpfr_init_set_str(r36229, "3", 10, MPFR_RNDN);
        mpfr_init(r36230);
        mpfr_init(r36231);
        mpfr_init(r36232);
        mpfr_init(r36233);
        mpfr_init(r36234);
        mpfr_init(r36235);
        mpfr_init(r36236);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36218, a, MPFR_RNDN);
        mpfr_mul(r36219, r36218, r36218, MPFR_RNDN);
        mpfr_set_d(r36220, b, MPFR_RNDN);
        mpfr_mul(r36221, r36220, r36220, MPFR_RNDN);
        mpfr_add(r36222, r36219, r36221, MPFR_RNDN);
        ;
        mpfr_pow(r36224, r36222, r36223, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36227, r36226, r36218, MPFR_RNDN);
        mpfr_mul(r36228, r36219, r36227, MPFR_RNDN);
        ;
        mpfr_mul(r36230, r36229, r36218, MPFR_RNDN);
        mpfr_sub(r36231, r36226, r36230, MPFR_RNDN);
        mpfr_mul(r36232, r36221, r36231, MPFR_RNDN);
        mpfr_add(r36233, r36228, r36232, MPFR_RNDN);
        mpfr_mul(r36234, r36225, r36233, MPFR_RNDN);
        mpfr_add(r36235, r36224, r36234, MPFR_RNDN);
        mpfr_sub(r36236, r36235, r36226, MPFR_RNDN);
        return mpfr_get_d(r36236, MPFR_RNDN);
}

static mpfr_t r36237, r36238, r36239, r36240, r36241, r36242, r36243, r36244, r36245, r36246, r36247, r36248, r36249, r36250, r36251, r36252, r36253, r36254, r36255;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36237);
        mpfr_init(r36238);
        mpfr_init(r36239);
        mpfr_init(r36240);
        mpfr_init(r36241);
        mpfr_init_set_str(r36242, "2", 10, MPFR_RNDN);
        mpfr_init(r36243);
        mpfr_init_set_str(r36244, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36245, "1", 10, MPFR_RNDN);
        mpfr_init(r36246);
        mpfr_init(r36247);
        mpfr_init_set_str(r36248, "3", 10, MPFR_RNDN);
        mpfr_init(r36249);
        mpfr_init(r36250);
        mpfr_init(r36251);
        mpfr_init(r36252);
        mpfr_init(r36253);
        mpfr_init(r36254);
        mpfr_init(r36255);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36237, a, MPFR_RNDN);
        mpfr_mul(r36238, r36237, r36237, MPFR_RNDN);
        mpfr_set_d(r36239, b, MPFR_RNDN);
        mpfr_mul(r36240, r36239, r36239, MPFR_RNDN);
        mpfr_add(r36241, r36238, r36240, MPFR_RNDN);
        ;
        mpfr_pow(r36243, r36241, r36242, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36246, r36245, r36237, MPFR_RNDN);
        mpfr_mul(r36247, r36238, r36246, MPFR_RNDN);
        ;
        mpfr_mul(r36249, r36248, r36237, MPFR_RNDN);
        mpfr_sub(r36250, r36245, r36249, MPFR_RNDN);
        mpfr_mul(r36251, r36240, r36250, MPFR_RNDN);
        mpfr_add(r36252, r36247, r36251, MPFR_RNDN);
        mpfr_mul(r36253, r36244, r36252, MPFR_RNDN);
        mpfr_add(r36254, r36243, r36253, MPFR_RNDN);
        mpfr_sub(r36255, r36254, r36245, MPFR_RNDN);
        return mpfr_get_d(r36255, MPFR_RNDN);
}

