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

char *name = "Bouland and Aaronson, Equation (25)";

double f_if(float a, float b) {
        float r6839 = a;
        float r6840 = r6839 * r6839;
        float r6841 = b;
        float r6842 = r6841 * r6841;
        float r6843 = r6840 + r6842;
        float r6844 = 2;
        float r6845 = pow(r6843, r6844);
        float r6846 = 4;
        float r6847 = 1;
        float r6848 = r6847 + r6839;
        float r6849 = r6840 * r6848;
        float r6850 = 3;
        float r6851 = r6850 * r6839;
        float r6852 = r6847 - r6851;
        float r6853 = r6842 * r6852;
        float r6854 = r6849 + r6853;
        float r6855 = r6846 * r6854;
        float r6856 = r6845 + r6855;
        float r6857 = r6856 - r6847;
        return r6857;
}

double f_id(double a, double b) {
        double r6858 = a;
        double r6859 = r6858 * r6858;
        double r6860 = b;
        double r6861 = r6860 * r6860;
        double r6862 = r6859 + r6861;
        double r6863 = 2;
        double r6864 = pow(r6862, r6863);
        double r6865 = 4;
        double r6866 = 1;
        double r6867 = r6866 + r6858;
        double r6868 = r6859 * r6867;
        double r6869 = 3;
        double r6870 = r6869 * r6858;
        double r6871 = r6866 - r6870;
        double r6872 = r6861 * r6871;
        double r6873 = r6868 + r6872;
        double r6874 = r6865 * r6873;
        double r6875 = r6864 + r6874;
        double r6876 = r6875 - r6866;
        return r6876;
}


double f_of(float a, float b) {
        float r6877 = a;
        float r6878 = r6877 * r6877;
        float r6879 = b;
        float r6880 = r6879 * r6879;
        float r6881 = r6878 + r6880;
        float r6882 = 2;
        float r6883 = pow(r6881, r6882);
        float r6884 = 4;
        float r6885 = 1;
        float r6886 = r6885 + r6877;
        float r6887 = r6878 * r6886;
        float r6888 = 3;
        float r6889 = r6888 * r6877;
        float r6890 = r6885 - r6889;
        float r6891 = r6880 * r6890;
        float r6892 = r6887 + r6891;
        float r6893 = r6884 * r6892;
        float r6894 = r6883 + r6893;
        float r6895 = r6894 - r6885;
        return r6895;
}

double f_od(double a, double b) {
        double r6896 = a;
        double r6897 = r6896 * r6896;
        double r6898 = b;
        double r6899 = r6898 * r6898;
        double r6900 = r6897 + r6899;
        double r6901 = 2;
        double r6902 = pow(r6900, r6901);
        double r6903 = 4;
        double r6904 = 1;
        double r6905 = r6904 + r6896;
        double r6906 = r6897 * r6905;
        double r6907 = 3;
        double r6908 = r6907 * r6896;
        double r6909 = r6904 - r6908;
        double r6910 = r6899 * r6909;
        double r6911 = r6906 + r6910;
        double r6912 = r6903 * r6911;
        double r6913 = r6902 + r6912;
        double r6914 = r6913 - r6904;
        return r6914;
}

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 r6915, r6916, r6917, r6918, r6919, r6920, r6921, r6922, r6923, r6924, r6925, r6926, r6927, r6928, r6929, r6930, r6931, r6932, r6933;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r6915);
        mpfr_init(r6916);
        mpfr_init(r6917);
        mpfr_init(r6918);
        mpfr_init(r6919);
        mpfr_init_set_str(r6920, "2", 10, MPFR_RNDN);
        mpfr_init(r6921);
        mpfr_init_set_str(r6922, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r6923, "1", 10, MPFR_RNDN);
        mpfr_init(r6924);
        mpfr_init(r6925);
        mpfr_init_set_str(r6926, "3", 10, MPFR_RNDN);
        mpfr_init(r6927);
        mpfr_init(r6928);
        mpfr_init(r6929);
        mpfr_init(r6930);
        mpfr_init(r6931);
        mpfr_init(r6932);
        mpfr_init(r6933);
}

double f_im(double a, double b) {
        mpfr_set_d(r6915, a, MPFR_RNDN);
        mpfr_mul(r6916, r6915, r6915, MPFR_RNDN);
        mpfr_set_d(r6917, b, MPFR_RNDN);
        mpfr_mul(r6918, r6917, r6917, MPFR_RNDN);
        mpfr_add(r6919, r6916, r6918, MPFR_RNDN);
        ;
        mpfr_pow(r6921, r6919, r6920, MPFR_RNDN);
        ;
        ;
        mpfr_add(r6924, r6923, r6915, MPFR_RNDN);
        mpfr_mul(r6925, r6916, r6924, MPFR_RNDN);
        ;
        mpfr_mul(r6927, r6926, r6915, MPFR_RNDN);
        mpfr_sub(r6928, r6923, r6927, MPFR_RNDN);
        mpfr_mul(r6929, r6918, r6928, MPFR_RNDN);
        mpfr_add(r6930, r6925, r6929, MPFR_RNDN);
        mpfr_mul(r6931, r6922, r6930, MPFR_RNDN);
        mpfr_add(r6932, r6921, r6931, MPFR_RNDN);
        mpfr_sub(r6933, r6932, r6923, MPFR_RNDN);
        return mpfr_get_d(r6933, MPFR_RNDN);
}

