#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 r5817 = a;
        float r5818 = r5817 * r5817;
        float r5819 = b;
        float r5820 = r5819 * r5819;
        float r5821 = r5818 + r5820;
        float r5822 = 2;
        float r5823 = pow(r5821, r5822);
        float r5824 = 4;
        float r5825 = 1;
        float r5826 = r5825 + r5817;
        float r5827 = r5818 * r5826;
        float r5828 = 3;
        float r5829 = r5828 * r5817;
        float r5830 = r5825 - r5829;
        float r5831 = r5820 * r5830;
        float r5832 = r5827 + r5831;
        float r5833 = r5824 * r5832;
        float r5834 = r5823 + r5833;
        float r5835 = r5834 - r5825;
        return r5835;
}

double f_id(double a, double b) {
        double r5836 = a;
        double r5837 = r5836 * r5836;
        double r5838 = b;
        double r5839 = r5838 * r5838;
        double r5840 = r5837 + r5839;
        double r5841 = 2;
        double r5842 = pow(r5840, r5841);
        double r5843 = 4;
        double r5844 = 1;
        double r5845 = r5844 + r5836;
        double r5846 = r5837 * r5845;
        double r5847 = 3;
        double r5848 = r5847 * r5836;
        double r5849 = r5844 - r5848;
        double r5850 = r5839 * r5849;
        double r5851 = r5846 + r5850;
        double r5852 = r5843 * r5851;
        double r5853 = r5842 + r5852;
        double r5854 = r5853 - r5844;
        return r5854;
}


double f_of(float a, float b) {
        float r5855 = a;
        float r5856 = r5855 * r5855;
        float r5857 = b;
        float r5858 = r5857 * r5857;
        float r5859 = r5856 + r5858;
        float r5860 = 2;
        float r5861 = pow(r5859, r5860);
        float r5862 = 4;
        float r5863 = 1;
        float r5864 = r5863 + r5855;
        float r5865 = r5856 * r5864;
        float r5866 = 3;
        float r5867 = r5866 * r5855;
        float r5868 = r5863 - r5867;
        float r5869 = r5858 * r5868;
        float r5870 = r5865 + r5869;
        float r5871 = r5862 * r5870;
        float r5872 = r5861 + r5871;
        float r5873 = sqrt(r5872);
        float r5874 = r5862 * r5857;
        float r5875 = r5874 * r5857;
        float r5876 = r5855 * r5866;
        float r5877 = r5863 - r5876;
        float r5878 = r5875 * r5877;
        float r5879 = r5858 + r5856;
        float r5880 = r5879 * r5879;
        float r5881 = r5878 + r5880;
        float r5882 = r5862 * r5855;
        float r5883 = r5855 + r5856;
        float r5884 = r5882 * r5883;
        float r5885 = r5881 + r5884;
        float r5886 = cbrt(r5885);
        float r5887 = fabs(r5886);
        float r5888 = cbrt(r5872);
        float r5889 = r5888 * r5888;
        float r5890 = cbrt(r5889);
        float r5891 = cbrt(r5888);
        float r5892 = r5890 * r5891;
        float r5893 = sqrt(r5892);
        float r5894 = r5887 * r5893;
        float r5895 = r5873 * r5894;
        float r5896 = r5895 - r5863;
        return r5896;
}

