#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 r30462946 = th;
        float r30462947 = cos(r30462946);
        float r30462948 = 2;
        float r30462949 = sqrt(r30462948);
        float r30462950 = r30462947 / r30462949;
        float r30462951 = a1;
        float r30462952 = r30462951 * r30462951;
        float r30462953 = r30462950 * r30462952;
        float r30462954 = a2;
        float r30462955 = r30462954 * r30462954;
        float r30462956 = r30462950 * r30462955;
        float r30462957 = r30462953 + r30462956;
        return r30462957;
}

double f_id(double a1, double a2, double th) {
        double r30462958 = th;
        double r30462959 = cos(r30462958);
        double r30462960 = 2;
        double r30462961 = sqrt(r30462960);
        double r30462962 = r30462959 / r30462961;
        double r30462963 = a1;
        double r30462964 = r30462963 * r30462963;
        double r30462965 = r30462962 * r30462964;
        double r30462966 = a2;
        double r30462967 = r30462966 * r30462966;
        double r30462968 = r30462962 * r30462967;
        double r30462969 = r30462965 + r30462968;
        return r30462969;
}


double f_of(float a1, float a2, float th) {
        float r30462970 = th;
        float r30462971 = cos(r30462970);
        float r30462972 = a1;
        float r30462973 = r30462972 * r30462972;
        float r30462974 = a2;
        float r30462975 = r30462974 * r30462974;
        float r30462976 = r30462973 + r30462975;
        float r30462977 = 2;
        float r30462978 = sqrt(r30462977);
        float r30462979 = r30462976 / r30462978;
        float r30462980 = r30462971 * r30462979;
        return r30462980;
}

double f_od(double a1, double a2, double th) {
        double r30462981 = th;
        double r30462982 = cos(r30462981);
        double r30462983 = a1;
        double r30462984 = r30462983 * r30462983;
        double r30462985 = a2;
        double r30462986 = r30462985 * r30462985;
        double r30462987 = r30462984 + r30462986;
        double r30462988 = 2;
        double r30462989 = sqrt(r30462988);
        double r30462990 = r30462987 / r30462989;
        double r30462991 = r30462982 * r30462990;
        return r30462991;
}

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 r30462992, r30462993, r30462994, r30462995, r30462996, r30462997, r30462998, r30462999, r30463000, r30463001, r30463002, r30463003;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r30462992);
        mpfr_init(r30462993);
        mpfr_init_set_str(r30462994, "2", 10, MPFR_RNDN);
        mpfr_init(r30462995);
        mpfr_init(r30462996);
        mpfr_init(r30462997);
        mpfr_init(r30462998);
        mpfr_init(r30462999);
        mpfr_init(r30463000);
        mpfr_init(r30463001);
        mpfr_init(r30463002);
        mpfr_init(r30463003);
}

double f_im(double a1, double a2, double th) {
        mpfr_set_d(r30462992, th, MPFR_RNDN);
        mpfr_cos(r30462993, r30462992, MPFR_RNDN);
        ;
        mpfr_sqrt(r30462995, r30462994, MPFR_RNDN);
        mpfr_div(r30462996, r30462993, r30462995, MPFR_RNDN);
        mpfr_set_d(r30462997, a1, MPFR_RNDN);
        mpfr_mul(r30462998, r30462997, r30462997, MPFR_RNDN);
        mpfr_mul(r30462999, r30462996, r30462998, MPFR_RNDN);
        mpfr_set_d(r30463000, a2, MPFR_RNDN);
        mpfr_mul(r30463001, r30463000, r30463000, MPFR_RNDN);
        mpfr_mul(r30463002, r30462996, r30463001, MPFR_RNDN);
        mpfr_add(r30463003, r30462999, r30463002, MPFR_RNDN);
        return mpfr_get_d(r30463003, MPFR_RNDN);
}

static mpfr_t r30463004, r30463005, r30463006, r30463007, r30463008, r30463009, r30463010, r30463011, r30463012, r30463013, r30463014;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r30463004);
        mpfr_init(r30463005);
        mpfr_init(r30463006);
        mpfr_init(r30463007);
        mpfr_init(r30463008);
        mpfr_init(r30463009);
        mpfr_init(r30463010);
        mpfr_init_set_str(r30463011, "2", 10, MPFR_RNDN);
        mpfr_init(r30463012);
        mpfr_init(r30463013);
        mpfr_init(r30463014);
}

double f_fm(double a1, double a2, double th) {
        mpfr_set_d(r30463004, th, MPFR_RNDN);
        mpfr_cos(r30463005, r30463004, MPFR_RNDN);
        mpfr_set_d(r30463006, a1, MPFR_RNDN);
        mpfr_mul(r30463007, r30463006, r30463006, MPFR_RNDN);
        mpfr_set_d(r30463008, a2, MPFR_RNDN);
        mpfr_mul(r30463009, r30463008, r30463008, MPFR_RNDN);
        mpfr_add(r30463010, r30463007, r30463009, MPFR_RNDN);
        ;
        mpfr_sqrt(r30463012, r30463011, MPFR_RNDN);
        mpfr_div(r30463013, r30463010, r30463012, MPFR_RNDN);
        mpfr_mul(r30463014, r30463005, r30463013, MPFR_RNDN);
        return mpfr_get_d(r30463014, MPFR_RNDN);
}

static mpfr_t r30463015, r30463016, r30463017, r30463018, r30463019, r30463020, r30463021, r30463022, r30463023, r30463024, r30463025;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r30463015);
        mpfr_init(r30463016);
        mpfr_init(r30463017);
        mpfr_init(r30463018);
        mpfr_init(r30463019);
        mpfr_init(r30463020);
        mpfr_init(r30463021);
        mpfr_init_set_str(r30463022, "2", 10, MPFR_RNDN);
        mpfr_init(r30463023);
        mpfr_init(r30463024);
        mpfr_init(r30463025);
}

double f_dm(double a1, double a2, double th) {
        mpfr_set_d(r30463015, th, MPFR_RNDN);
        mpfr_cos(r30463016, r30463015, MPFR_RNDN);
        mpfr_set_d(r30463017, a1, MPFR_RNDN);
        mpfr_mul(r30463018, r30463017, r30463017, MPFR_RNDN);
        mpfr_set_d(r30463019, a2, MPFR_RNDN);
        mpfr_mul(r30463020, r30463019, r30463019, MPFR_RNDN);
        mpfr_add(r30463021, r30463018, r30463020, MPFR_RNDN);
        ;
        mpfr_sqrt(r30463023, r30463022, MPFR_RNDN);
        mpfr_div(r30463024, r30463021, r30463023, MPFR_RNDN);
        mpfr_mul(r30463025, r30463016, r30463024, MPFR_RNDN);
        return mpfr_get_d(r30463025, MPFR_RNDN);
}

