#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 r26998 = a;
        float r26999 = r26998 * r26998;
        float r27000 = b;
        float r27001 = r27000 * r27000;
        float r27002 = r26999 + r27001;
        float r27003 = 2;
        float r27004 = pow(r27002, r27003);
        float r27005 = 4;
        float r27006 = 1;
        float r27007 = r27006 + r26998;
        float r27008 = r26999 * r27007;
        float r27009 = 3;
        float r27010 = r27009 * r26998;
        float r27011 = r27006 - r27010;
        float r27012 = r27001 * r27011;
        float r27013 = r27008 + r27012;
        float r27014 = r27005 * r27013;
        float r27015 = r27004 + r27014;
        float r27016 = r27015 - r27006;
        return r27016;
}

double f_id(double a, double b) {
        double r27017 = a;
        double r27018 = r27017 * r27017;
        double r27019 = b;
        double r27020 = r27019 * r27019;
        double r27021 = r27018 + r27020;
        double r27022 = 2;
        double r27023 = pow(r27021, r27022);
        double r27024 = 4;
        double r27025 = 1;
        double r27026 = r27025 + r27017;
        double r27027 = r27018 * r27026;
        double r27028 = 3;
        double r27029 = r27028 * r27017;
        double r27030 = r27025 - r27029;
        double r27031 = r27020 * r27030;
        double r27032 = r27027 + r27031;
        double r27033 = r27024 * r27032;
        double r27034 = r27023 + r27033;
        double r27035 = r27034 - r27025;
        return r27035;
}


double f_of(float a, float b) {
        float r27036 = b;
        float r27037 = a;
        float r27038 = hypot(r27036, r27037);
        float r27039 = 3;
        float r27040 = 1;
        float r27041 = r27039 + r27040;
        float r27042 = pow(r27038, r27041);
        float r27043 = 4;
        float r27044 = r27037 * r27037;
        float r27045 = r27040 + r27037;
        float r27046 = r27044 * r27045;
        float r27047 = r27036 * r27036;
        float r27048 = r27039 * r27037;
        float r27049 = r27040 - r27048;
        float r27050 = r27047 * r27049;
        float r27051 = r27046 + r27050;
        float r27052 = r27043 * r27051;
        float r27053 = r27042 + r27052;
        float r27054 = r27053 - r27040;
        return r27054;
}

double f_od(double a, double b) {
        double r27055 = b;
        double r27056 = a;
        double r27057 = hypot(r27055, r27056);
        double r27058 = 3;
        double r27059 = 1;
        double r27060 = r27058 + r27059;
        double r27061 = pow(r27057, r27060);
        double r27062 = 4;
        double r27063 = r27056 * r27056;
        double r27064 = r27059 + r27056;
        double r27065 = r27063 * r27064;
        double r27066 = r27055 * r27055;
        double r27067 = r27058 * r27056;
        double r27068 = r27059 - r27067;
        double r27069 = r27066 * r27068;
        double r27070 = r27065 + r27069;
        double r27071 = r27062 * r27070;
        double r27072 = r27061 + r27071;
        double r27073 = r27072 - r27059;
        return r27073;
}

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 r27074, r27075, r27076, r27077, r27078, r27079, r27080, r27081, r27082, r27083, r27084, r27085, r27086, r27087, r27088, r27089, r27090, r27091, r27092;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r27074);
        mpfr_init(r27075);
        mpfr_init(r27076);
        mpfr_init(r27077);
        mpfr_init(r27078);
        mpfr_init_set_str(r27079, "2", 10, MPFR_RNDN);
        mpfr_init(r27080);
        mpfr_init_set_str(r27081, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r27082, "1", 10, MPFR_RNDN);
        mpfr_init(r27083);
        mpfr_init(r27084);
        mpfr_init_set_str(r27085, "3", 10, MPFR_RNDN);
        mpfr_init(r27086);
        mpfr_init(r27087);
        mpfr_init(r27088);
        mpfr_init(r27089);
        mpfr_init(r27090);
        mpfr_init(r27091);
        mpfr_init(r27092);
}

double f_im(double a, double b) {
        mpfr_set_d(r27074, a, MPFR_RNDN);
        mpfr_mul(r27075, r27074, r27074, MPFR_RNDN);
        mpfr_set_d(r27076, b, MPFR_RNDN);
        mpfr_mul(r27077, r27076, r27076, MPFR_RNDN);
        mpfr_add(r27078, r27075, r27077, MPFR_RNDN);
        ;
        mpfr_pow(r27080, r27078, r27079, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27083, r27082, r27074, MPFR_RNDN);
        mpfr_mul(r27084, r27075, r27083, MPFR_RNDN);
        ;
        mpfr_mul(r27086, r27085, r27074, MPFR_RNDN);
        mpfr_sub(r27087, r27082, r27086, MPFR_RNDN);
        mpfr_mul(r27088, r27077, r27087, MPFR_RNDN);
        mpfr_add(r27089, r27084, r27088, MPFR_RNDN);
        mpfr_mul(r27090, r27081, r27089, MPFR_RNDN);
        mpfr_add(r27091, r27080, r27090, MPFR_RNDN);
        mpfr_sub(r27092, r27091, r27082, MPFR_RNDN);
        return mpfr_get_d(r27092, MPFR_RNDN);
}

