GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
#include "typedef.h"1#include "tools.h"2#include "matrix.h"34/**************************************************************************\5@---------------------------------------------------------------------------6@---------------------------------------------------------------------------7@ FILE: mul_mat.c8@---------------------------------------------------------------------------9@---------------------------------------------------------------------------10@11\**************************************************************************/12/*{{{}}}*/13/*{{{ rmat_mul, done*/14static matrix_TYP *rmat_mul (L_mat, R_mat)15matrix_TYP *L_mat, *R_mat ;1617{18matrix_TYP *P_mat;19int **L, **LN, **R, **RN, **P, **PN ;20int rL, cL, rR, cR, rP, cP ;21int i, j, k ;22int tmp_ggt, tmp_z, tmp_n, tmp_kgv;2324cL = L_mat->cols;25rL = rP = L_mat->rows;26rR = R_mat->rows;27cR = cP = R_mat->cols;2829P_mat = init_mat(rP,cP,"r");3031L = L_mat->array.SZ;32R = R_mat->array.SZ;33P = P_mat->array.SZ;34LN = L_mat->array.N;35RN = R_mat->array.N;36PN = P_mat->array.N;3738for (i = 0; i < rL; i++)39for (j = 0; j < cL; j++ )40{41if ( L[i][j]) {42if ( R_mat->flags.Diagonal ) {43if (R[j][j]) {44P[i][j] = L[i][j] * R[j][j];45PN[i][j] = LN[i][j] * RN[j][j];46}47} else {48for (k = 0; k < cR; k++) {49if (R[j][k]) {50tmp_z = L[i][j] * R[j][k];51tmp_n = LN[i][j] * RN[j][k];52/*53* direkt kuerzen! Ueberlaufgefahr54*/55Normal2( &tmp_z, &tmp_n );56tmp_ggt = GGT( PN[i][k], tmp_n );57if ( PN[i][k] > tmp_n ) {58tmp_kgv = PN[i][k] / tmp_ggt * tmp_n;59} else {60tmp_kgv = tmp_n/ tmp_ggt * PN[i][k];61}62P[i][k] = P[i][k] * (tmp_kgv / PN[i][k]);63P[i][k] += tmp_z * (tmp_kgv / tmp_n );64PN[i][k] = tmp_kgv;65Normal2( &P[i][k], &PN[i][k]);66}67}68}69}70}7172P_mat->kgv = 1;73P_mat->flags.Integral = FALSE;74P_mat->flags.Scalar = L_mat->flags.Scalar && R_mat->flags.Scalar;75P_mat->flags.Diagonal = L_mat->flags.Diagonal && R_mat->flags.Diagonal;76P_mat->flags.Symmetric = P_mat->flags.Diagonal;77Check_mat( P_mat);78return ( P_mat );79}80/*}}} */81/*{{{ intmat_mul, done*/82static matrix_TYP *intmat_mul (L_mat, R_mat)83matrix_TYP *L_mat, *R_mat ;8485{86matrix_TYP *P_mat;87int **L, **R, **P ;88int *L_i,89*R_j,90*P_i;91int rL, cL, rR, cR, rP, cP ;92int i, j, k ;9394cL = L_mat->cols;95rL = rP = L_mat->rows;96rR = R_mat->rows;97cR = cP = R_mat->cols;9899P_mat = init_mat(rP,cP,"");100101L = L_mat->array.SZ;102R = R_mat->array.SZ;103P = P_mat->array.SZ;104105for (i = 0; i < rL; i++){106L_i = L[i];107P_i = P[i];108for (j = 0; j < cL; j++)109{110R_j = R[j];111if ( L_i[j])112if ( R_mat->flags.Diagonal )113{114if (R_j[j]) P_i[j] = L_i[j] * R_j[j];115}116else117for (k = 0; k < cR; k++)118if (R_j[k])119P_i[k] += L_i[j] * R_j[k];120}121}122P_mat->kgv = L_mat->kgv * R_mat->kgv;123P_mat->flags.Integral = (P_mat->kgv == 1);124P_mat->flags.Scalar = L_mat->flags.Scalar && R_mat->flags.Scalar;125P_mat->flags.Diagonal = L_mat->flags.Diagonal && R_mat->flags.Diagonal;126P_mat->flags.Symmetric = P_mat->flags.Diagonal;127Check_mat( P_mat);128return ( P_mat );129}130/*}}} */131/*{{{ pmat_mul, done*/132133134/**************************************************************************\135@---------------------------------------------------------------------------136@ matrix_TYP *pmat_mul (L_mat, R_mat)137@ matrix_TYP *L_mat, *R_mat ;138@139@ calculates L_mat * R_mat modulo L_mat->prime140@---------------------------------------------------------------------------141@142\**************************************************************************/143matrix_TYP *pmat_mul (L_mat, R_mat)144matrix_TYP *L_mat, *R_mat ;145{146matrix_TYP *P_mat;147148int **L, rL, cL, cR, **R, **M ;149150int i, j, k;151152rL = L_mat->rows;153cL = L_mat->cols;154cR = R_mat->cols;155P_mat = init_mat(rL,cR,"p");156L = L_mat->array.SZ;157R = R_mat->array.SZ;158M = P_mat->array.SZ;159P_mat->prime = L_mat->prime;160init_prime(P_mat->prime);161162for ( i = 0 ; i < rL; i++)163for (j = 0; j < cL; j++ )164if ( L[i][j])165for (k = 0 ; k < cR; k++)166if ( R[j][k] )167M[i][k] = S(M[i][k],P(L[i][j],R[j][k]));168Check_mat(P_mat);169return ( P_mat );170}171172/*}}} */173/*{{{ mat_mul, done*/174175176/**************************************************************************\177@---------------------------------------------------------------------------178@ matrix_TYP *mat_mul (L_mat, R_mat)179@ matrix_TYP *L_mat, *R_mat ;180@181@ calculates L_mat * R_mat.182@---------------------------------------------------------------------------183@184\**************************************************************************/185matrix_TYP *mat_mul (L_mat, R_mat)186matrix_TYP *L_mat, *R_mat ;187188{189matrix_TYP *P_mat, *tmp_mat;190191192if ( L_mat->cols != R_mat->rows ) {193fprintf (stderr, "Can't multiply %dx%d with %dx%d\n", L_mat->rows,194L_mat->cols, R_mat->rows, R_mat->cols );195exit (3);196}197if ( L_mat->prime != R_mat->prime ) {198fprintf(stderr,"Can`t multiply Fp-matrix and Z-matrix\n");199exit(3);200}201if ( L_mat->prime ) {202P_mat = pmat_mul(L_mat, R_mat);203} else {204if ( L_mat->array.N != NULL ) {205if ( R_mat->array.N != NULL ) {206P_mat = rmat_mul( L_mat, R_mat );207} else {208tmp_mat = copy_mat( R_mat );209kgv2rat( tmp_mat );210P_mat = rmat_mul( L_mat, tmp_mat );211free_mat( tmp_mat );212}213} else if ( R_mat->array.N != NULL ) {214tmp_mat = copy_mat( L_mat );215kgv2rat( tmp_mat );216P_mat = rmat_mul( tmp_mat, R_mat );217free_mat( tmp_mat );218} else {219P_mat = intmat_mul(L_mat, R_mat);220}221}222return(P_mat);223}224225/*}}} */226/*{{{ mat_muleq, unchanged*/227228/**************************************************************************\229@---------------------------------------------------------------------------230@ matrix_TYP *mat_muleq(L_mat,R_mat)231@ matrix_TYP *L_mat, *R_mat;232@233@ calculates L_mat = L_mat * R_mat.234@---------------------------------------------------------------------------235@236\**************************************************************************/237matrix_TYP *mat_muleq(L_mat,R_mat)238matrix_TYP *L_mat, *R_mat;239240{241matrix_TYP *H_mat;242matrix_TYP merk;243244H_mat = mat_mul(L_mat,R_mat);245246memcpy( &merk, L_mat, sizeof(matrix_TYP) );247memcpy( L_mat, H_mat, sizeof(matrix_TYP) );248249/* inserted 21/1/97 tilman */250memcpy( H_mat, &merk, sizeof(matrix_TYP) );251252253free_mat(H_mat);254255return(L_mat);256}257/*}}} */258/*{{{ mat_kon*/259260261/**************************************************************************\262@---------------------------------------------------------------------------263@ matrix_TYP *mat_kon(L_mat,M_mat,R_mat)264@ matrix_TYP *L_mat, *M_mat, *R_mat;265@266@ calculates L_mat * M_mat * R_mat267@---------------------------------------------------------------------------268@269\**************************************************************************/270matrix_TYP *mat_kon(L_mat,M_mat,R_mat)271matrix_TYP *L_mat, *M_mat, *R_mat;272{273matrix_TYP *P_mat, *T_mat;274275276if ( L_mat->cols != M_mat->rows )277{278fprintf (stderr, "Can't multiply %dx%d with %dx%d\n", L_mat->rows,279L_mat->cols, M_mat->rows, M_mat->cols );280exit (3);281}282if ( M_mat->cols != R_mat->rows )283{284fprintf (stderr, "Can't multiply %dx%d with %dx%d\n", L_mat->rows,285L_mat->cols, R_mat->rows, R_mat->cols );286exit (3);287}288if ( L_mat->prime != R_mat->prime )289{290fprintf(stderr,"Can`t multiply Fp-matrix and Z-matrix\n");291exit(3);292}293if ( L_mat->prime != M_mat->prime )294{295fprintf(stderr,"Can`t multiply Fp-matrix and Z-matrix\n");296exit(3);297}298T_mat = mat_mul(L_mat, M_mat);299P_mat = mat_mul(T_mat, R_mat);300free_mat(T_mat);301return(P_mat);302}303304/*}}} */305306307