#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 r18911 = wj;
        float r18912 = exp(r18911);
        float r18913 = r18911 * r18912;
        float r18914 = x;
        float r18915 = r18913 - r18914;
        float r18916 = r18912 + r18913;
        float r18917 = r18915 / r18916;
        float r18918 = r18911 - r18917;
        return r18918;
}

double f_id(double wj, double x) {
        double r18919 = wj;
        double r18920 = exp(r18919);
        double r18921 = r18919 * r18920;
        double r18922 = x;
        double r18923 = r18921 - r18922;
        double r18924 = r18920 + r18921;
        double r18925 = r18923 / r18924;
        double r18926 = r18919 - r18925;
        return r18926;
}


double f_of(float wj, float x) {
        float r18927 = wj;
        float r18928 = r18927 * r18927;
        float r18929 = r18927 - r18928;
        float r18930 = x;
        float r18931 = exp(r18927);
        float r18932 = fma(r18927, r18931, r18931);
        float r18933 = r18930 / r18932;
        float r18934 = fma(r18927, r18929, r18933);
        return r18934;
}

double f_od(double wj, double x) {
        double r18935 = wj;
        double r18936 = r18935 * r18935;
        double r18937 = r18935 - r18936;
        double r18938 = x;
        double r18939 = exp(r18935);
        double r18940 = fma(r18935, r18939, r18939);
        double r18941 = r18938 / r18940;
        double r18942 = fma(r18935, r18937, r18941);
        return r18942;
}

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 r18943, r18944, r18945, r18946, r18947, r18948, r18949, r18950;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r18943);
        mpfr_init(r18944);
        mpfr_init(r18945);
        mpfr_init(r18946);
        mpfr_init(r18947);
        mpfr_init(r18948);
        mpfr_init(r18949);
        mpfr_init(r18950);
}

double f_im(double wj, double x) {
        mpfr_set_d(r18943, wj, MPFR_RNDN);
        mpfr_exp(r18944, r18943, MPFR_RNDN);
        mpfr_mul(r18945, r18943, r18944, MPFR_RNDN);
        mpfr_set_d(r18946, x, MPFR_RNDN);
        mpfr_sub(r18947, r18945, r18946, MPFR_RNDN);
        mpfr_add(r18948, r18944, r18945, MPFR_RNDN);
        mpfr_div(r18949, r18947, r18948, MPFR_RNDN);
        mpfr_sub(r18950, r18943, r18949, MPFR_RNDN);
        return mpfr_get_d(r18950, MPFR_RNDN);
}

static mpfr_t r18951, r18952, r18953, r18954, r18955, r18956, r18957, r18958;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r18951);
        mpfr_init(r18952);
        mpfr_init(r18953);
        mpfr_init(r18954);
        mpfr_init(r18955);
        mpfr_init(r18956);
        mpfr_init(r18957);
        mpfr_init(r18958);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r18951, wj, MPFR_RNDN);
        mpfr_sqr(r18952, r18951, MPFR_RNDN);
        mpfr_sub(r18953, r18951, r18952, MPFR_RNDN);
        mpfr_set_d(r18954, x, MPFR_RNDN);
        mpfr_exp(r18955, r18951, MPFR_RNDN);
        mpfr_fma(r18956, r18951, r18955, r18955, MPFR_RNDN);
        mpfr_div(r18957, r18954, r18956, MPFR_RNDN);
        mpfr_fma(r18958, r18951, r18953, r18957, MPFR_RNDN);
        return mpfr_get_d(r18958, MPFR_RNDN);
}

static mpfr_t r18959, r18960, r18961, r18962, r18963, r18964, r18965, r18966;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r18959);
        mpfr_init(r18960);
        mpfr_init(r18961);
        mpfr_init(r18962);
        mpfr_init(r18963);
        mpfr_init(r18964);
        mpfr_init(r18965);
        mpfr_init(r18966);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r18959, wj, MPFR_RNDN);
        mpfr_sqr(r18960, r18959, MPFR_RNDN);
        mpfr_sub(r18961, r18959, r18960, MPFR_RNDN);
        mpfr_set_d(r18962, x, MPFR_RNDN);
        mpfr_exp(r18963, r18959, MPFR_RNDN);
        mpfr_fma(r18964, r18959, r18963, r18963, MPFR_RNDN);
        mpfr_div(r18965, r18962, r18964, MPFR_RNDN);
        mpfr_fma(r18966, r18959, r18961, r18965, MPFR_RNDN);
        return mpfr_get_d(r18966, MPFR_RNDN);
}

