Learn-to-Compress / headers / string / lr_string_mpz.h
lr_string_mpz.h
Raw
#ifndef LR_STRING_MPZ_H_
#define LR_STRING_MPZ_H_
#include "common.h"
#include "Utils.h"
#include <math.h>

struct string_mpz_lr
{

    mpz_t theta0;
    mpz_t theta1;

    void caltheta(std::vector<int> &x, std::vector<mpz_t *> &y, int m)
    {

        mpz_init(theta0);
        mpz_init(theta1);

        mpz_t sumx;
        mpz_t sumy;
        mpz_t sumxy;
        mpz_t sumx2;
        mpz_init(sumx);
        mpz_init(sumy);
        mpz_init(sumxy);
        mpz_init(sumx2);

        for (int i = 0; i < m; i++)
        {
            //std::cout<<*(y[i])<<std::endl;
            mpz_add_ui(sumx, sumx, x[i]);
            mpz_add(sumy, sumy, *y[i]);
            mpz_addmul_ui(sumxy, *y[i], x[i]);
            mpz_add_ui(sumx2, sumx2, x[i] * x[i]);
        }

        // mpz_submul(avxy, avx, avy); // avxy = avxy - avx * avy = sumxy / m - avx * avy = (sumxy - avx * avy * m) / m = (sumxy - sumx / m * sumy / m * m) / m = (sumxy-sumx*sumy/m)/m= (sumxy*m-sumx*sumy)/m/m
        // (sumxy*m-sumx*sumy)/m/m
        
        mpz_t ccc;
        mpz_init(ccc);
        mpz_mul_ui(ccc, sumxy, m);
        mpz_submul(ccc, sumx, sumy);


        mpz_t xxx;
        mpz_init(xxx);
        mpz_mul_ui(xxx, sumx2, m);
        mpz_submul(xxx, sumx, sumx);
        

        // mpz_submul(avx2, avx, avx); // avx2 = avx2 - avx * avx = sumx2/m - sumx*sumx/m/m = (sumx2*m-sumx*sumx)/m/m)
        // (sumx2*m-sumx*sumx)/m/m)

        mpz_div(theta1, ccc, xxx);
        // theta0 * m = sumy - theta1 * sumx;
        mpz_mul(theta0, theta1, sumx);
        mpz_sub(theta0, sumy, theta0);
        mpz_div_ui(theta0, theta0, m);

        mpz_clear(sumx);
        mpz_clear(sumy);
        mpz_clear(sumxy);
        mpz_clear(sumx2);
        mpz_clear(ccc);
        mpz_clear(xxx);
    }
};

#endif