#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 r18903 = wj;
        float r18904 = exp(r18903);
        float r18905 = r18903 * r18904;
        float r18906 = x;
        float r18907 = r18905 - r18906;
        float r18908 = r18904 + r18905;
        float r18909 = r18907 / r18908;
        float r18910 = r18903 - r18909;
        return r18910;
}

double f_id(double wj, double x) {
        double r18911 = wj;
        double r18912 = exp(r18911);
        double r18913 = r18911 * r18912;
        double r18914 = x;
        double r18915 = r18913 - r18914;
        double r18916 = r18912 + r18913;
        double r18917 = r18915 / r18916;
        double r18918 = r18911 - r18917;
        return r18918;
}


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

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

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 r18935, r18936, r18937, r18938, r18939, r18940, r18941, r18942;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r18935);
        mpfr_init(r18936);
        mpfr_init(r18937);
        mpfr_init(r18938);
        mpfr_init(r18939);
        mpfr_init(r18940);
        mpfr_init(r18941);
        mpfr_init(r18942);
}

double f_im(double wj, double x) {
        mpfr_set_d(r18935, wj, MPFR_RNDN);
        mpfr_exp(r18936, r18935, MPFR_RNDN);
        mpfr_mul(r18937, r18935, r18936, MPFR_RNDN);
        mpfr_set_d(r18938, x, MPFR_RNDN);
        mpfr_sub(r18939, r18937, r18938, MPFR_RNDN);
        mpfr_add(r18940, r18936, r18937, MPFR_RNDN);
        mpfr_div(r18941, r18939, r18940, MPFR_RNDN);
        mpfr_sub(r18942, r18935, r18941, MPFR_RNDN);
        return mpfr_get_d(r18942, MPFR_RNDN);
}

static mpfr_t r18943, r18944, r18945, r18946, r18947, r18948, r18949, r18950;

void setup_mpfr_f_fm() {
        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_fm(double wj, double x) {
        mpfr_set_d(r18943, wj, MPFR_RNDN);
        mpfr_sqr(r18944, r18943, MPFR_RNDN);
        mpfr_sub(r18945, r18943, r18944, MPFR_RNDN);
        mpfr_set_d(r18946, x, MPFR_RNDN);
        mpfr_exp(r18947, r18943, MPFR_RNDN);
        mpfr_fma(r18948, r18943, r18947, r18947, MPFR_RNDN);
        mpfr_div(r18949, r18946, r18948, MPFR_RNDN);
        mpfr_fma(r18950, r18945, 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_dm() {
        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_dm(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, r18953, r18951, r18957, MPFR_RNDN);
        return mpfr_get_d(r18958, MPFR_RNDN);
}

