#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 r10913 = a;
        float r10914 = r10913 * r10913;
        float r10915 = b;
        float r10916 = r10915 * r10915;
        float r10917 = r10914 + r10916;
        float r10918 = 2;
        float r10919 = pow(r10917, r10918);
        float r10920 = 4;
        float r10921 = 1;
        float r10922 = r10921 + r10913;
        float r10923 = r10914 * r10922;
        float r10924 = 3;
        float r10925 = r10924 * r10913;
        float r10926 = r10921 - r10925;
        float r10927 = r10916 * r10926;
        float r10928 = r10923 + r10927;
        float r10929 = r10920 * r10928;
        float r10930 = r10919 + r10929;
        float r10931 = r10930 - r10921;
        return r10931;
}

double f_id(double a, double b) {
        double r10932 = a;
        double r10933 = r10932 * r10932;
        double r10934 = b;
        double r10935 = r10934 * r10934;
        double r10936 = r10933 + r10935;
        double r10937 = 2;
        double r10938 = pow(r10936, r10937);
        double r10939 = 4;
        double r10940 = 1;
        double r10941 = r10940 + r10932;
        double r10942 = r10933 * r10941;
        double r10943 = 3;
        double r10944 = r10943 * r10932;
        double r10945 = r10940 - r10944;
        double r10946 = r10935 * r10945;
        double r10947 = r10942 + r10946;
        double r10948 = r10939 * r10947;
        double r10949 = r10938 + r10948;
        double r10950 = r10949 - r10940;
        return r10950;
}


double f_of(float a, float b) {
        float r10951 = a;
        float r10952 = 4;
        float r10953 = fma(r10951, r10952, r10952);
        float r10954 = r10953 * r10951;
        float r10955 = b;
        float r10956 = hypot(r10951, r10955);
        float r10957 = 1;
        float r10958 = 3;
        float r10959 = r10957 + r10958;
        float r10960 = pow(r10956, r10959);
        float r10961 = fma(r10954, r10951, r10960);
        float r10962 = r10955 * r10955;
        float r10963 = r10958 * r10951;
        float r10964 = r10957 - r10963;
        float r10965 = r10962 * r10964;
        float r10966 = r10952 * r10965;
        float r10967 = r10961 + r10966;
        float r10968 = r10967 - r10957;
        return r10968;
}

double f_od(double a, double b) {
        double r10969 = a;
        double r10970 = 4;
        double r10971 = fma(r10969, r10970, r10970);
        double r10972 = r10971 * r10969;
        double r10973 = b;
        double r10974 = hypot(r10969, r10973);
        double r10975 = 1;
        double r10976 = 3;
        double r10977 = r10975 + r10976;
        double r10978 = pow(r10974, r10977);
        double r10979 = fma(r10972, r10969, r10978);
        double r10980 = r10973 * r10973;
        double r10981 = r10976 * r10969;
        double r10982 = r10975 - r10981;
        double r10983 = r10980 * r10982;
        double r10984 = r10970 * r10983;
        double r10985 = r10979 + r10984;
        double r10986 = r10985 - r10975;
        return r10986;
}

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 r10987, r10988, r10989, r10990, r10991, r10992, r10993, r10994, r10995, r10996, r10997, r10998, r10999, r11000, r11001, r11002, r11003, r11004, r11005;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r10987);
        mpfr_init(r10988);
        mpfr_init(r10989);
        mpfr_init(r10990);
        mpfr_init(r10991);
        mpfr_init_set_str(r10992, "2", 10, MPFR_RNDN);
        mpfr_init(r10993);
        mpfr_init_set_str(r10994, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r10995, "1", 10, MPFR_RNDN);
        mpfr_init(r10996);
        mpfr_init(r10997);
        mpfr_init_set_str(r10998, "3", 10, MPFR_RNDN);
        mpfr_init(r10999);
        mpfr_init(r11000);
        mpfr_init(r11001);
        mpfr_init(r11002);
        mpfr_init(r11003);
        mpfr_init(r11004);
        mpfr_init(r11005);
}

double f_im(double a, double b) {
        mpfr_set_d(r10987, a, MPFR_RNDN);
        mpfr_mul(r10988, r10987, r10987, MPFR_RNDN);
        mpfr_set_d(r10989, b, MPFR_RNDN);
        mpfr_mul(r10990, r10989, r10989, MPFR_RNDN);
        mpfr_add(r10991, r10988, r10990, MPFR_RNDN);
        ;
        mpfr_pow(r10993, r10991, r10992, MPFR_RNDN);
        ;
        ;
        mpfr_add(r10996, r10995, r10987, MPFR_RNDN);
        mpfr_mul(r10997, r10988, r10996, MPFR_RNDN);
        ;
        mpfr_mul(r10999, r10998, r10987, MPFR_RNDN);
        mpfr_sub(r11000, r10995, r10999, MPFR_RNDN);
        mpfr_mul(r11001, r10990, r11000, MPFR_RNDN);
        mpfr_add(r11002, r10997, r11001, MPFR_RNDN);
        mpfr_mul(r11003, r10994, r11002, MPFR_RNDN);
        mpfr_add(r11004, r10993, r11003, MPFR_RNDN);
        mpfr_sub(r11005, r11004, r10995, MPFR_RNDN);
        return mpfr_get_d(r11005, MPFR_RNDN);
}

