#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 r12145 = a;
        float r12146 = r12145 * r12145;
        float r12147 = b;
        float r12148 = r12147 * r12147;
        float r12149 = r12146 + r12148;
        float r12150 = 2;
        float r12151 = pow(r12149, r12150);
        float r12152 = 4;
        float r12153 = 1;
        float r12154 = r12153 - r12145;
        float r12155 = r12146 * r12154;
        float r12156 = 3;
        float r12157 = r12156 + r12145;
        float r12158 = r12148 * r12157;
        float r12159 = r12155 + r12158;
        float r12160 = r12152 * r12159;
        float r12161 = r12151 + r12160;
        float r12162 = r12161 - r12153;
        return r12162;
}

double f_id(double a, double b) {
        double r12163 = a;
        double r12164 = r12163 * r12163;
        double r12165 = b;
        double r12166 = r12165 * r12165;
        double r12167 = r12164 + r12166;
        double r12168 = 2;
        double r12169 = pow(r12167, r12168);
        double r12170 = 4;
        double r12171 = 1;
        double r12172 = r12171 - r12163;
        double r12173 = r12164 * r12172;
        double r12174 = 3;
        double r12175 = r12174 + r12163;
        double r12176 = r12166 * r12175;
        double r12177 = r12173 + r12176;
        double r12178 = r12170 * r12177;
        double r12179 = r12169 + r12178;
        double r12180 = r12179 - r12171;
        return r12180;
}


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

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

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 r12221, r12222, r12223, r12224, r12225, r12226, r12227, r12228, r12229, r12230, r12231, r12232, r12233, r12234, r12235, r12236, r12237, r12238;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r12221);
        mpfr_init(r12222);
        mpfr_init(r12223);
        mpfr_init(r12224);
        mpfr_init(r12225);
        mpfr_init_set_str(r12226, "2", 10, MPFR_RNDN);
        mpfr_init(r12227);
        mpfr_init_set_str(r12228, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12229, "1", 10, MPFR_RNDN);
        mpfr_init(r12230);
        mpfr_init(r12231);
        mpfr_init_set_str(r12232, "3", 10, MPFR_RNDN);
        mpfr_init(r12233);
        mpfr_init(r12234);
        mpfr_init(r12235);
        mpfr_init(r12236);
        mpfr_init(r12237);
        mpfr_init(r12238);
}

double f_im(double a, double b) {
        mpfr_set_d(r12221, a, MPFR_RNDN);
        mpfr_mul(r12222, r12221, r12221, MPFR_RNDN);
        mpfr_set_d(r12223, b, MPFR_RNDN);
        mpfr_mul(r12224, r12223, r12223, MPFR_RNDN);
        mpfr_add(r12225, r12222, r12224, MPFR_RNDN);
        ;
        mpfr_pow(r12227, r12225, r12226, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12230, r12229, r12221, MPFR_RNDN);
        mpfr_mul(r12231, r12222, r12230, MPFR_RNDN);
        ;
        mpfr_add(r12233, r12232, r12221, MPFR_RNDN);
        mpfr_mul(r12234, r12224, r12233, MPFR_RNDN);
        mpfr_add(r12235, r12231, r12234, MPFR_RNDN);
        mpfr_mul(r12236, r12228, r12235, MPFR_RNDN);
        mpfr_add(r12237, r12227, r12236, MPFR_RNDN);
        mpfr_sub(r12238, r12237, r12229, MPFR_RNDN);
        return mpfr_get_d(r12238, MPFR_RNDN);
}

static mpfr_t r12239, r12240, r12241, r12242, r12243, r12244, r12245, r12246, r12247, r12248, r12249, r12250, r12251, r12252, r12253, r12254, r12255, r12256, r12257, r12258;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r12239);
        mpfr_init(r12240);
        mpfr_init(r12241);
        mpfr_init(r12242);
        mpfr_init(r12243);
        mpfr_init_set_str(r12244, "2", 10, MPFR_RNDN);
        mpfr_init(r12245);
        mpfr_init_set_str(r12246, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12247, "1", 10, MPFR_RNDN);
        mpfr_init(r12248);
        mpfr_init(r12249);
        mpfr_init_set_str(r12250, "3", 10, MPFR_RNDN);
        mpfr_init(r12251);
        mpfr_init(r12252);
        mpfr_init(r12253);
        mpfr_init(r12254);
        mpfr_init(r12255);
        mpfr_init(r12256);
        mpfr_init(r12257);
        mpfr_init(r12258);
}