static mpfr_t r27093, r27094, r27095, r27096, r27097, r27098, r27099, r27100, r27101, r27102, r27103, r27104, r27105, r27106, r27107, r27108, r27109, r27110, r27111;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r27093);
        mpfr_init(r27094);
        mpfr_init(r27095);
        mpfr_init_set_str(r27096, "3", 10, MPFR_RNDN);
        mpfr_init_set_str(r27097, "1", 10, MPFR_RNDN);
        mpfr_init(r27098);
        mpfr_init(r27099);
        mpfr_init_set_str(r27100, "4", 10, MPFR_RNDN);
        mpfr_init(r27101);
        mpfr_init(r27102);
        mpfr_init(r27103);
        mpfr_init(r27104);
        mpfr_init(r27105);
        mpfr_init(r27106);
        mpfr_init(r27107);
        mpfr_init(r27108);
        mpfr_init(r27109);
        mpfr_init(r27110);
        mpfr_init(r27111);
}

double f_fm(double a, double b) {
        mpfr_set_d(r27093, b, MPFR_RNDN);
        mpfr_set_d(r27094, a, MPFR_RNDN);
        mpfr_hypot(r27095, r27093, r27094, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27098, r27096, r27097, MPFR_RNDN);
        mpfr_pow(r27099, r27095, r27098, MPFR_RNDN);
        ;
        mpfr_mul(r27101, r27094, r27094, MPFR_RNDN);
        mpfr_add(r27102, r27097, r27094, MPFR_RNDN);
        mpfr_mul(r27103, r27101, r27102, MPFR_RNDN);
        mpfr_mul(r27104, r27093, r27093, MPFR_RNDN);
        mpfr_mul(r27105, r27096, r27094, MPFR_RNDN);
        mpfr_sub(r27106, r27097, r27105, MPFR_RNDN);
        mpfr_mul(r27107, r27104, r27106, MPFR_RNDN);
        mpfr_add(r27108, r27103, r27107, MPFR_RNDN);
        mpfr_mul(r27109, r27100, r27108, MPFR_RNDN);
        mpfr_add(r27110, r27099, r27109, MPFR_RNDN);
        mpfr_sub(r27111, r27110, r27097, MPFR_RNDN);
        return mpfr_get_d(r27111, MPFR_RNDN);
}

static mpfr_t r27112, r27113, r27114, r27115, r27116, r27117, r27118, r27119, r27120, r27121, r27122, r27123, r27124, r27125, r27126, r27127, r27128, r27129, r27130;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r27112);
        mpfr_init(r27113);
        mpfr_init(r27114);
        mpfr_init_set_str(r27115, "3", 10, MPFR_RNDN);
        mpfr_init_set_str(r27116, "1", 10, MPFR_RNDN);
        mpfr_init(r27117);
        mpfr_init(r27118);
        mpfr_init_set_str(r27119, "4", 10, MPFR_RNDN);
        mpfr_init(r27120);
        mpfr_init(r27121);
        mpfr_init(r27122);
        mpfr_init(r27123);
        mpfr_init(r27124);
        mpfr_init(r27125);
        mpfr_init(r27126);
        mpfr_init(r27127);
        mpfr_init(r27128);
        mpfr_init(r27129);
        mpfr_init(r27130);
}

double f_dm(double a, double b) {
        mpfr_set_d(r27112, b, MPFR_RNDN);
        mpfr_set_d(r27113, a, MPFR_RNDN);
        mpfr_hypot(r27114, r27112, r27113, MPFR_RNDN);
        ;
        ;
        mpfr_add(r27117, r27115, r27116, MPFR_RNDN);
        mpfr_pow(r27118, r27114, r27117, MPFR_RNDN);
        ;
        mpfr_mul(r27120, r27113, r27113, MPFR_RNDN);
        mpfr_add(r27121, r27116, r27113, MPFR_RNDN);
        mpfr_mul(r27122, r27120, r27121, MPFR_RNDN);
        mpfr_mul(r27123, r27112, r27112, MPFR_RNDN);
        mpfr_mul(r27124, r27115, r27113, MPFR_RNDN);
        mpfr_sub(r27125, r27116, r27124, MPFR_RNDN);
        mpfr_mul(r27126, r27123, r27125, MPFR_RNDN);
        mpfr_add(r27127, r27122, r27126, MPFR_RNDN);
        mpfr_mul(r27128, r27119, r27127, MPFR_RNDN);
        mpfr_add(r27129, r27118, r27128, MPFR_RNDN);
        mpfr_sub(r27130, r27129, r27116, MPFR_RNDN);
        return mpfr_get_d(r27130, MPFR_RNDN);
}

