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

char *name = "Distance on a great circle";

double f_if(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r33580 = R;
        float r33581 = 2;
        float r33582 = phi1;
        float r33583 = phi2;
        float r33584 = r33582 - r33583;
        float r33585 = r33584 / r33581;
        float r33586 = sin(r33585);
        float r33587 = pow(r33586, r33581);
        float r33588 = cos(r33582);
        float r33589 = cos(r33583);
        float r33590 = r33588 * r33589;
        float r33591 = lambda1;
        float r33592 = lambda2;
        float r33593 = r33591 - r33592;
        float r33594 = r33593 / r33581;
        float r33595 = sin(r33594);
        float r33596 = r33590 * r33595;
        float r33597 = r33596 * r33595;
        float r33598 = r33587 + r33597;
        float r33599 = sqrt(r33598);
        float r33600 = 1;
        float r33601 = r33600 - r33598;
        float r33602 = sqrt(r33601);
        float r33603 = atan2(r33599, r33602);
        float r33604 = r33581 * r33603;
        float r33605 = r33580 * r33604;
        return r33605;
}

double f_id(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33606 = R;
        double r33607 = 2;
        double r33608 = phi1;
        double r33609 = phi2;
        double r33610 = r33608 - r33609;
        double r33611 = r33610 / r33607;
        double r33612 = sin(r33611);
        double r33613 = pow(r33612, r33607);
        double r33614 = cos(r33608);
        double r33615 = cos(r33609);
        double r33616 = r33614 * r33615;
        double r33617 = lambda1;
        double r33618 = lambda2;
        double r33619 = r33617 - r33618;
        double r33620 = r33619 / r33607;
        double r33621 = sin(r33620);
        double r33622 = r33616 * r33621;
        double r33623 = r33622 * r33621;
        double r33624 = r33613 + r33623;
        double r33625 = sqrt(r33624);
        double r33626 = 1;
        double r33627 = r33626 - r33624;
        double r33628 = sqrt(r33627);
        double r33629 = atan2(r33625, r33628);
        double r33630 = r33607 * r33629;
        double r33631 = r33606 * r33630;
        return r33631;
}


double f_of(float R, float lambda1, float lambda2, float phi1, float phi2) {
        float r33632 = R;
        float r33633 = 2;
        float r33634 = phi1;
        float r33635 = r33634 / r33633;
        float r33636 = sin(r33635);
        float r33637 = phi2;
        float r33638 = r33637 / r33633;
        float r33639 = cos(r33638);
        float r33640 = r33636 * r33639;
        float r33641 = cos(r33635);
        float r33642 = sin(r33638);
        float r33643 = r33641 * r33642;
        float r33644 = r33640 - r33643;
        float r33645 = pow(r33644, r33633);
        float r33646 = cos(r33634);
        float r33647 = cos(r33637);
        float r33648 = r33646 * r33647;
        float r33649 = lambda1;
        float r33650 = lambda2;
        float r33651 = r33649 - r33650;
        float r33652 = r33651 / r33633;
        float r33653 = sin(r33652);
        float r33654 = r33648 * r33653;
        float r33655 = 3;
        float r33656 = pow(r33653, r33655);
        float r33657 = cbrt(r33656);
        float r33658 = r33654 * r33657;
        float r33659 = r33645 + r33658;
        float r33660 = sqrt(r33659);
        float r33661 = 1;
        float r33662 = r33654 * r33653;
        float r33663 = r33645 + r33662;
        float r33664 = r33661 - r33663;
        float r33665 = sqrt(r33664);
        float r33666 = atan2(r33660, r33665);
        float r33667 = r33633 * r33666;
        float r33668 = r33632 * r33667;
        return r33668;
}

