#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 r28075 = th;
        float r28076 = cos(r28075);
        float r28077 = 2;
        float r28078 = sqrt(r28077);
        float r28079 = r28076 / r28078;
        float r28080 = a1;
        float r28081 = r28080 * r28080;
        float r28082 = r28079 * r28081;
        float r28083 = a2;
        float r28084 = r28083 * r28083;
        float r28085 = r28079 * r28084;
        float r28086 = r28082 + r28085;
        return r28086;
}

double f_id(double a1, double a2, double th) {
        double r28087 = th;
        double r28088 = cos(r28087);
        double r28089 = 2;
        double r28090 = sqrt(r28089);
        double r28091 = r28088 / r28090;
        double r28092 = a1;
        double r28093 = r28092 * r28092;
        double r28094 = r28091 * r28093;
        double r28095 = a2;
        double r28096 = r28095 * r28095;
        double r28097 = r28091 * r28096;
        double r28098 = r28094 + r28097;
        return r28098;
}


double f_of(float a1, float a2, float th) {
        float r28099 = th;
        float r28100 = cos(r28099);
        float r28101 = 2;
        float r28102 = sqrt(r28101);
        float r28103 = cbrt(r28102);
        float r28104 = r28103 * r28103;
        float r28105 = r28100 / r28104;
        float r28106 = r28105 / r28103;
        float r28107 = a2;
        float r28108 = r28107 * r28107;
        float r28109 = a1;
        float r28110 = r28109 * r28109;
        float r28111 = r28108 + r28110;
        float r28112 = r28106 * r28111;
        return r28112;
}

double f_od(double a1, double a2, double th) {
        double r28113 = th;
        double r28114 = cos(r28113);
        double r28115 = 2;
        double r28116 = sqrt(r28115);
        double r28117 = cbrt(r28116);
        double r28118 = r28117 * r28117;
        double r28119 = r28114 / r28118;
        double r28120 = r28119 / r28117;
        double r28121 = a2;
        double r28122 = r28121 * r28121;
        double r28123 = a1;
        double r28124 = r28123 * r28123;
        double r28125 = r28122 + r28124;
        double r28126 = r28120 * r28125;
        return r28126;
}

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 r28127, r28128, r28129, r28130, r28131, r28132, r28133, r28134, r28135, r28136, r28137, r28138;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r28127);
        mpfr_init(r28128);
        mpfr_init_set_str(r28129, "2", 10, MPFR_RNDN);
        mpfr_init(r28130);
        mpfr_init(r28131);
        mpfr_init(r28132);
        mpfr_init(r28133);
        mpfr_init(r28134);
        mpfr_init(r28135);
        mpfr_init(r28136);
        mpfr_init(r28137);
        mpfr_init(r28138);
}

double f_im(double a1, double a2, double th) {
        mpfr_set_d(r28127, th, MPFR_RNDN);
        mpfr_cos(r28128, r28127, MPFR_RNDN);
        ;
        mpfr_sqrt(r28130, r28129, MPFR_RNDN);
        mpfr_div(r28131, r28128, r28130, MPFR_RNDN);
        mpfr_set_d(r28132, a1, MPFR_RNDN);
        mpfr_mul(r28133, r28132, r28132, MPFR_RNDN);
        mpfr_mul(r28134, r28131, r28133, MPFR_RNDN);
        mpfr_set_d(r28135, a2, MPFR_RNDN);
        mpfr_mul(r28136, r28135, r28135, MPFR_RNDN);
        mpfr_mul(r28137, r28131, r28136, MPFR_RNDN);
        mpfr_add(r28138, r28134, r28137, MPFR_RNDN);
        return mpfr_get_d(r28138, MPFR_RNDN);
}

static mpfr_t r28139, r28140, r28141, r28142, r28143, r28144, r28145, r28146, r28147, r28148, r28149, r28150, r28151, r28152;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r28139);
        mpfr_init(r28140);
        mpfr_init_set_str(r28141, "2", 10, MPFR_RNDN);
        mpfr_init(r28142);
        mpfr_init(r28143);
        mpfr_init(r28144);
        mpfr_init(r28145);
        mpfr_init(r28146);
        mpfr_init(r28147);
        mpfr_init(r28148);
        mpfr_init(r28149);
        mpfr_init(r28150);
        mpfr_init(r28151);
        mpfr_init(r28152);
}

double f_fm(double a1, double a2, double th) {
        mpfr_set_d(r28139, th, MPFR_RNDN);
        mpfr_cos(r28140, r28139, MPFR_RNDN);
        ;
        mpfr_sqrt(r28142, r28141, MPFR_RNDN);
        mpfr_cbrt(r28143, r28142, MPFR_RNDN);
        mpfr_mul(r28144, r28143, r28143, MPFR_RNDN);
        mpfr_div(r28145, r28140, r28144, MPFR_RNDN);
        mpfr_div(r28146, r28145, r28143, MPFR_RNDN);
        mpfr_set_d(r28147, a2, MPFR_RNDN);
        mpfr_mul(r28148, r28147, r28147, MPFR_RNDN);
        mpfr_set_d(r28149, a1, MPFR_RNDN);
        mpfr_mul(r28150, r28149, r28149, MPFR_RNDN);
        mpfr_add(r28151, r28148, r28150, MPFR_RNDN);
        mpfr_mul(r28152, r28146, r28151, MPFR_RNDN);
        return mpfr_get_d(r28152, MPFR_RNDN);
}

static mpfr_t r28153, r28154, r28155, r28156, r28157, r28158, r28159, r28160, r28161, r28162, r28163, r28164, r28165, r28166;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r28153);
        mpfr_init(r28154);
        mpfr_init_set_str(r28155, "2", 10, MPFR_RNDN);
        mpfr_init(r28156);
        mpfr_init(r28157);
        mpfr_init(r28158);
        mpfr_init(r28159);
        mpfr_init(r28160);
        mpfr_init(r28161);
        mpfr_init(r28162);
        mpfr_init(r28163);
        mpfr_init(r28164);
        mpfr_init(r28165);
        mpfr_init(r28166);
}

double f_dm(double a1, double a2, double th) {
        mpfr_set_d(r28153, th, MPFR_RNDN);
        mpfr_cos(r28154, r28153, MPFR_RNDN);
        ;
        mpfr_sqrt(r28156, r28155, MPFR_RNDN);
        mpfr_cbrt(r28157, r28156, MPFR_RNDN);
        mpfr_mul(r28158, r28157, r28157, MPFR_RNDN);
        mpfr_div(r28159, r28154, r28158, MPFR_RNDN);
        mpfr_div(r28160, r28159, r28157, MPFR_RNDN);
        mpfr_set_d(r28161, a2, MPFR_RNDN);
        mpfr_mul(r28162, r28161, r28161, MPFR_RNDN);
        mpfr_set_d(r28163, a1, MPFR_RNDN);
        mpfr_mul(r28164, r28163, r28163, MPFR_RNDN);
        mpfr_add(r28165, r28162, r28164, MPFR_RNDN);
        mpfr_mul(r28166, r28160, r28165, MPFR_RNDN);
        return mpfr_get_d(r28166, MPFR_RNDN);
}

