#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 r28131 = th;
        float r28132 = cos(r28131);
        float r28133 = 2;
        float r28134 = sqrt(r28133);
        float r28135 = r28132 / r28134;
        float r28136 = a1;
        float r28137 = r28136 * r28136;
        float r28138 = r28135 * r28137;
        float r28139 = a2;
        float r28140 = r28139 * r28139;
        float r28141 = r28135 * r28140;
        float r28142 = r28138 + r28141;
        return r28142;
}

double f_id(double a1, double a2, double th) {
        double r28143 = th;
        double r28144 = cos(r28143);
        double r28145 = 2;
        double r28146 = sqrt(r28145);
        double r28147 = r28144 / r28146;
        double r28148 = a1;
        double r28149 = r28148 * r28148;
        double r28150 = r28147 * r28149;
        double r28151 = a2;
        double r28152 = r28151 * r28151;
        double r28153 = r28147 * r28152;
        double r28154 = r28150 + r28153;
        return r28154;
}


double f_of(float a1, float a2, float th) {
        float r28155 = th;
        float r28156 = cos(r28155);
        float r28157 = 2;
        float r28158 = sqrt(r28157);
        float r28159 = cbrt(r28158);
        float r28160 = r28159 * r28159;
        float r28161 = r28156 / r28160;
        float r28162 = r28161 / r28159;
        float r28163 = a2;
        float r28164 = r28163 * r28163;
        float r28165 = a1;
        float r28166 = r28165 * r28165;
        float r28167 = r28164 + r28166;
        float r28168 = r28162 * r28167;
        return r28168;
}

double f_od(double a1, double a2, double th) {
        double r28169 = th;
        double r28170 = cos(r28169);
        double r28171 = 2;
        double r28172 = sqrt(r28171);
        double r28173 = cbrt(r28172);
        double r28174 = r28173 * r28173;
        double r28175 = r28170 / r28174;
        double r28176 = r28175 / r28173;
        double r28177 = a2;
        double r28178 = r28177 * r28177;
        double r28179 = a1;
        double r28180 = r28179 * r28179;
        double r28181 = r28178 + r28180;
        double r28182 = r28176 * r28181;
        return r28182;
}

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 r28183, r28184, r28185, r28186, r28187, r28188, r28189, r28190, r28191, r28192, r28193, r28194;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r28183);
        mpfr_init(r28184);
        mpfr_init_set_str(r28185, "2", 10, MPFR_RNDN);
        mpfr_init(r28186);
        mpfr_init(r28187);
        mpfr_init(r28188);
        mpfr_init(r28189);
        mpfr_init(r28190);
        mpfr_init(r28191);
        mpfr_init(r28192);
        mpfr_init(r28193);
        mpfr_init(r28194);
}

double f_im(double a1, double a2, double th) {
        mpfr_set_d(r28183, th, MPFR_RNDN);
        mpfr_cos(r28184, r28183, MPFR_RNDN);
        ;
        mpfr_sqrt(r28186, r28185, MPFR_RNDN);
        mpfr_div(r28187, r28184, r28186, MPFR_RNDN);
        mpfr_set_d(r28188, a1, MPFR_RNDN);
        mpfr_mul(r28189, r28188, r28188, MPFR_RNDN);
        mpfr_mul(r28190, r28187, r28189, MPFR_RNDN);
        mpfr_set_d(r28191, a2, MPFR_RNDN);
        mpfr_mul(r28192, r28191, r28191, MPFR_RNDN);
        mpfr_mul(r28193, r28187, r28192, MPFR_RNDN);
        mpfr_add(r28194, r28190, r28193, MPFR_RNDN);
        return mpfr_get_d(r28194, MPFR_RNDN);
}

static mpfr_t r28195, r28196, r28197, r28198, r28199, r28200, r28201, r28202, r28203, r28204, r28205, r28206, r28207, r28208;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r28195);
        mpfr_init(r28196);
        mpfr_init_set_str(r28197, "2", 10, MPFR_RNDN);
        mpfr_init(r28198);
        mpfr_init(r28199);
        mpfr_init(r28200);
        mpfr_init(r28201);
        mpfr_init(r28202);
        mpfr_init(r28203);
        mpfr_init(r28204);
        mpfr_init(r28205);
        mpfr_init(r28206);
        mpfr_init(r28207);
        mpfr_init(r28208);
}

double f_fm(double a1, double a2, double th) {
        mpfr_set_d(r28195, th, MPFR_RNDN);
        mpfr_cos(r28196, r28195, MPFR_RNDN);
        ;
        mpfr_sqrt(r28198, r28197, MPFR_RNDN);
        mpfr_cbrt(r28199, r28198, MPFR_RNDN);
        mpfr_mul(r28200, r28199, r28199, MPFR_RNDN);
        mpfr_div(r28201, r28196, r28200, MPFR_RNDN);
        mpfr_div(r28202, r28201, r28199, MPFR_RNDN);
        mpfr_set_d(r28203, a2, MPFR_RNDN);
        mpfr_mul(r28204, r28203, r28203, MPFR_RNDN);
        mpfr_set_d(r28205, a1, MPFR_RNDN);
        mpfr_mul(r28206, r28205, r28205, MPFR_RNDN);
        mpfr_add(r28207, r28204, r28206, MPFR_RNDN);
        mpfr_mul(r28208, r28202, r28207, MPFR_RNDN);
        return mpfr_get_d(r28208, MPFR_RNDN);
}

static mpfr_t r28209, r28210, r28211, r28212, r28213, r28214, r28215, r28216, r28217, r28218, r28219, r28220, r28221, r28222;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r28209);
        mpfr_init(r28210);
        mpfr_init_set_str(r28211, "2", 10, MPFR_RNDN);
        mpfr_init(r28212);
        mpfr_init(r28213);
        mpfr_init(r28214);
        mpfr_init(r28215);
        mpfr_init(r28216);
        mpfr_init(r28217);
        mpfr_init(r28218);
        mpfr_init(r28219);
        mpfr_init(r28220);
        mpfr_init(r28221);
        mpfr_init(r28222);
}

double f_dm(double a1, double a2, double th) {
        mpfr_set_d(r28209, th, MPFR_RNDN);
        mpfr_cos(r28210, r28209, MPFR_RNDN);
        ;
        mpfr_sqrt(r28212, r28211, MPFR_RNDN);
        mpfr_cbrt(r28213, r28212, MPFR_RNDN);
        mpfr_mul(r28214, r28213, r28213, MPFR_RNDN);
        mpfr_div(r28215, r28210, r28214, MPFR_RNDN);
        mpfr_div(r28216, r28215, r28213, MPFR_RNDN);
        mpfr_set_d(r28217, a2, MPFR_RNDN);
        mpfr_mul(r28218, r28217, r28217, MPFR_RNDN);
        mpfr_set_d(r28219, a1, MPFR_RNDN);
        mpfr_mul(r28220, r28219, r28219, MPFR_RNDN);
        mpfr_add(r28221, r28218, r28220, MPFR_RNDN);
        mpfr_mul(r28222, r28216, r28221, MPFR_RNDN);
        return mpfr_get_d(r28222, MPFR_RNDN);
}

