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

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

double f_if(float a, float b) {
        float r35857 = a;
        float r35858 = r35857 * r35857;
        float r35859 = b;
        float r35860 = r35859 * r35859;
        float r35861 = r35858 + r35860;
        float r35862 = 2;
        float r35863 = pow(r35861, r35862);
        float r35864 = 4;
        float r35865 = r35864 * r35860;
        float r35866 = r35863 + r35865;
        float r35867 = 1;
        float r35868 = r35866 - r35867;
        return r35868;
}

double f_id(double a, double b) {
        double r35869 = a;
        double r35870 = r35869 * r35869;
        double r35871 = b;
        double r35872 = r35871 * r35871;
        double r35873 = r35870 + r35872;
        double r35874 = 2;
        double r35875 = pow(r35873, r35874);
        double r35876 = 4;
        double r35877 = r35876 * r35872;
        double r35878 = r35875 + r35877;
        double r35879 = 1;
        double r35880 = r35878 - r35879;
        return r35880;
}


double f_of(float a, float b) {
        float r35881 = a;
        float r35882 = r35881 * r35881;
        float r35883 = b;
        float r35884 = r35883 * r35883;
        float r35885 = r35882 + r35884;
        float r35886 = 2;
        float r35887 = pow(r35885, r35886);
        float r35888 = 4;
        float r35889 = r35888 * r35884;
        float r35890 = r35887 + r35889;
        float r35891 = 1;
        float r35892 = r35890 - r35891;
        return r35892;
}

double f_od(double a, double b) {
        double r35893 = a;
        double r35894 = r35893 * r35893;
        double r35895 = b;
        double r35896 = r35895 * r35895;
        double r35897 = r35894 + r35896;
        double r35898 = 2;
        double r35899 = pow(r35897, r35898);
        double r35900 = 4;
        double r35901 = r35900 * r35896;
        double r35902 = r35899 + r35901;
        double r35903 = 1;
        double r35904 = r35902 - r35903;
        return r35904;
}

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 r35905, r35906, r35907, r35908, r35909, r35910, r35911, r35912, r35913, r35914, r35915, r35916;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r35905);
        mpfr_init(r35906);
        mpfr_init(r35907);
        mpfr_init(r35908);
        mpfr_init(r35909);
        mpfr_init_set_str(r35910, "2", 10, MPFR_RNDN);
        mpfr_init(r35911);
        mpfr_init_set_str(r35912, "4", 10, MPFR_RNDN);
        mpfr_init(r35913);
        mpfr_init(r35914);
        mpfr_init_set_str(r35915, "1", 10, MPFR_RNDN);
        mpfr_init(r35916);
}

double f_im(double a, double b) {
        mpfr_set_d(r35905, a, MPFR_RNDN);
        mpfr_mul(r35906, r35905, r35905, MPFR_RNDN);
        mpfr_set_d(r35907, b, MPFR_RNDN);
        mpfr_mul(r35908, r35907, r35907, MPFR_RNDN);
        mpfr_add(r35909, r35906, r35908, MPFR_RNDN);
        ;
        mpfr_pow(r35911, r35909, r35910, MPFR_RNDN);
        ;
        mpfr_mul(r35913, r35912, r35908, MPFR_RNDN);
        mpfr_add(r35914, r35911, r35913, MPFR_RNDN);
        ;
        mpfr_sub(r35916, r35914, r35915, MPFR_RNDN);
        return mpfr_get_d(r35916, MPFR_RNDN);
}

static mpfr_t r35917, r35918, r35919, r35920, r35921, r35922, r35923, r35924, r35925, r35926, r35927, r35928;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r35917);
        mpfr_init(r35918);
        mpfr_init(r35919);
        mpfr_init(r35920);
        mpfr_init(r35921);
        mpfr_init_set_str(r35922, "2", 10, MPFR_RNDN);
        mpfr_init(r35923);
        mpfr_init_set_str(r35924, "4", 10, MPFR_RNDN);
        mpfr_init(r35925);
        mpfr_init(r35926);
        mpfr_init_set_str(r35927, "1", 10, MPFR_RNDN);
        mpfr_init(r35928);
}

double f_fm(double a, double b) {
        mpfr_set_d(r35917, a, MPFR_RNDN);
        mpfr_mul(r35918, r35917, r35917, MPFR_RNDN);
        mpfr_set_d(r35919, b, MPFR_RNDN);
        mpfr_mul(r35920, r35919, r35919, MPFR_RNDN);
        mpfr_add(r35921, r35918, r35920, MPFR_RNDN);
        ;
        mpfr_pow(r35923, r35921, r35922, MPFR_RNDN);
        ;
        mpfr_mul(r35925, r35924, r35920, MPFR_RNDN);
        mpfr_add(r35926, r35923, r35925, MPFR_RNDN);
        ;
        mpfr_sub(r35928, r35926, r35927, MPFR_RNDN);
        return mpfr_get_d(r35928, MPFR_RNDN);
}

static mpfr_t r35929, r35930, r35931, r35932, r35933, r35934, r35935, r35936, r35937, r35938, r35939, r35940;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r35929);
        mpfr_init(r35930);
        mpfr_init(r35931);
        mpfr_init(r35932);
        mpfr_init(r35933);
        mpfr_init_set_str(r35934, "2", 10, MPFR_RNDN);
        mpfr_init(r35935);
        mpfr_init_set_str(r35936, "4", 10, MPFR_RNDN);
        mpfr_init(r35937);
        mpfr_init(r35938);
        mpfr_init_set_str(r35939, "1", 10, MPFR_RNDN);
        mpfr_init(r35940);
}

double f_dm(double a, double b) {
        mpfr_set_d(r35929, a, MPFR_RNDN);
        mpfr_mul(r35930, r35929, r35929, MPFR_RNDN);
        mpfr_set_d(r35931, b, MPFR_RNDN);
        mpfr_mul(r35932, r35931, r35931, MPFR_RNDN);
        mpfr_add(r35933, r35930, r35932, MPFR_RNDN);
        ;
        mpfr_pow(r35935, r35933, r35934, MPFR_RNDN);
        ;
        mpfr_mul(r35937, r35936, r35932, MPFR_RNDN);
        mpfr_add(r35938, r35935, r35937, MPFR_RNDN);
        ;
        mpfr_sub(r35940, r35938, r35939, MPFR_RNDN);
        return mpfr_get_d(r35940, MPFR_RNDN);
}

