#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 r11022 = a;
        float r11023 = k;
        float r11024 = m;
        float r11025 = pow(r11023, r11024);
        float r11026 = r11022 * r11025;
        float r11027 = 1;
        float r11028 = 10;
        float r11029 = r11028 * r11023;
        float r11030 = r11027 + r11029;
        float r11031 = r11023 * r11023;
        float r11032 = r11030 + r11031;
        float r11033 = r11026 / r11032;
        return r11033;
}

double f_id(double a, double k, double m) {
        double r11034 = a;
        double r11035 = k;
        double r11036 = m;
        double r11037 = pow(r11035, r11036);
        double r11038 = r11034 * r11037;
        double r11039 = 1;
        double r11040 = 10;
        double r11041 = r11040 * r11035;
        double r11042 = r11039 + r11041;
        double r11043 = r11035 * r11035;
        double r11044 = r11042 + r11043;
        double r11045 = r11038 / r11044;
        return r11045;
}


double f_of(float a, float k, float m) {
        float r11046 = k;
        float r11047 = 1.4326697182135415e+31;
        bool r11048 = r11046 <= r11047;
        float r11049 = m;
        float r11050 = pow(r11046, r11049);
        float r11051 = cbrt(r11050);
        float r11052 = r11051 * r11051;
        float r11053 = a;
        float r11054 = r11051 * r11053;
        float r11055 = r11052 * r11054;
        float r11056 = 1;
        float r11057 = 10;
        float r11058 = r11057 + r11046;
        float r11059 = r11046 * r11058;
        float r11060 = r11056 + r11059;
        float r11061 = r11055 / r11060;
        float r11062 = 101;
        float r11063 = r11062 * r11053;
        float r11064 = 4;
        float r11065 = pow(r11046, r11064);
        float r11066 = r11065 / r11050;
        float r11067 = r11063 / r11066;
        float r11068 = r11053 / r11046;
        float r11069 = r11068 / r11046;
        float r11070 = r11046 / r11057;
        float r11071 = r11050 / r11070;
        float r11072 = r11050 + r11071;
        float r11073 = r11069 * r11072;
        float r11074 = r11067 + r11073;
        float r11075 = r11048 ? r11061 : r11074;
        return r11075;
}

double f_od(double a, double k, double m) {
        double r11076 = k;
        double r11077 = 1.4326697182135415e+31;
        bool r11078 = r11076 <= r11077;
        double r11079 = m;
        double r11080 = pow(r11076, r11079);
        double r11081 = cbrt(r11080);
        double r11082 = r11081 * r11081;
        double r11083 = a;
        double r11084 = r11081 * r11083;
        double r11085 = r11082 * r11084;
        double r11086 = 1;
        double r11087 = 10;
        double r11088 = r11087 + r11076;
        double r11089 = r11076 * r11088;
        double r11090 = r11086 + r11089;
        double r11091 = r11085 / r11090;
        double r11092 = 101;
        double r11093 = r11092 * r11083;
        double r11094 = 4;
        double r11095 = pow(r11076, r11094);
        double r11096 = r11095 / r11080;
        double r11097 = r11093 / r11096;
        double r11098 = r11083 / r11076;
        double r11099 = r11098 / r11076;
        double r11100 = r11076 / r11087;
        double r11101 = r11080 / r11100;
        double r11102 = r11080 + r11101;
        double r11103 = r11099 * r11102;
        double r11104 = r11097 + r11103;
        double r11105 = r11078 ? r11091 : r11104;
        return r11105;
}

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 r11106, r11107, r11108, r11109, r11110, r11111, r11112, r11113, r11114, r11115, r11116, r11117;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r11106);
        mpfr_init(r11107);
        mpfr_init(r11108);
        mpfr_init(r11109);
        mpfr_init(r11110);
        mpfr_init_set_str(r11111, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r11112, "10", 10, MPFR_RNDN);
        mpfr_init(r11113);
        mpfr_init(r11114);
        mpfr_init(r11115);
        mpfr_init(r11116);
        mpfr_init(r11117);
}

double f_im(double a, double k, double m) {
        mpfr_set_d(r11106, a, MPFR_RNDN);
        mpfr_set_d(r11107, k, MPFR_RNDN);
        mpfr_set_d(r11108, m, MPFR_RNDN);
        mpfr_pow(r11109, r11107, r11108, MPFR_RNDN);
        mpfr_mul(r11110, r11106, r11109, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r11113, r11112, r11107, MPFR_RNDN);
        mpfr_add(r11114, r11111, r11113, MPFR_RNDN);
        mpfr_mul(r11115, r11107, r11107, MPFR_RNDN);
        mpfr_add(r11116, r11114, r11115, MPFR_RNDN);
        mpfr_div(r11117, r11110, r11116, MPFR_RNDN);
        return mpfr_get_d(r11117, MPFR_RNDN);
}

