#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "Jmat.Real.lambertw, newton loop step";

double f_if(float wj, float x) {
        float r19867 = wj;
        float r19868 = exp(r19867);
        float r19869 = r19867 * r19868;
        float r19870 = x;
        float r19871 = r19869 - r19870;
        float r19872 = r19868 + r19869;
        float r19873 = r19871 / r19872;
        float r19874 = r19867 - r19873;
        return r19874;
}

double f_id(double wj, double x) {
        double r19875 = wj;
        double r19876 = exp(r19875);
        double r19877 = r19875 * r19876;
        double r19878 = x;
        double r19879 = r19877 - r19878;
        double r19880 = r19876 + r19877;
        double r19881 = r19879 / r19880;
        double r19882 = r19875 - r19881;
        return r19882;
}


double f_of(float wj, float x) {
        float r19883 = wj;
        float r19884 = exp(r19883);
        float r19885 = r19883 * r19884;
        float r19886 = x;
        float r19887 = r19885 - r19886;
        float r19888 = r19884 + r19885;
        float r19889 = r19887 / r19888;
        float r19890 = r19883 - r19889;
        float r19891 = -2.4472481520804102e+30f;
        bool r19892 = r19890 <= r19891;
        float r19893 = r19883 / r19884;
        float r19894 = r19883 - r19893;
        float r19895 = 1.0f;
        float r19896 = r19895 + r19883;
        float r19897 = r19896 * r19884;
        float r19898 = r19886 / r19897;
        float r19899 = r19894 + r19898;
        float r19900 = 1.0792540822943409e-17f;
        bool r19901 = r19890 <= r19900;
        float r19902 = r19883 * r19883;
        float r19903 = r19902 + r19886;
        float r19904 = 2.0f;
        float r19905 = r19883 * r19886;
        float r19906 = r19904 * r19905;
        float r19907 = r19903 - r19906;
        float r19908 = r19883 / r19896;
        float r19909 = r19883 - r19908;
        float r19910 = r19886 / r19888;
        float r19911 = r19909 + r19910;
        float r19912 = r19901 ? r19907 : r19911;
        float r19913 = r19892 ? r19899 : r19912;
        return r19913;
}

double f_od(double wj, double x) {
        double r19914 = wj;
        double r19915 = exp(r19914);
        double r19916 = r19914 * r19915;
        double r19917 = x;
        double r19918 = r19916 - r19917;
        double r19919 = r19915 + r19916;
        double r19920 = r19918 / r19919;
        double r19921 = r19914 - r19920;
        double r19922 = -2.4472481520804102e+30;
        bool r19923 = r19921 <= r19922;
        double r19924 = r19914 / r19915;
        double r19925 = r19914 - r19924;
        double r19926 = 1.0;
        double r19927 = r19926 + r19914;
        double r19928 = r19927 * r19915;
        double r19929 = r19917 / r19928;
        double r19930 = r19925 + r19929;
        double r19931 = 1.0792540822943409e-17;
        bool r19932 = r19921 <= r19931;
        double r19933 = r19914 * r19914;
        double r19934 = r19933 + r19917;
        double r19935 = 2.0;
        double r19936 = r19914 * r19917;
        double r19937 = r19935 * r19936;
        double r19938 = r19934 - r19937;
        double r19939 = r19914 / r19927;
        double r19940 = r19914 - r19939;
        double r19941 = r19917 / r19919;
        double r19942 = r19940 + r19941;
        double r19943 = r19932 ? r19938 : r19942;
        double r19944 = r19923 ? r19930 : r19943;
        return r19944;
}

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 r19945, r19946, r19947, r19948, r19949, r19950, r19951, r19952;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r19945);
        mpfr_init(r19946);
        mpfr_init(r19947);
        mpfr_init(r19948);
        mpfr_init(r19949);
        mpfr_init(r19950);
        mpfr_init(r19951);
        mpfr_init(r19952);
}

double f_im(double wj, double x) {
        mpfr_set_d(r19945, wj, MPFR_RNDN);
        mpfr_exp(r19946, r19945, MPFR_RNDN);
        mpfr_mul(r19947, r19945, r19946, MPFR_RNDN);
        mpfr_set_d(r19948, x, MPFR_RNDN);
        mpfr_sub(r19949, r19947, r19948, MPFR_RNDN);
        mpfr_add(r19950, r19946, r19947, MPFR_RNDN);
        mpfr_div(r19951, r19949, r19950, MPFR_RNDN);
        mpfr_sub(r19952, r19945, r19951, MPFR_RNDN);
        return mpfr_get_d(r19952, MPFR_RNDN);
}

