#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 r48454 = wj;
        float r48455 = exp(r48454);
        float r48456 = r48454 * r48455;
        float r48457 = x;
        float r48458 = r48456 - r48457;
        float r48459 = r48455 + r48456;
        float r48460 = r48458 / r48459;
        float r48461 = r48454 - r48460;
        return r48461;
}

double f_id(double wj, double x) {
        double r48462 = wj;
        double r48463 = exp(r48462);
        double r48464 = r48462 * r48463;
        double r48465 = x;
        double r48466 = r48464 - r48465;
        double r48467 = r48463 + r48464;
        double r48468 = r48466 / r48467;
        double r48469 = r48462 - r48468;
        return r48469;
}


double f_of(float wj, float x) {
        float r48470 = x;
        float r48471 = 1;
        float r48472 = wj;
        float r48473 = r48471 + r48472;
        float r48474 = exp(r48472);
        float r48475 = r48473 * r48474;
        float r48476 = r48470 / r48475;
        float r48477 = r48472 * r48472;
        float r48478 = 4;
        float r48479 = pow(r48472, r48478);
        float r48480 = 3;
        float r48481 = pow(r48472, r48480);
        float r48482 = r48479 - r48481;
        float r48483 = r48477 + r48482;
        float r48484 = r48476 + r48483;
        return r48484;
}

double f_od(double wj, double x) {
        double r48485 = x;
        double r48486 = 1;
        double r48487 = wj;
        double r48488 = r48486 + r48487;
        double r48489 = exp(r48487);
        double r48490 = r48488 * r48489;
        double r48491 = r48485 / r48490;
        double r48492 = r48487 * r48487;
        double r48493 = 4;
        double r48494 = pow(r48487, r48493);
        double r48495 = 3;
        double r48496 = pow(r48487, r48495);
        double r48497 = r48494 - r48496;
        double r48498 = r48492 + r48497;
        double r48499 = r48491 + r48498;
        return r48499;
}

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 r48500, r48501, r48502, r48503, r48504, r48505, r48506, r48507;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(912);
        mpfr_init(r48500);
        mpfr_init(r48501);
        mpfr_init(r48502);
        mpfr_init(r48503);
        mpfr_init(r48504);
        mpfr_init(r48505);
        mpfr_init(r48506);
        mpfr_init(r48507);
}

double f_im(double wj, double x) {
        mpfr_set_d(r48500, wj, MPFR_RNDN);
        mpfr_exp(r48501, r48500, MPFR_RNDN);
        mpfr_mul(r48502, r48500, r48501, MPFR_RNDN);
        mpfr_set_d(r48503, x, MPFR_RNDN);
        mpfr_sub(r48504, r48502, r48503, MPFR_RNDN);
        mpfr_add(r48505, r48501, r48502, MPFR_RNDN);
        mpfr_div(r48506, r48504, r48505, MPFR_RNDN);
        mpfr_sub(r48507, r48500, r48506, MPFR_RNDN);
        return mpfr_get_d(r48507, MPFR_RNDN);
}

static mpfr_t r48508, r48509, r48510, r48511, r48512, r48513, r48514, r48515, r48516, r48517, r48518, r48519, r48520, r48521, r48522;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(912);
        mpfr_init(r48508);
        mpfr_init_set_str(r48509, "1", 10, MPFR_RNDN);
        mpfr_init(r48510);
        mpfr_init(r48511);
        mpfr_init(r48512);
        mpfr_init(r48513);
        mpfr_init(r48514);
        mpfr_init(r48515);
        mpfr_init_set_str(r48516, "4", 10, MPFR_RNDN);
        mpfr_init(r48517);
        mpfr_init_set_str(r48518, "3", 10, MPFR_RNDN);
        mpfr_init(r48519);
        mpfr_init(r48520);
        mpfr_init(r48521);
        mpfr_init(r48522);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r48508, x, MPFR_RNDN);
        ;
        mpfr_set_d(r48510, wj, MPFR_RNDN);
        mpfr_add(r48511, r48509, r48510, MPFR_RNDN);
        mpfr_exp(r48512, r48510, MPFR_RNDN);
        mpfr_mul(r48513, r48511, r48512, MPFR_RNDN);
        mpfr_div(r48514, r48508, r48513, MPFR_RNDN);
        mpfr_mul(r48515, r48510, r48510, MPFR_RNDN);
        ;
        mpfr_pow(r48517, r48510, r48516, MPFR_RNDN);
        ;
        mpfr_pow(r48519, r48510, r48518, MPFR_RNDN);
        mpfr_sub(r48520, r48517, r48519, MPFR_RNDN);
        mpfr_add(r48521, r48515, r48520, MPFR_RNDN);
        mpfr_add(r48522, r48514, r48521, MPFR_RNDN);
        return mpfr_get_d(r48522, MPFR_RNDN);
}

static mpfr_t r48523, r48524, r48525, r48526, r48527, r48528, r48529, r48530, r48531, r48532, r48533, r48534, r48535, r48536, r48537;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(912);
        mpfr_init(r48523);
        mpfr_init_set_str(r48524, "1", 10, MPFR_RNDN);
        mpfr_init(r48525);
        mpfr_init(r48526);
        mpfr_init(r48527);
        mpfr_init(r48528);
        mpfr_init(r48529);
        mpfr_init(r48530);
        mpfr_init_set_str(r48531, "4", 10, MPFR_RNDN);
        mpfr_init(r48532);
        mpfr_init_set_str(r48533, "3", 10, MPFR_RNDN);
        mpfr_init(r48534);
        mpfr_init(r48535);
        mpfr_init(r48536);
        mpfr_init(r48537);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r48523, x, MPFR_RNDN);
        ;
        mpfr_set_d(r48525, wj, MPFR_RNDN);
        mpfr_add(r48526, r48524, r48525, MPFR_RNDN);
        mpfr_exp(r48527, r48525, MPFR_RNDN);
        mpfr_mul(r48528, r48526, r48527, MPFR_RNDN);
        mpfr_div(r48529, r48523, r48528, MPFR_RNDN);
        mpfr_mul(r48530, r48525, r48525, MPFR_RNDN);
        ;
        mpfr_pow(r48532, r48525, r48531, MPFR_RNDN);
        ;
        mpfr_pow(r48534, r48525, r48533, MPFR_RNDN);
        mpfr_sub(r48535, r48532, r48534, MPFR_RNDN);
        mpfr_add(r48536, r48530, r48535, MPFR_RNDN);
        mpfr_add(r48537, r48529, r48536, MPFR_RNDN);
        return mpfr_get_d(r48537, MPFR_RNDN);
}

