#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 r28353 = wj;
        float r28354 = exp(r28353);
        float r28355 = r28353 * r28354;
        float r28356 = x;
        float r28357 = r28355 - r28356;
        float r28358 = r28354 + r28355;
        float r28359 = r28357 / r28358;
        float r28360 = r28353 - r28359;
        return r28360;
}

double f_id(double wj, double x) {
        double r28361 = wj;
        double r28362 = exp(r28361);
        double r28363 = r28361 * r28362;
        double r28364 = x;
        double r28365 = r28363 - r28364;
        double r28366 = r28362 + r28363;
        double r28367 = r28365 / r28366;
        double r28368 = r28361 - r28367;
        return r28368;
}


double f_of(float wj, float x) {
        float r28369 = wj;
        float r28370 = exp(r28369);
        float r28371 = x;
        float r28372 = -r28371;
        float r28373 = fma(r28369, r28370, r28372);
        float r28374 = fma(r28369, r28370, r28370);
        float r28375 = r28373 / r28374;
        float r28376 = r28369 - r28375;
        float r28377 = log(r28376);
        float r28378 = exp(r28377);
        float r28379 = 1.0539839733040413e-13;
        bool r28380 = r28378 <= r28379;
        float r28381 = fma(r28370, r28369, r28370);
        float r28382 = r28371 / r28381;
        float r28383 = r28369 * r28369;
        float r28384 = 3;
        float r28385 = pow(r28369, r28384);
        float r28386 = r28383 - r28385;
        float r28387 = r28382 + r28386;
        float r28388 = 1;
        float r28389 = r28388 + r28369;
        float r28390 = r28369 / r28389;
        float r28391 = r28369 - r28390;
        float r28392 = r28369 * r28370;
        float r28393 = r28370 + r28392;
        float r28394 = r28371 / r28393;
        float r28395 = r28391 + r28394;
        float r28396 = r28380 ? r28387 : r28395;
        return r28396;
}

double f_od(double wj, double x) {
        double r28397 = wj;
        double r28398 = exp(r28397);
        double r28399 = x;
        double r28400 = -r28399;
        double r28401 = fma(r28397, r28398, r28400);
        double r28402 = fma(r28397, r28398, r28398);
        double r28403 = r28401 / r28402;
        double r28404 = r28397 - r28403;
        double r28405 = log(r28404);
        double r28406 = exp(r28405);
        double r28407 = 1.0539839733040413e-13;
        bool r28408 = r28406 <= r28407;
        double r28409 = fma(r28398, r28397, r28398);
        double r28410 = r28399 / r28409;
        double r28411 = r28397 * r28397;
        double r28412 = 3;
        double r28413 = pow(r28397, r28412);
        double r28414 = r28411 - r28413;
        double r28415 = r28410 + r28414;
        double r28416 = 1;
        double r28417 = r28416 + r28397;
        double r28418 = r28397 / r28417;
        double r28419 = r28397 - r28418;
        double r28420 = r28397 * r28398;
        double r28421 = r28398 + r28420;
        double r28422 = r28399 / r28421;
        double r28423 = r28419 + r28422;
        double r28424 = r28408 ? r28415 : r28423;
        return r28424;
}

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 r28425, r28426, r28427, r28428, r28429, r28430, r28431, r28432;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(848);
        mpfr_init(r28425);
        mpfr_init(r28426);
        mpfr_init(r28427);
        mpfr_init(r28428);
        mpfr_init(r28429);
        mpfr_init(r28430);
        mpfr_init(r28431);
        mpfr_init(r28432);
}

double f_im(double wj, double x) {
        mpfr_set_d(r28425, wj, MPFR_RNDN);
        mpfr_exp(r28426, r28425, MPFR_RNDN);
        mpfr_mul(r28427, r28425, r28426, MPFR_RNDN);
        mpfr_set_d(r28428, x, MPFR_RNDN);
        mpfr_sub(r28429, r28427, r28428, MPFR_RNDN);
        mpfr_add(r28430, r28426, r28427, MPFR_RNDN);
        mpfr_div(r28431, r28429, r28430, MPFR_RNDN);
        mpfr_sub(r28432, r28425, r28431, MPFR_RNDN);
        return mpfr_get_d(r28432, MPFR_RNDN);
}