static mpfr_t r11006, r11007, r11008, r11009, r11010, r11011, r11012, r11013, r11014, r11015, r11016, r11017, r11018, r11019, r11020, r11021, r11022, r11023;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11006);
        mpfr_init_set_str(r11007, "4", 10, MPFR_RNDN);
        mpfr_init(r11008);
        mpfr_init(r11009);
        mpfr_init(r11010);
        mpfr_init(r11011);
        mpfr_init_set_str(r11012, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r11013, "3", 10, MPFR_RNDN);
        mpfr_init(r11014);
        mpfr_init(r11015);
        mpfr_init(r11016);
        mpfr_init(r11017);
        mpfr_init(r11018);
        mpfr_init(r11019);
        mpfr_init(r11020);
        mpfr_init(r11021);
        mpfr_init(r11022);
        mpfr_init(r11023);
}

double f_fm(double a, double b) {
        mpfr_set_d(r11006, a, MPFR_RNDN);
        ;
        mpfr_fma(r11008, r11006, r11007, r11007, MPFR_RNDN);
        mpfr_mul(r11009, r11008, r11006, MPFR_RNDN);
        mpfr_set_d(r11010, b, MPFR_RNDN);
        mpfr_hypot(r11011, r11006, r11010, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11014, r11012, r11013, MPFR_RNDN);
        mpfr_pow(r11015, r11011, r11014, MPFR_RNDN);
        mpfr_fma(r11016, r11009, r11006, r11015, MPFR_RNDN);
        mpfr_mul(r11017, r11010, r11010, MPFR_RNDN);
        mpfr_mul(r11018, r11013, r11006, MPFR_RNDN);
        mpfr_sub(r11019, r11012, r11018, MPFR_RNDN);
        mpfr_mul(r11020, r11017, r11019, MPFR_RNDN);
        mpfr_mul(r11021, r11007, r11020, MPFR_RNDN);
        mpfr_add(r11022, r11016, r11021, MPFR_RNDN);
        mpfr_sub(r11023, r11022, r11012, MPFR_RNDN);
        return mpfr_get_d(r11023, MPFR_RNDN);
}

static mpfr_t r11024, r11025, r11026, r11027, r11028, r11029, r11030, r11031, r11032, r11033, r11034, r11035, r11036, r11037, r11038, r11039, r11040, r11041;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11024);
        mpfr_init_set_str(r11025, "4", 10, MPFR_RNDN);
        mpfr_init(r11026);
        mpfr_init(r11027);
        mpfr_init(r11028);
        mpfr_init(r11029);
        mpfr_init_set_str(r11030, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r11031, "3", 10, MPFR_RNDN);
        mpfr_init(r11032);
        mpfr_init(r11033);
        mpfr_init(r11034);
        mpfr_init(r11035);
        mpfr_init(r11036);
        mpfr_init(r11037);
        mpfr_init(r11038);
        mpfr_init(r11039);
        mpfr_init(r11040);
        mpfr_init(r11041);
}

double f_dm(double a, double b) {
        mpfr_set_d(r11024, a, MPFR_RNDN);
        ;
        mpfr_fma(r11026, r11024, r11025, r11025, MPFR_RNDN);
        mpfr_mul(r11027, r11026, r11024, MPFR_RNDN);
        mpfr_set_d(r11028, b, MPFR_RNDN);
        mpfr_hypot(r11029, r11024, r11028, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11032, r11030, r11031, MPFR_RNDN);
        mpfr_pow(r11033, r11029, r11032, MPFR_RNDN);
        mpfr_fma(r11034, r11027, r11024, r11033, MPFR_RNDN);
        mpfr_mul(r11035, r11028, r11028, MPFR_RNDN);
        mpfr_mul(r11036, r11031, r11024, MPFR_RNDN);
        mpfr_sub(r11037, r11030, r11036, MPFR_RNDN);
        mpfr_mul(r11038, r11035, r11037, MPFR_RNDN);
        mpfr_mul(r11039, r11025, r11038, MPFR_RNDN);
        mpfr_add(r11040, r11034, r11039, MPFR_RNDN);
        mpfr_sub(r11041, r11040, r11030, MPFR_RNDN);
        return mpfr_get_d(r11041, MPFR_RNDN);
}

