#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 r33069 = a;
        float r33070 = k;
        float r33071 = m;
        float r33072 = pow(r33070, r33071);
        float r33073 = r33069 * r33072;
        float r33074 = 1;
        float r33075 = 10;
        float r33076 = r33075 * r33070;
        float r33077 = r33074 + r33076;
        float r33078 = r33070 * r33070;
        float r33079 = r33077 + r33078;
        float r33080 = r33073 / r33079;
        return r33080;
}

double f_id(double a, double k, double m) {
        double r33081 = a;
        double r33082 = k;
        double r33083 = m;
        double r33084 = pow(r33082, r33083);
        double r33085 = r33081 * r33084;
        double r33086 = 1;
        double r33087 = 10;
        double r33088 = r33087 * r33082;
        double r33089 = r33086 + r33088;
        double r33090 = r33082 * r33082;
        double r33091 = r33089 + r33090;
        double r33092 = r33085 / r33091;
        return r33092;
}


double f_of(float a, float k, float m) {
        float r33093 = k;
        float r33094 = m;
        float r33095 = pow(r33093, r33094);
        float r33096 = 1;
        float r33097 = r33095 / r33096;
        float r33098 = a;
        float r33099 = 10;
        float r33100 = r33099 + r33093;
        float r33101 = r33100 * r33093;
        float r33102 = r33096 + r33101;
        float r33103 = r33098 / r33102;
        float r33104 = r33097 * r33103;
        return r33104;
}

double f_od(double a, double k, double m) {
        double r33105 = k;
        double r33106 = m;
        double r33107 = pow(r33105, r33106);
        double r33108 = 1;
        double r33109 = r33107 / r33108;
        double r33110 = a;
        double r33111 = 10;
        double r33112 = r33111 + r33105;
        double r33113 = r33112 * r33105;
        double r33114 = r33108 + r33113;
        double r33115 = r33110 / r33114;
        double r33116 = r33109 * r33115;
        return r33116;
}

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 r33117, r33118, r33119, r33120, r33121, r33122, r33123, r33124, r33125, r33126, r33127, r33128;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r33117);
        mpfr_init(r33118);
        mpfr_init(r33119);
        mpfr_init(r33120);
        mpfr_init(r33121);
        mpfr_init_set_str(r33122, "1", 10, MPFR_RNDN);
        mpfr_init_set_str(r33123, "10", 10, MPFR_RNDN);
        mpfr_init(r33124);
        mpfr_init(r33125);
        mpfr_init(r33126);
        mpfr_init(r33127);
        mpfr_init(r33128);
}

double f_im(double a, double k, double m) {
        mpfr_set_d(r33117, a, MPFR_RNDN);
        mpfr_set_d(r33118, k, MPFR_RNDN);
        mpfr_set_d(r33119, m, MPFR_RNDN);
        mpfr_pow(r33120, r33118, r33119, MPFR_RNDN);
        mpfr_mul(r33121, r33117, r33120, MPFR_RNDN);
        ;
        ;
        mpfr_mul(r33124, r33123, r33118, MPFR_RNDN);
        mpfr_add(r33125, r33122, r33124, MPFR_RNDN);
        mpfr_mul(r33126, r33118, r33118, MPFR_RNDN);
        mpfr_add(r33127, r33125, r33126, MPFR_RNDN);
        mpfr_div(r33128, r33121, r33127, MPFR_RNDN);
        return mpfr_get_d(r33128, MPFR_RNDN);
}

static mpfr_t r33129, r33130, r33131, r33132, r33133, r33134, r33135, r33136, r33137, r33138, r33139, r33140;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r33129);
        mpfr_init(r33130);
        mpfr_init(r33131);
        mpfr_init_set_str(r33132, "1", 10, MPFR_RNDN);
        mpfr_init(r33133);
        mpfr_init(r33134);
        mpfr_init_set_str(r33135, "10", 10, MPFR_RNDN);
        mpfr_init(r33136);
        mpfr_init(r33137);
        mpfr_init(r33138);
        mpfr_init(r33139);
        mpfr_init(r33140);
}

double f_fm(double a, double k, double m) {
        mpfr_set_d(r33129, k, MPFR_RNDN);
        mpfr_set_d(r33130, m, MPFR_RNDN);
        mpfr_pow(r33131, r33129, r33130, MPFR_RNDN);
        ;
        mpfr_div(r33133, r33131, r33132, MPFR_RNDN);
        mpfr_set_d(r33134, a, MPFR_RNDN);
        ;
        mpfr_add(r33136, r33135, r33129, MPFR_RNDN);
        mpfr_mul(r33137, r33136, r33129, MPFR_RNDN);
        mpfr_add(r33138, r33132, r33137, MPFR_RNDN);
        mpfr_div(r33139, r33134, r33138, MPFR_RNDN);
        mpfr_mul(r33140, r33133, r33139, MPFR_RNDN);
        return mpfr_get_d(r33140, MPFR_RNDN);
}

static mpfr_t r33141, r33142, r33143, r33144, r33145, r33146, r33147, r33148, r33149, r33150, r33151, r33152;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r33141);
        mpfr_init(r33142);
        mpfr_init(r33143);
        mpfr_init_set_str(r33144, "1", 10, MPFR_RNDN);
        mpfr_init(r33145);
        mpfr_init(r33146);
        mpfr_init_set_str(r33147, "10", 10, MPFR_RNDN);
        mpfr_init(r33148);
        mpfr_init(r33149);
        mpfr_init(r33150);
        mpfr_init(r33151);
        mpfr_init(r33152);
}

double f_dm(double a, double k, double m) {
        mpfr_set_d(r33141, k, MPFR_RNDN);
        mpfr_set_d(r33142, m, MPFR_RNDN);
        mpfr_pow(r33143, r33141, r33142, MPFR_RNDN);
        ;
        mpfr_div(r33145, r33143, r33144, MPFR_RNDN);
        mpfr_set_d(r33146, a, MPFR_RNDN);
        ;
        mpfr_add(r33148, r33147, r33141, MPFR_RNDN);
        mpfr_mul(r33149, r33148, r33141, MPFR_RNDN);
        mpfr_add(r33150, r33144, r33149, MPFR_RNDN);
        mpfr_div(r33151, r33146, r33150, MPFR_RNDN);
        mpfr_mul(r33152, r33145, r33151, MPFR_RNDN);
        return mpfr_get_d(r33152, MPFR_RNDN);
}

