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

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

double f_if(float a, float b) {
        float r12039 = a;
        float r12040 = r12039 * r12039;
        float r12041 = b;
        float r12042 = r12041 * r12041;
        float r12043 = r12040 + r12042;
        float r12044 = 2;
        float r12045 = pow(r12043, r12044);
        float r12046 = 4;
        float r12047 = 1;
        float r12048 = r12047 - r12039;
        float r12049 = r12040 * r12048;
        float r12050 = 3;
        float r12051 = r12050 + r12039;
        float r12052 = r12042 * r12051;
        float r12053 = r12049 + r12052;
        float r12054 = r12046 * r12053;
        float r12055 = r12045 + r12054;
        float r12056 = r12055 - r12047;
        return r12056;
}

double f_id(double a, double b) {
        double r12057 = a;
        double r12058 = r12057 * r12057;
        double r12059 = b;
        double r12060 = r12059 * r12059;
        double r12061 = r12058 + r12060;
        double r12062 = 2;
        double r12063 = pow(r12061, r12062);
        double r12064 = 4;
        double r12065 = 1;
        double r12066 = r12065 - r12057;
        double r12067 = r12058 * r12066;
        double r12068 = 3;
        double r12069 = r12068 + r12057;
        double r12070 = r12060 * r12069;
        double r12071 = r12067 + r12070;
        double r12072 = r12064 * r12071;
        double r12073 = r12063 + r12072;
        double r12074 = r12073 - r12065;
        return r12074;
}


double f_of(float a, float b) {
        float r12075 = a;
        float r12076 = r12075 * r12075;
        float r12077 = b;
        float r12078 = r12077 * r12077;
        float r12079 = r12076 + r12078;
        float r12080 = 2;
        float r12081 = pow(r12079, r12080);
        float r12082 = 4;
        float r12083 = 1;
        float r12084 = r12083 - r12075;
        float r12085 = r12076 * r12084;
        float r12086 = 3;
        float r12087 = r12086 + r12075;
        float r12088 = r12077 * r12087;
        float r12089 = r12077 * r12088;
        float r12090 = r12085 + r12089;
        float r12091 = r12082 * r12090;
        float r12092 = r12081 + r12091;
        float r12093 = r12092 - r12083;
        return r12093;
}

double f_od(double a, double b) {
        double r12094 = a;
        double r12095 = r12094 * r12094;
        double r12096 = b;
        double r12097 = r12096 * r12096;
        double r12098 = r12095 + r12097;
        double r12099 = 2;
        double r12100 = pow(r12098, r12099);
        double r12101 = 4;
        double r12102 = 1;
        double r12103 = r12102 - r12094;
        double r12104 = r12095 * r12103;
        double r12105 = 3;
        double r12106 = r12105 + r12094;
        double r12107 = r12096 * r12106;
        double r12108 = r12096 * r12107;
        double r12109 = r12104 + r12108;
        double r12110 = r12101 * r12109;
        double r12111 = r12100 + r12110;
        double r12112 = r12111 - r12102;
        return r12112;
}

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 r12113, r12114, r12115, r12116, r12117, r12118, r12119, r12120, r12121, r12122, r12123, r12124, r12125, r12126, r12127, r12128, r12129, r12130;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r12113);
        mpfr_init(r12114);
        mpfr_init(r12115);
        mpfr_init(r12116);
        mpfr_init(r12117);
        mpfr_init_set_str(r12118, "2", 10, MPFR_RNDN);
        mpfr_init(r12119);
        mpfr_init_set_str(r12120, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12121, "1", 10, MPFR_RNDN);
        mpfr_init(r12122);
        mpfr_init(r12123);
        mpfr_init_set_str(r12124, "3", 10, MPFR_RNDN);
        mpfr_init(r12125);
        mpfr_init(r12126);
        mpfr_init(r12127);
        mpfr_init(r12128);
        mpfr_init(r12129);
        mpfr_init(r12130);
}

double f_im(double a, double b) {
        mpfr_set_d(r12113, a, MPFR_RNDN);
        mpfr_mul(r12114, r12113, r12113, MPFR_RNDN);
        mpfr_set_d(r12115, b, MPFR_RNDN);
        mpfr_mul(r12116, r12115, r12115, MPFR_RNDN);
        mpfr_add(r12117, r12114, r12116, MPFR_RNDN);
        ;
        mpfr_pow(r12119, r12117, r12118, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12122, r12121, r12113, MPFR_RNDN);
        mpfr_mul(r12123, r12114, r12122, MPFR_RNDN);
        ;
        mpfr_add(r12125, r12124, r12113, MPFR_RNDN);
        mpfr_mul(r12126, r12116, r12125, MPFR_RNDN);
        mpfr_add(r12127, r12123, r12126, MPFR_RNDN);
        mpfr_mul(r12128, r12120, r12127, MPFR_RNDN);
        mpfr_add(r12129, r12119, r12128, MPFR_RNDN);
        mpfr_sub(r12130, r12129, r12121, MPFR_RNDN);
        return mpfr_get_d(r12130, MPFR_RNDN);
}

