#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 r12090 = a;
        float r12091 = r12090 * r12090;
        float r12092 = b;
        float r12093 = r12092 * r12092;
        float r12094 = r12091 + r12093;
        float r12095 = 2;
        float r12096 = pow(r12094, r12095);
        float r12097 = 4;
        float r12098 = 1;
        float r12099 = r12098 - r12090;
        float r12100 = r12091 * r12099;
        float r12101 = 3;
        float r12102 = r12101 + r12090;
        float r12103 = r12093 * r12102;
        float r12104 = r12100 + r12103;
        float r12105 = r12097 * r12104;
        float r12106 = r12096 + r12105;
        float r12107 = r12106 - r12098;
        return r12107;
}

double f_id(double a, double b) {
        double r12108 = a;
        double r12109 = r12108 * r12108;
        double r12110 = b;
        double r12111 = r12110 * r12110;
        double r12112 = r12109 + r12111;
        double r12113 = 2;
        double r12114 = pow(r12112, r12113);
        double r12115 = 4;
        double r12116 = 1;
        double r12117 = r12116 - r12108;
        double r12118 = r12109 * r12117;
        double r12119 = 3;
        double r12120 = r12119 + r12108;
        double r12121 = r12111 * r12120;
        double r12122 = r12118 + r12121;
        double r12123 = r12115 * r12122;
        double r12124 = r12114 + r12123;
        double r12125 = r12124 - r12116;
        return r12125;
}


double f_of(float a, float b) {
        float r12126 = a;
        float r12127 = r12126 * r12126;
        float r12128 = b;
        float r12129 = r12128 * r12128;
        float r12130 = r12127 + r12129;
        float r12131 = 2;
        float r12132 = pow(r12130, r12131);
        float r12133 = 4;
        float r12134 = 1;
        float r12135 = r12134 - r12126;
        float r12136 = r12127 * r12135;
        float r12137 = 3;
        float r12138 = r12137 + r12126;
        float r12139 = r12128 * r12138;
        float r12140 = r12128 * r12139;
        float r12141 = r12136 + r12140;
        float r12142 = r12133 * r12141;
        float r12143 = r12132 + r12142;
        float r12144 = r12143 - r12134;
        return r12144;
}

double f_od(double a, double b) {
        double r12145 = a;
        double r12146 = r12145 * r12145;
        double r12147 = b;
        double r12148 = r12147 * r12147;
        double r12149 = r12146 + r12148;
        double r12150 = 2;
        double r12151 = pow(r12149, r12150);
        double r12152 = 4;
        double r12153 = 1;
        double r12154 = r12153 - r12145;
        double r12155 = r12146 * r12154;
        double r12156 = 3;
        double r12157 = r12156 + r12145;
        double r12158 = r12147 * r12157;
        double r12159 = r12147 * r12158;
        double r12160 = r12155 + r12159;
        double r12161 = r12152 * r12160;
        double r12162 = r12151 + r12161;
        double r12163 = r12162 - r12153;
        return r12163;
}

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 r12164, r12165, r12166, r12167, r12168, r12169, r12170, r12171, r12172, r12173, r12174, r12175, r12176, r12177, r12178, r12179, r12180, r12181;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r12164);
        mpfr_init(r12165);
        mpfr_init(r12166);
        mpfr_init(r12167);
        mpfr_init(r12168);
        mpfr_init_set_str(r12169, "2", 10, MPFR_RNDN);
        mpfr_init(r12170);
        mpfr_init_set_str(r12171, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12172, "1", 10, MPFR_RNDN);
        mpfr_init(r12173);
        mpfr_init(r12174);
        mpfr_init_set_str(r12175, "3", 10, MPFR_RNDN);
        mpfr_init(r12176);
        mpfr_init(r12177);
        mpfr_init(r12178);
        mpfr_init(r12179);
        mpfr_init(r12180);
        mpfr_init(r12181);
}

double f_im(double a, double b) {
        mpfr_set_d(r12164, a, MPFR_RNDN);
        mpfr_mul(r12165, r12164, r12164, MPFR_RNDN);
        mpfr_set_d(r12166, b, MPFR_RNDN);
        mpfr_mul(r12167, r12166, r12166, MPFR_RNDN);
        mpfr_add(r12168, r12165, r12167, MPFR_RNDN);
        ;
        mpfr_pow(r12170, r12168, r12169, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12173, r12172, r12164, MPFR_RNDN);
        mpfr_mul(r12174, r12165, r12173, MPFR_RNDN);
        ;
        mpfr_add(r12176, r12175, r12164, MPFR_RNDN);
        mpfr_mul(r12177, r12167, r12176, MPFR_RNDN);
        mpfr_add(r12178, r12174, r12177, MPFR_RNDN);
        mpfr_mul(r12179, r12171, r12178, MPFR_RNDN);
        mpfr_add(r12180, r12170, r12179, MPFR_RNDN);
        mpfr_sub(r12181, r12180, r12172, MPFR_RNDN);
        return mpfr_get_d(r12181, MPFR_RNDN);
}

