PROGRAM MODMAT(INPUT,OUTPUT); (*LOESE GANZZAHLIGE GLEICHUNGSSYSTEME *) (*(S. DISKRETE MATHE 4.SEMESTER) *) LABEL 1; CONST N=2;M=3; TYPE MATRIX=ARRAY[1..N,1..M] OF INTEGER; VEKTOR=ARRAY[1..N]OF INTEGER; VAR P:INTEGER; (*LFD. MOD.*) I,J,K,PCOUNT:INTEGER; A,R:MATRIX; NEWP,LASTP,R1,R2:INTEGER; Y,YS:VEKTOR; FUNCTION NORMAL(X:INTEGER):INTEGER; (*LIEFERT REPRAESENTANTEN AUS [-(P-1)..(P-1)] *) BEGIN NORMAL:=X MOD P END; FUNCTION PLUS(X,Y:INTEGER):INTEGER; BEGIN PLUS:=NORMAL(X+Y) END; FUNCTION MAL(X,Y:INTEGER):INTEGER; BEGIN MAL:=NORMAL(X*Y) END; FUNCTION INV(A0,P:INTEGER):INTEGER; (*BERECHNE INVERSES ELEMENT ZU A0(MOD P) MIT HILFE DES *) (*ERWEITERTEN EUKLIDISCHEN GGT-ALGORITHMUS *) VAR X0,X1,A1,Q,R,S:INTEGER; BEGIN IF A0<0 THEN A0:=A0+P; A1:=P;X0:=0;X1:=1; Q:=A1 DIV A0;R:=A1-Q*A0; WHILE R<>0 DO BEGIN A1:=A0;A0:=R;S:=X1;X1:=X0-Q*X1;X0:=S; Q:=A1 DIV A0;R:=A1-Q*A0 END; INV:=X1; (*ES GILT: 1=A0=GGT(A0,P)=X1*X+K*P *) END; PROCEDURE PRINT(VAR R:MATRIX); VAR I,J:INTEGER;CH:CHAR; BEGIN FOR I:=1 TO N DO BEGIN FOR J:=1 TO M DO WRITE(R[I,J]:6); WRITELN END; WRITELN;READ(CH); END;(*PRINT*) PROCEDURE SWAP(VAR X,Y:INTEGER); VAR S:INTEGER; BEGIN S:=X;X:=Y;Y:=S END; PROCEDURE TRYAGAIN; BEGIN WRITELN("*** NICHT REGULAER (MOD",P,")! ***"); GOTO 1 END; PROCEDURE PROBE(VAR X:VEKTOR); VAR I:INTEGER; BEGIN WRITELN("ERGEBNIS:"); FOR I:=1 TO N DO WRITE(X[I]); WRITELN END; BEGIN A[1,1]:=101;A[1,2]:=-131;A[1,M]:= 30; A[2,1]:= 70;A[2,2]:=- 92;A[2,M]:=-100; PCOUNT:=1; WRITELN("AUSGANGSMATRIX:");PRINT(A); REPEAT 1:WRITE("PRIMZAHL",PCOUNT,":");READLN(P); FOR I:=1 TO N DO FOR J:=1 TO M DO R[I,J]:=NORMAL(A[I,J]); WRITELN("NORMALISIERT:");PRINT(R); (*BILDE OBERE DREIECKSMATRIX DURCH ZEILENOPERATIONEN: *) FOR I:= 1 TO N-1 DO BEGIN K:=I;(*PIVOT SUCHEN: *) WHILE R[K,I]=0 DO IF KI THEN FOR J:=1 TO M DO SWAP(R[K,J],R[I,J]); (*ELIMINIERE R[I,J] FUER I