static mpfr_t r11118, r11119, r11120, r11121, 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, r11147;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r11118);
        mpfr_init_set_str(r11119, "1.4326697182135415e+31", 10, MPFR_RNDN);
        mpfr_init(r11120);
        mpfr_init(r11121);
        mpfr_init(r11122);
        mpfr_init(r11123);
        mpfr_init(r11124);
        mpfr_init(r11125);
        mpfr_init(r11126);
        mpfr_init(r11127);
        mpfr_init_set_str(r11128, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r11129, "10", 10, MPFR_RNDN);
        mpfr_init(r11130);
        mpfr_init(r11131);
        mpfr_init(r11132);
        mpfr_init(r11133);
        mpfr_init_set_str(r11134, "101", 10, MPFR_RNDN);
        mpfr_init(r11135);
        mpfr_init_set_str(r11136, "4", 10, MPFR_RNDN);
        mpfr_init(r11137);
        mpfr_init(r11138);
        mpfr_init(r11139);
        mpfr_init(r11140);
        mpfr_init(r11141);
        mpfr_init(r11142);
        mpfr_init(r11143);
        mpfr_init(r11144);
        mpfr_init(r11145);
        mpfr_init(r11146);
        mpfr_init(r11147);
}

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

static mpfr_t r11148, r11149, r11150, r11151, r11152, r11153, r11154, r11155, r11156, r11157, r11158, r11159, r11160, r11161, r11162, r11163, r11164, r11165, r11166, r11167, r11168, r11169, r11170, r11171, r11172, r11173, r11174, r11175, r11176, r11177;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r11148);
        mpfr_init_set_str(r11149, "1.4326697182135415e+31", 10, MPFR_RNDN);
        mpfr_init(r11150);
        mpfr_init(r11151);
        mpfr_init(r11152);
        mpfr_init(r11153);
        mpfr_init(r11154);
        mpfr_init(r11155);
        mpfr_init(r11156);
        mpfr_init(r11157);
        mpfr_init_set_str(r11158, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r11159, "10", 10, MPFR_RNDN);
        mpfr_init(r11160);
        mpfr_init(r11161);
        mpfr_init(r11162);
        mpfr_init(r11163);
        mpfr_init_set_str(r11164, "101", 10, MPFR_RNDN);
        mpfr_init(r11165);
        mpfr_init_set_str(r11166, "4", 10, MPFR_RNDN);
        mpfr_init(r11167);
        mpfr_init(r11168);
        mpfr_init(r11169);
        mpfr_init(r11170);
        mpfr_init(r11171);
        mpfr_init(r11172);
        mpfr_init(r11173);
        mpfr_init(r11174);
        mpfr_init(r11175);
        mpfr_init(r11176);
        mpfr_init(r11177);
}

double f_dm(double a, double k, double m) {
        mpfr_set_d(r11148, k, MPFR_RNDN);
        ;
        mpfr_set_si(r11150, mpfr_cmp(r11148, r11149) <= 0, MPFR_RNDN);
        mpfr_set_d(r11151, m, MPFR_RNDN);
        mpfr_pow(r11152, r11148, r11151, MPFR_RNDN);
        mpfr_cbrt(r11153, r11152, MPFR_RNDN);
        mpfr_mul(r11154, r11153, r11153, MPFR_RNDN);
        mpfr_set_d(r11155, a, MPFR_RNDN);
        mpfr_mul(r11156, r11153, r11155, MPFR_RNDN);
        mpfr_mul(r11157, r11154, r11156, MPFR_RNDN);
        ;
        ;
        mpfr_add(r11160, r11159, r11148, MPFR_RNDN);
        mpfr_mul(r11161, r11148, r11160, MPFR_RNDN);
        mpfr_add(r11162, r11158, r11161, MPFR_RNDN);
        mpfr_div(r11163, r11157, r11162, MPFR_RNDN);
        ;
        mpfr_mul(r11165, r11164, r11155, MPFR_RNDN);
        ;
        mpfr_pow(r11167, r11148, r11166, MPFR_RNDN);
        mpfr_div(r11168, r11167, r11152, MPFR_RNDN);
        mpfr_div(r11169, r11165, r11168, MPFR_RNDN);
        mpfr_div(r11170, r11155, r11148, MPFR_RNDN);
        mpfr_div(r11171, r11170, r11148, MPFR_RNDN);
        mpfr_div(r11172, r11148, r11159, MPFR_RNDN);
        mpfr_div(r11173, r11152, r11172, MPFR_RNDN);
        mpfr_add(r11174, r11152, r11173, MPFR_RNDN);
        mpfr_mul(r11175, r11171, r11174, MPFR_RNDN);
        mpfr_add(r11176, r11169, r11175, MPFR_RNDN);
        if (mpfr_get_si(r11150, MPFR_RNDN)) { mpfr_set(r11177, r11163, MPFR_RNDN); } else { mpfr_set(r11177, r11176, MPFR_RNDN); };
        return mpfr_get_d(r11177, MPFR_RNDN);
}

