#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 r27961 = a;
        float r27962 = r27961 * r27961;
        float r27963 = b;
        float r27964 = r27963 * r27963;
        float r27965 = r27962 + r27964;
        float r27966 = 2;
        float r27967 = pow(r27965, r27966);
        float r27968 = 4;
        float r27969 = 1;
        float r27970 = r27969 + r27961;
        float r27971 = r27962 * r27970;
        float r27972 = 3;
        float r27973 = r27972 * r27961;
        float r27974 = r27969 - r27973;
        float r27975 = r27964 * r27974;
        float r27976 = r27971 + r27975;
        float r27977 = r27968 * r27976;
        float r27978 = r27967 + r27977;
        float r27979 = r27978 - r27969;
        return r27979;
}

double f_id(double a, double b) {
        double r27980 = a;
        double r27981 = r27980 * r27980;
        double r27982 = b;
        double r27983 = r27982 * r27982;
        double r27984 = r27981 + r27983;
        double r27985 = 2;
        double r27986 = pow(r27984, r27985);
        double r27987 = 4;
        double r27988 = 1;
        double r27989 = r27988 + r27980;
        double r27990 = r27981 * r27989;
        double r27991 = 3;
        double r27992 = r27991 * r27980;
        double r27993 = r27988 - r27992;
        double r27994 = r27983 * r27993;
        double r27995 = r27990 + r27994;
        double r27996 = r27987 * r27995;
        double r27997 = r27986 + r27996;
        double r27998 = r27997 - r27988;
        return r27998;
}


double f_of(float a, float b) {
        float r27999 = a;
        float r28000 = r27999 * r27999;
        float r28001 = b;
        float r28002 = r28001 * r28001;
        float r28003 = r28000 + r28002;
        float r28004 = 2;
        float r28005 = pow(r28003, r28004);
        float r28006 = 4;
        float r28007 = 1;
        float r28008 = r28007 + r27999;
        float r28009 = r28000 * r28008;
        float r28010 = 3;
        float r28011 = r28010 * r27999;
        float r28012 = r28007 - r28011;
        float r28013 = r28002 * r28012;
        float r28014 = r28009 + r28013;
        float r28015 = r28006 * r28014;
        float r28016 = r28005 + r28015;
        float r28017 = r28016 - r28007;
        return r28017;
}

double f_od(double a, double b) {
        double r28018 = a;
        double r28019 = r28018 * r28018;
        double r28020 = b;
        double r28021 = r28020 * r28020;
        double r28022 = r28019 + r28021;
        double r28023 = 2;
        double r28024 = pow(r28022, r28023);
        double r28025 = 4;
        double r28026 = 1;
        double r28027 = r28026 + r28018;
        double r28028 = r28019 * r28027;
        double r28029 = 3;
        double r28030 = r28029 * r28018;
        double r28031 = r28026 - r28030;
        double r28032 = r28021 * r28031;
        double r28033 = r28028 + r28032;
        double r28034 = r28025 * r28033;
        double r28035 = r28024 + r28034;
        double r28036 = r28035 - r28026;
        return r28036;
}

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 r28037, r28038, r28039, r28040, r28041, r28042, r28043, r28044, r28045, r28046, r28047, r28048, r28049, r28050, r28051, r28052, r28053, r28054, r28055;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r28037);
        mpfr_init(r28038);
        mpfr_init(r28039);
        mpfr_init(r28040);
        mpfr_init(r28041);
        mpfr_init_set_str(r28042, "2", 10, MPFR_RNDN);
        mpfr_init(r28043);
        mpfr_init_set_str(r28044, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28045, "1", 10, MPFR_RNDN);
        mpfr_init(r28046);
        mpfr_init(r28047);
        mpfr_init_set_str(r28048, "3", 10, MPFR_RNDN);
        mpfr_init(r28049);
        mpfr_init(r28050);
        mpfr_init(r28051);
        mpfr_init(r28052);
        mpfr_init(r28053);
        mpfr_init(r28054);
        mpfr_init(r28055);
}

double f_im(double a, double b) {
        mpfr_set_d(r28037, a, MPFR_RNDN);
        mpfr_mul(r28038, r28037, r28037, MPFR_RNDN);
        mpfr_set_d(r28039, b, MPFR_RNDN);
        mpfr_mul(r28040, r28039, r28039, MPFR_RNDN);
        mpfr_add(r28041, r28038, r28040, MPFR_RNDN);
        ;
        mpfr_pow(r28043, r28041, r28042, MPFR_RNDN);
        ;
        ;
        mpfr_add(r28046, r28045, r28037, MPFR_RNDN);
        mpfr_mul(r28047, r28038, r28046, MPFR_RNDN);
        ;
        mpfr_mul(r28049, r28048, r28037, MPFR_RNDN);
        mpfr_sub(r28050, r28045, r28049, MPFR_RNDN);
        mpfr_mul(r28051, r28040, r28050, MPFR_RNDN);
        mpfr_add(r28052, r28047, r28051, MPFR_RNDN);
        mpfr_mul(r28053, r28044, r28052, MPFR_RNDN);
        mpfr_add(r28054, r28043, r28053, MPFR_RNDN);
        mpfr_sub(r28055, r28054, r28045, MPFR_RNDN);
        return mpfr_get_d(r28055, MPFR_RNDN);
}

