GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
/***** This file includes some basic routines1for matrix and vector operations *****/2#include"typedef.h"34/********************************************************************\5| multiplies 1xn-vector x with nxn-matrix A and puts result on y6\********************************************************************/7static void vecmatmul(x, A, n, y)8int *x, **A, n, *y;9{10int i, j, xi, *Ai;1112for (j = 0; j < n; ++j)13y[j] = 0;14for (i = 0; i < n; ++i)15{16if ((xi = x[i]) != 0)17{18Ai = A[i];19for (j = 0; j < n; ++j)20y[j] += xi * Ai[j];21}22}23}2425/********************************************************************\26| multiplies nxn-matrices A and B and puts result on C27\********************************************************************/28static void matmul(A, B, n, C)29int **A, **B, n, **C;30{31int i, j, k, *Ai, *Bk, *Ci, Aik;3233for (i = 0; i < n; ++i)34{35Ai = A[i];36Ci = C[i];37for (j = 0; j < n; ++j)38Ci[j] = 0;39for (k = 0; k < n; ++k)40{41if ((Aik = Ai[k]) != 0)42{43Bk = B[k];44for (j = 0; j < n; ++j)45Ci[j] += Aik * Bk[j];46}47}48}49}5051/********************************************************************\52| returns scalar product of 1xn-vectors x and y53| with respect to Gram-matrix F54\********************************************************************/55static int scp(x, F, y, n)56int *x, **F, *y, n;57{58int i, j, sum, xi, *Fi;5960sum = 0;61for (i = 0; i < n; ++i)62{63if ((xi = x[i]) != 0)64{65Fi = F[i];66for (j = 0; j < n; ++j)67sum += xi * Fi[j] * y[j];68}69}70return(sum);71}7273/********************************************************************\74| returns standard scalar product of 1xn-vectors x and y, heavily used75\********************************************************************/76static int sscp(x, y, n)77int *x, *y, n;78{79int i, sum;8081sum = 0;82for (i = 0; i < n; ++i)83sum += *(x++) * *(y++);84/* sum += x[i] * y[i]; */85return(sum);86}8788/********************************************************************\89| computes X = B*A^-1 modulo the prime p, for nxn-matrices A and B,90| where A is invertible, A and B are modified !!!91\********************************************************************/92static void psolve(X, A, B, n, p)93int **X, **A, **B, n, p;94{95int i, j, k, tmp, sum, ainv, *Xi, *Bi;9697/* convert A to lower triangular matrix and change B accordingly */98for (i = 0; i < n-1; ++i)99{100for (j = i; A[i][j] % p == 0; ++j);101if (j == n)102{103fprintf(stderr, "Error: matrix is singular modulo %d\n", p);104exit (3);105}106if (j != i)107/* interchange columns i and j such that A[i][i] is != 0 */108{109for (k = i; k < n; ++k)110{111tmp = A[k][i];112A[k][i] = A[k][j];113A[k][j] = tmp;114}115for (k = 0; k < n; ++k)116{117tmp = B[k][i];118B[k][i] = B[k][j];119B[k][j] = tmp;120}121}122pgauss(i, A, B, n, p);123}124/* compute X recursively */125for (i = 0; i < n; ++i)126{127Xi = X[i];128Bi = B[i];129for (j = n-1; j >= 0; --j)130{131sum = 0;132for (k = n-1; k > j; --k)133sum = (sum + Xi[k] * A[k][j]) % p;134/* ainv is the inverse of A[j][j] modulo p */135for (ainv = 1; abs(A[j][j]*ainv-1) % p != 0; ++ainv);136Xi[j] = (Bi[j] - sum) * ainv % p;137/* make sure that -p/2 < X[i][j] <= p/2 */138if (2*Xi[j] > p)139Xi[j] -= p;140else if (2*Xi[j] <= -p)141Xi[j] += p;142}143}144}145146/********************************************************************\147| clears row nr. r of A assuming that the148| first r-1 rows of A are already cleared149| and that A[r][r] != 0 modulo p,150| A and B are changed !!!151\********************************************************************/152static void pgauss(r, A, B, n, p)153int r, **A, **B, n, p;154{155int i, j, f, ainv, *Ar;156157Ar = A[r];158/* ainv is the inverse of A[r][r] modulo p */159for (ainv = 1; abs(Ar[r]*ainv-1) % p != 0; ++ainv);160for (j = r+1; j < n; ++j)161{162if (Ar[j] % p != 0)163{164f = Ar[j] * ainv % p;165for (i = r+1; i < n; ++i)166A[i][j] = (A[i][j] - f * A[i][r]) % p;167for (i = 0; i < n; ++i)168B[i][j] = (B[i][j] - f * B[i][r]) % p;169Ar[j] = 0;170}171}172}173174/********************************************************************\175| checks, whether n is a prime176\********************************************************************/177static int isprime(n)178int n;179{180int i;181182for (i = 2; i <= n/i; ++i)183{184if (n % i == 0)185return 0;186}187return 1;188}189190191