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

char *name = "Spherical law of cosines";

double f_if(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r18360105 = phi1;
        float r18360106 = sin(r18360105);
        float r18360107 = phi2;
        float r18360108 = sin(r18360107);
        float r18360109 = r18360106 * r18360108;
        float r18360110 = cos(r18360105);
        float r18360111 = cos(r18360107);
        float r18360112 = r18360110 * r18360111;
        float r18360113 = lambda1;
        float r18360114 = lambda2;
        float r18360115 = r18360113 - r18360114;
        float r18360116 = cos(r18360115);
        float r18360117 = r18360112 * r18360116;
        float r18360118 = r18360109 + r18360117;
        float r18360119 = acos(r18360118);
        float r18360120 = R;
        float r18360121 = r18360119 * r18360120;
        return r18360121;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r18360122 = phi1;
        double r18360123 = sin(r18360122);
        double r18360124 = phi2;
        double r18360125 = sin(r18360124);
        double r18360126 = r18360123 * r18360125;
        double r18360127 = cos(r18360122);
        double r18360128 = cos(r18360124);
        double r18360129 = r18360127 * r18360128;
        double r18360130 = lambda1;
        double r18360131 = lambda2;
        double r18360132 = r18360130 - r18360131;
        double r18360133 = cos(r18360132);
        double r18360134 = r18360129 * r18360133;
        double r18360135 = r18360126 + r18360134;
        double r18360136 = acos(r18360135);
        double r18360137 = R;
        double r18360138 = r18360136 * r18360137;
        return r18360138;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r18360139 = phi1;
        float r18360140 = sin(r18360139);
        float r18360141 = phi2;
        float r18360142 = sin(r18360141);
        float r18360143 = r18360140 * r18360142;
        float r18360144 = cos(r18360139);
        float r18360145 = cos(r18360141);
        float r18360146 = r18360144 * r18360145;
        float r18360147 = lambda1;
        float r18360148 = cos(r18360147);
        float r18360149 = lambda2;
        float r18360150 = cos(r18360149);
        float r18360151 = r18360148 * r18360150;
        float r18360152 = sin(r18360147);
        float r18360153 = -r18360149;
        float r18360154 = sin(r18360153);
        float r18360155 = r18360152 * r18360154;
        float r18360156 = r18360151 - r18360155;
        float r18360157 = r18360146 * r18360156;
        float r18360158 = r18360143 + r18360157;
        float r18360159 = acos(r18360158);
        float r18360160 = log(r18360159);
        float r18360161 = exp(r18360160);
        float r18360162 = R;
        float r18360163 = r18360161 * r18360162;
        return r18360163;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r18360164 = phi1;
        double r18360165 = sin(r18360164);
        double r18360166 = phi2;
        double r18360167 = sin(r18360166);
        double r18360168 = r18360165 * r18360167;
        double r18360169 = cos(r18360164);
        double r18360170 = cos(r18360166);
        double r18360171 = r18360169 * r18360170;
        double r18360172 = lambda1;
        double r18360173 = cos(r18360172);
        double r18360174 = lambda2;
        double r18360175 = cos(r18360174);
        double r18360176 = r18360173 * r18360175;
        double r18360177 = sin(r18360172);
        double r18360178 = -r18360174;
        double r18360179 = sin(r18360178);
        double r18360180 = r18360177 * r18360179;
        double r18360181 = r18360176 - r18360180;
        double r18360182 = r18360171 * r18360181;
        double r18360183 = r18360168 + r18360182;
        double r18360184 = acos(r18360183);
        double r18360185 = log(r18360184);
        double r18360186 = exp(r18360185);
        double r18360187 = R;
        double r18360188 = r18360186 * r18360187;
        return r18360188;
}

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 r18360189, r18360190, r18360191, r18360192, r18360193, r18360194, r18360195, r18360196, r18360197, r18360198, r18360199, r18360200, r18360201, r18360202, r18360203, r18360204, r18360205;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2192);
        mpfr_init(r18360189);
        mpfr_init(r18360190);
        mpfr_init(r18360191);
        mpfr_init(r18360192);
        mpfr_init(r18360193);
        mpfr_init(r18360194);
        mpfr_init(r18360195);
        mpfr_init(r18360196);
        mpfr_init(r18360197);
        mpfr_init(r18360198);
        mpfr_init(r18360199);
        mpfr_init(r18360200);
        mpfr_init(r18360201);
        mpfr_init(r18360202);
        mpfr_init(r18360203);
        mpfr_init(r18360204);
        mpfr_init(r18360205);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r18360189, phi1, MPFR_RNDN);
        mpfr_sin(r18360190, r18360189, MPFR_RNDN);
        mpfr_set_d(r18360191, phi2, MPFR_RNDN);
        mpfr_sin(r18360192, r18360191, MPFR_RNDN);
        mpfr_mul(r18360193, r18360190, r18360192, MPFR_RNDN);
        mpfr_cos(r18360194, r18360189, MPFR_RNDN);
        mpfr_cos(r18360195, r18360191, MPFR_RNDN);
        mpfr_mul(r18360196, r18360194, r18360195, MPFR_RNDN);
        mpfr_set_d(r18360197, lambda1, MPFR_RNDN);
        mpfr_set_d(r18360198, lambda2, MPFR_RNDN);
        mpfr_sub(r18360199, r18360197, r18360198, MPFR_RNDN);
        mpfr_cos(r18360200, r18360199, MPFR_RNDN);
        mpfr_mul(r18360201, r18360196, r18360200, MPFR_RNDN);
        mpfr_add(r18360202, r18360193, r18360201, MPFR_RNDN);
        mpfr_acos(r18360203, r18360202, MPFR_RNDN);
        mpfr_set_d(r18360204, R, MPFR_RNDN);
        mpfr_mul(r18360205, r18360203, r18360204, MPFR_RNDN);
        return mpfr_get_d(r18360205, MPFR_RNDN);
}