static mpfr_t r19953, r19954, r19955, r19956, r19957, r19958, r19959, r19960, r19961, r19962, r19963, r19964, r19965, r19966, r19967, r19968, r19969, r19970, r19971, r19972, r19973, r19974, r19975, r19976, r19977, r19978, r19979, r19980, r19981, r19982, r19983;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r19953);
        mpfr_init(r19954);
        mpfr_init(r19955);
        mpfr_init(r19956);
        mpfr_init(r19957);
        mpfr_init(r19958);
        mpfr_init(r19959);
        mpfr_init(r19960);
        mpfr_init_set_str(r19961, "-2.4472481520804102e+30", 10, MPFR_RNDN);
        mpfr_init(r19962);
        mpfr_init(r19963);
        mpfr_init(r19964);
        mpfr_init_set_str(r19965, "1", 10, MPFR_RNDN);
        mpfr_init(r19966);
        mpfr_init(r19967);
        mpfr_init(r19968);
        mpfr_init(r19969);
        mpfr_init_set_str(r19970, "1.0792540822943409e-17", 10, MPFR_RNDN);
        mpfr_init(r19971);
        mpfr_init(r19972);
        mpfr_init(r19973);
        mpfr_init_set_str(r19974, "2", 10, MPFR_RNDN);
        mpfr_init(r19975);
        mpfr_init(r19976);
        mpfr_init(r19977);
        mpfr_init(r19978);
        mpfr_init(r19979);
        mpfr_init(r19980);
        mpfr_init(r19981);
        mpfr_init(r19982);
        mpfr_init(r19983);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r19953, wj, MPFR_RNDN);
        mpfr_exp(r19954, r19953, MPFR_RNDN);
        mpfr_mul(r19955, r19953, r19954, MPFR_RNDN);
        mpfr_set_d(r19956, x, MPFR_RNDN);
        mpfr_sub(r19957, r19955, r19956, MPFR_RNDN);
        mpfr_add(r19958, r19954, r19955, MPFR_RNDN);
        mpfr_div(r19959, r19957, r19958, MPFR_RNDN);
        mpfr_sub(r19960, r19953, r19959, MPFR_RNDN);
        ;
        mpfr_set_si(r19962, mpfr_cmp(r19960, r19961) <= 0, MPFR_RNDN);
        mpfr_div(r19963, r19953, r19954, MPFR_RNDN);
        mpfr_sub(r19964, r19953, r19963, MPFR_RNDN);
        ;
        mpfr_add(r19966, r19965, r19953, MPFR_RNDN);
        mpfr_mul(r19967, r19966, r19954, MPFR_RNDN);
        mpfr_div(r19968, r19956, r19967, MPFR_RNDN);
        mpfr_add(r19969, r19964, r19968, MPFR_RNDN);
        ;
        mpfr_set_si(r19971, mpfr_cmp(r19960, r19970) <= 0, MPFR_RNDN);
        mpfr_sqr(r19972, r19953, MPFR_RNDN);
        mpfr_add(r19973, r19972, r19956, MPFR_RNDN);
        ;
        mpfr_mul(r19975, r19953, r19956, MPFR_RNDN);
        mpfr_mul(r19976, r19974, r19975, MPFR_RNDN);
        mpfr_sub(r19977, r19973, r19976, MPFR_RNDN);
        mpfr_div(r19978, r19953, r19966, MPFR_RNDN);
        mpfr_sub(r19979, r19953, r19978, MPFR_RNDN);
        mpfr_div(r19980, r19956, r19958, MPFR_RNDN);
        mpfr_add(r19981, r19979, r19980, MPFR_RNDN);
        if (mpfr_get_si(r19971, MPFR_RNDN)) { mpfr_set(r19982, r19977, MPFR_RNDN); } else { mpfr_set(r19982, r19981, MPFR_RNDN); };
        if (mpfr_get_si(r19962, MPFR_RNDN)) { mpfr_set(r19983, r19969, MPFR_RNDN); } else { mpfr_set(r19983, r19982, MPFR_RNDN); };
        return mpfr_get_d(r19983, MPFR_RNDN);
}

