PROCEDURE BITMULT (N:INTEGER ; A,B:MATRIX ; VAR C:MATRIX) ; TYPE ROWSUM=ARRAY[ 0..15,1..15 ] OF INTEGER ; VAR UNIONS : ROWSUM ; I,J,K,M,O,P,Q,S,T,AIJ,X,Y : INTEGER ; PROCEDURE POWER (X:INTEGER ; VAR Y:INTEGER) ; VAR L : INTEGER ; BEGIN Y:=1 ; FOR L:=1 TO X DO Y:=Y*2 END ; BEGIN (*BITMULT*) T:=TRUNC(LN(N*1.0)+0.99999999) ; S:=TRUNC(N/T+0.99999999) ; FOR I:=1 TO N DO BEGIN UNIONS[0,1]:=0 ; FOR J:=1 TO N DO C[I,J]:=0 END ; FOR I:=N+1 TO T*S DO FOR J:=1 TO N DO BEGIN B[I,J]:=0 ; A[J,I]:=0 END ; FOR J:=1 TO S DO BEGIN FOR K:=0 TO T-1 DO BEGIN POWER(K,M) ; FOR I:=0 TO M-1 DO FOR O:=1 TO N DO IF (UNIONS[I,O]=1) OR (B[(J-1)*T+K+1,O]=1) THEN UNIONS[I+M,O]:=1 END ; FOR I:=1 TO N DO BEGIN AIJ:=0 ; FOR P:=1 TO T DO BEGIN POWER (P-1,Q) ; AIJ:=AIJ+Q*A[I,(J-1)*T+P] END ; FOR O:=1 TO N DO IF (C[I,O]=1) OR (UNIONS[AIJ,O]=1) THEN C[I,O]:=1 END; FOR I:=1 TO 2*M-1 DO FOR O:=1 TO N DO UNIONS[I,O]:=0 END END;