static mpfr_t r6934, r6935, r6936, r6937, r6938, r6939, r6940, r6941, r6942, r6943, r6944, r6945, r6946, r6947, r6948, r6949, r6950, r6951, r6952;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r6934);
        mpfr_init(r6935);
        mpfr_init(r6936);
        mpfr_init(r6937);
        mpfr_init(r6938);
        mpfr_init_set_str(r6939, "2", 10, MPFR_RNDN);
        mpfr_init(r6940);
        mpfr_init_set_str(r6941, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r6942, "1", 10, MPFR_RNDN);
        mpfr_init(r6943);
        mpfr_init(r6944);
        mpfr_init_set_str(r6945, "3", 10, MPFR_RNDN);
        mpfr_init(r6946);
        mpfr_init(r6947);
        mpfr_init(r6948);
        mpfr_init(r6949);
        mpfr_init(r6950);
        mpfr_init(r6951);
        mpfr_init(r6952);
}

double f_fm(double a, double b) {
        mpfr_set_d(r6934, a, MPFR_RNDN);
        mpfr_mul(r6935, r6934, r6934, MPFR_RNDN);
        mpfr_set_d(r6936, b, MPFR_RNDN);
        mpfr_mul(r6937, r6936, r6936, MPFR_RNDN);
        mpfr_add(r6938, r6935, r6937, MPFR_RNDN);
        ;
        mpfr_pow(r6940, r6938, r6939, MPFR_RNDN);
        ;
        ;
        mpfr_add(r6943, r6942, r6934, MPFR_RNDN);
        mpfr_mul(r6944, r6935, r6943, MPFR_RNDN);
        ;
        mpfr_mul(r6946, r6945, r6934, MPFR_RNDN);
        mpfr_sub(r6947, r6942, r6946, MPFR_RNDN);
        mpfr_mul(r6948, r6937, r6947, MPFR_RNDN);
        mpfr_add(r6949, r6944, r6948, MPFR_RNDN);
        mpfr_mul(r6950, r6941, r6949, MPFR_RNDN);
        mpfr_add(r6951, r6940, r6950, MPFR_RNDN);
        mpfr_sub(r6952, r6951, r6942, MPFR_RNDN);
        return mpfr_get_d(r6952, MPFR_RNDN);
}

static mpfr_t r6953, r6954, r6955, r6956, r6957, r6958, r6959, r6960, r6961, r6962, r6963, r6964, r6965, r6966, r6967, r6968, r6969, r6970, r6971;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r6953);
        mpfr_init(r6954);
        mpfr_init(r6955);
        mpfr_init(r6956);
        mpfr_init(r6957);
        mpfr_init_set_str(r6958, "2", 10, MPFR_RNDN);
        mpfr_init(r6959);
        mpfr_init_set_str(r6960, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r6961, "1", 10, MPFR_RNDN);
        mpfr_init(r6962);
        mpfr_init(r6963);
        mpfr_init_set_str(r6964, "3", 10, MPFR_RNDN);
        mpfr_init(r6965);
        mpfr_init(r6966);
        mpfr_init(r6967);
        mpfr_init(r6968);
        mpfr_init(r6969);
        mpfr_init(r6970);
        mpfr_init(r6971);
}

double f_dm(double a, double b) {
        mpfr_set_d(r6953, a, MPFR_RNDN);
        mpfr_mul(r6954, r6953, r6953, MPFR_RNDN);
        mpfr_set_d(r6955, b, MPFR_RNDN);
        mpfr_mul(r6956, r6955, r6955, MPFR_RNDN);
        mpfr_add(r6957, r6954, r6956, MPFR_RNDN);
        ;
        mpfr_pow(r6959, r6957, r6958, MPFR_RNDN);
        ;
        ;
        mpfr_add(r6962, r6961, r6953, MPFR_RNDN);
        mpfr_mul(r6963, r6954, r6962, MPFR_RNDN);
        ;
        mpfr_mul(r6965, r6964, r6953, MPFR_RNDN);
        mpfr_sub(r6966, r6961, r6965, MPFR_RNDN);
        mpfr_mul(r6967, r6956, r6966, MPFR_RNDN);
        mpfr_add(r6968, r6963, r6967, MPFR_RNDN);
        mpfr_mul(r6969, r6960, r6968, MPFR_RNDN);
        mpfr_add(r6970, r6959, r6969, MPFR_RNDN);
        mpfr_sub(r6971, r6970, r6961, MPFR_RNDN);
        return mpfr_get_d(r6971, MPFR_RNDN);
}