static mpfr_t r19984, r19985, r19986, r19987, r19988, r19989, r19990, r19991, r19992, r19993, r19994, r19995, r19996, r19997, r19998, r19999, r20000, r20001, r20002, r20003, r20004, r20005, r20006, r20007, r20008, r20009, r20010, r20011, r20012, r20013, r20014;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r19984);
        mpfr_init(r19985);
        mpfr_init(r19986);
        mpfr_init(r19987);
        mpfr_init(r19988);
        mpfr_init(r19989);
        mpfr_init(r19990);
        mpfr_init(r19991);
        mpfr_init_set_str(r19992, "-2.4472481520804102e+30", 10, MPFR_RNDN);
        mpfr_init(r19993);
        mpfr_init(r19994);
        mpfr_init(r19995);
        mpfr_init_set_str(r19996, "1", 10, MPFR_RNDN);
        mpfr_init(r19997);
        mpfr_init(r19998);
        mpfr_init(r19999);
        mpfr_init(r20000);
        mpfr_init_set_str(r20001, "1.0792540822943409e-17", 10, MPFR_RNDN);
        mpfr_init(r20002);
        mpfr_init(r20003);
        mpfr_init(r20004);
        mpfr_init_set_str(r20005, "2", 10, MPFR_RNDN);
        mpfr_init(r20006);
        mpfr_init(r20007);
        mpfr_init(r20008);
        mpfr_init(r20009);
        mpfr_init(r20010);
        mpfr_init(r20011);
        mpfr_init(r20012);
        mpfr_init(r20013);
        mpfr_init(r20014);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r19984, wj, MPFR_RNDN);
        mpfr_exp(r19985, r19984, MPFR_RNDN);
        mpfr_mul(r19986, r19984, r19985, MPFR_RNDN);
        mpfr_set_d(r19987, x, MPFR_RNDN);
        mpfr_sub(r19988, r19986, r19987, MPFR_RNDN);
        mpfr_add(r19989, r19985, r19986, MPFR_RNDN);
        mpfr_div(r19990, r19988, r19989, MPFR_RNDN);
        mpfr_sub(r19991, r19984, r19990, MPFR_RNDN);
        ;
        mpfr_set_si(r19993, mpfr_cmp(r19991, r19992) <= 0, MPFR_RNDN);
        mpfr_div(r19994, r19984, r19985, MPFR_RNDN);
        mpfr_sub(r19995, r19984, r19994, MPFR_RNDN);
        ;
        mpfr_add(r19997, r19996, r19984, MPFR_RNDN);
        mpfr_mul(r19998, r19997, r19985, MPFR_RNDN);
        mpfr_div(r19999, r19987, r19998, MPFR_RNDN);
        mpfr_add(r20000, r19995, r19999, MPFR_RNDN);
        ;
        mpfr_set_si(r20002, mpfr_cmp(r19991, r20001) <= 0, MPFR_RNDN);
        mpfr_sqr(r20003, r19984, MPFR_RNDN);
        mpfr_add(r20004, r20003, r19987, MPFR_RNDN);
        ;
        mpfr_mul(r20006, r19984, r19987, MPFR_RNDN);
        mpfr_mul(r20007, r20005, r20006, MPFR_RNDN);
        mpfr_sub(r20008, r20004, r20007, MPFR_RNDN);
        mpfr_div(r20009, r19984, r19997, MPFR_RNDN);
        mpfr_sub(r20010, r19984, r20009, MPFR_RNDN);
        mpfr_div(r20011, r19987, r19989, MPFR_RNDN);
        mpfr_add(r20012, r20010, r20011, MPFR_RNDN);
        if (mpfr_get_si(r20002, MPFR_RNDN)) { mpfr_set(r20013, r20008, MPFR_RNDN); } else { mpfr_set(r20013, r20012, MPFR_RNDN); };
        if (mpfr_get_si(r19993, MPFR_RNDN)) { mpfr_set(r20014, r20000, MPFR_RNDN); } else { mpfr_set(r20014, r20013, MPFR_RNDN); };
        return mpfr_get_d(r20014, MPFR_RNDN);
}

