#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 r45567 = wj;
        float r45568 = exp(r45567);
        float r45569 = r45567 * r45568;
        float r45570 = x;
        float r45571 = r45569 - r45570;
        float r45572 = r45568 + r45569;
        float r45573 = r45571 / r45572;
        float r45574 = r45567 - r45573;
        return r45574;
}

double f_id(double wj, double x) {
        double r45575 = wj;
        double r45576 = exp(r45575);
        double r45577 = r45575 * r45576;
        double r45578 = x;
        double r45579 = r45577 - r45578;
        double r45580 = r45576 + r45577;
        double r45581 = r45579 / r45580;
        double r45582 = r45575 - r45581;
        return r45582;
}


double f_of(float wj, float x) {
        float r45583 = wj;
        float r45584 = exp(r45583);
        float r45585 = r45583 * r45584;
        float r45586 = x;
        float r45587 = r45585 - r45586;
        float r45588 = r45584 + r45585;
        float r45589 = r45587 / r45588;
        float r45590 = r45583 - r45589;
        float r45591 = 1.1236023678861994e-11f;
        bool r45592 = r45590 <= r45591;
        float r45593 = 1.0f;
        float r45594 = r45583 + r45593;
        float r45595 = r45584 * r45594;
        float r45596 = r45586 / r45595;
        float r45597 = r45583 * r45583;
        float r45598 = 4.0f;
        float r45599 = pow(r45583, r45598);
        float r45600 = r45583 * (r45583 * r45583);
        float r45601 = r45599 - r45600;
        float r45602 = r45597 + r45601;
        float r45603 = r45596 + r45602;
        float r45604 = r45583 / r45594;
        float r45605 = r45583 - r45604;
        float r45606 = r45586 / r45588;
        float r45607 = r45605 + r45606;
        float r45608 = r45592 ? r45603 : r45607;
        return r45608;
}

double f_od(double wj, double x) {
        double r45609 = wj;
        double r45610 = exp(r45609);
        double r45611 = r45609 * r45610;
        double r45612 = x;
        double r45613 = r45611 - r45612;
        double r45614 = r45610 + r45611;
        double r45615 = r45613 / r45614;
        double r45616 = r45609 - r45615;
        double r45617 = 1.1236023678861994e-11;
        bool r45618 = r45616 <= r45617;
        double r45619 = 1.0;
        double r45620 = r45609 + r45619;
        double r45621 = r45610 * r45620;
        double r45622 = r45612 / r45621;
        double r45623 = r45609 * r45609;
        double r45624 = 4.0;
        double r45625 = pow(r45609, r45624);
        double r45626 = r45609 * (r45609 * r45609);
        double r45627 = r45625 - r45626;
        double r45628 = r45623 + r45627;
        double r45629 = r45622 + r45628;
        double r45630 = r45609 / r45620;
        double r45631 = r45609 - r45630;
        double r45632 = r45612 / r45614;
        double r45633 = r45631 + r45632;
        double r45634 = r45618 ? r45629 : r45633;
        return r45634;
}

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 r45635, r45636, r45637, r45638, r45639, r45640, r45641, r45642;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r45635);
        mpfr_init(r45636);
        mpfr_init(r45637);
        mpfr_init(r45638);
        mpfr_init(r45639);
        mpfr_init(r45640);
        mpfr_init(r45641);
        mpfr_init(r45642);
}

double f_im(double wj, double x) {
        mpfr_set_d(r45635, wj, MPFR_RNDN);
        mpfr_exp(r45636, r45635, MPFR_RNDN);
        mpfr_mul(r45637, r45635, r45636, MPFR_RNDN);
        mpfr_set_d(r45638, x, MPFR_RNDN);
        mpfr_sub(r45639, r45637, r45638, MPFR_RNDN);
        mpfr_add(r45640, r45636, r45637, MPFR_RNDN);
        mpfr_div(r45641, r45639, r45640, MPFR_RNDN);
        mpfr_sub(r45642, r45635, r45641, MPFR_RNDN);
        return mpfr_get_d(r45642, MPFR_RNDN);
}

static mpfr_t r45643, r45644, r45645, r45646, r45647, r45648, r45649, r45650, r45651, r45652, r45653, r45654, r45655, r45656, r45657, r45658, r45659, r45660, r45661, r45662, r45663, r45664, r45665, r45666, r45667, r45668;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r45643);
        mpfr_init(r45644);
        mpfr_init(r45645);
        mpfr_init(r45646);
        mpfr_init(r45647);
        mpfr_init(r45648);
        mpfr_init(r45649);
        mpfr_init(r45650);
        mpfr_init_set_str(r45651, "1.1236023678861994e-11", 10, MPFR_RNDN);
        mpfr_init(r45652);
        mpfr_init_set_str(r45653, "1", 10, MPFR_RNDN);
        mpfr_init(r45654);
        mpfr_init(r45655);
        mpfr_init(r45656);
        mpfr_init(r45657);
        mpfr_init_set_str(r45658, "4", 10, MPFR_RNDN);
        mpfr_init(r45659);
        mpfr_init(r45660);
        mpfr_init(r45661);
        mpfr_init(r45662);
        mpfr_init(r45663);
        mpfr_init(r45664);
        mpfr_init(r45665);
        mpfr_init(r45666);
        mpfr_init(r45667);
        mpfr_init(r45668);
}

