#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 r12032 = a;
        float r12033 = r12032 * r12032;
        float r12034 = b;
        float r12035 = r12034 * r12034;
        float r12036 = r12033 + r12035;
        float r12037 = 2;
        float r12038 = pow(r12036, r12037);
        float r12039 = 4;
        float r12040 = 1;
        float r12041 = r12040 + r12032;
        float r12042 = r12033 * r12041;
        float r12043 = 3;
        float r12044 = r12043 * r12032;
        float r12045 = r12040 - r12044;
        float r12046 = r12035 * r12045;
        float r12047 = r12042 + r12046;
        float r12048 = r12039 * r12047;
        float r12049 = r12038 + r12048;
        float r12050 = r12049 - r12040;
        return r12050;
}

double f_id(double a, double b) {
        double r12051 = a;
        double r12052 = r12051 * r12051;
        double r12053 = b;
        double r12054 = r12053 * r12053;
        double r12055 = r12052 + r12054;
        double r12056 = 2;
        double r12057 = pow(r12055, r12056);
        double r12058 = 4;
        double r12059 = 1;
        double r12060 = r12059 + r12051;
        double r12061 = r12052 * r12060;
        double r12062 = 3;
        double r12063 = r12062 * r12051;
        double r12064 = r12059 - r12063;
        double r12065 = r12054 * r12064;
        double r12066 = r12061 + r12065;
        double r12067 = r12058 * r12066;
        double r12068 = r12057 + r12067;
        double r12069 = r12068 - r12059;
        return r12069;
}


double f_of(float a, float b) {
        float r12070 = a;
        float r12071 = r12070 * r12070;
        float r12072 = b;
        float r12073 = r12072 * r12072;
        float r12074 = r12071 + r12073;
        float r12075 = 2;
        float r12076 = pow(r12074, r12075);
        float r12077 = 4;
        float r12078 = 1;
        float r12079 = r12078 + r12070;
        float r12080 = r12071 * r12079;
        float r12081 = 3;
        float r12082 = r12081 * r12070;
        float r12083 = r12078 - r12082;
        float r12084 = r12073 * r12083;
        float r12085 = r12080 + r12084;
        float r12086 = r12077 * r12085;
        float r12087 = r12076 + r12086;
        float r12088 = r12087 - r12078;
        return r12088;
}

double f_od(double a, double b) {
        double r12089 = a;
        double r12090 = r12089 * r12089;
        double r12091 = b;
        double r12092 = r12091 * r12091;
        double r12093 = r12090 + r12092;
        double r12094 = 2;
        double r12095 = pow(r12093, r12094);
        double r12096 = 4;
        double r12097 = 1;
        double r12098 = r12097 + r12089;
        double r12099 = r12090 * r12098;
        double r12100 = 3;
        double r12101 = r12100 * r12089;
        double r12102 = r12097 - r12101;
        double r12103 = r12092 * r12102;
        double r12104 = r12099 + r12103;
        double r12105 = r12096 * r12104;
        double r12106 = r12095 + r12105;
        double r12107 = r12106 - r12097;
        return r12107;
}

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 r12108, r12109, r12110, r12111, r12112, r12113, r12114, r12115, r12116, r12117, r12118, r12119, r12120, r12121, r12122, r12123, r12124, r12125, r12126;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r12108);
        mpfr_init(r12109);
        mpfr_init(r12110);
        mpfr_init(r12111);
        mpfr_init(r12112);
        mpfr_init_set_str(r12113, "2", 10, MPFR_RNDN);
        mpfr_init(r12114);
        mpfr_init_set_str(r12115, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12116, "1", 10, MPFR_RNDN);
        mpfr_init(r12117);
        mpfr_init(r12118);
        mpfr_init_set_str(r12119, "3", 10, MPFR_RNDN);
        mpfr_init(r12120);
        mpfr_init(r12121);
        mpfr_init(r12122);
        mpfr_init(r12123);
        mpfr_init(r12124);
        mpfr_init(r12125);
        mpfr_init(r12126);
}

double f_im(double a, double b) {
        mpfr_set_d(r12108, a, MPFR_RNDN);
        mpfr_mul(r12109, r12108, r12108, MPFR_RNDN);
        mpfr_set_d(r12110, b, MPFR_RNDN);
        mpfr_mul(r12111, r12110, r12110, MPFR_RNDN);
        mpfr_add(r12112, r12109, r12111, MPFR_RNDN);
        ;
        mpfr_pow(r12114, r12112, r12113, MPFR_RNDN);
        ;
        ;
        mpfr_add(r12117, r12116, r12108, MPFR_RNDN);
        mpfr_mul(r12118, r12109, r12117, MPFR_RNDN);
        ;
        mpfr_mul(r12120, r12119, r12108, MPFR_RNDN);
        mpfr_sub(r12121, r12116, r12120, MPFR_RNDN);
        mpfr_mul(r12122, r12111, r12121, MPFR_RNDN);
        mpfr_add(r12123, r12118, r12122, MPFR_RNDN);
        mpfr_mul(r12124, r12115, r12123, MPFR_RNDN);
        mpfr_add(r12125, r12114, r12124, MPFR_RNDN);
        mpfr_sub(r12126, r12125, r12116, MPFR_RNDN);
        return mpfr_get_d(r12126, MPFR_RNDN);
}

