#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 r36074 = a;
        float r36075 = r36074 * r36074;
        float r36076 = b;
        float r36077 = r36076 * r36076;
        float r36078 = r36075 + r36077;
        float r36079 = 2;
        float r36080 = pow(r36078, r36079);
        float r36081 = 4;
        float r36082 = 1;
        float r36083 = r36082 + r36074;
        float r36084 = r36075 * r36083;
        float r36085 = 3;
        float r36086 = r36085 * r36074;
        float r36087 = r36082 - r36086;
        float r36088 = r36077 * r36087;
        float r36089 = r36084 + r36088;
        float r36090 = r36081 * r36089;
        float r36091 = r36080 + r36090;
        float r36092 = r36091 - r36082;
        return r36092;
}

double f_id(double a, double b) {
        double r36093 = a;
        double r36094 = r36093 * r36093;
        double r36095 = b;
        double r36096 = r36095 * r36095;
        double r36097 = r36094 + r36096;
        double r36098 = 2;
        double r36099 = pow(r36097, r36098);
        double r36100 = 4;
        double r36101 = 1;
        double r36102 = r36101 + r36093;
        double r36103 = r36094 * r36102;
        double r36104 = 3;
        double r36105 = r36104 * r36093;
        double r36106 = r36101 - r36105;
        double r36107 = r36096 * r36106;
        double r36108 = r36103 + r36107;
        double r36109 = r36100 * r36108;
        double r36110 = r36099 + r36109;
        double r36111 = r36110 - r36101;
        return r36111;
}


double f_of(float a, float b) {
        float r36112 = a;
        float r36113 = r36112 * r36112;
        float r36114 = b;
        float r36115 = r36114 * r36114;
        float r36116 = r36113 + r36115;
        float r36117 = 2;
        float r36118 = pow(r36116, r36117);
        float r36119 = 4;
        float r36120 = 1;
        float r36121 = r36120 + r36112;
        float r36122 = r36113 * r36121;
        float r36123 = 3;
        float r36124 = r36123 * r36112;
        float r36125 = r36120 - r36124;
        float r36126 = r36115 * r36125;
        float r36127 = r36122 + r36126;
        float r36128 = r36119 * r36127;
        float r36129 = r36118 + r36128;
        float r36130 = r36129 - r36120;
        return r36130;
}

double f_od(double a, double b) {
        double r36131 = a;
        double r36132 = r36131 * r36131;
        double r36133 = b;
        double r36134 = r36133 * r36133;
        double r36135 = r36132 + r36134;
        double r36136 = 2;
        double r36137 = pow(r36135, r36136);
        double r36138 = 4;
        double r36139 = 1;
        double r36140 = r36139 + r36131;
        double r36141 = r36132 * r36140;
        double r36142 = 3;
        double r36143 = r36142 * r36131;
        double r36144 = r36139 - r36143;
        double r36145 = r36134 * r36144;
        double r36146 = r36141 + r36145;
        double r36147 = r36138 * r36146;
        double r36148 = r36137 + r36147;
        double r36149 = r36148 - r36139;
        return r36149;
}

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 r36150, r36151, r36152, r36153, r36154, r36155, r36156, r36157, r36158, r36159, r36160, r36161, r36162, r36163, r36164, r36165, r36166, r36167, r36168;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r36150);
        mpfr_init(r36151);
        mpfr_init(r36152);
        mpfr_init(r36153);
        mpfr_init(r36154);
        mpfr_init_set_str(r36155, "2", 10, MPFR_RNDN);
        mpfr_init(r36156);
        mpfr_init_set_str(r36157, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36158, "1", 10, MPFR_RNDN);
        mpfr_init(r36159);
        mpfr_init(r36160);
        mpfr_init_set_str(r36161, "3", 10, MPFR_RNDN);
        mpfr_init(r36162);
        mpfr_init(r36163);
        mpfr_init(r36164);
        mpfr_init(r36165);
        mpfr_init(r36166);
        mpfr_init(r36167);
        mpfr_init(r36168);
}

double f_im(double a, double b) {
        mpfr_set_d(r36150, a, MPFR_RNDN);
        mpfr_mul(r36151, r36150, r36150, MPFR_RNDN);
        mpfr_set_d(r36152, b, MPFR_RNDN);
        mpfr_mul(r36153, r36152, r36152, MPFR_RNDN);
        mpfr_add(r36154, r36151, r36153, MPFR_RNDN);
        ;
        mpfr_pow(r36156, r36154, r36155, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36159, r36158, r36150, MPFR_RNDN);
        mpfr_mul(r36160, r36151, r36159, MPFR_RNDN);
        ;
        mpfr_mul(r36162, r36161, r36150, MPFR_RNDN);
        mpfr_sub(r36163, r36158, r36162, MPFR_RNDN);
        mpfr_mul(r36164, r36153, r36163, MPFR_RNDN);
        mpfr_add(r36165, r36160, r36164, MPFR_RNDN);
        mpfr_mul(r36166, r36157, r36165, MPFR_RNDN);
        mpfr_add(r36167, r36156, r36166, MPFR_RNDN);
        mpfr_sub(r36168, r36167, r36158, MPFR_RNDN);
        return mpfr_get_d(r36168, MPFR_RNDN);
}

