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"symm.h"3#include"longtools.h"4/**************************************************************************\5@---------------------------------------------------------------------------6@---------------------------------------------------------------------------7@ FILE: mink_red.c8@---------------------------------------------------------------------------9@---------------------------------------------------------------------------10@11\**************************************************************************/121314static void Gramtrans(G, T, U, Uinv, vec, step)15matrix_TYP *G, *T;16int **U, **Uinv;17int *vec;18int step;19{20int i,j,k,n;21int **u, **uinv;22int **merk1, **merk2;2324n = G->cols;25u = (int **)malloc(n *sizeof(int *));26uinv = (int **)malloc(n *sizeof(int *));27merk1 = (int **)malloc(n *sizeof(int *));28merk2 = (int **)malloc(n *sizeof(int *));29for(i=0; i<n;i++)30{31u[i] = (int *)malloc(n *sizeof(int));32uinv[i] = (int *)malloc(n *sizeof(int));33merk1[i] = (int *)malloc(n *sizeof(int));34merk2[i] = (int *)malloc(n *sizeof(int));35}36for(i=0; i<step; i++)37{38for(j=0; j<n; j++)39{40u[i][j] = 0;41uinv[i][j] = 0;42}43u[i][i] = 1;44uinv[i][i] = 1;45}46for(i=step; i<n; i++)47{48for(j=0; j<step; j++)49{50u[i][j] = 0;51u[j][i] = 0;52uinv[i][j] = 0;53uinv[j][i] = 0;54}55}56for(i=step; i<n; i++)57{58for(j=step; j<n;j++)59{60u[i][j] = U[i-step][j-step];61uinv[i][j] = Uinv[i-step][j-step];62}63}64for(i=0; i<(n-step); i++)65for(j=0; j<step; j++)66u[i+step][j] = -(vec[j])* (U[i][0]);67for(i=0; i<step; i++)68uinv[step][i] = vec[i];69for(i=0; i<n; i++)70{71for(j=0; j<n; j++)72{73merk1[i][j] = 0;74for(k=0; k<n; k++)75merk1[i][j] += T->array.SZ[i][k] * u[k][j];76}77}78for(i=0; i<n; i++)79for(j=0;j<n;j++)80T->array.SZ[i][j] = merk1[i][j];81for(i=0; i<n; i++)82{83for(j=0; j<n; j++)84{85merk1[i][j] = 0;86for(k=0; k<n; k++)87merk1[i][j] += uinv[i][k] * G->array.SZ[k][j];88}89}90for(i=0; i<n; i++)91{92for(j=0; j<n; j++)93{94merk2[i][j] = 0;95for(k=0; k<n; k++)96merk2[i][j] += merk1[i][k] * uinv[j][k];97}98}99for(i=0; i<n; i++)100for(j=0;j<n;j++)101G->array.SZ[i][j] = merk2[i][j];102for(i=0; i<n; i++)103{ free(u[i]); free(uinv[i]); free(merk1[i]); free(merk2[i]);}104free(u); free(uinv); free(merk1); free(merk2);105}106107108static void kurvectrans(SV, U, no, step)109matrix_TYP *SV;110int **U;111int no, step;112{113int i,j, k;114int n;115int *vec;116117n = SV->cols;118vec = (int *)malloc(n *sizeof(int));119for(i=0;i<no;i++)120{121for(j=0; j<step; j++)122vec[j] = SV->array.SZ[i][j];123for(j=step;j<n; j++)124{125vec[j] = 0;126for(k=step; k<n;k++)127vec[j] += SV->array.SZ[i][k] * U[k-step][j-step];128}129for(j=0; j<step; j++)130vec[j] -= vec[step] * SV->array.SZ[no][j];131for(j=0; j<n;j++)132SV->array.SZ[i][j] = vec[j];133}134for(i=no+1;i<SV->rows;i++)135{136for(j=0; j<step; j++)137vec[j] = SV->array.SZ[i][j];138for(j=step;j<n; j++)139{140vec[j] = 0;141for(k=step; k<n;k++)142vec[j] += SV->array.SZ[i][k] * U[k-step][j-step];143}144for(j=0; j<step; j++)145vec[j] -= vec[step] * SV->array.SZ[no][j];146for(j=0; j<n;j++)147SV->array.SZ[i][j] = vec[j];148}149for(i=0; i<n; i++)150SV->array.SZ[no][i] = 0;151SV->array.SZ[no][step] = 1;152free(vec);153}154155static int **trafoinverse(vec, step, dim)156int *vec;157int step, dim;158{159int i,j, s, k, v, w, udet, merk;160int **U;161int n;162163n = dim - step;164U = (int **)malloc(n *sizeof(int *));165for(i=0; i<n; i++)166U[i] = (int *)malloc(n *sizeof(int));167168for(i=0; i<n;i++)169U[0][i] = vec[i+step];170for(k=0;k<n && U[0][k] == 0; k++);171for(i=1; i<=k;i++)172for(j=0;j<n;j++)173U[i][j] = 0;174for(i=1; i<=k;i++)175U[i][i-1] = 1;176udet = U[0][k];177for(s=k+1; s<n;s++)178{179if(U[0][s] == 0)180{181for(i=0; i<s; i++)182U[s][i] = 0;183for(i=s+1; i<n; i++)184U[s][i] = 0;185U[s][s] = 1;186}187else188{189gcd_darstell(udet, U[0][s], &v, &w, &merk);190U[s][s] = v;191for(i=0; i<s; i++)192U[s][i] = -(U[0][i]/udet) * w;193udet = merk;194for(i=s+1; i<n; i++)195U[s][i] = 0;196}197}198return(U);199}200201static int wechsel(vec, step, udim)202int *vec;203int step, udim;204{205int i, j;206int a,b,c;207i=step;208while(i<udim && vec[i] == 0)209i++;210if(i== udim)211return(FALSE);212a = vec[i];213for(j=i+1; j<udim && a != 1 && a!= -1; j++)214{215if(vec[j] != 0)216{217b = vec[j];218while ((c=a%b)!=0){a=b; b=c;}219a = b;220}221}222if(a == 1 || a == -1)223return(TRUE);224return(FALSE);225}226227228229/**************************************************************************\230@---------------------------------------------------------------------------231@ matrix_TYP *mink_red(G, Trf)232@ matrix_TYP *G, *Trf;233@234@ calculates a matrices A and Trf such that A = Trf * G * Trf^{tr}235@ is Minkowski_reduced236@---------------------------------------------------------------------------237@238\**************************************************************************/239matrix_TYP *mink_red(G, Trf)240matrix_TYP *G, *Trf;241{242int i, j, k, l, step, anz;243int n, bound, merk;244int **U, **Uinv;245int ergmax;246matrix_TYP *erg;247matrix_TYP *kurvecs;248matrix_TYP *UU, *UUi;249matrix_TYP *T, *Ti;250251extern int **trafoinverse();252extern int wechsel();253extern void Gramtrans();254extern void kurvectrans();255extern int matrixinverses();256257n = G->cols;258259/* ------------------------------------------------------------------- *\260| setze T = I_n und erg = G |261\* ------------------------------------------------------------------- */262T = init_mat(n,n,"1");263erg = init_mat(G->rows, G->cols, "");264for(i=0;i<G->rows;i++)265for(j=0;j<G->cols;j++)266erg->array.SZ[i][j] = G->array.SZ[i][j];267/* ------------------------------------------------------------------- *\268| ordne erg tolal |269\* ------------------------------------------------------------------- */270for(i=0; i<n; i++)271{272k=i;273for(j=i+1; j<n; j++)274{275if(erg->array.SZ[j][j] < erg->array.SZ[k][k])276k=j;277}278if(k!=i)279{280for(j=0; j<n; j++)281{282l=erg->array.SZ[i][j];283erg->array.SZ[i][j] = erg->array.SZ[k][j];284erg->array.SZ[k][j] = l;285}286for(j=0; j<n; j++)287{288l=erg->array.SZ[j][i];289erg->array.SZ[j][i] = erg->array.SZ[j][k];290erg->array.SZ[j][k] = l;291l=T->array.SZ[j][i];292T->array.SZ[j][i] = T->array.SZ[j][k];293T->array.SZ[j][k] = l;294}295}296}297298/* ------------------------------------------------------------------- *\299| Allocieren und Initialisierung des Speicherplatzes |300\* ------------------------------------------------------------------- */301erg->flags.Symmetric = TRUE;302if(n == 0 || n == 1)303return(erg);304305if((UUi = (matrix_TYP *)malloc(sizeof(matrix_TYP))) == NULL){306printf("malloc of 'UUi' in 'mink_red' failed\n");307exit(2);308}309UUi->kgv = 1;310ergmax = erg->array.SZ[n-1][n-1];311kurvecs = short_vectors(erg, ergmax, 0, 0,0,&anz);312313for(step = 0; step < n;step++)314{315bound = erg->array.SZ[step][step];316for(i=0; i<kurvecs->rows; i++)317{318if(kurvecs->array.SZ[i][n] < bound && wechsel(kurvecs->array.SZ[i],step,n)== 1)319{320Uinv = trafoinverse(kurvecs->array.SZ[i], step, n);321UUi->cols = UUi->rows = n-step;322UUi->array.SZ = Uinv;323UU = long_mat_inv(UUi);324U = UU->array.SZ;325Gramtrans(erg, T, U, Uinv, kurvecs->array.SZ[i], step);326kurvectrans(kurvecs, U, i, step);327bound = erg->array.SZ[step][step];328for(j=0; j<(n-step); j++)329free(Uinv[j]);330free_mat(UU); free(Uinv);331}332}333}334335/* printf("step = %d\n", step);336put_mat(erg, NULL, "erg in mink_red", 2); */337338for(i=1; i<n;i++)339{340if(erg->array.SZ[i][i-1] < 0)341{342for(j=0; j<n; j++)343{344erg->array.SZ[i][j] = - erg->array.SZ[i][j];345erg->array.SZ[j][i] = - erg->array.SZ[j][i];346T->array.SZ[j][i] = - T->array.SZ[j][i];347}348}349}350erg->kgv = G->kgv;351if(erg->kgv != 1)352erg->flags.Integral = FALSE;353354/* changed 16/1/97 tilman from355free(kurvecs);356to: */357free_mat(kurvecs);358359free(UUi);360Ti = long_mat_inv(T);361free_mat(T);362for(i=0;i<n;i++)363for(j=0;j<n;j++)364Trf->array.SZ[i][j] = Ti->array.SZ[i][j];365free_mat(Ti);366367/* put_mat(erg, NULL, "erg in mink_red", 2); */368369return(erg);370}371372373