static mpfr_t r12131, r12132, r12133, r12134, r12135, r12136, r12137, r12138, r12139, r12140, r12141, r12142, r12143, r12144, r12145, r12146, r12147, r12148, r12149;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r12131);
        mpfr_init(r12132);
        mpfr_init(r12133);
        mpfr_init(r12134);
        mpfr_init(r12135);
        mpfr_init_set_str(r12136, "2", 10, MPFR_RNDN);
        mpfr_init(r12137);
        mpfr_init_set_str(r12138, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12139, "1", 10, MPFR_RNDN);
        mpfr_init(r12140);
        mpfr_init(r12141);
        mpfr_init_set_str(r12142, "3", 10, MPFR_RNDN);
        mpfr_init(r12143);
        mpfr_init(r12144);
        mpfr_init(r12145);
        mpfr_init(r12146);
        mpfr_init(r12147);
        mpfr_init(r12148);
        mpfr_init(r12149);
}

double f_fm(double a, double b) {
        mpfr_set_d(r12131, a, MPFR_RNDN);
        mpfr_mul(r12132, r12131, r12131, MPFR_RNDN);
        mpfr_set_d(r12133, b, MPFR_RNDN);
        mpfr_mul(r12134, r12133, r12133, MPFR_RNDN);
        mpfr_add(r12135, r12132, r12134, MPFR_RNDN);
        ;
        mpfr_pow(r12137, r12135, r12136, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12140, r12139, r12131, MPFR_RNDN);
        mpfr_mul(r12141, r12132, r12140, MPFR_RNDN);
        ;
        mpfr_add(r12143, r12142, r12131, MPFR_RNDN);
        mpfr_mul(r12144, r12133, r12143, MPFR_RNDN);
        mpfr_mul(r12145, r12133, r12144, MPFR_RNDN);
        mpfr_add(r12146, r12141, r12145, MPFR_RNDN);
        mpfr_mul(r12147, r12138, r12146, MPFR_RNDN);
        mpfr_add(r12148, r12137, r12147, MPFR_RNDN);
        mpfr_sub(r12149, r12148, r12139, MPFR_RNDN);
        return mpfr_get_d(r12149, MPFR_RNDN);
}

static mpfr_t r12150, r12151, r12152, r12153, r12154, r12155, r12156, r12157, r12158, r12159, r12160, r12161, r12162, r12163, r12164, r12165, r12166, r12167, r12168;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r12150);
        mpfr_init(r12151);
        mpfr_init(r12152);
        mpfr_init(r12153);
        mpfr_init(r12154);
        mpfr_init_set_str(r12155, "2", 10, MPFR_RNDN);
        mpfr_init(r12156);
        mpfr_init_set_str(r12157, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r12158, "1", 10, MPFR_RNDN);
        mpfr_init(r12159);
        mpfr_init(r12160);
        mpfr_init_set_str(r12161, "3", 10, MPFR_RNDN);
        mpfr_init(r12162);
        mpfr_init(r12163);
        mpfr_init(r12164);
        mpfr_init(r12165);
        mpfr_init(r12166);
        mpfr_init(r12167);
        mpfr_init(r12168);
}

double f_dm(double a, double b) {
        mpfr_set_d(r12150, a, MPFR_RNDN);
        mpfr_mul(r12151, r12150, r12150, MPFR_RNDN);
        mpfr_set_d(r12152, b, MPFR_RNDN);
        mpfr_mul(r12153, r12152, r12152, MPFR_RNDN);
        mpfr_add(r12154, r12151, r12153, MPFR_RNDN);
        ;
        mpfr_pow(r12156, r12154, r12155, MPFR_RNDN);
        ;
        ;
        mpfr_sub(r12159, r12158, r12150, MPFR_RNDN);
        mpfr_mul(r12160, r12151, r12159, MPFR_RNDN);
        ;
        mpfr_add(r12162, r12161, r12150, MPFR_RNDN);
        mpfr_mul(r12163, r12152, r12162, MPFR_RNDN);
        mpfr_mul(r12164, r12152, r12163, MPFR_RNDN);
        mpfr_add(r12165, r12160, r12164, MPFR_RNDN);
        mpfr_mul(r12166, r12157, r12165, MPFR_RNDN);
        mpfr_add(r12167, r12156, r12166, MPFR_RNDN);
        mpfr_sub(r12168, r12167, r12158, MPFR_RNDN);
        return mpfr_get_d(r12168, MPFR_RNDN);
}

