GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#include "typedef.h"1#include "tools.h"2#include "matrix.h"34void vertex_standard(v)5vertex_TYP *v;6{7int i,j;8int w1;910if(v->dim>0)11{12w1 = 0;13i=0;14while(i<v->dim && v->v[i] == 0)15i++;16if(i<v->dim)17w1 = v->v[i];18for(j=i+1;j<v->dim;j++)19{20if(v->v[j] != 0)21w1 = GGT(w1, v->v[j]);22}23if(w1 < 0)24w1 = -w1;25if(w1 != 0)26{27for(j=i;j<v->dim;j++)28v->v[j] /=w1;29}30}31}3233void umsortieren(F,old_no, count, test, l)34fund_domain *F;35int old_no, *test, l;36int *count;37{38int i;39int d=0;40for(i=0;i<old_no;i++)41{42if(count[i] < 0)43free_vertex_fuber(&(F->vert[i]));44}45for(i=0;d<F->vert_no;i++)46{47while(d<F->vert_no && F->vert[d] == NULL)48d++;49if(d != i)50{51F->vert[i] = F->vert[d];52F->vert[d] = NULL;53}54d++;55}56while(F->vert[i-1] == NULL)57i--;58F->vert_no = i;5960d=0;61for(i=0;i<F->wall_no;i++)62{63if(test[i] == -1)64free_wall_fuber(&(F->wall[i]));65}66for(i=0;d<F->wall_no;i++)67{68while(d<F->wall_no && F->wall[d] == NULL)69d++;70if(d!= i)71{72F->wall[i] = F->wall[d];73F->wall[d] = NULL;74}75d++;76}77F->wall_no = i;78}798081void renumerate(v,test,l)82vertex_TYP *v;83int *test,l;84{85int i,a;86for(i=0;i<v->wall_no;i++)87{88a = v->wall[i];89v->wall[i] = test[a];90}91}929394void wallAdd_vertex(i, v)95int i;96vertex_TYP *v;97{98if(v->wall_SIZE == 0)99{100v->wall = (int *)malloc(extsize1 *sizeof(int));101v->wall_SIZE = extsize1;102}103if(v->wall_no == v->wall_SIZE)104{105v->wall_SIZE += extsize1;106v->wall = (int *)realloc(v->wall,v->wall_SIZE *sizeof(int));107}108v->wall[v->wall_no] = i;109v->wall_no++;110}111112113void streichen(v, test)114vertex_TYP *v;115int *test;116{117int i,d;118119d=0;120for(i=0; d<v->wall_no;i++)121{122while(d< v->wall_no && test[v->wall[d]] == -1)123d++;124v->wall[i] = v->wall[d];125d++;126}127v->wall_no = i;128}129130131static int is_element(v, w)132vertex_TYP *v;133int w;134{135int o,u,t;136o=w;137u=0;138if(o>= v->wall_no)139o=v->wall_no-1;140while(o>u)141{142t=(o+u)/2;143if(v->wall[t] < w)144u=t+1;145else146o=t;147}148if(w == v->wall[u])149return(TRUE);150return(FALSE);151}152153154155void wallAdd_fund_domain(F, w)156fund_domain *F;157wall_TYP *w;158{159if(F->wall_SIZE == 0)160{161F->wall = (wall_TYP **)malloc(extsize1 *sizeof(wall_TYP *));162F->wall_SIZE = extsize1;163}164if(F->wall_no == F->wall_SIZE)165{166F->wall_SIZE += extsize1;167F->wall = (wall_TYP **)realloc( (int *)F->wall,F->wall_SIZE *sizeof(wall_TYP *));168}169F->wall[F->wall_no] = w;170F->wall_no++;171}172173174175void vertexAdd_fund_domain(F, w)176fund_domain *F;177vertex_TYP *w;178{179if(F->vert_SIZE == 0)180{181F->vert = (vertex_TYP **)malloc(extsize1 *sizeof(vertex_TYP *));182F->vert_SIZE = extsize1;183}184if(F->vert_no == F->vert_SIZE)185{186F->vert_SIZE += extsize1;187F->vert = (vertex_TYP **)realloc( (int *)F->vert,F->vert_SIZE *sizeof(vertex_TYP *));188}189F->vert[F->vert_no] = w;190F->vert_no++;191}192193194vertex_TYP *gis_neighbour(i,j,F,old_no)195int i,j;196fund_domain *F;197int old_no;198{199int k,l,m;200int a, u, tester1;201int anz;202vertex_TYP *erg;203matrix_TYP *A;204205extern vertex_TYP *init_vertex_fuber();206extern matrix_TYP *init_mat();207extern int row_gauss();208209k=F->vert[j]->wall_no;210if(k>F->vert[i]->wall_no)211k=F->vert[i]->wall_no;212erg = init_vertex_fuber(F->vert[0]->dim, k+1);213anz=0;214u=0;215for(k=0;k<F->vert[i]->wall_no;k++)216{217a = F->vert[i]->wall[k];218for(l=u; l<F->vert[j]->wall_no && F->vert[j]->wall[l]< a; l++);219u=l;220if(u<F->vert[j]->wall_no && F->vert[j]->wall[u] == a)221{ erg->wall[anz] = a; anz++;}222}223erg->wall_no = anz;224if(anz < F->vert[0]->dim-2)225{ free_vertex_fuber(&erg); erg=NULL; return(NULL);}226227A = init_mat(anz,F->vert[0]->dim, "");228for(k=0;k<anz;k++)229for(l=0; l<F->vert[0]->dim;l++)230A->array.SZ[k][l] = F->wall[erg->wall[k]]->gl[l];231a = row_gauss(A);232free_mat(A);233if(a < F->vert[0]->dim-2)234{ free_vertex_fuber(&erg); erg=NULL; return(NULL);}235return(erg);236}237238239240vertex_TYP *is_neighbour(i,j,F,old_no)241int i,j;242fund_domain *F;243int old_no;244{245int k,l,m;246int a, u, tester1;247int anz;248vertex_TYP *erg;249250extern vertex_TYP *init_vertex_fuber();251252k=F->vert[j]->wall_no;253if(k>F->vert[i]->wall_no)254k=F->vert[i]->wall_no;255erg = init_vertex_fuber(F->vert[0]->dim, k+1);256anz=0;257u=0;258for(k=0;k<F->vert[i]->wall_no;k++)259{260a = F->vert[i]->wall[k];261for(l=u; l<F->vert[j]->wall_no && F->vert[j]->wall[l]< a; l++);262u=l;263if(u<F->vert[j]->wall_no && F->vert[j]->wall[u] == a)264{ erg->wall[anz] = a; anz++;}265}266erg->wall_no = anz;267if(anz < F->vert[0]->dim-2)268{ free_vertex_fuber(&erg); erg=NULL; return(NULL);}269270for(k=0; k<old_no ;k++)271{272if(k != i && k != j)273{274tester1 = TRUE;275u=0;276for(l=0; l<anz && tester1 == TRUE; l++)277{278a = erg->wall[l];279m=u;280while(m<F->vert[k]->wall_no && F->vert[k]->wall[m] <a)281m++;282if(m == F->vert[k]->wall_no || F->vert[k]->wall[m] != a)283tester1 = FALSE;284u=m;285}286if(tester1 == TRUE)287{ free_vertex_fuber(&erg); erg=NULL; return(NULL);}288}289}290return(erg);291}292293294295int refine_fund_domain(F, h)296fund_domain *F;297wall_TYP *h;298{299int i,j,k;300int l;301int old_no;302int *count;303int waste;304int tester, *test;305int anz;306int p,n;307vertex_TYP *v;308309extern void umsortieren();310extern void renumerate();311extern void streichen();312extern int wall_times_vertex_fuber();313extern int containes();314extern void wallAdd_fund_domain();315extern void vertexAdd_fund_domain();316extern vertex_TYP *is_neighbour();317318319p=0;n=0;320waste = 0;321old_no = F->vert_no;322count = (int *)malloc(F->vert_no *sizeof(int *));323for(i=0;i<F->vert_no;i++)324count[i] = 0;325for(i=0;i<old_no;i++)326{327count[i] = wall_times_vertex_fuber(h,F->vert[i]);328if(count[i] > 0)329p++;330if(count[i] < 0)331n++;332}333if(n == 0)334{335free(count);336return(0);337}338for(i=0;i<old_no;i++)339{340if(count[i] < 0)341{342for(j=0;j<old_no;j++)343{344if(count[j] > 0)345{346v = is_neighbour(i, j, F, old_no);347if(v != NULL)348{349for(k=0; k<v->dim; k++)350{351v->v[k] = count[j] * F->vert[i]->v[k];352v->v[k] -= count[i] * F->vert[j]->v[k];353}354vertex_standard(v);355vertexAdd_fund_domain(F, v);356}357}358}359}360}361wallAdd_fund_domain(F, h);362test = (int *)malloc((F->wall_no) *sizeof(int));363l=0;364for(i=0; i<F->wall_no-1;i++)365{366tester = 0;367for(j=0;j<old_no && tester == 0; j++)368{369if(count[j] > 0)370if(is_element(F->vert[j], i) == TRUE)371tester = 1;372}373if(tester == 0)374test[i] = -1;375else376{test[i] = l; l++;}377}378test[F->wall_no-1] = l;379l++;380381for(i=0;i<old_no; i++)382{383if(count[i] == 0)384wallAdd_vertex(F->wall_no-1, F->vert[i]);385}386387for(i=0;i<old_no;i++)388{389if(count[i] ==0)390streichen(F->vert[i],test );391if(count[i] >=0)392renumerate(F->vert[i],test,l);393}394for(i=old_no; i<F->vert_no;i++)395{396F->vert[i]->wall[F->vert[i]->wall_no] = F->wall_no-1;397F->vert[i]->wall_no++;398renumerate(F->vert[i],test,l);399}400401umsortieren(F, old_no, count, test,l);402403free(count);404free(test);405return(1);406}407/*{{{}}}*/408409410