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

char *name = "Difference of squares";

double f_if(float a, float b) {
        float r51291 = a;
        float r51292 = r51291 * r51291;
        float r51293 = b;
        float r51294 = r51293 * r51293;
        float r51295 = r51292 - r51294;
        return r51295;
}

double f_id(double a, double b) {
        double r51296 = a;
        double r51297 = r51296 * r51296;
        double r51298 = b;
        double r51299 = r51298 * r51298;
        double r51300 = r51297 - r51299;
        return r51300;
}


double f_of(float a, float b) {
        float r51301 = a;
        float r51302 = r51301 * r51301;
        float r51303 = b;
        float r51304 = r51303 * r51303;
        float r51305 = r51302 - r51304;
        return r51305;
}

double f_od(double a, double b) {
        double r51306 = a;
        double r51307 = r51306 * r51306;
        double r51308 = b;
        double r51309 = r51308 * r51308;
        double r51310 = r51307 - r51309;
        return r51310;
}

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 r51311, r51312, r51313, r51314, r51315;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r51311);
        mpfr_init(r51312);
        mpfr_init(r51313);
        mpfr_init(r51314);
        mpfr_init(r51315);
}

double f_im(double a, double b) {
        mpfr_set_d(r51311, a, MPFR_RNDN);
        mpfr_mul(r51312, r51311, r51311, MPFR_RNDN);
        mpfr_set_d(r51313, b, MPFR_RNDN);
        mpfr_mul(r51314, r51313, r51313, MPFR_RNDN);
        mpfr_sub(r51315, r51312, r51314, MPFR_RNDN);
        return mpfr_get_d(r51315, MPFR_RNDN);
}

static mpfr_t r51316, r51317, r51318, r51319, r51320;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r51316);
        mpfr_init(r51317);
        mpfr_init(r51318);
        mpfr_init(r51319);
        mpfr_init(r51320);
}

double f_fm(double a, double b) {
        mpfr_set_d(r51316, a, MPFR_RNDN);
        mpfr_mul(r51317, r51316, r51316, MPFR_RNDN);
        mpfr_set_d(r51318, b, MPFR_RNDN);
        mpfr_mul(r51319, r51318, r51318, MPFR_RNDN);
        mpfr_sub(r51320, r51317, r51319, MPFR_RNDN);
        return mpfr_get_d(r51320, MPFR_RNDN);
}

static mpfr_t r51321, r51322, r51323, r51324, r51325;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r51321);
        mpfr_init(r51322);
        mpfr_init(r51323);
        mpfr_init(r51324);
        mpfr_init(r51325);
}

double f_dm(double a, double b) {
        mpfr_set_d(r51321, a, MPFR_RNDN);
        mpfr_mul(r51322, r51321, r51321, MPFR_RNDN);
        mpfr_set_d(r51323, b, MPFR_RNDN);
        mpfr_mul(r51324, r51323, r51323, MPFR_RNDN);
        mpfr_sub(r51325, r51322, r51324, MPFR_RNDN);
        return mpfr_get_d(r51325, MPFR_RNDN);
}