double f_od(double a, double b) {
        double r5897 = a;
        double r5898 = r5897 * r5897;
        double r5899 = b;
        double r5900 = r5899 * r5899;
        double r5901 = r5898 + r5900;
        double r5902 = 2;
        double r5903 = pow(r5901, r5902);
        double r5904 = 4;
        double r5905 = 1;
        double r5906 = r5905 + r5897;
        double r5907 = r5898 * r5906;
        double r5908 = 3;
        double r5909 = r5908 * r5897;
        double r5910 = r5905 - r5909;
        double r5911 = r5900 * r5910;
        double r5912 = r5907 + r5911;
        double r5913 = r5904 * r5912;
        double r5914 = r5903 + r5913;
        double r5915 = sqrt(r5914);
        double r5916 = r5904 * r5899;
        double r5917 = r5916 * r5899;
        double r5918 = r5897 * r5908;
        double r5919 = r5905 - r5918;
        double r5920 = r5917 * r5919;
        double r5921 = r5900 + r5898;
        double r5922 = r5921 * r5921;
        double r5923 = r5920 + r5922;
        double r5924 = r5904 * r5897;
        double r5925 = r5897 + r5898;
        double r5926 = r5924 * r5925;
        double r5927 = r5923 + r5926;
        double r5928 = cbrt(r5927);
        double r5929 = fabs(r5928);
        double r5930 = cbrt(r5914);
        double r5931 = r5930 * r5930;
        double r5932 = cbrt(r5931);
        double r5933 = cbrt(r5930);
        double r5934 = r5932 * r5933;
        double r5935 = sqrt(r5934);
        double r5936 = r5929 * r5935;
        double r5937 = r5915 * r5936;
        double r5938 = r5937 - r5905;
        return r5938;
}

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 r5939, r5940, r5941, r5942, r5943, r5944, r5945, r5946, r5947, r5948, r5949, r5950, r5951, r5952, r5953, r5954, r5955, r5956, r5957;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r5939);
        mpfr_init(r5940);
        mpfr_init(r5941);
        mpfr_init(r5942);
        mpfr_init(r5943);
        mpfr_init_set_str(r5944, "2", 10, MPFR_RNDN);
        mpfr_init(r5945);
        mpfr_init_set_str(r5946, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r5947, "1", 10, MPFR_RNDN);
        mpfr_init(r5948);
        mpfr_init(r5949);
        mpfr_init_set_str(r5950, "3", 10, MPFR_RNDN);
        mpfr_init(r5951);
        mpfr_init(r5952);
        mpfr_init(r5953);
        mpfr_init(r5954);
        mpfr_init(r5955);
        mpfr_init(r5956);
        mpfr_init(r5957);
}

double f_im(double a, double b) {
        mpfr_set_d(r5939, a, MPFR_RNDN);
        mpfr_mul(r5940, r5939, r5939, MPFR_RNDN);
        mpfr_set_d(r5941, b, MPFR_RNDN);
        mpfr_mul(r5942, r5941, r5941, MPFR_RNDN);
        mpfr_add(r5943, r5940, r5942, MPFR_RNDN);
        ;
        mpfr_pow(r5945, r5943, r5944, MPFR_RNDN);
        ;
        ;
        mpfr_add(r5948, r5947, r5939, MPFR_RNDN);
        mpfr_mul(r5949, r5940, r5948, MPFR_RNDN);
        ;
        mpfr_mul(r5951, r5950, r5939, MPFR_RNDN);
        mpfr_sub(r5952, r5947, r5951, MPFR_RNDN);
        mpfr_mul(r5953, r5942, r5952, MPFR_RNDN);
        mpfr_add(r5954, r5949, r5953, MPFR_RNDN);
        mpfr_mul(r5955, r5946, r5954, MPFR_RNDN);
        mpfr_add(r5956, r5945, r5955, MPFR_RNDN);
        mpfr_sub(r5957, r5956, r5947, MPFR_RNDN);
        return mpfr_get_d(r5957, MPFR_RNDN);
}

static mpfr_t r5958, r5959, r5960, r5961, r5962, r5963, r5964, r5965, r5966, r5967, r5968, r5969, r5970, r5971, r5972, r5973, r5974, r5975, r5976, r5977, r5978, r5979, r5980, r5981, r5982, r5983, r5984, r5985, r5986, r5987, r5988, r5989, r5990, r5991, r5992, r5993, r5994, r5995, r5996, r5997, r5998, r5999;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r5958);
        mpfr_init(r5959);
        mpfr_init(r5960);
        mpfr_init(r5961);
        mpfr_init(r5962);
        mpfr_init_set_str(r5963, "2", 10, MPFR_RNDN);
        mpfr_init(r5964);
        mpfr_init_set_str(r5965, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r5966, "1", 10, MPFR_RNDN);
        mpfr_init(r5967);
        mpfr_init(r5968);
        mpfr_init_set_str(r5969, "3", 10, MPFR_RNDN);
        mpfr_init(r5970);
        mpfr_init(r5971);
        mpfr_init(r5972);
        mpfr_init(r5973);
        mpfr_init(r5974);
        mpfr_init(r5975);
        mpfr_init(r5976);
        mpfr_init(r5977);
        mpfr_init(r5978);
        mpfr_init(r5979);
        mpfr_init(r5980);
        mpfr_init(r5981);
        mpfr_init(r5982);
        mpfr_init(r5983);
        mpfr_init(r5984);
        mpfr_init(r5985);
        mpfr_init(r5986);
        mpfr_init(r5987);
        mpfr_init(r5988);
        mpfr_init(r5989);
        mpfr_init(r5990);
        mpfr_init(r5991);
        mpfr_init(r5992);
        mpfr_init(r5993);
        mpfr_init(r5994);
        mpfr_init(r5995);
        mpfr_init(r5996);
        mpfr_init(r5997);
        mpfr_init(r5998);
        mpfr_init(r5999);
}