static mpfr_t r12127, r12128, r12129, r12130, r12131, r12132, r12133, r12134, r12135, r12136, r12137, r12138, r12139, r12140, r12141, r12142, r12143, r12144, r12145;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r12127);
        mpfr_init(r12128);
        mpfr_init(r12129);
        mpfr_init(r12130);
        mpfr_init(r12131);
        mpfr_init_set_str(r12132, "2", 10, MPFR_RNDN);
        mpfr_init(r12133);
        mpfr_init_set_str(r12134, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12135, "1", 10, MPFR_RNDN);
        mpfr_init(r12136);
        mpfr_init(r12137);
        mpfr_init_set_str(r12138, "3", 10, MPFR_RNDN);
        mpfr_init(r12139);
        mpfr_init(r12140);
        mpfr_init(r12141);
        mpfr_init(r12142);
        mpfr_init(r12143);
        mpfr_init(r12144);
        mpfr_init(r12145);
}

double f_fm(double a, double b) {
        mpfr_set_d(r12127, a, MPFR_RNDN);
        mpfr_mul(r12128, r12127, r12127, MPFR_RNDN);
        mpfr_set_d(r12129, b, MPFR_RNDN);
        mpfr_mul(r12130, r12129, r12129, MPFR_RNDN);
        mpfr_add(r12131, r12128, r12130, MPFR_RNDN);
        ;
        mpfr_pow(r12133, r12131, r12132, MPFR_RNDN);
        ;
        ;
        mpfr_add(r12136, r12135, r12127, MPFR_RNDN);
        mpfr_mul(r12137, r12128, r12136, MPFR_RNDN);
        ;
        mpfr_mul(r12139, r12138, r12127, MPFR_RNDN);
        mpfr_sub(r12140, r12135, r12139, MPFR_RNDN);
        mpfr_mul(r12141, r12130, r12140, MPFR_RNDN);
        mpfr_add(r12142, r12137, r12141, MPFR_RNDN);
        mpfr_mul(r12143, r12134, r12142, MPFR_RNDN);
        mpfr_add(r12144, r12133, r12143, MPFR_RNDN);
        mpfr_sub(r12145, r12144, r12135, MPFR_RNDN);
        return mpfr_get_d(r12145, MPFR_RNDN);
}

static mpfr_t r12146, r12147, r12148, r12149, r12150, r12151, r12152, r12153, r12154, r12155, r12156, r12157, r12158, r12159, r12160, r12161, r12162, r12163, r12164;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r12146);
        mpfr_init(r12147);
        mpfr_init(r12148);
        mpfr_init(r12149);
        mpfr_init(r12150);
        mpfr_init_set_str(r12151, "2", 10, MPFR_RNDN);
        mpfr_init(r12152);
        mpfr_init_set_str(r12153, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12154, "1", 10, MPFR_RNDN);
        mpfr_init(r12155);
        mpfr_init(r12156);
        mpfr_init_set_str(r12157, "3", 10, MPFR_RNDN);
        mpfr_init(r12158);
        mpfr_init(r12159);
        mpfr_init(r12160);
        mpfr_init(r12161);
        mpfr_init(r12162);
        mpfr_init(r12163);
        mpfr_init(r12164);
}

double f_dm(double a, double b) {
        mpfr_set_d(r12146, a, MPFR_RNDN);
        mpfr_mul(r12147, r12146, r12146, MPFR_RNDN);
        mpfr_set_d(r12148, b, MPFR_RNDN);
        mpfr_mul(r12149, r12148, r12148, MPFR_RNDN);
        mpfr_add(r12150, r12147, r12149, MPFR_RNDN);
        ;
        mpfr_pow(r12152, r12150, r12151, MPFR_RNDN);
        ;
        ;
        mpfr_add(r12155, r12154, r12146, MPFR_RNDN);
        mpfr_mul(r12156, r12147, r12155, MPFR_RNDN);
        ;
        mpfr_mul(r12158, r12157, r12146, MPFR_RNDN);
        mpfr_sub(r12159, r12154, r12158, MPFR_RNDN);
        mpfr_mul(r12160, r12149, r12159, MPFR_RNDN);
        mpfr_add(r12161, r12156, r12160, MPFR_RNDN);
        mpfr_mul(r12162, r12153, r12161, MPFR_RNDN);
        mpfr_add(r12163, r12152, r12162, MPFR_RNDN);
        mpfr_sub(r12164, r12163, r12154, MPFR_RNDN);
        return mpfr_get_d(r12164, MPFR_RNDN);
}