double f_od(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r33669 = R;
        double r33670 = 2;
        double r33671 = phi1;
        double r33672 = r33671 / r33670;
        double r33673 = sin(r33672);
        double r33674 = phi2;
        double r33675 = r33674 / r33670;
        double r33676 = cos(r33675);
        double r33677 = r33673 * r33676;
        double r33678 = cos(r33672);
        double r33679 = sin(r33675);
        double r33680 = r33678 * r33679;
        double r33681 = r33677 - r33680;
        double r33682 = pow(r33681, r33670);
        double r33683 = cos(r33671);
        double r33684 = cos(r33674);
        double r33685 = r33683 * r33684;
        double r33686 = lambda1;
        double r33687 = lambda2;
        double r33688 = r33686 - r33687;
        double r33689 = r33688 / r33670;
        double r33690 = sin(r33689);
        double r33691 = r33685 * r33690;
        double r33692 = 3;
        double r33693 = pow(r33690, r33692);
        double r33694 = cbrt(r33693);
        double r33695 = r33691 * r33694;
        double r33696 = r33682 + r33695;
        double r33697 = sqrt(r33696);
        double r33698 = 1;
        double r33699 = r33691 * r33690;
        double r33700 = r33682 + r33699;
        double r33701 = r33698 - r33700;
        double r33702 = sqrt(r33701);
        double r33703 = atan2(r33697, r33702);
        double r33704 = r33670 * r33703;
        double r33705 = r33669 * r33704;
        return r33705;
}

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 r33706, r33707, r33708, r33709, r33710, r33711, r33712, r33713, r33714, r33715, r33716, r33717, r33718, r33719, r33720, r33721, r33722, r33723, r33724, r33725, r33726, r33727, r33728, r33729, r33730, r33731;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33706);
        mpfr_init_set_str(r33707, "2", 10, MPFR_RNDN);
        mpfr_init(r33708);
        mpfr_init(r33709);
        mpfr_init(r33710);
        mpfr_init(r33711);
        mpfr_init(r33712);
        mpfr_init(r33713);
        mpfr_init(r33714);
        mpfr_init(r33715);
        mpfr_init(r33716);
        mpfr_init(r33717);
        mpfr_init(r33718);
        mpfr_init(r33719);
        mpfr_init(r33720);
        mpfr_init(r33721);
        mpfr_init(r33722);
        mpfr_init(r33723);
        mpfr_init(r33724);
        mpfr_init(r33725);
        mpfr_init_set_str(r33726, "1", 10, MPFR_RNDN);
        mpfr_init(r33727);
        mpfr_init(r33728);
        mpfr_init(r33729);
        mpfr_init(r33730);
        mpfr_init(r33731);
}

double f_im(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33706, R, MPFR_RNDN);
        ;
        mpfr_set_d(r33708, phi1, MPFR_RNDN);
        mpfr_set_d(r33709, phi2, MPFR_RNDN);
        mpfr_sub(r33710, r33708, r33709, MPFR_RNDN);
        mpfr_div(r33711, r33710, r33707, MPFR_RNDN);
        mpfr_sin(r33712, r33711, MPFR_RNDN);
        mpfr_pow(r33713, r33712, r33707, MPFR_RNDN);
        mpfr_cos(r33714, r33708, MPFR_RNDN);
        mpfr_cos(r33715, r33709, MPFR_RNDN);
        mpfr_mul(r33716, r33714, r33715, MPFR_RNDN);
        mpfr_set_d(r33717, lambda1, MPFR_RNDN);
        mpfr_set_d(r33718, lambda2, MPFR_RNDN);
        mpfr_sub(r33719, r33717, r33718, MPFR_RNDN);
        mpfr_div(r33720, r33719, r33707, MPFR_RNDN);
        mpfr_sin(r33721, r33720, MPFR_RNDN);
        mpfr_mul(r33722, r33716, r33721, MPFR_RNDN);
        mpfr_mul(r33723, r33722, r33721, MPFR_RNDN);
        mpfr_add(r33724, r33713, r33723, MPFR_RNDN);
        mpfr_sqrt(r33725, r33724, MPFR_RNDN);
        ;
        mpfr_sub(r33727, r33726, r33724, MPFR_RNDN);
        mpfr_sqrt(r33728, r33727, MPFR_RNDN);
        mpfr_atan2(r33729, r33725, r33728, MPFR_RNDN);
        mpfr_mul(r33730, r33707, r33729, MPFR_RNDN);
        mpfr_mul(r33731, r33706, r33730, MPFR_RNDN);
        return mpfr_get_d(r33731, MPFR_RNDN);
}