double f_fm(double a, double b) {
        mpfr_set_d(r5958, a, MPFR_RNDN);
        mpfr_mul(r5959, r5958, r5958, MPFR_RNDN);
        mpfr_set_d(r5960, b, MPFR_RNDN);
        mpfr_mul(r5961, r5960, r5960, MPFR_RNDN);
        mpfr_add(r5962, r5959, r5961, MPFR_RNDN);
        ;
        mpfr_pow(r5964, r5962, r5963, MPFR_RNDN);
        ;
        ;
        mpfr_add(r5967, r5966, r5958, MPFR_RNDN);
        mpfr_mul(r5968, r5959, r5967, MPFR_RNDN);
        ;
        mpfr_mul(r5970, r5969, r5958, MPFR_RNDN);
        mpfr_sub(r5971, r5966, r5970, MPFR_RNDN);
        mpfr_mul(r5972, r5961, r5971, MPFR_RNDN);
        mpfr_add(r5973, r5968, r5972, MPFR_RNDN);
        mpfr_mul(r5974, r5965, r5973, MPFR_RNDN);
        mpfr_add(r5975, r5964, r5974, MPFR_RNDN);
        mpfr_sqrt(r5976, r5975, MPFR_RNDN);
        mpfr_mul(r5977, r5965, r5960, MPFR_RNDN);
        mpfr_mul(r5978, r5977, r5960, MPFR_RNDN);
        mpfr_mul(r5979, r5958, r5969, MPFR_RNDN);
        mpfr_sub(r5980, r5966, r5979, MPFR_RNDN);
        mpfr_mul(r5981, r5978, r5980, MPFR_RNDN);
        mpfr_add(r5982, r5961, r5959, MPFR_RNDN);
        mpfr_mul(r5983, r5982, r5982, MPFR_RNDN);
        mpfr_add(r5984, r5981, r5983, MPFR_RNDN);
        mpfr_mul(r5985, r5965, r5958, MPFR_RNDN);
        mpfr_add(r5986, r5958, r5959, MPFR_RNDN);
        mpfr_mul(r5987, r5985, r5986, MPFR_RNDN);
        mpfr_add(r5988, r5984, r5987, MPFR_RNDN);
        mpfr_cbrt(r5989, r5988, MPFR_RNDN);
        mpfr_abs(r5990, r5989, MPFR_RNDN);
        mpfr_cbrt(r5991, r5975, MPFR_RNDN);
        mpfr_mul(r5992, r5991, r5991, MPFR_RNDN);
        mpfr_cbrt(r5993, r5992, MPFR_RNDN);
        mpfr_cbrt(r5994, r5991, MPFR_RNDN);
        mpfr_mul(r5995, r5993, r5994, MPFR_RNDN);
        mpfr_sqrt(r5996, r5995, MPFR_RNDN);
        mpfr_mul(r5997, r5990, r5996, MPFR_RNDN);
        mpfr_mul(r5998, r5976, r5997, MPFR_RNDN);
        mpfr_sub(r5999, r5998, r5966, MPFR_RNDN);
        return mpfr_get_d(r5999, MPFR_RNDN);
}

