#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 r10986 = a;
        float r10987 = r10986 * r10986;
        float r10988 = b;
        float r10989 = r10988 * r10988;
        float r10990 = r10987 + r10989;
        float r10991 = 2;
        float r10992 = pow(r10990, r10991);
        float r10993 = 4;
        float r10994 = 1;
        float r10995 = r10994 + r10986;
        float r10996 = r10987 * r10995;
        float r10997 = 3;
        float r10998 = r10997 * r10986;
        float r10999 = r10994 - r10998;
        float r11000 = r10989 * r10999;
        float r11001 = r10996 + r11000;
        float r11002 = r10993 * r11001;
        float r11003 = r10992 + r11002;
        float r11004 = r11003 - r10994;
        return r11004;
}

double f_id(double a, double b) {
        double r11005 = a;
        double r11006 = r11005 * r11005;
        double r11007 = b;
        double r11008 = r11007 * r11007;
        double r11009 = r11006 + r11008;
        double r11010 = 2;
        double r11011 = pow(r11009, r11010);
        double r11012 = 4;
        double r11013 = 1;
        double r11014 = r11013 + r11005;
        double r11015 = r11006 * r11014;
        double r11016 = 3;
        double r11017 = r11016 * r11005;
        double r11018 = r11013 - r11017;
        double r11019 = r11008 * r11018;
        double r11020 = r11015 + r11019;
        double r11021 = r11012 * r11020;
        double r11022 = r11011 + r11021;
        double r11023 = r11022 - r11013;
        return r11023;
}


double f_of(float a, float b) {
        float r11024 = a;
        float r11025 = r11024 * r11024;
        float r11026 = b;
        float r11027 = r11026 * r11026;
        float r11028 = r11025 + r11027;
        float r11029 = 2;
        float r11030 = pow(r11028, r11029);
        float r11031 = 4;
        float r11032 = 1;
        float r11033 = r11032 + r11024;
        float r11034 = r11025 * r11033;
        float r11035 = 3;
        float r11036 = r11035 * r11024;
        float r11037 = r11032 - r11036;
        float r11038 = r11027 * r11037;
        float r11039 = r11034 + r11038;
        float r11040 = r11031 * r11039;
        float r11041 = r11030 + r11040;
        float r11042 = r11041 - r11032;
        return r11042;
}

double f_od(double a, double b) {
        double r11043 = a;
        double r11044 = r11043 * r11043;
        double r11045 = b;
        double r11046 = r11045 * r11045;
        double r11047 = r11044 + r11046;
        double r11048 = 2;
        double r11049 = pow(r11047, r11048);
        double r11050 = 4;
        double r11051 = 1;
        double r11052 = r11051 + r11043;
        double r11053 = r11044 * r11052;
        double r11054 = 3;
        double r11055 = r11054 * r11043;
        double r11056 = r11051 - r11055;
        double r11057 = r11046 * r11056;
        double r11058 = r11053 + r11057;
        double r11059 = r11050 * r11058;
        double r11060 = r11049 + r11059;
        double r11061 = r11060 - r11051;
        return r11061;
}

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 r11062, r11063, r11064, r11065, r11066, r11067, r11068, r11069, r11070, r11071, r11072, r11073, r11074, r11075, r11076, r11077, r11078, r11079, r11080;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r11062);
        mpfr_init(r11063);
        mpfr_init(r11064);
        mpfr_init(r11065);
        mpfr_init(r11066);
        mpfr_init_set_str(r11067, "2", 10, MPFR_RNDN);
        mpfr_init(r11068);
        mpfr_init_set_str(r11069, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11070, "1", 10, MPFR_RNDN);
        mpfr_init(r11071);
        mpfr_init(r11072);
        mpfr_init_set_str(r11073, "3", 10, MPFR_RNDN);
        mpfr_init(r11074);
        mpfr_init(r11075);
        mpfr_init(r11076);
        mpfr_init(r11077);
        mpfr_init(r11078);
        mpfr_init(r11079);
        mpfr_init(r11080);
}

double f_im(double a, double b) {
        mpfr_set_d(r11062, a, MPFR_RNDN);
        mpfr_mul(r11063, r11062, r11062, MPFR_RNDN);
        mpfr_set_d(r11064, b, MPFR_RNDN);
        mpfr_mul(r11065, r11064, r11064, MPFR_RNDN);
        mpfr_add(r11066, r11063, r11065, MPFR_RNDN);
        ;
        mpfr_pow(r11068, r11066, r11067, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11071, r11070, r11062, MPFR_RNDN);
        mpfr_mul(r11072, r11063, r11071, MPFR_RNDN);
        ;
        mpfr_mul(r11074, r11073, r11062, MPFR_RNDN);
        mpfr_sub(r11075, r11070, r11074, MPFR_RNDN);
        mpfr_mul(r11076, r11065, r11075, MPFR_RNDN);
        mpfr_add(r11077, r11072, r11076, MPFR_RNDN);
        mpfr_mul(r11078, r11069, r11077, MPFR_RNDN);
        mpfr_add(r11079, r11068, r11078, MPFR_RNDN);
        mpfr_sub(r11080, r11079, r11070, MPFR_RNDN);
        return mpfr_get_d(r11080, MPFR_RNDN);
}

