#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "Migdal et al, Equation (64)";

double f_if(float a1, float a2, float th) {
        float r28079 = th;
        float r28080 = cos(r28079);
        float r28081 = 2;
        float r28082 = sqrt(r28081);
        float r28083 = r28080 / r28082;
        float r28084 = a1;
        float r28085 = r28084 * r28084;
        float r28086 = r28083 * r28085;
        float r28087 = a2;
        float r28088 = r28087 * r28087;
        float r28089 = r28083 * r28088;
        float r28090 = r28086 + r28089;
        return r28090;
}

double f_id(double a1, double a2, double th) {
        double r28091 = th;
        double r28092 = cos(r28091);
        double r28093 = 2;
        double r28094 = sqrt(r28093);
        double r28095 = r28092 / r28094;
        double r28096 = a1;
        double r28097 = r28096 * r28096;
        double r28098 = r28095 * r28097;
        double r28099 = a2;
        double r28100 = r28099 * r28099;
        double r28101 = r28095 * r28100;
        double r28102 = r28098 + r28101;
        return r28102;
}


double f_of(float a1, float a2, float th) {
        float r28103 = th;
        float r28104 = cos(r28103);
        float r28105 = 2;
        float r28106 = sqrt(r28105);
        float r28107 = cbrt(r28106);
        float r28108 = r28107 * r28107;
        float r28109 = r28104 / r28108;
        float r28110 = r28109 / r28107;
        float r28111 = a2;
        float r28112 = r28111 * r28111;
        float r28113 = a1;
        float r28114 = r28113 * r28113;
        float r28115 = r28112 + r28114;
        float r28116 = r28110 * r28115;
        return r28116;
}

double f_od(double a1, double a2, double th) {
        double r28117 = th;
        double r28118 = cos(r28117);
        double r28119 = 2;
        double r28120 = sqrt(r28119);
        double r28121 = cbrt(r28120);
        double r28122 = r28121 * r28121;
        double r28123 = r28118 / r28122;
        double r28124 = r28123 / r28121;
        double r28125 = a2;
        double r28126 = r28125 * r28125;
        double r28127 = a1;
        double r28128 = r28127 * r28127;
        double r28129 = r28126 + r28128;
        double r28130 = r28124 * r28129;
        return r28130;
}

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 r28131, r28132, r28133, r28134, r28135, r28136, r28137, r28138, r28139, r28140, r28141, r28142;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r28131);
        mpfr_init(r28132);
        mpfr_init_set_str(r28133, "2", 10, MPFR_RNDN);
        mpfr_init(r28134);
        mpfr_init(r28135);
        mpfr_init(r28136);
        mpfr_init(r28137);
        mpfr_init(r28138);
        mpfr_init(r28139);
        mpfr_init(r28140);
        mpfr_init(r28141);
        mpfr_init(r28142);
}

double f_im(double a1, double a2, double th) {
        mpfr_set_d(r28131, th, MPFR_RNDN);
        mpfr_cos(r28132, r28131, MPFR_RNDN);
        ;
        mpfr_sqrt(r28134, r28133, MPFR_RNDN);
        mpfr_div(r28135, r28132, r28134, MPFR_RNDN);
        mpfr_set_d(r28136, a1, MPFR_RNDN);
        mpfr_mul(r28137, r28136, r28136, MPFR_RNDN);
        mpfr_mul(r28138, r28135, r28137, MPFR_RNDN);
        mpfr_set_d(r28139, a2, MPFR_RNDN);
        mpfr_mul(r28140, r28139, r28139, MPFR_RNDN);
        mpfr_mul(r28141, r28135, r28140, MPFR_RNDN);
        mpfr_add(r28142, r28138, r28141, MPFR_RNDN);
        return mpfr_get_d(r28142, MPFR_RNDN);
}

static mpfr_t r28143, r28144, r28145, r28146, r28147, r28148, r28149, r28150, r28151, r28152, r28153, r28154, r28155, r28156;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r28143);
        mpfr_init(r28144);
        mpfr_init_set_str(r28145, "2", 10, MPFR_RNDN);
        mpfr_init(r28146);
        mpfr_init(r28147);
        mpfr_init(r28148);
        mpfr_init(r28149);
        mpfr_init(r28150);
        mpfr_init(r28151);
        mpfr_init(r28152);
        mpfr_init(r28153);
        mpfr_init(r28154);
        mpfr_init(r28155);
        mpfr_init(r28156);
}

double f_fm(double a1, double a2, double th) {
        mpfr_set_d(r28143, th, MPFR_RNDN);
        mpfr_cos(r28144, r28143, MPFR_RNDN);
        ;
        mpfr_sqrt(r28146, r28145, MPFR_RNDN);
        mpfr_cbrt(r28147, r28146, MPFR_RNDN);
        mpfr_mul(r28148, r28147, r28147, MPFR_RNDN);
        mpfr_div(r28149, r28144, r28148, MPFR_RNDN);
        mpfr_div(r28150, r28149, r28147, MPFR_RNDN);
        mpfr_set_d(r28151, a2, MPFR_RNDN);
        mpfr_mul(r28152, r28151, r28151, MPFR_RNDN);
        mpfr_set_d(r28153, a1, MPFR_RNDN);
        mpfr_mul(r28154, r28153, r28153, MPFR_RNDN);
        mpfr_add(r28155, r28152, r28154, MPFR_RNDN);
        mpfr_mul(r28156, r28150, r28155, MPFR_RNDN);
        return mpfr_get_d(r28156, MPFR_RNDN);
}

static mpfr_t r28157, r28158, r28159, r28160, r28161, r28162, r28163, r28164, r28165, r28166, r28167, r28168, r28169, r28170;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r28157);
        mpfr_init(r28158);
        mpfr_init_set_str(r28159, "2", 10, MPFR_RNDN);
        mpfr_init(r28160);
        mpfr_init(r28161);
        mpfr_init(r28162);
        mpfr_init(r28163);
        mpfr_init(r28164);
        mpfr_init(r28165);
        mpfr_init(r28166);
        mpfr_init(r28167);
        mpfr_init(r28168);
        mpfr_init(r28169);
        mpfr_init(r28170);
}

double f_dm(double a1, double a2, double th) {
        mpfr_set_d(r28157, th, MPFR_RNDN);
        mpfr_cos(r28158, r28157, MPFR_RNDN);
        ;
        mpfr_sqrt(r28160, r28159, MPFR_RNDN);
        mpfr_cbrt(r28161, r28160, MPFR_RNDN);
        mpfr_mul(r28162, r28161, r28161, MPFR_RNDN);
        mpfr_div(r28163, r28158, r28162, MPFR_RNDN);
        mpfr_div(r28164, r28163, r28161, MPFR_RNDN);
        mpfr_set_d(r28165, a2, MPFR_RNDN);
        mpfr_mul(r28166, r28165, r28165, MPFR_RNDN);
        mpfr_set_d(r28167, a1, MPFR_RNDN);
        mpfr_mul(r28168, r28167, r28167, MPFR_RNDN);
        mpfr_add(r28169, r28166, r28168, MPFR_RNDN);
        mpfr_mul(r28170, r28164, r28169, MPFR_RNDN);
        return mpfr_get_d(r28170, MPFR_RNDN);
}

