#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 r10171 = a;
        float r10172 = k;
        float r10173 = m;
        float r10174 = pow(r10172, r10173);
        float r10175 = r10171 * r10174;
        float r10176 = 1.0f;
        float r10177 = 10.0f;
        float r10178 = r10177 * r10172;
        float r10179 = r10176 + r10178;
        float r10180 = r10172 * r10172;
        float r10181 = r10179 + r10180;
        float r10182 = r10175 / r10181;
        return r10182;
}

double f_id(double a, double k, double m) {
        double r10183 = a;
        double r10184 = k;
        double r10185 = m;
        double r10186 = pow(r10184, r10185);
        double r10187 = r10183 * r10186;
        double r10188 = 1.0;
        double r10189 = 10.0;
        double r10190 = r10189 * r10184;
        double r10191 = r10188 + r10190;
        double r10192 = r10184 * r10184;
        double r10193 = r10191 + r10192;
        double r10194 = r10187 / r10193;
        return r10194;
}


double f_of(float a, float k, float m) {
        float r10195 = k;
        float r10196 = 6.798605532547233e+153f;
        bool r10197 = r10195 <= r10196;
        float r10198 = m;
        float r10199 = pow(r10195, r10198);
        float r10200 = cbrt(r10199);
        float r10201 = r10200 * r10200;
        float r10202 = a;
        float r10203 = r10202 * r10200;
        float r10204 = r10201 * r10203;
        float r10205 = 10.0f;
        float r10206 = r10195 + r10205;
        float r10207 = r10206 * r10195;
        float r10208 = 1.0f;
        float r10209 = r10207 + r10208;
        float r10210 = r10204 / r10209;
        float r10211 = r10199 / r10195;
        float r10212 = r10202 / r10195;
        float r10213 = r10205 / r10195;
        float r10214 = r10213 * r10212;
        float r10215 = r10212 - r10214;
        float r10216 = r10211 * r10215;
        float r10217 = 4.0f;
        float r10218 = pow(r10195, r10217);
        float r10219 = r10199 / r10218;
        float r10220 = 99.0f;
        float r10221 = r10220 * r10202;
        float r10222 = r10219 * r10221;
        float r10223 = r10216 + r10222;
        float r10224 = r10197 ? r10210 : r10223;
        return r10224;
}

double f_od(double a, double k, double m) {
        double r10225 = k;
        double r10226 = 6.798605532547233e+153;
        bool r10227 = r10225 <= r10226;
        double r10228 = m;
        double r10229 = pow(r10225, r10228);
        double r10230 = cbrt(r10229);
        double r10231 = r10230 * r10230;
        double r10232 = a;
        double r10233 = r10232 * r10230;
        double r10234 = r10231 * r10233;
        double r10235 = 10.0;
        double r10236 = r10225 + r10235;
        double r10237 = r10236 * r10225;
        double r10238 = 1.0;
        double r10239 = r10237 + r10238;
        double r10240 = r10234 / r10239;
        double r10241 = r10229 / r10225;
        double r10242 = r10232 / r10225;
        double r10243 = r10235 / r10225;
        double r10244 = r10243 * r10242;
        double r10245 = r10242 - r10244;
        double r10246 = r10241 * r10245;
        double r10247 = 4.0;
        double r10248 = pow(r10225, r10247);
        double r10249 = r10229 / r10248;
        double r10250 = 99.0;
        double r10251 = r10250 * r10232;
        double r10252 = r10249 * r10251;
        double r10253 = r10246 + r10252;
        double r10254 = r10227 ? r10240 : r10253;
        return r10254;
}

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 r10255, r10256, r10257, r10258, r10259, r10260, r10261, r10262, r10263, r10264, r10265, r10266;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r10255);
        mpfr_init(r10256);
        mpfr_init(r10257);
        mpfr_init(r10258);
        mpfr_init(r10259);
        mpfr_init_set_str(r10260, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r10261, "10", 10, MPFR_RNDN);
        mpfr_init(r10262);
        mpfr_init(r10263);
        mpfr_init(r10264);
        mpfr_init(r10265);
        mpfr_init(r10266);
}

