#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 r6993 = a;
        float r6994 = r6993 * r6993;
        float r6995 = b;
        float r6996 = r6995 * r6995;
        float r6997 = r6994 + r6996;
        float r6998 = 2;
        float r6999 = pow(r6997, r6998);
        float r7000 = 4;
        float r7001 = 1;
        float r7002 = r7001 + r6993;
        float r7003 = r6994 * r7002;
        float r7004 = 3;
        float r7005 = r7004 * r6993;
        float r7006 = r7001 - r7005;
        float r7007 = r6996 * r7006;
        float r7008 = r7003 + r7007;
        float r7009 = r7000 * r7008;
        float r7010 = r6999 + r7009;
        float r7011 = r7010 - r7001;
        return r7011;
}

double f_id(double a, double b) {
        double r7012 = a;
        double r7013 = r7012 * r7012;
        double r7014 = b;
        double r7015 = r7014 * r7014;
        double r7016 = r7013 + r7015;
        double r7017 = 2;
        double r7018 = pow(r7016, r7017);
        double r7019 = 4;
        double r7020 = 1;
        double r7021 = r7020 + r7012;
        double r7022 = r7013 * r7021;
        double r7023 = 3;
        double r7024 = r7023 * r7012;
        double r7025 = r7020 - r7024;
        double r7026 = r7015 * r7025;
        double r7027 = r7022 + r7026;
        double r7028 = r7019 * r7027;
        double r7029 = r7018 + r7028;
        double r7030 = r7029 - r7020;
        return r7030;
}


double f_of(float a, float b) {
        float r7031 = a;
        float r7032 = r7031 * r7031;
        float r7033 = b;
        float r7034 = r7033 * r7033;
        float r7035 = r7032 + r7034;
        float r7036 = 2;
        float r7037 = pow(r7035, r7036);
        float r7038 = 4;
        float r7039 = 1;
        float r7040 = r7039 + r7031;
        float r7041 = r7032 * r7040;
        float r7042 = 3;
        float r7043 = r7042 * r7031;
        float r7044 = r7039 - r7043;
        float r7045 = r7034 * r7044;
        float r7046 = r7041 + r7045;
        float r7047 = r7038 * r7046;
        float r7048 = r7037 + r7047;
        float r7049 = r7048 - r7039;
        return r7049;
}

double f_od(double a, double b) {
        double r7050 = a;
        double r7051 = r7050 * r7050;
        double r7052 = b;
        double r7053 = r7052 * r7052;
        double r7054 = r7051 + r7053;
        double r7055 = 2;
        double r7056 = pow(r7054, r7055);
        double r7057 = 4;
        double r7058 = 1;
        double r7059 = r7058 + r7050;
        double r7060 = r7051 * r7059;
        double r7061 = 3;
        double r7062 = r7061 * r7050;
        double r7063 = r7058 - r7062;
        double r7064 = r7053 * r7063;
        double r7065 = r7060 + r7064;
        double r7066 = r7057 * r7065;
        double r7067 = r7056 + r7066;
        double r7068 = r7067 - r7058;
        return r7068;
}

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 r7069, r7070, r7071, r7072, r7073, r7074, r7075, r7076, r7077, r7078, r7079, r7080, r7081, r7082, r7083, r7084, r7085, r7086, r7087;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r7069);
        mpfr_init(r7070);
        mpfr_init(r7071);
        mpfr_init(r7072);
        mpfr_init(r7073);
        mpfr_init_set_str(r7074, "2", 10, MPFR_RNDN);
        mpfr_init(r7075);
        mpfr_init_set_str(r7076, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r7077, "1", 10, MPFR_RNDN);
        mpfr_init(r7078);
        mpfr_init(r7079);
        mpfr_init_set_str(r7080, "3", 10, MPFR_RNDN);
        mpfr_init(r7081);
        mpfr_init(r7082);
        mpfr_init(r7083);
        mpfr_init(r7084);
        mpfr_init(r7085);
        mpfr_init(r7086);
        mpfr_init(r7087);
}

double f_im(double a, double b) {
        mpfr_set_d(r7069, a, MPFR_RNDN);
        mpfr_mul(r7070, r7069, r7069, MPFR_RNDN);
        mpfr_set_d(r7071, b, MPFR_RNDN);
        mpfr_mul(r7072, r7071, r7071, MPFR_RNDN);
        mpfr_add(r7073, r7070, r7072, MPFR_RNDN);
        ;
        mpfr_pow(r7075, r7073, r7074, MPFR_RNDN);
        ;
        ;
        mpfr_add(r7078, r7077, r7069, MPFR_RNDN);
        mpfr_mul(r7079, r7070, r7078, MPFR_RNDN);
        ;
        mpfr_mul(r7081, r7080, r7069, MPFR_RNDN);
        mpfr_sub(r7082, r7077, r7081, MPFR_RNDN);
        mpfr_mul(r7083, r7072, r7082, MPFR_RNDN);
        mpfr_add(r7084, r7079, r7083, MPFR_RNDN);
        mpfr_mul(r7085, r7076, r7084, MPFR_RNDN);
        mpfr_add(r7086, r7075, r7085, MPFR_RNDN);
        mpfr_sub(r7087, r7086, r7077, MPFR_RNDN);
        return mpfr_get_d(r7087, MPFR_RNDN);
}

