#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 r51994 = a;
        float r51995 = r51994 * r51994;
        float r51996 = b;
        float r51997 = r51996 * r51996;
        float r51998 = r51995 - r51997;
        return r51998;
}

double f_id(double a, double b) {
        double r51999 = a;
        double r52000 = r51999 * r51999;
        double r52001 = b;
        double r52002 = r52001 * r52001;
        double r52003 = r52000 - r52002;
        return r52003;
}


double f_of(float a, float b) {
        float r52004 = a;
        float r52005 = r52004 * r52004;
        float r52006 = b;
        float r52007 = r52006 * r52006;
        float r52008 = r52005 - r52007;
        return r52008;
}

double f_od(double a, double b) {
        double r52009 = a;
        double r52010 = r52009 * r52009;
        double r52011 = b;
        double r52012 = r52011 * r52011;
        double r52013 = r52010 - r52012;
        return r52013;
}

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 r52014, r52015, r52016, r52017, r52018;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(400);
        mpfr_init(r52014);
        mpfr_init(r52015);
        mpfr_init(r52016);
        mpfr_init(r52017);
        mpfr_init(r52018);
}

double f_im(double a, double b) {
        mpfr_set_d(r52014, a, MPFR_RNDN);
        mpfr_mul(r52015, r52014, r52014, MPFR_RNDN);
        mpfr_set_d(r52016, b, MPFR_RNDN);
        mpfr_mul(r52017, r52016, r52016, MPFR_RNDN);
        mpfr_sub(r52018, r52015, r52017, MPFR_RNDN);
        return mpfr_get_d(r52018, MPFR_RNDN);
}

static mpfr_t r52019, r52020, r52021, r52022, r52023;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(400);
        mpfr_init(r52019);
        mpfr_init(r52020);
        mpfr_init(r52021);
        mpfr_init(r52022);
        mpfr_init(r52023);
}

double f_fm(double a, double b) {
        mpfr_set_d(r52019, a, MPFR_RNDN);
        mpfr_mul(r52020, r52019, r52019, MPFR_RNDN);
        mpfr_set_d(r52021, b, MPFR_RNDN);
        mpfr_mul(r52022, r52021, r52021, MPFR_RNDN);
        mpfr_sub(r52023, r52020, r52022, MPFR_RNDN);
        return mpfr_get_d(r52023, MPFR_RNDN);
}

static mpfr_t r52024, r52025, r52026, r52027, r52028;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(400);
        mpfr_init(r52024);
        mpfr_init(r52025);
        mpfr_init(r52026);
        mpfr_init(r52027);
        mpfr_init(r52028);
}

double f_dm(double a, double b) {
        mpfr_set_d(r52024, a, MPFR_RNDN);
        mpfr_mul(r52025, r52024, r52024, MPFR_RNDN);
        mpfr_set_d(r52026, b, MPFR_RNDN);
        mpfr_mul(r52027, r52026, r52026, MPFR_RNDN);
        mpfr_sub(r52028, r52025, r52027, MPFR_RNDN);
        return mpfr_get_d(r52028, MPFR_RNDN);
}