double f_im(double a, double k, double m) {
        mpfr_set_d(r10255, a, MPFR_RNDN);
        mpfr_set_d(r10256, k, MPFR_RNDN);
        mpfr_set_d(r10257, m, MPFR_RNDN);
        mpfr_pow(r10258, r10256, r10257, MPFR_RNDN);
        mpfr_mul(r10259, r10255, r10258, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r10262, r10261, r10256, MPFR_RNDN);
        mpfr_add(r10263, r10260, r10262, MPFR_RNDN);
        mpfr_mul(r10264, r10256, r10256, MPFR_RNDN);
        mpfr_add(r10265, r10263, r10264, MPFR_RNDN);
        mpfr_div(r10266, r10259, r10265, MPFR_RNDN);
        return mpfr_get_d(r10266, MPFR_RNDN);
}

static mpfr_t r10267, r10268, r10269, r10270, r10271, r10272, r10273, r10274, r10275, r10276, r10277, r10278, r10279, r10280, r10281, r10282, r10283, r10284, r10285, r10286, r10287, r10288, r10289, r10290, r10291, r10292, r10293, r10294, r10295, r10296;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r10267);
        mpfr_init_set_str(r10268, "6.798605532547233e+153", 10, MPFR_RNDN);
        mpfr_init(r10269);
        mpfr_init(r10270);
        mpfr_init(r10271);
        mpfr_init(r10272);
        mpfr_init(r10273);
        mpfr_init(r10274);
        mpfr_init(r10275);
        mpfr_init(r10276);
        mpfr_init_set_str(r10277, "10", 10, MPFR_RNDN);
        mpfr_init(r10278);
        mpfr_init(r10279);
        mpfr_init_set_str(r10280, "1", 10, MPFR_RNDN);
        mpfr_init(r10281);
        mpfr_init(r10282);
        mpfr_init(r10283);
        mpfr_init(r10284);
        mpfr_init(r10285);
        mpfr_init(r10286);
        mpfr_init(r10287);
        mpfr_init(r10288);
        mpfr_init_set_str(r10289, "4", 10, MPFR_RNDN);
        mpfr_init(r10290);
        mpfr_init(r10291);
        mpfr_init_set_str(r10292, "99", 10, MPFR_RNDN);
        mpfr_init(r10293);
        mpfr_init(r10294);
        mpfr_init(r10295);
        mpfr_init(r10296);
}

double f_fm(double a, double k, double m) {
        mpfr_set_d(r10267, k, MPFR_RNDN);
        ;
        mpfr_set_si(r10269, mpfr_cmp(r10267, r10268) <= 0, MPFR_RNDN);
        mpfr_set_d(r10270, m, MPFR_RNDN);
        mpfr_pow(r10271, r10267, r10270, MPFR_RNDN);
        mpfr_cbrt(r10272, r10271, MPFR_RNDN);
        mpfr_mul(r10273, r10272, r10272, MPFR_RNDN);
        mpfr_set_d(r10274, a, MPFR_RNDN);
        mpfr_mul(r10275, r10274, r10272, MPFR_RNDN);
        mpfr_mul(r10276, r10273, r10275, MPFR_RNDN);
        ;
        mpfr_add(r10278, r10267, r10277, MPFR_RNDN);
        mpfr_mul(r10279, r10278, r10267, MPFR_RNDN);
        ;
        mpfr_add(r10281, r10279, r10280, MPFR_RNDN);
        mpfr_div(r10282, r10276, r10281, MPFR_RNDN);
        mpfr_div(r10283, r10271, r10267, MPFR_RNDN);
        mpfr_div(r10284, r10274, r10267, MPFR_RNDN);
        mpfr_div(r10285, r10277, r10267, MPFR_RNDN);
        mpfr_mul(r10286, r10285, r10284, MPFR_RNDN);
        mpfr_sub(r10287, r10284, r10286, MPFR_RNDN);
        mpfr_mul(r10288, r10283, r10287, MPFR_RNDN);
        ;
        mpfr_pow(r10290, r10267, r10289, MPFR_RNDN);
        mpfr_div(r10291, r10271, r10290, MPFR_RNDN);
        ;
        mpfr_mul(r10293, r10292, r10274, MPFR_RNDN);
        mpfr_mul(r10294, r10291, r10293, MPFR_RNDN);
        mpfr_add(r10295, r10288, r10294, MPFR_RNDN);
        if (mpfr_get_si(r10269, MPFR_RNDN)) { mpfr_set(r10296, r10282, MPFR_RNDN); } else { mpfr_set(r10296, r10295, MPFR_RNDN); };
        return mpfr_get_d(r10296, MPFR_RNDN);
}

