#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 r10962 = a;
        float r10963 = r10962 * r10962;
        float r10964 = b;
        float r10965 = r10964 * r10964;
        float r10966 = r10963 + r10965;
        float r10967 = 2.0f;
        float r10968 = pow(r10966, r10967);
        float r10969 = 4.0f;
        float r10970 = 1.0f;
        float r10971 = r10970 + r10962;
        float r10972 = r10963 * r10971;
        float r10973 = 3.0f;
        float r10974 = r10973 * r10962;
        float r10975 = r10970 - r10974;
        float r10976 = r10965 * r10975;
        float r10977 = r10972 + r10976;
        float r10978 = r10969 * r10977;
        float r10979 = r10968 + r10978;
        float r10980 = r10979 - r10970;
        return r10980;
}

double f_id(double a, double b) {
        double r10981 = a;
        double r10982 = r10981 * r10981;
        double r10983 = b;
        double r10984 = r10983 * r10983;
        double r10985 = r10982 + r10984;
        double r10986 = 2.0;
        double r10987 = pow(r10985, r10986);
        double r10988 = 4.0;
        double r10989 = 1.0;
        double r10990 = r10989 + r10981;
        double r10991 = r10982 * r10990;
        double r10992 = 3.0;
        double r10993 = r10992 * r10981;
        double r10994 = r10989 - r10993;
        double r10995 = r10984 * r10994;
        double r10996 = r10991 + r10995;
        double r10997 = r10988 * r10996;
        double r10998 = r10987 + r10997;
        double r10999 = r10998 - r10989;
        return r10999;
}


double f_of(float a, float b) {
        float r11000 = a;
        float r11001 = r11000 * r11000;
        float r11002 = b;
        float r11003 = r11002 * r11002;
        float r11004 = r11001 + r11003;
        float r11005 = 2.0f;
        float r11006 = pow(r11004, r11005);
        float r11007 = 1.0f;
        float r11008 = r11000 + r11007;
        float r11009 = r11001 * r11008;
        float r11010 = 3.0f;
        float r11011 = r11010 * r11000;
        float r11012 = r11007 - r11011;
        float r11013 = r11003 * r11012;
        float r11014 = r11009 + r11013;
        float r11015 = 4.0f;
        float r11016 = r11014 * r11015;
        float r11017 = r11006 + r11016;
        float r11018 = sqrt(r11017);
        float r11019 = sqrt(r11018);
        float r11020 = r11019 * r11019;
        float r11021 = r11020 * r11018;
        float r11022 = r11021 - r11007;
        return r11022;
}

double f_od(double a, double b) {
        double r11023 = a;
        double r11024 = r11023 * r11023;
        double r11025 = b;
        double r11026 = r11025 * r11025;
        double r11027 = r11024 + r11026;
        double r11028 = 2.0;
        double r11029 = pow(r11027, r11028);
        double r11030 = 1.0;
        double r11031 = r11023 + r11030;
        double r11032 = r11024 * r11031;
        double r11033 = 3.0;
        double r11034 = r11033 * r11023;
        double r11035 = r11030 - r11034;
        double r11036 = r11026 * r11035;
        double r11037 = r11032 + r11036;
        double r11038 = 4.0;
        double r11039 = r11037 * r11038;
        double r11040 = r11029 + r11039;
        double r11041 = sqrt(r11040);
        double r11042 = sqrt(r11041);
        double r11043 = r11042 * r11042;
        double r11044 = r11043 * r11041;
        double r11045 = r11044 - r11030;
        return r11045;
}

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 r11046, r11047, r11048, r11049, r11050, r11051, r11052, r11053, r11054, r11055, r11056, r11057, r11058, r11059, r11060, r11061, r11062, r11063, r11064;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r11046);
        mpfr_init(r11047);
        mpfr_init(r11048);
        mpfr_init(r11049);
        mpfr_init(r11050);
        mpfr_init_set_str(r11051, "2", 10, MPFR_RNDN);
        mpfr_init(r11052);
        mpfr_init_set_str(r11053, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11054, "1", 10, MPFR_RNDN);
        mpfr_init(r11055);
        mpfr_init(r11056);
        mpfr_init_set_str(r11057, "3", 10, MPFR_RNDN);
        mpfr_init(r11058);
        mpfr_init(r11059);
        mpfr_init(r11060);
        mpfr_init(r11061);
        mpfr_init(r11062);
        mpfr_init(r11063);
        mpfr_init(r11064);
}

double f_im(double a, double b) {
        mpfr_set_d(r11046, a, MPFR_RNDN);
        mpfr_mul(r11047, r11046, r11046, MPFR_RNDN);
        mpfr_set_d(r11048, b, MPFR_RNDN);
        mpfr_mul(r11049, r11048, r11048, MPFR_RNDN);
        mpfr_add(r11050, r11047, r11049, MPFR_RNDN);
        ;
        mpfr_pow(r11052, r11050, r11051, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11055, r11054, r11046, MPFR_RNDN);
        mpfr_mul(r11056, r11047, r11055, MPFR_RNDN);
        ;
        mpfr_mul(r11058, r11057, r11046, MPFR_RNDN);
        mpfr_sub(r11059, r11054, r11058, MPFR_RNDN);
        mpfr_mul(r11060, r11049, r11059, MPFR_RNDN);
        mpfr_add(r11061, r11056, r11060, MPFR_RNDN);
        mpfr_mul(r11062, r11053, r11061, MPFR_RNDN);
        mpfr_add(r11063, r11052, r11062, MPFR_RNDN);
        mpfr_sub(r11064, r11063, r11054, MPFR_RNDN);
        return mpfr_get_d(r11064, MPFR_RNDN);
}

