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: p_formspace.c8@---------------------------------------------------------------------------9@---------------------------------------------------------------------------10@11\**************************************************************************/121314/**************************************************************************\15@---------------------------------------------------------------------------16@ matrix_TYP **p_formspace(B, Banz, prime, sym_opt, fdim)17@ matrix_TYP **B;18@ int Banz, prime, sym_opt, *fdim;19@20@ The same as formspace, just module the prime.21@---------------------------------------------------------------------------22@23\**************************************************************************/24matrix_TYP **p_formspace(B, Banz, prime, sym_opt, fdim)25matrix_TYP **B;26int Banz, prime, sym_opt, *fdim;27{28int i,j,k,l,m, no, p;29int dim, dd, anz;30matrix_TYP *X, **Xk, **E;31int **XX, **Bi;32int **pos, **sign;333435p = prime;36dim = B[0]->cols;37if(B[0]->rows != dim)38{39printf("error in formspace: non-square matrix in group 'B'\n");40exit(3);41}42for(i=1;i<Banz;i++)43{44if(B[i]->rows != dim || B[i]->cols != dim)45{46printf("error in formspace: different dimesion of group elements\n");47exit(3);48}49}50if(sym_opt == 1)51dd = (dim *(dim+1))/2;52if(sym_opt == -1)53dd = (dim *(dim-1))/2;54if(sym_opt == 0)55dd = dim * dim;56if( (pos = (int **)malloc(dim *sizeof(int *))) == NULL)57{58printf("malloc of 'pos' in 'formspace' failed\n");59exit(2);60}61for(i=0;i<dim;i++)62{63if( (pos[i] = (int *)malloc(dim *sizeof(int))) == NULL)64{65printf("malloc of 'pos[%d]' in 'formspace' failed\n", i);66exit(2);67}68}69if( (sign = (int **)malloc(dim *sizeof(int *))) == NULL)70{71printf("malloc of 'sign' in 'formspace' failed\n");72exit(2);73}74for(i=0;i<dim;i++)75{76if( (sign[i] = (int *)malloc(dim *sizeof(int))) == NULL)77{78printf("malloc of 'sign[%d]' in 'formspace' failed\n", i);79exit(2);80}81}82if(sym_opt == 0)83{84no = 0;85for(i=0;i<dim;i++)86for(j=0;j<dim;j++)87{ pos[i][j] = no; sign[i][j] = 1; no++;}88}89if(sym_opt == 1)90{91no = 0;92for(i=0;i<dim;i++)93for(j=0;j<=i;j++)94{ pos[i][j] = no; sign[i][j] = 1; no++;}95no = 0;96for(i=0;i<dim;i++)97for(j=0;j<=i;j++)98{ pos[j][i] = no; sign[j][i] = 1; no++;}99}100if(sym_opt == -1)101{102no = 0;103for(i=0;i<dim;i++)104for(j=0;j<i;j++)105{ pos[i][j] = no; sign[i][j] = 1; no++;}106no = 0;107for(i=0;i<dim;i++)108for(j=0;j<i;j++)109{ pos[j][i] = no; sign[j][i] = -1; no++;}110for(i=0;i<dim;i++)111{ pos[i][i] = 0; sign[i][i] = 0;}112}113114X = init_mat(dd * Banz, dd, "");115XX = X->array.SZ;116no = 0;117if(sym_opt == 0)118{119no = 0;120for(i=0;i<Banz;i++)121{122Bi = B[i]->array.SZ;123for(j=0;j<dim;j++)124for(k=0;k<dim;k++)125{126for(l=0;l<dim;l++)127for(m=0;m<dim;m++)128{129XX[no][pos[l][m]] += sign[l][m] * (Bi[l][j]%p) * (Bi[m][k]%p);130XX[no][pos[l][m]] %= p;131}132XX[no][pos[j][k]]--;133no++;134}135}136}137if(sym_opt == 1)138{139no = 0;140for(i=0;i<Banz;i++)141{142Bi = B[i]->array.SZ;143for(j=0;j<dim;j++)144for(k=0;k<=j;k++)145{146for(l=0;l<dim;l++)147for(m=0;m<dim;m++)148{149XX[no][pos[l][m]] += sign[l][m] * (Bi[l][j]%p) * (Bi[m][k]%p);150XX[no][pos[l][m]] %= p;151}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++)168{169XX[no][pos[l][m]] += sign[l][m] * (Bi[l][j]%p) * (Bi[m][k]%p);170XX[no][pos[l][m]] %= p;171}172XX[no][pos[j][k]]--;173no++;174}175}176}177for(i=0;i<X->rows;i++)178for(j=0;j<X->cols;j++)179X->array.SZ[i][j] %=p;180Xk = p_lse_solve(X, NULL, &anz, p);181free_mat(X);182anz--;183if(Xk[0] != NULL)184free_mat(Xk[0]);185if(anz != 0)186{187if( (E = (matrix_TYP **)malloc(anz *sizeof(matrix_TYP *))) == NULL)188{189printf("malloc of 'E' in 'formspace' failed\n");190exit(2);191}192}193else194E = NULL;195for(i=0;i<anz;i++)196{197E[i] = init_mat(dim, dim, "");198if(sym_opt == 0)199{200for(j=0;j<dim;j++)201for(k=0;k<dim;k++)202E[i]->array.SZ[j][k] = Xk[i+1]->array.SZ[0][pos[j][k]];203}204if(sym_opt == 1)205{206for(j=0;j<dim;j++)207for(k=0;k<=j;k++)208{209E[i]->array.SZ[j][k] = Xk[i+1]->array.SZ[0][pos[j][k]];210if(j != k)211E[i]->array.SZ[k][j] = E[i]->array.SZ[j][k];212}213}214if(sym_opt == -1)215{216for(j=0;j<dim;j++)217for(k=0;k<j;k++)218{219E[i]->array.SZ[j][k] = Xk[i+1]->array.SZ[0][pos[j][k]];220E[i]->array.SZ[k][j] = -E[i]->array.SZ[j][k];221}222for(j=0;j<dim;j++)223E[i]->array.SZ[j][j] = 0;224}225}226for(i=0;i<anz;i++)227Check_mat(E[i]);228for(i=0;i<anz;i++)229free_mat(Xk[i+1]);230for(i=0;i<dim;i++)231{ free(pos[i]); free(sign[i]);}232free(pos); free(sign);233*fdim = anz;234return(E);235}236237238