GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#include"typedef.h"1#include"matrix.h"2#include"longtools.h"34/**************************************************************************\5@---------------------------------------------------------------------------6@---------------------------------------------------------------------------7@ FILE: formspace.c8@---------------------------------------------------------------------------9@---------------------------------------------------------------------------10@11\**************************************************************************/1213/**************************************************************************\14@---------------------------------------------------------------------------15@ matrix_TYP **formspace(B, Banz, sym_opt, fdim)16@ matrix_TYP **B;17@ int Banz, sym_opt, *fdim;18@19@ formspace calculates a basis of the lattice of integral matrices X with20@ B[i]^{tr} * X * B[i] = X for 0 <= i < Banz21@ The number of basis elements is returned via (int *fdim).22@ 'sym_opt' must be 0, 1 or -1.23@ sym_opt = 0: the full lattice is calculated.24@ sym_opt = 1: a basis for the symmetric matrices is calculated25@ sym_opt =-1: a basis for the skewsymmetric matrices is calculated26@27@---------------------------------------------------------------------------28@29\**************************************************************************/3031matrix_TYP **formspace(B, Banz, sym_opt, fdim)32matrix_TYP **B;33int Banz, sym_opt, *fdim;34{35int i,j,k,l,m, no;36int dim, dd, anz;37matrix_TYP *X, *Xk, **E;38int **XX, **Bi;39int **pos, **sign;404142dim = B[0]->cols;43if(B[0]->rows != dim)44{45printf("error in formspace: non-square matrix in group 'B'\n");46exit(3);47}48for(i=1;i<Banz;i++)49{50if(B[i]->rows != dim || B[i]->cols != dim)51{52printf("error in formspace: different dimesion of group elements\n");53exit(3);54}55}56if(sym_opt == 1)57dd = (dim *(dim+1))/2;58if(sym_opt == -1)59dd = (dim *(dim-1))/2;60if(sym_opt == 0)61dd = dim * dim;62if( (pos = (int **)malloc(dim *sizeof(int *))) == NULL)63{64printf("malloc of 'pos' in 'formspace' failed\n");65exit(2);66}67for(i=0;i<dim;i++)68{69if( (pos[i] = (int *)malloc(dim *sizeof(int))) == NULL)70{71printf("malloc of 'pos[%d]' in 'formspace' failed\n", i);72exit(2);73}74}75if( (sign = (int **)malloc(dim *sizeof(int *))) == NULL)76{77printf("malloc of 'sign' in 'formspace' failed\n");78exit(2);79}80for(i=0;i<dim;i++)81{82if( (sign[i] = (int *)malloc(dim *sizeof(int))) == NULL)83{84printf("malloc of 'sign[%d]' in 'formspace' failed\n", i);85exit(2);86}87}88if(sym_opt == 0)89{90no = 0;91for(i=0;i<dim;i++)92for(j=0;j<dim;j++)93{ pos[i][j] = no; sign[i][j] = 1; no++;}94}95if(sym_opt == 1)96{97no = 0;98for(i=0;i<dim;i++)99for(j=0;j<=i;j++)100{ pos[i][j] = no; sign[i][j] = 1; no++;}101no = 0;102for(i=0;i<dim;i++)103for(j=0;j<=i;j++)104{ pos[j][i] = no; sign[j][i] = 1; no++;}105}106if(sym_opt == -1)107{108no = 0;109for(i=0;i<dim;i++)110for(j=0;j<i;j++)111{ pos[i][j] = no; sign[i][j] = 1; no++;}112no = 0;113for(i=0;i<dim;i++)114for(j=0;j<i;j++)115{ pos[j][i] = no; sign[j][i] = -1; no++;}116for(i=0;i<dim;i++)117{ pos[i][i] = 0; sign[i][i] = 0;}118}119120X = init_mat(dd * Banz, dd, "");121XX = X->array.SZ;122no = 0;123if(sym_opt == 0)124{125no = 0;126for(i=0;i<Banz;i++)127{128Bi = B[i]->array.SZ;129for(j=0;j<dim;j++)130for(k=0;k<dim;k++)131{132for(l=0;l<dim;l++)133for(m=0;m<dim;m++)134XX[no][pos[l][m]] += sign[l][m] * Bi[l][j] * Bi[m][k];135XX[no][pos[j][k]]--;136no++;137}138}139}140if(sym_opt == 1)141{142no = 0;143for(i=0;i<Banz;i++)144{145Bi = B[i]->array.SZ;146for(j=0;j<dim;j++)147for(k=0;k<=j;k++)148{149for(l=0;l<dim;l++)150for(m=0;m<dim;m++)151XX[no][pos[l][m]] += sign[l][m] * Bi[l][j] * Bi[m][k];152XX[no][pos[j][k]]--;153no++;154}155}156}157if(sym_opt == -1)158{159no = 0;160for(i=0;i<Banz;i++)161{162Bi = B[i]->array.SZ;163for(j=0;j<dim;j++)164for(k=0;k<j;k++)165{166for(l=0;l<dim;l++)167for(m=0;m<dim;m++)168XX[no][pos[l][m]] += sign[l][m] * Bi[l][j] * Bi[m][k];169XX[no][pos[j][k]]--;170no++;171}172}173}174Xk = long_kernel_mat(X);175free_mat(X);176if(Xk == NULL)177anz = 0;178else179anz = Xk->cols;180if(anz != 0)181{182if( (E = (matrix_TYP **)malloc(anz *sizeof(matrix_TYP *))) == NULL)183{184printf("malloc of 'E' in 'formspace' failed\n");185exit(2);186}187}188else189E = NULL;190for(i=0;i<anz;i++)191{192E[i] = init_mat(dim, dim, "");193if(sym_opt == 0)194{195for(j=0;j<dim;j++)196for(k=0;k<dim;k++)197E[i]->array.SZ[j][k] = Xk->array.SZ[pos[j][k]][i];198}199if(sym_opt == 1)200{201for(j=0;j<dim;j++)202for(k=0;k<=j;k++)203{204E[i]->array.SZ[j][k] = Xk->array.SZ[pos[j][k]][i];205if(j != k)206E[i]->array.SZ[k][j] = E[i]->array.SZ[j][k];207}208}209if(sym_opt == -1)210{211for(j=0;j<dim;j++)212for(k=0;k<j;k++)213{214E[i]->array.SZ[j][k] = Xk->array.SZ[pos[j][k]][i];215E[i]->array.SZ[k][j] = -E[i]->array.SZ[j][k];216}217for(j=0;j<dim;j++)218E[i]->array.SZ[j][j] = 0;219}220}221for(i=0;i<anz;i++)222Check_mat(E[i]);223if(anz != 0)224free_mat(Xk);225for(i=0;i<dim;i++)226{ free(pos[i]); free(sign[i]);}227free(pos); free(sign);228*fdim = anz;229for(i=0;i<anz;i++)230{231for(j=0;j<dim && E[i]->array.SZ[j][j] == 0; j++);232if(j<dim && E[i]->array.SZ[j][j] < 0)233{234for(k=0;k<dim;k++)235for(l=0;l<dim;l++)236E[i]->array.SZ[k][l] = -E[i]->array.SZ[k][l];237}238}239return(E);240}241242243