static mpfr_t r11081, r11082, r11083, r11084, r11085, r11086, r11087, r11088, r11089, r11090, r11091, r11092, r11093, r11094, r11095, r11096, r11097, r11098, r11099;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r11081);
        mpfr_init(r11082);
        mpfr_init(r11083);
        mpfr_init(r11084);
        mpfr_init(r11085);
        mpfr_init_set_str(r11086, "2", 10, MPFR_RNDN);
        mpfr_init(r11087);
        mpfr_init_set_str(r11088, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11089, "1", 10, MPFR_RNDN);
        mpfr_init(r11090);
        mpfr_init(r11091);
        mpfr_init_set_str(r11092, "3", 10, MPFR_RNDN);
        mpfr_init(r11093);
        mpfr_init(r11094);
        mpfr_init(r11095);
        mpfr_init(r11096);
        mpfr_init(r11097);
        mpfr_init(r11098);
        mpfr_init(r11099);
}

double f_fm(double a, double b) {
        mpfr_set_d(r11081, a, MPFR_RNDN);
        mpfr_mul(r11082, r11081, r11081, MPFR_RNDN);
        mpfr_set_d(r11083, b, MPFR_RNDN);
        mpfr_mul(r11084, r11083, r11083, MPFR_RNDN);
        mpfr_add(r11085, r11082, r11084, MPFR_RNDN);
        ;
        mpfr_pow(r11087, r11085, r11086, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11090, r11089, r11081, MPFR_RNDN);
        mpfr_mul(r11091, r11082, r11090, MPFR_RNDN);
        ;
        mpfr_mul(r11093, r11092, r11081, MPFR_RNDN);
        mpfr_sub(r11094, r11089, r11093, MPFR_RNDN);
        mpfr_mul(r11095, r11084, r11094, MPFR_RNDN);
        mpfr_add(r11096, r11091, r11095, MPFR_RNDN);
        mpfr_mul(r11097, r11088, r11096, MPFR_RNDN);
        mpfr_add(r11098, r11087, r11097, MPFR_RNDN);
        mpfr_sub(r11099, r11098, r11089, MPFR_RNDN);
        return mpfr_get_d(r11099, MPFR_RNDN);
}

static mpfr_t r11100, r11101, r11102, r11103, r11104, r11105, r11106, r11107, r11108, r11109, r11110, r11111, r11112, r11113, r11114, r11115, r11116, r11117, r11118;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r11100);
        mpfr_init(r11101);
        mpfr_init(r11102);
        mpfr_init(r11103);
        mpfr_init(r11104);
        mpfr_init_set_str(r11105, "2", 10, MPFR_RNDN);
        mpfr_init(r11106);
        mpfr_init_set_str(r11107, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11108, "1", 10, MPFR_RNDN);
        mpfr_init(r11109);
        mpfr_init(r11110);
        mpfr_init_set_str(r11111, "3", 10, MPFR_RNDN);
        mpfr_init(r11112);
        mpfr_init(r11113);
        mpfr_init(r11114);
        mpfr_init(r11115);
        mpfr_init(r11116);
        mpfr_init(r11117);
        mpfr_init(r11118);
}

double f_dm(double a, double b) {
        mpfr_set_d(r11100, a, MPFR_RNDN);
        mpfr_mul(r11101, r11100, r11100, MPFR_RNDN);
        mpfr_set_d(r11102, b, MPFR_RNDN);
        mpfr_mul(r11103, r11102, r11102, MPFR_RNDN);
        mpfr_add(r11104, r11101, r11103, MPFR_RNDN);
        ;
        mpfr_pow(r11106, r11104, r11105, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11109, r11108, r11100, MPFR_RNDN);
        mpfr_mul(r11110, r11101, r11109, MPFR_RNDN);
        ;
        mpfr_mul(r11112, r11111, r11100, MPFR_RNDN);
        mpfr_sub(r11113, r11108, r11112, MPFR_RNDN);
        mpfr_mul(r11114, r11103, r11113, MPFR_RNDN);
        mpfr_add(r11115, r11110, r11114, MPFR_RNDN);
        mpfr_mul(r11116, r11107, r11115, MPFR_RNDN);
        mpfr_add(r11117, r11106, r11116, MPFR_RNDN);
        mpfr_sub(r11118, r11117, r11108, MPFR_RNDN);
        return mpfr_get_d(r11118, MPFR_RNDN);
}