static mpfr_t r18360206, r18360207, r18360208, r18360209, r18360210, r18360211, r18360212, r18360213, r18360214, r18360215, r18360216, r18360217, r18360218, r18360219, r18360220, r18360221, r18360222, r18360223, r18360224, r18360225, r18360226, r18360227, r18360228, r18360229, r18360230;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2192);
        mpfr_init(r18360206);
        mpfr_init(r18360207);
        mpfr_init(r18360208);
        mpfr_init(r18360209);
        mpfr_init(r18360210);
        mpfr_init(r18360211);
        mpfr_init(r18360212);
        mpfr_init(r18360213);
        mpfr_init(r18360214);
        mpfr_init(r18360215);
        mpfr_init(r18360216);
        mpfr_init(r18360217);
        mpfr_init(r18360218);
        mpfr_init(r18360219);
        mpfr_init(r18360220);
        mpfr_init(r18360221);
        mpfr_init(r18360222);
        mpfr_init(r18360223);
        mpfr_init(r18360224);
        mpfr_init(r18360225);
        mpfr_init(r18360226);
        mpfr_init(r18360227);
        mpfr_init(r18360228);
        mpfr_init(r18360229);
        mpfr_init(r18360230);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r18360206, phi1, MPFR_RNDN);
        mpfr_sin(r18360207, r18360206, MPFR_RNDN);
        mpfr_set_d(r18360208, phi2, MPFR_RNDN);
        mpfr_sin(r18360209, r18360208, MPFR_RNDN);
        mpfr_mul(r18360210, r18360207, r18360209, MPFR_RNDN);
        mpfr_cos(r18360211, r18360206, MPFR_RNDN);
        mpfr_cos(r18360212, r18360208, MPFR_RNDN);
        mpfr_mul(r18360213, r18360211, r18360212, MPFR_RNDN);
        mpfr_set_d(r18360214, lambda1, MPFR_RNDN);
        mpfr_cos(r18360215, r18360214, MPFR_RNDN);
        mpfr_set_d(r18360216, lambda2, MPFR_RNDN);
        mpfr_cos(r18360217, r18360216, MPFR_RNDN);
        mpfr_mul(r18360218, r18360215, r18360217, MPFR_RNDN);
        mpfr_sin(r18360219, r18360214, MPFR_RNDN);
        mpfr_neg(r18360220, r18360216, MPFR_RNDN);
        mpfr_sin(r18360221, r18360220, MPFR_RNDN);
        mpfr_mul(r18360222, r18360219, r18360221, MPFR_RNDN);
        mpfr_sub(r18360223, r18360218, r18360222, MPFR_RNDN);
        mpfr_mul(r18360224, r18360213, r18360223, MPFR_RNDN);
        mpfr_add(r18360225, r18360210, r18360224, MPFR_RNDN);
        mpfr_acos(r18360226, r18360225, MPFR_RNDN);
        mpfr_log(r18360227, r18360226, MPFR_RNDN);
        mpfr_exp(r18360228, r18360227, MPFR_RNDN);
        mpfr_set_d(r18360229, R, MPFR_RNDN);
        mpfr_mul(r18360230, r18360228, r18360229, MPFR_RNDN);
        return mpfr_get_d(r18360230, MPFR_RNDN);
}

