#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 r48142 = wj;
        float r48143 = exp(r48142);
        float r48144 = r48142 * r48143;
        float r48145 = x;
        float r48146 = r48144 - r48145;
        float r48147 = r48143 + r48144;
        float r48148 = r48146 / r48147;
        float r48149 = r48142 - r48148;
        return r48149;
}

double f_id(double wj, double x) {
        double r48150 = wj;
        double r48151 = exp(r48150);
        double r48152 = r48150 * r48151;
        double r48153 = x;
        double r48154 = r48152 - r48153;
        double r48155 = r48151 + r48152;
        double r48156 = r48154 / r48155;
        double r48157 = r48150 - r48156;
        return r48157;
}


double f_of(float wj, float x) {
        float r48158 = x;
        float r48159 = wj;
        float r48160 = r48159 + r48159;
        float r48161 = r48160 * r48158;
        float r48162 = r48158 - r48161;
        float r48163 = r48159 * r48159;
        float r48164 = 5/2;
        float r48165 = r48164 * r48158;
        float r48166 = 1;
        float r48167 = r48166 - r48159;
        float r48168 = r48165 + r48167;
        float r48169 = r48163 * r48168;
        float r48170 = r48162 + r48169;
        return r48170;
}

double f_od(double wj, double x) {
        double r48171 = x;
        double r48172 = wj;
        double r48173 = r48172 + r48172;
        double r48174 = r48173 * r48171;
        double r48175 = r48171 - r48174;
        double r48176 = r48172 * r48172;
        double r48177 = 5/2;
        double r48178 = r48177 * r48171;
        double r48179 = 1;
        double r48180 = r48179 - r48172;
        double r48181 = r48178 + r48180;
        double r48182 = r48176 * r48181;
        double r48183 = r48175 + r48182;
        return r48183;
}

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 r48184, r48185, r48186, r48187, r48188, r48189, r48190, r48191;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(912);
        mpfr_init(r48184);
        mpfr_init(r48185);
        mpfr_init(r48186);
        mpfr_init(r48187);
        mpfr_init(r48188);
        mpfr_init(r48189);
        mpfr_init(r48190);
        mpfr_init(r48191);
}

double f_im(double wj, double x) {
        mpfr_set_d(r48184, wj, MPFR_RNDN);
        mpfr_exp(r48185, r48184, MPFR_RNDN);
        mpfr_mul(r48186, r48184, r48185, MPFR_RNDN);
        mpfr_set_d(r48187, x, MPFR_RNDN);
        mpfr_sub(r48188, r48186, r48187, MPFR_RNDN);
        mpfr_add(r48189, r48185, r48186, MPFR_RNDN);
        mpfr_div(r48190, r48188, r48189, MPFR_RNDN);
        mpfr_sub(r48191, r48184, r48190, MPFR_RNDN);
        return mpfr_get_d(r48191, MPFR_RNDN);
}

static mpfr_t r48192, r48193, r48194, r48195, r48196, r48197, r48198, r48199, r48200, r48201, r48202, r48203, r48204;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(912);
        mpfr_init(r48192);
        mpfr_init(r48193);
        mpfr_init(r48194);
        mpfr_init(r48195);
        mpfr_init(r48196);
        mpfr_init(r48197);
        mpfr_init_set_str(r48198, "5/2", 10, MPFR_RNDN);
        mpfr_init(r48199);
        mpfr_init_set_str(r48200, "1", 10, MPFR_RNDN);
        mpfr_init(r48201);
        mpfr_init(r48202);
        mpfr_init(r48203);
        mpfr_init(r48204);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r48192, x, MPFR_RNDN);
        mpfr_set_d(r48193, wj, MPFR_RNDN);
        mpfr_add(r48194, r48193, r48193, MPFR_RNDN);
        mpfr_mul(r48195, r48194, r48192, MPFR_RNDN);
        mpfr_sub(r48196, r48192, r48195, MPFR_RNDN);
        mpfr_mul(r48197, r48193, r48193, MPFR_RNDN);
        ;
        mpfr_mul(r48199, r48198, r48192, MPFR_RNDN);
        ;
        mpfr_sub(r48201, r48200, r48193, MPFR_RNDN);
        mpfr_add(r48202, r48199, r48201, MPFR_RNDN);
        mpfr_mul(r48203, r48197, r48202, MPFR_RNDN);
        mpfr_add(r48204, r48196, r48203, MPFR_RNDN);
        return mpfr_get_d(r48204, MPFR_RNDN);
}

static mpfr_t r48205, r48206, r48207, r48208, r48209, r48210, r48211, r48212, r48213, r48214, r48215, r48216, r48217;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(912);
        mpfr_init(r48205);
        mpfr_init(r48206);
        mpfr_init(r48207);
        mpfr_init(r48208);
        mpfr_init(r48209);
        mpfr_init(r48210);
        mpfr_init_set_str(r48211, "5/2", 10, MPFR_RNDN);
        mpfr_init(r48212);
        mpfr_init_set_str(r48213, "1", 10, MPFR_RNDN);
        mpfr_init(r48214);
        mpfr_init(r48215);
        mpfr_init(r48216);
        mpfr_init(r48217);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r48205, x, MPFR_RNDN);
        mpfr_set_d(r48206, wj, MPFR_RNDN);
        mpfr_add(r48207, r48206, r48206, MPFR_RNDN);
        mpfr_mul(r48208, r48207, r48205, MPFR_RNDN);
        mpfr_sub(r48209, r48205, r48208, MPFR_RNDN);
        mpfr_mul(r48210, r48206, r48206, MPFR_RNDN);
        ;
        mpfr_mul(r48212, r48211, r48205, MPFR_RNDN);
        ;
        mpfr_sub(r48214, r48213, r48206, MPFR_RNDN);
        mpfr_add(r48215, r48212, r48214, MPFR_RNDN);
        mpfr_mul(r48216, r48210, r48215, MPFR_RNDN);
        mpfr_add(r48217, r48209, r48216, MPFR_RNDN);
        return mpfr_get_d(r48217, MPFR_RNDN);
}

