#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 r10872 = a;
        float r10873 = r10872 * r10872;
        float r10874 = b;
        float r10875 = r10874 * r10874;
        float r10876 = r10873 + r10875;
        float r10877 = 2;
        float r10878 = pow(r10876, r10877);
        float r10879 = 4;
        float r10880 = 1;
        float r10881 = r10880 + r10872;
        float r10882 = r10873 * r10881;
        float r10883 = 3;
        float r10884 = r10883 * r10872;
        float r10885 = r10880 - r10884;
        float r10886 = r10875 * r10885;
        float r10887 = r10882 + r10886;
        float r10888 = r10879 * r10887;
        float r10889 = r10878 + r10888;
        float r10890 = r10889 - r10880;
        return r10890;
}

double f_id(double a, double b) {
        double r10891 = a;
        double r10892 = r10891 * r10891;
        double r10893 = b;
        double r10894 = r10893 * r10893;
        double r10895 = r10892 + r10894;
        double r10896 = 2;
        double r10897 = pow(r10895, r10896);
        double r10898 = 4;
        double r10899 = 1;
        double r10900 = r10899 + r10891;
        double r10901 = r10892 * r10900;
        double r10902 = 3;
        double r10903 = r10902 * r10891;
        double r10904 = r10899 - r10903;
        double r10905 = r10894 * r10904;
        double r10906 = r10901 + r10905;
        double r10907 = r10898 * r10906;
        double r10908 = r10897 + r10907;
        double r10909 = r10908 - r10899;
        return r10909;
}


double f_of(float a, float b) {
        float r10910 = a;
        float r10911 = r10910 * r10910;
        float r10912 = b;
        float r10913 = r10912 * r10912;
        float r10914 = r10911 + r10913;
        float r10915 = 2;
        float r10916 = pow(r10914, r10915);
        float r10917 = 4;
        float r10918 = 1;
        float r10919 = r10918 + r10910;
        float r10920 = r10911 * r10919;
        float r10921 = 3;
        float r10922 = r10921 * r10910;
        float r10923 = r10918 - r10922;
        float r10924 = r10913 * r10923;
        float r10925 = r10920 + r10924;
        float r10926 = r10917 * r10925;
        float r10927 = r10916 + r10926;
        float r10928 = sqrt(r10927);
        float r10929 = r10913 * r10917;
        float r10930 = r10929 * r10923;
        float r10931 = r10917 * r10910;
        float r10932 = r10910 + r10911;
        float r10933 = r10931 * r10932;
        float r10934 = r10930 + r10933;
        float r10935 = r10913 + r10911;
        float r10936 = r10935 * r10935;
        float r10937 = r10934 + r10936;
        float r10938 = cbrt(r10937);
        float r10939 = fabs(r10938);
        float r10940 = cbrt(r10927);
        float r10941 = sqrt(r10940);
        float r10942 = r10939 * r10941;
        float r10943 = r10928 * r10942;
        float r10944 = r10943 - r10918;
        return r10944;
}

double f_od(double a, double b) {
        double r10945 = a;
        double r10946 = r10945 * r10945;
        double r10947 = b;
        double r10948 = r10947 * r10947;
        double r10949 = r10946 + r10948;
        double r10950 = 2;
        double r10951 = pow(r10949, r10950);
        double r10952 = 4;
        double r10953 = 1;
        double r10954 = r10953 + r10945;
        double r10955 = r10946 * r10954;
        double r10956 = 3;
        double r10957 = r10956 * r10945;
        double r10958 = r10953 - r10957;
        double r10959 = r10948 * r10958;
        double r10960 = r10955 + r10959;
        double r10961 = r10952 * r10960;
        double r10962 = r10951 + r10961;
        double r10963 = sqrt(r10962);
        double r10964 = r10948 * r10952;
        double r10965 = r10964 * r10958;
        double r10966 = r10952 * r10945;
        double r10967 = r10945 + r10946;
        double r10968 = r10966 * r10967;
        double r10969 = r10965 + r10968;
        double r10970 = r10948 + r10946;
        double r10971 = r10970 * r10970;
        double r10972 = r10969 + r10971;
        double r10973 = cbrt(r10972);
        double r10974 = fabs(r10973);
        double r10975 = cbrt(r10962);
        double r10976 = sqrt(r10975);
        double r10977 = r10974 * r10976;
        double r10978 = r10963 * r10977;
        double r10979 = r10978 - r10953;
        return r10979;
}

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 r10980, r10981, r10982, r10983, r10984, r10985, r10986, r10987, r10988, r10989, r10990, r10991, r10992, r10993, r10994, r10995, r10996, r10997, r10998;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r10980);
        mpfr_init(r10981);
        mpfr_init(r10982);
        mpfr_init(r10983);
        mpfr_init(r10984);
        mpfr_init_set_str(r10985, "2", 10, MPFR_RNDN);
        mpfr_init(r10986);
        mpfr_init_set_str(r10987, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r10988, "1", 10, MPFR_RNDN);
        mpfr_init(r10989);
        mpfr_init(r10990);
        mpfr_init_set_str(r10991, "3", 10, MPFR_RNDN);
        mpfr_init(r10992);
        mpfr_init(r10993);
        mpfr_init(r10994);
        mpfr_init(r10995);
        mpfr_init(r10996);
        mpfr_init(r10997);
        mpfr_init(r10998);
}