static mpfr_t r18360231, r18360232, r18360233, r18360234, r18360235, r18360236, r18360237, r18360238, r18360239, r18360240, r18360241, r18360242, r18360243, r18360244, r18360245, r18360246, r18360247, r18360248, r18360249, r18360250, r18360251, r18360252, r18360253, r18360254, r18360255;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2192);
        mpfr_init(r18360231);
        mpfr_init(r18360232);
        mpfr_init(r18360233);
        mpfr_init(r18360234);
        mpfr_init(r18360235);
        mpfr_init(r18360236);
        mpfr_init(r18360237);
        mpfr_init(r18360238);
        mpfr_init(r18360239);
        mpfr_init(r18360240);
        mpfr_init(r18360241);
        mpfr_init(r18360242);
        mpfr_init(r18360243);
        mpfr_init(r18360244);
        mpfr_init(r18360245);
        mpfr_init(r18360246);
        mpfr_init(r18360247);
        mpfr_init(r18360248);
        mpfr_init(r18360249);
        mpfr_init(r18360250);
        mpfr_init(r18360251);
        mpfr_init(r18360252);
        mpfr_init(r18360253);
        mpfr_init(r18360254);
        mpfr_init(r18360255);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r18360231, phi1, MPFR_RNDN);
        mpfr_sin(r18360232, r18360231, MPFR_RNDN);
        mpfr_set_d(r18360233, phi2, MPFR_RNDN);
        mpfr_sin(r18360234, r18360233, MPFR_RNDN);
        mpfr_mul(r18360235, r18360232, r18360234, MPFR_RNDN);
        mpfr_cos(r18360236, r18360231, MPFR_RNDN);
        mpfr_cos(r18360237, r18360233, MPFR_RNDN);
        mpfr_mul(r18360238, r18360236, r18360237, MPFR_RNDN);
        mpfr_set_d(r18360239, lambda1, MPFR_RNDN);
        mpfr_cos(r18360240, r18360239, MPFR_RNDN);
        mpfr_set_d(r18360241, lambda2, MPFR_RNDN);
        mpfr_cos(r18360242, r18360241, MPFR_RNDN);
        mpfr_mul(r18360243, r18360240, r18360242, MPFR_RNDN);
        mpfr_sin(r18360244, r18360239, MPFR_RNDN);
        mpfr_neg(r18360245, r18360241, MPFR_RNDN);
        mpfr_sin(r18360246, r18360245, MPFR_RNDN);
        mpfr_mul(r18360247, r18360244, r18360246, MPFR_RNDN);
        mpfr_sub(r18360248, r18360243, r18360247, MPFR_RNDN);
        mpfr_mul(r18360249, r18360238, r18360248, MPFR_RNDN);
        mpfr_add(r18360250, r18360235, r18360249, MPFR_RNDN);
        mpfr_acos(r18360251, r18360250, MPFR_RNDN);
        mpfr_log(r18360252, r18360251, MPFR_RNDN);
        mpfr_exp(r18360253, r18360252, MPFR_RNDN);
        mpfr_set_d(r18360254, R, MPFR_RNDN);
        mpfr_mul(r18360255, r18360253, r18360254, MPFR_RNDN);
        return mpfr_get_d(r18360255, MPFR_RNDN);
}

