GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#include "typedef.h"1#include "matrix.h"23/**************************************************************************\4@---------------------------------------------------------------------------5@---------------------------------------------------------------------------6@ FILE: red_mat.c7@---------------------------------------------------------------------------8@---------------------------------------------------------------------------9@10\**************************************************************************/1112#if 013/*{{{ */1415static void sdec_mat(mat, trf)16matrix_TYP *mat, *trf;1718{19int dim, i, j, flag;20int **M, **m1;2122M = mat->array.SZ;23dim= mat->cols;24dim--;25flag = (M[dim][dim] == 0);2627while(flag) {28for(i = 0; flag && (i < dim); i++)29flag = (M[dim][i] == 0);30if (flag) flag = ((--dim > 0) && (M[dim][dim] == 0));31}32if (++dim < mat->cols) {33for (i = 0; i < mat->cols; i++)34if (i < dim)35M[i] = (int *)realloc(M[i], dim*sizeof(int));36else {37free(M[i]);38}39mat->array.SZ = (int **)realloc(M,dim*sizeof(int *));40mat->cols = mat->rows = trf->rows = dim;41}42m1 = (int **)malloc((dim+1) * sizeof(int *));43m1[dim] = (int *)malloc((dim) * sizeof(int ));44for (i = 0; i < dim; i++)45{46m1[i]=mat->array.SZ[dim-1-i];47}48for (i = 0; i < dim; i++)49{50mat->array.SZ[i]=m1[i];51}52for (j = 0; j < dim; j++) {53for (i = 0; i < dim; i++)54m1[dim][i]=mat->array.SZ[j][dim-1-i];55for (i = 0; i < dim; i++)56mat->array.SZ[j][i]=m1[dim][i];57}58free(m1[dim]);59free(m1);60}61/*}}} */62#else63/*{{{ from ldec_mat*/64static void sdec_mat(mat, trf)65matrix_TYP *mat, *trf;66{67int j,dim, i, flag;68int **M;69int **m1, **t1;7071M = mat->array.SZ;72dim = mat->cols;73dim--;74flag = (M[dim][dim] == 0);7576while (flag) {77for (i = 0; flag && (i < dim); i++) {78flag = (M[dim][i] == 0);79}80if (flag) {81flag = ((--dim > 0) && (M[dim][dim] == 0));82}83}84if (++dim < mat->cols) {85for (i = dim; i < mat->cols; i++) {86free(M[i]);87free(trf->array.SZ[i]);88}89for (i = 0; i < dim; i++) {90M[i] = (int *)realloc(M[i], dim* sizeof(int));91}92mat->array.SZ = (int **)realloc(M,dim*sizeof(int *));93trf->array.SZ = (int **)realloc(trf->array.SZ,dim*sizeof(int *));94trf->rows = mat->cols = mat->rows = dim;95}96m1 = (int **)malloc((dim+1) * sizeof(int *));97m1[dim] = (int *)malloc((dim) * sizeof(int ));98t1 = (int **)malloc(dim * sizeof(int *));99for (i = 0; i < dim; i++) {100m1[i]=mat->array.SZ[dim-1-i];101t1[i]=trf->array.SZ[dim-1-i];102}103for (i = 0; i < dim; i++) {104mat->array.SZ[i]=m1[i];105trf->array.SZ[i]=t1[i];106}107for (j = 0; j < dim; j++) {108for (i = 0; i < dim; i++) {109m1[dim][i]=mat->array.SZ[j][dim-1-i];110}111for (i = 0; i < dim; i++) {112mat->array.SZ[j][i]=m1[dim][i];113}114}115free(m1[dim]);116free(m1);117free(t1);118}119120/*}}} */121#endif122123/*124@125@ boolean extension(Mat,Trf);126@127@ Zusatzprogramm zu mat_red(): Ueberprueft bei M[i][i] = 2*M[i][j], ob128@ eine Addition zu weiterer Reduzierung fuehren kann.129@130static boolean extension(Mat,Trf)131matrix_TYP *Mat, *Trf;132{133int i,j,k, temp, ssignum;134int **M, *Z;135boolean flag = 0;136137M = Mat->array.SZ;138Z = (int *)calloc(Mat->rows, sizeof(int));139for(i = 1; i < Mat->rows; i++) {140for(j = 0; (j < i) && (M[i][i] != 0); j++) {141if(abs(2*M[i][j]) >= abs(M[i][i])) {142if (M[i][i]*M[i][j] > 0) {143ssignum = -1;144for (k = 0;k < Mat->rows; k++) {145Z[k] = M[j][k] - M[i][k];146}147} else {148ssignum = 1;149for(k = 0; k < Mat->rows; k++) {150Z[k] = M[j][k] + M[i][k];151}152}153flag = 1;154}155if(flag) {156for (k = 0; k < Mat->rows; k++) {157if ((k != i) && (k != j)) {158if ( (temp =abs(2*Z[k])) > abs(M[k][k]) ||159temp > abs(M[j][j]) ) {160free(M[j]);161M[j] = Z;162if (ssignum > 0) {163for (k = 0; k < Mat->rows; k++) {164M[k][j] += M[k][i];165}166} else {167for (k = 0; k < Mat->rows; k++) {168M[k][j] -= M[k][i];169}170}171return(TRUE);172}173}174}175flag = 0;176}177}178}179free(Z);180return(FALSE);181}182183*/184185/*{{{}}}*/186/*{{{ smat_red*/187static matrix_TYP *smat_red (mat)188matrix_TYP *mat;189{190int **M, *M_i, *M_j, **m1;191rational *per, temp;192int i, j, k,l , flag;193int faktor, n;194int **T, *T_i, *T_j, **t1;195matrix_TYP *taM;196197n = mat->cols;198taM = init_mat(n,n,"ik");199M = mat->array.SZ;200T = taM->array.SZ;201202per = (rational *)malloc(n*sizeof(rational));203for ( i= 0; i< n; i ++) {204T[i][i] = 1;205}206do {207flag = 0;208for(i = n-1; i >=0; i--) {209M_i = M[i];210T_i = T[i];211for(j = n-1; j >=0; j--) {212M_j = M[j];213T_j = T[j];214if (i != j) {215if(M_i[i]) {216if(abs(2*M_i[j]) > abs(M_i[i])) {217faktor = (2*M_i[j])/M_i[i];218faktor = (faktor / 2)+(faktor % 2);219for(k = 0; k < n; k++) {220M_j[k] -= faktor * M_i[k];221T_j[k] -= faktor * T_i[k];222}223for(k = 0; k < n; k++) {224M[k][j] -= faktor * M[k][i];225}226flag = 1;227}228} else {229if (M_i[j]) {230if ((faktor = M_j[j] / (M_i[j]*2)) != 0) {231for(k = 0; k < n; k++) {232M_j[k] -= faktor * M_i[k];233T_j[k] -= faktor * T_i[k];234}235for (k = 0; k < n; k++) {236M[k][j] -= faktor*M[k][i];237}238flag = 1;239}240if(M_j[j] == 0) {241for(k = 0; k < n; k++) {242if((i != k) && (M[k][j])) {243if((faktor = M[k][j] / M_i[j])!=0) {244for(l = 0; l < n; l++) {245M[k][j] -= faktor * M_i[l];246T[k][l] -= faktor * T_i[l];247}248for(l = 0; l < n ; l++) {249M[l][k] -= faktor * M[l][i];250}251flag = 1;252}253}254}255}256}257}258}259}260}261} while ((flag) /* || extension(mat,taM) */ );262/*263* Sorting Mat in decreasing order of the absolute value of the264* diagonal elements.265*/266267m1 = (int **)malloc((n+1) * sizeof(int *));268t1 = (int **)malloc((n+1) * sizeof(int *));269m1[n] = (int *)calloc(n , sizeof(int));270271for (i = n-1; i >= 0; i--) {272per[i].z = abs(M[i][i]);273per[i].n = i;274}275for( j = n-1; j >=1; j--) {276temp = per[j];277flag = j;278for( i = j-1; i >= 0; i--) {279if (per[i].z < temp.z) {280temp = per[i];281flag= i;282}283}284if(flag != j) {285per[flag] = per[j];286per[j] = temp;287}288}289i = n;290while(per[--i].z == 0);291++i;292while((i<n)&&(flag = memcmp(m1[n],M[per[i].n],n*sizeof(int)))) {293i++;294}295if (i < n-1) {296for(j = i+1; j < n; j++) {297if( (flag = memcmp(m1[n],M[per[j].n],n*sizeof(int))) ) {298temp = per[i]; per[i] = per[j]; per[j] = temp;299i++; j = i+1;300}301}302}303for (i = 0; i < n; i++) {304m1[i] = M[i];305t1[i] = T[i];306}307for(i = 0; i < n; i++) {308M[i] = m1[per[i].n];309T[i] = t1[per[i].n];310memcpy(m1[n],M[i],n*sizeof(int));311for(j = 0; j < n; j++) {312M[i][j] = m1[n][per[j].n];313}314}315free(m1[n]);316free(m1);317free(t1);318free(per);319320return (taM);321}322/*}}} */323/*{{{ sdec_mat*/324325/*}}} */326/*{{{ mat_red*/327328/**************************************************************************\329@---------------------------------------------------------------------------330@ matrix_TYP *mat_red(Mat)331@ matrix_TYP *Mat;332@333@ applies a pair_reduction to the symmetric matrix Mat334@ and returns the transformation matrix335@---------------------------------------------------------------------------336@337\**************************************************************************/338matrix_TYP *mat_red(Mat)339matrix_TYP *Mat;340{341return smat_red(Mat);342}343344void dec_mat(Mat,Trf)345matrix_TYP *Mat, *Trf;346{347sdec_mat(Mat,Trf);348}349/*}}} */350351352