static mpfr_t r11065, r11066, r11067, r11068, r11069, r11070, r11071, r11072, r11073, r11074, r11075, r11076, r11077, r11078, r11079, r11080, r11081, r11082, r11083, r11084, r11085, r11086, r11087;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11065);
        mpfr_init(r11066);
        mpfr_init(r11067);
        mpfr_init(r11068);
        mpfr_init(r11069);
        mpfr_init_set_str(r11070, "2", 10, MPFR_RNDN);
        mpfr_init(r11071);
        mpfr_init_set_str(r11072, "1", 10, MPFR_RNDN);
        mpfr_init(r11073);
        mpfr_init(r11074);
        mpfr_init_set_str(r11075, "3", 10, MPFR_RNDN);
        mpfr_init(r11076);
        mpfr_init(r11077);
        mpfr_init(r11078);
        mpfr_init(r11079);
        mpfr_init_set_str(r11080, "4", 10, MPFR_RNDN);
        mpfr_init(r11081);
        mpfr_init(r11082);
        mpfr_init(r11083);
        mpfr_init(r11084);
        mpfr_init(r11085);
        mpfr_init(r11086);
        mpfr_init(r11087);
}

double f_fm(double a, double b) {
        mpfr_set_d(r11065, a, MPFR_RNDN);
        mpfr_mul(r11066, r11065, r11065, MPFR_RNDN);
        mpfr_set_d(r11067, b, MPFR_RNDN);
        mpfr_mul(r11068, r11067, r11067, MPFR_RNDN);
        mpfr_add(r11069, r11066, r11068, MPFR_RNDN);
        ;
        mpfr_pow(r11071, r11069, r11070, MPFR_RNDN);
        ;
        mpfr_add(r11073, r11065, r11072, MPFR_RNDN);
        mpfr_mul(r11074, r11066, r11073, MPFR_RNDN);
        ;
        mpfr_mul(r11076, r11075, r11065, MPFR_RNDN);
        mpfr_sub(r11077, r11072, r11076, MPFR_RNDN);
        mpfr_mul(r11078, r11068, r11077, MPFR_RNDN);
        mpfr_add(r11079, r11074, r11078, MPFR_RNDN);
        ;
        mpfr_mul(r11081, r11079, r11080, MPFR_RNDN);
        mpfr_add(r11082, r11071, r11081, MPFR_RNDN);
        mpfr_sqrt(r11083, r11082, MPFR_RNDN);
        mpfr_sqrt(r11084, r11083, MPFR_RNDN);
        mpfr_mul(r11085, r11084, r11084, MPFR_RNDN);
        mpfr_mul(r11086, r11085, r11083, MPFR_RNDN);
        mpfr_sub(r11087, r11086, r11072, MPFR_RNDN);
        return mpfr_get_d(r11087, MPFR_RNDN);
}

static mpfr_t r11088, r11089, r11090, r11091, r11092, r11093, r11094, r11095, r11096, r11097, r11098, r11099, r11100, r11101, r11102, r11103, r11104, r11105, r11106, r11107, r11108, r11109, r11110;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11088);
        mpfr_init(r11089);
        mpfr_init(r11090);
        mpfr_init(r11091);
        mpfr_init(r11092);
        mpfr_init_set_str(r11093, "2", 10, MPFR_RNDN);
        mpfr_init(r11094);
        mpfr_init_set_str(r11095, "1", 10, MPFR_RNDN);
        mpfr_init(r11096);
        mpfr_init(r11097);
        mpfr_init_set_str(r11098, "3", 10, MPFR_RNDN);
        mpfr_init(r11099);
        mpfr_init(r11100);
        mpfr_init(r11101);
        mpfr_init(r11102);
        mpfr_init_set_str(r11103, "4", 10, MPFR_RNDN);
        mpfr_init(r11104);
        mpfr_init(r11105);
        mpfr_init(r11106);
        mpfr_init(r11107);
        mpfr_init(r11108);
        mpfr_init(r11109);
        mpfr_init(r11110);
}

double f_dm(double a, double b) {
        mpfr_set_d(r11088, a, MPFR_RNDN);
        mpfr_mul(r11089, r11088, r11088, MPFR_RNDN);
        mpfr_set_d(r11090, b, MPFR_RNDN);
        mpfr_mul(r11091, r11090, r11090, MPFR_RNDN);
        mpfr_add(r11092, r11089, r11091, MPFR_RNDN);
        ;
        mpfr_pow(r11094, r11092, r11093, MPFR_RNDN);
        ;
        mpfr_add(r11096, r11088, r11095, MPFR_RNDN);
        mpfr_mul(r11097, r11089, r11096, MPFR_RNDN);
        ;
        mpfr_mul(r11099, r11098, r11088, MPFR_RNDN);
        mpfr_sub(r11100, r11095, r11099, MPFR_RNDN);
        mpfr_mul(r11101, r11091, r11100, MPFR_RNDN);
        mpfr_add(r11102, r11097, r11101, MPFR_RNDN);
        ;
        mpfr_mul(r11104, r11102, r11103, MPFR_RNDN);
        mpfr_add(r11105, r11094, r11104, MPFR_RNDN);
        mpfr_sqrt(r11106, r11105, MPFR_RNDN);
        mpfr_sqrt(r11107, r11106, MPFR_RNDN);
        mpfr_mul(r11108, r11107, r11107, MPFR_RNDN);
        mpfr_mul(r11109, r11108, r11106, MPFR_RNDN);
        mpfr_sub(r11110, r11109, r11095, MPFR_RNDN);
        return mpfr_get_d(r11110, MPFR_RNDN);
}