double f_fm(double wj, double x) {
        mpfr_set_d(r45643, wj, MPFR_RNDN);
        mpfr_exp(r45644, r45643, MPFR_RNDN);
        mpfr_mul(r45645, r45643, r45644, MPFR_RNDN);
        mpfr_set_d(r45646, x, MPFR_RNDN);
        mpfr_sub(r45647, r45645, r45646, MPFR_RNDN);
        mpfr_add(r45648, r45644, r45645, MPFR_RNDN);
        mpfr_div(r45649, r45647, r45648, MPFR_RNDN);
        mpfr_sub(r45650, r45643, r45649, MPFR_RNDN);
        ;
        mpfr_set_si(r45652, mpfr_cmp(r45650, r45651) <= 0, MPFR_RNDN);
        ;
        mpfr_add(r45654, r45643, r45653, MPFR_RNDN);
        mpfr_mul(r45655, r45644, r45654, MPFR_RNDN);
        mpfr_div(r45656, r45646, r45655, MPFR_RNDN);
        mpfr_mul(r45657, r45643, r45643, MPFR_RNDN);
        ;
        mpfr_pow(r45659, r45643, r45658, MPFR_RNDN);
        mpfr_mul(r45660, r45643, r45643, MPFR_RNDN); mpfr_mul(r45660, r45660, r45643, MPFR_RNDN);
        mpfr_sub(r45661, r45659, r45660, MPFR_RNDN);
        mpfr_add(r45662, r45657, r45661, MPFR_RNDN);
        mpfr_add(r45663, r45656, r45662, MPFR_RNDN);
        mpfr_div(r45664, r45643, r45654, MPFR_RNDN);
        mpfr_sub(r45665, r45643, r45664, MPFR_RNDN);
        mpfr_div(r45666, r45646, r45648, MPFR_RNDN);
        mpfr_add(r45667, r45665, r45666, MPFR_RNDN);
        if (mpfr_get_si(r45652, MPFR_RNDN)) { mpfr_set(r45668, r45663, MPFR_RNDN); } else { mpfr_set(r45668, r45667, MPFR_RNDN); };
        return mpfr_get_d(r45668, MPFR_RNDN);
}

static mpfr_t r45669, r45670, r45671, r45672, r45673, r45674, r45675, r45676, r45677, r45678, r45679, r45680, r45681, r45682, r45683, r45684, r45685, r45686, r45687, r45688, r45689, r45690, r45691, r45692, r45693, r45694;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r45669);
        mpfr_init(r45670);
        mpfr_init(r45671);
        mpfr_init(r45672);
        mpfr_init(r45673);
        mpfr_init(r45674);
        mpfr_init(r45675);
        mpfr_init(r45676);
        mpfr_init_set_str(r45677, "1.1236023678861994e-11", 10, MPFR_RNDN);
        mpfr_init(r45678);
        mpfr_init_set_str(r45679, "1", 10, MPFR_RNDN);
        mpfr_init(r45680);
        mpfr_init(r45681);
        mpfr_init(r45682);
        mpfr_init(r45683);
        mpfr_init_set_str(r45684, "4", 10, MPFR_RNDN);
        mpfr_init(r45685);
        mpfr_init(r45686);
        mpfr_init(r45687);
        mpfr_init(r45688);
        mpfr_init(r45689);
        mpfr_init(r45690);
        mpfr_init(r45691);
        mpfr_init(r45692);
        mpfr_init(r45693);
        mpfr_init(r45694);
}

double f_dm(double wj, double x) {
        mpfr_set_d(r45669, wj, MPFR_RNDN);
        mpfr_exp(r45670, r45669, MPFR_RNDN);
        mpfr_mul(r45671, r45669, r45670, MPFR_RNDN);
        mpfr_set_d(r45672, x, MPFR_RNDN);
        mpfr_sub(r45673, r45671, r45672, MPFR_RNDN);
        mpfr_add(r45674, r45670, r45671, MPFR_RNDN);
        mpfr_div(r45675, r45673, r45674, MPFR_RNDN);
        mpfr_sub(r45676, r45669, r45675, MPFR_RNDN);
        ;
        mpfr_set_si(r45678, mpfr_cmp(r45676, r45677) <= 0, MPFR_RNDN);
        ;
        mpfr_add(r45680, r45669, r45679, MPFR_RNDN);
        mpfr_mul(r45681, r45670, r45680, MPFR_RNDN);
        mpfr_div(r45682, r45672, r45681, MPFR_RNDN);
        mpfr_mul(r45683, r45669, r45669, MPFR_RNDN);
        ;
        mpfr_pow(r45685, r45669, r45684, MPFR_RNDN);
        mpfr_mul(r45686, r45669, r45669, MPFR_RNDN); mpfr_mul(r45686, r45686, r45669, MPFR_RNDN);
        mpfr_sub(r45687, r45685, r45686, MPFR_RNDN);
        mpfr_add(r45688, r45683, r45687, MPFR_RNDN);
        mpfr_add(r45689, r45682, r45688, MPFR_RNDN);
        mpfr_div(r45690, r45669, r45680, MPFR_RNDN);
        mpfr_sub(r45691, r45669, r45690, MPFR_RNDN);
        mpfr_div(r45692, r45672, r45674, MPFR_RNDN);
        mpfr_add(r45693, r45691, r45692, MPFR_RNDN);
        if (mpfr_get_si(r45678, MPFR_RNDN)) { mpfr_set(r45694, r45689, MPFR_RNDN); } else { mpfr_set(r45694, r45693, MPFR_RNDN); };
        return mpfr_get_d(r45694, MPFR_RNDN);
}

