#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 r31231 = a;
        float r31232 = k;
        float r31233 = m;
        float r31234 = pow(r31232, r31233);
        float r31235 = r31231 * r31234;
        float r31236 = 1.0f;
        float r31237 = 10.0f;
        float r31238 = r31237 * r31232;
        float r31239 = r31236 + r31238;
        float r31240 = r31232 * r31232;
        float r31241 = r31239 + r31240;
        float r31242 = r31235 / r31241;
        return r31242;
}

double f_id(double a, double k, double m) {
        double r31243 = a;
        double r31244 = k;
        double r31245 = m;
        double r31246 = pow(r31244, r31245);
        double r31247 = r31243 * r31246;
        double r31248 = 1.0;
        double r31249 = 10.0;
        double r31250 = r31249 * r31244;
        double r31251 = r31248 + r31250;
        double r31252 = r31244 * r31244;
        double r31253 = r31251 + r31252;
        double r31254 = r31247 / r31253;
        return r31254;
}


double f_of(float a, float k, float m) {
        float r31255 = a;
        float r31256 = 1.0f;
        float r31257 = r31255 / r31256;
        float r31258 = k;
        float r31259 = m;
        float r31260 = pow(r31258, r31259);
        float r31261 = 10.0f;
        float r31262 = r31261 + r31258;
        float r31263 = r31262 * r31258;
        float r31264 = r31256 + r31263;
        float r31265 = r31260 / r31264;
        float r31266 = r31257 * r31265;
        return r31266;
}

double f_od(double a, double k, double m) {
        double r31267 = a;
        double r31268 = 1.0;
        double r31269 = r31267 / r31268;
        double r31270 = k;
        double r31271 = m;
        double r31272 = pow(r31270, r31271);
        double r31273 = 10.0;
        double r31274 = r31273 + r31270;
        double r31275 = r31274 * r31270;
        double r31276 = r31268 + r31275;
        double r31277 = r31272 / r31276;
        double r31278 = r31269 * r31277;
        return r31278;
}

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 r31279, r31280, r31281, r31282, r31283, r31284, r31285, r31286, r31287, r31288, r31289, r31290;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(144);
        mpfr_init(r31279);
        mpfr_init(r31280);
        mpfr_init(r31281);
        mpfr_init(r31282);
        mpfr_init(r31283);
        mpfr_init_set_str(r31284, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r31285, "10", 10, MPFR_RNDN);
        mpfr_init(r31286);
        mpfr_init(r31287);
        mpfr_init(r31288);
        mpfr_init(r31289);
        mpfr_init(r31290);
}

double f_im(double a, double k, double m) {
        mpfr_set_d(r31279, a, MPFR_RNDN);
        mpfr_set_d(r31280, k, MPFR_RNDN);
        mpfr_set_d(r31281, m, MPFR_RNDN);
        mpfr_pow(r31282, r31280, r31281, MPFR_RNDN);
        mpfr_mul(r31283, r31279, r31282, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r31286, r31285, r31280, MPFR_RNDN);
        mpfr_add(r31287, r31284, r31286, MPFR_RNDN);
        mpfr_sqr(r31288, r31280, MPFR_RNDN);
        mpfr_add(r31289, r31287, r31288, MPFR_RNDN);
        mpfr_div(r31290, r31283, r31289, MPFR_RNDN);
        return mpfr_get_d(r31290, MPFR_RNDN);
}

static mpfr_t r31291, r31292, r31293, r31294, r31295, r31296, r31297, r31298, r31299, r31300, r31301, r31302;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(144);
        mpfr_init(r31291);
        mpfr_init_set_str(r31292, "1", 10, MPFR_RNDN);
        mpfr_init(r31293);
        mpfr_init(r31294);
        mpfr_init(r31295);
        mpfr_init(r31296);
        mpfr_init_set_str(r31297, "10", 10, MPFR_RNDN);
        mpfr_init(r31298);
        mpfr_init(r31299);
        mpfr_init(r31300);
        mpfr_init(r31301);
        mpfr_init(r31302);
}

double f_fm(double a, double k, double m) {
        mpfr_set_d(r31291, a, MPFR_RNDN);
        ;
        mpfr_div(r31293, r31291, r31292, MPFR_RNDN);
        mpfr_set_d(r31294, k, MPFR_RNDN);
        mpfr_set_d(r31295, m, MPFR_RNDN);
        mpfr_pow(r31296, r31294, r31295, MPFR_RNDN);
        ;
        mpfr_add(r31298, r31297, r31294, MPFR_RNDN);
        mpfr_mul(r31299, r31298, r31294, MPFR_RNDN);
        mpfr_add(r31300, r31292, r31299, MPFR_RNDN);
        mpfr_div(r31301, r31296, r31300, MPFR_RNDN);
        mpfr_mul(r31302, r31293, r31301, MPFR_RNDN);
        return mpfr_get_d(r31302, MPFR_RNDN);
}

static mpfr_t r31303, r31304, r31305, r31306, r31307, r31308, r31309, r31310, r31311, r31312, r31313, r31314;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(144);
        mpfr_init(r31303);
        mpfr_init_set_str(r31304, "1", 10, MPFR_RNDN);
        mpfr_init(r31305);
        mpfr_init(r31306);
        mpfr_init(r31307);
        mpfr_init(r31308);
        mpfr_init_set_str(r31309, "10", 10, MPFR_RNDN);
        mpfr_init(r31310);
        mpfr_init(r31311);
        mpfr_init(r31312);
        mpfr_init(r31313);
        mpfr_init(r31314);
}

double f_dm(double a, double k, double m) {
        mpfr_set_d(r31303, a, MPFR_RNDN);
        ;
        mpfr_div(r31305, r31303, r31304, MPFR_RNDN);
        mpfr_set_d(r31306, k, MPFR_RNDN);
        mpfr_set_d(r31307, m, MPFR_RNDN);
        mpfr_pow(r31308, r31306, r31307, MPFR_RNDN);
        ;
        mpfr_add(r31310, r31309, r31306, MPFR_RNDN);
        mpfr_mul(r31311, r31310, r31306, MPFR_RNDN);
        mpfr_add(r31312, r31304, r31311, MPFR_RNDN);
        mpfr_div(r31313, r31308, r31312, MPFR_RNDN);
        mpfr_mul(r31314, r31305, r31313, MPFR_RNDN);
        return mpfr_get_d(r31314, MPFR_RNDN);
}