static mpfr_t r33732, r33733, r33734, r33735, r33736, r33737, r33738, r33739, r33740, r33741, r33742, r33743, r33744, r33745, r33746, r33747, r33748, r33749, r33750, r33751, r33752, r33753, r33754, r33755, r33756, r33757, r33758, r33759, r33760, r33761, r33762, r33763, r33764, r33765, r33766, r33767, r33768;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33732);
        mpfr_init_set_str(r33733, "2", 10, MPFR_RNDN);
        mpfr_init(r33734);
        mpfr_init(r33735);
        mpfr_init(r33736);
        mpfr_init(r33737);
        mpfr_init(r33738);
        mpfr_init(r33739);
        mpfr_init(r33740);
        mpfr_init(r33741);
        mpfr_init(r33742);
        mpfr_init(r33743);
        mpfr_init(r33744);
        mpfr_init(r33745);
        mpfr_init(r33746);
        mpfr_init(r33747);
        mpfr_init(r33748);
        mpfr_init(r33749);
        mpfr_init(r33750);
        mpfr_init(r33751);
        mpfr_init(r33752);
        mpfr_init(r33753);
        mpfr_init(r33754);
        mpfr_init_set_str(r33755, "3", 10, MPFR_RNDN);
        mpfr_init(r33756);
        mpfr_init(r33757);
        mpfr_init(r33758);
        mpfr_init(r33759);
        mpfr_init(r33760);
        mpfr_init_set_str(r33761, "1", 10, MPFR_RNDN);
        mpfr_init(r33762);
        mpfr_init(r33763);
        mpfr_init(r33764);
        mpfr_init(r33765);
        mpfr_init(r33766);
        mpfr_init(r33767);
        mpfr_init(r33768);
}

double f_fm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33732, R, MPFR_RNDN);
        ;
        mpfr_set_d(r33734, phi1, MPFR_RNDN);
        mpfr_div(r33735, r33734, r33733, MPFR_RNDN);
        mpfr_sin(r33736, r33735, MPFR_RNDN);
        mpfr_set_d(r33737, phi2, MPFR_RNDN);
        mpfr_div(r33738, r33737, r33733, MPFR_RNDN);
        mpfr_cos(r33739, r33738, MPFR_RNDN);
        mpfr_mul(r33740, r33736, r33739, MPFR_RNDN);
        mpfr_cos(r33741, r33735, MPFR_RNDN);
        mpfr_sin(r33742, r33738, MPFR_RNDN);
        mpfr_mul(r33743, r33741, r33742, MPFR_RNDN);
        mpfr_sub(r33744, r33740, r33743, MPFR_RNDN);
        mpfr_pow(r33745, r33744, r33733, MPFR_RNDN);
        mpfr_cos(r33746, r33734, MPFR_RNDN);
        mpfr_cos(r33747, r33737, MPFR_RNDN);
        mpfr_mul(r33748, r33746, r33747, MPFR_RNDN);
        mpfr_set_d(r33749, lambda1, MPFR_RNDN);
        mpfr_set_d(r33750, lambda2, MPFR_RNDN);
        mpfr_sub(r33751, r33749, r33750, MPFR_RNDN);
        mpfr_div(r33752, r33751, r33733, MPFR_RNDN);
        mpfr_sin(r33753, r33752, MPFR_RNDN);
        mpfr_mul(r33754, r33748, r33753, MPFR_RNDN);
        ;
        mpfr_pow(r33756, r33753, r33755, MPFR_RNDN);
        mpfr_cbrt(r33757, r33756, MPFR_RNDN);
        mpfr_mul(r33758, r33754, r33757, MPFR_RNDN);
        mpfr_add(r33759, r33745, r33758, MPFR_RNDN);
        mpfr_sqrt(r33760, r33759, MPFR_RNDN);
        ;
        mpfr_mul(r33762, r33754, r33753, MPFR_RNDN);
        mpfr_add(r33763, r33745, r33762, MPFR_RNDN);
        mpfr_sub(r33764, r33761, r33763, MPFR_RNDN);
        mpfr_sqrt(r33765, r33764, MPFR_RNDN);
        mpfr_atan2(r33766, r33760, r33765, MPFR_RNDN);
        mpfr_mul(r33767, r33733, r33766, MPFR_RNDN);
        mpfr_mul(r33768, r33732, r33767, MPFR_RNDN);
        return mpfr_get_d(r33768, MPFR_RNDN);
}

