SUB QUINEMCCLUSKEY (SRC$(), SNUM) COMBINED = 0 DIM MA$(2 ^ 8) DIM MAM$(2 ^ 8) DIM MB$(2 ^ 8) DIM MBM$(2 ^ 8) CALL Q3LIMITSRCMATRIX(SRC$(), SNUM) CALL Q2COPYMTRXTOMTRX(SRC$(), SNUM, MA$(), ANUM) CALL Q4MAKEMINTMATRIX(MAM$(), ANUM) DO CALL Q5COMBINEIMPLICS(MA$(), MAM$(), ANUM, MB$(), MBM$(), BNUM, COMBINED) CALL Q2COPYMTRXTOMTRX(MB$(), BNUM, MA$(), ANUM) CALL Q2COPYMTRXTOMTRX(MBM$(), BNUM, MAM$(), ANUM) LOOP UNTIL COMBINED = 0 CALL Q6FINDEPRIMPLICS(MA$(), MAM$(), ANUM, MB$(), BNUM) CALL Q2COPYMTRXTOMTRX(MB$(), BNUM, SRC$(), SNUM) END SUB SUB Q0FINDSIMILARITY (SRCA$, SRCB$, TRG$, SIMILARITY) TRG$ = "" SIMILARITY = 0 LENGTHA = LEN(SRCA$) LENGTHB = LEN(SRCB$) DIFLENGTH = LENGTHA - LENGTHB IF DIFLENGTH < 0 THEN LENGTHC = LENGTHB SRCA$ = STRING$(-DIFLENGTH, "0") + SRCA$ ELSEIF DIFLENGTH = 0 THEN LENGTHC = LENGTHB ELSEIF DIFLENGTH > 0 THEN LENGTHC = LENGTHA SRCB$ = STRING$(DIFLENGTH, "0") + SRCB$ END IF FOR I = 1 TO LENGTHC CHARSRCA$ = LEFT$(RIGHT$(SRCA$, I), 1) CHARSRCB$ = LEFT$(RIGHT$(SRCB$, I), 1) IF CHARSRCA$ = CHARSRCB$ AND NOT CHARSRCA$ = "0" THEN TRG$ = CHARSRCA$ + TRG$ SIMILARITY = SIMILARITY + 1 ELSE TRG$ = "0" + TRG$ END IF NEXT I END SUB SUB Q1FINDDIFFERENCE (SRCA$, SRCB$, TRG$, DIFFERENCE) TRG$ = "" DIFFERENCE = 0 LENGTHA = LEN(SRCA$) LENGTHB = LEN(SRCB$) DIFLENGTH = LENGTHA - LENGTHB IF DIFLENGTH < 0 THEN LENGTHC = LENGTHB SRCA$ = STRING$(-DIFLENGTH, "0") + SRCA$ ELSEIF DIFLENGTH = 0 THEN LENGTHC = LENGTHB ELSEIF DIFLENGTH > 0 THEN LENGTHC = LENGTHA SRCB$ = STRING$(DIFLENGTH, "0") + SRCB$ END IF FOR I = 1 TO LENGTHC CHARSRCA$ = LEFT$(RIGHT$(SRCA$, I), 1) CHARSRCB$ = LEFT$(RIGHT$(SRCB$, I), 1) IF CHARSRCA$ = CHARSRCB$ THEN TRG$ = CHARSRCA$ + TRG$ ELSE TRG$ = "X" + TRG$ DIFFERENCE = DIFFERENCE + 1 END IF NEXT I END SUB SUB Q2COPYMTRXTOMTRX (SRC$(), SNUM, TRG$(), TNUM) TNUM = SNUM FOR I = 0 TO SNUM - 1 TRG$(I) = SRC$(I) NEXT I END SUB SUB Q3LIMITSRCMATRIX (SRC$(), SNUM) DIM TRG$(SNUM) TNUM = 0 FOR I = 0 TO SNUM - 1 USEDBEFORE = 0 FOR J = 0 TO TNUM - 1 IF TRG$(J) = SRC$(I) THEN USEDBEFORE = USEDBEFORE + 1 END IF NEXT J IF USEDBEFORE = 0 THEN TRG$(TNUM) = SRC$(I) TNUM = TNUM + 1 END IF NEXT I CALL Q2COPYMTRXTOMTRX(TRG$(), TNUM, SRC$(), SNUM) IF SNUM > 64 THEN SNUM = 64 END SUB SUB Q4MAKEMINTMATRIX (TMIN$(), TNUM) FOR I = 0 TO TNUM - 1 TMIN$(I) = STRING$(I, "0") + "X" + STRING$(TNUM - 1 - I, "0") NEXT I END SUB SUB Q5COMBINEIMPLICS (SRC$(), SMIN$(), SNUM, TRG$(), TMIN$(), TNUM, COMBINED) COMBINED = 0 TNUM = 0 DIM USEDNUM(SNUM) FOR I = 0 TO SNUM - 1 FOR J = I + 1 TO SNUM - 1 CALL Q1FINDDIFFERENCE(SRC$(I), SRC$(J), RESULT$, DIFFERENCE) IF DIFFERENCE = 1 THEN COMBINED = COMBINED + 1 USEDNUM(I) = USEDNUM(I) + 1 USEDNUM(J) = USEDNUM(J) + 1 USEDBEFORE = 0 FOR K = 0 TO TNUM - 1 IF TRG$(K) = RESULT$ THEN USEDBEFORE = USEDBEFORE + 1 END IF NEXT K IF USEDBEFORE = 0 THEN TRG$(TNUM) = RESULT$ CALL Q1FINDDIFFERENCE(SMIN$(I), SMIN$(J), TMIN$(TNUM), DIFFERENCE) TNUM = TNUM + 1 END IF END IF NEXT J NEXT I FOR L = 0 TO SNUM - 1 IF USEDNUM(L) = 0 THEN TRG$(TNUM) = SRC$(L) TMIN$(TNUM) = SMIN$(L) TNUM = TNUM + 1 END IF NEXT L END SUB SUB Q6FINDEPRIMPLICS (SRC$(), SMIN$(), SNUM, TRG$(), TNUM) TNUM = 0 MNUM = LEN(SMIN$(0)) DIM MSK$(MNUM) CALL Q4MAKEMINTMATRIX(MSK$(), MNUM) ESMIN$ = "" ALLMIN$ = STRING$(MNUM, "X") DIM USEDNUM(SNUM) FOR I = 0 TO MNUM - 1 NUMMACHED = 0 LASTMACHED = 0 FOR J = 0 TO SNUM - 1 CALL Q0FINDSIMILARITY(MSK$(I), SMIN$(J), RESULT$, SIMILARITY) IF SIMILARITY = 1 THEN NUMMACHED = NUMMACHED + 1 LASTMACHED = J END IF NEXT J IF NUMMACHED = 1 THEN CALL Q1FINDDIFFERENCE(SMIN$(LASTMACHED), ESMIN$, RESULT$, DIFFERENCE) ESMIN$ = RESULT$ USEDNUM(LASTMACHED) = USEDNUM(LASTMACHED) + 1 USEDBEFORE = 0 FOR K = 0 TO TNUM - 1 IF TRG$(K) = SRC$(LASTMACHED) THEN USEDBEFORE = USEDBEFORE + 1 END IF NEXT K IF USEDBEFORE = 0 THEN TRG$(TNUM) = SRC$(LASTMACHED) TNUM = TNUM + 1 END IF END IF NEXT I DO WHILE (NOT ESMIN$ = ALLMIN$) MAXSIMILARITY = 0 LASTMACHED = 0 FOR L = 0 TO SNUM - 1 IF USEDNUM(L) = 0 THEN CALL Q1FINDDIFFERENCE(SMIN$(L), ESMIN$, RESULT$, DIFFERENCE) CALL Q0FINDSIMILARITY(RESULT$, ALLMIN$, NEWRESULT$, SIMILARITY) IF SIMILARITY > MAXSIMILARITY THEN MAXSIMILARITY = SIMILARITY LASTMACHED = L FINALRESULT$ = NEWRESULT$ END IF END IF NEXT L IF MAXSIMILARITY > 0 THEN ESMIN$ = FINALRESULT$ TRG$(TNUM) = SRC$(LASTMACHED) TNUM = TNUM + 1 END IF LOOP END SUB