#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 r11017 = a;
        float r11018 = k;
        float r11019 = m;
        float r11020 = pow(r11018, r11019);
        float r11021 = r11017 * r11020;
        float r11022 = 1.0f;
        float r11023 = 10.0f;
        float r11024 = r11023 * r11018;
        float r11025 = r11022 + r11024;
        float r11026 = r11018 * r11018;
        float r11027 = r11025 + r11026;
        float r11028 = r11021 / r11027;
        return r11028;
}

double f_id(double a, double k, double m) {
        double r11029 = a;
        double r11030 = k;
        double r11031 = m;
        double r11032 = pow(r11030, r11031);
        double r11033 = r11029 * r11032;
        double r11034 = 1.0;
        double r11035 = 10.0;
        double r11036 = r11035 * r11030;
        double r11037 = r11034 + r11036;
        double r11038 = r11030 * r11030;
        double r11039 = r11037 + r11038;
        double r11040 = r11033 / r11039;
        return r11040;
}


double f_of(float a, float k, float m) {
        float r11041 = k;
        float r11042 = 121296497.93342482f;
        bool r11043 = r11041 <= r11042;
        float r11044 = 1.0f;
        float r11045 = r11041 * r11041;
        float r11046 = 10.0f;
        float r11047 = r11046 * r11041;
        float r11048 = r11044 + r11047;
        float r11049 = r11045 + r11048;
        float r11050 = m;
        float r11051 = pow(r11041, r11050);
        float r11052 = a;
        float r11053 = r11051 * r11052;
        float r11054 = r11049 / r11053;
        float r11055 = r11044 / r11054;
        float r11056 = 99.0f;
        float r11057 = r11052 * r11056;
        float r11058 = 4.0f;
        float r11059 = pow(r11041, r11058);
        float r11060 = r11051 / r11059;
        float r11061 = r11057 * r11060;
        float r11062 = r11051 / r11041;
        float r11063 = r11052 / r11041;
        float r11064 = r11046 / r11041;
        float r11065 = r11063 * r11064;
        float r11066 = r11063 - r11065;
        float r11067 = r11062 * r11066;
        float r11068 = r11061 + r11067;
        float r11069 = r11043 ? r11055 : r11068;
        return r11069;
}

double f_od(double a, double k, double m) {
        double r11070 = k;
        double r11071 = 121296497.93342482;
        bool r11072 = r11070 <= r11071;
        double r11073 = 1.0;
        double r11074 = r11070 * r11070;
        double r11075 = 10.0;
        double r11076 = r11075 * r11070;
        double r11077 = r11073 + r11076;
        double r11078 = r11074 + r11077;
        double r11079 = m;
        double r11080 = pow(r11070, r11079);
        double r11081 = a;
        double r11082 = r11080 * r11081;
        double r11083 = r11078 / r11082;
        double r11084 = r11073 / r11083;
        double r11085 = 99.0;
        double r11086 = r11081 * r11085;
        double r11087 = 4.0;
        double r11088 = pow(r11070, r11087);
        double r11089 = r11080 / r11088;
        double r11090 = r11086 * r11089;
        double r11091 = r11080 / r11070;
        double r11092 = r11081 / r11070;
        double r11093 = r11075 / r11070;
        double r11094 = r11092 * r11093;
        double r11095 = r11092 - r11094;
        double r11096 = r11091 * r11095;
        double r11097 = r11090 + r11096;
        double r11098 = r11072 ? r11084 : r11097;
        return r11098;
}

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 r11099, r11100, r11101, r11102, r11103, r11104, r11105, r11106, r11107, r11108, r11109, r11110;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r11099);
        mpfr_init(r11100);
        mpfr_init(r11101);
        mpfr_init(r11102);
        mpfr_init(r11103);
        mpfr_init_set_str(r11104, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r11105, "10", 10, MPFR_RNDN);
        mpfr_init(r11106);
        mpfr_init(r11107);
        mpfr_init(r11108);
        mpfr_init(r11109);
        mpfr_init(r11110);
}