static mpfr_t r12182, r12183, r12184, r12185, r12186, r12187, r12188, r12189, r12190, r12191, r12192, r12193, r12194, r12195, r12196, r12197, r12198, r12199, r12200;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r12182);
        mpfr_init(r12183);
        mpfr_init(r12184);
        mpfr_init(r12185);
        mpfr_init(r12186);
        mpfr_init_set_str(r12187, "2", 10, MPFR_RNDN);
        mpfr_init(r12188);
        mpfr_init_set_str(r12189, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12190, "1", 10, MPFR_RNDN);
        mpfr_init(r12191);
        mpfr_init(r12192);
        mpfr_init_set_str(r12193, "3", 10, MPFR_RNDN);
        mpfr_init(r12194);
        mpfr_init(r12195);
        mpfr_init(r12196);
        mpfr_init(r12197);
        mpfr_init(r12198);
        mpfr_init(r12199);
        mpfr_init(r12200);
}

double f_fm(double a, double b) {
        mpfr_set_d(r12182, a, MPFR_RNDN);
        mpfr_mul(r12183, r12182, r12182, MPFR_RNDN);
        mpfr_set_d(r12184, b, MPFR_RNDN);
        mpfr_mul(r12185, r12184, r12184, MPFR_RNDN);
        mpfr_add(r12186, r12183, r12185, MPFR_RNDN);
        ;
        mpfr_pow(r12188, r12186, r12187, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12191, r12190, r12182, MPFR_RNDN);
        mpfr_mul(r12192, r12183, r12191, MPFR_RNDN);
        ;
        mpfr_add(r12194, r12193, r12182, MPFR_RNDN);
        mpfr_mul(r12195, r12184, r12194, MPFR_RNDN);
        mpfr_mul(r12196, r12184, r12195, MPFR_RNDN);
        mpfr_add(r12197, r12192, r12196, MPFR_RNDN);
        mpfr_mul(r12198, r12189, r12197, MPFR_RNDN);
        mpfr_add(r12199, r12188, r12198, MPFR_RNDN);
        mpfr_sub(r12200, r12199, r12190, MPFR_RNDN);
        return mpfr_get_d(r12200, MPFR_RNDN);
}

static mpfr_t r12201, r12202, r12203, r12204, r12205, r12206, r12207, r12208, r12209, r12210, r12211, r12212, r12213, r12214, r12215, r12216, r12217, r12218, r12219;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r12201);
        mpfr_init(r12202);
        mpfr_init(r12203);
        mpfr_init(r12204);
        mpfr_init(r12205);
        mpfr_init_set_str(r12206, "2", 10, MPFR_RNDN);
        mpfr_init(r12207);
        mpfr_init_set_str(r12208, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12209, "1", 10, MPFR_RNDN);
        mpfr_init(r12210);
        mpfr_init(r12211);
        mpfr_init_set_str(r12212, "3", 10, MPFR_RNDN);
        mpfr_init(r12213);
        mpfr_init(r12214);
        mpfr_init(r12215);
        mpfr_init(r12216);
        mpfr_init(r12217);
        mpfr_init(r12218);
        mpfr_init(r12219);
}

double f_dm(double a, double b) {
        mpfr_set_d(r12201, a, MPFR_RNDN);
        mpfr_mul(r12202, r12201, r12201, MPFR_RNDN);
        mpfr_set_d(r12203, b, MPFR_RNDN);
        mpfr_mul(r12204, r12203, r12203, MPFR_RNDN);
        mpfr_add(r12205, r12202, r12204, MPFR_RNDN);
        ;
        mpfr_pow(r12207, r12205, r12206, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12210, r12209, r12201, MPFR_RNDN);
        mpfr_mul(r12211, r12202, r12210, MPFR_RNDN);
        ;
        mpfr_add(r12213, r12212, r12201, MPFR_RNDN);
        mpfr_mul(r12214, r12203, r12213, MPFR_RNDN);
        mpfr_mul(r12215, r12203, r12214, MPFR_RNDN);
        mpfr_add(r12216, r12211, r12215, MPFR_RNDN);
        mpfr_mul(r12217, r12208, r12216, MPFR_RNDN);
        mpfr_add(r12218, r12207, r12217, MPFR_RNDN);
        mpfr_sub(r12219, r12218, r12209, MPFR_RNDN);
        return mpfr_get_d(r12219, MPFR_RNDN);
}

