#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 r11011 = a;
        float r11012 = k;
        float r11013 = m;
        float r11014 = pow(r11012, r11013);
        float r11015 = r11011 * r11014;
        float r11016 = 1;
        float r11017 = 10;
        float r11018 = r11017 * r11012;
        float r11019 = r11016 + r11018;
        float r11020 = r11012 * r11012;
        float r11021 = r11019 + r11020;
        float r11022 = r11015 / r11021;
        return r11022;
}

double f_id(double a, double k, double m) {
        double r11023 = a;
        double r11024 = k;
        double r11025 = m;
        double r11026 = pow(r11024, r11025);
        double r11027 = r11023 * r11026;
        double r11028 = 1;
        double r11029 = 10;
        double r11030 = r11029 * r11024;
        double r11031 = r11028 + r11030;
        double r11032 = r11024 * r11024;
        double r11033 = r11031 + r11032;
        double r11034 = r11027 / r11033;
        return r11034;
}


double f_of(float a, float k, float m) {
        float r11035 = k;
        float r11036 = 3.343840321626663e+101;
        bool r11037 = r11035 <= r11036;
        float r11038 = a;
        float r11039 = m;
        float r11040 = pow(r11035, r11039);
        float r11041 = 10;
        float r11042 = r11035 + r11041;
        float r11043 = 1;
        float r11044 = fma(r11042, r11035, r11043);
        float r11045 = r11040 / r11044;
        float r11046 = r11038 * r11045;
        float r11047 = r11038 / r11035;
        float r11048 = -r11047;
        float r11049 = r11041 / r11035;
        float r11050 = fma(r11048, r11049, r11047);
        float r11051 = r11040 / r11035;
        float r11052 = 4;
        float r11053 = pow(r11035, r11052);
        float r11054 = 99;
        float r11055 = r11054 * r11038;
        float r11056 = r11053 / r11055;
        float r11057 = r11040 / r11056;
        float r11058 = fma(r11050, r11051, r11057);
        float r11059 = r11037 ? r11046 : r11058;
        return r11059;
}

double f_od(double a, double k, double m) {
        double r11060 = k;
        double r11061 = 3.343840321626663e+101;
        bool r11062 = r11060 <= r11061;
        double r11063 = a;
        double r11064 = m;
        double r11065 = pow(r11060, r11064);
        double r11066 = 10;
        double r11067 = r11060 + r11066;
        double r11068 = 1;
        double r11069 = fma(r11067, r11060, r11068);
        double r11070 = r11065 / r11069;
        double r11071 = r11063 * r11070;
        double r11072 = r11063 / r11060;
        double r11073 = -r11072;
        double r11074 = r11066 / r11060;
        double r11075 = fma(r11073, r11074, r11072);
        double r11076 = r11065 / r11060;
        double r11077 = 4;
        double r11078 = pow(r11060, r11077);
        double r11079 = 99;
        double r11080 = r11079 * r11063;
        double r11081 = r11078 / r11080;
        double r11082 = r11065 / r11081;
        double r11083 = fma(r11075, r11076, r11082);
        double r11084 = r11062 ? r11071 : r11083;
        return r11084;
}

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 r11085, r11086, r11087, r11088, r11089, r11090, r11091, r11092, r11093, r11094, r11095, r11096;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r11085);
        mpfr_init(r11086);
        mpfr_init(r11087);
        mpfr_init(r11088);
        mpfr_init(r11089);
        mpfr_init_set_str(r11090, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r11091, "10", 10, MPFR_RNDN);
        mpfr_init(r11092);
        mpfr_init(r11093);
        mpfr_init(r11094);
        mpfr_init(r11095);
        mpfr_init(r11096);
}

double f_im(double a, double k, double m) {
        mpfr_set_d(r11085, a, MPFR_RNDN);
        mpfr_set_d(r11086, k, MPFR_RNDN);
        mpfr_set_d(r11087, m, MPFR_RNDN);
        mpfr_pow(r11088, r11086, r11087, MPFR_RNDN);
        mpfr_mul(r11089, r11085, r11088, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r11092, r11091, r11086, MPFR_RNDN);
        mpfr_add(r11093, r11090, r11092, MPFR_RNDN);
        mpfr_mul(r11094, r11086, r11086, MPFR_RNDN);
        mpfr_add(r11095, r11093, r11094, MPFR_RNDN);
        mpfr_div(r11096, r11089, r11095, MPFR_RNDN);
        return mpfr_get_d(r11096, MPFR_RNDN);
}

static mpfr_t r11097, r11098, r11099, r11100, r11101, r11102, r11103, r11104, r11105, r11106, r11107, r11108, r11109, r11110, r11111, r11112, r11113, r11114, r11115, r11116, r11117, r11118, r11119, r11120, r11121;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11097);
        mpfr_init_set_str(r11098, "3.343840321626663e+101", 10, MPFR_RNDN);
        mpfr_init(r11099);
        mpfr_init(r11100);
        mpfr_init(r11101);
        mpfr_init(r11102);
        mpfr_init_set_str(r11103, "10", 10, MPFR_RNDN);
        mpfr_init(r11104);
        mpfr_init_set_str(r11105, "1", 10, MPFR_RNDN);
        mpfr_init(r11106);
        mpfr_init(r11107);
        mpfr_init(r11108);
        mpfr_init(r11109);
        mpfr_init(r11110);
        mpfr_init(r11111);
        mpfr_init(r11112);
        mpfr_init(r11113);
        mpfr_init_set_str(r11114, "4", 10, MPFR_RNDN);
        mpfr_init(r11115);
        mpfr_init_set_str(r11116, "99", 10, MPFR_RNDN);
        mpfr_init(r11117);
        mpfr_init(r11118);
        mpfr_init(r11119);
        mpfr_init(r11120);
        mpfr_init(r11121);
}