static mpfr_t r33769, r33770, r33771, r33772, r33773, r33774, r33775, r33776, r33777, r33778, r33779, r33780, r33781, r33782, r33783, r33784, r33785, r33786, r33787, r33788, r33789, r33790, r33791, r33792, r33793, r33794, r33795, r33796, r33797, r33798, r33799, r33800, r33801, r33802, r33803, r33804, r33805;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(1424);
        mpfr_init(r33769);
        mpfr_init_set_str(r33770, "2", 10, MPFR_RNDN);
        mpfr_init(r33771);
        mpfr_init(r33772);
        mpfr_init(r33773);
        mpfr_init(r33774);
        mpfr_init(r33775);
        mpfr_init(r33776);
        mpfr_init(r33777);
        mpfr_init(r33778);
        mpfr_init(r33779);
        mpfr_init(r33780);
        mpfr_init(r33781);
        mpfr_init(r33782);
        mpfr_init(r33783);
        mpfr_init(r33784);
        mpfr_init(r33785);
        mpfr_init(r33786);
        mpfr_init(r33787);
        mpfr_init(r33788);
        mpfr_init(r33789);
        mpfr_init(r33790);
        mpfr_init(r33791);
        mpfr_init_set_str(r33792, "3", 10, MPFR_RNDN);
        mpfr_init(r33793);
        mpfr_init(r33794);
        mpfr_init(r33795);
        mpfr_init(r33796);
        mpfr_init(r33797);
        mpfr_init_set_str(r33798, "1", 10, MPFR_RNDN);
        mpfr_init(r33799);
        mpfr_init(r33800);
        mpfr_init(r33801);
        mpfr_init(r33802);
        mpfr_init(r33803);
        mpfr_init(r33804);
        mpfr_init(r33805);
}

double f_dm(double R, double lambda1, double lambda2, double phi1, double phi2) {
        mpfr_set_d(r33769, R, MPFR_RNDN);
        ;
        mpfr_set_d(r33771, phi1, MPFR_RNDN);
        mpfr_div(r33772, r33771, r33770, MPFR_RNDN);
        mpfr_sin(r33773, r33772, MPFR_RNDN);
        mpfr_set_d(r33774, phi2, MPFR_RNDN);
        mpfr_div(r33775, r33774, r33770, MPFR_RNDN);
        mpfr_cos(r33776, r33775, MPFR_RNDN);
        mpfr_mul(r33777, r33773, r33776, MPFR_RNDN);
        mpfr_cos(r33778, r33772, MPFR_RNDN);
        mpfr_sin(r33779, r33775, MPFR_RNDN);
        mpfr_mul(r33780, r33778, r33779, MPFR_RNDN);
        mpfr_sub(r33781, r33777, r33780, MPFR_RNDN);
        mpfr_pow(r33782, r33781, r33770, MPFR_RNDN);
        mpfr_cos(r33783, r33771, MPFR_RNDN);
        mpfr_cos(r33784, r33774, MPFR_RNDN);
        mpfr_mul(r33785, r33783, r33784, MPFR_RNDN);
        mpfr_set_d(r33786, lambda1, MPFR_RNDN);
        mpfr_set_d(r33787, lambda2, MPFR_RNDN);
        mpfr_sub(r33788, r33786, r33787, MPFR_RNDN);
        mpfr_div(r33789, r33788, r33770, MPFR_RNDN);
        mpfr_sin(r33790, r33789, MPFR_RNDN);
        mpfr_mul(r33791, r33785, r33790, MPFR_RNDN);
        ;
        mpfr_pow(r33793, r33790, r33792, MPFR_RNDN);
        mpfr_cbrt(r33794, r33793, MPFR_RNDN);
        mpfr_mul(r33795, r33791, r33794, MPFR_RNDN);
        mpfr_add(r33796, r33782, r33795, MPFR_RNDN);
        mpfr_sqrt(r33797, r33796, MPFR_RNDN);
        ;
        mpfr_mul(r33799, r33791, r33790, MPFR_RNDN);
        mpfr_add(r33800, r33782, r33799, MPFR_RNDN);
        mpfr_sub(r33801, r33798, r33800, MPFR_RNDN);
        mpfr_sqrt(r33802, r33801, MPFR_RNDN);
        mpfr_atan2(r33803, r33797, r33802, MPFR_RNDN);
        mpfr_mul(r33804, r33770, r33803, MPFR_RNDN);
        mpfr_mul(r33805, r33769, r33804, MPFR_RNDN);
        return mpfr_get_d(r33805, MPFR_RNDN);
}

