#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 r12361 = wj;
        float r12362 = exp(r12361);
        float r12363 = r12361 * r12362;
        float r12364 = x;
        float r12365 = r12363 - r12364;
        float r12366 = r12362 + r12363;
        float r12367 = r12365 / r12366;
        float r12368 = r12361 - r12367;
        return r12368;
}

double f_id(double wj, double x) {
        double r12369 = wj;
        double r12370 = exp(r12369);
        double r12371 = r12369 * r12370;
        double r12372 = x;
        double r12373 = r12371 - r12372;
        double r12374 = r12370 + r12371;
        double r12375 = r12373 / r12374;
        double r12376 = r12369 - r12375;
        return r12376;
}


double f_of(float wj, float x) {
        float r12377 = x;
        float r12378 = wj;
        float r12379 = exp(r12378);
        float r12380 = fma(r12379, r12378, r12379);
        float r12381 = r12377 / r12380;
        float r12382 = r12378 * r12378;
        float r12383 = r12378 - r12382;
        float r12384 = 1;
        float r12385 = r12384 / r12378;
        float r12386 = -4;
        float r12387 = pow(r12385, r12386);
        float r12388 = fma(r12383, r12378, r12387);
        float r12389 = r12381 + r12388;
        return r12389;
}

double f_od(double wj, double x) {
        double r12390 = x;
        double r12391 = wj;
        double r12392 = exp(r12391);
        double r12393 = fma(r12392, r12391, r12392);
        double r12394 = r12390 / r12393;
        double r12395 = r12391 * r12391;
        double r12396 = r12391 - r12395;
        double r12397 = 1;
        double r12398 = r12397 / r12391;
        double r12399 = -4;
        double r12400 = pow(r12398, r12399);
        double r12401 = fma(r12396, r12391, r12400);
        double r12402 = r12394 + r12401;
        return r12402;
}

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 r12403, r12404, r12405, r12406, r12407, r12408, r12409, r12410;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(848);
        mpfr_init(r12403);
        mpfr_init(r12404);
        mpfr_init(r12405);
        mpfr_init(r12406);
        mpfr_init(r12407);
        mpfr_init(r12408);
        mpfr_init(r12409);
        mpfr_init(r12410);
}

double f_im(double wj, double x) {
        mpfr_set_d(r12403, wj, MPFR_RNDN);
        mpfr_exp(r12404, r12403, MPFR_RNDN);
        mpfr_mul(r12405, r12403, r12404, MPFR_RNDN);
        mpfr_set_d(r12406, x, MPFR_RNDN);
        mpfr_sub(r12407, r12405, r12406, MPFR_RNDN);
        mpfr_add(r12408, r12404, r12405, MPFR_RNDN);
        mpfr_div(r12409, r12407, r12408, MPFR_RNDN);
        mpfr_sub(r12410, r12403, r12409, MPFR_RNDN);
        return mpfr_get_d(r12410, MPFR_RNDN);
}

static mpfr_t r12411, r12412, r12413, r12414, r12415, r12416, r12417, r12418, r12419, r12420, r12421, r12422, r12423;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(848);
        mpfr_init(r12411);
        mpfr_init(r12412);
        mpfr_init(r12413);
        mpfr_init(r12414);
        mpfr_init(r12415);
        mpfr_init(r12416);
        mpfr_init(r12417);
        mpfr_init_set_str(r12418, "1", 10, MPFR_RNDN);
        mpfr_init(r12419);
        mpfr_init_set_str(r12420, "-4", 10, MPFR_RNDN);
        mpfr_init(r12421);
        mpfr_init(r12422);
        mpfr_init(r12423);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r12411, x, MPFR_RNDN);
        mpfr_set_d(r12412, wj, MPFR_RNDN);
        mpfr_exp(r12413, r12412, MPFR_RNDN);
        mpfr_fma(r12414, r12413, r12412, r12413, MPFR_RNDN);
        mpfr_div(r12415, r12411, r12414, MPFR_RNDN);
        mpfr_mul(r12416, r12412, r12412, MPFR_RNDN);
        mpfr_sub(r12417, r12412, r12416, MPFR_RNDN);
        ;
        mpfr_div(r12419, r12418, r12412, MPFR_RNDN);
        ;
        mpfr_pow(r12421, r12419, r12420, MPFR_RNDN);
        mpfr_fma(r12422, r12417, r12412, r12421, MPFR_RNDN);
        mpfr_add(r12423, r12415, r12422, MPFR_RNDN);
        return mpfr_get_d(r12423, MPFR_RNDN);
}

static mpfr_t r12424, r12425, r12426, r12427, r12428, r12429, r12430, r12431, r12432, r12433, r12434, r12435, r12436;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(848);
        mpfr_init(r12424);
        mpfr_init(r12425);
        mpfr_init(r12426);
        mpfr_init(r12427);
        mpfr_init(r12428);
        mpfr_init(r12429);
        mpfr_init(r12430);
        mpfr_init_set_str(r12431, "1", 10, MPFR_RNDN);
        mpfr_init(r12432);
        mpfr_init_set_str(r12433, "-4", 10, MPFR_RNDN);
        mpfr_init(r12434);
        mpfr_init(r12435);
        mpfr_init(r12436);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r12424, x, MPFR_RNDN);
        mpfr_set_d(r12425, wj, MPFR_RNDN);
        mpfr_exp(r12426, r12425, MPFR_RNDN);
        mpfr_fma(r12427, r12426, r12425, r12426, MPFR_RNDN);
        mpfr_div(r12428, r12424, r12427, MPFR_RNDN);
        mpfr_mul(r12429, r12425, r12425, MPFR_RNDN);
        mpfr_sub(r12430, r12425, r12429, MPFR_RNDN);
        ;
        mpfr_div(r12432, r12431, r12425, MPFR_RNDN);
        ;
        mpfr_pow(r12434, r12432, r12433, MPFR_RNDN);
        mpfr_fma(r12435, r12430, r12425, r12434, MPFR_RNDN);
        mpfr_add(r12436, r12428, r12435, MPFR_RNDN);
        return mpfr_get_d(r12436, MPFR_RNDN);
}