double f_fm(double a, double k, double m) {
        mpfr_set_d(r11097, k, MPFR_RNDN);
        ;
        mpfr_set_si(r11099, mpfr_cmp(r11097, r11098) <= 0, MPFR_RNDN);
        mpfr_set_d(r11100, a, MPFR_RNDN);
        mpfr_set_d(r11101, m, MPFR_RNDN);
        mpfr_pow(r11102, r11097, r11101, MPFR_RNDN);
        ;
        mpfr_add(r11104, r11097, r11103, MPFR_RNDN);
        ;
        mpfr_fma(r11106, r11104, r11097, r11105, MPFR_RNDN);
        mpfr_div(r11107, r11102, r11106, MPFR_RNDN);
        mpfr_mul(r11108, r11100, r11107, MPFR_RNDN);
        mpfr_div(r11109, r11100, r11097, MPFR_RNDN);
        mpfr_neg(r11110, r11109, MPFR_RNDN);
        mpfr_div(r11111, r11103, r11097, MPFR_RNDN);
        mpfr_fma(r11112, r11110, r11111, r11109, MPFR_RNDN);
        mpfr_div(r11113, r11102, r11097, MPFR_RNDN);
        ;
        mpfr_pow(r11115, r11097, r11114, MPFR_RNDN);
        ;
        mpfr_mul(r11117, r11116, r11100, MPFR_RNDN);
        mpfr_div(r11118, r11115, r11117, MPFR_RNDN);
        mpfr_div(r11119, r11102, r11118, MPFR_RNDN);
        mpfr_fma(r11120, r11112, r11113, r11119, MPFR_RNDN);
        if (mpfr_get_si(r11099, MPFR_RNDN)) { mpfr_set(r11121, r11108, MPFR_RNDN); } else { mpfr_set(r11121, r11120, MPFR_RNDN); };
        return mpfr_get_d(r11121, MPFR_RNDN);
}

static mpfr_t r11122, r11123, r11124, r11125, r11126, r11127, r11128, r11129, r11130, r11131, r11132, r11133, r11134, r11135, r11136, r11137, r11138, r11139, r11140, r11141, r11142, r11143, r11144, r11145, r11146;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r11122);
        mpfr_init_set_str(r11123, "3.343840321626663e+101", 10, MPFR_RNDN);
        mpfr_init(r11124);
        mpfr_init(r11125);
        mpfr_init(r11126);
        mpfr_init(r11127);
        mpfr_init_set_str(r11128, "10", 10, MPFR_RNDN);
        mpfr_init(r11129);
        mpfr_init_set_str(r11130, "1", 10, MPFR_RNDN);
        mpfr_init(r11131);
        mpfr_init(r11132);
        mpfr_init(r11133);
        mpfr_init(r11134);
        mpfr_init(r11135);
        mpfr_init(r11136);
        mpfr_init(r11137);
        mpfr_init(r11138);
        mpfr_init_set_str(r11139, "4", 10, MPFR_RNDN);
        mpfr_init(r11140);
        mpfr_init_set_str(r11141, "99", 10, MPFR_RNDN);
        mpfr_init(r11142);
        mpfr_init(r11143);
        mpfr_init(r11144);
        mpfr_init(r11145);
        mpfr_init(r11146);
}

double f_dm(double a, double k, double m) {
        mpfr_set_d(r11122, k, MPFR_RNDN);
        ;
        mpfr_set_si(r11124, mpfr_cmp(r11122, r11123) <= 0, MPFR_RNDN);
        mpfr_set_d(r11125, a, MPFR_RNDN);
        mpfr_set_d(r11126, m, MPFR_RNDN);
        mpfr_pow(r11127, r11122, r11126, MPFR_RNDN);
        ;
        mpfr_add(r11129, r11122, r11128, MPFR_RNDN);
        ;
        mpfr_fma(r11131, r11129, r11122, r11130, MPFR_RNDN);
        mpfr_div(r11132, r11127, r11131, MPFR_RNDN);
        mpfr_mul(r11133, r11125, r11132, MPFR_RNDN);
        mpfr_div(r11134, r11125, r11122, MPFR_RNDN);
        mpfr_neg(r11135, r11134, MPFR_RNDN);
        mpfr_div(r11136, r11128, r11122, MPFR_RNDN);
        mpfr_fma(r11137, r11135, r11136, r11134, MPFR_RNDN);
        mpfr_div(r11138, r11127, r11122, MPFR_RNDN);
        ;
        mpfr_pow(r11140, r11122, r11139, MPFR_RNDN);
        ;
        mpfr_mul(r11142, r11141, r11125, MPFR_RNDN);
        mpfr_div(r11143, r11140, r11142, MPFR_RNDN);
        mpfr_div(r11144, r11127, r11143, MPFR_RNDN);
        mpfr_fma(r11145, r11137, r11138, r11144, MPFR_RNDN);
        if (mpfr_get_si(r11124, MPFR_RNDN)) { mpfr_set(r11146, r11133, MPFR_RNDN); } else { mpfr_set(r11146, r11145, MPFR_RNDN); };
        return mpfr_get_d(r11146, MPFR_RNDN);
}