static mpfr_t r7088, r7089, r7090, r7091, r7092, r7093, r7094, r7095, r7096, r7097, r7098, r7099, r7100, r7101, r7102, r7103, r7104, r7105, r7106;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r7088);
        mpfr_init(r7089);
        mpfr_init(r7090);
        mpfr_init(r7091);
        mpfr_init(r7092);
        mpfr_init_set_str(r7093, "2", 10, MPFR_RNDN);
        mpfr_init(r7094);
        mpfr_init_set_str(r7095, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r7096, "1", 10, MPFR_RNDN);
        mpfr_init(r7097);
        mpfr_init(r7098);
        mpfr_init_set_str(r7099, "3", 10, MPFR_RNDN);
        mpfr_init(r7100);
        mpfr_init(r7101);
        mpfr_init(r7102);
        mpfr_init(r7103);
        mpfr_init(r7104);
        mpfr_init(r7105);
        mpfr_init(r7106);
}

double f_fm(double a, double b) {
        mpfr_set_d(r7088, a, MPFR_RNDN);
        mpfr_mul(r7089, r7088, r7088, MPFR_RNDN);
        mpfr_set_d(r7090, b, MPFR_RNDN);
        mpfr_mul(r7091, r7090, r7090, MPFR_RNDN);
        mpfr_add(r7092, r7089, r7091, MPFR_RNDN);
        ;
        mpfr_pow(r7094, r7092, r7093, MPFR_RNDN);
        ;
        ;
        mpfr_add(r7097, r7096, r7088, MPFR_RNDN);
        mpfr_mul(r7098, r7089, r7097, MPFR_RNDN);
        ;
        mpfr_mul(r7100, r7099, r7088, MPFR_RNDN);
        mpfr_sub(r7101, r7096, r7100, MPFR_RNDN);
        mpfr_mul(r7102, r7091, r7101, MPFR_RNDN);
        mpfr_add(r7103, r7098, r7102, MPFR_RNDN);
        mpfr_mul(r7104, r7095, r7103, MPFR_RNDN);
        mpfr_add(r7105, r7094, r7104, MPFR_RNDN);
        mpfr_sub(r7106, r7105, r7096, MPFR_RNDN);
        return mpfr_get_d(r7106, MPFR_RNDN);
}

static mpfr_t r7107, r7108, r7109, r7110, r7111, r7112, r7113, r7114, r7115, r7116, r7117, r7118, r7119, r7120, r7121, r7122, r7123, r7124, r7125;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r7107);
        mpfr_init(r7108);
        mpfr_init(r7109);
        mpfr_init(r7110);
        mpfr_init(r7111);
        mpfr_init_set_str(r7112, "2", 10, MPFR_RNDN);
        mpfr_init(r7113);
        mpfr_init_set_str(r7114, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r7115, "1", 10, MPFR_RNDN);
        mpfr_init(r7116);
        mpfr_init(r7117);
        mpfr_init_set_str(r7118, "3", 10, MPFR_RNDN);
        mpfr_init(r7119);
        mpfr_init(r7120);
        mpfr_init(r7121);
        mpfr_init(r7122);
        mpfr_init(r7123);
        mpfr_init(r7124);
        mpfr_init(r7125);
}

double f_dm(double a, double b) {
        mpfr_set_d(r7107, a, MPFR_RNDN);
        mpfr_mul(r7108, r7107, r7107, MPFR_RNDN);
        mpfr_set_d(r7109, b, MPFR_RNDN);
        mpfr_mul(r7110, r7109, r7109, MPFR_RNDN);
        mpfr_add(r7111, r7108, r7110, MPFR_RNDN);
        ;
        mpfr_pow(r7113, r7111, r7112, MPFR_RNDN);
        ;
        ;
        mpfr_add(r7116, r7115, r7107, MPFR_RNDN);
        mpfr_mul(r7117, r7108, r7116, MPFR_RNDN);
        ;
        mpfr_mul(r7119, r7118, r7107, MPFR_RNDN);
        mpfr_sub(r7120, r7115, r7119, MPFR_RNDN);
        mpfr_mul(r7121, r7110, r7120, MPFR_RNDN);
        mpfr_add(r7122, r7117, r7121, MPFR_RNDN);
        mpfr_mul(r7123, r7114, r7122, MPFR_RNDN);
        mpfr_add(r7124, r7113, r7123, MPFR_RNDN);
        mpfr_sub(r7125, r7124, r7115, MPFR_RNDN);
        return mpfr_get_d(r7125, MPFR_RNDN);
}