static mpfr_t r10297, r10298, r10299, r10300, r10301, r10302, r10303, r10304, r10305, r10306, r10307, r10308, r10309, r10310, r10311, r10312, r10313, r10314, r10315, r10316, r10317, r10318, r10319, r10320, r10321, r10322, r10323, r10324, r10325, r10326;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r10297);
        mpfr_init_set_str(r10298, "6.798605532547233e+153", 10, MPFR_RNDN);
        mpfr_init(r10299);
        mpfr_init(r10300);
        mpfr_init(r10301);
        mpfr_init(r10302);
        mpfr_init(r10303);
        mpfr_init(r10304);
        mpfr_init(r10305);
        mpfr_init(r10306);
        mpfr_init_set_str(r10307, "10", 10, MPFR_RNDN);
        mpfr_init(r10308);
        mpfr_init(r10309);
        mpfr_init_set_str(r10310, "1", 10, MPFR_RNDN);
        mpfr_init(r10311);
        mpfr_init(r10312);
        mpfr_init(r10313);
        mpfr_init(r10314);
        mpfr_init(r10315);
        mpfr_init(r10316);
        mpfr_init(r10317);
        mpfr_init(r10318);
        mpfr_init_set_str(r10319, "4", 10, MPFR_RNDN);
        mpfr_init(r10320);
        mpfr_init(r10321);
        mpfr_init_set_str(r10322, "99", 10, MPFR_RNDN);
        mpfr_init(r10323);
        mpfr_init(r10324);
        mpfr_init(r10325);
        mpfr_init(r10326);
}

double f_dm(double a, double k, double m) {
        mpfr_set_d(r10297, k, MPFR_RNDN);
        ;
        mpfr_set_si(r10299, mpfr_cmp(r10297, r10298) <= 0, MPFR_RNDN);
        mpfr_set_d(r10300, m, MPFR_RNDN);
        mpfr_pow(r10301, r10297, r10300, MPFR_RNDN);
        mpfr_cbrt(r10302, r10301, MPFR_RNDN);
        mpfr_mul(r10303, r10302, r10302, MPFR_RNDN);
        mpfr_set_d(r10304, a, MPFR_RNDN);
        mpfr_mul(r10305, r10304, r10302, MPFR_RNDN);
        mpfr_mul(r10306, r10303, r10305, MPFR_RNDN);
        ;
        mpfr_add(r10308, r10297, r10307, MPFR_RNDN);
        mpfr_mul(r10309, r10308, r10297, MPFR_RNDN);
        ;
        mpfr_add(r10311, r10309, r10310, MPFR_RNDN);
        mpfr_div(r10312, r10306, r10311, MPFR_RNDN);
        mpfr_div(r10313, r10301, r10297, MPFR_RNDN);
        mpfr_div(r10314, r10304, r10297, MPFR_RNDN);
        mpfr_div(r10315, r10307, r10297, MPFR_RNDN);
        mpfr_mul(r10316, r10315, r10314, MPFR_RNDN);
        mpfr_sub(r10317, r10314, r10316, MPFR_RNDN);
        mpfr_mul(r10318, r10313, r10317, MPFR_RNDN);
        ;
        mpfr_pow(r10320, r10297, r10319, MPFR_RNDN);
        mpfr_div(r10321, r10301, r10320, MPFR_RNDN);
        ;
        mpfr_mul(r10323, r10322, r10304, MPFR_RNDN);
        mpfr_mul(r10324, r10321, r10323, MPFR_RNDN);
        mpfr_add(r10325, r10318, r10324, MPFR_RNDN);
        if (mpfr_get_si(r10299, MPFR_RNDN)) { mpfr_set(r10326, r10312, MPFR_RNDN); } else { mpfr_set(r10326, r10325, MPFR_RNDN); };
        return mpfr_get_d(r10326, MPFR_RNDN);
}

