#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 r47700 = wj;
        float r47701 = exp(r47700);
        float r47702 = r47700 * r47701;
        float r47703 = x;
        float r47704 = r47702 - r47703;
        float r47705 = r47701 + r47702;
        float r47706 = r47704 / r47705;
        float r47707 = r47700 - r47706;
        return r47707;
}

double f_id(double wj, double x) {
        double r47708 = wj;
        double r47709 = exp(r47708);
        double r47710 = r47708 * r47709;
        double r47711 = x;
        double r47712 = r47710 - r47711;
        double r47713 = r47709 + r47710;
        double r47714 = r47712 / r47713;
        double r47715 = r47708 - r47714;
        return r47715;
}


double f_of(float wj, float x) {
        float r47716 = x;
        float r47717 = 1;
        float r47718 = wj;
        float r47719 = r47717 + r47718;
        float r47720 = exp(r47718);
        float r47721 = r47719 * r47720;
        float r47722 = r47716 / r47721;
        float r47723 = r47718 * r47718;
        float r47724 = 4;
        float r47725 = pow(r47718, r47724);
        float r47726 = 3;
        float r47727 = pow(r47718, r47726);
        float r47728 = r47725 - r47727;
        float r47729 = r47723 + r47728;
        float r47730 = r47722 + r47729;
        return r47730;
}

double f_od(double wj, double x) {
        double r47731 = x;
        double r47732 = 1;
        double r47733 = wj;
        double r47734 = r47732 + r47733;
        double r47735 = exp(r47733);
        double r47736 = r47734 * r47735;
        double r47737 = r47731 / r47736;
        double r47738 = r47733 * r47733;
        double r47739 = 4;
        double r47740 = pow(r47733, r47739);
        double r47741 = 3;
        double r47742 = pow(r47733, r47741);
        double r47743 = r47740 - r47742;
        double r47744 = r47738 + r47743;
        double r47745 = r47737 + r47744;
        return r47745;
}

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 r47746, r47747, r47748, r47749, r47750, r47751, r47752, r47753;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(912);
        mpfr_init(r47746);
        mpfr_init(r47747);
        mpfr_init(r47748);
        mpfr_init(r47749);
        mpfr_init(r47750);
        mpfr_init(r47751);
        mpfr_init(r47752);
        mpfr_init(r47753);
}

double f_im(double wj, double x) {
        mpfr_set_d(r47746, wj, MPFR_RNDN);
        mpfr_exp(r47747, r47746, MPFR_RNDN);
        mpfr_mul(r47748, r47746, r47747, MPFR_RNDN);
        mpfr_set_d(r47749, x, MPFR_RNDN);
        mpfr_sub(r47750, r47748, r47749, MPFR_RNDN);
        mpfr_add(r47751, r47747, r47748, MPFR_RNDN);
        mpfr_div(r47752, r47750, r47751, MPFR_RNDN);
        mpfr_sub(r47753, r47746, r47752, MPFR_RNDN);
        return mpfr_get_d(r47753, MPFR_RNDN);
}

static mpfr_t r47754, r47755, r47756, r47757, r47758, r47759, r47760, r47761, r47762, r47763, r47764, r47765, r47766, r47767, r47768;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(912);
        mpfr_init(r47754);
        mpfr_init_set_str(r47755, "1", 10, MPFR_RNDN);
        mpfr_init(r47756);
        mpfr_init(r47757);
        mpfr_init(r47758);
        mpfr_init(r47759);
        mpfr_init(r47760);
        mpfr_init(r47761);
        mpfr_init_set_str(r47762, "4", 10, MPFR_RNDN);
        mpfr_init(r47763);
        mpfr_init_set_str(r47764, "3", 10, MPFR_RNDN);
        mpfr_init(r47765);
        mpfr_init(r47766);
        mpfr_init(r47767);
        mpfr_init(r47768);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r47754, x, MPFR_RNDN);
        ;
        mpfr_set_d(r47756, wj, MPFR_RNDN);
        mpfr_add(r47757, r47755, r47756, MPFR_RNDN);
        mpfr_exp(r47758, r47756, MPFR_RNDN);
        mpfr_mul(r47759, r47757, r47758, MPFR_RNDN);
        mpfr_div(r47760, r47754, r47759, MPFR_RNDN);
        mpfr_mul(r47761, r47756, r47756, MPFR_RNDN);
        ;
        mpfr_pow(r47763, r47756, r47762, MPFR_RNDN);
        ;
        mpfr_pow(r47765, r47756, r47764, MPFR_RNDN);
        mpfr_sub(r47766, r47763, r47765, MPFR_RNDN);
        mpfr_add(r47767, r47761, r47766, MPFR_RNDN);
        mpfr_add(r47768, r47760, r47767, MPFR_RNDN);
        return mpfr_get_d(r47768, MPFR_RNDN);
}

static mpfr_t r47769, r47770, r47771, r47772, r47773, r47774, r47775, r47776, r47777, r47778, r47779, r47780, r47781, r47782, r47783;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(912);
        mpfr_init(r47769);
        mpfr_init_set_str(r47770, "1", 10, MPFR_RNDN);
        mpfr_init(r47771);
        mpfr_init(r47772);
        mpfr_init(r47773);
        mpfr_init(r47774);
        mpfr_init(r47775);
        mpfr_init(r47776);
        mpfr_init_set_str(r47777, "4", 10, MPFR_RNDN);
        mpfr_init(r47778);
        mpfr_init_set_str(r47779, "3", 10, MPFR_RNDN);
        mpfr_init(r47780);
        mpfr_init(r47781);
        mpfr_init(r47782);
        mpfr_init(r47783);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r47769, x, MPFR_RNDN);
        ;
        mpfr_set_d(r47771, wj, MPFR_RNDN);
        mpfr_add(r47772, r47770, r47771, MPFR_RNDN);
        mpfr_exp(r47773, r47771, MPFR_RNDN);
        mpfr_mul(r47774, r47772, r47773, MPFR_RNDN);
        mpfr_div(r47775, r47769, r47774, MPFR_RNDN);
        mpfr_mul(r47776, r47771, r47771, MPFR_RNDN);
        ;
        mpfr_pow(r47778, r47771, r47777, MPFR_RNDN);
        ;
        mpfr_pow(r47780, r47771, r47779, MPFR_RNDN);
        mpfr_sub(r47781, r47778, r47780, MPFR_RNDN);
        mpfr_add(r47782, r47776, r47781, MPFR_RNDN);
        mpfr_add(r47783, r47775, r47782, MPFR_RNDN);
        return mpfr_get_d(r47783, MPFR_RNDN);
}