double f_im(double a, double b) {
        mpfr_set_d(r10980, a, MPFR_RNDN);
        mpfr_mul(r10981, r10980, r10980, MPFR_RNDN);
        mpfr_set_d(r10982, b, MPFR_RNDN);
        mpfr_mul(r10983, r10982, r10982, MPFR_RNDN);
        mpfr_add(r10984, r10981, r10983, MPFR_RNDN);
        ;
        mpfr_pow(r10986, r10984, r10985, MPFR_RNDN);
        ;
        ;
        mpfr_add(r10989, r10988, r10980, MPFR_RNDN);
        mpfr_mul(r10990, r10981, r10989, MPFR_RNDN);
        ;
        mpfr_mul(r10992, r10991, r10980, MPFR_RNDN);
        mpfr_sub(r10993, r10988, r10992, MPFR_RNDN);
        mpfr_mul(r10994, r10983, r10993, MPFR_RNDN);
        mpfr_add(r10995, r10990, r10994, MPFR_RNDN);
        mpfr_mul(r10996, r10987, r10995, MPFR_RNDN);
        mpfr_add(r10997, r10986, r10996, MPFR_RNDN);
        mpfr_sub(r10998, r10997, r10988, MPFR_RNDN);
        return mpfr_get_d(r10998, MPFR_RNDN);
}

static mpfr_t r10999, r11000, r11001, r11002, r11003, r11004, r11005, r11006, r11007, r11008, r11009, r11010, r11011, r11012, r11013, r11014, r11015, r11016, r11017, r11018, r11019, r11020, r11021, r11022, r11023, r11024, r11025, r11026, r11027, r11028, r11029, r11030, r11031, r11032, r11033;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r10999);
        mpfr_init(r11000);
        mpfr_init(r11001);
        mpfr_init(r11002);
        mpfr_init(r11003);
        mpfr_init_set_str(r11004, "2", 10, MPFR_RNDN);
        mpfr_init(r11005);
        mpfr_init_set_str(r11006, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11007, "1", 10, MPFR_RNDN);
        mpfr_init(r11008);
        mpfr_init(r11009);
        mpfr_init_set_str(r11010, "3", 10, MPFR_RNDN);
        mpfr_init(r11011);
        mpfr_init(r11012);
        mpfr_init(r11013);
        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);
        mpfr_init(r11024);
        mpfr_init(r11025);
        mpfr_init(r11026);
        mpfr_init(r11027);
        mpfr_init(r11028);
        mpfr_init(r11029);
        mpfr_init(r11030);
        mpfr_init(r11031);
        mpfr_init(r11032);
        mpfr_init(r11033);
}

double f_fm(double a, double b) {
        mpfr_set_d(r10999, a, MPFR_RNDN);
        mpfr_mul(r11000, r10999, r10999, MPFR_RNDN);
        mpfr_set_d(r11001, b, MPFR_RNDN);
        mpfr_mul(r11002, r11001, r11001, MPFR_RNDN);
        mpfr_add(r11003, r11000, r11002, MPFR_RNDN);
        ;
        mpfr_pow(r11005, r11003, r11004, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11008, r11007, r10999, MPFR_RNDN);
        mpfr_mul(r11009, r11000, r11008, MPFR_RNDN);
        ;
        mpfr_mul(r11011, r11010, r10999, MPFR_RNDN);
        mpfr_sub(r11012, r11007, r11011, MPFR_RNDN);
        mpfr_mul(r11013, r11002, r11012, MPFR_RNDN);
        mpfr_add(r11014, r11009, r11013, MPFR_RNDN);
        mpfr_mul(r11015, r11006, r11014, MPFR_RNDN);
        mpfr_add(r11016, r11005, r11015, MPFR_RNDN);
        mpfr_sqrt(r11017, r11016, MPFR_RNDN);
        mpfr_mul(r11018, r11002, r11006, MPFR_RNDN);
        mpfr_mul(r11019, r11018, r11012, MPFR_RNDN);
        mpfr_mul(r11020, r11006, r10999, MPFR_RNDN);
        mpfr_add(r11021, r10999, r11000, MPFR_RNDN);
        mpfr_mul(r11022, r11020, r11021, MPFR_RNDN);
        mpfr_add(r11023, r11019, r11022, MPFR_RNDN);
        mpfr_add(r11024, r11002, r11000, MPFR_RNDN);
        mpfr_mul(r11025, r11024, r11024, MPFR_RNDN);
        mpfr_add(r11026, r11023, r11025, MPFR_RNDN);
        mpfr_cbrt(r11027, r11026, MPFR_RNDN);
        mpfr_abs(r11028, r11027, MPFR_RNDN);
        mpfr_cbrt(r11029, r11016, MPFR_RNDN);
        mpfr_sqrt(r11030, r11029, MPFR_RNDN);
        mpfr_mul(r11031, r11028, r11030, MPFR_RNDN);
        mpfr_mul(r11032, r11017, r11031, MPFR_RNDN);
        mpfr_sub(r11033, r11032, r11007, MPFR_RNDN);
        return mpfr_get_d(r11033, MPFR_RNDN);
}