double f_fm(double a, double b) {
        mpfr_set_d(r12239, a, MPFR_RNDN);
        mpfr_mul(r12240, r12239, r12239, MPFR_RNDN);
        mpfr_set_d(r12241, b, MPFR_RNDN);
        mpfr_mul(r12242, r12241, r12241, MPFR_RNDN);
        mpfr_add(r12243, r12240, r12242, MPFR_RNDN);
        ;
        mpfr_pow(r12245, r12243, r12244, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12248, r12247, r12239, MPFR_RNDN);
        mpfr_mul(r12249, r12240, r12248, MPFR_RNDN);
        ;
        mpfr_add(r12251, r12250, r12239, MPFR_RNDN);
        mpfr_mul(r12252, r12242, r12251, MPFR_RNDN);
        mpfr_add(r12253, r12249, r12252, MPFR_RNDN);
        mpfr_mul(r12254, r12246, r12253, MPFR_RNDN);
        mpfr_add(r12255, r12245, r12254, MPFR_RNDN);
        mpfr_sqrt(r12256, r12255, MPFR_RNDN);
        mpfr_mul(r12257, r12256, r12256, MPFR_RNDN);
        mpfr_sub(r12258, r12257, r12247, MPFR_RNDN);
        return mpfr_get_d(r12258, MPFR_RNDN);
}

static mpfr_t r12259, r12260, r12261, r12262, r12263, r12264, r12265, r12266, r12267, r12268, r12269, r12270, r12271, r12272, r12273, r12274, r12275, r12276, r12277, r12278;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r12259);
        mpfr_init(r12260);
        mpfr_init(r12261);
        mpfr_init(r12262);
        mpfr_init(r12263);
        mpfr_init_set_str(r12264, "2", 10, MPFR_RNDN);
        mpfr_init(r12265);
        mpfr_init_set_str(r12266, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12267, "1", 10, MPFR_RNDN);
        mpfr_init(r12268);
        mpfr_init(r12269);
        mpfr_init_set_str(r12270, "3", 10, MPFR_RNDN);
        mpfr_init(r12271);
        mpfr_init(r12272);
        mpfr_init(r12273);
        mpfr_init(r12274);
        mpfr_init(r12275);
        mpfr_init(r12276);
        mpfr_init(r12277);
        mpfr_init(r12278);
}

double f_dm(double a, double b) {
        mpfr_set_d(r12259, a, MPFR_RNDN);
        mpfr_mul(r12260, r12259, r12259, MPFR_RNDN);
        mpfr_set_d(r12261, b, MPFR_RNDN);
        mpfr_mul(r12262, r12261, r12261, MPFR_RNDN);
        mpfr_add(r12263, r12260, r12262, MPFR_RNDN);
        ;
        mpfr_pow(r12265, r12263, r12264, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12268, r12267, r12259, MPFR_RNDN);
        mpfr_mul(r12269, r12260, r12268, MPFR_RNDN);
        ;
        mpfr_add(r12271, r12270, r12259, MPFR_RNDN);
        mpfr_mul(r12272, r12262, r12271, MPFR_RNDN);
        mpfr_add(r12273, r12269, r12272, MPFR_RNDN);
        mpfr_mul(r12274, r12266, r12273, MPFR_RNDN);
        mpfr_add(r12275, r12265, r12274, MPFR_RNDN);
        mpfr_sqrt(r12276, r12275, MPFR_RNDN);
        mpfr_mul(r12277, r12276, r12276, MPFR_RNDN);
        mpfr_sub(r12278, r12277, r12267, MPFR_RNDN);
        return mpfr_get_d(r12278, MPFR_RNDN);
}