static mpfr_t r36169, r36170, r36171, r36172, r36173, r36174, r36175, r36176, r36177, r36178, r36179, r36180, r36181, r36182, r36183, r36184, r36185, r36186, r36187;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36169);
        mpfr_init(r36170);
        mpfr_init(r36171);
        mpfr_init(r36172);
        mpfr_init(r36173);
        mpfr_init_set_str(r36174, "2", 10, MPFR_RNDN);
        mpfr_init(r36175);
        mpfr_init_set_str(r36176, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36177, "1", 10, MPFR_RNDN);
        mpfr_init(r36178);
        mpfr_init(r36179);
        mpfr_init_set_str(r36180, "3", 10, MPFR_RNDN);
        mpfr_init(r36181);
        mpfr_init(r36182);
        mpfr_init(r36183);
        mpfr_init(r36184);
        mpfr_init(r36185);
        mpfr_init(r36186);
        mpfr_init(r36187);
}

double f_fm(double a, double b) {
        mpfr_set_d(r36169, a, MPFR_RNDN);
        mpfr_mul(r36170, r36169, r36169, MPFR_RNDN);
        mpfr_set_d(r36171, b, MPFR_RNDN);
        mpfr_mul(r36172, r36171, r36171, MPFR_RNDN);
        mpfr_add(r36173, r36170, r36172, MPFR_RNDN);
        ;
        mpfr_pow(r36175, r36173, r36174, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36178, r36177, r36169, MPFR_RNDN);
        mpfr_mul(r36179, r36170, r36178, MPFR_RNDN);
        ;
        mpfr_mul(r36181, r36180, r36169, MPFR_RNDN);
        mpfr_sub(r36182, r36177, r36181, MPFR_RNDN);
        mpfr_mul(r36183, r36172, r36182, MPFR_RNDN);
        mpfr_add(r36184, r36179, r36183, MPFR_RNDN);
        mpfr_mul(r36185, r36176, r36184, MPFR_RNDN);
        mpfr_add(r36186, r36175, r36185, MPFR_RNDN);
        mpfr_sub(r36187, r36186, r36177, MPFR_RNDN);
        return mpfr_get_d(r36187, MPFR_RNDN);
}

static mpfr_t r36188, r36189, r36190, r36191, r36192, r36193, r36194, r36195, r36196, r36197, r36198, r36199, r36200, r36201, r36202, r36203, r36204, r36205, r36206;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r36188);
        mpfr_init(r36189);
        mpfr_init(r36190);
        mpfr_init(r36191);
        mpfr_init(r36192);
        mpfr_init_set_str(r36193, "2", 10, MPFR_RNDN);
        mpfr_init(r36194);
        mpfr_init_set_str(r36195, "4", 10, MPFR_RNDN);
        mpfr_init_set_str(r36196, "1", 10, MPFR_RNDN);
        mpfr_init(r36197);
        mpfr_init(r36198);
        mpfr_init_set_str(r36199, "3", 10, MPFR_RNDN);
        mpfr_init(r36200);
        mpfr_init(r36201);
        mpfr_init(r36202);
        mpfr_init(r36203);
        mpfr_init(r36204);
        mpfr_init(r36205);
        mpfr_init(r36206);
}

double f_dm(double a, double b) {
        mpfr_set_d(r36188, a, MPFR_RNDN);
        mpfr_mul(r36189, r36188, r36188, MPFR_RNDN);
        mpfr_set_d(r36190, b, MPFR_RNDN);
        mpfr_mul(r36191, r36190, r36190, MPFR_RNDN);
        mpfr_add(r36192, r36189, r36191, MPFR_RNDN);
        ;
        mpfr_pow(r36194, r36192, r36193, MPFR_RNDN);
        ;
        ;
        mpfr_add(r36197, r36196, r36188, MPFR_RNDN);
        mpfr_mul(r36198, r36189, r36197, MPFR_RNDN);
        ;
        mpfr_mul(r36200, r36199, r36188, MPFR_RNDN);
        mpfr_sub(r36201, r36196, r36200, MPFR_RNDN);
        mpfr_mul(r36202, r36191, r36201, MPFR_RNDN);
        mpfr_add(r36203, r36198, r36202, MPFR_RNDN);
        mpfr_mul(r36204, r36195, r36203, MPFR_RNDN);
        mpfr_add(r36205, r36194, r36204, MPFR_RNDN);
        mpfr_sub(r36206, r36205, r36196, MPFR_RNDN);
        return mpfr_get_d(r36206, MPFR_RNDN);
}