double f_im(double a, double k, double m) {
        mpfr_set_d(r11099, a, MPFR_RNDN);
        mpfr_set_d(r11100, k, MPFR_RNDN);
        mpfr_set_d(r11101, m, MPFR_RNDN);
        mpfr_pow(r11102, r11100, r11101, MPFR_RNDN);
        mpfr_mul(r11103, r11099, r11102, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r11106, r11105, r11100, MPFR_RNDN);
        mpfr_add(r11107, r11104, r11106, MPFR_RNDN);
        mpfr_mul(r11108, r11100, r11100, MPFR_RNDN);
        mpfr_add(r11109, r11107, r11108, MPFR_RNDN);
        mpfr_div(r11110, r11103, r11109, MPFR_RNDN);
        return mpfr_get_d(r11110, MPFR_RNDN);
}

static mpfr_t r11111, r11112, r11113, r11114, r11115, r11116, r11117, r11118, r11119, r11120, r11121, r11122, r11123, r11124, r11125, r11126, r11127, r11128, r11129, r11130, r11131, r11132, r11133, r11134, r11135, r11136, r11137, r11138, r11139;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r11111);
        mpfr_init_set_str(r11112, "121296497.93342482", 10, MPFR_RNDN);
        mpfr_init(r11113);
        mpfr_init_set_str(r11114, "1", 10, MPFR_RNDN);
        mpfr_init(r11115);
        mpfr_init_set_str(r11116, "10", 10, MPFR_RNDN);
        mpfr_init(r11117);
        mpfr_init(r11118);
        mpfr_init(r11119);
        mpfr_init(r11120);
        mpfr_init(r11121);
        mpfr_init(r11122);
        mpfr_init(r11123);
        mpfr_init(r11124);
        mpfr_init(r11125);
        mpfr_init_set_str(r11126, "99", 10, MPFR_RNDN);
        mpfr_init(r11127);
        mpfr_init_set_str(r11128, "4", 10, MPFR_RNDN);
        mpfr_init(r11129);
        mpfr_init(r11130);
        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(r11139);
}

double f_fm(double a, double k, double m) {
        mpfr_set_d(r11111, k, MPFR_RNDN);
        ;
        mpfr_set_si(r11113, mpfr_cmp(r11111, r11112) <= 0, MPFR_RNDN);
        ;
        mpfr_mul(r11115, r11111, r11111, MPFR_RNDN);
        ;
        mpfr_mul(r11117, r11116, r11111, MPFR_RNDN);
        mpfr_add(r11118, r11114, r11117, MPFR_RNDN);
        mpfr_add(r11119, r11115, r11118, MPFR_RNDN);
        mpfr_set_d(r11120, m, MPFR_RNDN);
        mpfr_pow(r11121, r11111, r11120, MPFR_RNDN);
        mpfr_set_d(r11122, a, MPFR_RNDN);
        mpfr_mul(r11123, r11121, r11122, MPFR_RNDN);
        mpfr_div(r11124, r11119, r11123, MPFR_RNDN);
        mpfr_div(r11125, r11114, r11124, MPFR_RNDN);
        ;
        mpfr_mul(r11127, r11122, r11126, MPFR_RNDN);
        ;
        mpfr_pow(r11129, r11111, r11128, MPFR_RNDN);
        mpfr_div(r11130, r11121, r11129, MPFR_RNDN);
        mpfr_mul(r11131, r11127, r11130, MPFR_RNDN);
        mpfr_div(r11132, r11121, r11111, MPFR_RNDN);
        mpfr_div(r11133, r11122, r11111, MPFR_RNDN);
        mpfr_div(r11134, r11116, r11111, MPFR_RNDN);
        mpfr_mul(r11135, r11133, r11134, MPFR_RNDN);
        mpfr_sub(r11136, r11133, r11135, MPFR_RNDN);
        mpfr_mul(r11137, r11132, r11136, MPFR_RNDN);
        mpfr_add(r11138, r11131, r11137, MPFR_RNDN);
        if (mpfr_get_si(r11113, MPFR_RNDN)) { mpfr_set(r11139, r11125, MPFR_RNDN); } else { mpfr_set(r11139, r11138, MPFR_RNDN); };
        return mpfr_get_d(r11139, MPFR_RNDN);
}

