|
最近,我写了一个程序,不过这个程序到现在都没有完成。
那个程序是有关于使用扩展欧几里得算法求解多元线性丢番图方程,越写越伤脑筋,我想这里又没有范例可以参考。一下就是那个未完成的程序。- PROGRAM EX1;
- USES SYSTEM;
- TYPE
- RECORD1=RECORD
- A:INTEGER;
- NEXT:POINTER1;
- RECORD2=RECORD
- CONSTANT:INTEGER;
- MINIMUM_DIFF:INTEGER;
- NEXT1:POINTER3;
- NEXT2:POINTER2;
- RECORD3=RECORD
- ITEM=SET OF INTEGER;
- POINTER1=^RECORD1;
- POINTER2=^RECORD2;
- POINTER3=^RECORD3;
- END;
- VAR CURRENT_VAR:POINTER1;{factor of lhs}
- VAR EXISTENCE:BOOLEAN;
- VAR RHS:INTEGER;
- VAR SOLUTION:POINTER2;{head pointer of the linked list of the solution}
- VAR P:POINTER2;
- VAR MULT:INTEGER;
- VAR STEP:INTEGER;
- VAR TEMP:POINTER2;
- PROCEDURE EUCLID(A,B: INTEGER;VAR X,Y,GCD:INTEGER);
- VAR R,Q:INTEGER;VAR C,D:INTEGER;
- VAR PTR:POINTER1;
- BEGIN
- IF B=0 THEN BEGIN PTR:=CURRENT_VAR^.NEXT;CURRENT_VAR:=PTR; MVARIABLE(A) END
- ELSE BEGIN R:=A MOD B; Q:=A DIV B;EUCLID(B,R,X,Y,GCD); END;
- IF EXISTENCE=TRUE THEN
- BEGIN
- C:=Y;D:=X-Q*Y;
- X:=C;Y:=D;
- END ELSE
- HALT();
- GCD:=A;
- END;
- PROCEDURE SUB1(A,B:INTEGER;VAR P1,P2:POINTER2);
- VAR X,Y:INTEGER; VAR D:INTEGER;
- BEGIN
- X:=1;Y:=0;EUCLID(A,B,X,Y,D);
- MULT:=MULT/D;
- P2^.MINIMUM_DIFF:=A/D*MULT;P2^.CONSTANT:=Y*MULT;
- TEMP^.MINIMUM_DIFF:=-B/D*MULT;TEMP^.CONSTANT:=X*MULT;
- STEP:=STEP+2;
- END;
- PROCEDURE MVARIABLE(GCD:INTEGER);
- VAR P1,P2:POINTER2;
- BEGIN
- IF CURRENT_VAR=NIL THEN BEGIN
- EXISTENCE:=(RHS MOD GCD=0);
- EXIT();
- END ELSE BEGIN
- P1:=P;TEMP:=P1;
- P2:=GETMEM(SIZEOF (POINTER2));
- P1^.NEXT:=P2;
- P:=P2;
- END;
- IF CURRENT_VAR^.A>GCD THEN SUB1(CURRENT_VAR^.A,GCD,P1,P2)
- ELSE SUB1(GCD,CURRENT_VAR^.A,P2,P1);
- END;
- BEGIN
- STEP:=1;
- P:=GETMEM(SIZEOF (POINTER2));SOLUTION:=P;
- MULT:=RHS;TEMP^.MINIMUM_DIFF:=0;TEMP^.CONSTANT:=1;
- END.
复制代码 |
|