#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "Falkner and Boettcher, Appendix A";

double f_if(float a, float k, float m) {
        float r27597 = a;
        float r27598 = k;
        float r27599 = m;
        float r27600 = pow(r27598, r27599);
        float r27601 = r27597 * r27600;
        float r27602 = 1;
        float r27603 = 10;
        float r27604 = r27603 * r27598;
        float r27605 = r27602 + r27604;
        float r27606 = r27598 * r27598;
        float r27607 = r27605 + r27606;
        float r27608 = r27601 / r27607;
        return r27608;
}

double f_id(double a, double k, double m) {
        double r27609 = a;
        double r27610 = k;
        double r27611 = m;
        double r27612 = pow(r27610, r27611);
        double r27613 = r27609 * r27612;
        double r27614 = 1;
        double r27615 = 10;
        double r27616 = r27615 * r27610;
        double r27617 = r27614 + r27616;
        double r27618 = r27610 * r27610;
        double r27619 = r27617 + r27618;
        double r27620 = r27613 / r27619;
        return r27620;
}


double f_of(float a, float k, float m) {
        float r27621 = k;
        float r27622 = 3.9501795571041663e+151;
        bool r27623 = r27621 <= r27622;
        float r27624 = m;
        float r27625 = pow(r27621, r27624);
        float r27626 = a;
        float r27627 = r27625 * r27626;
        float r27628 = 10;
        float r27629 = r27628 + r27621;
        float r27630 = r27621 * r27629;
        float r27631 = 1;
        float r27632 = r27630 + r27631;
        float r27633 = sqrt(r27632);
        float r27634 = r27627 / r27633;
        float r27635 = r27628 * r27621;
        float r27636 = r27631 + r27635;
        float r27637 = r27621 * r27621;
        float r27638 = r27636 + r27637;
        float r27639 = sqrt(r27638);
        float r27640 = r27634 / r27639;
        float r27641 = -r27624;
        float r27642 = pow(r27621, r27641);
        float r27643 = r27642 / r27626;
        float r27644 = r27621 / r27626;
        float r27645 = r27644 / r27625;
        float r27646 = r27645 * r27629;
        float r27647 = r27643 + r27646;
        float r27648 = r27631 / r27647;
        float r27649 = r27623 ? r27640 : r27648;
        return r27649;
}

double f_od(double a, double k, double m) {
        double r27650 = k;
        double r27651 = 3.9501795571041663e+151;
        bool r27652 = r27650 <= r27651;
        double r27653 = m;
        double r27654 = pow(r27650, r27653);
        double r27655 = a;
        double r27656 = r27654 * r27655;
        double r27657 = 10;
        double r27658 = r27657 + r27650;
        double r27659 = r27650 * r27658;
        double r27660 = 1;
        double r27661 = r27659 + r27660;
        double r27662 = sqrt(r27661);
        double r27663 = r27656 / r27662;
        double r27664 = r27657 * r27650;
        double r27665 = r27660 + r27664;
        double r27666 = r27650 * r27650;
        double r27667 = r27665 + r27666;
        double r27668 = sqrt(r27667);
        double r27669 = r27663 / r27668;
        double r27670 = -r27653;
        double r27671 = pow(r27650, r27670);
        double r27672 = r27671 / r27655;
        double r27673 = r27650 / r27655;
        double r27674 = r27673 / r27654;
        double r27675 = r27674 * r27658;
        double r27676 = r27672 + r27675;
        double r27677 = r27660 / r27676;
        double r27678 = r27652 ? r27669 : r27677;
        return r27678;
}

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 r27679, r27680, r27681, r27682, r27683, r27684, r27685, r27686, r27687, r27688, r27689, r27690;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r27679);
        mpfr_init(r27680);
        mpfr_init(r27681);
        mpfr_init(r27682);
        mpfr_init(r27683);
        mpfr_init_set_str(r27684, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r27685, "10", 10, MPFR_RNDN);
        mpfr_init(r27686);
        mpfr_init(r27687);
        mpfr_init(r27688);
        mpfr_init(r27689);
        mpfr_init(r27690);
}