static mpfr_t r11034, r11035, r11036, r11037, r11038, r11039, r11040, r11041, r11042, r11043, r11044, r11045, r11046, r11047, r11048, r11049, r11050, r11051, r11052, r11053, r11054, r11055, r11056, r11057, r11058, r11059, r11060, r11061, r11062, r11063, r11064, r11065, r11066, r11067, r11068;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11034);
        mpfr_init(r11035);
        mpfr_init(r11036);
        mpfr_init(r11037);
        mpfr_init(r11038);
        mpfr_init_set_str(r11039, "2", 10, MPFR_RNDN);
        mpfr_init(r11040);
        mpfr_init_set_str(r11041, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r11042, "1", 10, MPFR_RNDN);
        mpfr_init(r11043);
        mpfr_init(r11044);
        mpfr_init_set_str(r11045, "3", 10, MPFR_RNDN);
        mpfr_init(r11046);
        mpfr_init(r11047);
        mpfr_init(r11048);
        mpfr_init(r11049);
        mpfr_init(r11050);
        mpfr_init(r11051);
        mpfr_init(r11052);
        mpfr_init(r11053);
        mpfr_init(r11054);
        mpfr_init(r11055);
        mpfr_init(r11056);
        mpfr_init(r11057);
        mpfr_init(r11058);
        mpfr_init(r11059);
        mpfr_init(r11060);
        mpfr_init(r11061);
        mpfr_init(r11062);
        mpfr_init(r11063);
        mpfr_init(r11064);
        mpfr_init(r11065);
        mpfr_init(r11066);
        mpfr_init(r11067);
        mpfr_init(r11068);
}

double f_dm(double a, double b) {
        mpfr_set_d(r11034, a, MPFR_RNDN);
        mpfr_mul(r11035, r11034, r11034, MPFR_RNDN);
        mpfr_set_d(r11036, b, MPFR_RNDN);
        mpfr_mul(r11037, r11036, r11036, MPFR_RNDN);
        mpfr_add(r11038, r11035, r11037, MPFR_RNDN);
        ;
        mpfr_pow(r11040, r11038, r11039, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11043, r11042, r11034, MPFR_RNDN);
        mpfr_mul(r11044, r11035, r11043, MPFR_RNDN);
        ;
        mpfr_mul(r11046, r11045, r11034, MPFR_RNDN);
        mpfr_sub(r11047, r11042, r11046, MPFR_RNDN);
        mpfr_mul(r11048, r11037, r11047, MPFR_RNDN);
        mpfr_add(r11049, r11044, r11048, MPFR_RNDN);
        mpfr_mul(r11050, r11041, r11049, MPFR_RNDN);
        mpfr_add(r11051, r11040, r11050, MPFR_RNDN);
        mpfr_sqrt(r11052, r11051, MPFR_RNDN);
        mpfr_mul(r11053, r11037, r11041, MPFR_RNDN);
        mpfr_mul(r11054, r11053, r11047, MPFR_RNDN);
        mpfr_mul(r11055, r11041, r11034, MPFR_RNDN);
        mpfr_add(r11056, r11034, r11035, MPFR_RNDN);
        mpfr_mul(r11057, r11055, r11056, MPFR_RNDN);
        mpfr_add(r11058, r11054, r11057, MPFR_RNDN);
        mpfr_add(r11059, r11037, r11035, MPFR_RNDN);
        mpfr_mul(r11060, r11059, r11059, MPFR_RNDN);
        mpfr_add(r11061, r11058, r11060, MPFR_RNDN);
        mpfr_cbrt(r11062, r11061, MPFR_RNDN);
        mpfr_abs(r11063, r11062, MPFR_RNDN);
        mpfr_cbrt(r11064, r11051, MPFR_RNDN);
        mpfr_sqrt(r11065, r11064, MPFR_RNDN);
        mpfr_mul(r11066, r11063, r11065, MPFR_RNDN);
        mpfr_mul(r11067, r11052, r11066, MPFR_RNDN);
        mpfr_sub(r11068, r11067, r11042, MPFR_RNDN);
        return mpfr_get_d(r11068, MPFR_RNDN);
}