static mpfr_t r28433, r28434, r28435, r28436, r28437, r28438, r28439, r28440, r28441, r28442, r28443, r28444, r28445, r28446, r28447, r28448, r28449, r28450, r28451, r28452, r28453, r28454, r28455, r28456, r28457, r28458, r28459, r28460;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(848);
        mpfr_init(r28433);
        mpfr_init(r28434);
        mpfr_init(r28435);
        mpfr_init(r28436);
        mpfr_init(r28437);
        mpfr_init(r28438);
        mpfr_init(r28439);
        mpfr_init(r28440);
        mpfr_init(r28441);
        mpfr_init(r28442);
        mpfr_init_set_str(r28443, "1.0539839733040413e-13", 10, MPFR_RNDN);
        mpfr_init(r28444);
        mpfr_init(r28445);
        mpfr_init(r28446);
        mpfr_init(r28447);
        mpfr_init_set_str(r28448, "3", 10, MPFR_RNDN);
        mpfr_init(r28449);
        mpfr_init(r28450);
        mpfr_init(r28451);
        mpfr_init_set_str(r28452, "1", 10, MPFR_RNDN);
        mpfr_init(r28453);
        mpfr_init(r28454);
        mpfr_init(r28455);
        mpfr_init(r28456);
        mpfr_init(r28457);
        mpfr_init(r28458);
        mpfr_init(r28459);
        mpfr_init(r28460);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r28433, wj, MPFR_RNDN);
        mpfr_exp(r28434, r28433, MPFR_RNDN);
        mpfr_set_d(r28435, x, MPFR_RNDN);
        mpfr_neg(r28436, r28435, MPFR_RNDN);
        mpfr_fma(r28437, r28433, r28434, r28436, MPFR_RNDN);
        mpfr_fma(r28438, r28433, r28434, r28434, MPFR_RNDN);
        mpfr_div(r28439, r28437, r28438, MPFR_RNDN);
        mpfr_sub(r28440, r28433, r28439, MPFR_RNDN);
        mpfr_log(r28441, r28440, MPFR_RNDN);
        mpfr_exp(r28442, r28441, MPFR_RNDN);
        ;
        mpfr_set_si(r28444, mpfr_cmp(r28442, r28443) <= 0, MPFR_RNDN);
        mpfr_fma(r28445, r28434, r28433, r28434, MPFR_RNDN);
        mpfr_div(r28446, r28435, r28445, MPFR_RNDN);
        mpfr_mul(r28447, r28433, r28433, MPFR_RNDN);
        ;
        mpfr_pow(r28449, r28433, r28448, MPFR_RNDN);
        mpfr_sub(r28450, r28447, r28449, MPFR_RNDN);
        mpfr_add(r28451, r28446, r28450, MPFR_RNDN);
        ;
        mpfr_add(r28453, r28452, r28433, MPFR_RNDN);
        mpfr_div(r28454, r28433, r28453, MPFR_RNDN);
        mpfr_sub(r28455, r28433, r28454, MPFR_RNDN);
        mpfr_mul(r28456, r28433, r28434, MPFR_RNDN);
        mpfr_add(r28457, r28434, r28456, MPFR_RNDN);
        mpfr_div(r28458, r28435, r28457, MPFR_RNDN);
        mpfr_add(r28459, r28455, r28458, MPFR_RNDN);
        if (mpfr_get_si(r28444, MPFR_RNDN)) { mpfr_set(r28460, r28451, MPFR_RNDN); } else { mpfr_set(r28460, r28459, MPFR_RNDN); };
        return mpfr_get_d(r28460, MPFR_RNDN);
}

static mpfr_t r28461, r28462, r28463, r28464, r28465, r28466, r28467, r28468, r28469, r28470, r28471, r28472, r28473, r28474, r28475, r28476, r28477, r28478, r28479, r28480, r28481, r28482, r28483, r28484, r28485, r28486, r28487, r28488;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(848);
        mpfr_init(r28461);
        mpfr_init(r28462);
        mpfr_init(r28463);
        mpfr_init(r28464);
        mpfr_init(r28465);
        mpfr_init(r28466);
        mpfr_init(r28467);
        mpfr_init(r28468);
        mpfr_init(r28469);
        mpfr_init(r28470);
        mpfr_init_set_str(r28471, "1.0539839733040413e-13", 10, MPFR_RNDN);
        mpfr_init(r28472);
        mpfr_init(r28473);
        mpfr_init(r28474);
        mpfr_init(r28475);
        mpfr_init_set_str(r28476, "3", 10, MPFR_RNDN);
        mpfr_init(r28477);
        mpfr_init(r28478);
        mpfr_init(r28479);
        mpfr_init_set_str(r28480, "1", 10, MPFR_RNDN);
        mpfr_init(r28481);
        mpfr_init(r28482);
        mpfr_init(r28483);
        mpfr_init(r28484);
        mpfr_init(r28485);
        mpfr_init(r28486);
        mpfr_init(r28487);
        mpfr_init(r28488);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r28461, wj, MPFR_RNDN);
        mpfr_exp(r28462, r28461, MPFR_RNDN);
        mpfr_set_d(r28463, x, MPFR_RNDN);
        mpfr_neg(r28464, r28463, MPFR_RNDN);
        mpfr_fma(r28465, r28461, r28462, r28464, MPFR_RNDN);
        mpfr_fma(r28466, r28461, r28462, r28462, MPFR_RNDN);
        mpfr_div(r28467, r28465, r28466, MPFR_RNDN);
        mpfr_sub(r28468, r28461, r28467, MPFR_RNDN);
        mpfr_log(r28469, r28468, MPFR_RNDN);
        mpfr_exp(r28470, r28469, MPFR_RNDN);
        ;
        mpfr_set_si(r28472, mpfr_cmp(r28470, r28471) <= 0, MPFR_RNDN);
        mpfr_fma(r28473, r28462, r28461, r28462, MPFR_RNDN);
        mpfr_div(r28474, r28463, r28473, MPFR_RNDN);
        mpfr_mul(r28475, r28461, r28461, MPFR_RNDN);
        ;
        mpfr_pow(r28477, r28461, r28476, MPFR_RNDN);
        mpfr_sub(r28478, r28475, r28477, MPFR_RNDN);
        mpfr_add(r28479, r28474, r28478, MPFR_RNDN);
        ;
        mpfr_add(r28481, r28480, r28461, MPFR_RNDN);
        mpfr_div(r28482, r28461, r28481, MPFR_RNDN);
        mpfr_sub(r28483, r28461, r28482, MPFR_RNDN);
        mpfr_mul(r28484, r28461, r28462, MPFR_RNDN);
        mpfr_add(r28485, r28462, r28484, MPFR_RNDN);
        mpfr_div(r28486, r28463, r28485, MPFR_RNDN);
        mpfr_add(r28487, r28483, r28486, MPFR_RNDN);
        if (mpfr_get_si(r28472, MPFR_RNDN)) { mpfr_set(r28488, r28479, MPFR_RNDN); } else { mpfr_set(r28488, r28487, MPFR_RNDN); };
        return mpfr_get_d(r28488, MPFR_RNDN);
}

