#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 r18431 = wj;
        float r18432 = exp(r18431);
        float r18433 = r18431 * r18432;
        float r18434 = x;
        float r18435 = r18433 - r18434;
        float r18436 = r18432 + r18433;
        float r18437 = r18435 / r18436;
        float r18438 = r18431 - r18437;
        return r18438;
}

double f_id(double wj, double x) {
        double r18439 = wj;
        double r18440 = exp(r18439);
        double r18441 = r18439 * r18440;
        double r18442 = x;
        double r18443 = r18441 - r18442;
        double r18444 = r18440 + r18441;
        double r18445 = r18443 / r18444;
        double r18446 = r18439 - r18445;
        return r18446;
}


double f_of(float wj, float x) {
        float r18447 = wj;
        float r18448 = 1.0f;
        float r18449 = r18448 + r18447;
        float r18450 = r18447 / r18449;
        float r18451 = r18447 - r18450;
        float r18452 = x;
        float r18453 = exp(r18447);
        float r18454 = r18447 * r18453;
        float r18455 = r18453 + r18454;
        float r18456 = r18452 / r18455;
        float r18457 = r18451 + r18456;
        return r18457;
}

double f_od(double wj, double x) {
        double r18458 = wj;
        double r18459 = 1.0;
        double r18460 = r18459 + r18458;
        double r18461 = r18458 / r18460;
        double r18462 = r18458 - r18461;
        double r18463 = x;
        double r18464 = exp(r18458);
        double r18465 = r18458 * r18464;
        double r18466 = r18464 + r18465;
        double r18467 = r18463 / r18466;
        double r18468 = r18462 + r18467;
        return r18468;
}

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 r18469, r18470, r18471, r18472, r18473, r18474, r18475, r18476;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r18469);
        mpfr_init(r18470);
        mpfr_init(r18471);
        mpfr_init(r18472);
        mpfr_init(r18473);
        mpfr_init(r18474);
        mpfr_init(r18475);
        mpfr_init(r18476);
}

double f_im(double wj, double x) {
        mpfr_set_d(r18469, wj, MPFR_RNDN);
        mpfr_exp(r18470, r18469, MPFR_RNDN);
        mpfr_mul(r18471, r18469, r18470, MPFR_RNDN);
        mpfr_set_d(r18472, x, MPFR_RNDN);
        mpfr_sub(r18473, r18471, r18472, MPFR_RNDN);
        mpfr_add(r18474, r18470, r18471, MPFR_RNDN);
        mpfr_div(r18475, r18473, r18474, MPFR_RNDN);
        mpfr_sub(r18476, r18469, r18475, MPFR_RNDN);
        return mpfr_get_d(r18476, MPFR_RNDN);
}

static mpfr_t r18477, r18478, r18479, r18480, r18481, r18482, r18483, r18484, r18485, r18486, r18487;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r18477);
        mpfr_init_set_str(r18478, "1", 10, MPFR_RNDN);
        mpfr_init(r18479);
        mpfr_init(r18480);
        mpfr_init(r18481);
        mpfr_init(r18482);
        mpfr_init(r18483);
        mpfr_init(r18484);
        mpfr_init(r18485);
        mpfr_init(r18486);
        mpfr_init(r18487);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r18477, wj, MPFR_RNDN);
        ;
        mpfr_add(r18479, r18478, r18477, MPFR_RNDN);
        mpfr_div(r18480, r18477, r18479, MPFR_RNDN);
        mpfr_sub(r18481, r18477, r18480, MPFR_RNDN);
        mpfr_set_d(r18482, x, MPFR_RNDN);
        mpfr_exp(r18483, r18477, MPFR_RNDN);
        mpfr_mul(r18484, r18477, r18483, MPFR_RNDN);
        mpfr_add(r18485, r18483, r18484, MPFR_RNDN);
        mpfr_div(r18486, r18482, r18485, MPFR_RNDN);
        mpfr_add(r18487, r18481, r18486, MPFR_RNDN);
        return mpfr_get_d(r18487, MPFR_RNDN);
}

static mpfr_t r18488, r18489, r18490, r18491, r18492, r18493, r18494, r18495, r18496, r18497, r18498;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r18488);
        mpfr_init_set_str(r18489, "1", 10, MPFR_RNDN);
        mpfr_init(r18490);
        mpfr_init(r18491);
        mpfr_init(r18492);
        mpfr_init(r18493);
        mpfr_init(r18494);
        mpfr_init(r18495);
        mpfr_init(r18496);
        mpfr_init(r18497);
        mpfr_init(r18498);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r18488, wj, MPFR_RNDN);
        ;
        mpfr_add(r18490, r18489, r18488, MPFR_RNDN);
        mpfr_div(r18491, r18488, r18490, MPFR_RNDN);
        mpfr_sub(r18492, r18488, r18491, MPFR_RNDN);
        mpfr_set_d(r18493, x, MPFR_RNDN);
        mpfr_exp(r18494, r18488, MPFR_RNDN);
        mpfr_mul(r18495, r18488, r18494, MPFR_RNDN);
        mpfr_add(r18496, r18494, r18495, MPFR_RNDN);
        mpfr_div(r18497, r18493, r18496, MPFR_RNDN);
        mpfr_add(r18498, r18492, r18497, MPFR_RNDN);
        return mpfr_get_d(r18498, MPFR_RNDN);
}

