#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 r12165 = a;
        float r12166 = r12165 * r12165;
        float r12167 = b;
        float r12168 = r12167 * r12167;
        float r12169 = r12166 + r12168;
        float r12170 = 2;
        float r12171 = pow(r12169, r12170);
        float r12172 = 4;
        float r12173 = 1;
        float r12174 = r12173 - r12165;
        float r12175 = r12166 * r12174;
        float r12176 = 3;
        float r12177 = r12176 + r12165;
        float r12178 = r12168 * r12177;
        float r12179 = r12175 + r12178;
        float r12180 = r12172 * r12179;
        float r12181 = r12171 + r12180;
        float r12182 = r12181 - r12173;
        return r12182;
}

double f_id(double a, double b) {
        double r12183 = a;
        double r12184 = r12183 * r12183;
        double r12185 = b;
        double r12186 = r12185 * r12185;
        double r12187 = r12184 + r12186;
        double r12188 = 2;
        double r12189 = pow(r12187, r12188);
        double r12190 = 4;
        double r12191 = 1;
        double r12192 = r12191 - r12183;
        double r12193 = r12184 * r12192;
        double r12194 = 3;
        double r12195 = r12194 + r12183;
        double r12196 = r12186 * r12195;
        double r12197 = r12193 + r12196;
        double r12198 = r12190 * r12197;
        double r12199 = r12189 + r12198;
        double r12200 = r12199 - r12191;
        return r12200;
}


double f_of(float a, float b) {
        float r12201 = a;
        float r12202 = r12201 * r12201;
        float r12203 = b;
        float r12204 = r12203 * r12203;
        float r12205 = r12202 + r12204;
        float r12206 = 2;
        float r12207 = pow(r12205, r12206);
        float r12208 = 4;
        float r12209 = 1;
        float r12210 = r12209 - r12201;
        float r12211 = r12202 * r12210;
        float r12212 = 3;
        float r12213 = r12212 + r12201;
        float r12214 = r12204 * r12213;
        float r12215 = r12211 + r12214;
        float r12216 = r12208 * r12215;
        float r12217 = r12207 + r12216;
        float r12218 = r12217 - r12209;
        return r12218;
}

double f_od(double a, double b) {
        double r12219 = a;
        double r12220 = r12219 * r12219;
        double r12221 = b;
        double r12222 = r12221 * r12221;
        double r12223 = r12220 + r12222;
        double r12224 = 2;
        double r12225 = pow(r12223, r12224);
        double r12226 = 4;
        double r12227 = 1;
        double r12228 = r12227 - r12219;
        double r12229 = r12220 * r12228;
        double r12230 = 3;
        double r12231 = r12230 + r12219;
        double r12232 = r12222 * r12231;
        double r12233 = r12229 + r12232;
        double r12234 = r12226 * r12233;
        double r12235 = r12225 + r12234;
        double r12236 = r12235 - r12227;
        return r12236;
}

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 r12237, r12238, r12239, r12240, r12241, r12242, r12243, r12244, r12245, r12246, r12247, r12248, r12249, r12250, r12251, r12252, r12253, r12254;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r12237);
        mpfr_init(r12238);
        mpfr_init(r12239);
        mpfr_init(r12240);
        mpfr_init(r12241);
        mpfr_init_set_str(r12242, "2", 10, MPFR_RNDN);
        mpfr_init(r12243);
        mpfr_init_set_str(r12244, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12245, "1", 10, MPFR_RNDN);
        mpfr_init(r12246);
        mpfr_init(r12247);
        mpfr_init_set_str(r12248, "3", 10, MPFR_RNDN);
        mpfr_init(r12249);
        mpfr_init(r12250);
        mpfr_init(r12251);
        mpfr_init(r12252);
        mpfr_init(r12253);
        mpfr_init(r12254);
}

double f_im(double a, double b) {
        mpfr_set_d(r12237, a, MPFR_RNDN);
        mpfr_mul(r12238, r12237, r12237, MPFR_RNDN);
        mpfr_set_d(r12239, b, MPFR_RNDN);
        mpfr_mul(r12240, r12239, r12239, MPFR_RNDN);
        mpfr_add(r12241, r12238, r12240, MPFR_RNDN);
        ;
        mpfr_pow(r12243, r12241, r12242, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12246, r12245, r12237, MPFR_RNDN);
        mpfr_mul(r12247, r12238, r12246, MPFR_RNDN);
        ;
        mpfr_add(r12249, r12248, r12237, MPFR_RNDN);
        mpfr_mul(r12250, r12240, r12249, MPFR_RNDN);
        mpfr_add(r12251, r12247, r12250, MPFR_RNDN);
        mpfr_mul(r12252, r12244, r12251, MPFR_RNDN);
        mpfr_add(r12253, r12243, r12252, MPFR_RNDN);
        mpfr_sub(r12254, r12253, r12245, MPFR_RNDN);
        return mpfr_get_d(r12254, MPFR_RNDN);
}