static mpfr_t r6000, r6001, r6002, r6003, r6004, r6005, r6006, r6007, r6008, r6009, r6010, r6011, r6012, r6013, r6014, r6015, r6016, r6017, r6018, r6019, r6020, r6021, r6022, r6023, r6024, r6025, r6026, r6027, r6028, r6029, r6030, r6031, r6032, r6033, r6034, r6035, r6036, r6037, r6038, r6039, r6040, r6041;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r6000);
        mpfr_init(r6001);
        mpfr_init(r6002);
        mpfr_init(r6003);
        mpfr_init(r6004);
        mpfr_init_set_str(r6005, "2", 10, MPFR_RNDN);
        mpfr_init(r6006);
        mpfr_init_set_str(r6007, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r6008, "1", 10, MPFR_RNDN);
        mpfr_init(r6009);
        mpfr_init(r6010);
        mpfr_init_set_str(r6011, "3", 10, MPFR_RNDN);
        mpfr_init(r6012);
        mpfr_init(r6013);
        mpfr_init(r6014);
        mpfr_init(r6015);
        mpfr_init(r6016);
        mpfr_init(r6017);
        mpfr_init(r6018);
        mpfr_init(r6019);
        mpfr_init(r6020);
        mpfr_init(r6021);
        mpfr_init(r6022);
        mpfr_init(r6023);
        mpfr_init(r6024);
        mpfr_init(r6025);
        mpfr_init(r6026);
        mpfr_init(r6027);
        mpfr_init(r6028);
        mpfr_init(r6029);
        mpfr_init(r6030);
        mpfr_init(r6031);
        mpfr_init(r6032);
        mpfr_init(r6033);
        mpfr_init(r6034);
        mpfr_init(r6035);
        mpfr_init(r6036);
        mpfr_init(r6037);
        mpfr_init(r6038);
        mpfr_init(r6039);
        mpfr_init(r6040);
        mpfr_init(r6041);
}

double f_dm(double a, double b) {
        mpfr_set_d(r6000, a, MPFR_RNDN);
        mpfr_mul(r6001, r6000, r6000, MPFR_RNDN);
        mpfr_set_d(r6002, b, MPFR_RNDN);
        mpfr_mul(r6003, r6002, r6002, MPFR_RNDN);
        mpfr_add(r6004, r6001, r6003, MPFR_RNDN);
        ;
        mpfr_pow(r6006, r6004, r6005, MPFR_RNDN);
        ;
        ;
        mpfr_add(r6009, r6008, r6000, MPFR_RNDN);
        mpfr_mul(r6010, r6001, r6009, MPFR_RNDN);
        ;
        mpfr_mul(r6012, r6011, r6000, MPFR_RNDN);
        mpfr_sub(r6013, r6008, r6012, MPFR_RNDN);
        mpfr_mul(r6014, r6003, r6013, MPFR_RNDN);
        mpfr_add(r6015, r6010, r6014, MPFR_RNDN);
        mpfr_mul(r6016, r6007, r6015, MPFR_RNDN);
        mpfr_add(r6017, r6006, r6016, MPFR_RNDN);
        mpfr_sqrt(r6018, r6017, MPFR_RNDN);
        mpfr_mul(r6019, r6007, r6002, MPFR_RNDN);
        mpfr_mul(r6020, r6019, r6002, MPFR_RNDN);
        mpfr_mul(r6021, r6000, r6011, MPFR_RNDN);
        mpfr_sub(r6022, r6008, r6021, MPFR_RNDN);
        mpfr_mul(r6023, r6020, r6022, MPFR_RNDN);
        mpfr_add(r6024, r6003, r6001, MPFR_RNDN);
        mpfr_mul(r6025, r6024, r6024, MPFR_RNDN);
        mpfr_add(r6026, r6023, r6025, MPFR_RNDN);
        mpfr_mul(r6027, r6007, r6000, MPFR_RNDN);
        mpfr_add(r6028, r6000, r6001, MPFR_RNDN);
        mpfr_mul(r6029, r6027, r6028, MPFR_RNDN);
        mpfr_add(r6030, r6026, r6029, MPFR_RNDN);
        mpfr_cbrt(r6031, r6030, MPFR_RNDN);
        mpfr_abs(r6032, r6031, MPFR_RNDN);
        mpfr_cbrt(r6033, r6017, MPFR_RNDN);
        mpfr_mul(r6034, r6033, r6033, MPFR_RNDN);
        mpfr_cbrt(r6035, r6034, MPFR_RNDN);
        mpfr_cbrt(r6036, r6033, MPFR_RNDN);
        mpfr_mul(r6037, r6035, r6036, MPFR_RNDN);
        mpfr_sqrt(r6038, r6037, MPFR_RNDN);
        mpfr_mul(r6039, r6032, r6038, MPFR_RNDN);
        mpfr_mul(r6040, r6018, r6039, MPFR_RNDN);
        mpfr_sub(r6041, r6040, r6008, MPFR_RNDN);
        return mpfr_get_d(r6041, MPFR_RNDN);
}