static mpfr_t r11140, r11141, r11142, r11143, r11144, r11145, r11146, r11147, r11148, r11149, r11150, r11151, r11152, r11153, r11154, r11155, r11156, r11157, r11158, r11159, r11160, r11161, r11162, r11163, r11164, r11165, r11166, r11167, r11168;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r11140);
        mpfr_init_set_str(r11141, "121296497.93342482", 10, MPFR_RNDN);
        mpfr_init(r11142);
        mpfr_init_set_str(r11143, "1", 10, MPFR_RNDN);
        mpfr_init(r11144);
        mpfr_init_set_str(r11145, "10", 10, MPFR_RNDN);
        mpfr_init(r11146);
        mpfr_init(r11147);
        mpfr_init(r11148);
        mpfr_init(r11149);
        mpfr_init(r11150);
        mpfr_init(r11151);
        mpfr_init(r11152);
        mpfr_init(r11153);
        mpfr_init(r11154);
        mpfr_init_set_str(r11155, "99", 10, MPFR_RNDN);
        mpfr_init(r11156);
        mpfr_init_set_str(r11157, "4", 10, MPFR_RNDN);
        mpfr_init(r11158);
        mpfr_init(r11159);
        mpfr_init(r11160);
        mpfr_init(r11161);
        mpfr_init(r11162);
        mpfr_init(r11163);
        mpfr_init(r11164);
        mpfr_init(r11165);
        mpfr_init(r11166);
        mpfr_init(r11167);
        mpfr_init(r11168);
}

double f_dm(double a, double k, double m) {
        mpfr_set_d(r11140, k, MPFR_RNDN);
        ;
        mpfr_set_si(r11142, mpfr_cmp(r11140, r11141) <= 0, MPFR_RNDN);
        ;
        mpfr_mul(r11144, r11140, r11140, MPFR_RNDN);
        ;
        mpfr_mul(r11146, r11145, r11140, MPFR_RNDN);
        mpfr_add(r11147, r11143, r11146, MPFR_RNDN);
        mpfr_add(r11148, r11144, r11147, MPFR_RNDN);
        mpfr_set_d(r11149, m, MPFR_RNDN);
        mpfr_pow(r11150, r11140, r11149, MPFR_RNDN);
        mpfr_set_d(r11151, a, MPFR_RNDN);
        mpfr_mul(r11152, r11150, r11151, MPFR_RNDN);
        mpfr_div(r11153, r11148, r11152, MPFR_RNDN);
        mpfr_div(r11154, r11143, r11153, MPFR_RNDN);
        ;
        mpfr_mul(r11156, r11151, r11155, MPFR_RNDN);
        ;
        mpfr_pow(r11158, r11140, r11157, MPFR_RNDN);
        mpfr_div(r11159, r11150, r11158, MPFR_RNDN);
        mpfr_mul(r11160, r11156, r11159, MPFR_RNDN);
        mpfr_div(r11161, r11150, r11140, MPFR_RNDN);
        mpfr_div(r11162, r11151, r11140, MPFR_RNDN);
        mpfr_div(r11163, r11145, r11140, MPFR_RNDN);
        mpfr_mul(r11164, r11162, r11163, MPFR_RNDN);
        mpfr_sub(r11165, r11162, r11164, MPFR_RNDN);
        mpfr_mul(r11166, r11161, r11165, MPFR_RNDN);
        mpfr_add(r11167, r11160, r11166, MPFR_RNDN);
        if (mpfr_get_si(r11142, MPFR_RNDN)) { mpfr_set(r11168, r11154, MPFR_RNDN); } else { mpfr_set(r11168, r11167, MPFR_RNDN); };
        return mpfr_get_d(r11168, MPFR_RNDN);
}