double f_im(double a, double k, double m) {
        mpfr_set_d(r27679, a, MPFR_RNDN);
        mpfr_set_d(r27680, k, MPFR_RNDN);
        mpfr_set_d(r27681, m, MPFR_RNDN);
        mpfr_pow(r27682, r27680, r27681, MPFR_RNDN);
        mpfr_mul(r27683, r27679, r27682, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r27686, r27685, r27680, MPFR_RNDN);
        mpfr_add(r27687, r27684, r27686, MPFR_RNDN);
        mpfr_mul(r27688, r27680, r27680, MPFR_RNDN);
        mpfr_add(r27689, r27687, r27688, MPFR_RNDN);
        mpfr_div(r27690, r27683, r27689, MPFR_RNDN);
        return mpfr_get_d(r27690, MPFR_RNDN);
}

static mpfr_t r27691, r27692, r27693, r27694, r27695, r27696, r27697, r27698, r27699, r27700, r27701, r27702, r27703, r27704, r27705, r27706, r27707, r27708, r27709, r27710, r27711, r27712, r27713, r27714, r27715, r27716, r27717, r27718, r27719;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27691);
        mpfr_init_set_str(r27692, "3.9501795571041663e+151", 10, MPFR_RNDN);
        mpfr_init(r27693);
        mpfr_init(r27694);
        mpfr_init(r27695);
        mpfr_init(r27696);
        mpfr_init(r27697);
        mpfr_init_set_str(r27698, "10", 10, MPFR_RNDN);
        mpfr_init(r27699);
        mpfr_init(r27700);
        mpfr_init_set_str(r27701, "1", 10, MPFR_RNDN);
        mpfr_init(r27702);
        mpfr_init(r27703);
        mpfr_init(r27704);
        mpfr_init(r27705);
        mpfr_init(r27706);
        mpfr_init(r27707);
        mpfr_init(r27708);
        mpfr_init(r27709);
        mpfr_init(r27710);
        mpfr_init(r27711);
        mpfr_init(r27712);
        mpfr_init(r27713);
        mpfr_init(r27714);
        mpfr_init(r27715);
        mpfr_init(r27716);
        mpfr_init(r27717);
        mpfr_init(r27718);
        mpfr_init(r27719);
}

double f_fm(double a, double k, double m) {
        mpfr_set_d(r27691, k, MPFR_RNDN);
        ;
        mpfr_set_si(r27693, mpfr_cmp(r27691, r27692) <= 0, MPFR_RNDN);
        mpfr_set_d(r27694, m, MPFR_RNDN);
        mpfr_pow(r27695, r27691, r27694, MPFR_RNDN);
        mpfr_set_d(r27696, a, MPFR_RNDN);
        mpfr_mul(r27697, r27695, r27696, MPFR_RNDN);
        ;
        mpfr_add(r27699, r27698, r27691, MPFR_RNDN);
        mpfr_mul(r27700, r27691, r27699, MPFR_RNDN);
        ;
        mpfr_add(r27702, r27700, r27701, MPFR_RNDN);
        mpfr_sqrt(r27703, r27702, MPFR_RNDN);
        mpfr_div(r27704, r27697, r27703, MPFR_RNDN);
        mpfr_mul(r27705, r27698, r27691, MPFR_RNDN);
        mpfr_add(r27706, r27701, r27705, MPFR_RNDN);
        mpfr_mul(r27707, r27691, r27691, MPFR_RNDN);
        mpfr_add(r27708, r27706, r27707, MPFR_RNDN);
        mpfr_sqrt(r27709, r27708, MPFR_RNDN);
        mpfr_div(r27710, r27704, r27709, MPFR_RNDN);
        mpfr_neg(r27711, r27694, MPFR_RNDN);
        mpfr_pow(r27712, r27691, r27711, MPFR_RNDN);
        mpfr_div(r27713, r27712, r27696, MPFR_RNDN);
        mpfr_div(r27714, r27691, r27696, MPFR_RNDN);
        mpfr_div(r27715, r27714, r27695, MPFR_RNDN);
        mpfr_mul(r27716, r27715, r27699, MPFR_RNDN);
        mpfr_add(r27717, r27713, r27716, MPFR_RNDN);
        mpfr_div(r27718, r27701, r27717, MPFR_RNDN);
        if (mpfr_get_si(r27693, MPFR_RNDN)) { mpfr_set(r27719, r27710, MPFR_RNDN); } else { mpfr_set(r27719, r27718, MPFR_RNDN); };
        return mpfr_get_d(r27719, MPFR_RNDN);
}