static mpfr_t r12255, r12256, r12257, r12258, r12259, r12260, r12261, r12262, r12263, r12264, r12265, r12266, r12267, r12268, r12269, r12270, r12271, r12272;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r12255);
        mpfr_init(r12256);
        mpfr_init(r12257);
        mpfr_init(r12258);
        mpfr_init(r12259);
        mpfr_init_set_str(r12260, "2", 10, MPFR_RNDN);
        mpfr_init(r12261);
        mpfr_init_set_str(r12262, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12263, "1", 10, MPFR_RNDN);
        mpfr_init(r12264);
        mpfr_init(r12265);
        mpfr_init_set_str(r12266, "3", 10, MPFR_RNDN);
        mpfr_init(r12267);
        mpfr_init(r12268);
        mpfr_init(r12269);
        mpfr_init(r12270);
        mpfr_init(r12271);
        mpfr_init(r12272);
}

double f_fm(double a, double b) {
        mpfr_set_d(r12255, a, MPFR_RNDN);
        mpfr_mul(r12256, r12255, r12255, MPFR_RNDN);
        mpfr_set_d(r12257, b, MPFR_RNDN);
        mpfr_mul(r12258, r12257, r12257, MPFR_RNDN);
        mpfr_add(r12259, r12256, r12258, MPFR_RNDN);
        ;
        mpfr_pow(r12261, r12259, r12260, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12264, r12263, r12255, MPFR_RNDN);
        mpfr_mul(r12265, r12256, r12264, MPFR_RNDN);
        ;
        mpfr_add(r12267, r12266, r12255, MPFR_RNDN);
        mpfr_mul(r12268, r12258, r12267, MPFR_RNDN);
        mpfr_add(r12269, r12265, r12268, MPFR_RNDN);
        mpfr_mul(r12270, r12262, r12269, MPFR_RNDN);
        mpfr_add(r12271, r12261, r12270, MPFR_RNDN);
        mpfr_sub(r12272, r12271, r12263, MPFR_RNDN);
        return mpfr_get_d(r12272, MPFR_RNDN);
}

static mpfr_t r12273, r12274, r12275, r12276, r12277, r12278, r12279, r12280, r12281, r12282, r12283, r12284, r12285, r12286, r12287, r12288, r12289, r12290;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r12273);
        mpfr_init(r12274);
        mpfr_init(r12275);
        mpfr_init(r12276);
        mpfr_init(r12277);
        mpfr_init_set_str(r12278, "2", 10, MPFR_RNDN);
        mpfr_init(r12279);
        mpfr_init_set_str(r12280, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12281, "1", 10, MPFR_RNDN);
        mpfr_init(r12282);
        mpfr_init(r12283);
        mpfr_init_set_str(r12284, "3", 10, MPFR_RNDN);
        mpfr_init(r12285);
        mpfr_init(r12286);
        mpfr_init(r12287);
        mpfr_init(r12288);
        mpfr_init(r12289);
        mpfr_init(r12290);
}

double f_dm(double a, double b) {
        mpfr_set_d(r12273, a, MPFR_RNDN);
        mpfr_mul(r12274, r12273, r12273, MPFR_RNDN);
        mpfr_set_d(r12275, b, MPFR_RNDN);
        mpfr_mul(r12276, r12275, r12275, MPFR_RNDN);
        mpfr_add(r12277, r12274, r12276, MPFR_RNDN);
        ;
        mpfr_pow(r12279, r12277, r12278, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12282, r12281, r12273, MPFR_RNDN);
        mpfr_mul(r12283, r12274, r12282, MPFR_RNDN);
        ;
        mpfr_add(r12285, r12284, r12273, MPFR_RNDN);
        mpfr_mul(r12286, r12276, r12285, MPFR_RNDN);
        mpfr_add(r12287, r12283, r12286, MPFR_RNDN);
        mpfr_mul(r12288, r12280, r12287, MPFR_RNDN);
        mpfr_add(r12289, r12279, r12288, MPFR_RNDN);
        mpfr_sub(r12290, r12289, r12281, MPFR_RNDN);
        return mpfr_get_d(r12290, MPFR_RNDN);
}

