#include "polygon.hpp" //--------------- // Polygon::init //--------------- void Polygon::init(){ for(size_t i=0;ilength) cout<<" "; else cout<<"\033[42m\033[30m"<<" "<<"\033[0m"; } cout< infos; size_t id=0; int64 x=xinit; int64 y=yinit; size_t c=pos(x,y); for(size_t t=1;t<=length;++t){ size_t l=left(c); size_t r=right(c); size_t u=up(c); size_t d=down(c); auto it=infos.find(c); if(it==infos.end()){ infos[c]=InfoVertex(id++,x,y,l,r,u,d); } else{ InfoVertex& info=it->second; info.v[0]=l; info.v[1]=r; info.v[2]=u; info.v[3]=d; info.deg=4; } it=infos.find(l); if(it==infos.end()) infos[l]=InfoVertex(id++,x-1,y); it=infos.find(r); if(it==infos.end()) infos[r]=InfoVertex(id++,x+1,y); it=infos.find(u); if(it==infos.end()) infos[u]=InfoVertex(id++,x,y+1); it=infos.find(d); if(it==infos.end()) infos[d]=InfoVertex(id++,x,y-1); size_t s=step_histo[t+1]; if(grid[l]==t+1 and s==grid_histo[l]){ c=l; --x; } else if(grid[r]==t+1 and s==grid_histo[r]){ c=r; ++x; } else if(grid[u]==t+1 and s==grid_histo[u]){ c=u; ++y; } else if(grid[d]==t+1 and s==grid_histo[d]){ c=d; --y; } } size_t ne=infos.size(); fmpz_poly_mat_t B,C,M,B2,X,U,V,R; fmpz_poly_t cc,den,det; fmpz_t z; fmpz_poly_mat_init(B,ne,ne); fmpz_poly_mat_init(C,ne,ne); fmpz_poly_mat_init(M,ne,ne); fmpz_poly_mat_init(B2,ne,ne); fmpz_poly_mat_init(X,ne,1); fmpz_poly_mat_init(U,ne,1); fmpz_poly_mat_init(V,1,ne); fmpz_poly_mat_init(R,1,1); fmpz_poly_mat_zero(B); fmpz_poly_init(cc); fmpz_poly_init(det); fmpz_poly_init(den); fmpz_init(z); for(auto it=infos.begin();it!=infos.end();++it){ InfoVertex& info=it->second; size_t i=info.id; for(size_t k=0;ksecond; size_t j=info2.id; int64 dx=abs(info.x-info2.x); int64 dy=abs(info.y-info2.y); set_poly_coeff(dx,dy,fmpz_poly_mat_entry(C,i,j)); } } //! Compute B² fmpz_poly_mat_mul(B2,B,B); //! Compute M=C*B fmpz_poly_mat_mul(M,C,B); //! M=4*coeffs_denI+CB //! U[i][0]=1; fmpz_mul_si(z,coeffs_den,4); fmpz_poly_set_fmpz(cc,z); for(size_t i=0;i