static mpfr_t r27720, r27721, r27722, r27723, r27724, r27725, r27726, r27727, r27728, r27729, r27730, r27731, r27732, r27733, r27734, r27735, r27736, r27737, r27738, r27739, r27740, r27741, r27742, r27743, r27744, r27745, r27746, r27747, r27748;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r27720);
        mpfr_init_set_str(r27721, "3.9501795571041663e+151", 10, MPFR_RNDN);
        mpfr_init(r27722);
        mpfr_init(r27723);
        mpfr_init(r27724);
        mpfr_init(r27725);
        mpfr_init(r27726);
        mpfr_init_set_str(r27727, "10", 10, MPFR_RNDN);
        mpfr_init(r27728);
        mpfr_init(r27729);
        mpfr_init_set_str(r27730, "1", 10, MPFR_RNDN);
        mpfr_init(r27731);
        mpfr_init(r27732);
        mpfr_init(r27733);
        mpfr_init(r27734);
        mpfr_init(r27735);
        mpfr_init(r27736);
        mpfr_init(r27737);
        mpfr_init(r27738);
        mpfr_init(r27739);
        mpfr_init(r27740);
        mpfr_init(r27741);
        mpfr_init(r27742);
        mpfr_init(r27743);
        mpfr_init(r27744);
        mpfr_init(r27745);
        mpfr_init(r27746);
        mpfr_init(r27747);
        mpfr_init(r27748);
}

double f_dm(double a, double k, double m) {
        mpfr_set_d(r27720, k, MPFR_RNDN);
        ;
        mpfr_set_si(r27722, mpfr_cmp(r27720, r27721) <= 0, MPFR_RNDN);
        mpfr_set_d(r27723, m, MPFR_RNDN);
        mpfr_pow(r27724, r27720, r27723, MPFR_RNDN);
        mpfr_set_d(r27725, a, MPFR_RNDN);
        mpfr_mul(r27726, r27724, r27725, MPFR_RNDN);
        ;
        mpfr_add(r27728, r27727, r27720, MPFR_RNDN);
        mpfr_mul(r27729, r27720, r27728, MPFR_RNDN);
        ;
        mpfr_add(r27731, r27729, r27730, MPFR_RNDN);
        mpfr_sqrt(r27732, r27731, MPFR_RNDN);
        mpfr_div(r27733, r27726, r27732, MPFR_RNDN);
        mpfr_mul(r27734, r27727, r27720, MPFR_RNDN);
        mpfr_add(r27735, r27730, r27734, MPFR_RNDN);
        mpfr_mul(r27736, r27720, r27720, MPFR_RNDN);
        mpfr_add(r27737, r27735, r27736, MPFR_RNDN);
        mpfr_sqrt(r27738, r27737, MPFR_RNDN);
        mpfr_div(r27739, r27733, r27738, MPFR_RNDN);
        mpfr_neg(r27740, r27723, MPFR_RNDN);
        mpfr_pow(r27741, r27720, r27740, MPFR_RNDN);
        mpfr_div(r27742, r27741, r27725, MPFR_RNDN);
        mpfr_div(r27743, r27720, r27725, MPFR_RNDN);
        mpfr_div(r27744, r27743, r27724, MPFR_RNDN);
        mpfr_mul(r27745, r27744, r27728, MPFR_RNDN);
        mpfr_add(r27746, r27742, r27745, MPFR_RNDN);
        mpfr_div(r27747, r27730, r27746, MPFR_RNDN);
        if (mpfr_get_si(r27722, MPFR_RNDN)) { mpfr_set(r27748, r27739, MPFR_RNDN); } else { mpfr_set(r27748, r27747, MPFR_RNDN); };
        return mpfr_get_d(r27748, MPFR_RNDN);
}