static mpfr_t r28056, r28057, r28058, r28059, r28060, r28061, r28062, r28063, r28064, r28065, r28066, r28067, r28068, r28069, r28070, r28071, r28072, r28073, r28074;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r28056);
        mpfr_init(r28057);
        mpfr_init(r28058);
        mpfr_init(r28059);
        mpfr_init(r28060);
        mpfr_init_set_str(r28061, "2", 10, MPFR_RNDN);
        mpfr_init(r28062);
        mpfr_init_set_str(r28063, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28064, "1", 10, MPFR_RNDN);
        mpfr_init(r28065);
        mpfr_init(r28066);
        mpfr_init_set_str(r28067, "3", 10, MPFR_RNDN);
        mpfr_init(r28068);
        mpfr_init(r28069);
        mpfr_init(r28070);
        mpfr_init(r28071);
        mpfr_init(r28072);
        mpfr_init(r28073);
        mpfr_init(r28074);
}

double f_fm(double a, double b) {
        mpfr_set_d(r28056, a, MPFR_RNDN);
        mpfr_mul(r28057, r28056, r28056, MPFR_RNDN);
        mpfr_set_d(r28058, b, MPFR_RNDN);
        mpfr_mul(r28059, r28058, r28058, MPFR_RNDN);
        mpfr_add(r28060, r28057, r28059, MPFR_RNDN);
        ;
        mpfr_pow(r28062, r28060, r28061, MPFR_RNDN);
        ;
        ;
        mpfr_add(r28065, r28064, r28056, MPFR_RNDN);
        mpfr_mul(r28066, r28057, r28065, MPFR_RNDN);
        ;
        mpfr_mul(r28068, r28067, r28056, MPFR_RNDN);
        mpfr_sub(r28069, r28064, r28068, MPFR_RNDN);
        mpfr_mul(r28070, r28059, r28069, MPFR_RNDN);
        mpfr_add(r28071, r28066, r28070, MPFR_RNDN);
        mpfr_mul(r28072, r28063, r28071, MPFR_RNDN);
        mpfr_add(r28073, r28062, r28072, MPFR_RNDN);
        mpfr_sub(r28074, r28073, r28064, MPFR_RNDN);
        return mpfr_get_d(r28074, MPFR_RNDN);
}

static mpfr_t r28075, r28076, r28077, r28078, r28079, r28080, r28081, r28082, r28083, r28084, r28085, r28086, r28087, r28088, r28089, r28090, r28091, r28092, r28093;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r28075);
        mpfr_init(r28076);
        mpfr_init(r28077);
        mpfr_init(r28078);
        mpfr_init(r28079);
        mpfr_init_set_str(r28080, "2", 10, MPFR_RNDN);
        mpfr_init(r28081);
        mpfr_init_set_str(r28082, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r28083, "1", 10, MPFR_RNDN);
        mpfr_init(r28084);
        mpfr_init(r28085);
        mpfr_init_set_str(r28086, "3", 10, MPFR_RNDN);
        mpfr_init(r28087);
        mpfr_init(r28088);
        mpfr_init(r28089);
        mpfr_init(r28090);
        mpfr_init(r28091);
        mpfr_init(r28092);
        mpfr_init(r28093);
}

double f_dm(double a, double b) {
        mpfr_set_d(r28075, a, MPFR_RNDN);
        mpfr_mul(r28076, r28075, r28075, MPFR_RNDN);
        mpfr_set_d(r28077, b, MPFR_RNDN);
        mpfr_mul(r28078, r28077, r28077, MPFR_RNDN);
        mpfr_add(r28079, r28076, r28078, MPFR_RNDN);
        ;
        mpfr_pow(r28081, r28079, r28080, MPFR_RNDN);
        ;
        ;
        mpfr_add(r28084, r28083, r28075, MPFR_RNDN);
        mpfr_mul(r28085, r28076, r28084, MPFR_RNDN);
        ;
        mpfr_mul(r28087, r28086, r28075, MPFR_RNDN);
        mpfr_sub(r28088, r28083, r28087, MPFR_RNDN);
        mpfr_mul(r28089, r28078, r28088, MPFR_RNDN);
        mpfr_add(r28090, r28085, r28089, MPFR_RNDN);
        mpfr_mul(r28091, r28082, r28090, MPFR_RNDN);
        mpfr_add(r28092, r28081, r28091, MPFR_RNDN);
        mpfr_sub(r28093, r28092, r28083, MPFR_RNDN);
        return mpfr_get_d(r28093, MPFR_RNDN);
}

