./004075500125110000346000000000000724107070200120545ustar00dwassermgrad00003010004401./Driver.java010064400125110000346000000514710721627045700141720ustar00dwassermgrad00003010004401import java.io.*; import java.lang.reflect.*; import java.util.*; public class Driver { static ModLattice myLattice; static boolean keepAuto; public static void start(ModLattice aLattice) { myLattice = aLattice; keepAuto = true; for (;;) try { printMenu(); String response = getLine("Enter choice: "); actOn(response); } catch(InvalidCommandException ex) { System.out.println(ex.getMessage()); } } public static void printMenu() { System.out.println(); System.out.println("Current number of elements: " + myLattice.elementCount); System.out.println("Current row: " + myLattice.currentRow); System.out.println("Current column: " + myLattice.currentColumn); System.out.println("Current size: " + myLattice.currentSize); System.out.println("Current number of equivalence classes: " + myLattice.myEqRel.countClasses(myLattice.elementCount)); System.out.println(); System.out.println("1. Generate new elements"); System.out.println("2. Compute congruence relation"); System.out.println("3. Impose a relation"); System.out.println("4. Form quotient lattice"); System.out.println("5. Resize"); System.out.println("6. Examine a square in the table"); System.out.println("7. Examine a row in the join table or meet table"); System.out.println("8. Examine an element"); System.out.println("9. Output information to a file"); System.out.println("10. Change settings"); System.out.println("11. Perform exhaustive check"); System.out.println("12. Use other method"); System.out.println("13. Read lattice from file"); System.out.println("0. Quit"); } //printMenu private static String getLine (String prompt) { System.out.print (prompt); String result = new String(); System.out.flush(); try { BufferedReader in = new BufferedReader (new InputStreamReader(System.in)); result = in.readLine(); }catch (IOException ex) { System.err.println("An IOException ocurred: "); } return result; } private static void actOn(String command) throws InvalidCommandException { int i, j, k; ModLattice temp; Element e; boolean opIsJoin; String response; try { i = Integer.parseInt(command); } catch(NumberFormatException ex) { throw new InvalidCommandException("Your command was not recognized."); } switch (i) { case 1: try { j = Integer.parseInt(getLine("How many total elements? ")); if (j > myLattice.currentSize) throw new InvalidCommandException ("Lattice can't hold that many elements; resize first."); myLattice.makeNewElements(j); } catch(NumberFormatException ex) { throw new InvalidCommandException("Invalid number."); } break; case 2: myLattice.computeCongruence(); break; case 3: try { j = Integer.parseInt(getLine("Enter number of first element: ")); k = Integer.parseInt(getLine("Enter number of second element: ")); if (j < 0 || k < 0 || j >= myLattice.elementCount || k >= myLattice.elementCount) throw new InvalidCommandException("Invalid number."); myLattice.myEqRel.relate(j, k); keepAuto = false; } catch (NumberFormatException ex) { throw new InvalidCommandException("Invalid number."); } break; case 4: temp = myLattice.collapse(keepAuto); myLattice = temp; keepAuto = true; break; case 5: try { j = Integer.parseInt(getLine("Enter new size: ")); if (j < myLattice.currentSize) throw new InvalidCommandException("Can't reduce size."); myLattice.resize(j); } catch (NumberFormatException ex) { throw new InvalidCommandException("Invalid number."); } break; case 6: try { j = Integer.parseInt(getLine("Enter row: ")); k = Integer.parseInt(getLine("Enter column: ")); if (j < 0 || k < 0 || j >= myLattice.currentSize || k >= myLattice.currentSize) throw new InvalidCommandException("Invalid number."); if ((e = myLattice.table[j][k]) == null) System.out.println("Square not filled."); else System.out.println(e.myNumber); } catch (NumberFormatException ex) { throw new InvalidCommandException("Invalid number."); } break; case 7: try { j = Integer.parseInt(getLine("Enter 1 for joins, 2 for meets: ")); opIsJoin = (j == 1); k = Integer.parseInt(getLine("Enter number of element to form " + (opIsJoin ? "joins" : "meets") + " with: ")); if (k < 0 || k > myLattice.elementCount) throw new InvalidCommandException("Invalid number."); for (int l = 0; l < myLattice.elementCount; l++) { e = (opIsJoin ? myLattice.join(k, l) : myLattice.meet(k,l)); System.out.print(elementNumber(e)); } getLine("Hit return to continue."); } catch (NumberFormatException ex) { throw new InvalidCommandException("Invalid number."); } break; case 8: try { j = Integer.parseInt(getLine("Enter number of element ")); if (j < 0 || j > myLattice.elementCount) throw new InvalidCommandException("Invalid number."); e = myLattice.elements[j]; System.out.println(); System.out.println("Defining term: " + e.toString()); System.out.println("Expanded: " + e.fullName()); System.out.println("Other terms: "); if (e.altsUsed > 0) for (int l = 0; l < e.altsUsed; l++) System.out.println(e.altTerms[l].toString()); else System.out.println("none"); if (myLattice instanceof SelfDualModLattice) System.out.println("Dual: " + elementNumber(e.dual)); if (e.conjCount > 0) { System.out.println("Conjugates: "); for (int l = 0; l < e.conjCount; l++) System.out.println(elementNumber(e.conjugates[l])); } System.out.println("Equivalence class: "); System.out.print(" "); int [] row = myLattice.myEqRel.classOf(j); for (int kk = 0; kk < row.length; kk++) System.out.print(row[kk] + " "); System.out.println(); System.out.println(); getLine("Hit return to continue."); } catch (NumberFormatException ex) { throw new InvalidCommandException("Invalid number."); } break; case 9: printSubMenu1(); response = getLine("Enter choice: "); actOnSub1(response); break; case 10: printSubMenu2(); response = getLine("Enter choice: "); actOnSub2(response); break; case 11: printSubMenu3(); response = getLine("Enter choice: "); actOnSub3(response); break; case 12: try { Class theClass = Class.forName(getLine("Enter name of class that contains method: ")); Class [] formalParams = { Class.forName("ModLattice") }; Method theMethod = theClass.getMethod(getLine("Enter name of method: "), formalParams); Object [] actualParams = { myLattice }; Object temp2 = theMethod.invoke(null, actualParams); if (temp2 != null) myLattice = (ModLattice) temp2; } catch (ClassNotFoundException ex) { throw new InvalidCommandException("Class not found."); } catch (NoSuchMethodException ex) { throw new InvalidCommandException("Method not found."); } catch (SecurityException ex) { throw new InvalidCommandException("Security exception."); } catch (IllegalAccessException ex) { throw new InvalidCommandException("Method is not accessible."); } catch (IllegalArgumentException ex) { throw new InvalidCommandException("Method has wrong parameter list."); } catch (InvocationTargetException ex) { ex.getTargetException().printStackTrace(System.out); throw new InvalidCommandException("Method generated an exception: " + ex.getMessage()); } catch (ClassCastException ex) { throw new InvalidCommandException("Method returns wrong type."); } catch (NullPointerException ex) { throw new InvalidCommandException("Method must be static."); } getLine("Hit return to continue"); break; case 13: try { response = getLine("Enter filename: "); FileReader theFile = new FileReader(response); BufferedReader myIn = new BufferedReader(theFile); inputAll(myIn); } catch (FileNotFoundException ex) { throw new InvalidCommandException("Invalid filename."); } break; case 0: System.exit(0); break; default: throw new InvalidCommandException("Your command was not recognized."); } //switch } //actOn public static void printSubMenu1() { System.out.println(); System.out.println("1. Output element list"); System.out.println("2. Output join table"); System.out.println("3. Output meet table"); System.out.println("4. Output join/meet table"); System.out.println("5. Output equivalence relation"); System.out.println("6. Output all data"); } public static void actOnSub1(String command) throws InvalidCommandException { int i; PrintStream myOut; try { i = Integer.parseInt(command); } catch(NumberFormatException ex) { throw new InvalidCommandException("Your command was not recognized."); } try { String filename = getLine("Enter filename: "); FileOutputStream myFOS = new FileOutputStream(filename, true); myOut = new PrintStream(myFOS); } catch (FileNotFoundException ex) { throw new InvalidCommandException("Invalid filename."); } catch (IOException ex) { throw new InvalidCommandException("An IOException occurred: " + ex.getMessage()); } switch (i) { case 1: for (int j = 0; j < myLattice.elementCount; j++) { Element e = myLattice.elements[j]; myOut.println(j + " " + e.toString() + " " + e.fullName()); } myOut.println(); break; case 2: for (int j = 0; j < myLattice.elementCount; j++) { myOut.print(j + ": "); for (int k = 0; k < myLattice.elementCount; k++) myOut.print(elementNumber(myLattice.join(j, k))); myOut.println(); } myOut.println(); break; case 3: for (int j = 0; j < myLattice.elementCount; j++) { myOut.print(j + ": "); for (int k = 0; k < myLattice.elementCount; k++) myOut.print(elementNumber(myLattice.meet(j, k))); myOut.println(); } myOut.println(); break; case 4: for (int j = 0; j < myLattice.elementCount; j++) { myOut.print(j + ": "); for (int k = 0; k < myLattice.elementCount; k++) myOut.print(elementNumber(myLattice.table[j][k])); myOut.println(); } myOut.println(); break; case 5: IntCell count = new IntCell(0); int [] repSet = myLattice.myEqRel.repSet(count, myLattice.elementCount); for (int j = 0; j < count.myInt; j++) { myOut.print(" "); int [] row = myLattice.myEqRel.classOf(repSet[j]); for (int k = 0; k < row.length; k++) myOut.print(row[k] + " "); myOut.println(); } myOut.println(); break; case 6: outputAll(myOut); break; default: throw new InvalidCommandException("Your command was not recognized."); } //switch } //actOnSub1 public static void printSubMenu2() { System.out.println(); System.out.println("DEPTH = " + ModLattice.DEPTH); System.out.println("DEPTH2 = " + ModLattice.DEPTH2); System.out.println("M = " + ModLattice.M); System.out.println("N = " + ModLattice.N); System.out.println("ALTS = " + Element.ALTS); System.out.println(); System.out.println("1. Change DEPTH"); System.out.println("2. Change DEPTH2"); System.out.println("3. Change M"); System.out.println("4. Change N"); System.out.println("5. Change ALTS"); } public static void actOnSub2(String command) throws InvalidCommandException { int i, j; try { i = Integer.parseInt(command); } catch(NumberFormatException ex) { throw new InvalidCommandException("Your command was not recognized."); } switch (i) { case 1: try { j = Integer.parseInt(getLine("Enter new DEPTH: ")); if (j < 0) throw new InvalidCommandException("Invalid number."); ModLattice.DEPTH = j; } catch (NumberFormatException ex) { throw new InvalidCommandException("Invalid number."); } break; case 2: try { j = Integer.parseInt(getLine("Enter new DEPTH2: ")); if (j < 0) throw new InvalidCommandException("Invalid number."); ModLattice.DEPTH2 = j; } catch (NumberFormatException ex) { throw new InvalidCommandException("Invalid number."); } break; case 3: try { j = Integer.parseInt(getLine("Enter new M: ")); if (j < 0) throw new InvalidCommandException("Invalid number."); ModLattice.M = j; } catch (NumberFormatException ex) { throw new InvalidCommandException("Invalid number."); } break; case 4: try { j = Integer.parseInt(getLine("Enter new N: ")); if (j < 0) throw new InvalidCommandException("Invalid number."); ModLattice.N = j; } catch (NumberFormatException ex) { throw new InvalidCommandException("Invalid number."); } break; case 5: try { j = Integer.parseInt(getLine("Enter new ALTS: ")); if (j < 0) throw new InvalidCommandException("Invalid number."); for (int k = 0; k < myLattice.elementCount; k++) { Element e = myLattice.elements[k]; int toCopy = Math.min(j, e.altsUsed); Term [] temp = e.altTerms; e.altTerms = new Term[j]; for (int l = 0; l < toCopy; l++) e.altTerms[l] = temp[l]; e.altsUsed = toCopy; } Element.ALTS = j; } catch (NumberFormatException ex) { throw new InvalidCommandException("Invalid number."); } break; default: throw new InvalidCommandException("Your command was not recognized."); } //switch } //actOnSub2 public static void printSubMenu3() { System.out.println(); System.out.println("1. Check join associativity"); System.out.println("2. Check meet associativity"); System.out.println("3. Check join/meet compatibility"); System.out.println("4. Check modularity"); } public static void actOnSub3(String command) throws InvalidCommandException { int i; try { i = Integer.parseInt(command); } catch(NumberFormatException ex) { throw new InvalidCommandException("Your command was not recognized."); } switch (i) { case 1: for (int j = 0; j < myLattice.elementCount; j++) for (int k = 0; k < myLattice.elementCount; k++) for (int l = 0; l < myLattice.elementCount; l++) { Element e1, e2, e3, e4; e1 = myLattice.join(j, k); e3 = myLattice.join(k, l); if (e1 != null && e3 != null) { e2 = myLattice.join(e1.myNumber, l); e4 = myLattice.join(e3.myNumber, j); if (e2 != null && e4 != null && e2 != e4) myLattice.identify(e2, e4); } } break; case 2: for (int j = 0; j < myLattice.elementCount; j++) for (int k = 0; k < myLattice.elementCount; k++) for (int l = 0; l < myLattice.elementCount; l++) { Element e1, e2, e3, e4; e1 = myLattice.meet(j, k); e3 = myLattice.meet(k, l); if (e1 != null && e3 != null) { e2 = myLattice.meet(e1.myNumber, l); e4 = myLattice.meet(e3.myNumber, j); if (e2 != null && e4 != null && e2 != e4) myLattice.identify(e2, e4); } } break; case 3: for (int j = 0; j < myLattice.elementCount; j++) for (int k = 0; k < myLattice.elementCount; k++) { Element e1 = myLattice.join(j, k); Element e2 = myLattice.meet(j, k); Element e3 = myLattice.elements[j]; Element e4 = myLattice.elements[k]; if (e1 == e4 && e2 != null && e2 != e3) myLattice.identify(e2, e3); if (e2 == e3 && e1 != null && e1 != e4) myLattice.identify(e1, e4); } break; case 4: for (int j = 0; j < myLattice.elementCount; j++) for (int l = 0; l < myLattice.elementCount; l++) { Element e5 = myLattice.elements[j]; Element e7 = myLattice.elements[l]; if (myLattice.join(j, l) == e7 || myLattice.meet(j, l) == e5) { Element e1, e2, e3, e4; for (int k = 0; k < myLattice.elementCount; k++) { e1 = myLattice.join(j, k); e3 = myLattice.meet(k, l); if (e1 != null && e3 != null) { e2 = myLattice.meet(e1.myNumber, l); e4 = myLattice.join(j, e3.myNumber); if (e2 != null && e4 != null && e2 != e4) myLattice.identify(e2, e4); } } } //if } //for break; default: throw new InvalidCommandException("Your command was not recognized."); } //switch } //actOnSub3 public static String elementNumber(Element e) { if (e == null) return "n/a "; else return (e.myNumber + " "); } public static String elementNumber2(Element e) { if (e == null) return "n/a"; else return (e.myNumber + ""); } public static Element numberElement(String s) { try { int i = Integer.parseInt(s); return myLattice.elements[i]; } catch (NumberFormatException e) { return null; } } public static void outputAll(PrintStream myOut) { if (myLattice instanceof SelfDualModLattice) myOut.println("SelfDualModLattice"); else myOut.println("ModLattice"); myOut.println(ModLattice.DEPTH); myOut.println(ModLattice.DEPTH2); myOut.println(ModLattice.M); myOut.println(ModLattice.N); myOut.println(Element.ALTS); myOut.println(myLattice.currentSize); myOut.println(myLattice.auto); for (int i = 0; i < myLattice.auto; i++) myOut.println(myLattice.inverse[i]); myOut.println(myLattice.currentRow); myOut.println(myLattice.currentColumn); myOut.println(myLattice.elementCount); for (int i = 0; i < myLattice.elementCount; i++) { Element e = myLattice.elements[i]; myOut.println(elementNumber2(e.dual)); for (int j = 0; j < myLattice.auto; j++) myOut.println(elementNumber2(e.conjugates[j])); myOut.println(e.myTerm.toString()); myOut.println(e.altsUsed); for (int j = 0; j < e.altsUsed; j++) myOut.println(e.altTerms[j].toString()); } for (int i = 0; i < myLattice.elementCount; i++) for (int j = 0; j < myLattice.elementCount; j++) myOut.println(elementNumber2(myLattice.table[i][j])); IntCell count = new IntCell(0); int [] repSet = myLattice.myEqRel.repSet(count, myLattice.elementCount); myOut.println(count.myInt); for (int j = 0; j < count.myInt; j++) { int [] row = myLattice.myEqRel.classOf(repSet[j]); for (int k = 0; k < row.length; k++) myOut.print(row[k] + " "); myOut.println(); } } //outputAll public static void inputAll(BufferedReader myIn) throws InvalidCommandException { String line; boolean selfDual; int currentSize, auto, altsUsed, count; int [] inverse; StringTokenizer st; try { line = myIn.readLine(); if (line.equals("ModLattice")) selfDual = false; else if (line.equals("SelfDualModLattice")) selfDual = true; else throw new InvalidCommandException("Invalid file."); line = myIn.readLine(); ModLattice.DEPTH = Integer.parseInt(line); line = myIn.readLine(); ModLattice.DEPTH2 = Integer.parseInt(line); line = myIn.readLine(); ModLattice.M = Integer.parseInt(line); line = myIn.readLine(); ModLattice.N = Integer.parseInt(line); line = myIn.readLine(); Element.ALTS = Integer.parseInt(line); line = myIn.readLine(); currentSize = Integer.parseInt(line); line = myIn.readLine(); auto = Integer.parseInt(line); inverse = new int[auto]; for (int i = 0; i < auto; i++) { line = myIn.readLine(); inverse[i] = Integer.parseInt(line); } if (selfDual) myLattice = new SelfDualModLattice(currentSize, inverse); else myLattice = new ModLattice(currentSize, inverse); line = myIn.readLine(); myLattice.currentRow = Integer.parseInt(line); line = myIn.readLine(); myLattice.currentColumn = Integer.parseInt(line); line = myIn.readLine(); myLattice.elementCount = Integer.parseInt(line); for (int i = 0; i < myLattice.elementCount; i++) myLattice.elements[i] = new Element(i, auto, myLattice); for (int i = 0; i < myLattice.elementCount; i++) { Element e = myLattice.elements[i]; line = myIn.readLine(); e.dual = numberElement(line); for (int j = 0; j < auto; j++) { line = myIn.readLine(); e.conjugates[j] = numberElement(line); } line = myIn.readLine(); e.myTerm = new Term(line, myLattice); line = myIn.readLine(); e.altsUsed = Integer.parseInt(line); for (int j = 0; j < e.altsUsed; j++) { line = myIn.readLine(); e.altTerms[j] = new Term(line, myLattice); } } //for (i) for (int i = 0; i < myLattice.elementCount; i++) for (int j = 0; j < myLattice.elementCount; j++) { line = myIn.readLine(); myLattice.table[i][j] = numberElement(line); } line = myIn.readLine(); count = Integer.parseInt(line); for (int i = 0; i < count; i++) { line = myIn.readLine(); st = new StringTokenizer(line); int [] row = new int[st.countTokens()]; for (int j = 0; j < row.length; j++) row[j] = Integer.parseInt(st.nextToken()); for (int j = 0; j < row.length; j++) myLattice.myEqRel.classes[row[j]] = row; } } catch (NumberFormatException ex) { throw new InvalidCommandException("Invalid file."); } catch (IOException ex) { throw new InvalidCommandException("An IOException occurred."); } } //inputAll } //class Driver ; System.out.println("M = " + ModLattice.M); System.out.println("N = " + ModLattice.N); System.out.println("ALTS = " + Element.ALTS); System.out.println(); System.out.println("1. Change DEPTH");./Element.java010064400125110000346000000076110716250073000143130ustar00dwassermgrad00003010004401public class Element { public static int ALTS = 6; //max number of alternative expressions to store final int myNumber; final int conjCount; Element dual; //this field is used only if this Element is in a SelfDualModLattice Element [] conjugates; Term myTerm; //the defining term Term [] altTerms; //holds other expressions of the element int altsUsed; //number of alternative expressions available final ModLattice myLattice; public Element(ModLattice myLattice, char variable) //Any character except the lowercase v, the exponent symbol, //zero, and one may be a variable. { myNumber = myLattice.elementCount; conjCount = myLattice.auto; conjugates = new Element[conjCount]; myTerm = new Term(variable); altTerms = new Term[ALTS]; this.myLattice = myLattice; myLattice.elements[myLattice.elementCount++] = this; //When an element is created, it automatically installs itself in the lattice's element list. //System.out.println("Element made: " + myLattice.elementCount); } public Element(ModLattice myLattice, char operator, Element operand1, Element operand2) { myNumber = myLattice.elementCount; conjCount = myLattice.auto; conjugates = new Element[conjCount]; myTerm = new Term(operator, operand1, operand2); altTerms = new Term[ALTS]; this.myLattice = myLattice; myLattice.elements[myLattice.elementCount++] = this; //When an element is created, it automatically installs itself in the lattice's element list. //System.out.println("Element made: " + myLattice.elementCount); } public Element(ModLattice myLattice, Term aTerm) { myNumber = myLattice.elementCount; conjCount = myLattice.auto; conjugates = new Element[conjCount]; myTerm = aTerm; altTerms = new Term[ALTS]; this.myLattice = myLattice; myLattice.elements[myLattice.elementCount++] = this; //When an element is created, it automatically installs itself in the lattice's element list. //System.out.println("Element made: " + myLattice.elementCount); } Element(int number, int count, ModLattice myLattice) /* This constructor is intended to be used only for loading a lattice from a file. */ { myNumber = number; conjCount = count; conjugates = new Element[count]; altTerms = new Term[ALTS]; this.myLattice = myLattice; } public String toString() { return myTerm.toString(); } public String fullName() { String s1, s2; if (myTerm.op == 'v') { s1 = (myTerm.arg1.myTerm.op == '^') ? ("(" + myTerm.arg1.fullName() + ")") : myTerm.arg1.fullName(); s2 = (myTerm.arg2.myTerm.op == '^') ? ("(" + myTerm.arg2.fullName() + ")") : myTerm.arg2.fullName(); return s1 + " v " + s2; } else if (myTerm.op == '^') { s1 = (myTerm.arg1.myTerm.op == 'v') ? ("(" + myTerm.arg1.fullName() + ")") : myTerm.arg1.fullName(); s2 = (myTerm.arg2.myTerm.op == 'v') ? ("(" + myTerm.arg2.fullName() + ")") : myTerm.arg2.fullName(); return s1 + " ^ " + s2; } else return (new Character(myTerm.op)).toString(); } public void addAlt(char operator, Element operand1, Element operand2) { addAlt(new Term(operator, operand1, operand2)); } public void addAlt(Term aTerm) { if (altsUsed < ALTS) { for (int i = 0; i < altsUsed; i++) if (aTerm.equals(altTerms[i])) return; //don't want duplicates if (aTerm.equals(myTerm)) return; altTerms[altsUsed++] = aTerm; } } } //class Element ./EqRel.java010064400125110000346000000064770716250075700137540ustar00dwassermgrad00003010004401public class EqRel { //created with the diagonal relation; can strengthen relation int size; int [][] classes; public EqRel(int size) //linear time { this.size = size; classes = new int[size][1]; /* This allows the EqRel to live in O(size) space. These short rows will be replaced with longer ones as needed. */ for (int i = 0; i < size; i++) classes[i][0] = i; } public boolean related(int x, int y) //linear time { for(int i = 0; i < classes[x].length ; i++) if (classes[x][i] == y) return true; return false; } public void relate(int x, int y) //linear time { int lx = classes[x].length; int ly = classes[y].length; int i, j, k, row; int [] newRow; if (related(x, y)) return; newRow = new int[lx + ly]; //allocate new equivalence class i = 0; j = 0; k = 0; //copy the classes of x and y into the new class in numerical order while (i < lx && j < ly) if (classes[x][i] < classes[y][j]) newRow[k++] = classes[x][i++]; else newRow[k++] = classes[y][j++]; while (i < lx) newRow[k++] = classes[x][i++]; while (j < ly) newRow[k++] = classes[y][j++]; for (k = 0; k < lx + ly; k++) { row = newRow[k]; classes[row] = newRow; //the new class is now the class of each of its members } } public int [] classOf(int x) //constant time { return classes[x]; } public int representative(int x) //constant time { return (classes[x][0]); } public int [] repSet(IntCell count, int elementCount) /*Returns a set of class representatives. The first parameter holds the number of representatives. The second tells the method how many of the elements should be considered valid. linear time */ { boolean [] used = new boolean[elementCount]; int [] answer = new int[elementCount]; int theCount = 0; for (int i = 0; i < elementCount; i++) if (!used[classes[i][0]]) { answer[theCount++] = classes[i][0]; for (int j = 0; j < classes[i].length; j++) used[classes[i][j]] = true; } count.myInt = theCount; return answer; } public int countClasses(int elementCount) //linear time { boolean [] used = new boolean[elementCount]; int answer = 0; for (int i = 0; i < elementCount; i++) if (!used[classes[i][0]]) { answer++; for (int j = 0; j < classes[i].length; j++) used[classes[i][j]] = true; } return answer; } void resize(int newSize) //linear time { int [][] temp; if (newSize <= size) return; temp = classes; classes = new int[newSize][1]; for (int i = 0; i < size; i++) classes[i] = temp[i]; for (int i = size; i < newSize; i++) classes[i][0] = i; size = newSize; } } //class EqRel ws will be replaced with longer ones as needed. */ for (int i = 0; i < size; i++) classes[i][0] = i; } public boolean related(int x, int y) //linear time ./Free.java010064400125110000346000000024410716250077300136060ustar00dwassermgrad00003010004401import java.io.*; public class Free { public static void main(String args[]) throws NumberFormatException /* This starts the creation of the free modular lattice on n generators. The generators are a, b, c, etc. The first automorphism exchanges a and b, the second excahanges a and c, etc. */ { int [] inverse; ModLattice m; Element [] e; int n; char next = 'a'; n = Integer.parseInt(getLine("Enter n: ")); inverse = new int[n - 1]; for (int i = 0; i < n - 1; i++) inverse[i] = i; m = new SelfDualModLattice(40, inverse); e = new Element[n]; for (int i = 0; i < n; i++) e[i] = new Element(m, next++); for (int i = 0; i < n; i++) e[i].dual = e[i]; for (int i = 0; i < n - 1; i++) for (int j = 0; j < n; j++) if (j == 0) e[j].conjugates[i] = e[i + 1]; else if (j == i + 1) e[j].conjugates[i] = e[0]; else e[j].conjugates[i] = e[j]; Driver.start(m); } //main private static String getLine (String prompt) { System.out.print (prompt); String result = new String(); System.out.flush(); try { BufferedReader in = new BufferedReader (new InputStreamReader(System.in)); result = in.readLine(); }catch (IOException ex) { System.err.println("An IOException ocurred: "); } return result; } } ./IntCell.java010064400125110000346000000001450716250101400142430ustar00dwassermgrad00003010004401class IntCell { int myInt; public IntCell(int number) { myInt = number; } } ./InvalidCommandException.java010064400125110000346000000004550716250102500174630ustar00dwassermgrad00003010004401/* *An exception of this type is thrown whenever the user has issued a *command which cannot be properly interpreted. */ public class InvalidCommandException extends Exception { public InvalidCommandException (String s) { super (s); } public InvalidCommandException() { } } ./ModLattice.java010064400125110000346000001133720721627044200147550ustar00dwassermgrad00003010004401import java.util.*; public class ModLattice { public static int DEPTH = 5; //complexity of computations public static int DEPTH2 = 5; //used when answer is already known public static int M = 100; //M and N affect how much work is done public static int N = 10; //in the computeCongruence() method. protected Element [][] table; //join and meet table protected int currentRow, currentColumn; //next position in table to fill protected Element [] elements; protected int currentSize; protected int elementCount; protected int auto; //number of automorphisms protected int [] inverse; //associates each automorphism to its inverse protected EqRel myEqRel; public ModLattice(int initialSize, int [] inverse) { currentSize = initialSize; elements = new Element[currentSize]; table = new Element[currentSize][currentSize]; currentRow = 0; currentColumn = 0; this.inverse = inverse; auto = inverse.length; myEqRel = new EqRel(currentSize); } public void makeNewElements(int total) /* Fills squares in the table, creating new elements when necessary, until elementCount equals total. */ { if (total <= elementCount) return; if (total > currentSize) { System.out.println ("Lattice can't hold that many elements."); return; } try { do { fillCurrentSquare(); updatePointer(); } while (total > elementCount); } catch(TableCompleteException e) { System.out.println("Lattice completed with " + elementCount + " elements."); } computeAllConjugates(); } //makeNewElements protected void updatePointer() throws TableCompleteException { if (currentRow == currentColumn) { currentRow = 0; currentColumn++; if (currentColumn == elementCount) throw new TableCompleteException(); } else if (currentRow < currentColumn) { currentRow++; if (currentRow == currentColumn) currentColumn = 0; } else currentColumn++; } protected Element join(Element e1, Element e2) { return join(e1.myNumber, e2.myNumber); } protected Element join(int x, int y) { if (x < y) return table[x][y]; else return table[y][x]; } protected Element meet(Element e1, Element e2) { return meet(e1.myNumber, e2.myNumber); } protected Element meet(int x, int y) { if (x > y) return table[x][y]; else return table[y][x]; } protected void identify(Element a, Element b) { if (a != b && a != null && b != null) myEqRel.relate(a.myNumber, b.myNumber); } public boolean computeConjugate(Element e, int i) //return value indicates if conjugate was successfully computed { Element answer; int alt; if (e.myTerm.op != 'v' && e.myTerm.op != '^') return true; //variables should have their conjugates already entered manually answer = computeConjugate(e.myTerm, i); for (alt = 0; answer == null && alt < e.altsUsed; alt++) answer = computeConjugate(e.altTerms[alt], i); if (answer == null) return false; if (e.conjugates[i] == null) e.conjugates[i] = answer; else identify(e.conjugates[i], answer); return true; } public void computeAllConjugates() { for (int i = 0; i < auto; i++) for (int j = 0; j < elementCount; j++) computeConjugate(elements[j], i); } private Element computeConjugate(Term aTerm, int i) { Element e1 = aTerm.arg1.conjugates[i]; Element e2 = aTerm.arg2.conjugates[i]; if (e1 == null || e2 == null) return null; return (aTerm.op == '^') ? meet(e1, e2) : join(e1, e2); } /* Term types 1 a v b v c v d 2 a v b v (c ^ d) 3 (a ^ b) v (c ^ d) 4 a v ((b v c) ^ d) 5 a v (b ^ c ^ d) 6 a v b v c only c can be fresh 7 a v (b ^ c) only a and c can be fresh 8 a v b only b can be fresh 9 a ^ b ^ c ^ d 10 a ^ b ^ (c v d) 11 (a v b) ^ (c v d) 12 a ^ ((b ^ c) v d) 13 a ^ (b v c v d) 14 a ^ b ^ c only c can be fresh 15 a ^ (b v c) only a and c can be fresh 16 a ^ b only b can be fresh */ void fillCurrentSquare() { Vector termResults = new Vector(10); Vector elementResults = new Vector(10); Vector unknownTerms = new Vector(10); char op = (currentRow < currentColumn) ? 'v' : '^'; Element lhs = elements[currentRow]; Element rhs = elements[currentColumn]; Element newElement; char leftOp = lhs.myTerm.op; char rightOp = rhs.myTerm.op; boolean leftVar = (leftOp != 'v' && leftOp != '^'); boolean rightVar = (rightOp != 'v' && rightOp != '^'); if (handleTrivialCases(op, leftOp, rightOp, lhs, rhs)) return; //We don't do any more calculation in the trivial cases. preparation(op, lhs, rhs, elementResults); handleEasyCases(op, lhs, rhs, leftOp, rightOp, elementResults); dispatchOnOps(op, lhs, rhs, leftOp, rightOp, leftVar, rightVar, termResults, elementResults); turnTermsToElements(termResults, elementResults, unknownTerms); if (elementResults.size() == 0) elementResults.addElement(makeNewElement(op, lhs, rhs)); if (elementResults.size() > 1) for (int i = 1; i < elementResults.size(); i++) identify((Element) elementResults.elementAt(0), (Element) elementResults.elementAt(i)); table[currentRow][currentColumn] = (Element) elementResults.elementAt(0); fillOtherSquares(unknownTerms); } //fillCurrentSquare boolean handleTrivialCases(char op, char leftOp, char rightOp, Element lhs, Element rhs) //Returns true if a trivial case was detected. { if (leftOp == '0') { table[currentRow][currentColumn] = (op == 'v') ? rhs : lhs; return true; } if (rightOp == '0') { table[currentRow][currentColumn] = (op == 'v') ? lhs : rhs; return true; } if (leftOp == '1') { table[currentRow][currentColumn] = (op == '^') ? rhs : lhs; return true; } if (rightOp == '1') { table[currentRow][currentColumn] = (op == 'v') ? rhs : lhs; return true; } if (currentRow == currentColumn) { table[currentRow][currentRow] = elements[currentRow]; return true; } return false; } //handleTrivialCases protected void preparation(char op, Element lhs, Element rhs, Vector elementResults) { Element conj1, conj2, conj; if (table[currentRow][currentColumn] != null) elementResults.addElement(table[currentRow][currentColumn]); for (int i = 0; i < auto; i++) { conj1 = lhs.conjugates[i]; conj2 = rhs.conjugates[i]; if (conj1 != null && conj2 != null) { conj = (op == 'v') ? join(conj1, conj2) : meet(conj1, conj2); if (conj != null && conj.conjugates[inverse[i]] != null) elementResults.addElement(conj.conjugates[inverse[i]]); } } } void handleEasyCases(char op, Element lhs, Element rhs, char leftOp, char rightOp, Vector elementResults) { Element leftArg1 = lhs.myTerm.arg1; Element leftArg2 = lhs.myTerm.arg2; Element rightArg1 = rhs.myTerm.arg1; Element rightArg2 = rhs.myTerm.arg2; if (op == 'v') { if (rightOp == '^' && (rightArg1 == lhs || rightArg2 == lhs)) elementResults.addElement(lhs); if (leftOp == '^' && (leftArg1 == rhs || leftArg2 == rhs)) elementResults.addElement(rhs); if (leftOp == '^' && rightOp == 'v' && (leftArg1 == rightArg1 || leftArg1 == rightArg2 || leftArg2 == rightArg1 || leftArg2 == rightArg2)) elementResults.addElement(rhs); if (leftOp == 'v' && rightOp == '^' && (leftArg1 == rightArg1 || leftArg1 == rightArg2 || leftArg2 == rightArg1 || leftArg2 == rightArg2)) elementResults.addElement(lhs); } else { //op == '^' if (rightOp == 'v' && (rightArg1 == lhs || rightArg2 == lhs)) elementResults.addElement(lhs); if (leftOp == 'v' && (leftArg1 == rhs || leftArg2 == rhs)) elementResults.addElement(rhs); if (leftOp == '^' && rightOp == 'v' && (leftArg1 == rightArg1 || leftArg1 == rightArg2 || leftArg2 == rightArg1 || leftArg2 == rightArg2)) elementResults.addElement(lhs); if (leftOp == 'v' && rightOp == '^' && (leftArg1 == rightArg1 || leftArg1 == rightArg2 || leftArg2 == rightArg1 || leftArg2 == rightArg2)) elementResults.addElement(rhs); } } //handleEasyCases void dispatchOnOps(char op, Element lhs, Element rhs, char leftOp, char rightOp, boolean leftVar, boolean rightVar, Vector termResults, Vector elementResults) { Element leftArg1 = lhs.myTerm.arg1; Element leftArg2 = lhs.myTerm.arg2; Element rightArg1 = rhs.myTerm.arg1; Element rightArg2 = rhs.myTerm.arg2; int deep = (elementResults.isEmpty()) ? DEPTH : DEPTH2; if (op == 'v') if (leftVar) if (rightOp == 'v') handle6(lhs, rightArg1, rightArg2, 0, deep, termResults, elementResults); else if (rightOp == '^') handle7(lhs, rightArg1, rightArg2, 0, deep, termResults, elementResults); else //rightVar handle8(lhs, rhs, 0, deep, termResults, elementResults); else if (leftOp == 'v') if (rightVar) handle6(leftArg1, leftArg2, rhs, 0, deep, termResults, elementResults); else if (rightOp == 'v') handle1(leftArg1, leftArg2, rightArg1, rightArg2, 0, deep, termResults, elementResults); else //rightOp == '^' handle2(leftArg1, leftArg2, rightArg1, rightArg2, 0, deep, termResults, elementResults); else //leftOp == '^' if (rightVar) handle7(rhs, leftArg1, leftArg2, 0, deep, termResults, elementResults); else if (rightOp == 'v') handle2(rightArg1, rightArg2, leftArg1, leftArg2, 0, deep, termResults, elementResults); else //rightOp == '^' handle3(leftArg1, leftArg2, rightArg1, rightArg2, 0, deep, termResults, elementResults); else //op == '^' if (leftVar) if (rightOp == 'v') handle15(lhs, rightArg1, rightArg2, 0, deep, termResults, elementResults); else if (rightOp == '^') handle14(lhs, rightArg1, rightArg2, 0, deep, termResults, elementResults); else //rightVar handle16(lhs, rhs, 0, deep, termResults, elementResults); else if (leftOp == 'v') if (rightVar) handle15(rhs, leftArg1, leftArg2, 0, deep, termResults, elementResults); else if (rightOp == 'v') handle11(leftArg1, leftArg2, rightArg1, rightArg2, 0, deep, termResults, elementResults); else //rightOp == '^' handle10(rightArg1, rightArg2, leftArg1, leftArg2, 0, deep, termResults, elementResults); else //leftOp == '^' if (rightVar) handle14(rhs, leftArg1, leftArg2, 0, deep, termResults, elementResults); else if (rightOp == 'v') handle10(leftArg1, leftArg2, rightArg1, rightArg2, 0, deep, termResults, elementResults); else //rightOp == '^' handle9(leftArg1, leftArg2, rightArg1, rightArg2, 0, deep, termResults, elementResults); } //dispatchOnOps void turnTermsToElements(Vector termResults, Vector elementResults, Vector unknownTerms) { Element answer; Term currentTerm; for (int i = 0; i < termResults.size(); i++) { currentTerm = (Term) termResults.elementAt(i); answer = (currentTerm.op == 'v') ? join(currentTerm.arg1, currentTerm.arg2) : meet(currentTerm.arg1, currentTerm.arg2); if (answer == null) unknownTerms.addElement(currentTerm); else elementResults.addElement(answer); } } protected Element makeNewElement(char op, Element lhs, Element rhs) { Element newElement = new Element(this, op, lhs, rhs); for (int i = 0; i < auto; i++) computeConjugate(newElement, i); return newElement; } void fillOtherSquares(Vector unknownTerms) { Term currentTerm; int num0 = table[currentRow][currentColumn].myNumber; int num1, num2; for (int i = 0; i < unknownTerms.size(); i++) { currentTerm = (Term) unknownTerms.elementAt(i); num1 = currentTerm.arg1.myNumber; num2 = currentTerm.arg2.myNumber; if (num1 < num0 && num2 < num0) table[currentRow][currentColumn].addAlt(currentTerm); /* We only want to describe elements in terms of lower-numbered elements, which are presumably simpler. */ if (currentTerm.op == 'v') if (num1 < num2) table[num1][num2] = table[currentRow][currentColumn]; else table[num2][num1] = table[currentRow][currentColumn]; else // currentTerm.op == '^' if (num1 > num2) table[num1][num2] = table[currentRow][currentColumn]; else table[num2][num1] = table[currentRow][currentColumn]; } //for } //fillOtherSquares void handle1(Element a, Element b, Element c, Element d, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = join(a, c); Element answer2 = join(a, d); Element answer3 = join(b, c); Element answer4 = join(b, d); if (deep <= 0) return; //join if (answer1 != null) handle6(b, d, answer1, 3, deep - 1, termResults, elementResults); if (answer2 != null) handle6(b, c, answer2, 3, deep - 1, termResults, elementResults); if (answer3 != null) handle6(a, d, answer3, 3, deep - 1, termResults, elementResults); if (answer4 != null) handle6(a, c, answer4, 3, deep - 1, termResults, elementResults); } //handle1 void handle2(Element a, Element b, Element c, Element d, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = meet(c, d); Element answer2 = meet(a, c); Element answer3 = join(a, c); Element answer4 = meet(a, d); Element answer5 = join(a, d); Element answer6 = meet(b, c); Element answer7 = join(b, c); Element answer8 = meet(b, d); Element answer9 = join(b, d); if (deep <= 0) return; //meet if (answer1 != null) handle6(a, b, answer1, 3, deep - 1, termResults, elementResults); //apply modular law if (answer2 == a || answer3 == c) handle4(b, a, d, c, 0, deep - 1, termResults, elementResults); if (answer4 == a || answer5 == d) handle4(b, a, c, d, 0, deep - 1, termResults, elementResults); if (answer6 == b || answer7 == c) handle4(a, b, d, c, 0, deep - 1, termResults, elementResults); if (answer8 == b || answer9 == d) handle4(a, b, c, d, 0, deep - 1, termResults, elementResults); } //handle2 void handle3(Element a, Element b, Element c, Element d, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer2 = meet(a, c); Element answer3 = join(a, c); Element answer4 = meet(a, d); Element answer5 = join(a, d); Element answer6 = meet(b, c); Element answer7 = join(b, c); Element answer8 = meet(b, d); Element answer9 = join(b, d); if (deep <= 0) return; //apply modular law if (answer2 == a || answer3 == c || answer6 == b || answer7 == c) handle12(c, a, b, d, 0, deep - 1, termResults, elementResults); if (answer4 == a || answer5 == d || answer8 == b || answer9 == d) handle12(d, a, b, c, 0, deep - 1, termResults, elementResults); if (answer2 == c || answer3 == a || answer4 == d || answer5 == a) handle12(a, c, d, b, 0, deep - 1, termResults, elementResults); if (answer6 == c || answer7 == b || answer8 == d || answer9 == b) handle12(b, c, d, a, 0, deep - 1, termResults, elementResults); } //handle3 void handle4(Element a, Element b, Element c, Element d, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = join(b, c); Element answer2 = join(a, d); Element answer3 = meet(a, d); if (deep <= 0) return; //join if (answer1 != null) handle7(a, d, answer1, 3, deep - 1, termResults, elementResults); //apply modular law if (answer2 == d || answer3 == a) handle13(d, a, b, c, 0, deep - 1, termResults, elementResults); } //handle4 void handle5(Element a, Element b, Element c, Element d, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = meet(b, c); Element answer2 = meet(b, d); Element answer3 = meet(c, d); Element answer4 = meet(a, b); Element answer5 = join(a, b); Element answer6 = meet(a, c); Element answer7 = join(a, c); Element answer8 = meet(a, d); Element answer9 = join(a, d); if (deep <= 0) return; //meet if (answer1 != null) handle7(a, d, answer1, 3, deep - 1, termResults, elementResults); if (answer2 != null) handle7(a, c, answer2, 3, deep - 1, termResults, elementResults); if (answer3 != null) handle7(a, b, answer3, 3, deep - 1, termResults, elementResults); //apply modular law if (answer4 == a || answer5 == b) handle12(b, c, d, a, 0, deep - 1, termResults, elementResults); if (answer6 == a || answer7 == c) handle12(c, b, d, a, 0, deep - 1, termResults, elementResults); if (answer8 == a || answer9 == d) handle12(d, b, c, a, 0, deep - 1, termResults, elementResults); //absorb if (a == b || a == c || a == d) elementResults.addElement (a); } //handle5 void handle6(Element a, Element b, Element c, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = join(a, b); Element answer2 = join(a, c); Element answer3 = join(b, c); int i; Term t; if (deep <= 0) return; //join if (answer1 != null) handle8(c, answer1, 2, deep - 1, termResults, elementResults); if (answer2 != null) handle8(b, answer2, 2, deep - 1, termResults, elementResults); if (answer3 != null) handle8(a, answer3, 2, deep - 1, termResults, elementResults); //recharacterize if (fresh == 3) for (i = -1; i < c.altsUsed; i++) { if (i == -1) t = c.myTerm; else t = c.altTerms[i]; if (t.op == 'v') handle1(a, b, t.arg1, t.arg2, 0, deep - 1, termResults, elementResults); if (t.op == '^') handle2(a, b, t.arg1, t.arg2, 0, deep - 1, termResults, elementResults); } } //handle6 void handle7(Element a, Element b, Element c, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = meet(a, b); Element answer2 = join(a, b); Element answer3 = meet(a, c); Element answer4 = join(a, c); Element answer5 = meet(b, c); int i; Term t; if (deep <= 0) return; //meet if (answer5 != null) handle8(a, answer5, 2, deep - 1, termResults, elementResults); //apply modular law if (answer1 == a || answer2 == b) handle15(b, a, c, 0, deep - 1, termResults, elementResults); if (answer3 == a || answer4 == c) handle15(c, a, b, 0, deep - 1, termResults, elementResults); //recharacterize if (fresh == 3) for (i = -1; i < c.altsUsed; i++) { if (i == -1) t = c.myTerm; else t = c.altTerms[i]; if (t.op == 'v') handle4(a, t.arg1, t.arg2, b, 0, deep - 1, termResults, elementResults); if (t.op == '^') handle5(a, b, t.arg1, t.arg2, 0, deep - 1, termResults, elementResults); } if (fresh == 1) for (i = -1; i < a.altsUsed; i++) { if (i == -1) t = a.myTerm; else t = a.altTerms[i]; if (t.op == 'v') handle2(t.arg1, t.arg2, b, c, 0, deep - 1, termResults, elementResults); if (t.op == '^') handle3(b, c, t.arg1, t.arg2, 0, deep - 1, termResults, elementResults); } //absorb if (a == b || a == c) elementResults.addElement(a); } //handle7 void handle8(Element a, Element b, int fresh, int deep, Vector termResults, Vector elementResults) { Term t; termResults.addElement(new Term('v', a, b)); if (deep <= 0) return; //recharacterize if (fresh == 2) for (int i = -1; i < b.altsUsed; i++) { if (i == -1) t = b.myTerm; else t = b.altTerms[i]; if (t.op == 'v') handle6(t.arg1, t.arg2, a, 0, deep - 1, termResults, elementResults); if (t.op == '^') handle7(a, t.arg1, t.arg2, 0, deep - 1, termResults, elementResults); } } //handle8 void handle9(Element a, Element b, Element c, Element d, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = meet(a, c); Element answer2 = meet(a, d); Element answer3 = meet(b, c); Element answer4 = meet(b, d); if (deep <= 0) return; //meet if (answer1 != null) handle14(b, d, answer1, 3, deep - 1, termResults, elementResults); if (answer2 != null) handle14(b, c, answer2, 3, deep - 1, termResults, elementResults); if (answer3 != null) handle14(a, d, answer3, 3, deep - 1, termResults, elementResults); if (answer4 != null) handle14(a, c, answer4, 3, deep - 1, termResults, elementResults); } //handle9 void handle10(Element a, Element b, Element c, Element d, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = join(c, d); Element answer2 = join(a, c); Element answer3 = meet(a, c); Element answer4 = join(a, d); Element answer5 = meet(a, d); Element answer6 = join(b, c); Element answer7 = meet(b, c); Element answer8 = join(b, d); Element answer9 = meet(b, d); if (deep <= 0) return; //join if (answer1 != null) handle14(a, b, answer1, 3, deep - 1, termResults, elementResults); //apply modular law if (answer2 == a || answer3 == c) handle12(b, a, d, c, 0, deep - 1, termResults, elementResults); if (answer4 == a || answer5 == d) handle12(b, a, c, d, 0, deep - 1, termResults, elementResults); if (answer6 == b || answer7 == c) handle12(a, b, d, c, 0, deep - 1, termResults, elementResults); if (answer8 == b || answer9 == d) handle12(a, b, c, d, 0, deep - 1, termResults, elementResults); } //handle10 void handle11(Element a, Element b, Element c, Element d, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer2 = join(a, c); Element answer3 = meet(a, c); Element answer4 = join(a, d); Element answer5 = meet(a, d); Element answer6 = join(b, c); Element answer7 = meet(b, c); Element answer8 = join(b, d); Element answer9 = meet(b, d); if (deep <= 0) return; //apply modular law if (answer2 == a || answer3 == c || answer6 == b || answer7 == c) handle4(c, a, b, d, 0, deep - 1, termResults, elementResults); if (answer4 == a || answer5 == d || answer8 == b || answer9 == d) handle4(d, a, b, c, 0, deep - 1, termResults, elementResults); if (answer2 == c || answer3 == a || answer4 == d || answer5 == a) handle4(a, c, d, b, 0, deep - 1, termResults, elementResults); if (answer6 == c || answer7 == b || answer8 == d || answer9 == b) handle4(b, c, d, a, 0, deep - 1, termResults, elementResults); } //handle11 void handle12(Element a, Element b, Element c, Element d, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = meet(b, c); Element answer2 = meet(a, d); Element answer3 = join(a, d); if (deep <= 0) return; //meet if (answer1 != null) handle15(a, d, answer1, 3, deep - 1, termResults, elementResults); //apply modular law if (answer2 == d || answer3 == a) handle5(d, a, b, c, 0, deep - 1, termResults, elementResults); } //handle12 void handle13(Element a, Element b, Element c, Element d, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = join(b, c); Element answer2 = join(b, d); Element answer3 = join(c, d); Element answer4 = join(a, b); Element answer5 = meet(a, b); Element answer6 = join(a, c); Element answer7 = meet(a, c); Element answer8 = join(a, d); Element answer9 = meet(a, d); if (deep <= 0) return; //join if (answer1 != null) handle15(a, d, answer1, 3, deep - 1, termResults, elementResults); if (answer2 != null) handle15(a, c, answer2, 3, deep - 1, termResults, elementResults); if (answer3 != null) handle15(a, b, answer3, 3, deep - 1, termResults, elementResults); //apply modular law if (answer4 == a || answer5 == b) handle4(b, c, d, a, 0, deep - 1, termResults, elementResults); if (answer6 == a || answer7 == c) handle4(c, b, d, a, 0, deep - 1, termResults, elementResults); if (answer8 == a || answer9 == d) handle4(d, b, c, a, 0, deep - 1, termResults, elementResults); //absorb if (a == b || a == c || a == d) elementResults.addElement (a); } //handle13 void handle14(Element a, Element b, Element c, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = meet(a, b); Element answer2 = meet(a, c); Element answer3 = meet(b, c); int i; Term t; if (deep <= 0) return; //meet if (answer1 != null) handle16(c, answer1, 2, deep - 1, termResults, elementResults); if (answer2 != null) handle16(b, answer2, 2, deep - 1, termResults, elementResults); if (answer3 != null) handle16(a, answer3, 2, deep - 1, termResults, elementResults); //recharacterize if (fresh == 3) for (i = -1; i < c.altsUsed; i++) { if (i == -1) t = c.myTerm; else t = c.altTerms[i]; if (t.op == '^') handle9(a, b, t.arg1, t.arg2, 0, deep - 1, termResults, elementResults); if (t.op == 'v') handle10(a, b, t.arg1, t.arg2, 0, deep - 1, termResults, elementResults); } } //handle14 void handle15(Element a, Element b, Element c, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = join(a, b); Element answer2 = meet(a, b); Element answer3 = join(a, c); Element answer4 = meet(a, c); Element answer5 = join(b, c); int i; Term t; if (deep <= 0) return; //join if (answer5 != null) handle16(a, answer5, 2, deep - 1, termResults, elementResults); //apply modular law if (answer1 == a || answer2 == b) handle7(b, a, c, 0, deep - 1, termResults, elementResults); if (answer3 == a || answer4 == c) handle7(c, a, b, 0, deep - 1, termResults, elementResults); //recharacterize if (fresh == 3) for (i = -1; i < c.altsUsed; i++) { if (i == -1) t = c.myTerm; else t = c.altTerms[i]; if (t.op == '^') handle12(a, t.arg1, t.arg2, b, 0, deep - 1, termResults, elementResults); if (t.op == 'v') handle13(a, b, t.arg1, t.arg2, 0, deep - 1, termResults, elementResults); } if (fresh == 1) for (i = -1; i < a.altsUsed; i++) { if (i == -1) t = a.myTerm; else t = a.altTerms[i]; if (t.op == '^') handle10(t.arg1, t.arg2, b, c, 0, deep - 1, termResults, elementResults); if (t.op == 'v') handle11(b, c, t.arg1, t.arg2, 0, deep - 1, termResults, elementResults); } //absorb if (a == b || a == c) elementResults.addElement (a); } //handle15 void handle16(Element a, Element b, int fresh, int deep, Vector termResults, Vector elementResults) { Term t; termResults.addElement(new Term('^', a, b)); if (deep <= 0) return; //recharacterize if (fresh == 2) for (int i = -1; i < b.altsUsed; i++) { if (i == -1) t = b.myTerm; else t = b.altTerms[i]; if (t.op == '^') handle14(t.arg1, t.arg2, a, 0, deep - 1, termResults, elementResults); if (t.op == 'v') handle15(a, t.arg1, t.arg2, 0, deep - 1, termResults, elementResults); } } //handle16 void computeCongruence() //This method doesn't really compute the congruence generated by the equivalence //relation; it's intended to find most of the pairs with a reasonable amount of work. { IntCell count = new IntCell(0); int [] repSet = myEqRel.repSet(count, elementCount); int [] row; int maxRow, maxColumn, l; Element e, f, g, h; if (count.myInt == 1) return; //All elements are related already. for (int i = 0; i < count.myInt; i++) { row = myEqRel.classOf(repSet[i]); //While row is being used, myEqRel can change, but row won't. for (int j = 0; j < row.length - 1; j++) for (int k = j + 1; k < row.length; k++) { e = elements[row[j]]; f = elements[row[k]]; g = join(e, f); h = meet(e, f); if (g != null) identify(e, g); if (h != null) identify(e, h); } } //for (i) repSet = myEqRel.repSet(count, elementCount); if (count.myInt == 1) return; //All elements are related already. l = 0; for(int i = 0; i < count.myInt && l < M; i++) { //This loop runs until either M nontrivial classes have been //examined or there are no classes left. row = myEqRel.classOf(repSet[i]); if (row.length > 1) { l++; maxColumn = Math.min(row.length - 1, N); for (int j = 1; j <= maxColumn; j++) for (int k = 0; k < elementCount; k++) { Element e1 = join(row[0], k); Element e2 = join(row[j], k); Element e3 = meet(row[0], k); Element e4 = meet(row[j], k); if (e1 == null) table[Math.min(row[0], k)][Math.max(row[0], k)] = e2; else identify(e1, e2); if (e3 == null) table[Math.max(row[0], k)][Math.min(row[0], k)] = e4; else identify(e3, e4); } } //if } //for } //computeCongruence public ModLattice collapse(boolean keepAuto) { IntCell count = new IntCell(0); int [] repSet = myEqRel.repSet(count, elementCount); ModLattice theNewLattice = new ModLattice(count.myInt, keepAuto ? inverse : new int[0]); int [] lookup = repSet; //For each element number in the new lattice, //gives the corresponding number in the old lattice. Element [] lookup2 = new Element[elementCount]; //For each element number in the old //lattice, gives the corresponding element in the new lattice. Element oldElement, newElement; int oldConjugate; Term oldTerm, newTerm; int [] currentClass; //create elements of new lattice for (int i = 0; i < count.myInt; i++) { oldElement = elements[repSet[i]]; oldTerm = oldElement.myTerm; if (oldTerm.op == 'v' || oldTerm.op == '^') newTerm = new Term(oldTerm.op, lookup2[oldTerm.arg1.myNumber], lookup2[oldTerm.arg2.myNumber]); else newTerm = new Term(oldTerm.op); newElement = new Element(theNewLattice, newTerm); currentClass = myEqRel.classOf(oldElement.myNumber); for (int j = 0; j < currentClass.length; j++) lookup2[currentClass[j]] = newElement; if (keepAuto) for (int j = 0; j < auto; j++) if (oldElement.conjugates[j] != null) { oldConjugate = oldElement.conjugates[j].myNumber; newElement.conjugates[j] = lookup2[oldConjugate]; } for (int j = 0; j < oldElement.altsUsed; j++) { oldTerm = oldElement.altTerms[j]; if (oldTerm.op == 'v' || oldTerm.op == '^') newTerm = new Term(oldTerm.op, lookup2[oldTerm.arg1.myNumber], lookup2[oldTerm.arg2.myNumber]); else newTerm = new Term(oldTerm.op); newElement.addAlt(newTerm); } } // for (i) //fill table of new lattice for (int i = 0; i < theNewLattice.elementCount; i++) for (int j = 0; j < theNewLattice.elementCount; j++) { oldElement = table[lookup[i]][lookup[j]]; if (oldElement != null) { newElement = lookup2[oldElement.myNumber]; theNewLattice.table[i][j] = newElement; } } return theNewLattice; } //collapse void resize(int newSize) { Element [][] temp = table; Element [] temp2 = elements; table = new Element[newSize][newSize]; for (int i = 0; i < elementCount; i++) for (int j = 0; j < elementCount; j++) table[i][j] = temp[i][j]; elements = new Element[newSize]; for (int i = 0; i < elementCount; i++) elements[i] = temp2[i]; myEqRel.resize(newSize); currentSize = newSize; } Element forceMeet(int x, int y) /* This method computes the meet of the elements numbered x, and y, whether or not it has already been computed. */ { int tempRow = currentRow; int tempColumn = currentColumn; Element answer; if (x >= elementCount || y >= elementCount || x < 0 || y < 0) return null; //invalid arguments currentRow = Math.max(x, y); currentColumn = Math.min(x, y); fillCurrentSquare(); answer = table[currentRow][currentColumn]; currentRow = tempRow; currentColumn = tempColumn; return answer; } Element forceJoin(int x, int y) /* This method computes the join of the elements numbered x, and y, whether or not it has already been computed. */ { int tempRow = currentRow; int tempColumn = currentColumn; Element answer; if (x >= elementCount || y >= elementCount || x < 0 || y < 0) return null; //invalid arguments currentRow = Math.min(x, y); currentColumn = Math.max(x, y); fillCurrentSquare(); answer = table[currentRow][currentColumn]; currentRow = tempRow; currentColumn = tempColumn; return answer; } } //class ModLattice if (a == b || a == c || a == d) elementResults.addElement (a); } //handle13 void handle14(Element a, Element b, Element c, int fresh, int deep, Vector termResults, Vector elementResults) { Element answer1 = meet(a, b); ./SelfDualModLattice.java010064400125110000346000000143200716250105300163610ustar00dwassermgrad00003010004401import java.util.*; public class SelfDualModLattice extends ModLattice { public SelfDualModLattice(int initialSize, int [] inverse) { super(initialSize, inverse); } public boolean computeDual(Element e) //return value indicates if dual was successfully computed { Element answer; int alt; if (e.myTerm.op != 'v' && e.myTerm.op != '^') return true; //variables must have their duals already entered by hand answer = computeDual(e.myTerm); for (alt = 0; answer == null && alt < e.altsUsed; alt++) answer = computeDual(e.altTerms[alt]); if (answer == null) return false; if (e.dual == null) e.dual = answer; else identify(e.dual, answer); return true; } public void computeAllDuals() { for (int i = 0; i < elementCount; i++) computeDual(elements[i]); } private Element computeDual(Term aTerm) { Element e1 = aTerm.arg1.dual; Element e2 = aTerm.arg2.dual; if (e1 == null || e2 == null) return null; return (aTerm.op == 'v') ? meet(e1, e2) : join(e1, e2); } public void makeNewElements(int total) /* Fills squares in the table, creating new elements when necessary, until elementCount equals total. The only difference between this method and the parent method is the addition of the last instruction. */ { if (total <= elementCount) return; if (total > currentSize) { System.out.println ("Lattice can't hold that many elements."); return; } try { do { fillCurrentSquare(); updatePointer(); } while (total > elementCount); } catch(TableCompleteException e) { if (elementCount < total) System.out.println("Lattice completed with " + elementCount + " elements."); } computeAllConjugates(); computeAllDuals(); } //makeNewElements protected void preparation(char op, Element lhs, Element rhs, Vector elementResults) { Element conj1, conj2, conj, dual1, dual2, dual3; if (table[currentRow][currentColumn] != null) elementResults.addElement(table[currentRow][currentColumn]); for (int i = 0; i < auto; i++) { conj1 = lhs.conjugates[i]; conj2 = rhs.conjugates[i]; if (conj1 != null && conj2 != null) { conj = (op == 'v') ? join(conj1, conj2) : meet(conj1, conj2); if (conj != null && conj.conjugates[inverse[i]] != null) elementResults.addElement(conj.conjugates[inverse[i]]); } } dual1 = lhs.dual; dual2 = rhs.dual; if (dual1 != null && dual2 != null) { dual3 = (op == '^') ? join(dual1, dual2) : meet(dual1, dual2); if (dual3 != null && dual3.dual != null) elementResults.addElement(dual3.dual); } } protected Element makeNewElement(char op, Element lhs, Element rhs) { Element newElement = new Element(this, op, lhs, rhs); for (int i = 0; i < auto; i++) computeConjugate(newElement, i); computeDual(newElement); return newElement; } public ModLattice collapse(boolean keepAuto) { IntCell count = new IntCell(0); int [] repSet = myEqRel.repSet(count, elementCount); ModLattice theNewLattice; int [] lookup = repSet; //For each element number in the new lattice, //gives the corresponding number in the old lattice. Element [] lookup2 = new Element[elementCount]; //For each element number in the old //lattice, gives the corresponding element in the new lattice. Element oldElement, newElement; int oldConjugate, oldDual; Term oldTerm, newTerm; int [] currentClass; if (keepAuto) theNewLattice = new SelfDualModLattice(count.myInt, inverse); else theNewLattice = new ModLattice(count.myInt, new int[0]); //create elements of new lattice for (int i = 0; i < count.myInt; i++) { oldElement = elements[repSet[i]]; oldTerm = oldElement.myTerm; if (oldTerm.op == 'v' || oldTerm.op == '^') newTerm = new Term(oldTerm.op, lookup2[oldTerm.arg1.myNumber], lookup2[oldTerm.arg2.myNumber]); else newTerm = new Term(oldTerm.op); newElement = new Element(theNewLattice, newTerm); currentClass = myEqRel.classOf(oldElement.myNumber); for (int j = 0; j < currentClass.length; j++) lookup2[currentClass[j]] = newElement; if (keepAuto) { if (oldElement.dual != null) { oldDual = oldElement.dual.myNumber; newElement.dual = lookup2[oldDual]; } for (int j = 0; j < auto; j++) if (oldElement.conjugates[j] != null) { oldConjugate = oldElement.conjugates[j].myNumber; newElement.conjugates[j] = lookup2[oldConjugate]; } } for (int j = 0; j < oldElement.altsUsed; j++) { oldTerm = oldElement.altTerms[j]; if (oldTerm.op == 'v' || oldTerm.op == '^') newTerm = new Term(oldTerm.op, lookup2[oldTerm.arg1.myNumber], lookup2[oldTerm.arg2.myNumber]); else newTerm = new Term(oldTerm.op); newElement.addAlt(newTerm); } } // for (i) //fill table of new lattice for (int i = 0; i < theNewLattice.elementCount; i++) for (int j = 0; j < theNewLattice.elementCount; j++) { oldElement = table[lookup[i]][lookup[j]]; if (oldElement != null) { newElement = lookup2[oldElement.myNumber]; theNewLattice.table[i][j] = newElement; } } return theNewLattice; } //collapse } //class SelfDualModLattice ./TableCompleteException.java010064400125110000346000000001340716250106600173150ustar00dwassermgrad00003010004401class TableCompleteException extends Exception { TableCompleteException() { } }./Term.java010064400125110000346000000027660716250107400136410ustar00dwassermgrad00003010004401import java.util.*; public class Term { final char op; final Element arg1, arg2; Term(char op, Element arg1, Element arg2) { this.op = op; this.arg1 = arg1; this.arg2 = arg2; } Term(char variable) { this.op = variable; this.arg1 = null; this.arg2 = null; } Term(String s, ModLattice l) throws NumberFormatException /* This constructor is intended only for reading a lattice from a file. */ { StringTokenizer st = new StringTokenizer(s); try { if (st.countTokens() == 3) { arg1 = l.elements[Integer.parseInt(st.nextToken())]; op = st.nextToken().charAt(0); arg2 = l.elements[Integer.parseInt(st.nextToken())]; } else { op = st.nextToken().charAt(0); arg1 = null; arg2 = null; } } catch (NullPointerException ex) { throw new NumberFormatException(); } } public boolean equals(Term x) { if (this.op == x.op) if ((this.arg1 == x.arg1 && this.arg2 == x.arg2) || (this.arg1 == x.arg2 && this.arg2 == x.arg1)) return true; else return false; else return false; } public String toString() { if (op == 'v' || op == '^') return (arg1.myNumber + " " + op + " " + arg2.myNumber); else return (op + ""); } } //class Term ./docs.ps010064400125110000346000003141040724107031200133450ustar00dwassermgrad00003010004401%!PS-Adobe-2.0 %%Creator: dvips(k) 5.86d Copyright 1999 Radical Eye Software %%Title: docs.dvi %%Pages: 14 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips docs %DVIPSParameters: dpi=300 %DVIPSSource: TeX output 2001.02.09:1435 %%BeginProcSet: tex.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet TeXDict begin 40258431 52099146 1000 300 300 (docs.dvi) @start %DVIPSBitmapFont: Fa cmti10 10 3 /Fa 3 117 df<383E004CC3004D03804E03809E03809C03801C03801C03803807003807 00380700380E00700E40700E40701C40701C80E00C8060070012127C9117>110 D<00F800030C000E06001C0300180300300300700380700380E00700E00700E00700E00E 00E00E00E01C0060180060300030E0000F800011127C9115>I<03000700070007000E00 0E000E000E00FFE01C001C001C0038003800380038007000700070007000E080E080E100 E100660038000B1A7C990E>116 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fb cmbx10 10 25 /Fb 25 119 df<001FE02000FFF8E003F80FE007C003E00F8001E01F0000E03E0000E03E 0000607E0000607C000060FC000000FC000000FC000000FC000000FC000000FC000000FC 000000FC0000007C0000607E0000603E0000603E0000C01F0000C00F80018007C0030003 F80E0000FFFC00001FE0001B1C7D9B22>67 DII73 D76 DI82 D<07F8201FFEE03C07E07801E07000E0F000E0F00060F00060F80000FE0000FFE0007FFE 003FFF003FFF800FFFC007FFE0007FE00003F00001F00000F0C000F0C000F0C000E0E000 E0F001C0FC03C0EFFF0083FC00141C7D9B1B>I<7FFFFFE07FFFFFE0781F81E0701F80E0 601F8060E01F8070C01F8030C01F8030C01F8030C01F8030001F8000001F8000001F8000 001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000 001F8000001F8000001F8000001F800007FFFE0007FFFE001C1C7E9B21>I<0FF8001C1E 003E0F803E07803E07C01C07C00007C0007FC007E7C01F07C03C07C07C07C0F807C0F807 C0F807C0780BC03E13F80FE1F815127F9117>97 D<03FC000E0E001C1F003C1F00781F00 780E00F80000F80000F80000F80000F80000F800007800007801803C01801C03000E0E00 03F80011127E9115>99 D<000FF0000FF00001F00001F00001F00001F00001F00001F000 01F00001F00001F001F9F00F07F01C03F03C01F07801F07801F0F801F0F801F0F801F0F8 01F0F801F0F801F07801F07801F03C01F01C03F00F0FFE03F9FE171D7E9C1B>I<03FC00 0F07001C03803C01C07801C07801E0F801E0F801E0FFFFE0F80000F80000F80000780000 7800603C00601E00C00F038001FC0013127F9116>I<007F0001E38003C7C00787C00F87 C00F83800F80000F80000F80000F80000F8000FFF800FFF8000F80000F80000F80000F80 000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80007FF0007FF0 00121D809C0F>I<1E003F003F003F003F001E000000000000000000000000007F007F00 1F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFC0FFC00A1E7F9D 0E>105 D108 DII<01FC000F07801C01C03C01E07800F07800F0F800F8 F800F8F800F8F800F8F800F8F800F87800F07800F03C01E01E03C00F078001FC0015127F 9118>I<03F0600F0CE01E07E03C03E07C03E07803E0F803E0F803E0F803E0F803E0F803 E0F803E07803E07C03E03C03E01C07E00E0FE003F3E00003E00003E00003E00003E00003 E00003E0001FFC001FFC161A7E9119>113 DI<1FD830786018E018E018F000FF807FE07FF01FF807FC007CC01CC01C E01CE018F830CFC00E127E9113>I<0300030003000300070007000F000F003FFCFFFC1F 001F001F001F001F001F001F001F001F001F0C1F0C1F0C1F0C0F08079803F00E1A7F9913 >III E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fc cmtt10 10 67 /Fc 67 123 df<30787C3C1C1C1C1C3878F0E040060D789816>39 D<00E001E0038007000E001C001C0038003800700070007000E000E000E000E000E000E0 00E000E000E000700070007000380038001C001C000E000700038001E000E00B217A9C16 >II<387C7E7E3E0E1E1C78F060070B798416>44 D I<70F8F8F8700505788416>I<000180000380000380000700000700000E00000E00001C 00001C0000380000380000700000700000E00000E00001C00001C0000380000380000700 000700000E00000E00001C00001C0000380000380000700000700000E00000E00000C000 0011207E9C16>I<03E0000FF8001FFC001E3C00380E00780F00700700700700E00380E0 0380E00380E00380E00380E00380E00380E00380F00780700700700700780F003C1E001E 3C001FFC000FF80003E00011197E9816>I<0300070007000F001F00FF00FF00E7000700 0700070007000700070007000700070007000700070007000700FFF8FFF8FFF80D197B98 16>I<07E0001FF8003FFC00783E00E00700F00780F00380600380000380000380000700 000700000E00001C0000380000700000E00001C0000380000F00001E03803803807FFF80 FFFF807FFF8011197E9816>I<07E0001FF8003FFC00781E007807003007000007000007 00000E00003E0007FC0007F00007FC00001E00000700000300000380000380600380F003 80E00700781E003FFC001FF80007E00011197E9816>I<3FFE007FFE007FFE0070000070 000070000070000070000070000070000077F0007FFC007FFE00780F0030070000038000 0380600380F00380F00380E00700781E003FFC001FF80007E00011197E9816>53 D<00F80003FC0007FE000F07001C0F00380F00780600700000700000E3F800EFFC00FFFE 00F80F00F00700F00380E00380E003807003807003807007803807003C1E001FFC000FF8 0003E00011197E9816>II<07F0001FFC003FFE007C1F00 F00780E00380E00380E003807007007C1F001FFC0007F0001FFC003C1E00700700F00780 E00380E00380E00380F007807007007C1F003FFE001FFC0007F00011197E9816>I<03E0 000FF8001FFC003C1E00700E00700700E00700E00780E00380E00380E00780700780780F 803FFF801FFB800FE380000700000700300700780E00781C00707C003FF8001FE0000F80 0011197E9816>I<000180000780001F80003E0000F80001F00007C0000F80003E0000FC 0000F00000FC00003E00000F800007C00001F00000F800003E00001F8000078000018011 157E9616>60 DII<00E00001F00001F00001B00001B00003B80003B80003B800031800 071C00071C00071C00071C00071C000E0E000E0E000FFE000FFE001FFF001C07001C0700 1C07007E0FC0FF1FE07E0FC013197F9816>65 D<7FF800FFFE007FFF001C07001C07801C 03801C03801C03801C03801C07001FFF001FFE001FFE001C1F001C03801C03C01C01C01C 01C01C01C01C01C01C03C01C07807FFF80FFFF007FFC0012197F9816>I<01F18007FB80 0FFF801F0F803C0780380380700380700380F00000E00000E00000E00000E00000E00000 E00000E00000F000007003807003803803803C07001F0F000FFE0007FC0001F00011197E 9816>I<7FF800FFFE007FFF001C0F001C07801C03C01C01C01C01C01C01E01C00E01C00 E01C00E01C00E01C00E01C00E01C00E01C00E01C01C01C01C01C03C01C07801C0F807FFF 00FFFE007FF8001319809816>I<7FFFC0FFFFC07FFFC01C01C01C01C01C01C01C01C01C 00001C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00001C00E01C00E01C 00E01C00E01C00E07FFFE0FFFFE07FFFE013197F9816>I<7FFFE0FFFFE07FFFE01C00E0 1C00E01C00E01C00E01C00001C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C00 1C00001C00001C00001C00001C00001C00007F8000FFC0007F800013197F9816>I<7F07 F0FF8FF87F07F01C01C01C01C01C01C01C01C01C01C01C01C01C01C01FFFC01FFFC01FFF C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C07F07F0FF8FF87F07 F01519809816>72 D<7FFCFFFE7FFC038003800380038003800380038003800380038003 80038003800380038003800380038003807FFCFFFE7FFC0F197D9816>I<01FF0003FF80 01FF00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00 001C00001C00001C00001C00001C00601C00F01C00F038007FF8007FF0001FC00011197E 9816>I76 DI<7E07F0FF0FF87F07F01D81 C01D81C01D81C01DC1C01CC1C01CE1C01CE1C01C61C01C71C01C71C01C71C01C31C01C39 C01C39C01C19C01C1DC01C0DC01C0DC01C0DC07F07C0FF87C07F03C01519809816>I<1F FC003FFE007FFF00780F00F00780E00380E00380E00380E00380E00380E00380E00380E0 0380E00380E00380E00380E00380E00380E00380F00780F00780780F007FFF003FFE001F FC0011197E9816>I<7FF800FFFE007FFF001C0F801C03801C03C01C01C01C01C01C01C0 1C03C01C03801C0F801FFF001FFE001FF8001C00001C00001C00001C00001C00001C0000 1C00007F0000FF80007F000012197F9816>I<7FF000FFFC007FFE001C0F001C07801C03 801C03801C03801C03801C07801C0F001FFE001FFC001FFE001C0E001C07001C07001C07 001C07001C07101C07381C07387F03F0FF83F07F01E01519809816>82 D<07E3001FFF003FFF00781F00F00700E00700E00700E00000F000007800003F80001FF0 0007FC0000FE00000F00000700000380000380600380E00380E00700F80F00FFFE00FFFC 00C7F00011197E9816>I<7FFFE0FFFFE0FFFFE0E0E0E0E0E0E0E0E0E0E0E0E000E00000 E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000 E00000E00007FC000FFE0007FC0013197F9816>I<7F07F0FF8FF87F07F01C01C01C01C0 1C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C0 1C01C01C01C00E03800E038007070007FF0003FE0000F8001519809816>II91 D93 D<03000F803FE0FDF8F07840100D067C9816>I<1FE0003FF0007FF800783C00 300E00000E00000E0003FE001FFE003E0E00700E00E00E00E00E00E00E00783E007FFFE0 3FE7E00F83E013127E9116>97 DI<03F80FFC1FFE3C1E780C7000 E000E000E000E000E000F000700778073E0E1FFC0FF803F010127D9116>I<003F00003F 00003F0000070000070000070000070003C7000FF7001FFF003C1F00780F00700700E007 00E00700E00700E00700E00700E00700700F00780F003C1F001FFFE00FF7E007C7E01319 7F9816>I<03F0000FFC001FFE003C0F00780700700380E00380FFFF80FFFF80FFFF80E0 0000E000007003807803803E07801FFF0007FE0001F80011127E9116>I<001E00007F00 01FF8001C7800383000380000380007FFF00FFFF00FFFF00038000038000038000038000 0380000380000380000380000380000380000380000380007FFC00FFFE007FFC0011197F 9816>I<03E3C007F7E00FFFE01C1CC0380E00380E00380E00380E00380E001C1C000FF8 001FF0001BE0003800001800001FFC001FFF003FFF807003C0E000E0E000E0E000E0E000 E07001C07C07C03FFF800FFE0003F800131C7F9116>II<030007 80078003000000000000000000FF80FF80FF800380038003800380038003800380038003 80038003800380FFFCFFFEFFFC0F1A7C9916>I<00300078007800300000000000000000 0FF81FF80FF8003800380038003800380038003800380038003800380038003800380038 00380038003800386070F0F0FFE07FC03F800D237E9916>I<7E0000FE00007E00000E00 000E00000E00000E00000E7FE00E7FE00E7FE00E0F000E1E000E3C000E78000EF0000FF0 000FF8000FBC000F1E000E0E000E07000E07807F87F0FFCFF07F87F01419809816>I<7F C000FFC0007FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001 C00001C00001C00001C00001C00001C00001C00001C00001C00001C0007FFF00FFFF807F FF0011197E9816>III<03E0000FF8001FFC003C1E0078 0F00700700E00380E00380E00380E00380E00380F00780700700780F003C1E001FFC000F F80003E00011127E9116>II<03E3800FF3801FFB 803E0F80780780700780E00380E00380E00380E00380E00380E003807007807807803C1F 801FFB800FF38003E380000380000380000380000380000380000380001FF0003FF8001F F0151B7F9116>I<7F0FC0FF3FE07F7FE007F04007C00007800007800007000007000007 00000700000700000700000700000700007FFC00FFFC007FFC0013127F9116>I<0FEC3F FC7FFCF03CE01CE01C70007F801FF007F8003C600EE00EF00EF81EFFFCFFF8C7E00F127D 9116>I<0300000700000700000700000700007FFF00FFFF00FFFF000700000700000700 0007000007000007000007000007010007038007038007038007870003FE0001FC0000F8 0011177F9616>II<7F1FC0 FF9FE07F1FC01C07001C07000E0E000E0E000E0E00071C00071C00071C00071C0003B800 03B80003B80001F00001F00000E00013127F9116>II<7F1FC07F3FC07F1FC00F1E00073C0003B80003F00001F00000 E00001E00001F00003B800073C00071C000E0E007F1FC0FF3FE07F1FC013127F9116>I< 7F1FC0FF9FE07F1FC01C07000E07000E0E000E0E00070E00071C00071C00039C00039C00 03980001B80001B80000F00000F00000F00000E00000E00000E00001C00079C0007BC000 7F80007F00003C0000131B7F9116>I<3FFFC07FFFC07FFFC0700780700F00701E00003C 0000780001F00003E0000780000F00001E01C03C01C07801C0FFFFC0FFFFC0FFFFC01212 7F9116>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fd cmsy10 10 4 /Fd 4 96 df<000001800000078000001E00000078000001E00000078000000E00000038 000000F0000003C000000F0000003C000000F0000000F00000003C0000000F00000003C0 000000F0000000380000000E0000000780000001E0000000780000001E00000007800000 018000000000000000000000000000000000000000000000000000000000000000007FFF FF00FFFFFF8019247D9920>20 DI<001000003800003800006C00006C00 006C0000C60000C6000183000183000301800301800600C00600C00600C00C00600C0060 18003018003030001830001830001860000C60000CC00006C00002171A7E981C>94 DI E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fe cmmi10 10 11 /Fe 11 122 df<60F0F06004047C830C>58 D<60F0F0701010101020204080040C7C830C >I<0003F800000E0E000038038000E001C001C001C0038000E0070000E00F0000F01E00 00F01C0000F03C0000F03C0000F0780000F0780000F0780000F0F00001E0F00001E0F000 01E0F00003C0F00003C0F0000780F0000780F0000F0070000E0070001C00380038003C00 70001C01C0000707800001FC00001C1E7E9C20>79 D<01E3000717000C0F00180F00380E 00300E00700E00700E00E01C00E01C00E01C00E01C00E03880E03880E038806078803199 001E0E0011127E9116>97 D<3F00070007000E000E000E000E001C001C001C001C0039E0 3A303C1838187018701C701C701CE038E038E038E030E070E060E0C061C023001E000E1D 7E9C12>I<01F0030C0C0C1C1E383C301870007000E000E000E000E000E000E004600860 1030601F800F127E9112>I<0007E00000E00000E00001C00001C00001C00001C0000380 00038000038000038001E7000717000C0F00180F00380E00300E00700E00700E00E01C00 E01C00E01C00E01C00E03880E03880E038806078803199001E0E00131D7E9C16>I<01C0 03C003C001800000000000000000000000001C00270047004700870087000E000E001C00 1C001C003800388038807080710032001C000A1C7E9B0E>105 D<0007000F000F000600 00000000000000000000000078009C010C020C021C041C001C001C003800380038003800 7000700070007000E000E000E000E001C061C0F180F300E6007C001024809B11>I<0787 8008C84010F0C020F1E020E3C040E18000E00000E00001C00001C00001C00001C0006380 80F38080F38100E5810084C60078780013127E9118>120 D<1C00C02701C04701C04701 C08703808703800E03800E03801C07001C07001C07001C0700180E00180E00180E001C1E 000C3C0007DC00001C00001800603800F03000F06000E0C0004180003E0000121A7E9114 >I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Ff cmr10 10 74 /Ff 74 125 df<007E1F0001C1B1800303E3C00703C3C00E03C1800E01C0000E01C0000E 01C0000E01C0000E01C0000E01C000FFFFFC000E01C0000E01C0000E01C0000E01C0000E 01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E 01C0000E01C0000E01C0007F87FC001A1D809C18>11 D<007E0001C1800301800703C00E 03C00E01800E00000E00000E00000E00000E0000FFFFC00E01C00E01C00E01C00E01C00E 01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C07F 87F8151D809C17>I<003F07E00001C09C18000380F018000701F03C000E01E03C000E00 E018000E00E000000E00E000000E00E000000E00E000000E00E00000FFFFFFFC000E00E0 1C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C 000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C00 0E00E01C007FC7FCFF80211D809C23>14 D<6060F0F0F8F8686808080808080810101010 2020404080800D0C7F9C15>34 D<00030180000301800003018000060300000603000006 030000060300000C0600000C0600000C0600000C0600000C060000180C00FFFFFFFCFFFF FFFC0030180000301800003018000030180000603000006030000060300000603000FFFF FFFCFFFFFFFC00C060000180C0000180C0000180C0000180C00003018000030180000301 8000030180000603000006030000060300001E257E9C23>I<60F0F86808080810102040 80050C7C9C0C>39 D<00800100020006000C000C00180018003000300030006000600060 006000E000E000E000E000E000E000E000E000E000E000E000E000600060006000600030 0030003000180018000C000C000600020001000080092A7C9E10>I<8000400020003000 180018000C000C0006000600060003000300030003000380038003800380038003800380 0380038003800380038003000300030003000600060006000C000C001800180030002000 40008000092A7E9E10>I<60F0F0701010101020204080040C7C830C>44 DI<60F0F06004047C830C>I<00010003000600060006000C000C 000C0018001800180030003000300060006000C000C000C0018001800180030003000300 060006000C000C000C00180018001800300030003000600060006000C000C00010297E9E 15>I<03C00C301818300C300C700E60066006E007E007E007E007E007E007E007E007E0 07E007E007E007E00760066006700E300C300C18180C3007E0101D7E9B15>I<01000700 3F00C7000700070007000700070007000700070007000700070007000700070007000700 0700070007000700070007000700FFF80D1C7C9B15>I<07C01830201C400C400EF00FF8 0FF807F8077007000F000E000E001C001C00380070006000C00180030006010C01180110 023FFE7FFEFFFE101C7E9B15>I<07E01830201C201C781E780E781E381E001C001C0018 0030006007C00030001C001C000E000F000F700FF80FF80FF80FF00E401C201C183007C0 101D7E9B15>I<000C00000C00001C00003C00003C00005C0000DC00009C00011C00031C 00021C00041C000C1C00081C00101C00301C00201C00401C00C01C00FFFFC0001C00001C 00001C00001C00001C00001C00001C0001FFC0121C7F9B15>I<300C3FF83FF03FC02000 2000200020002000200023E02C303018301C200E000E000F000F000F600FF00FF00FF00F 800E401E401C2038187007C0101D7E9B15>I<00F0030C04040C0E181E301E300C700070 006000E3E0E430E818F00CF00EE006E007E007E007E007E007600760077006300E300C18 180C3003E0101D7E9B15>I<4000007FFF807FFF007FFF00400200800400800400800800 00100000100000200000600000400000C00000C00001C000018000018000038000038000 038000038000078000078000078000078000078000078000030000111D7E9B15>I<03E0 0C301008200C200660066006700670067C0C3E183FB01FE007F007F818FC307E601E600F C007C003C003C003C00360026004300C1C1007E0101D7E9B15>I<03C00C301818300C70 0C600EE006E006E007E007E007E007E0076007700F300F18170C2707C700060006000E30 0C780C78187018203010C00F80101D7E9B15>I<60F0F0600000000000000000000060F0 F06004127C910C>I<60F0F0600000000000000000000060F0F070101010102020408004 1A7C910C>I61 D<00060000000600000006 0000000F0000000F0000000F000000178000001780000037C0000023C0000023C0000043 E0000041E0000041E0000080F0000080F0000080F000010078000100780001FFF8000200 3C0002003C0002003C0004001E0004001E000C001F000C000F001E001F00FF00FFF01C1D 7F9C1F>65 DI<001F808000E0618001801980070007800E0003 801C0003801C00018038000180780000807800008070000080F0000000F0000000F00000 00F0000000F0000000F0000000F0000000F0000000700000807800008078000080380000 801C0001001C0001000E000200070004000180080000E03000001FC000191E7E9C1E>I< FFFFC0000F00F0000F003C000F000E000F0007000F0007000F0003800F0003C00F0001C0 0F0001C00F0001E00F0001E00F0001E00F0001E00F0001E00F0001E00F0001E00F0001E0 0F0001C00F0001C00F0003C00F0003800F0007800F0007000F000E000F001C000F007000 FFFFC0001B1C7E9B20>III<001F808000E0618001801980070007800E0003801C0003 801C00018038000180780000807800008070000080F0000000F0000000F0000000F00000 00F0000000F0000000F000FFF0F0000F80700007807800078078000780380007801C0007 801C0007800E00078007000B800180118000E06080001F80001C1E7E9C21>III<07FF 80007C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C 00003C00003C00003C00003C00003C00003C00003C00003C00703C00F83C00F83C00F838 0070780040700030E0000F8000111D7F9B15>I77 DI<00 3F800000E0E0000380380007001C000E000E001C0007003C00078038000380780003C078 0003C0700001C0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F0 0001E0700001C0780003C0780003C0380003803C0007801C0007000E000E0007001C0003 80380000E0E000003F80001B1E7E9C20>I I<003F800000E0E0000380380007001C000E000E001C0007003C00078038000380780003 C0780003C0700001C0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F00001 E0F00001E0700001C0780003C0780003C0380003803C0E07801C1107000E208E0007205C 0003A0780000F0E020003FE0200000602000003060000038E000003FC000003FC000001F 8000000F001B257E9C20>II<07E0801C1980300580 300380600180E00180E00080E00080E00080F00000F800007C00007FC0003FF8001FFE00 07FF0000FF80000F800007C00003C00001C08001C08001C08001C0C00180C00180E00300 D00200CC0C0083F800121E7E9C17>I<7FFFFFC0700F01C0600F00C0400F0040400F0040 C00F0020800F0020800F0020800F0020000F0000000F0000000F0000000F0000000F0000 000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000 000F0000000F0000000F0000001F800003FFFC001B1C7F9B1E>IIII<08081010202040 404040808080808080B0B0F8F8787830300D0C7A9C15>92 D<1FC000307000783800781C 00301C00001C00001C0001FC000F1C00381C00701C00601C00E01C40E01C40E01C40603C 40304E801F870012127E9115>97 D I<03F80C0C181E301E700C6000E000E000E000E000E000E00060007002300218040C1803 E00F127F9112>I<001F8000038000038000038000038000038000038000038000038000 038000038003F3800E0B80180780300380700380600380E00380E00380E00380E00380E0 0380E003806003807003803003801807800E1B8003E3F0141D7F9C17>I<07E00C301818 300C700E6006E006FFFEE000E000E000E00060007002300218040C1803E00F127F9112> I<00F8018C071E061E0E0C0E000E000E000E000E000E00FFE00E000E000E000E000E000E 000E000E000E000E000E000E000E000E000E000E007FE00F1D809C0D>I<00038007C4C0 1C78C0383880301800701C00701C00701C00701C003018003838001C700027C000200000 2000003000003FF8001FFF001FFF802003806001C0C000C0C000C0C000C0600180300300 1C0E0007F800121C7F9215>II<18 003C003C0018000000000000000000000000000000FC001C001C001C001C001C001C001C 001C001C001C001C001C001C001C001C001C00FF80091D7F9C0C>I<00C001E001E000C0 000000000000000000000000000007E000E000E000E000E000E000E000E000E000E000E0 00E000E000E000E000E000E000E000E000E000E060E0F0C0F1C061803E000B25839C0D> IIIII<03F0000E1C00 180600300300700380600180E001C0E001C0E001C0E001C0E001C0E001C0600180700380 3003001806000E1C0003F00012127F9115>II<03E0800E 1980180580380780700380700380E00380E00380E00380E00380E00380E0038070038070 03803807801807800E1B8003E38000038000038000038000038000038000038000038000 1FF0141A7F9116>II<1F9020704030C010C010E010F8007F803FE00FF0 00F880388018C018C018E010D0608FC00D127F9110>I<04000400040004000C000C001C 003C00FFE01C001C001C001C001C001C001C001C001C001C101C101C101C101C100C100E 2003C00C1A7F9910>IIIIII<7FFC70 386038407040F040E041C003C0038007000F040E041C043C0C380870087038FFF80E127F 9112>I124 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fg cmbx12 12 28 /Fg 28 121 df<000FF000007FFC0001F80E0003E01F0007C03F000F803F000F803F000F 801E000F800C000F8000000F8000000F8000000F800000FFFFFF00FFFFFF000F801F000F 801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F 801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F007FF0FFE07F F0FFE01B237FA21F>12 D<0003FE0080001FFF818000FF01E38001F8003F8003E0001F80 07C0000F800F800007801F800007803F000003803F000003807F000001807E000001807E 00000180FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 000000FE000000007E000000007E000001807F000001803F000001803F000003801F8000 03000F8000030007C000060003F0000C0001F800380000FF00F000001FFFC0000003FE00 0021227DA128>67 DI73 D78 D<0007FC0000003FFF800000FC07E00003F001F80007E000FC000FC0007E00 1F80003F001F80003F003F00001F803F00001F807F00001FC07E00000FC07E00000FC0FE 00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00 000FE0FE00000FE07E00000FC07F00001FC07F00001FC03F00001F803F80003F801F8000 3F000FC0007E0007E000FC0003F001F80000FC07E000003FFF80000007FC000023227DA1 2A>II<01FE0207FF861F01FE3C007E7C001E78000E78000EF80006F80006FC0006FC0000FF 0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0003FE00007F00003F00 003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE080FF8018227DA1 1F>83 D 85 D<0FFC003FFF807E07C07E03E07E01E07E01F03C01F00001F00001F0003FF003FDF0 1FC1F03F01F07E01F0FC01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F07E03F18167E 951B>97 DI<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC0000FC 0000FC0000FC0000FC0000FC00007C00007E00007E00003E00181F00300FC06007FFC000 FF0015167E9519>I<0001FE000001FE0000003E0000003E0000003E0000003E0000003E 0000003E0000003E0000003E0000003E0000003E0000003E0001FC3E0007FFBE000F81FE 001F007E003E003E007E003E007C003E00FC003E00FC003E00FC003E00FC003E00FC003E 00FC003E00FC003E00FC003E007C003E007C003E003E007E001F00FE000F83BE0007FF3F C001FC3FC01A237EA21F>I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC00F8 FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E00003E00181F00300FC070 03FFC000FF0015167E951A>I<001FC0007FE000F1F001E3F003E3F007C3F007C1E007C0 0007C00007C00007C00007C00007C000FFFE00FFFE0007C00007C00007C00007C00007C0 0007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0 0007C0003FFC003FFC00142380A211>I104 D<1C003E007F007F007F003E001C00 0000000000000000000000000000FF00FF001F001F001F001F001F001F001F001F001F00 1F001F001F001F001F001F001F001F001F00FFE0FFE00B247EA310>I108 DII<00FE0007FFC00F83E01E00F03E00F87C00 7C7C007C7C007CFC007EFC007EFC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00 F81F01F00F83E007FFC000FE0017167E951C>I114 D<0FF3003FFF00781F00600700E0 0300E00300F00300FC00007FE0007FF8003FFE000FFF0001FF00000F80C00780C00380E0 0380E00380F00700FC0E00EFFC00C7F00011167E9516>I<018000018000018000018000 0380000380000780000780000F80003F8000FFFF00FFFF000F80000F80000F80000F8000 0F80000F80000F80000F80000F80000F80000F80000F81800F81800F81800F81800F8180 0F830007C30003FE0000F80011207F9F16>IIIII E %EndDVIPSBitmapFont end %%EndProlog %%BeginSetup %%Feature: *Resolution 300dpi TeXDict begin %%EndSetup %%Page: 1 1 1 0 bop 257 262 a Fg(Ov)n(erview)257 338 y Ff(This)17 b(Ja)o(v)n(a)g(program)e(is)i(designed)h(to)f(do)g(computations)e(with) i(mo)q(dular)e(lattices.)28 b(In)257 388 y(particular,)19 b(it)f(is)g(in)o(tended)h(to)f(\014nd)h(a)f(normal)e(form)h(for)h(a)g (mo)q(dular)e(lattice)j(with)f(a)257 438 y(giv)o(en)c(presen)o(tation)g (b)o(y)g(generators)h(and)f(relations.)j(This)d(is)g(kno)o(wn)f(to)h(b) q(e)g(imp)q(ossible)257 488 y(in)j(man)o(y)f(cases,)j(but)e(ev)o(en)h (in)f(these)i(cases)g(this)e(program)f(ma)o(y)f(b)q(e)j(able)f(to)g (pro)q(duce)257 537 y(useful)d(information.)320 587 y(The)23 b(main)d(data)i(structures)k(of)c(the)h(program)e(are)i(the)g(elemen)o (t)f(list)g(and)h(the)257 637 y(join/meet)15 b(table.)25 b(Elemen)o(ts)16 b(are)h(n)o(um)o(b)q(ered)f(in)g(the)h(order)g(they)g (are)g(created,)h(start-)257 687 y(ing)d(with)f(the)i(n)o(um)o(b)q(er)e (0.)21 b(The)15 b(user)h(m)o(ust)e(create)i(the)g(\014rst)f(few)g (elemen)o(ts)g(to)g(get)g(the)257 737 y(program)10 b(started;)j(for)f (example,)e(to)h(compute)g(the)i(free)f(mo)q(dular)e(lattice)h(on)g (three)i(gen-)257 786 y(erators,)h(the)f(user)g(creates)i(the)e(three)h (generators.)19 b(The)13 b(join)e(meet/table)h(has)h(as)f(man)o(y)257 836 y(ro)o(ws)17 b(and)g(columns)f(as)h(there)h(are)f(elemen)o(ts)g(in) f(the)h(elemen)o(t)g(list.)26 b(In)17 b(p)q(osition)f(\()p Fe(i;)7 b(j)r Ff(\))257 886 y(is)17 b(stored)g(the)g(join)f(of)g (elemen)o(t)g Fe(i)h Ff(and)f(elemen)o(t)g Fe(j)r Ff(,)h(if)f Fe(i)g Fd(\024)h Fe(j)r Ff(,)g(or)f(their)h(meet)f(if)g Fe(i)g Fd(\025)g Fe(j)r Ff(.)257 936 y(The)g(user)h(ma)o(y)d(need)i(to) f(\014ll)g(in)g(some)g(of)g(the)h(squares)h(b)o(y)e(hand)g(to)h (indicate)f(that)h(the)257 986 y(lattice)d(satis\014es)g(relations.)18 b(The)12 b(program)f(\014lls)h(the)h(table,)f(starting)h(at)f(p)q (osition)g(\(0)p Fe(;)7 b Ff(0\),)257 1036 y(follo)o(w)o(ed)12 b(b)o(y)h(\(1)p Fe(;)7 b Ff(0\),)k(\(0)p Fe(;)c Ff(1\),)12 b(\(1)p Fe(;)7 b Ff(1\),)12 b(\(2)p Fe(;)7 b Ff(0\),)12 b(\(2)p Fe(;)7 b Ff(1\),)12 b(\(0)p Fe(;)7 b Ff(2\),)12 b(etc.,)h(alternately)g(adding)f(ro)o(ws)257 1085 y(and)k(columns)f(to) h(the)h(\014lled)e(area.)25 b(F)m(or)15 b(eac)o(h)i(square)g(it)e (visits,)h(it)g(attempts)f(to)h(pro)o(v)o(e)257 1135 y(that)d(the)h(relev)n(an)o(t)f(join)f(or)h(meet)g(is)g(equal)g(to)g (one)g(of)f(the)i(existing)f(elemen)o(ts.)k(If)c(it)g(fails)257 1185 y(to)i(do)g(so,)g(it)g(creates)h(a)f(new)h(elemen)o(t.)21 b(\(The)15 b(computation)f(will)f(sometimes)g(fail)h(ev)o(en)257 1235 y(when)d(the)g(join)e(or)i(meet)e(really)h(is)g(equal)g(to)g(an)g (existing)g(elemen)o(t.)17 b(So)10 b(the)h(ob)r(jects)g(that)g(I)257 1285 y(ha)o(v)o(e)i(b)q(een)h(calling)d(\\elemen)o(ts")h(w)o(ould)g(b)q (e)h(more)f(accurately)i(called)e(\\terms",)g(b)q(ecause)257 1334 y(t)o(w)o(o)h(of)g(them)g(ma)o(y)e(represen)o(t)16 b(the)e(same)e(elemen)o(t)h(of)g(the)h(lattice)f(b)q(eing)g (computed.\))18 b(If)257 1384 y(the)d(table)f(is)f(\014lled,)g(that)h (means)f(that)h(all)f(the)h(elemen)o(ts)g(ha)o(v)o(e)g(b)q(een)h (found.)320 1434 y(One)h(feature)h(of)f(this)g(program)e(is)i(that)g (when)h(\014lling)d(a)i(square,)h(it)e(do)q(es)i(not)f(stop)257 1484 y(computing)e(when)j(it)e(\014nds)h(the)g(answ)o(er.)25 b(In)15 b(the)i(course)g(of)e(these)i(con)o(tin)o(ued)f(compu-)257 1534 y(tations,)e(it)h(sometimes)d(disco)o(v)o(ers)k(that)f(t)o(w)o(o)f (of)g(the)h(elemen)o(ts)f(are)h(in)g(fact)f(equal.)20 b(The)257 1583 y(program)13 b(k)o(eeps)j(trac)o(k)f(of)f(this)h (information)c(using)k(a)f(data)g(structure)j(that)e(represen)o(ts)257 1633 y(an)g(equiv)n(alence)h(relation)f(on)g(the)h(set)g(of)f(elemen)o (ts.)22 b(Whenev)o(er)16 b(the)g(user)g(commands,)257 1683 y(the)21 b(program)d(will)h(discard)h(all)f(but)h(one)g(elemen)o (t)f(of)h(eac)o(h)g(equiv)n(alence)g(class,)i(and)257 1733 y(ren)o(um)o(b)q(er)14 b(the)h(remaining)d(elemen)o(ts.)320 1824 y(So)h(far)g(I)h(ha)o(v)o(e)f(used)i(the)f(w)o(ords)g(\\lattice",) e(\\elemen)o(t",)g(and)i(\\term")e(am)o(biguously)m(.)257 1874 y(Henceforth,)k(when)g(they)f(are)g(capitalized)f(they)i(will)d (denote)j(Ja)o(v)n(a)e(classes,)h(and)g(when)257 1924 y(uncapitalized)f(they)g(will)f(denote)i(mathematical)10 b(ob)r(jects.)257 2040 y Fg(Notes)257 2117 y Ff(1.)31 b(This)18 b(program)f(is)h(not)g(so)g(go)q(o)q(d)g(from)f(a)h(big-)p Fe(O)g Ff(p)q(ersp)q(ectiv)o(e,)j(and)d(10)f(y)o(ears)i(ago)257 2166 y(it)g(w)o(ould)g(probably)g(ha)o(v)o(e)g(run)h(to)q(o)f(slo)o (wly)g(to)g(b)q(e)h(useful,)h(but)e(no)o(w,)h(running)f(on)h(a)257 2216 y(Sun)13 b(w)o(orkstation,)f(it)g(can)g(compute)g(the)h(free)g(mo) q(dular)e(lattice)h(on)h(three)g(generators)h(in)257 2266 y(ab)q(out)g(2)g(seconds,)h(and)e(can)h(pro)q(cess)i(h)o(undreds)f (of)f(elemen)o(ts)f(in)h(a)f(couple)h(min)o(utes.)320 2316 y(2.)38 b(The)21 b(classes)h(describ)q(ed)h(here)f(do)e(not)h (constitute)h(a)e(stand-alone)h(program,)257 2366 y(b)q(ecause)h(none)e (of)g(them)f(has)h(a)f Fc(main\(\))g Ff(metho)q(d.)35 b(The)21 b(user)g(m)o(ust)e(write)h(co)q(de)h(to)257 2416 y(create)c(a)e Fc(ModLattice)p Ff(,)e(\014ll)h(in)h(the)h (information)c(needed)17 b(to)e(b)q(egin)g(the)h(computation,)257 2465 y(and)c(pass)g(the)g Fc(ModLattice)e Ff(to)h(the)i Fc(start\(\))d Ff(metho)q(d)h(in)g(class)h Fc(Driver)p Ff(.)k(I)c(can)g(pro)o(vide)963 2628 y(1)p eop %%Page: 2 2 2 1 bop 257 262 a Ff(examples)15 b(sho)o(wing)g(ho)o(w)g(this)h(is)f (done.)24 b(In)15 b(particular,)h(I)f(ha)o(v)o(e)h(written)g(a)f(class) h Fc(Free)257 311 y Ff(with)d(a)g Fc(main\(\))f Ff(metho)q(d)g(that)i (starts)g(the)f(computation)f(of)g(a)h(free)h(mo)q(dular)e(lattice)h (on)257 361 y(an)o(y)e(n)o(um)o(b)q(er)f(of)h(generators.)18 b(One)12 b(could)f(get)g(b)o(y)g(with)g(just)g(this,)h(b)q(ecause)g (the)g(program)257 411 y(has)k(the)h(abilit)o(y)d(to)i(imp)q(ose)e (relations,)i(and)g(an)o(y)f(mo)q(dular)f(lattice)i(is)f(a)h(quotien)o (t)g(of)f(a)257 461 y(free)g(mo)q(dular)d(lattice.)257 577 y Fg(Data)19 b(Structures)257 654 y Fb(Class)d(Mo)q(dLattice)257 730 y Ff(This)e(class)g(is)g(the)h(core)f(of)g(the)g(program.)j Fc(ModLattice)11 b Ff(has)j(the)h(follo)o(wing)c(\014elds:)320 780 y Fc(protected)20 b(Element)g([])h(elements)p Ff(:)16 b(The)d(list)e(of)h Fc(Element)p Ff(s;)f(allo)o(ws)g(them)h(to)g(b)q(e) 257 830 y(accessed)17 b(b)o(y)c(n)o(um)o(b)q(er.)320 880 y Fc(protected)20 b(Element)g([][])h(table)p Ff(:)c(The)d (join/meet)e(table.)17 b(Note)d(that)g(it)f(stores)257 929 y Fc(Element)p Ff(s,)g(although)g(it)h(could)g(also)g(ha)o(v)o(e)g (b)q(een)h(made)e(to)h(hold)g(their)g(n)o(um)o(b)q(ers.)19 b(Since)257 979 y(eac)o(h)c Fc(Element)d Ff(stores)j(its)f(n)o(um)o(b)q (er,)f(it)g(w)o(orks)h(either)h(w)o(a)o(y)m(.)320 1029 y Fc(protected)20 b(int)h(currentSize)p Ff(:)g(The)16 b(n)o(um)o(b)q(er)g(of)g(ro)o(ws)h(and)f(columns)f(in)h(table.)257 1079 y(It)j(is)f(not)g(really)g(determined)h(b)o(y)f(the)h(n)o(um)o(b)q (er)e(of)h Fc(Element)p Ff(s,)g(b)q(ecause)i(it)e(w)o(ould)g(b)q(e)257 1129 y(ine\016cien)o(t)c(to)g(resize)i(table)d(ev)o(ery)i(time)e(a)h (new)g Fc(Element)e Ff(is)i(created.)20 b Fc(currentSize)12 b Ff(is)257 1179 y(also)i(the)g(length)g(of)f Fc(elements)p Ff(.)320 1228 y Fc(protected)20 b(int)h(elementCount)p Ff(:)j(The)19 b(n)o(um)o(b)q(er)f(of)g Fc(Element)p Ff(s)f(that)i(ha)o (v)o(e)f(b)q(een)257 1278 y(created.)320 1328 y Fc(protected)i(EqRel)g (myEqRel)p Ff(:)d(The)d(equiv)n(alence)g(relation.)320 1378 y Fc(protected)20 b(int)h(currentRow,)e(currentColumn)p Ff(:)e(These)f(store)g(the)f(p)q(osition)f(of)257 1428 y(the)h(next)f(square)h(of)e Fc(table)g Ff(to)h(b)q(e)g(\014lled.)320 1477 y Fc(protected)20 b(int)h(auto)p Ff(:)f(The)c(n)o(um)o(b)q(er)e (of)h(automorphisms)e(used.)23 b(This)15 b(program)257 1527 y(has)f(the)f(capabilit)o(y)f(to)h(use)h(automorphisms)c(in)j(its) g(computations.)k(An)o(y)c(\014nite)g(subset)257 1577 y(of)h(the)g(lattice's)g(automorphism)d(group)j(that)g(is)g(closed)g (under)h(in)o(v)o(erses)g(ma)o(y)d(b)q(e)j(used,)257 1627 y(but)10 b(the)g(iden)o(tit)o(y)e(should)i(not)f(b)q(e)h(used)g(b) q(ecause)h(it)e(do)q(es)h(not)f(help.)16 b(The)10 b(automorphisms)257 1677 y(are)15 b(n)o(um)o(b)q(ered)e(from)f Fc(0)i Ff(to)g Fc(\(auto)21 b(-)g(1\))p Ff(.)320 1726 y Fc(protected)f(int)h([])g (inverse)p Ff(:)d(An)c(arra)o(y)g(of)g(length)h Fc(auto)p Ff(.)j(In)d(the)g Fc(i)p Ff(th)f(p)q(osition)257 1776 y(it)i(holds)f(the)h(n)o(um)o(b)q(er)f(of)g(the)h(in)o(v)o(erse)h(of)e (the)h Fc(i)p Ff(th)f(automorphism.)21 b(This)15 b(arra)o(y)g(m)o(ust) 257 1826 y(b)q(e)i(created)h(b)o(y)e(the)g(user)i(b)q(efore)e (constructing)h(the)g Fc(ModLattice)p Ff(.)23 b(If)16 b(the)g(lattice)g(has)257 1876 y(no)g(non)o(trivial)e(automorphisms,)f (or)i(the)i(user)g(do)q(es)f(not)g(wish)f(to)h(use)g(them,)f(the)h (user)257 1926 y(supplies)f(an)e(arra)o(y)h(of)f(length)h Fc(0)p Ff(.)257 2034 y Fb(Class)i(SelfDualMo)q(dL)o(atti)o(ce)257 2110 y Ff(This)e(class)g(is)g(a)g(sub)q(class)h(of)e Fc(ModLattice)p Ff(.)j(It)e(pro)o(vides)g(the)h(abilit)o(y)d(to)h(use)i (dualit)o(y)e(in)257 2160 y(the)i(computations.)i(It)c(has)i(no)e (extra)i(\014elds.)257 2268 y Fb(Class)h(T)l(erm)257 2345 y Ff(This)e(class)g(has)h(the)f(follo)o(wing)d(\014elds:)320 2394 y Fc(final)20 b(char)h(op)p Ff(:)d(Indicates)c(what)f(t)o(yp)q(e)g (of)g(term)g(this)g(is.)k(If)c Fc(op)g Ff(is)g Fc('v')g Ff(\(lo)o(w)o(ercase)257 2444 y(V\),)k(then)h(the)g(term)f(is)g(a)g (join;)h(if)f(If)g Fc(op)f Ff(is)i Fc('^')e Ff(\(shift-6)h(on)g(most)f (k)o(eyb)q(oards\),)j(then)257 2494 y(the)d(term)f(is)g(a)g(meet.)21 b(If)15 b Fc(op)f Ff(is)h(an)o(y)g(other)h(c)o(haracter,)g(then)g(the)g (term)e(is)h(a)g(generator.)963 2628 y(2)p eop %%Page: 3 3 3 2 bop 257 262 a Ff(\(Do)17 b(not)f(use)i(whitespace)g(c)o(haracters)g (for)f(generators|this)g(will)f(in)o(terfere)h(with)g(the)257 311 y(metho)q(d)g(that)h(reads)h(a)e(lattice)h(from)e(a)i(\014le.\))30 b(In)17 b(the)i(co)q(de,)g(generators)g(are)f(usually)257 361 y(called)e(v)n(ariables.)23 b(The)16 b(c)o(haracters)i Fc('0')d Ff(and)g Fc('1')g Ff(are)h(sp)q(ecial;)h(a)e Fc(Term)g Ff(with)h Fc(op)21 b('0')257 411 y Ff(\(resp.)f Fc('1')p Ff(\))13 b(is)h(assumed)f(to)h(represen)o(t)i(the)f(least)f (\(resp.)19 b(greatest\))c(elemen)o(t.)320 461 y Fc(final)20 b(Element)h(arg1,)f(arg2)p Ff(:)k(These)19 b(are)e(the)h Fc(Elements)e Ff(that)h(this)g Fc(Term)g Ff(is)g(a)257 511 y(join)12 b(or)h(meet)g(of.)k(Note)d(only)e(binary)g Fc(Terms)g Ff(are)i(allo)o(w)o(ed.)i(These)e(\014elds)g(are)f(used)h (only)257 560 y(if)f Fc(op)h Ff(is)g Fc('v')f Ff(or)h Fc('^')p Ff(.)320 652 y(The)e(parameters)f(required)i(to)f(construct)h (a)e Fc(Term)g Ff(are)h(the)g Fc(op)p Ff(,)f(plus)h Fc(arg1)f Ff(and)g Fc(arg2)257 702 y Ff(when)k(relev)n(an)o(t.)257 809 y Fb(Class)h(Elemen)o(t)257 886 y Ff(This)e(class)g(has)h(the)f (follo)o(wing)d(\014elds:)320 936 y Fc(final)20 b(ModLattice)g (myLattice)p Ff(:)15 b(The)d Fc(ModLattice)e Ff(that)i(this)f Fc(Element)f Ff(is)i(in.)17 b(If)257 986 y(one)d(w)o(an)o(ts)g(the)h (same)e Fc(Element)f Ff(in)i(more)f(than)g(one)h Fc(ModLattice)p Ff(,)e(it)h(m)o(ust)g(b)q(e)i(copied.)320 1035 y Fc(Term)21 b(myTerm)p Ff(:)16 b(The)f Fc(Term)e Ff(that)h(this)g Fc(Element)e Ff(w)o(as)i(de\014ned)h(with.)320 1085 y Fc(Term)21 b([])g(altTerms)p Ff(:)c(An)d(arra)o(y)g(that)h(holds)f (other)g Fc(Term)p Ff(s)g(that)g(ha)o(v)o(e)h(b)q(een)g(found)257 1135 y(equal)f(to)g(this)g Fc(Element)p Ff(.)320 1185 y Fc(int)21 b(altsUsed)p Ff(:)e(The)d(n)o(um)o(b)q(er)e(of)h(en)o (tries)h(in)f Fc(altTerms)p Ff(.)21 b(Its)16 b(maxim)n(um)11 b(v)n(alue)k(is)257 1235 y(the)g(constan)o(t)f Fc(ALTS)p Ff(.)320 1285 y Fc(final)20 b(int)i(myNumber)p Ff(:)14 b(Indicates)c(the)g(p)q(osition)e(of)h(this)g Fc(Element)f Ff(in)h(the)h Fc(ModLattice)p Ff('s)257 1334 y(list)k(of)f Fc(Element)p Ff(s.)320 1384 y Fc(final)20 b(int)i(conjCount)p Ff(:)16 b(Num)o(b)q(er)d(of)g(conjugates;)h(equal)g(to)f Fc(myLattice.auto)p Ff(.)320 1434 y Fc(Element)20 b([])h(conjugates)p Ff(:)14 b(Arra)o(y)9 b(of)g(length)g Fc(conjCount)f Ff(that)h(holds)g (this)g Fc(Element)p Ff('s)257 1484 y(conjugates.)320 1534 y Fc(Element)20 b(dual)p Ff(:)30 b(Dual)20 b(of)g(this)g Fc(Element)p Ff(;)i(used)f(only)f(if)g(this)g Fc(Element)f Ff(is)i(in)f(a)257 1583 y Fc(SelfDualModLattice)p Ff(.)320 1675 y(The)d(parameters)h(required)g(to)f(construct)i(an)e Fc(Element)f Ff(are)i(a)f Fc(ModLattice)p Ff(,)f(and)257 1725 y(either)f(a)f Fc(Term)f Ff(or)h(the)g(parameters)g(to)g(mak)o(e)e (a)i Fc(Term)p Ff(.)257 1832 y Fb(Class)i(EqRel)257 1909 y Ff(T)m(o)9 b(understand)h(this)g(class,)g(it)f(helps)g(to)h(kno)o(w)e (that)i(Ja)o(v)n(a)e(do)q(es)i(not)f(ha)o(v)o(e)h(t)o(w)o (o-dimensional)257 1959 y(arra)o(ys)h(lik)o(e)f(those)i(in)e(C)h(or)f (P)o(ascal.)17 b(Instead,)12 b(it)e(has)h(arra)o(ys)g(of)f(arra)o(ys.) 18 b(The)11 b(declaration)361 2042 y Fc(a)22 b(=)f(new)g(int[5][10])257 2125 y Ff(allo)q(cates)e(space)h(for)e(50)h Fc(int)p Ff(s)f(in)h(5)f(ro)o(ws)h(of)f(10,)h(and)g(also)f(allo)q(cates)h(a)f (space)i(for)f(5)257 2175 y(references,)h(whic)o(h)d(is)f(\014lled)g (with)g(the)i(references)h(to)e(these)h(\014v)o(e)e(ro)o(ws.)27 b(But)17 b(then)g(w)o(e)257 2225 y(can)e(mak)o(e)d(an)i(assignmen)o(t)f (lik)o(e)g Fc(a[1])21 b(=)g(new)h(int[20])p Ff(,)12 b(and)i(then)g(the) h(ro)o(ws)f(of)f Fc(a)h Ff(are)257 2274 y(no)g(longer)f(all)g(the)h (same)e(length.)18 b(W)m(e)c(can)f(also)g(assign)h Fc(a[2])21 b(=)g(a[3])p Ff(,)13 b(making)e(t)o(w)o(o)i(of)257 2324 y(the)i(references)i(p)q(oin)o(t)c(to)h(the)g(same)f(space.)320 2374 y Fc(EqRel)f Ff(has)i(the)h(follo)o(wing)c(\014elds:)320 2424 y Fc(int)21 b(size)p Ff(:)15 b(The)c Fc(EqRel)e Ff(represen)o(ts)k(an)d(equiv)n(alence)h(relation)e(on)h(the)h(in)o (tegers)g(from)257 2474 y Fc(0)j Ff(to)g Fc(size)21 b(-)g(1)p Ff(.)963 2628 y(3)p eop %%Page: 4 4 4 3 bop 320 262 a Fc(int)21 b([][])g(classes)p Ff(:)c Fc(classes[i])12 b Ff(holds)i(the)h(in)o(tegers)g(in)f(the)h(equiv)n (alence)f(class)257 311 y(of)g Fc(i)p Ff(.)k(If)c Fc(i)g Ff(and)g Fc(j)g Ff(are)g(in)g(the)h(same)e(class,)h(then)h Fc(classes[i])d Ff(and)i Fc(classes[j])e Ff(p)q(oin)o(t)257 361 y(to)i(the)h(same)e(space,)h(so)g(the)h Fc(EqRel)d Ff(requires)j Fe(O)q Ff(\()p Fc(size)p Ff(\))f(space.)320 452 y(The)e(only)e(parameter)i(required)g(to)f(construct)j(an)d Fc(EqRel)f Ff(is)i(the)g Fc(size)p Ff(.)k(Initially)10 b(the)257 502 y Fc(EqRel)j Ff(holds)h(the)h(diagonal)d(relation;)h (afterw)o(ards)h(the)h(relation)f(can)g(b)q(e)g(made)f(coarser)257 552 y(but)h(not)g(\014ner.)320 602 y(Note)g(that)h(the)g Fc(EqRel)e Ff(only)h(manipulates)e(n)o(um)o(b)q(ers;)i(it)g(nev)o(er)i (sees)g(the)f Fc(Element)p Ff(s)257 652 y(that)j(these)i(n)o(um)o(b)q (ers)d(represen)o(t.)32 b(The)19 b(con)o(v)o(ersion)f(b)q(et)o(w)o(een) h(the)g(n)o(um)o(b)q(ers)e(and)h(the)257 702 y Fc(Element)p Ff(s)13 b(is)h(handled)g(b)o(y)f(the)i Fc(ModLattice)p Ff(.)257 818 y Fg(User)k(In)n(terface)257 894 y Ff(The)f(in)o(terface)f (is)g(text-based)h(and)e(men)o(u-driv)o(en:)23 b(the)18 b(program)d(prin)o(ts)i(out)g(a)f(men)o(u)257 944 y(and)e(asks)g(the)g (user)h(to)e(c)o(ho)q(ose)i(a)e(command)e(from)h(the)i(men)o(u)f(b)o(y) g(t)o(yping)g(in)g(a)h(n)o(um)o(b)q(er.)257 994 y(Before)k(eac)o(h)g (prin)o(ting)f(of)f(the)i(men)o(u,)e(the)i(follo)o(wing)d(information)f (is)j(displa)o(y)o(ed:)24 b(the)257 1044 y(n)o(um)o(b)q(er)17 b(of)f Fc(Element)p Ff(s)g(in)h(the)h(activ)o(e)f Fc(ModLattice)p Ff(,)e(the)j(ro)o(w)f(and)g(column)f(n)o(um)o(b)q(ers)257 1094 y(of)f(the)h(next)f(square)h(to)f(b)q(e)h(\014lled,)f(the)h(size)g (of)e(the)i Fc(ModLattice)p Ff(,)d(and)i(the)h(n)o(um)o(b)q(er)e(of)257 1143 y(equiv)n(alence)g(classes.)20 b(\(Only)14 b(one)g Fc(ModLattice)d Ff(is)j(activ)o(e)g(at)g(a)f(time.\))320 1235 y(Men)o(u)h(options:)320 1326 y(1.)j(Generate)e(new)g(elemen)o (ts.)320 1376 y(User)10 b(will)e(b)q(e)i(prompted)f(for)g(a)g(n)o(um)o (b)q(er,)g(whic)o(h)g(should)g(b)q(e)h(greater)h(than)e(the)h(curren)o (t)257 1426 y(n)o(um)o(b)q(er)16 b(of)g Fc(Element)p Ff(s,)f(but)i(not)f(greater)h(than)g(the)g(curren)o(t)g(size)h(\(it)e (do)q(es)h(not)f(resize)257 1476 y(automatically)m(,)9 b(b)q(ecause)14 b(the)e(user)h(ma)o(y)d(wish)i(to)g(rep)q(eatedly)i (generate)f(small)d(n)o(um)o(b)q(ers)257 1525 y(of)k(new)g Fc(Element)p Ff(s,)f(but)h(it)g(is)f(ine\016cien)o(t)i(to)e(rep)q (eatedly)j(resize)f(b)o(y)f(small)e(incremen)o(ts\).)257 1575 y(The)j(program)e(will)g(\014ll)g(squares)j(in)e(the)h Fc(table)e Ff(un)o(til)h(either)h(the)g Fc(table)e Ff(is)h(full)f (\(whic)o(h)257 1625 y(generates)20 b(a)d(sp)q(ecial)h(announcemen)o (t\))g(or)f(the)i(requested)h(n)o(um)o(b)q(er)d(of)g Fc(Element)p Ff(s)f(has)257 1675 y(b)q(een)f(reac)o(hed.)320 1725 y(2.)i(Compute)c(congruence.)320 1774 y(If)c(the)g Fc(ModLattice)p Ff('s)e(equiv)n(alence)j(relation)f(records)h(that)g (certain)g(pairs)f(of)g Fc(Element)p Ff(s)257 1824 y(are)15 b(kno)o(wn)f(to)h(b)q(e)g(equal,)f(this)g(command)e(attempts)i(to)h (deriv)o(e)g(other)g(equalities)f(from)257 1874 y(these.)23 b(It)14 b(is)h(not)g(exhaustiv)o(e,)g(and)f(using)h(it)f(t)o(wice)h(in) g(a)f(ro)o(w)h(ma)o(y)e(pro)q(duce)j(equalities)257 1924 y(that)g(w)o(ere)g(not)f(pro)q(duced)i(the)f(\014rst)g(time.)21 b(The)16 b(w)o(ord)f(\\congruence")i(is)e(used)h(lo)q(osely)257 1974 y(here,)f(as)g(in)f(general)g(this)h(calculation)e(is)h(not)g (applied)g(to)g(the)h(set)g(of)f(all)f(elemen)o(ts)h(of)g(a)257 2023 y(lattice,)e(but)f(rather)h(to)f(a)g(set)h(of)f Fc(Terms)f Ff(represen)o(ting)j(\(p)q(erhaps)g(redundan)o(tly\))e(a)g (subset)257 2073 y(of)j(its)g(elemen)o(ts.)320 2123 y(3.)j(Imp)q(ose)d (a)f(relation.)320 2173 y(This)e(command)e(allo)o(ws)h(the)j(user)f(to) g(force)g(t)o(w)o(o)f Fc(Element)p Ff(s)g(to)g(b)q(e)h(considered)h (equal.)257 2223 y(The)i(user)g(will)d(b)q(e)j(prompted)e(for)g(the)i (n)o(um)o(b)q(ers)e(of)h(the)g(t)o(w)o(o)g Fc(Element)p Ff(s.)320 2273 y(4.)j(F)m(orm)12 b(quotien)o(t)i(lattice.)320 2322 y(This)9 b(command)d(causes)11 b(the)f(activ)o(e)f Fc(ModLattice)e Ff(to)i(b)q(e)h(replaced)h(b)o(y)e(a)g(new)g Fc(ModLattice)p Ff(,)257 2372 y(whic)o(h)14 b(is)f(formed)f(b)o(y)h (discarding)g(all)f(but)i(one)g Fc(Element)d Ff(from)h(eac)o(h)i(equiv) n(alence)f(class,)257 2422 y(and)h(ren)o(um)o(b)q(ering)g(those)h(that) f(remain.)k(\\Quotien)o(t")c(is)g(used)h(lo)q(osely)m(.)j(If)13 b(command)f(3)257 2472 y(has)k(not)g(b)q(een)h(used,)f(then)h(the)f (new)g Fc(ModLattice)e Ff(represen)o(ts)k(the)f(same)e(lattice)g(that) 963 2628 y(4)p eop %%Page: 5 5 5 4 bop 257 262 a Ff(the)20 b(old)f Fc(ModLattice)e Ff(represen)o(ted,) 23 b(but)d(if)e(command)f(3)i(has)g(b)q(een)i(used,)g(the)f(new)257 311 y(lattice)14 b(is)g(a)g(homom)o(orphic)d(image)h(of)h(the)i(old)e (one.)320 361 y(The)j(program)f(k)o(eeps)i(trac)o(k)g(of)f(whether)h (or)f(not)h(command)c(3)j(has)g(b)q(een)i(used.)26 b(If)257 411 y(it)15 b(has,)h(then)g(in)f(forming)d(the)k(new)g Fc(ModLattice)p Ff(,)d(all)h(information)f(ab)q(out)i(conjugates)257 461 y(and)e(dualit)o(y)e(is)i(discarded,)g(b)q(ecause)i(these)f (features)g(are)f(not)g(necessarily)g(inherited)h(b)o(y)257 511 y(the)h(quotien)o(t)f(lattice.)320 560 y(5.)j(Resize.)320 610 y(The)d(user)h(is)f(prompted)f(for)g(a)h(new)g(size,)g(and)g(the)h Fc(ModLattice)p Ff('s)c(join/meet)i(table)257 660 y(and)19 b Fc(Element)f Ff(list)g(are)i(expanded)f(to)g(the)h(new)f(size.)35 b(Rep)q(eated)20 b(resizing)f(b)o(y)g(small)257 710 y(incremen)o(ts)e (is)g(ine\016cien)o(t,)g(so)g(I)g(recommend)f(that)h(y)o(ou)f(alw)o(a)o (ys)g(resize)i(b)o(y)f(at)g(least)g(a)257 760 y(factor)d(of)g(1)p Fe(:)p Ff(5)e(unless)j(this)f(w)o(ould)f(exceed)j(memory)11 b(limitations.)320 809 y(6.)17 b(Examine)c(a)g(square)i(in)e(the)i (table.)320 859 y(The)10 b(user)g(is)f(prompted)g(for)g(a)g(ro)o(w)h(n) o(um)o(b)q(er)e(and)i(column)e(n)o(um)o(b)q(er,)h(and)g(the)h(program) 257 909 y(displa)o(ys)k(the)g(n)o(um)o(b)q(er)f(of)h(the)g Fc(Element)e Ff(in)i(this)g(square)g(of)g(the)g(join/meet)f(table.)320 959 y(7.)k(Examine)c(a)g(ro)o(w)h(in)f(the)i(join)e(table)h(or)f(meet)h (table.)320 1009 y(The)i(user)i(is)e(prompted)g(to)g(en)o(ter)i(1)e (for)g(joins)g(or)g(2)g(for)g(meets,)h(and)f(to)g(en)o(ter)i(the)257 1059 y(n)o(um)o(b)q(er)d(of)f(an)g Fc(Element)g Ff(to)h(form)e(joins)h (or)h(meets)g(with.)20 b(The)c(form)d(of)h(the)i(output)f(is)257 1108 y(the)g(same)e(as)h(when)g(the)h(whole)e(table)h(is)g(prin)o(ted;) g(see)h(#9)e(b)q(elo)o(w.)320 1158 y(8.)k(Examine)c(an)g(elemen)o(t.) 320 1208 y(The)f(user)i(is)e(prompted)g(for)g(the)h(n)o(um)o(b)q(er)f (of)f(the)i Fc(Element)p Ff(.)j(The)d(program)e(displa)o(ys)257 1258 y(the)i Fc(Element)p Ff('s)e(de\014ning)h Fc(Term)g Ff(in)g(b)q(oth)g(short)h(and)f(long)g(form.)j(F)m(or)d(a)g(generator,) h(b)q(oth)257 1308 y(forms)k(are)g(just)h(the)g(generator)h(itself.)28 b(F)m(or)18 b(a)f(join)f(or)i(meet,)f(the)i(short)f(form)d(is)j(the)257 1357 y(n)o(um)o(b)q(ers)d(of)e(the)i(t)o(w)o(o)f(argumen)o(ts,)g(with)g (the)h(appropriate)g(sym)o(b)q(ol)d(in)i(b)q(et)o(w)o(een,)i(while)257 1407 y(in)h(the)g(long)e(form)g(these)j(n)o(um)o(b)q(ers)f(are)g (replaced)g(b)o(y)g(the)g(long)e(form)g(of)h(the)i(de\014ning)257 1457 y Fc(Term)p Ff(s)c(of)f(the)i(argumen)o(ts,)d(yielding)h(an)h (expression)h(in)o(v)o(olving)c(only)i(generators.)320 1507 y(The)d(program)e(also)i(displa)o(ys)f(the)i Fc(Element)p Ff('s)d(equiv)n(alence)j(class,)f(the)h(short)f(forms)f(of)257 1557 y(its)h(alternate)f Fc(Term)p Ff(s,)h(the)g(n)o(um)o(b)q(ers)e(of) h(its)g(conjugates,)i(and,)e(if)g(it)f(is)i(in)e(a)h Fc(SelfDualModLattice)p Ff(,)257 1606 y(the)15 b(n)o(um)o(b)q(er)e(of)g (its)h(dual.)k(An)o(y)13 b(unkno)o(wn)h(information)d(is)j(giv)o(en)f (as)h(\\)p Fc(n/a)p Ff(".)320 1656 y(9.)j(Output)e(information)c(to)j (a)f(\014le.)320 1706 y(This)i(command)d(is)j(for)g(prin)o(ting)f (information)e(that)k(is)e(lik)o(ely)g(to)h(b)q(e)h(to)q(o)f(big)f(to)h (\014t)257 1756 y(on)g(the)h(screen.)24 b(It)15 b(prin)o(ts)h(a)f (submen)o(u,)f(and)h(prompts)f(the)i(user)h(for)d(a)h(n)o(um)o(b)q(er)g (and)g(a)257 1806 y(\014lename.)i(If)d(the)g(\014le)g(already)f (exists,)i(the)f(output)g(will)e(b)q(e)j(app)q(ended)g(to)e(it.)18 b(Option)c(1)257 1856 y(in)g(the)h(submen)o(u)f(prin)o(ts)h(the)g Fc(Element)d Ff(list.)19 b(F)m(or)14 b(eac)o(h)h Fc(Element)p Ff(,)e(the)h(program)f(prin)o(ts)257 1905 y(its)f(n)o(um)o(b)q(er)f (and)g(b)q(oth)h(the)g(short)g(and)f(long)g(forms)f(of)h(its)g (de\014ning)h Fc(Term)p Ff(.)k(Options)c(2,)f(3,)257 1955 y(and)h(4)g(prin)o(t)g(the)h(join)e(table,)h(meet)g(table,)f(and)h (join/meet)f(table,)h(resp)q(ectiv)o(ely)m(.)18 b(\(There)257 2005 y(is)e(no)f(join)f(table)h(or)h(meet)f(table)g(stored)h(in)f (memory;)e(this)j(information)c(is)j(read)h(from)257 2055 y(the)c(join/meet)e(table.\))17 b(Eac)o(h)12 b(ro)o(w)f(of)g(the)h (table)g(is)f(a)g(line)g(of)g(text,)h(and)f(for)g(eac)o(h)h(square,)257 2105 y(the)k(n)o(um)o(b)q(er)e(of)h(the)h Fc(Element)d Ff(in)i(that)g(square)h(is)f(prin)o(ted,)g(or)g(\\)p Fc(n/a)p Ff(")f(if)g(the)i(square)g(is)257 2154 y(empt)o(y)m(.)k(A)o(t) 15 b(the)g(b)q(eginning)g(of)f(eac)o(h)h(ro)o(w)g(the)g(ro)o(w)g(n)o (um)o(b)q(er)f(is)h(giv)o(en,)f(separated)i(from)257 2204 y(the)k(ro)o(w)e(b)o(y)h(a)f(colon.)32 b(Option)19 b(5)f(prin)o(ts)h(the)g(equiv)n(alence)g(relation.)32 b(Eac)o(h)19 b(class)h(is)257 2254 y(prin)o(ted)d(once,)g(on)g(one)f (line)g(of)g(text.)26 b(Option)16 b(6)g(allo)o(ws)g(the)h(user)g(to)f (sa)o(v)o(e)h(to)f(a)g(\014le)h(a)257 2304 y(comp)q(ete)g(description)h (of)e(the)i(activ)o(e)f Fc(ModLattice)p Ff(.)26 b(The)17 b Fc(ModLattice)e Ff(can)i(then)h(b)q(e)257 2354 y(reconstructed)f (from)12 b(the)j(\014le)f(with)g(command)d(13.)18 b(The)c(output)g(of)f (this)h(option)g(is)g(not)257 2403 y(in)o(tended)h(to)f(b)q(e)g(read)g (b)o(y)g(h)o(umans.)320 2453 y(10.)j(Change)d(settings.)963 2628 y(5)p eop %%Page: 6 6 6 5 bop 320 262 a Ff(This)13 b(command)d(allo)o(ws)i(the)i(user)g(to)f (c)o(hange)g(the)h(sym)o(b)q(olic)d(constan)o(ts)j(that)f(deter-)257 311 y(mine)f(ho)o(w)g(m)o(uc)o(h)f(w)o(ork)i(is)f(done)h(in)f(the)i (computations.)i(It)d(displa)o(ys)f(the)h(curren)o(t)h(v)n(alue)257 361 y(of)f(the)h(settings,)g(displa)o(ys)e(a)h(submen)o(u,)g(and)g (prompts)f(the)i(user)h(for)d(a)h(n)o(um)o(b)q(er.)18 b Fc(DEPTH)257 411 y Ff(is)e(the)g(depth)h(of)e(the)h(recursion)h(that) f(the)g(program)e(uses)j(when)f(computing)e(a)i(square)257 461 y(in)i(the)g(table.)29 b Fc(DEPTH2)16 b Ff(is)i(used)g(in)g(place)f (of)g Fc(DEPTH)g Ff(when)h(the)g(v)n(alue)f(of)g(the)i(square)257 511 y(is)d(already)e(kno)o(wn.)22 b(Both)16 b(are)g(initially)c(set)17 b(to)e(5.)22 b(Increasing)15 b Fc(DEPTH)g Ff(or)g Fc(DEPTH2)f Ff(will)257 560 y(exp)q(onen)o(tially)f(increase)h(the)g(amoun)o(t)d (of)h(time)g(it)h(tak)o(es)g(to)g(\014ll)f(a)h(square,)g(and)g(the)h (base)257 610 y(of)e(the)i(exp)q(onen)o(t)f(dep)q(ends)i(on)d Fc(ALTS)p Ff(,)g(whic)o(h)g(is)h(the)g(maxim)n(um)c(n)o(um)o(b)q(er)j (of)g(alternativ)o(e)257 660 y Fc(Term)p Ff(s)h(an)f Fc(Element)f Ff(can)i(store.)19 b Fc(ALTS)12 b Ff(is)g(initially)f(set) i(to)g(6.)k Fc(M)c Ff(and)f Fc(N)h Ff(are)g(used)h(in)e(com-)257 710 y(puting)k(congruences)i(\(see)g(the)f(description)g(of)e(the)i Fc(computeCongruence\()o(\))c Ff(metho)q(d)257 760 y(b)q(elo)o(w.\))18 b Fc(M)c Ff(is)g(initially)d(set)k(to)f(100,)e(and)i Fc(N)g Ff(to)f(10.)320 809 y(11.)k(P)o(erform)c(exhaustiv)o(e)h(c)o (hec)o(k.)320 859 y(This)9 b(command)e(pro)o(vides)j(more)f(to)q(ols)g (for)g(sho)o(wing)g(that)h Fc(Element)p Ff(s)f(are)h(equal.)16 b(The)257 909 y(submen)o(u)c(options)g(are)h(1.)k(Chec)o(k)c(join)e (asso)q(ciativit)o(y)m(,)g(2.)17 b(Chec)o(k)c(meet)e(asso)q(ciativit)o (y)m(,)g(3.)257 959 y(Chec)o(k)k(join/meet)e(compatibilit)o(y)l(,)e (and)j(4.)k(Chec)o(k)d(mo)q(dularit)o(y)m(.)h(\(There)g(is)e(no)f(need) j(to)257 1009 y(c)o(hec)o(k)d(symmetry)m(,)c(b)q(ecause)k(this)f(is)g (guaran)o(teed)g(b)o(y)f(the)h(w)o(a)o(y)f(joins)g(and)g(meets)h(are)g (read)257 1059 y(from)h(the)i(table.)k(So)c(a)f Fc(ModLattice)e Ff(with)i(a)g(full)f(table)i(that)f(passes)i(all)d(these)j(tests)g(is) 257 1108 y(a)f(b)q(ona)g(\014de)h(mo)q(dular)d(lattice.\))23 b(In)15 b(options)g(1)g(and)g(2,)f(for)h(ev)o(ery)h(triple)f(of)g Fc(Element)p Ff(s,)257 1158 y(the)i(program)d(computes)i(b)q(oth)g (sides)h(of)f(the)g(iden)o(tit)o(y)m(,)f(and)h(if)f(b)q(oth)i(sides)f (are)h(kno)o(wn)257 1208 y(and)d(unequal,)g(it)f(records)j(in)e(the)g (equiv)n(alence)h(relation)e(that)h(they)h(are)f(equal.)19 b(Option)257 1258 y(4)e(similarly)e(examines)h(all)g(triples)i(that)f (satisfy)g(the)h(appropriate)f(inequalit)o(y)m(.)27 b(\(Note)257 1308 y(the)17 b(program)d(do)q(es)j(not)f(store)h(the)g(lattice's)f (order)g(relation;)g(it)g(kno)o(ws)g Fe(a)f Fd(\024)g Fe(b)h Ff(only)f(if)257 1357 y(either)f Fc(a)22 b(v)f(b)13 b Ff(has)g(b)q(een)h(found)e(to)h(b)q(e)g Fc(b)p Ff(,)g(or)g Fc(a)21 b(^)h(b)12 b Ff(has)h(b)q(een)h(found)f(to)g(b)q(e)g Fc(a)p Ff(.\))18 b(Option)257 1407 y(3)c(c)o(hec)o(ks)h(that)e Fe(a)c Fd(_)f Fe(b)k Ff(=)g Fe(b)h Ff(if)g(and)g(only)g(if)g Fe(a)c Fd(^)f Fe(b)j Ff(=)h Fe(a)p Ff(;)h(if)g(one)h(of)f(these)i(is)f (found)f(true)h(but)257 1457 y(the)i(other)f(is)g(not,)f(the)h(other)h (is)e(made)g(true)h(either)h(b)o(y)e(\014lling)g(in)g(an)g(empt)o(y)g (square)h(or)257 1507 y(b)o(y)f(recording)g(the)h(equalit)o(y)e(of)g(t) o(w)o(o)h Fc(Element)p Ff(s.)320 1557 y(Options)g(1)f(and)h(2)g(are)g (v)o(ery)g(time-consuming,)d(but)j(3)f(and)h(4)g(run)g(quic)o(kly)m(.) 320 1606 y(12.)j(Use)e(other)f(metho)q(d.)320 1656 y(This)g(command)e (allo)o(ws)h(the)j(use)f(of)f(co)q(de)i(written)f(b)o(y)f(the)h(user,)h (without)e(altering)257 1706 y(the)i(program's)e(co)q(de.)22 b(\(F)m(or)15 b(example,)f(the)h(user)i(migh)o(t)c(write)i(a)g(metho)q (d)f(to)h(\014nd)h(and)257 1756 y(correct)e(all)d(failures)g(of)g(a)h (certain)g(iden)o(tit)o(y)m(.\))17 b(The)12 b(user)h(is)f(prompted)f (for)g(the)i(name)e(of)g(a)257 1806 y(class)j(and)e(the)h(name)f(of)g (a)g(metho)q(d)g(in)h(that)f(class,)h(and)g(then)g(the)h(metho)q(d)d (is)i(executed,)257 1856 y(with)d(the)h(activ)o(e)f Fc(ModLattice)d Ff(as)k(its)f(argumen)o(t.)15 b(The)c(metho)q(d)e(m)o(ust)g(b)q(e)h (static,)h(it)e(m)o(ust)257 1905 y(ha)o(v)o(e)h(exactly)h(one)f (parameter,)h(and)f(the)h(t)o(yp)q(e)f(of)g(this)g(parameter)g(m)o(ust) g(b)q(e)h Fc(ModLattice)257 1955 y Ff(\()p Fa(not)17 b Ff(a)12 b(sub)q(class)h(of)f Fc(ModLattice)p Ff(\).)j(The)e(return)g (t)o(yp)q(e)g(m)o(ust)e(b)q(e)i(either)g Fc(ModLattice)d Ff(or)257 2005 y(v)o(oid.)23 b(If)16 b(the)g(metho)q(d)f(returns)j(a)d Fc(ModLattice)p Ff(,)f(the)i(activ)o(e)g Fc(ModLattice)e Ff(is)h(replaced)257 2055 y(b)o(y)f(the)h(returned)g(one.)320 2105 y(13.)i(Read)d(lattice)g(from)e(\014le.)320 2154 y(The)k(user)h(is)f(prompted)g(for)f(the)i(name)e(of)g(a)h(\014le,)g (whic)o(h)g(should)g(con)o(tain)g(the)h(un-)257 2204 y(mo)q(di\014ed)12 b(output)i(of)f(command)d(9)j(option)g(6)g(\(see)i (ab)q(o)o(v)o(e\).)i(The)d(activ)o(e)f Fc(ModLattice)f Ff(is)257 2254 y(replaced)j(with)f(one)g(constructed)i(from)c(the)j (\014le.)320 2304 y(0.)i(Quit.)320 2354 y(Quits.)963 2628 y(6)p eop %%Page: 7 7 7 6 bop 257 262 a Fg(Classes)19 b(and)g(metho)r(ds)257 338 y Fb(Class)d(Driv)o(er)257 415 y Ff(This)g(class)g(is)g(a)f(men)o (u-driv)o(en)g(user)i(in)o(terface)f(that)g(allo)o(ws)f(the)h(user)h (to)e(examine)g(the)257 465 y(activ)o(e)h Fc(ModLattice)p Ff(,)e(and)h(call)g(its)h(essen)o(tial)g(metho)q(ds.)23 b(Class)16 b Fc(Driver)e Ff(is)i(not)g(mean)o(t)257 514 y(to)e(b)q(e)h(instan)o(tiated;)e(all)f(of)i(its)g(mem)o(b)q(ers)e(are) j(static.)320 606 y(Fields:)320 656 y Fc(static)20 b(ModLattice)g (myLattice)p Ff(:)c(The)e(activ)o(e)g Fc(ModLattice)p Ff(.)320 705 y Fc(static)20 b(boolean)h(keepAuto)p Ff(:)g(Changes)d (from)c Fc(true)i Ff(to)h Fc(false)e Ff(if)h(the)h(user)h(uses)257 755 y(command)11 b(3.)320 846 y(Metho)q(ds:)320 896 y Fc(public)20 b(static)h(void)g(start\(ModLattice)o(\))p Ff(:)16 b(A)e Fc(ModLattice)e Ff(m)o(ust)h(b)q(e)h(passed)257 946 y(to)d(this)g(metho)q(d)f(to)g(get)i(the)f(program)e(started.)18 b(It)11 b(is)g(an)f(in\014nite)h(lo)q(op)f(\(it)g(runs)i(un)o(til)e (the)257 996 y Fc(System.exit\(\))i Ff(command)g(is)j(reac)o(hed)h (when)f(the)g(user)h(selects)h(command)12 b(0\).)20 b(Eac)o(h)257 1046 y(pass)c(through)f(the)g(lo)q(op)f(calls)h Fc(printMenu\(\))d Ff(to)j(prin)o(t)f(the)i(men)o(u,)e Fc(getLine\(\))e Ff(to)j(get)257 1096 y(the)g(user's)g(c)o(hoice,)f(and)f Fc(actOn\(\))p Ff(,)f(explained)i(b)q(elo)o(w.)320 1145 y Fc(private)20 b(static)h(String)f(getLine\(String\))p Ff(:)14 b(I)f(got)g(this)g(metho)q(d)f(from)f(one)i(of)257 1195 y(m)o(y)e(CS)i(instructors.)19 b(It)12 b(displa)o(ys)g(its)h (argumen)o(t)e(as)i(a)f(prompt,)f(and)h(returns)i(the)f(user's)257 1245 y(resp)q(onse.)320 1295 y Fc(private)20 b(static)h(void)f (actOn\(String\))p Ff(:)f(This)c(program)f(con)o(v)o(erts)j(its)e (param-)257 1345 y(eter)22 b(in)o(to)f(a)f(n)o(um)o(b)q(er,)i(and)e (executes)j(the)f(command)c(corresp)q(onding)k(to)f(the)g(n)o(um-)257 1394 y(b)q(er,)16 b(after)f(prompting)d(the)k(user)f(for)g(an)o(y)f (further)h(input)g(needed,)h(and)e(error-c)o(hec)o(king)257 1444 y(this)i(input.)23 b(An)o(y)16 b(exceptions)h(resulting)f(from)e (bad)h(input)h(are)g(caugh)o(t,)g(triggering)f(an)257 1494 y Fc(InvalidCommandExcep)o(tion)10 b Ff(that)k(transfers)i(con)o (trol)d(bac)o(k)h(to)g Fc(start\(\))p Ff(.)320 1544 y Fc(public)20 b(static)h(void)g(printSubMenu1\(\))320 1594 y(public)f(static)h(void)g(actOnSub1\(String)o(\))320 1643 y(public)f(static)h(void)g(printSubMenu2\(\))320 1693 y(public)f(static)h(void)g(actOnSub2\(String)o(\))320 1743 y(public)f(static)h(void)g(printSubMenu3\(\))320 1793 y(public)f(static)h(void)g(actOnSub3\(String)o(\))p Ff(:)14 b(These)e(metho)q(ds)e(handle)h(the)g(sub-)257 1843 y(men)o(us)j(generated)h(in)e(commands)f(9,)h(10,)g(and)g(11.)320 1893 y Fc(public)20 b(static)h(void)g(outputAll\(PrintS)o(tream)o(\))p Ff(:)14 b(This)f(is)f(the)h(co)q(de)g(for)f(com-)257 1942 y(mand)h(9)g(option)g(6.)320 1992 y Fc(public)20 b(static)h(void)g(inputAll\(Buffere)o(dRead)o(er\))p Ff(:)31 b(This)22 b(is)g(the)h(co)q(de)g(for)257 2042 y(command)11 b(13.)320 2092 y Fc(public)20 b(static)h(String)f (elementNumber\(Eleme)o(nt\))p Ff(:)12 b(Represen)o(ts)g(an)d Fc(Element)257 2142 y Ff(in)14 b(a)f(form)g(that)g(can)i(b)q(e)f (displa)o(y)o(ed.)320 2191 y Fc(public)20 b(static)h(String)f (elementNumber2\(Elem)o(ent\))p Ff(:)257 2241 y(A)14 b(v)n(arian)o(t)f(for)h(making)d(a)j(mac)o(hine-readable)e(form,)g (used)j(in)e Fc(outputAll\(\))p Ff(.)320 2291 y Fc(public)20 b(static)h(Element)f(numberElement\(Stri)o(ng\))p Ff(:)257 2341 y(The)15 b(in)o(v)o(erse)f(of)g Fc(elementNumber2)p Ff(,)c(used)15 b(in)e Fc(inputAll\(\))p Ff(.)963 2628 y(7)p eop %%Page: 8 8 8 7 bop 257 262 a Fb(Class)16 b(Elemen)o(t)257 338 y Ff(See)f(Data)e(Structures)j(ab)q(o)o(v)o(e)e(for)g(the)g(description)h (of)e(the)h(\014elds)h(and)e(constructors.)320 429 y(Metho)q(ds:)320 479 y Fc(public)20 b(String)h(toString\(\))p Ff(:)15 b(Pro)q(duces)f(the)e(short)h(form)d(of)i(the)h(de\014ning)f Fc(Term)p Ff(.)320 529 y Fc(public)20 b(String)h(fullName\(\))p Ff(:)16 b(Pro)q(duces)g(the)f(long)f(form)e(of)i(the)h(de\014ning)f Fc(Term)p Ff(.)257 579 y(It)h(is)f(recursiv)o(e;)i(if)d(the)i Fc(Element)e Ff(is)h(a)h(join)e(or)h(a)g(meet,)g(it)g(puts)h(the)g(op)q (eration)f(sym)o(b)q(ol)257 629 y(b)q(et)o(w)o(een)i(the)e Fc(fullName\(\))p Ff(s)e(of)i(the)g(argumen)o(ts,)f(adding)g(paren)o (theses)j(if)d(necessary)m(.)320 679 y Fc(public)20 b(void)h (addAlt\(char,)e(Element,)i(Element\))320 728 y(public)f(void)h (addAlt\(Term\))p Ff(:)16 b(Stores)f(a)f(new)g(alternate)g Fc(Term)p Ff(,)f(if)g(there)j(is)d(space)257 778 y(for)h(it)h(and)f(it) g(is)g(not)h(equal)f(to)g(one)h(already)f(stored.)21 b(The)15 b Fc(Term)e Ff(can)i(b)q(e)g(passed)h(whole)257 828 y(or)e(in)g(parts.)257 936 y Fb(Class)i(EqRel)257 1012 y Ff(See)c(Data)d(Structures)k(ab)q(o)o(v)o(e)c(for)h(a)g(general) h(description)g(of)e(the)i(class)g(and)f(a)g(description)257 1062 y(of)k(the)g(\014elds.)320 1154 y(Metho)q(ds:)320 1203 y Fc(public)20 b(boolean)h(related\(int,)e(int\))p Ff(:)d(T)m(ells)10 b(if)g(the)i(t)o(w)o(o)e(argumen)o(ts)h(are)g(in)g (the)257 1253 y(same)i(equiv)n(alence)h(class.)320 1303 y Fc(public)20 b(void)h(relate\(int,)f(int\))p Ff(:)15 b(Merges)e(the)e(equiv)n(alence)h(classes)g(of)e(the)i(t)o(w)o(o)257 1353 y(argumen)o(ts.)320 1403 y Fc(public)20 b(int)h([])h (classOf\(int\))p Ff(:)d(Returns)d(the)h(equiv)n(alence)e(class)i(of)e (the)h(argu-)257 1453 y(men)o(t.)320 1502 y Fc(public)k(int)h (representative\(int\))o Ff(:)14 b(Returns)c(the)h(\014rst)g Fc(Element)e Ff(of)g(the)i(equiv-)257 1552 y(alence)k(class)f(of)f(the) i(argumen)o(t.)320 1602 y Fc(public)20 b(int)h([])h(repSet\(IntCell)d (count,)h(int)h(elementCount\))p Ff(:)f(Returns)d(a)257 1652 y(set)k(of)f(class)g(represen)o(tativ)o(es.)38 b(The)21 b Fc(ModLattice)p Ff('s)c Fc(elementCount)h Ff(is)i(needed)h(b)q(e-)257 1702 y(cause)15 b(the)f(size)h(of)e(the)h Fc(ModLattice)e Ff(\(whic)o(h)i(is)f(also)h(the)g Fc(size)f Ff(of)g(the)h Fc(EqRel)p Ff(\))f(ma)o(y)f(b)q(e)257 1751 y(greater)g(than)e(its)h Fc(elementCount)p Ff(,)d(so)j(some)f(of)g(the)h Fc(EqRel)p Ff('s)e(n)o(um)o(b)q(ers)h(do)h(not)f(represen)o(t)257 1801 y Fc(Element)p Ff(s.)17 b(This)d(metho)q(d)f(ignores)i(these)g (extra)f(n)o(um)o(b)q(ers.)k(The)d(n)o(um)o(b)q(er)e(of)g(represen-)257 1851 y(tativ)o(es)j(is)g(stored)g(in)f(the)i Fc(IntCell)d Ff(parameter)h(\(the)i(n)o(um)o(b)q(er)d(that)i(w)o(as)g(there)h(b)q (efore)257 1901 y(is)d(ignored\);)f(this)h(n)o(um)o(b)q(er)g(ma)o(y)e (b)q(e)i(less)h(than)e(the)i(length)f(of)f(the)i(arra)o(y)e(returned.) 320 1951 y Fc(public)20 b(int)h(countClasses\(int)e(elementCount\))p Ff(:)28 b(Returns)21 b(the)g(n)o(um)o(b)q(er)f(of)257 2000 y(equiv)n(alence)11 b(classes.)18 b(Again,)10 b(n)o(um)o(b)q(ers)f (that)i(do)f(not)g(represen)o(t)i Fc(Element)p Ff(s)d(are)i(ignored.) 320 2050 y Fc(void)21 b(resize\(int)e(newSize\))p Ff(:)25 b(Adds)19 b(new)g(n)o(um)o(b)q(ers)e(to)h(the)h(equiv)n(alence)g(rela-) 257 2100 y(tion;)13 b(all)g(of)g(the)i(new)f(n)o(um)o(b)q(ers)g(are)g (initially)d(in)j(one-elemen)o(t)f(classes.)257 2208 y Fb(Class)j(In)o(tCell)257 2285 y Ff(This)e(class)f(encloses)i(a)e (single)g Fc(int)g Ff(\014eld)g(called)g Fc(myInt)p Ff(.)k(Unlik)o(e)12 b Fc(java.lang.Integer)p Ff(,)257 2334 y(the)f Fc(IntCell)p Ff('s)d Fc(int)i Ff(is)f(m)o(utable.)16 b(In)10 b(this)g(program,)e Fc(IntCell)h Ff(is)h(used)g(only)g(to)g(allo)o(w)e(the)257 2384 y(metho)q(d)15 b Fc(EqRel.repSet\(\))d Ff(to)i(\\return")i(t)o(w)o (o)f(v)n(alues:)k(one)d(as)f(the)g(return)h(v)n(alue,)f(and)257 2434 y(one)h(b)o(y)g(mo)q(difying)d(the)j Fc(IntCell)e Ff(parameter.)23 b(\(The)17 b(other)f(w)o(a)o(y)f(to)h(mak)o(e)e(a)h (metho)q(d)257 2484 y(\\return")g(t)o(w)o(o)e(v)n(alues)h(is)g(to)f (return)j(an)d(ob)r(ject)i(that)f(has)g(b)q(oth)g(v)n(alues)f(as)h (\014elds.\))963 2628 y(8)p eop %%Page: 9 9 9 8 bop 257 262 a Fb(Class)16 b(Mo)q(dLattice)257 338 y Ff(See)f(Data)e(Structures)j(ab)q(o)o(v)o(e)e(for)g(description)g(of) f(the)i(\014elds.)320 429 y(Metho)q(ds:)320 479 y Fc(void)21 b(fillCurrentSqua)o(re\(\))p Ff(:)14 b(This)e(is)g(the)h(cen)o(tral)g (metho)q(d)f(of)f(the)i(program.)j(It)257 529 y(computes)e(the)h(join)e (or)g(meet)h(of)f(the)i(t)o(w)o(o)e Fc(Element)p Ff(s)g(whose)i(n)o(um) o(b)q(ers)e(are)h(the)h(curren)o(t)257 579 y(ro)o(w)f(and)g(the)h (curren)o(t)g(column.)j(The)c(op)q(erator)h(is)f(join)f(if)g Fc(row)21 b(<=)h(column)p Ff(,)12 b(and)i(meet)257 629 y(if)f Fc(row)22 b(>=)f(column)p Ff(.)320 679 y(Most)14 b(of)f(the)i(w)o(ork)e(within)h Fc(fillCurrentSqua)o(re\(\))c Ff(is)k(done)g(b)o(y)g(the)h(16)e(m)o(utually)257 728 y(recursiv)o(e)18 b(metho)q(ds)d Fc(handle1\(\))e Ff(through)j Fc(handle16\(\))p Ff(.)21 b(Eac)o(h)16 b(of)f(these)i(pro)q(cesses)i(a) 257 778 y(di\013eren)o(t)c(\\term)e(t)o(yp)q(e":)308 857 y(1.)20 b Fe(a)9 b Fd(_)g Fe(b)g Fd(_)g Fe(c)g Fd(_)g Fe(d)308 939 y Ff(2.)20 b Fe(a)9 b Fd(_)g Fe(b)g Fd(_)g Ff(\()p Fe(c)g Fd(^)g Fe(d)p Ff(\))308 1020 y(3.)20 b(\()p Fe(a)9 b Fd(^)g Fe(b)p Ff(\))h Fd(_)e Ff(\()p Fe(c)i Fd(^)f Fe(d)p Ff(\))308 1101 y(4.)20 b Fe(a)9 b Fd(_)g Ff(\(\()p Fe(b)h Fd(_)e Fe(c)p Ff(\))i Fd(^)f Fe(d)p Ff(\))308 1182 y(5.)20 b Fe(a)9 b Fd(_)g Ff(\()p Fe(b)g Fd(^)g Fe(c)g Fd(^)g Fe(d)p Ff(\))308 1263 y(6.)20 b Fe(a)9 b Fd(_)g Fe(b)g Fd(_)g Fe(c)308 1345 y Ff(7.)20 b Fe(a)9 b Fd(_)g Ff(\()p Fe(b)g Fd(^)g Fe(c)p Ff(\))308 1426 y(8.)20 b Fe(a)9 b Fd(_)g Fe(b)308 1507 y Ff(9.)20 b Fe(a)9 b Fd(^)g Fe(b)g Fd(^)g Fe(c)g Fd(^)g Fe(d)287 1588 y Ff(10.)20 b Fe(a)9 b Fd(^)g Fe(b)g Fd(^)g Ff(\()p Fe(c)g Fd(_)g Fe(d)p Ff(\))287 1669 y(11.)20 b(\()p Fe(a)9 b Fd(_)g Fe(b)p Ff(\))h Fd(^)e Ff(\()p Fe(c)i Fd(_)f Fe(d)p Ff(\))287 1750 y(12.)20 b Fe(a)9 b Fd(^)g Ff(\(\()p Fe(b)h Fd(^)e Fe(c)p Ff(\))i Fd(_)f Fe(d)p Ff(\))287 1832 y(13.)20 b Fe(a)9 b Fd(^)g Ff(\()p Fe(b)g Fd(_)g Fe(c)g Fd(_)g Fe(d)p Ff(\))287 1913 y(14.)20 b Fe(a)9 b Fd(^)g Fe(b)g Fd(^)g Fe(c)287 1994 y Ff(15.)20 b Fe(a)9 b Fd(^)g Ff(\()p Fe(b)g Fd(_)g Fe(c)p Ff(\))287 2075 y(16.)20 b Fe(a)9 b Fd(^)g Fe(b)257 2154 y Ff(When)19 b(a)g Fc(handle\(\))e Ff(metho)q(d)h(is)g(called,)i(this)e(means)g (that)h(the)h(join)d(or)i(meet)f(b)q(eing)257 2204 y(computed)g(has)h (b)q(een)h(found)e(to)g(b)q(e)h(equal)f(to)h(an)f(expression)i(of)d (the)j(corresp)q(onding)257 2254 y(t)o(yp)q(e.)320 2304 y(Note)h(that)f(9)g(through)h(16)f(are)h(the)g(duals)f(of)g(1)g (through)h(8)f(resp)q(ectiv)o(ely)m(.)39 b(The)257 2354 y(co)q(de)16 b(of)f Fc(handle9\(\))f Ff(through)h Fc(handle16\(\))e Ff(is)i(dual)g(to)g(that)g(of)g Fc(handle1\(\))e Ff(through)257 2403 y Fc(handle8\(\))p Ff(.)320 2453 y(All)h(the)i Fc(handle\(\))d Ff(metho)q(ds)i(ha)o(v)o(e)g(v)o(oid)f(return)i(t)o(yp)q(e.)23 b(They)15 b(ha)o(v)o(e)g(the)h(follo)o(wing)257 2503 y(parameters:)963 2628 y(9)p eop %%Page: 10 10 10 9 bop 320 262 a Ff(2,)15 b(3,)g(or)g(4)g Fc(Element)p Ff(s)g(called)g Fc(a)p Ff(,)g Fc(b)p Ff(,)g Fc(c)p Ff(,)g(and)g Fc(d)p Ff(,)g(corresp)q(onding)i(to)e(the)h(p)q(ositions)f(of)257 311 y Fc(a)p Ff(,)f Fc(b)p Ff(,)f Fc(c)p Ff(,)g(and)h Fc(d)f Ff(in)h(the)g(ab)q(o)o(v)o(e)g(list)f(of)g(\\term)g(t)o(yp)q (es";)320 361 y(An)18 b Fc(int)g Ff(called)g Fc(fresh)p Ff(.)30 b(A)o(t)18 b(most)f(one)h(of)g Fc(a)p Ff(,)h Fc(b)p Ff(,)f Fc(c)p Ff(,)h(and)f Fc(d)g Ff(can)g(b)q(e)h(\\fresh")g (and)257 411 y(sub)r(ject)j(to)e(\\rec)o(haracterization")h (\(explained)f(b)q(elo)o(w\).)36 b(A)21 b(v)n(alue)e(of)h(1)f(means)h Fc(a)g Ff(is)257 461 y(fresh,)d(2)f(means)f Fc(b)g Ff(is)h(fresh,)h(3)e (means)g Fc(c)h Ff(is)g(fresh,)g(4)g(means)f Fc(d)h Ff(is)f(fresh,)i (and)f(0)f(means)257 511 y(that)f(none)h(is)e(fresh.)19 b(Some)13 b(of)g(these)j(metho)q(ds)d(nev)o(er)i(refer)g(to)f(this)g (parameter,)f(but)h(it)257 560 y(is)g(in)g(all)e(of)h(them)h(for)f (uniformit)o(y;)320 610 y(An)j Fc(int)f Ff(called)h Fc(deep)p Ff(.)24 b(This)16 b(is)g(decreased)i(b)o(y)e(one)g(eac)o(h)h(time)d (another)j(recursiv)o(e)257 660 y(call)c(is)h(made;)e(when)j(it)e(is)h (0)g(the)g(recursion)h(stops;)f(and)320 710 y(Tw)o(o)20 b Fc(Vectors)f Ff(called)h Fc(termResults)f Ff(and)h Fc(elementResults)p Ff(.)36 b(Eac)o(h)21 b(time)e(the)257 760 y Fc(handle9\(\))8 b Ff(or)h Fc(handle16\(\))e Ff(is)i(called,)h (an)f(appropriate)g Fc(Term)f Ff(is)i(added)f(to)g Fc(termResults)p Ff(,)257 809 y(and)i(eac)o(h)g(time)e(the)i(calculation)f(reduces)j(to) d(a)g(single)h Fc(Element)p Ff(,)e(this)i Fc(Element)e Ff(is)h(added)257 859 y(to)k Fc(elementResults)p Ff(.)320 951 y(Eac)o(h)j Fc(handle\(\))f Ff(metho)q(d)g(can)h(p)q(erform)g(v)n (arious)f(manipulations,)f(dep)q(ending)j(on)257 1000 y(what)11 b(relations)f Fc(a)p Ff(,)g Fc(b)p Ff(,)g Fc(c)p Ff(,)h(and)f Fc(d)g Ff(satisfy)m(,)g(and)g(whether)i(certain)e(joins)g (and)g(meets)h(of)e(them)257 1050 y(are)14 b(kno)o(wn.)k(There)d(are)f (5)f(categories)h(of)f(manipulations:)i(join,)e(meet,)f(rec)o (haracterize,)257 1100 y(absorb,)i(and)g(apply)f(mo)q(dular)f(la)o(w.) 320 1150 y(Join:)34 b(Replace)22 b(t)o(w)o(o)g(of)g Fc(a)p Ff(,)h Fc(b)p Ff(,)h Fc(c)p Ff(,)f(and)f Fc(d)g Ff(with)g(their)h (join.)42 b(F)m(or)21 b(example,)i(in)257 1200 y Fc(handle1\(\))p Ff(,)15 b(if)h(the)h(join)e(of)h Fc(b)g Ff(and)h Fc(c)f Ff(is)g(kno)o(wn)g(to)g(b)q(e)h Fc(x)p Ff(,)g Fc(handle6\(\))d Ff(is)j(called)f(with)257 1249 y(the)f Fc(Element)p Ff(s)e Fc(a)p Ff(,)g Fc(d)p Ff(,)g(and)h Fc(x)p Ff(.)320 1299 y(Meet:)19 b(Replace)14 b(t)o(w)o(o)f(of)g Fc(a)p Ff(,)h Fc(b)p Ff(,)f Fc(c)p Ff(,)g(and)h Fc(d)f Ff(with)h(their)g(meet;)f (similar)f(to)h(join.)320 1349 y(Rec)o(haracterize:)22 b(One)16 b(of)e(the)i(Elemen)o(ts)e Fc(a)p Ff(,)h Fc(b)p Ff(,)g Fc(c)p Ff(,)f(and)h Fc(d)g Ff(is)g(\\fresh")g(if)g(it)f(w)o(as)h (just)257 1399 y(created)c(b)o(y)f(a)f(join)f(or)i(meet)f(in)g(the)h (last)f Fc(handle\(\))f Ff(metho)q(d)h(called.)16 b(Rec)o (haracterization)257 1449 y(means)i(replacing)h(the)g(\\fresh")g (elemen)o(t)f(with)g(one)h(of)f(its)h Fc(Term)p Ff(s.)32 b(F)m(or)18 b(example,)g(in)257 1499 y Fc(handle6\(\))p Ff(,)11 b(if)i Fc(c)f Ff(is)h(fresh)h(and)f(one)h(of)e(its)h Fc(Term)p Ff(s)g(is)g Fc(x)22 b(v)f(y)p Ff(,)13 b(then)h Fc(handle1\(\))d Ff(is)i(called)257 1548 y(with)18 b Fc(a)p Ff(,)g Fc(b)p Ff(,)g Fc(x)p Ff(,)g(and)f Fc(y)p Ff(;)i(if)e(another)h Fc(Term)f Ff(of)h Fc(c)f Ff(is)h Fc(z)j(^)h(w)p Ff(,)c(then)g Fc(handle2\(\))e Ff(is)i(called)257 1598 y(with)13 b Fc(a)p Ff(,)f Fc(b)p Ff(,)h Fc(z)p Ff(,)f(and)h Fc(w)p Ff(.)k(In)c(eac)o(h)h Fc(handle\(\))p Ff(,)d(only)h(some)g(of)g (the)h(parameters)g(are)h(allo)o(w)o(ed)257 1648 y(to)g(b)q(e)h(fresh,) g(and)f(the)g(join)f(and)h(meet)g(manipulations)d(are)k(designed)g(to)f (resp)q(ect)i(these)257 1698 y(restrictions.)320 1748 y(Absorb:)g(Simplify)8 b(using)i(one)g(of)g(the)h(iden)o(tities)f(\()p Fe(x)r Fd(_)r Fe(y)q Ff(\))r Fd(^)r Fe(x)h Ff(=)h Fe(x)e Ff(and)g(\()p Fe(x)r Fd(^)r Fe(y)q Ff(\))r Fd(_)r Fe(x)h Ff(=)h Fe(x)p Ff(.)257 1797 y(This)i(is)f(the)i(only)e(manipulatio)o(n) e(that)j(can)g(yield)f(a)g(single)g Fc(Element)p Ff(.)k(F)m(or)c (example,)f(in)257 1847 y Fc(handle5\(\))p Ff(,)g(if)h Fc(a)h Ff(is)f(equal)h(to)g Fc(b)p Ff(,)f Fc(c)p Ff(,)g(or)h Fc(d)p Ff(,)f(it)g(is)h(added)g(to)g Fc(elementResults)p Ff(.)320 1897 y(Apply)i(mo)q(dular)f(la)o(w:)24 b(for)16 b(example,)g(in)h Fc(handle7\(\))p Ff(,)e(if)h Fc(a)h Ff(is)g(kno)o(wn)g(to)f(b)q(e)i Fd(\024)f Fc(c)p Ff(,)257 1947 y(then)e Fc(handle15\(\))d Ff(is)h(called)h(with)g Fc(c)p Ff(,)f Fc(a)p Ff(,)g(and)h Fc(b)p Ff(.)320 2038 y(When)f(more)g(than)h(one)f(of)g(these)i(manipulations)c(is)i (applicable,)g(the)h(metho)q(d)f(do)q(es)257 2088 y(all)d(of)g(them.)16 b(This)10 b(pro)q(duces)i(a)f(tree)h(of)e(calls)g(to)g Fc(handle\(\))f Ff(metho)q(ds,)h(and)h(this)f(tree)i(can)257 2138 y(b)q(e)j(v)o(ery)f(large.)19 b(Sometimes)12 b(the)i(same)g Fc(handle\(\))e Ff(metho)q(d)h(will)g(b)q(e)h(called)g(rep)q(eatedly) 257 2188 y(with)e(the)g(same)f Fc(Element)p Ff(s;)f(this)i(yields)g (redundan)o(t)g(calculations.)17 b(The)12 b(program)e(could)257 2237 y(ha)o(v)o(e)15 b(b)q(een)h(written)g(to)f(eliminate)e(this)i (redundancy)h(b)o(y)f(using)g(a)g Fc(Hashtable)e Ff(to)i(k)o(eep)257 2287 y(trac)o(k)j(of)f(the)h(calls.)29 b(I)17 b(did)g(not)h(do)f(this)h (b)q(ecause)h(I)e(susp)q(ected)j(that)e(the)g(time)e(sp)q(en)o(t)257 2337 y(c)o(hec)o(king)h(the)g Fc(Hashtable)e Ff(w)o(ould)h(b)q(e)h (greater)h(than)e(the)h(time)e(sa)o(v)o(ed)i(b)o(y)g(eliminating)257 2387 y(the)e(rep)q(etition.)320 2478 y(No)o(w)h(I)h(explain)f(ho)o(w)g Fc(fillCurrentSquare)o(\(\))e Ff(w)o(orks.)26 b(The)18 b(t)o(w)o(o)e Fc(Element)p Ff(s)f(that)953 2628 y(10)p eop %%Page: 11 11 11 10 bop 257 262 a Ff(are)17 b(b)q(eing)f(joined)g(or)g(meeted)g(are)g (stored)i(in)d(the)i(lo)q(cal)e(v)n(ariables)h Fc(lhs)f Ff(and)h Fc(rhs)p Ff(,)g(and)257 311 y(the)d(op)q(eration)f(is)g (stored)h(in)f(the)h(lo)q(cal)e(v)n(ariable)g Fc(op)p Ff(.)17 b(First)c Fc(handleTrivialCas)o(es\(\))c Ff(is)257 361 y(called.)19 b(This)14 b(metho)q(d)f(\014lls)h(in)g(the)h(square)f (in)g(the)h(cases)g(when)g Fc(lhs)21 b(==)h(rhs)p Ff(,)13 b(or)h(when)257 411 y(one)19 b(of)e(them)g(is)h(0)g(or)g(1.)30 b(If)18 b(one)g(of)f(these)j(cases)f(applies,)g Fc(handleTrivialCas)o (es\(\))257 461 y Ff(returns)d Fc(true)p Ff(,)c(and)i(the)h(rest)g(of)e Fc(fillCurrentSquare)o(\(\))e Ff(is)j(skipp)q(ed.)320 511 y(Otherwise)d(it)f(next)h(calls)f Fc(preparation\(\))p Ff(.)k(This)c(metho)q(d)g(\014rst)h(c)o(hec)o(ks)h(to)e(see)h(if)f(the) 257 560 y(square)17 b(is)f(already)f(\014lled;)h(if)f(so,)h(the)g Fc(Element)e Ff(there)j(is)f(added)g(to)g Fc(elementResults)p Ff(.)257 610 y(Then)j(it)e(tries)i(to)f(compute)f(the)i(join)e(or)h (meet)f(via)g(the)i(automorphisms.)27 b(If)18 b(an)o(y)f(of)257 660 y(these)f(computations)c(succeed,)k(the)e(results)h(are)g(added)f (to)g Fc(elementResults)p Ff(.)320 710 y(Next)k Fc(handleEasyCases\(\)) d Ff(is)i(called.)30 b(This)18 b(metho)q(d)f(detects)j(certain)f(cases) g(in)257 760 y(whic)o(h)13 b(the)h(answ)o(er)f(is)g(immediately)d(giv)o (en)i(b)o(y)h(the)h(absorption)e(iden)o(tities;)h(an)o(y)g(answ)o(er) 257 809 y(found)h(here)h(is)f(also)f(added)h(to)g Fc(elementResults)p Ff(.)320 859 y(Next)9 b Fc(dispatchOnOps\(\))e Ff(is)i(called,)g(whic)o (h)g(calls)g(the)h(appropriate)f Fc(handle\(\))f Ff(metho)q(d)257 909 y(dep)q(ending)18 b(on)e(whether)i(the)g(de\014ning)e Fc(Term)p Ff(s)g(of)h Fc(lhs)f Ff(and)g Fc(rhs)g Ff(are)h(joins,)g (meets,)f(or)257 959 y(generators.)26 b(The)17 b Fc(deep)e Ff(parameter)h(of)f(the)i Fc(handle\(\))d Ff(metho)q(d)i(is)g (initially)d(assigned)257 1009 y Fc(DEPTH)19 b Ff(if)f Fc(elementResults)f Ff(is)i(empt)o(y)m(,)g(and)g Fc(DEPTH2)g Ff(if)f(it)h(is)h(not.)34 b(The)20 b Fc(handle\(\))257 1059 y Ff(metho)q(ds)14 b(can)g(add)g Fc(Term)p Ff(s)f(to)h Fc(termResults)d Ff(and)j Fc(Element)p Ff(s)f(to)h Fc(elementResult)p Ff(s.)320 1108 y(Next)h(comes)f Fc(turnTermsToElements)o(\(\))p Ff(.)j(F)m(or)e(eac)o(h)g Fc(Term)f Ff(in)g Fc(termResults)p Ff(,)e(this)257 1158 y(metho)q(d)h(c)o(hec)o(ks)i(to)f(see)h(if)e(its)g (v)n(alue)g(is)h(giv)o(en)f(in)g(the)i(table.)j(If)13 b(so,)g(the)i Fc(Element)d Ff(found)257 1208 y(is)k(added)g(to)f Fc(elementResults)p Ff(;)e(otherwise,)j(the)g Fc(Term)f Ff(is)g(added)h(to)f(a)h Fc(Vector)e Ff(called)257 1258 y Fc(unknownTerms)p Ff(.)320 1308 y(If)d(after)g(all)f(this)i(w)o(ork)f Fc(elementResults)d Ff(is)j(still)g(empt)o(y)m(,)e Fc (makeNewElement\(\))f Ff(\(not)257 1357 y(to)15 b(b)q(e)g(confused)g (with)f Fc(makeNewElements\(\))p Ff(\))d(is)k(called)f(to)g(create)i (the)f(new)g Fc(Element)p Ff(.)257 1407 y(If)h Fc(elementResults)e Ff(con)o(tains)i(more)g(than)g(one)h Fc(Element)p Ff(,)e Fc(identify\(\))f Ff(is)i(called)h(to)257 1457 y(record)e(that)f(they)h (are)f(equal.)320 1507 y(Finally)9 b(the)j(square)f(is)g(\014lled,)g (and)g Fc(fillOtherSquares)o(\(\))d Ff(is)j(called.)16 b(Eac)o(h)c Fc(Term)e Ff(in)257 1557 y Fc(unknownTerms)f Ff(giv)o(es)h(a)h(join)e(or)i(meet)g(that)f(has)h(b)q(een)h(pro)o(v)o (ed)f(equal)g(to)f(the)i Fc(Element)d Ff(in)257 1606 y(the)15 b(curren)o(t)g(square,)g(so)f(this)f Fc(Element)g Ff(is)h(also)f(placed)h(in)g(the)g(squares)h(for)f(these)h(joins)257 1656 y(and)i(meets.)27 b(Also,)17 b(these)i Fc(Terms)c Ff(are)j(installed)e(as)h(the)h Fc(Element)p Ff('s)d(alternate)i Fc(Term)p Ff(s,)257 1706 y(but)d(only)e(if)h(b)q(oth)g(of)g(their)h (argumen)o(ts)e(are)i Fc(Element)p Ff(s)e(with)h(lo)o(w)o(er)g(n)o(um)o (b)q(ers.)k(W)m(e)c(only)257 1756 y(w)o(an)o(t)k(to)f(describ)q(e)j Fc(Elements)c Ff(in)i(terms)f(of)g(simpler)g Fc(Element)p Ff(s,)g(and)h(ha)o(ving)e(a)i(lo)o(w)o(er)257 1806 y(n)o(um)o(b)q(er)d (corresp)q(onds)h(appro)o(ximately)d(to)i(ha)o(ving)e(a)i(shorter)h Fc(Term)p Ff(.)320 1897 y(Other)g(metho)q(ds)e(in)h(class)g Fc(ModLattice)p Ff(:)320 1947 y Fc(public)20 b(void)h (makeNewElements\(in)o(t)e(total\))p Ff(:)30 b(This)20 b(is)g(command)e(1)i(in)g(the)257 1997 y(men)o(u.)c(Note)11 b(that)f(the)g(parameter)g(is)g(the)h(total)e(to)h(b)q(e)h(reac)o(hed,) g(not)f(the)h(n)o(um)o(b)q(er)f(of)f(new)257 2046 y Fc(Element)p Ff(s)16 b(to)g(b)q(e)h(created.)27 b(This)16 b(metho)q(d)g(rep)q (eatedly)h(calls)f Fc(fillCurrentSquare\(\))257 2096 y Ff(to)h(\014ll)e(the)i(curren)o(t)h(square)g(of)e(the)h(table,)f(and) h Fc(updatePointer\(\))c Ff(to)j(\014nd)h(the)g(next)257 2146 y(square,)h(un)o(til)e(either)h(the)g(required)h(n)o(um)o(b)q(er)e (of)g Fc(Element)p Ff(s)f(ha)o(v)o(e)i(b)q(een)h(made,)d(or)i(the)257 2196 y(table)d(is)g(\014lled)f(\(in)g(whic)o(h)h(case)h(it)e(announces) i(that)e(the)i(lattice)f(is)f(complete.\))18 b(Then)c(it)257 2246 y(calls)g Fc(computeAllConjuga)o(tes\(\))o Ff(.)320 2296 y Fc(protected)20 b(Element)g(join\(Element,)f(Element\))320 2345 y(protected)h(Element)g(join\(int,)g(int\))320 2395 y(protected)g(Element)g(meet\(Element,)f(Element\))320 2445 y(protected)h(Element)g(meet\(int,)g(int\))p Ff(:)26 b(These)19 b(metho)q(ds)f(are)h(for)f(lo)q(oking)e(up)257 2495 y(information)f(in)h(the)i(table,)f(not)g(for)g(computing)e(new)j (joins)f(and)f(meets.)28 b(Either)18 b(the)953 2628 y(11)p eop %%Page: 12 12 12 11 bop 257 262 a Fc(Element)p Ff(s)16 b(or)h(their)g(n)o(um)o(b)q (ers)g(ma)o(y)d(b)q(e)k(used)g(as)f(argumen)o(ts.)26 b(P)o(erhaps)18 b(there)g(should)257 311 y(also)12 b(b)q(e)h(metho)q (ds)f(that)g(accept)h(one)g(argumen)o(t)e(of)g(eac)o(h)i(t)o(yp)q(e.)18 b(These)c(w)o(ould)d(b)q(e)i(useful,)257 361 y(but)h(they)h(seem)f(lik) o(e)f(bad)g(st)o(yle)h(to)g(me.)320 411 y Fc(protected)20 b(void)h(identify\(Elemen)o(t,)e(Element\))p Ff(:)26 b(Records)20 b(the)g(equalit)o(y)e(of)257 461 y(these)e(t)o(w)o(o)d Fc(Element)p Ff(s.)320 511 y Fc(public)20 b(boolean)h(computeConjugat)o (e\(Ele)o(ment)d(e,)k(int)f(i\))p Ff(:)257 560 y(This)13 b(metho)q(d)f(attempts)g(to)h(compute)f(the)i(e\013ect)g(of)e (automorphism)e Fc(i)i Ff(on)h Fc(Element)20 b(e)p Ff(,)257 610 y(returning)d(true)g(if)e(successful.)27 b(It)16 b(uses)i(the)e(de\014ning)g Fc(Term)g Ff(of)f Fc(e)h Ff(\014rst,)h(and)f(then)h(an)o(y)257 660 y(alternate)i Fc(Term)p Ff(s.)30 b(The)19 b(answ)o(er)f(is)g(recorded)i(in)e Fc(e.conjugates[i])o Ff(.)28 b(If)18 b(a)f(di\013eren)o(t)257 710 y(answ)o(er)g(is)e(already)g(recorded)i(there,)g Fc(identify\(\))c Ff(is)j(called.)22 b(This)16 b(metho)q(d)e(uses)j (the)257 760 y(help)q(er)e Fc(computeConjugate\(T)o(erm,)j(int\))p Ff(.)320 809 y Fc(public)i(void)h(computeAllConjugat)o(es\(\))p Ff(:)e(Calls)c Fc(computeConjugate)o(\(\))e Ff(with)257 859 y(ev)o(ery)i Fc(Element)d Ff(and)i(ev)o(ery)h(automorphism.)320 909 y Fc(void)21 b(computeCongruen)o(ce\(\))p Ff(:)e(This)d(metho)q(d)f (is)h(command)e(2)h(in)h(the)h(men)o(u.)23 b(It)257 959 y(has)15 b(t)o(w)o(o)g(parts.)22 b(In)15 b(the)g(\014rst)h(part,)f(for) f(ev)o(ery)i(t)o(w)o(o)f Fc(Element)p Ff(s)e(that)i(are)h(related,)f (their)257 1009 y(join)g(and)g(meet)f(are)i(lo)q(ok)o(ed)f(up;)g(if)f (either)i(of)f(these)i(is)e(de\014ned,)h(it)f(is)g(made)f(related)i(to) 257 1059 y(the)e(t)o(w)o(o)f Fc(Element)p Ff(s.)j(The)e(second)g(part)g (dep)q(ends)g(of)f(the)h(constan)o(ts)g Fc(M)f Ff(and)g Fc(N)p Ff(.)f(The)i(\014rst)257 1108 y Fc(M)h Ff(non)o(trivial)e(equiv) n(alence)h(classes)i(are)f(examined,)e(and)i(for)f(eac)o(h)h(of)f (these)i(classes)g(the)257 1158 y(\014rst)i Fc(Element)d Ff(is)i(compared)f(to)h(eac)o(h)g(of)f(the)h(next)h Fc(N)p Ff(.)e(F)m(or)g(the)i(t)o(w)o(o)e Fc(Element)p Ff(s)f(b)q(eing)257 1208 y(compared,)20 b(the)g(corresp)q(onding)h(ro)o(ws)e(of)g(the)h (join)f(table)g(are)h(examined)e(square)j(b)o(y)257 1258 y(square.)e(An)o(y)13 b(discrepancies)j(are)e(\014xed)g(b)o(y)f(either) h(\014lling)e(in)h(empt)o(y)g(squares)h(or)g(calling)257 1308 y Fc(identify\(\))p Ff(.)i(The)f(same)e(op)q(eration)g(is)h(done)g (with)g(the)g(meet)g(table.)320 1357 y Fc(public)20 b(ModLattice)g (collapse\(boolean\))o Ff(:)14 b(This)e(is)g(command)d(4)j(in)f(the)i (men)o(u.)257 1407 y(If)f(the)g(argumen)o(t)e(is)i Fc(false)p Ff(,)f(all)f(information)f(ab)q(out)i(automorphisms)e(is)j(left)f(out)h (of)f(the)257 1457 y(new)k Fc(ModLattice)p Ff(.)j(This)c(metho)q(d)f (creates)k(a)d(new)h Fc(ModLattice)p Ff(,)d(with)i(newly)g(created)257 1507 y Fc(Element)p Ff(s)e(corresp)q(onding)i(to)e(a)h(set)g(of)f (class)i(represen)o(tativ)o(es)h(of)d(the)h(old)f Fc(ModLattice)p Ff(.)257 1557 y(Note)k(that)f(ev)o(ery)h Fc(Element)e Ff(con)o(tains)h(references)j(to)e(other)f Fc(Element)p Ff(s;)g(if)f(a)h(class)h(rep-)257 1606 y(resen)o(tativ)o(e)f(con)o (tains)e(a)g(reference)i(to)e Fc(Element)21 b(x)p Ff(,)12 b(then)i(the)g(corresp)q(onding)g Fc(Element)257 1656 y Ff(in)e(the)i(new)f Fc(ModLattice)d Ff(gets)j(a)f(corresp)q(onding)i (reference)h(to)d(the)h(new)g Fc(Element)e Ff(that)257 1706 y(corresp)q(onds)16 b(to)e(the)g(class)h(represen)o(tativ)o(e)h (of)d Fc(x)p Ff(.)320 1756 y Fc(void)21 b(resize\(int)e(newSize\))p Ff(:)i(This)16 b(is)g(command)d(5)j(in)f(the)i(men)o(u.)23 b(The)16 b(infor-)257 1806 y(mation)d(in)h(the)i(join/meet)d(table)h (and)h(the)g Fc(Element)f Ff(list)g(is)h(copied)g(in)o(to)f(larger)h (newly)257 1856 y(allo)q(cated)f(arra)o(ys,)f(and)h(the)h Fc(EqRel)d Ff(is)i(resized.)320 1905 y Fc(void)21 b(forceJoin\(int,)d (int\))320 1955 y(void)j(forceMeet\(int,)d(int\))p Ff(:)33 b(These)22 b(metho)q(ds)f(are)h(not)f(a)o(v)n(ailable)e(from)h(the)257 2005 y(men)o(u;)i(they)f(can)f(only)f(b)q(e)i(in)o(v)o(ok)o(ed)e(b)o(y) h(user-written)i(co)q(de.)38 b(They)20 b(force)h(the)f(join)257 2055 y(or)15 b(meet)f(of)g(t)o(w)o(o)h Fc(Element)p Ff(s)e(\(whose)j(n) o(um)o(b)q(ers)e(are)h(the)g(argumen)o(ts\))g(to)f(b)q(e)h(computed,) 257 2105 y(deviating)c(from)e(the)j(order)g(in)f(whic)o(h)g(the)h (table)f(is)g(normally)e(\014lled.)16 b(In)c(most)e(situations)257 2154 y(these)j(metho)q(ds)d(should)g(not)h(b)q(e)h(used,)f(b)q(ecause)i (they)e(cause)h Fc(Element)p Ff(s)e(to)g(b)q(e)i(n)o(um)o(b)q(ered)257 2204 y(in)k(un)o(usual)f(w)o(a)o(ys.)23 b(They)16 b(are)g(necessary)i (for)e(some)e(applications,)h(b)q(ecause)j(one)d(m)o(ust)257 2254 y(create)h Fc(Element)p Ff(s)d(b)q(efore)i(one)g(can)f(iden)o (tify)g(them,)f(but)h(sometimes)f(creating)h(them)g(in)257 2304 y(the)h(usual)e(sequence)k(w)o(ould)c(tak)o(e)h(to)q(o)f(long)g (or)h(use)h(to)q(o)e(m)o(uc)o(h)g(space.)320 2354 y(If)19 b Fc(elementCount)g(==)i(currentSize)d Ff(when)i(the)g(user)g(attempts) g(to)f(use)h(one)g(of)257 2403 y(these)15 b(t)o(w)o(o)f(metho)q(ds)f (to)g(\014ll)g(an)g(empt)o(y)g(square)h(in)f(the)i(table,)e(the)h (program)e(will)g(crash.)257 2453 y(An)o(y)k(co)q(de)h(that)f(in)o(v)o (ok)o(es)g Fc(forceJoin\(\))d Ff(or)j Fc(forceMeet\(\))e Ff(should)i(ha)o(v)o(e)g(a)f(safeguard)257 2503 y(to)f(prev)o(en)o(t)h (this.)953 2628 y(12)p eop %%Page: 13 13 13 12 bop 257 262 a Fb(Class)16 b(SelfDualMo)q(dL)o(atti)o(ce)257 338 y Ff(This)j(class)f(is)g(a)g(sub)q(class)i(of)d Fc(ModLattice)p Ff(.)29 b(It)19 b(has)f(metho)q(ds)g Fc(computeDual\(\))e Ff(and)257 388 y Fc(computeAllDuals\(\))10 b Ff(that)j(are)g(analogous) f(to)h Fc(ModLattice)p Ff('s)d Fc(computeConjugate\(\))257 438 y Ff(and)f Fc(computeAllConjugates)o(\(\))p Ff(.)k(It)d(o)o(v)o (errides)g(the)g Fc(ModLattice)d Ff(metho)q(ds)i Fc(makeNewElements)o (\(\))p Ff(,)257 488 y Fc(preparation\(\))p Ff(,)k Fc (makeNewElement\(\))o Ff(,)f(and)j Fc(collapse\(\))p Ff(,)e(in)i(eac)o(h)h(case)g(adding)e(in-)257 537 y(structions)h(to)f (deal)g(with)f(duals,)h(whic)o(h)f(are)i(analogues)e(of)h(the)g (instructions)h(that)f(deal)257 587 y(with)9 b(conjugates.)17 b(In)10 b Fc(collapse\(\))p Ff(,)d(if)i(the)g(argumen)o(t)g(is)g Fc(true)p Ff(,)g(a)g(new)g Fc(SelfDualModLattice)257 637 y Ff(is)18 b(constructed,)i(retaining)e(the)g(information)d(ab)q (out)j(duals,)g(but)g(if)f(the)h(argumen)o(t)f(is)257 687 y Fc(false)p Ff(,)e(a)h Fc(ModLattice)e Ff(that)i(is)g(not)g(a)g Fc(SelfDualModLattic)o(e)d Ff(is)j(returned,)i(without)257 737 y(this)c(information.)257 845 y Fb(Class)i(T)l(erm)257 921 y Ff(Metho)q(ds:)320 971 y Fc(public)k(boolean)h(equals\(Term\))p Ff(:)k(Tw)o(o)19 b Fc(Term)p Ff(s)f(are)i(considered)g(equal)f(if)f (they)257 1021 y(ha)o(v)o(e)d(the)g(same)f(op)q(eration)g(and)g(the)h (same)f(t)o(w)o(o)g(argumen)o(ts,)g(ev)o(en)h(if)f(the)h(order)g(of)f (the)257 1071 y(argumen)o(ts)g(is)f(rev)o(ersed.)320 1120 y Fc(public)20 b(String)h(toString\(\))p Ff(:)e(If)c(this)g Fc(Term)g Ff(is)g(a)g(join)f(or)i(a)f(meet,)g(this)g(metho)q(d)257 1170 y(returns)20 b(the)e(op)q(eration)g(sym)o(b)q(ol)e(in)i(b)q(et)o (w)o(een)h(the)g(n)o(um)o(b)q(ers)e(of)h(the)g(t)o(w)o(o)g(argumen)o (ts;)257 1220 y(otherwise)d(it)f(returns)h(a)f Fc(String)e Ff(consisting)i(of)g(the)g(generator.)257 1336 y Fg(P)n(erformance)k (issues)257 1413 y Ff(Because)h(this)d(program)f(do)q(es)i(not)f(stop)h (computing)e(when)i(it)f(has)g(found)g(an)g(answ)o(er,)257 1463 y(increasing)i(its)f(computational)d(capabilit)o(y)i(\(b)o(y)h (using)f(automorphisms)f(and)i(dualit)o(y)m(,)257 1512 y(b)o(y)e(increasing)g Fc(DEPTH)p Ff(,)e Fc(DEPTH2)p Ff(,)g(or)i Fc(ALTS)p Ff(,)e(or)i(b)o(y)f(mo)q(difying)e(the)j(co)q (de\))h(mak)o(es)e(it)g(run)257 1562 y(slo)o(w)o(er,)i(though)f(it)h (should)f(yield)g(b)q(etter)j(results.)24 b(Ho)o(w)o(ev)o(er,)16 b(b)q(etter)i(results)e(can)g(sa)o(v)o(e)257 1612 y(time.)25 b(F)m(or)16 b(example,)g(one)g(migh)o(t)f(use)i(command)d(1)i(to)g (\014nd)h(the)g(next)g(100)f(elemen)o(ts,)257 1662 y(and)c(then)h (\014nd)f(after)g(further)h(computation)d(that)i(those)h(100)e(reduce)j (to)d(only)h(6)f(distinct)257 1712 y(new)18 b(elemen)o(ts.)28 b(One)17 b(migh)o(t)e(ha)o(v)o(e)i(to)g(rep)q(eat)i(this)e(pro)q (cedure)i(15)d(times)h(to)g(\014nd)g(the)257 1762 y(desired)22 b(100)e(new)i(elemen)o(ts.)38 b(If)21 b(one)g(could)f(compute)h(more)f (slo)o(wly)f(and)i(\014nd)g(the)257 1811 y(100)16 b(distinct)h(elemen)o (ts)g(on)g(the)g(\014rst)h(try)m(,)f(that)f(migh)o(t)f(b)q(e)j(faster.) 27 b(Also,)17 b(using)f(more)257 1861 y(computational)i(p)q(o)o(w)o(er) i(ma)o(y)e(increase)k(the)e(n)o(um)o(b)q(er)g(of)f(squares)i(that)g (are)f(\014lled)g(b)o(y)257 1911 y Fc(fillOtherSquares\(\))p Ff(;)8 b(this)i(will)f(sa)o(v)o(e)i(time)e(later)h(if)g Fc(DEPTH2)f Ff(is)h(set)i(lo)o(w)o(er)e(than)g Fc(DEPTH)p Ff(.)257 2027 y Fg(P)n(ossible)19 b(mo)r(di\014cations)d(and)k (extensions)257 2104 y Ff(The)g(manipulations)c(used)k(in)f(the)h Fc(handle\(\))e Ff(metho)q(ds)g(are)i(not)f(the)h(only)e(p)q(ossible) 257 2154 y(ones.)g(There)13 b(w)o(ere)g(some)e(that)h(I)f(delib)q (erately)h(left)g(out)f(b)q(ecause)j(I)d(though)o(t)h(they)g(w)o(ould) 257 2203 y(primarily)g(lead)i(to)h(redundan)o(t)g(calculations.)k (There)d(ma)o(y)c(b)q(e)k(other)f(useful)f(ones)h(that)257 2253 y(did)f(not)g(o)q(ccur)h(to)f(me.)k(F)m(eel)c(free)h(to)f(add)g (and)g(remo)o(v)o(e)f(manipulations)f(as)i(y)o(ou)f(see)j(\014t.)257 2303 y(Other)h Fc(handle\(\))c Ff(metho)q(ds)h(could)h(also)f(b)q(e)i (added)f(to)g(deal)g(with)g(longer)f(expressions.)257 2353 y Fc(dispatchOnOps\(\))d Ff(could)j(b)q(e)g(mo)q(di\014ed)f(to)h (dig)f(deep)q(er)j(in)o(to)d Fc(lhs)g Ff(and)h Fc(rhs)p Ff(,)f(and)h(start)257 2403 y(the)h(computation)d(with)i(a)f(longer)h (expression.)320 2453 y(One)c(could)f(try)g(using)g(a)g Fc(Hashtable)f Ff(to)h(eliminate)e(redundan)o(t)j(calls)f(to)g(the)h Fc(handle\(\))257 2502 y Ff(metho)q(ds.)18 b(This)13 b(migh)o(t)e(sp)q(eed)k(up)f(execution,)f(esp)q(ecially)h(for)f(higher) g(v)n(alues)g(of)g Fc(DEPTH)p Ff(.)953 2628 y(13)p eop %%Page: 14 14 14 13 bop 320 262 a Ff(I)14 b(ha)o(v)o(e)h(said)g(that)g(this)g (program)e(is)i(for)f(studying)h(mo)q(dular)e(lattices,)i(but)g(it)g (could)257 311 y(easily)f(b)q(e)g(mo)q(di\014ed)f(to)h(handle)g(nonmo)q (dular)e(lattices)i(b)o(y)g(remo)o(ving)e(all)h(use)i(of)e(mo)q(du-)257 361 y(larit)o(y)i(in)f(the)i(co)q(de.)23 b(Mo)q(dularit)o(y)14 b(is)i(used)g(in)f(only)f(t)o(w)o(o)h(places:)21 b(the)16 b(\\apply)e(mo)q(dular)257 411 y(la)o(w")i(manipulations)f(in)i(the)h Fc(handle\(\))d Ff(metho)q(ds,)i(and)h(the)g(\\Chec)o(k)f(mo)q(dular)f (la)o(w")257 461 y(command)11 b(in)j(the)g Fc(Driver)p Ff(.)320 511 y(Other)i(prop)q(erties)h(of)d(lattices,)i(suc)o(h)g(as)f (the)h(semidistributiv)o(e)e(la)o(ws,)g(could)h(b)q(e)h(in-)257 560 y(corp)q(orated)j(as)f(new)g(manipulations)d(in)j(the)g Fc(handle\(\))e Ff(metho)q(ds.)29 b(\(If)18 b(y)o(ou)f(w)o(an)o(t)h(to) 257 610 y(compute)c(in)g(distributiv)o(e)g(lattices,)g(I)g(think)g(a)g (m)o(uc)o(h)e(simpler)h(program)g(than)h(this)g(one)257 660 y(w)o(ould)i(su\016ce.\))26 b(Prop)q(erties)17 b(in)o(v)o(olving)d (longer)i(expressions,)i(suc)o(h)f(as)f(the)h(Arguesian)257 710 y(iden)o(tit)o(y)m(,)h(could)f(b)q(e)i(incorp)q(orated)f(in)g(the)g (same)f(w)o(a)o(y)g(if)g(the)h(appropriate)g Fc(handle\(\))257 760 y Ff(metho)q(ds)12 b(w)o(ere)g(included.)18 b(Ho)o(w)o(ev)o(er,)12 b(I)g(think)f(it)g(w)o(ould)g(b)q(e)i(more)d(e\016cien)o(t)j(to)e(deal) h(with)257 809 y(suc)o(h)i(prop)q(erties)g(b)o(y)f(writing)f(separate)i (metho)q(ds)e(\(in)o(v)o(ok)o(ed)g(through)h(command)d(12\))j(to)257 859 y(searc)o(h)i(for)f(and)g(correct)h(failures.)320 909 y(This)f(program)f(has)i(no)f(data)g(structure)j(that)d(directly)h (represen)o(ts)i(the)e(order)h(rela-)257 959 y(tion)f(of)g(a)g (lattice.)23 b(There)16 b(are)g(man)o(y)e(places)i(in)e(the)j(co)q(de)f (where)g(the)g(program)e(needs)257 1009 y(to)f(kno)o(w)g(that)g(one)g Fc(Element)f Ff(is)h(less)g(than)g(another,)g(and)g(curren)o(tly)h(it)f (can)g(only)f(deter-)257 1059 y(mine)j(this)h(if)g(the)g(join)f(or)h (meet)g(of)g(the)g(t)o(w)o(o)g Fc(Element)p Ff(s)f(has)h(b)q(een)h (computed.)25 b(If)15 b(this)257 1108 y(data)g(structure)i(w)o(ere)f (added,)g(there)g(w)o(ould)e(b)q(e)i(w)o(a)o(ys)f(that)g (comparabilities)e(could)i(b)q(e)257 1158 y(determined,)f(stored,)g (and)g(used)h(b)q(efore)f(the)h(join)e(and)g(meet)h(w)o(ere)h (computed.)320 1208 y(It)i(should)g(b)q(e)h(easy)f(to)g(mo)q(dify)e Fc(Driver)h Ff(to)h(ha)o(v)o(e)g(m)o(ultiple)d(activ)o(e)k Fc(ModLattice)p Ff(s.)257 1258 y(P)o(erhaps)d(a)e(class)i(called)e Fc(Homomorphism)e Ff(could)j(b)q(e)g(designed)g(to)g(represen)o(t)i (homomo)o(r-)257 1308 y(phisms)d(b)q(et)o(w)o(een)i(the)g(activ)o(e)f Fc(ModLattice)p Ff(s.)320 1357 y(Some)21 b(c)o(hanges)i(could)f(b)q(e)h (made)e(in)h(the)h(w)o(a)o(y)f(alternate)h Fc(Term)p Ff(s)f(are)h(stored)g(in)257 1407 y Fc(Element)p Ff(s.)34 b(Curren)o(tly)m(,)21 b(an)e Fc(Element)f Ff(only)g(stores)j Fc(Term)p Ff(s)e(that)h(in)o(v)o(olv)o(e)e(t)o(w)o(o)h(lo)o(w)o(er-)257 1457 y(n)o(um)o(b)q(ered)13 b Fc(Element)p Ff(s,)e(b)q(ecause)k Fc(Element)p Ff(s)c(with)i(lo)o(w)o(er)f(n)o(um)o(b)q(ers)g(are)h (presumed)g(to)g(b)q(e)257 1507 y(simpler)e(\(this)g(criteria)h(is)g (enco)q(ded)h(in)e Fc(ModLattice)p Ff('s)e Fc(fillOtherSquares\()o(\))g Ff(metho)q(d,)257 1557 y(whic)o(h)i(calls)g Fc(Element)p Ff('s)e Fc(addAlt\(\))h Ff(metho)q(d\).)16 b(Instead,)c(ev)o(ery)g Fc(Term)e Ff(could)h(b)q(e)h(made)e(to)257 1606 y(compute)i(its)g(o)o (wn)f(length,)h(and)g(length)g(could)g(b)q(e)g(used)h(as)f(the)h (criterion)f(for)g(simplicit)o(y)m(.)257 1656 y(Also,)18 b(curren)o(tly)g(the)g Fc(addAlt\(\))e Ff(metho)q(d)h(accepts)i(the)f (\014rst)g Fc(ALTS)e(Term)p Ff(s)h(that)h(meet)257 1706 y(the)e(criterion.)23 b(Instead,)16 b(it)g(could)f(b)q(e)h(willing)d (to)i(discard)h(a)f Fc(Term)g Ff(in)g(order)h(to)f(accept)257 1756 y(one)e(that)f(is)f(b)q(etter)j(in)e(some)f(sense.)19 b(\\Better")13 b(migh)o(t)d(mean)h(that)h(it)f(is)h(shorter,)h(or)f (that)257 1806 y(it)k(has)h(lo)o(w)o(er)f(joinands)g(or)g(higher)h (meetands.)25 b(Also,)16 b(if)g(an)g Fc(Element)p Ff('s)f Fc(Term)p Ff(s)h(are)h(all)257 1856 y(joins,)c(it)h(w)o(ould)f(b)q(e)h (useful)g(to)g(replace)h(one)f(of)f(them)g(with)h(a)f(meet.)953 2628 y(14)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF en)i(co)q(de.)38 b(They)20 b(force)h(the)f(join)257 2055 y(or)15 b(meet)f(of)g(t)o(w)o(o)h Fc(Element)p Ff(s)e(\(whose)j(n) o(um)o(b)q(ers)e(are)h(the)g(argumen)o(ts\))g(to)f(b)q(e)h(computed,) 257 2105 y(deviating)c(from)e(the)j(order)g(in)f(whic)o(h)g(the)h (table)f(is)g(normally)e(\014lled.)16 b(In)c(most)e(situations)257 2154 y(these)j(metho)q(ds)d(should)g(not)h(b)q(e)h(used,)f(b)q(ecause)i (they)e(cause)h Fc(Element)p Ff(s)e(to)g(b)q(./docs.pdf010064400125110000346000003044550724107032700135120ustar00dwassermgrad00003010004401%PDF-1.3 3 0 obj << /Length 3263 /Filter /FlateDecode >> stream xZOS,r⪵"%ɲ! ܙe[dm%9eAb3 E/ s],{8,{offseweXjUQ‚#m'hM6t3ta˱wN`(Y! }K'3VI&4'v@ 5ؽupBHT&9 285մ=¢78?m`>­vL@(Na${OȚܾ=3p[((0(U/) FL_94윫*%G:YeOQݳLxO`~3U`EAny 6T<_QW}Q9匬6$kXҤͮ O^t'DvXaSyD5ke ^KpvAeFk)9ΒT0a<ԏ P8bD ^VkRzOIOl U{H4,t1֖;fi L[$4ܮypr~TV!Y]z,AvVu[wA*m3N2[9ߴ'IuT U D ~o-&42- bؔLܔ~)x`*ƕͨCLjT܀\4楱]7Xp%R*Yi#<y>o-F%y iN+/Nq=Nps6\-k.AA9 <Ų(̓Eh^B$YĈ5V=ir%n$53¯/{0]ve l=jV J'st]7SE Hj{^ DG^^}qdil%<_X`HR-){I~PsÂYLWH۷w8@7LUuߤ߭nYY|+{]0֡"xVMŨ!-,(Y}UzyzC-z56AZϻp:#X6>AOVWt! M2ůEaKl%7 !S;'Z{ S^Ot9WE|*=oaN5Z_\J} E)|ݎh!ORj}z3"brP,j7k=-|8 La̽ĥ{aeNEdq .<%ѿ~I̩1e=,Rr̠^&n"kڟ-IsDž7.}LUFis_U^%V]h>[Z hV2.af q3}V21;\%SpCWqsfnߋ6IVh|'YV~sD:2449LF1ʵy TF/Q6wY(Qc56\RU,>^\l?fB\_OUGEYl+ #eku~R&yۤtiSqԹD(݁=BjNwӴ$6XDžr/!]!h@뽬{⇝V"H{ UHQ4+uyhAz~k"qOP4STaW'ʍ(7#Bw,ޟ߿hendstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 611.998 791.997] /Parent 14 0 R >> endobj 1 0 obj << /Font << /F16 5 0 R /F8 7 0 R /F11 9 0 R /F14 11 0 R /F17 13 0 R >> /ProcSet [ /PDF /Text ] >> endobj 17 0 obj << /Length 2777 /Filter /FlateDecode >> stream xYYo8~[d#;^c^nڂ.h3Q$U,V}uIJQ8]L]7عyczΩ,.nhʿ+EIc\\ S2KXΠe;҈ U]jk9 ;,z>N}[(榇mg^:/'C<. "\^r4{9ȯ)DʊĥF0S} nj2잢)|h;iֈ}N$~Er##4P8'*IHe =C|Zr8Jk;r{Q@n@ ;oʻDޘ9m/t92kgX U$IY0̧|+CY' H}q3VQ 8`N6Y(1C_)bU'0fSQX7O(W~$Q %7,s 2;@X{V+$>Xusk:Ul/=(J;g9gex53wmUouL~ -C~}BܗC~(hCUE3O+>*N2a=dZVL9")Wϸki#@:kge x)|!%=@[Z:R!qеmUf[рZBXY; Yx (#[- Ki&7! P`DIٿ+zQi+ @iN0z-G;G!&gSu~+ Ҷ'춪śt% T9Ū((rfC| 2dWHV|S> 9Ԟn9#7[D}A?u]>%d8K'X:#LCaoyPp [qysiSb@Qc 1=9?qWσkMT/Wz7nSza3*MvQBtz(K<٩ -'gjJЍeuTj^g| b؞!Z93! HrcО { o9Fq"ET2 0cB$Ϊwɽ@W42Y2V!Lrb,ZM o?W9A^u #qF/"q!)tFJ9̗)˅>{'LS4d&$Ir53xeJ̏UrOp9UƱ墚8/έB19U\S͖pg"Sz^f ,O0SaQRcWk-)X-{57SK_ LaJP? LA}V%qE:xѬ2台P_8R8BA[q}LXWsp&s^m\1F0(Rsx?ڝ6 4<~i9gnC۶E %9 k x6fiCKz?@4percMv;udd;~3PYy_o)gf&!7ټWM0ޖ*LNVfpsEҎ dFw`7k UH\MćPdt $@Zjei>W"yрNf-:ltKPY#eFߛaY<7F`Ȅ3+B2N#M1׃ OQLT:8 ޝQ.hMaǨfNal2m0˳ .4)᠁ X]6ydzz`.'p^~Ay+g(Ԧc$?v|dחxΧaŋeN)\-I6cz@T {CJ&pg]lfKUv,VŮ^J3wi2ːS^m?k alK8۶[,j֒ZT)1ڠ)w]%OX*6N- -;O-fk߄g!Ԓt)R._tڤbە\7Cbߙbm7ލ>`9!}?)TdҷpU$6geuEWrקw)D  ߱!lAřVnxO{6FtzDējhc{Xa41Æπ@Yv\)O¿NlS6LpY><^\}U sc9a c 7o%Gwendstream endobj 16 0 obj << /Type /Page /Contents 17 0 R /Resources 15 0 R /MediaBox [0 0 611.998 791.997] /Parent 14 0 R >> endobj 15 0 obj << /Font << /F8 7 0 R /F17 13 0 R /F16 5 0 R /F18 19 0 R >> /ProcSet [ /PDF /Text ] >> endobj 22 0 obj << /Length 2748 /Filter /FlateDecode >> stream xY[o6~_Ϊ1+.St-ϰE>Y@e[,e$eYƫNMQws(bWRkδUj2|wBބˑM{l:Udٯz ْTEއ,=/?y[TȻRѲV?nRΚBa0>ԽrV_[\ hq‡ ~Zqq2i*u?n6nY+wm$gz, `l7_tG_W(˘ǵPGܺ;%)߾GT/D`loE fL5F-`h孤kgB%R!i:4GjK{\;jU kʯ~FI2KAf&zr!V'\ D|"cKgHoa(0_ʳɸ'؍O|4ySp:Xƕ9& 5 /w-bAڶMc؈1{(3x~HAzq:U6.[:I+.bt[pTZT*~|aom(`< 3+{ԭiԵ @a3a D4K^ w37o?/`Wn+vd0(,b sFD7 5c8Z+%'9 Q&bٽS 7 IEZIVWl=^ŭ*;y1hb!!@MyY {8L$jĩ(+$dB/AO yJ6/fdD$aQ>,T\W EE>ߋnԼٚ"O47jd>D8MKﴘlA`CwƇXY|,,4|&* 47]Jy%R}O')X<{,S LH̫~i<E@0>KC#[[jJSjv( P3TB@UovJ|]N|qױgo"S"4x3ro PҘ 7/CN0So,ڛhsF쒵C˼`Hd/RI Dl۲jL +([u,tM'RܖD",ϡY_~sYMWz>˄En8â.$˛ XQ;4 IG6;ѣ~vK=` Æ܋T|1 L}>؃) l031- +cy:Wv9?ƃp5/oB6 "Ω8G3ذmոΖӐ)>7h_e&SFE&Ucjxh@ZW?lahl1xީPg [BDžAOcK2ZѵvS9/I =*/ZlNt7SŻTw5s/`Gݠ_ }_ l!?nřR+{D[-.tsF5t{A9 =NR1,-VuEPuDuv= b_! 9?ai<+oQ7 ܵ{SX!#[6o 0QbRWyr7!;oC@e ȹᇢS20lt_N- id{P{3Ƒ&)WN$2 DƯ/*Ńg P.w]Vnx>|սs %C*\P-jorήB 4cv1}tO9}✤yDpj&TDq $T K"^C^3spMDVs, s'oޟp/0^endstream endobj 21 0 obj << /Type /Page /Contents 22 0 R /Resources 20 0 R /MediaBox [0 0 611.998 791.997] /Parent 14 0 R >> endobj 20 0 obj << /Font << /F8 7 0 R /F17 13 0 R /F18 19 0 R >> /ProcSet [ /PDF /Text ] >> endobj 25 0 obj << /Length 2958 /Filter /FlateDecode >> stream xZKsPtɖm;9ޡC{Chk_|UjZ8&bߴ7qλ<+bꔿJ2.s}swwQmӏ_յk0T̾d)VdG/Y:O[\X&"2qF]6[mT4c(AVA0\%@Abs3c!|Yb5kxi<&t!&#Pkq$%g.3 7cO̴}ZYFVo|ED[l!U$l{#j`$CTH9QLxfrѠ4&ꓼUO݈agzb҄$VUF9A[=ՋETUDO5U)xC/`7عJ(¤zy E}n8m-okpFAF5+|5ӱ @ #Asٹ2bhlnsOV#{/5Y{-d.[4NF5}tc C\3m9Wʘn\0P$*j&cҴq ʤ: }#CÇn4m]])oY wǸr)i:?)B[$m> 3 J#)6:*`r?I1@N C%;llBltMypfeH_#cZry!dLʮD2{p<"ۓ29Mك=94RJuPUG Y#?~84ٕ8͇'St(XPd,YrZ2GR xvxb:2C1SL+N#K}aUe!Zܒqɉ aq+Wu(X,!Tϕ%3&sƦgGe"ɸ\D[|3/B4t/nzQ$._p#V &#s+ ),r*Xd\dO{J&e UN}qGHm?!Zj4rr>=rՏU`:ⷪ 0sT !JKeZeļ?xBr)fI4/jdh|6RB"}Z@fo+XN%LSWSD9Cќ k"Y HkJ {νv{d A">h -MbcXUoH:tlM2"6 -2_Vendstream endobj 24 0 obj << /Type /Page /Contents 25 0 R /Resources 23 0 R /MediaBox [0 0 611.998 791.997] /Parent 14 0 R >> endobj 23 0 obj << /Font << /F17 13 0 R /F8 7 0 R /F11 9 0 R /F16 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 28 0 obj << /Length 3182 /Filter /FlateDecode >> stream xZKh$i(R6,0AI9mYYHߜe3hʁ7сz|UKO)Ћw6TȒ_}+Ƚ'o46*7֮o󟕇~Q$ eֹLeTwHfI0GJ{+$uOPc55=,a=Jjwız&NP1ppO`lXKlF #*q]\t`cX}ǎ<7VC{ q=Vu4uL;p~_%is?M 㭈w! 8 vʗB379<UNVO,ib& )< Qx kp|0ɩ&ɭ gmU EيNAL2gYfcJ;6Kk` =A\5y"cwO$M]u&tl@Ph=WC :,cp^rh,rЎEH&8Օ }]ǘHOBEϱ*\dž "aU,uV \\ex3$$wCb%ʺtC 톳LdN@E0V[ve\,p7āFAlG,\eq7FZ$ΡxYfYgϹ)NK%,lrc6ԕLgF]5u6 #4w50 p\ tZ'kԽ~Y@ڨԣ*a/D\L}CXx"&EY); ,_8d (~Ұo8ypL5/If\Ch ٬(Ny%mLN~'c8f|970*`QTYNVOs_A,HiE<4lUBL]Y)+by4dI%.bF C}j-Pshr;*W8{C.U[:Ct1}`\ff99FNh0Ԫ⬫_j"-H*<M"RAj1Oh*^15ﻘ{,^[VDmm@KjDg(!)`UM .U Rl' ߫: tW't lK g@yiHS}C b" *h|7/j$p|@d`r)K0UJmOqH8;svR~cuΪM#Ծ)zNzXѰ,6Y&ⱭA/ˀeF_G¾V:W?_bBdQ 32P ]\qYy~`I6TLw16A,G! d,a'emUmwO4'RtzEi@izI$2 y-RQbb8qH@8[qEf:AF};W3ZhFcˏ?ru=yMY.lA#@EPvk0ݭ <Ք: O]P,7(ݸ.۝e-S,#QE caa,AL7~Z >?6Ά9i a |u:[ lf|-oJV]O~:N'"r%DVފ:լL ؟Al/k5+K$_Na#&vY`ҷաp#^sB9+f!Xy^1W:$VDS.PL`C&S %A#x0qR.<6spy\\k F&Gǽ;^T.3;%MVz$uO_@} ?aqOJ"U^hl9C"6j]t'I oJf_;G9;ߏ&T%@|MTlp](sQ2?#qJ0':>шRI-]`[@u*66X<>6c`ݱ@X,|_1!xx 7;+7eǨvyq_J؛@ևF=MsyUG5@ >>?endstream endobj 27 0 obj << /Type /Page /Contents 28 0 R /Resources 26 0 R /MediaBox [0 0 611.998 791.997] /Parent 14 0 R >> endobj 26 0 obj << /Font << /F8 7 0 R /F17 13 0 R /F11 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 31 0 obj << /Length 3341 /Filter /FlateDecode >> stream xZY~p EFbEFJyɋ;cDrw]$ kfuuׄU_Uo|Ml0MbPi}o^|{։wMŲ;砩ٰv$wMsѰʬVe#`Kk9 G;k Ѳ)U[M h<6)B%6xa "cߡQZTfΗa8 +& ?kH;&U]ҭB|ʘg+A1IG$NhѶ3Dϊ[xt>(6M݋Z=԰mK%1X=o}1< %k G5k$8zW_\9#=Fd)t'AS| wDf)Nu'kQe yym:Twe\AYl1?0DhEbIBu]YBn ^ ܖ`n)k?V.T>.٬i%3ZhӗU!v-8>H0ś_Qx6G  $^h*U<cw*N.Cdg "2f_Q4DX6@y^NsMkx-6u9^cLk֏(oQďҵ!qxMmcm(D^}4s[ 8Mk%>a,Ywr){gH y* ~rJqSb&.SU(E}3`vlpc9^#lƙ Fsq%dq i 圆^2w~X̓M$dH2~q*Af^]t@ {5q\ #`!ջ|Q4M kB )s 8xK͂ pŴ\ h $ J9@b4#*e;[ڢݑKI: #G,طDA26 #3I տպJ~v L0UkcxT2M~AJ8|ۻE̯^,TR"av[x܏#'YYֻ7VM!a jgAQs]M:IeړL]L~Z2<("L $rn&W=@bW/ڵ Y@'d['X0s!mOּ!x-E%$pwi4<3j@28zja?FȲpڼ񳶌 vWz|Uߝ;YA˳I3ϰ(E@!%jijB (ݦy1S,c+ɩJ(ep)eD׍:W&ΈK|.\ӂsC$:SIpi);##E 9Њ&p-ig(:byҙfk;`jwFɘVGx u}9e]{ 0R⾑SfCO-%АddJ-lcL%DJ>Q T-y$?ň0T7Z{dW4j5 I˙<ׁ+ A,@M_JA6oM0HO+hr=?{d/j1%L"qNY6%dsH&y$K(dd(ƍx{؀ 'ja8RGn]&qɘnlh* Þ2rH'g׳ֶ0PpˑڦDĐz69Uhr=y]Q@ { $W9!g>zjkQӇg2--!8%S(U /ކ3endstream endobj 30 0 obj << /Type /Page /Contents 31 0 R /Resources 29 0 R /MediaBox [0 0 611.998 791.997] /Parent 14 0 R >> endobj 29 0 obj << /Font << /F8 7 0 R /F17 13 0 R /F11 9 0 R /F14 11 0 R /F19 33 0 R >> /ProcSet [ /PDF /Text ] >> endobj 36 0 obj << /Length 2096 /Filter /FlateDecode >> stream xXK6W2"g{)ƢifomMB,Ƭ gޠ)|0_|Ϲ 'oۅ"M$Nf[?FJ΂[TtZj((20 vĪLvZ~CĆ]Oʊح*STF0%1t̬):NS؇ODIܺy(ӚڔIX2Y:rTlv[)VBE.tI'@vql&0Y'b][c'VVIk 6e*E|?.u,d9nKV gBrCW`NS:UvYc$5 =>++n5--ڪ4.K2ygX72SiN;o-*jG sM2BwuEsV'"ɋWZ6V<9P|6| ʡ,**OGYzw!E}@B[4jG?mDۘ' D%|`_% z*S7@m*gp2!VȯoN^S7WɅh0Kʧrbkq^1ReX$^mNև$ d;d*BQ@1-"~u<y hz -122ʵL!] +}M񋹤ʷN,(S֤J񎗢1*cnz jm}߰څ9>ݦD ;d'epat|b. =e[0#5%8p0-wtnf{n~4uD0тh8#n+HLcq(!{ ;48`(g5Ipb#%7o9s~¾ CvвND"dYp>A=M5( K)FrH%^Cַ5诚"h:.\XIl8xaphP!;X2 thLӢCMꡋx+D$3drxHٱqakt“QE*`PeJ"qƨ2)Tȋб=^_3M2fk3ZЎ{/(gs_SOYhw3U"TJbK5ђ86ZJ;9^ˇ5Ofpm¶|q('-D ? N)*ϧ@nH{0b:q0Fl!^Oq9W;0+{lclꂧcRh*|tyi ]G*EZ38maL6Rq],>\ntdlMu M:\/"].$hS#=&[:1 dS+v`yh'ܦ!N r[[`8we ͦC5`PmQw{n|4 f6>mc ~Z(=7j|(:hO5³e!RK^ aBBSmMQ]Q-"*9<#Ck#{^DSR9e$Ōc%^G~0-"9C= 82> endobj 34 0 obj << /Font << /F16 5 0 R /F18 19 0 R /F8 7 0 R /F17 13 0 R >> /ProcSet [ /PDF /Text ] >> endobj 40 0 obj << /Length 2587 /Filter /FlateDecode >> stream xYKs6WrYN!>ˊ&UZl@ 9&9*~1HJ%[. F_߃+HsPZ_o~D;ySǘlQ=l2Fʧzo}Fhㄽ·t#72靌4wTЅvmYՠ7+͞aPTUn6R:tT^ -H <54@!i&L,m qU(2% \aLJDk?c׹Zr#)"D&|.; `&KM II:S #uiޅKwm'a~~O\Ȏxk𼿌"ط6phx-ܸ&"NBO}\ B*LƴyJR̈:Ӊ﹵<m -`Y \eSݨr^/!)B u%pXH YOd~b׼g1qKιú0hHMn+?Q?h뀅۪83*)a݄!iDkz OaeWtW{4Cjvq UR3"EYMՏ,#M ?jP@c9 .CP)7!Pz"JfG?sV59oqjdQu@`s)7,Nj޳JSMcJõZ9:96RC+(2a0> `kk\'8mCS+rgש߅,$j+NX A›$ˣͅhL6]~*w>xdWS!p__q|ʩZ}IޗChyfWp0y槒ُ(#"su0/5 /YC&/qF"Mfp[dG1z%Rfb q˿}PGD K|9打e|i]ܦT4$ 13snw)`'4ř>@\dJ8)),G\ބR-!tH:"7%`7vLC<˿M5D&{v!Y>Wm^ZʸRCH1w*cڏ9RU ֟B(F(eg" .?WGґ,8}Ŝ67kYRz?+5.gZ,|ڌ6.Qۂhf#_怮3A5csQf^c_Ol1]M $fu"o$>j!`e.G$Q?n\FDUE-JT1z 5On+В#՞RAhBXo F:\c4,D tp hzDK9 _/@BRc5 ߊu}IUOI3Tqݪ-Lb%>ӹgeCnPVJ/\y WJ jeF<Y4LF̛Z}1df9@OW$ɳa3HU߮!k6BO+լz/`uȽq1"@wVj.P^ :2Cu)hQmntZW:cۢ~~[Y5 " K3Ac=G[.z/^A o/$FOtLdL D@_eÅwG$Spx׭4fTMw[_=QB N+/4>Vnyq?euXޮbY]8Kx *=> endobj 38 0 obj << /Font << /F18 19 0 R /F8 7 0 R /F17 13 0 R >> /ProcSet [ /PDF /Text ] >> endobj 43 0 obj << /Length 1626 /Filter /FlateDecode >> stream xYo6~_aI*VMБ ^j`(R-WGencg+F;}w<(q؏rN2#%5a'WfdU|4՗3'?yZU.Eҧ4JqLz1M~}sO2Ϻpc,sR\D?9'/o\.7VU8cϣbL wE ꆓ */]ׁ4.(Yq*MhsPQAѥ#*b3JC ya`V@?;K,q,ԔyrS~az&2q؎-$L_cT4/>fMi60l@c;! c 2]ђ/#"!Bb Mٱe-Vv+/MaML=vG!TIygKEâ,L Ϡ{|Bby&0O2ُQ~'=(]ꡱvu5IT",WcXeVX8feZ#mNˏ^Vn cP){LogXxPŵ"=Z0 MD/Wˆlԕ? b[uQ{H0Ȏpd|oSV>FtEA(3*r ~*r aZe6͢Z #J.yF#b 㸐ӯrkU2ޮ3F)hH ʺU?+NM3+ߏ~`q >֝nb_~R.\5bꕵo^w$ hxaD4f(l8|;VDML:m XD[. a{zڞf0P -ڋ(>ڔPguAƎIrD]< Ox;0QwME`u˘(rvxx#Nw\nƋ=aa;?OϋݜJἜi A=W}asiu'[xw$OTGp>)sVc%vu>]m pyvKrK\w=v`V%=[h~Aۓ,ye_|nnuAS%؎s&R~S>%L|@B&]Zou:Bp0bB?ꗮ!!&t, YktWtEgazTPG0 b)!dWU;0`Ϻuv.zx4Y7 k˽ rzBDl%+@r_M յݯ5,ca=em:eƥK֫9NyYӥ)G-/^u,Feh&0I+:4QibNRC5' =𨁼۱5/&ߎqmtn4_bМ*j7Ǫ&ž}3B!ɾ>j_tkN@}!U$ne [ߘ,;IWQ|%WDt> endobj 41 0 obj << /Font << /F18 19 0 R /F8 7 0 R /F17 13 0 R /F11 9 0 R /F14 11 0 R >> /ProcSet [ /PDF /Text ] >> endobj 46 0 obj << /Length 3735 /Filter /FlateDecode >> stream x[[o~_aIxEvm HԚiyF(;q$Ml9<$%Yi, %^tx._ݶ_peX.J&۹X_ ᔁ2ߘJ6x5yw^׹(d}nzk2LRclUmz9 +xZ Uz]h6vk߸ur>euyQ</Dap5}|dxozΔoKV0i,pf&757\JyDS` l]ܨϴaTYuCR|z$?p}^ޫC_|˝/fV3~l+%[Y>j8-f9f^g'*iӠw7 }1YFOj2(ڬILnڐe%H7D7p~5իR el3YeHܹkncV]5k>WCo$ܑ鑂{hVMi(S|sx 66󸚑ej{8**7>tA+O_#A])6=D\ԇ6~vA"M,j3kK:>8Y\fN]YRF/^=sa%TYըvGϪFlPt=6yHPyO[nk?l[SgW[*+Ww5qn4Cw-MpG  6(}k'Y^v#^~ѣ‘>qѓzm(҃:zhha!t՞ ܣ_E64;k?!^}us|.Uej]ϽM7/-$UL -6(pa^.(M ǞvXSePnVJ&D1j9|U2.1_6mm1@X@@lxFpbĜA!a8{ TPxcxoS 9$&$x6{^PHDvB) V3pB@Q(nol.ymbKلEVtK4n[T@vV*7b%fK#Z.y$SLf!/M\0^$-SL0٥i`\ᘡ73?n?[6K}K\y0~dɔP|5U7Ȗc@O7{T'jps+%irRa0-bwZy[ؓ!4\LԞi3iK_c CWq x-kt$Q9LA!h'{~v155m⦉L((TSNyg *2B+tR!錁TrJ V'; Ȥk`'Ke%>cb.3j':l#BZEA QhLP$E#>BNGofGɘeژ <ܡI[S ศWH>E>],BpHJ0|d"]3:- aR@$m x݋ ypkLh>-HCѣ iő)޹ΥC`?նSs.pMmSIۖt\]v_n~dG!x,+8wE-1~2=VƯBp(DzSz"Wg:9I-XCfά%yNJXC{1HS~A1rb:$*}CYlhT~(KVdtX nwpdt1a/uW }E WqygG~3-s-\Ppam W9u$#3Q@.OKN^.3mT0q$WLD!jEbːy%.Eɤ{}qk7K"d5V:N M@:U6&gA3ityxQP^#H(ŅK'N])AInk[ Yģm޹Qϧk3/0ڢ\c}8 f7@ Kҭqfsn1׶+GhS xDDdzz  Kim0DX1* l@'ܶX{Zd=_UˇKZ}sׅ@o}eoʣyujGy㶪l/]T|"F!C`CvXSݡYfq34Q[Zi Rsjfy®߫'/Ny﬽NWLFכp@0OL&{=X"Y+X!Lg ?((2@ByUt xJ4Ta%;auexQ|>xjzoƴ Yţ)XYg#NY{'k}=U|mcG"bB'iσ}( mLSe9eɧp3'Y4L(,Ŷ ޼^H 칩:8X36+ۢROMtGT^Y Ǐ(6SpPޛR Vg<ĀT& q)ڰp¿NsDC.TӔm:ShF!,om7GzaQVҀb$aǺ3iT_3T^i _5'WR|#)jC"BAuµ0A/N&`1jZ=u}j+Ն,;TX">uNg%F^XNeǃB;82/F#Aoٷjx2b~ƈj4W.D(ofW#&nhUH$({W/؂#)vW)3]IZ k58vp%s& UG7' ~WcsG@'vS>UL^-30 ׇq]HSj}:g-39jfXMO2J0P)7Նi]1O;嶨^G]=r79acBủ M@sLc/_'ut_f܄O(RNlЈ#+v > endobj 44 0 obj << /Font << /F8 7 0 R /F17 13 0 R /F11 9 0 R /F14 11 0 R >> /ProcSet [ /PDF /Text ] >> endobj 49 0 obj << /Length 3488 /Filter /FlateDecode >> stream xZKㆦW-*-L<@\>8Tq*\Vrs`w(q1Z>@r3;rTZ nn߃(& 7+loi?I;]̒*W2y2]-zD&cK 4 dB3[w~jvY zh̒؜{YLt<)=Oq&r=]I"ЙT*-oiڎVV%W#ӧ<ސdX JY`NP3Y" dUWݐq+!'劇t{& v?]P ]nwđK_TLjzHat.;`q[$&6E9V4%fg^MEL;.IȢ{Y*Tt.SYw|]L IQlG@Ѹ@0Yn`r> {+LP&MY,~"fZ$ư79z0Wqh+dd+.r]6 ֱ?%R39@(uhpS@'Zc4?޵?Q]W2IiSM-K0::o%s0̽1jR\CR<ׅྕ6sjVfKp@*G]{Źk9X#jz-SkDŅtxkH9O*c7#^s:-,PR.32e1$ %LEh]sb 'jJa戙5n:p"0 '-%<.$S+ExԤT¯=we'c4Y7s҉ n{ē垶]bO&p47du zh*k t]UAѧX\ [o^7qnB l_~4iKwkO mɧPEc?UǺ/=·-/ 1).c,l0׶ur Xx0gɒ=i)wɖ-: žz]Wkݿ.9߻_=xUZva]Կԅ'kzɚ-rU;<#_()> U]kZeJ4k-[*,F&m=qҞ~8W2yng ai{7pL@)9-1)Wx+Br!#bg;9K1"yLADn)&Ex,N" |lB+xޛuXx5dYOf.N(=G 6YDϡs)pzhѓ[ZcEh+B1m;{h6'|UDPT0LyM`~oSQ:_Gv܅HĕrBpex5¡W:BP痮 <,5v{`2!N EjD8@~ V$NvO+r1)|i+i*br`-{zkSJ5vԑ 6?wN95]Wp.B.WܢծlZXzn%̓Y( ]QXQby4OާtU>Rl )B&G kV+5Tg"ffU1U&ϱ0"*!(q^6&ex::UO}9sT3kඏZz[T̫hea:nNcj"χcŏ+\3NIR&W:T#l 9=! :dT(u6@Adڌ:r3~҉yPx) S%$/*;S=Az%ɟErdS.sXT as=D^˟Q'i@/? dnzMZD䗹au:N 44UfTp<0X延B S1T GiX?~9{/)=pHk=!*2EvY==& /EAz%4p(KWU,깊dpٛ*XX63Ɍz.^(ʊ+MMI qik`kOppNKB1HѕCI!)8S *|e4W®Q*\&|=r^(_]9dAǭDr@ aefː%\+n*ЅХP(n4&G0JacO)BW5%|6 1kC29Y$ѮkVej?Sn2lA=TT.Xr._5EmL}@`o9Mmpts!E.z<2ȓEF5ڐ֐ ͖ |jsڅֱ@iqo=dոa}}}tRTқ6kE3#2U|eF*| )bR 0ǒ n'h)^~gsV< Yzw5/ë@s;q7J/sRB =/}܀n;`)~!UV~7pDZ8琼 BXf"e38`q@v˄Ǡ܂̂d;Y]dR6ܗ?-JRy!bBde:8ۤ3 3yE>i5@z$DF!0mCDtso Zْ*{H䗢=@bb/]Q$;eypw#Kྠ?endstream endobj 48 0 obj << /Type /Page /Contents 49 0 R /Resources 47 0 R /MediaBox [0 0 611.998 791.997] /Parent 37 0 R >> endobj 47 0 obj << /Font << /F8 7 0 R /F17 13 0 R >> /ProcSet [ /PDF /Text ] >> endobj 52 0 obj << /Length 3523 /Filter /FlateDecode >> stream xZ[oF~_&٭٘iMJw6 xוU ,s\?PW)+eLҟ*s>\}*"3WyccSpג짟䶋&K2eR>fV_kou~sw͛Vm:yA#{-{yvg 7z l|]\V*Ke@GaFrta7GvpN*^Uv8z䧒O%R ʯI~V4 9춣[k6rO83p$6>}#@1Ձǻ#߽cw^&1MPH-7U 40eZ9<vvC:6ZZuPm̗ĩKE)oxP~ZS55FB\uyTlW%fƨh]$&3 `a^bȊ|oeI뵚|;]6UyȚH7[>C5$DuEDY)K+p%3ZnjI=>*) g`.Cu|dVPh$?Se[#mC[ӚvϔKi4^a w&q@b/cSuͥw'xA+S+Q#gcՀڛgFG/- d=ӏj8l) @AGoǔ)VƖ\$-HJHEҦ)x1&;eP4Y2\N 4pz*wpCZپᛅJ.O=w͖g"3{tc4A =Jv*?<.Zhxˠ!! LC!,nWY;v !RuAN_u,Y-ϩs>/W3PY)cgxŤl&O~k];?TEӴV˨]S  Dsu,zŏi$<ы;Ϟ8z?2 WcMPgĂL+bSLi;#BqASєdns&i鉮.U4{JȻec-3ȴ\DCd6Fh<3 [h;gq<, Ӊ 3%2,ev%ն2 ؉md]a&!"%x1U9[jRW]#ehʸ4tfxޠX +#(t6K Av]XF#{8Eِ¦hjWapnJerp#crn+Qeis5;Se+.(v*x@ h$2vAqy-2>"ƖKO9 5VQ*[> PeTj5ѐ Or {zU1$[E膴cϗ4>$44fn+ele! "})) Ź( fމ=) g˰7AjmIB7箪7ylNZdi`frop>Wc8qF!uVO<NJG0+)]t_IFM^<:ĝlPw'itaaJ)Ogk*"jS"8ڰĀ@jż͍ٚc`v TA9eEVL m"p.,>O\:y猴ͺpr dEz~L/#Ә 5i}nȢiK1 CG{3fWa3ylXvZxFMv>di{g? 焞16f[,_I3\4~]D;!85O!b36!=6byus$^Xr'nXƎP7|u?V~[gfN̕%,_,$oĬ(WR'jϦ$/R[>sRP ݇'jQU8Xt@^DBĵ]n9&GYG^>r娓#Q3RqN4ƽtD¸Jul(PfjD] t츹__>ۯx(#_?!H#8ib1&չi89GM{0pkyFJܽo?Aendstream endobj 51 0 obj << /Type /Page /Contents 52 0 R /Resources 50 0 R /MediaBox [0 0 611.998 791.997] /Parent 37 0 R >> endobj 50 0 obj << /Font << /F17 13 0 R /F8 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 55 0 obj << /Length 3034 /Filter /FlateDecode >> stream xZIs6m!)[W2L} 3۬pŋ$-Ìx•b*,nuqW2wGpw]S ̔&ڧOUK}&:Q5bX?؟.-Jpa:PK8a\Ħjп&7Muw6M.Gߴ;\Iӱyjwg&i-Oxu nh0\oWe2!ӕ4:oq}kf,k\ei L%o7F?xXGUgmnb `]LU]FcGb꣕jt7oroRY"lHo3 d>0*l15onupKP$I 1Qرs}Turgi ǑMtϼ iBYj>΋OIǔqPQ,NWj~;m ~㏈[8 '6/x39p4V Cqi&Lu9  k<'l yyQ7W^&ys3 4wԀt-_UOf 4zmy"CHpx!m*E;0iL7K =HIG+$"HeZ--OB$o?rB'(eW=)ZsM>mp, ӳM6|{  {,sG}Fiӈ>C%xR-FdVhVtmCHH kLW `$c[2/\c L2{ ve QH@f ~q@4|!Dx1=65(pj񏱑>FZ heWȞ3.jJ%ƾ+sb|PG2LLM7@G/"0++*<-cxRlwZQ` Ѹ Cٖ$KGB' z~l6R9 o0 Ӣ ٝ~ʤʟok'?/tpOq}jY^E?8X**N>I 0v5!djuj  j[,쨳R" EGe1|e#zy,6R:ai/;74- w (1k|nEݕoD^ &*ʰDÀ @^J'wvyvo1_#H6pQ߼El3&g{$K&7HKdͳfd:Lzt"}Jd @/|sy>3jYqŪ:Tg;> yS\p50K4j$4 W0VWyMMJ壏-4A5]V|f F[7yM.n:שQ}?6+S%sd V's~̂7a1^^¨?#gy7r I$K3{G%j.T1@:[Ȏ$v4/75ܞRF/8;z*OÎM'0 ˰7PzDRΈ܇ZᮼuyfҏH%lg^^[N3D>h[ei~ulyNr@4ڌ4ю_L 9ˤ%:s#SK0Do6cO{;%6/1C=y,?f^D6KŇb\{N<ߚ*VsnL^/tQr!=n{8f~b[X .뗻SYFW/3CK[; gacqlyl:is\븳ljբ
d%U$<@^´9]?"U!=d4^_:!^ 㒜W.2{/Rܳ\ur[ [TtS#X~yT" DʪL[7!!+/oϝ#oyt\ @\ߟ1L{M z-B$a"_d5Zφ%E!Qe" dXm>õ^?6 xqSGQKE>xzh"T _j.aPm2NaOHJv52TbOWˣ!#Hg)+F^#=#T"awvT`%,G4D.(ja1`B!ɖ]~x,5Dlc$ҳf(&»)DFaQL'|bE*_':H챔|`OMPIdbQR:2=; p^Rm<-%?-S}RPFPscdq",*cxq\f ,ӷ8nbc`$Gq,ߜg]#[>ѱq+Y>> adAwƘ<ˤn ͐a-OTJ̴֤O> endobj 53 0 obj << /Font << /F18 19 0 R /F8 7 0 R /F17 13 0 R /F16 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 59 0 obj << /Length 2736 /Filter /FlateDecode >> stream xYKㆦWlN&@$s[;vY)ȓ*-rgcBrۓOKZ%3xߜkԼшO)㷩w6ICwo9̆w4Gݔp,TPt|Zki0ȬR\ByCr:u#ʌ8;s{ђʀx6S#jMZoOЌDK܊ sc[yƻUA3-uuT+Q2USWtjy('ʀ, pO<W:s_4\MkP#ld-2O\I8/y6T;wMS>G WN9VJ4Tl+: K-hI|w8 <拤e4*q;R,N.xͽ(ň_$3%c[Å %j#"yN0'uQ$]]pdo&ujBe(T ec1!oGمKv_Ijjy뾷3q0N$A1:ku&b.pnj𛽌?o|d;7CS?&PLh(ʪ=:gn+Kdjڽ5l-1adWZ nש.w~&q$I,@=##&ܜ׈0=J78{ h,- _\qK"t!s^,n Fo)T!(B TܜjY.wBg|3w6djj]a#\F phl̝dAЭxf;@b-Q @AGxh\Tt0\"SlEjlgJh!=vzH0Ҏ*u@zjTe2Ksb(uqɯ3|<ѵ1AXiAJ$b;YoE B5llFQ\7 Q6y'o0ZyJx-| )J^mƑ"MiA\OimH"$G"%b<16DGnUư?\5648:aٙuu _L(u;M)`b@0{l\ % <$rd#!0FݵjdŪs[hWh9~M;rز5@[ DQhZB諫M6d1bWQꙌ0V8xHq dy:O> endobj 57 0 obj << /Font << /F8 7 0 R /F17 13 0 R >> /ProcSet [ /PDF /Text ] >> endobj 32 0 obj << /Length1 802 /Length2 1428 /Length3 532 /Length 2010 /Filter /FlateDecode >> stream xR{8T.L4H<\qT!BM҅kif0nviW;))=n%DFmt6%uriy_9k?{֨֞L<vP1ۥvviHffL!#vhkk ˞Y@: `bB$(X efI ! "<. `8 ׈qC`q4p"HA!(:csɳ"v& MB* Oۼa4֘K@ K/}n"#`a,D`* $2hEY}#"DC LGgg'g/G;י"?s!  D f3  ,ЎW(FK#k %,S)(&x2g}QT_ ɍ_A:liЏ-6ߧ:4f aTGGwbv-+o!nW=v;Z_+?՞qGm"U]{,#)ozaǮ1/zɲ)V=tg?CVl9(Q5kԸr)zpboH94;16 PD!~-“n:%_4z5#/~BkejWߐ+ 0ur.I{!}@&#f~]ȃ~j:_=0uRԗ<AC6kh478XMŸRpº̌+L _D9e݄曐ۏ0NGf6Qt"0I^`R]mQ~4erDЛlUmnM7:m|򤙙=:q5A#G?\Q{'""$=lQXM ({qNiw}rrZW!:-o *[Oi p >ƭ,!!V^7I<(%9W3%ozjtęYzTlhJtꄋdK\f5]~/b{*8z?_H*wwā-F6!ozꊶ!ܹ!~D4~a|q\Kr{zz]FU-R%أ7;7~9pIe)Pe}v=VΧFkt6n*o.k6r;5t71?/ ^XwYHgzT+M&wٜqʖi3{.Uve3SOfi؇CسOsb,+ %Ej*endstream endobj 33 0 obj << /Type /Font /Subtype /Type1 /Encoding 60 0 R /FirstChar 110 /LastChar 116 /Widths 61 0 R /BaseFont /CBEEDE+CMTI10 /FontDescriptor 62 0 R >> endobj 62 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /CBEEDE+CMTI10 /ItalicAngle -14 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/n/o/t) /FontFile 32 0 R >> endobj 61 0 obj [562 511 0 0 0 0 332 ] endobj 60 0 obj << /Type /Encoding /Differences [ 0 /.notdef 110/n/o 112/.notdef 116/t 117/.notdef] >> endobj 18 0 obj << /Length1 1114 /Length2 5091 /Length3 532 /Length 5809 /Filter /FlateDecode >> stream xg<] QF #NND]0fG/I  "Z$z&yI~<Ս_{k]{usӑ *܅p54Y,*k+A@T!4J Ejpk /#.&p<0[;g 2$Iʢ#BP@m h(!TD"z?w`zp, ` uZm(OO(4P0팄\,ƍM^ $ BzapW ڗaĉj.HN:W3F̈?SوSB#أԺ3ť*lp ǺptP; ŷQZ5ae5%E]ˋ?17A@qoQLE([@<8 D`pw XXvmZAc?/TB(Ÿ3I<&iʡ$) M@aЧSDz O7M&\=? ت"68Pqw?q@c+q}pqrq6\NKPw,AqO%1ʫ4@!\*@q$Q G9؜*qoAwC[AjB|Us_^W}S2H8,tym|\JKxy}OmSlbgіNG7WkFօ %?XꅌQyDkȫ IcTAhk.Qv=d0i7x厪@_PZߩmt\³sKPH,s3uļ*IAiƷԴ~mW,-LO䠠o.b=^P.fΒmNuk:e,_Hy%i$F̗)}ȢR_^/[ɱ Nv0ϻ`xq,%`BO4S~F>glVAе)S">cyiY8UI#Xc";gW(2GNߞL"ʹO(3)˱@Y4&/Z4"<u@Hf1ILՓ{5S(CIfg_#r[< l(wr!JSegHcZ :&wqEGM&N71y!Q#V|[gB>Jbn)1~"C7ch( &0TUKx`=ÈnfVRŽAlt!Vdvn>Yܪ!Wڏ'UI!f-O{4i)FB,rҦ 7x]\ĦmU&V 5B4^,Nsݴ* fv:BK0Ddi7;OzBaR8W죫樥ky}$ }fXnʼw$g^?Jnz,@Ǘ#Ŕ@3]FzmhV=tp%!/ݗ㔝l;zE=ѿT\` _2{ҹWѲN*#C p4,@!Zn%\h{;cnb=Fňٞȍ_u+š<zuO IM FJ?@ Z[gd"1K%"ZS%ȾONB|Fp囃 9fg Vqu^0Man]ɚSyb{avUKywnunx(Y5[Ntr3}IyȯLυ,DGTT֍8)?ڙ J2mB^WG,m34z:il upuJ56xzAKzv2W8N9q`y@?ϊyfΏ({ћ3RCllLF#dZ LwE)qܖCMN ESX+* AoI”[d֝2M)Л!1 @K޽v;j]/]f&3%E†ogaO5n]X/S5- ^94jaIU#:R&܌ H}/e>0uY.ۂ8GլMgT U9~\JnHOd@R54GIOzL*rs-e| Ebݤg[SG WWI5[= & Q܂0rTi9^KKw-ҸS NhG٠Ur`ҬRV#2DTȞ~3.CFc|vu2u7//[i7N)Lq'ѹFeĮbҺޥgՈߡ~ױt%ěwWbe>dwl*pb* ~<:]CN /^Vido:jϯaş"oK®Vqe3)R'NႢvtx.gfn+D_\miM\З[$OH j X֎%sЎw6}U@T߅0t[ݜäx~B`zy#'ȱ7ܹK[z+D}JDOo= Fz<29t U=|\mY Wב 2_Mq$ 4]]/VSKO|Z&ozN ilH8ޏdzjzk+W"䥲' < )G,\3o`nztk`m 8?̙F`TD[W;f帑ߨ6S[4Š_j9_)]Wn+܊!*J[jEx{SŠ-jGjbWV>*Fn=|bA||GJv !`AhUNݓdT|f_iPk8O?"WM|q5;}񽄨4lUMXNǴu >k$f 9cLTY~^M[=9i $~u}mӶ :u a4&GZYAَHi WQ($zB݀F*uUUk wnmнt?S? !y4oE>̘0RWl wl,`h[-Mu%tszkVlimc1Wv U< 8~1 2Ie]`5Ɗ`5jΚ/l~7K12T2DNͽND27Qٝ!!ͺU i-*6 x$HiИ4oraچڔ~Y̐bжdn߱Y/Ys E x09txBf>ye}:Hl&$*NYyY+iq ZHG+EWEO 2\ ;ܼ丰 xsl^G'.-2E~@ WCeZNH@'m\&OFaVkc{>TA+]&Ce#\&Tuk2=(b;t\n9>ܫhޓy \c].K&Pz#%ׅӄ;jm;MK{p=kA/,Y}ŦJZ˺(ΞUsq6Ve";fqGꚞ*8:]T5K*Xn0Yƞw2$^I3Z~u0P'i ~:%'e򯙭ldˀ)I~F* ^Y%bH 8wgfiTU uUr,^|U]_[N[jqB)5/#C_wLylި{p#8;G-_i))rhV]&X}GL/iQ|9'` KA]Ꮐ.v{="v_!+~6tbw"ȁ6w1k-~HwңȜMגN_ euMpXƆ]vK0hl $icYXz;+ F޶8J'Nk|2L+~z+ غ?-pǵi7z4]2xT# B6z+1̠y$m> endobj 65 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /DDCFBD+CMBX10 /ItalicAngle 0 /StemV 114 /XHeight 444 /FontBBox [-301 -250 1164 946] /Flags 4 /CharSet (/C/D/E/I/L/M/R/S/T/a/c/d/e/f/i/l/m/n/o/q/r/s/t/u/v) /FontFile 18 0 R >> endobj 64 0 obj [831 882 756 0 0 0 436 0 0 692 1092 0 0 0 0 862 639 800 0 0 0 0 0 0 0 0 0 0 0 0 559 0 511 639 527 351 0 0 319 0 0 319 958 639 575 0 607 474 454 447 639 607 ] endobj 63 0 obj << /Type /Encoding /Differences [ 0 /.notdef 67/C/D/E 70/.notdef 73/I 74/.notdef 76/L/M 78/.notdef 82/R/S/T 85/.notdef 97/a 98/.notdef 99/c/d/e/f 103/.notdef 105/i 106/.notdef 108/l/m/n/o 112/.notdef 113/q/r/s/t/u/v 119/.notdef] >> endobj 12 0 obj << /Length1 1824 /Length2 10974 /Length3 532 /Length 12017 /Filter /FlateDecode >> stream xU\ nn%5 n-E{R)Vek};A~FFzj mvi%Hށ-ǗpspqA;[X Dx`/tz+lgc 02k @ pZ@lAN5,.Vv  ܜ-; rssvV%_]%=\gv0 tqv ktN5XؤS#g8z@@` v쩜 y8"J/]X `?2`'k9Y99ز jX9Ctʨ^_a? k`/7l"?LLhlXPt?` y@ޡ.%XO.`Q^a K46tA߂d>i u9`\\$AȣȒEˎȟ`\Af~X.q~X"- ^_,;fX6wƍ_`ًɿaߘ:0cl[p򟑋 p؅`^#`V?+[$3C0?+WjUC0??SC0??S7 4O矫OC0w0_` +m)a{S p[y8aeh2, 7_[ aAlB_+/f29P!,ğ/r a\BX* k+طT/ a ,_K a|؞qeݘ̦#7lpؕivn ס//?v@ߝn̅vY//Xź5GNU`iIR3ޱdTe爨2،=*2? `ۙ=O d]W#Ăݐ3c dk0GY5l 4p o`Iw+\i}24>u5/ 96G&ge^<2Thz+nNz޶5sm+S[mPսm4K !&)awJy,-#*UwPp.RĀ$3O@Eie>_C)pSBZcb}lUr{_)}}C!سWҞ;g4ͷc׭/S0ٗgqanRXqü5.;B}`HW߇ G/4.,%egb 0(fU|o>@l SȰToYS._:KiUjO dr@z8w>wjcq.qL8΄g%wUN%؞b#uـZm7;}=ULv&Tgv;'1c449GVV|,{q% ٙw0HyhVg_ަqA96;zJ(!ĘDH*MH!TO.qr栬iIYHeSVդ:iy]g/aC/O/vjxS \YKuƩ&>ɐ7Ә/|Pr (] _ fŏstG뉯/XUcR.WXL33|)tc X _{tCFө R' 1Gq^[\#HZ@co|=P H2#x|2~# (6tuS$e/0lj")˖U'{̤qb 6HcVٶ4J-$fm6\E&>^9o;'SDuop<,=>`%7zoU^ Sz^k^ڂ}ky1F lgI6j-MAxinQt zڹ : ?"#3YxxX„)&_D_|gFkyL;[ɔ:h0uե<0,V&g.q'gLQ6(1p5FO4 R{\$huSlZD O]x-J1#xt]eǬ|F?k2zhsx9FѺXO|szDv7X ,CvDc%144! @ Ѹ* ZqwߏdIJ9X^S͛r晤kT$l ~֮}tLeQu3W95)q{> ;];vljI]G:%I +!8^LR {S7BkQ$A9iHIׄm)T{vEϣBQ럅cYK쵾meS=nBSIBT_3 UȈ]ۤ&wJk֎]0!Am`)CΪTF͜Md_aH_g0Kvg5/glYjqkUZ79fHPGIMwS2GRcdjvmi/S' 8Bh=z4l$Vc#GNeE~C lR9Ya/ߔ3 e[Wn5]MfrD5 Ņ6EYx#7"]ZJE2hA|izoO{((܏1밊!~nVdXAO?י"%=KeWu҅qk[ hm/;1 V33NqѾ>Љ| 5;۾4bmN Q_]6GOm+vG x܂wGF7ȓ5Ejy!t# 8x|,eTs{<ԛ;#o 0sO2+.#PUX'e-+޲HC' ƿͪeQrgf_vv<9HQ"\<j@0"4%c,,}/8~&J#Rh&MsRD>%JZ#V_gyLlUa_'6,W#*zy4(^{Ӹy؎{w(|j!~jYO<-L8*Ls9~(Wf71TG{~7UcI;7H4y(7&2Wu]IGc kp}?_8+#ט cד Ew8Ǫq.l+k6UW"2H~?n⸐oI!GCF:U9Ҥj|@ҋ)ݝnҴ捗ɣ\Jqt xʧ0֙E/Ո0 7DŽ?Ll#&k 'ʖPv6 eOk'3Hj/o2 ɇNJt_9mdF/%_ܕk,+Wܩs>tVpT@UUDZ;!|_y`.O="/vvc0$8TT69jӱU/GHp@GT6wFN%IY˜1l.=5  41n˻w'zCV_/㼘vs7^iQ$͇! i>V) vnzL Ls ͮ7$uΌ}Z\+b܄\)&L^ :5r ]_R '=`O°8eVp`ђѡZƼ#\omGyxoO>LFs, .tfLVr6'IM`S@<.5%%&N/g >TgVcd:f}AO&ĕvXێ'ꭴY~Wkd^Tp(62̄ zBL_0ˣS'MQ LrƩmGavyw!:ۦ?zNtο0kӪq\wjJeA#?~ +N,s9I+L>,P<?>kY*osOLjLv-P i;p?tqV 8KV2ǭj8񀼬Yv1V#=Չ5=\YOY͎@%p? Y!t ŁIQvjWc/*J-OYMK ZX=*&]E|LIۏG]4PΑЉ tk3)!#4i?t䂭:jxQ##^}]uJCTpT_T;A0L#f&/b[zݤ<B֌-ЪG8߹$(|`5uD_śfBЇi7ȁF{tJñ S~7%Ѧr/6$^0bX_hO3gW!n8I#_DY|ӵ?YX F-qo)+HBҏ9l9OsT%L(U&GUVb*˦%&N+CB\?RTx1ɂI)]Gp0CPΠah ;IaD&Čiϛ'%P>TTwG*]9R{wCg]S ¿t#dn|en]+m\dM 3܎TN95z3^wRSjEl ~Hוe_'o=znTcb~Lš?4i#"S5blcQ]~/߲? 8fo=ZUV޻z#$7PꝂff$HZFThF= ~oMqQTuKXbJ)D-8ί4YiMm :VvE>0KVS&bk"=j/P,|-MzL±$&&օAoh   - ӛ~rPתsCBg %6FlE M܈5n;K8wN"ePS8B8#%m?E;YyWCayVzhVkBQZ38:'\i^M w;kgZ/!R)[lGDt>H:P_ -޸ LFA$#zW'=n”us[ϳ26;gb5'} }AyT]$H AMQ29`RB&(8oӡKQ4]H7efOi"B)Og_9>{wNw<3d)6z`ࡡdה&,_ސ'q6O`HѤh.D\.q0YlT%>~7ezW ?j3XapRK9uep51B<ҒŤWYYưEg>gPԧV>,@o+K/?Ja "dזU Y qH*'BN1b `sjFh(ݠ\zձno F(5]4] J >NyEuW@O}]EujVs]}W{iZ=@5qv>9rS*GzetݭCgԕ x:H.&d_ .`~/*53:{q'hvzDc6zlzoEk2> "G"utD>Pײ$1F0}C,eGT*V+$8-E=WjѠw穒bxd#u."~ZyzbVzZ9Xh0du6&BꗄDvvZڏZJ/hy?P/MexidxP6$V7F,EkhLۍ_!k-㣌Xej'3[|݉6=\;{Pk^ݐksU׵xK=0&Sfl#Ky{ށ.R95ĨV璡"y.=2B*MjU@ӟD~57bw>kfxu 5k9@;n+U˲ 2{QeEu5|+k8o''"r1:HzPx_*0[$utv=3#c T$mb|v;,%rn 3Go:s{(/haT]IB-7k~?t_ jk]Xś3+Gg GyWyG ⵡJ"Z4/9-Y2juČ\$ M;AnO1(d.3zʪ2ɱGT_Br(Gk?kzJ^2+oZ&- f_̩g| w}A] gWQ5@Lg_iF]fZ?rjb&*C3>7v('4y(.r|W^j2%y#ivb7!^˗ONn5/#g _ӘW#qF8 C3]c. fʞY }){4>΋4"vu忄VWDG7=9 _bxXM?{]<NdAu ׊FbGP>*1r$n7{Jv=G-6wvF$W̪=v@!7EjUMxt$OJH=^ֆ'ty M2 oKĹTP_r/4BG+;e蟖]rse&ɽ1$%}c_;D'+٤ :DGn=$&kUnҊeDBti&ĸ";kCWe2/Q?FpČN} ָv.MR}(^ĩkхZI&Tex7t)+Ɋc`دWMJ&.e8ۧ;PYUBSVTbWa]L ~pH_,ZX3V~ 'ְȺ{OsaT˱Y:pd2;؉oX,4J gUfFJF 6}߾pߎgG'lJ V<.ל%L9性TLhDW͘6 rAcߊl1}|5 0>eIR  "sS$X90HKH$ɩ@5"4jO-+||Kͷ~VVe~{_6e-Qiy`I^NB9\]?o[a- Q:PHc-lu cv/M:uZΦ@N h.C0o H%uYy\(1"S/C-aZHD<@%'\u[4QҌ"o~t荃͒5[yM:;+5hBT]$bǹ U8w145)ᯘD'Sr^}S37!7Dwemd#LWm6# 0 Wo&̅!<#OZǜha/ek-1A%crLÎ%{/6n+v ;wogWlRm'BN ^tS5`oւD0[)zHIxR +۰ߙ6DI;7oWtpKLG52j\ m*._wHQ">|ݼ(Vj$ beK]t@K4t#q>"AѠq]AԌ?i߾o~Dw[kQׯk-D)YSĝn6$.G`ʐs/B{UK<}&D >MK)sZJwK *OKđI^Lo0+F*!69<%bSsTd,<ٷW nadGN8"VT/ 3yGL"֍e\Qt͓w5+Rd#ҭ$x} 7ۇVxÁ~Qw}jZ G7 Y   _X%P(+gw,@Y{rSRNm t[UVv{+vdrc 1S^91$+I~W͢WwotY*ucX0^rH+kª&Wkn[|`ϕ~TޱEפ<)6rgbRt1OEc@jV,׫N-C[1s)Fy>iw%+ʭ#dam&x U VG 90!CXh1 /6jDM?S=K(Q@ŊU.hBtėx_}Ż?84P12kiE H D"֫E/朸;-pF3^&X ."؜& Ha@bfhp .DV .fr 7oZLkƾ}~mg5F`䜦 Ji9KK4sB%?MbU5o w n/^ Z  Ęz[މ=C'p_/HvTSFM +` k+\:Wiр"ҴZ׹S-6+#a%}$:"=#~O!⾁ʙit ysv\[6fY<> endobj 68 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /CDECEE+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 /CharSet (/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/five/six/seven/eight/nine/less/equal/greater/A/B/C/D/E/F/H/I/J/L/M/N/O/P/R/S/T/U/V/bracketleft/bracketright/asciicircum/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 12 0 R >> endobj 67 0 obj [525 525 525 0 0 525 525 525 525 525 525 525 525 0 525 525 525 525 525 0 0 525 525 525 0 0 525 525 525 525 525 525 0 525 525 525 0 525 525 525 525 525 0 525 525 525 525 525 0 0 0 0 525 0 525 525 0 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 66 0 obj << /Type /Encoding /Differences [ 0 /.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period/slash/zero/one/two/three 52/.notdef 53/five/six/seven/eight/nine 58/.notdef 60/less/equal/greater 63/.notdef 65/A/B/C/D/E/F 71/.notdef 72/H/I/J 75/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U/V 87/.notdef 91/bracketleft 92/.notdef 93/bracketright/asciicircum 95/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 10 0 obj << /Length1 845 /Length2 1062 /Length3 532 /Length 1667 /Filter /FlateDecode >> stream xRkT. R-DAA) c )20:%@E< rAEyH}JXZ([@EX ]?_w?sާsl%(yQ$`1 yHO` (,PB-bt4fqHT"L4b{Srct< !4~B 05Fa( 8;!N&5jgM.E" @1Gwa^CT'RpBȭRhɄTi(6iCqj* .Jڡ rL bh飪!ΏT+l|F̕s d6b0?k6%׭pA0+d_S.[K)'I 4ُ8N`Z1GR {9cuj,V&Q%D.ROa؞XLJ)NG'p`  xV:MF$4F2V0Lу9]|͔5{Jě՟~qCXmB6ڐժJp0z#w[uU~>ͺ#Ea\.C[8 4nR\O!ՏtsAHOA/v35u̐YmbeWOײU{n&QC~N"!ݨb@ߞ̵,I}Upv`՗71̖8ѴMZw_%y-ޡ9EҰ_;Jwkl9uNu˯hh-=->:M͗dk4:gwH{7蕻WS<6z>#]޷}Ii~q㐶xbzNJGkmBԘ^NhtҮy}Gy6 7iUeNt; ?$ؖ鶹ѧR_U)u'e"Д69.IEO1o6٘?Xux߷d3hdX5sML$gzdM9 A"5m9£'np^ѿblu2ǻcV_c74۳8sb[LC>Y' ]sC6M.[AZ4l@bl†*= vD,ȫLqنůVM Q[ㅘ2OܲDk.:|^7듩;ϒQ#?|8o?@N`P*ޮ Tvendstream endobj 11 0 obj << /Type /Font /Subtype /Type1 /Encoding 69 0 R /FirstChar 20 /LastChar 95 /Widths 70 0 R /BaseFont /ABEEAB+CMSY10 /FontDescriptor 71 0 R >> endobj 71 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /ABEEAB+CMSY10 /ItalicAngle -14 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/lessequal/greaterequal/logicaland/logicalor) /FontFile 10 0 R >> endobj 70 0 obj [778 778 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 667 667 ] endobj 69 0 obj << /Type /Encoding /Differences [ 0 /.notdef 20/lessequal/greaterequal 22/.notdef 94/logicaland/logicalor 96/.notdef] >> endobj 8 0 obj << /Length1 924 /Length2 2810 /Length3 532 /Length 3458 /Filter /FlateDecode >> stream xTy ['4 dd2`##AiƬ A "o~FBKlaQCbmo\@uq~y'%;ηW_NחX 4s 6>fC\X۪ςRn8y{].οj{-ڋ5 A\;q>nǸ]FTNOW.Aae,^3''JuۦN =jSTyqHK4قB"gכxKGx+GO+UKis\|08zlTP?ut"+p@G#ABfW)9تs:RVbv|L]|! ynH{E|m7*5p|8M)s>uaw5{avl/ܯ6R/Iu0KoyG ТmO Xg-4/@ YBHȰ.]Dݾ}6|u(rXh!bJw\!$LaU{2,r~D!"2jYjw̴wtը*ǀļ)d^!`bNJ?v\<0ř;Vz+ÕZvK[s%D Ngl.AtZ\qO.SyZ[%}fL>X۞ 0TT{V:УSw7H(sQ%ߺZKX#ͩ  F8Ćdź:jcdV4%RMg{e:>=_ "䒶T+ځK"1z+U\ȄHX⛇~u{?Tk2#ɉLf&FuExߞ2|p6]q- ľ̸dw Q+K(d| f8$-j}B)7n~oWQ8Hqxۖi,7a7,?+J \Doi}{fI~Ô[;5v6+V 't}O`Vq9w`Kyն&twkD+-e'@yV;2B7,-4=ZuZX8gmkk%NϾYd?-O'dfѼ4Q;ncO m5n ҁUڜb)ŰBZ?uvMq7gF&DrvxvdKBI4mkW1Μ5AZRoqg3~{U3R/Df MŞUؗlE+csdx?mDF):0VEM2 K:XְDWZ ^rlr\7{9Y^>bQ[~Рur4?f5SI[Ce^~`tݚꗣ]ibĞ<2Ѕ8d[ڐ93MIrX`cc(8r] sDdGR:ov^д^f-;}YkgHH+VStEkbg ̾5kTNTȓ_ ъ6GV}=ĒK .UK&m9,!Z!8} M+~,pe#DxQ8 >YՍt3@}|Uypsrp`bROsW$)nM_445Ue([Te~sw)N8LmezU˜䑔YȂ}kq јR76M|?X5؟R©zEmâi5w[6³NgHk; y:Ve㙈&+6P$8BߎHځM 5m㯩};Ƙt>lqਝ"z&'>'3ӣ> ciaM0f(_PW>fxdF_qY43?| _D4 /yendstream endobj 9 0 obj << /Type /Font /Subtype /Type1 /Encoding 72 0 R /FirstChar 58 /LastChar 121 /Widths 73 0 R /BaseFont /DCCDDA+CMMI10 /FontDescriptor 74 0 R >> endobj 74 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /DCCDDA+CMMI10 /ItalicAngle -14 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/period/comma/O/a/b/c/d/i/j/x/y) /FontFile 8 0 R >> endobj 73 0 obj [278 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 763 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 529 429 433 520 0 0 0 0 344 412 0 0 0 0 0 0 0 0 0 0 0 0 0 572 490 ] endobj 72 0 obj << /Type /Encoding /Differences [ 0 /.notdef 58/period/comma 60/.notdef 79/O 80/.notdef 97/a/b/c/d 101/.notdef 105/i/j 107/.notdef 120/x/y 122/.notdef] >> endobj 6 0 obj << /Length1 1940 /Length2 13854 /Length3 532 /Length 14927 /Filter /FlateDecode >> stream xeThq N @p[pw w\]sO}֑ V@AI(ak *`f`bu88y톆, ʇv6v8 ȰթZ$N5 od lkdtrg[YߎP:\ pcs#'!ږ%i[̮vؠtpPK!ilkc01~pC.le˜ćYlВy[cʰNUMhll[ ٳmLХ%ɾNFf+G@-rR`MˆI?/fNj`bX^ۗjX9psc!`cݱ&[6cM7|ʝd~ܯܐ;vҵ?O:l6&ܮ hW+еG13w;3Bl}? q D@?=[胛O;Os+Cזc@\?6?jc?s?X( ޝ'QN}CeDG ?1×c!$G?Rcc2֝}Sq}SCzJ>ߛ}]}>q?(?ٞC}(L?[sPm/ؑ1}[N_ae?F/Ӟ ?“+~X9V_aҘa~XطVoïy~b n7jcn LL9;|<0N؜p7<@nq7"1ۀGD)$-iS_ݪ qVeijΚ ]_J벒Տ{_ȕ#l9aUZ.I輏?US^!rTH\KJj_:c L|iԚ{=f Q1-Iq~( r{`PT[:0=*O\o{L2hmiy*JhGr.Db1u ]FQav?}$'s"&a] ⦚bmdNqe~2AGYakP N7^YNPc]B4[WAUz1" Un]⏂@@=.9BNdk~ ӆ͟Q$;N+冡•rTgK̓܁*gM=kC;|]0T`Sgy RrVAC06M}_k|)~Yjn Yl 25 nҶ˫{vxD /Hn7&dZ))Y_wYAx7aUob8Ryk h Þb/ D , lw[JFƋLm] =KˋZ{M[66x6,GMڦK];(0fDOB4dz+HNLr9zJ"3͎#E quҡ\خDŽԽ@Έ(CBXœz0:vW?Z׵R*\h`6,_GB.18pP}d C\EUF5ım PsZ.5:07QPf7n܏@N0:""y <2CC;t+ޛZv ΃ӌam?8~ ;anD=[JX_42y 0[E‘Klv:;{bڵ͹@d"=uV [,yN^NJf6YtzV.nRzW%Z*Z}7Ԥ| )Ԁ_S8AOQl5:P7})咩7XR'^NJ<~SqCp .^"e9|FsRIOvj ]}dƁKb.BswuGoЛR!8c.561B:][}z8U_HQ/n?x8&CleV;MYz|J x5%׷hb4{c7w^Ѽ2 %qQUuh1ۇuC( LWܺU"Ȏm(WG "OCPZ2X5xpZ3Rֿ%*%C-SP@Ogg2>wl(h,WS=7Ğwbe!cO r0?l_ц^w:RG c ex_o҉r u x吢ufQy?"#ar1{IU2=Pl%ES1^xCyE21drȯ, Kmby&H8n'k=#+rYTi‡8H"H"j>>L3#Pa+Ns"X2fA]m0p?le<iM#^`Yj ]ۚ\Ѹ2cX8Ob}l8Dg$hl*v@njS c"4?X64̔hw"n="xB>["O62FO *=t<(/E:X-w~hhԩoTpߠlz}&*7jkҊCʧl!{$l}9M_YZQ18%gX; :'5l,8)E rp~RqhqHqȚw/X#o+O)pFNnJnCTJ^-K!PФ!Oێ a_{gq/2.n[`-dӡ̶&IFMe;iQE֏JސXT\#_MFߥ<|tP |lsrNTt&x~"<}œjI .aǺ(fvt'^y"m[\K&L5}3FhG8^$>jD[Npy+:ՙfC?VmY5>76< ~ Tfd-Zg]{+CM PM9L/Tȯ^gL>&D'-Ƶ>]~/+hQQD9V`Ρb,KY@j^d$8݇Siz\Ce>[bE-+O ϣ`}߲wkgȻ3z?i:]>NRLc)>#;b$!4ڭ"udӄ/8+<{75*.Y4K?; d_ۼ0NUq+6RKdrmč/6))_EK /Ñ )hYC]Ѫ]`}:hj6,N-]+>Ez؊|\ٓ&MK>5 x ^-fs/u}l*4AM?V)I'jhmq6!:ȌӝdiY8yPNah cTq3$i` 'h*N #K$xV]?1 ,J~lXvBHKz ,7 ;$g|Öw7*|"H ^zz7>FѾ^?dͪM1a跾+ǚpm٘[ g38eoV wBb yө_#CU= f'㳎Rw Y1j HNLg yhnB.¹nZ}WnfhCZE-Aт7ũYvi_eUG&c1/(>t){R۩Wvj&6='UyĀ]9CNk~7\"Oyj&nľUvjŃD]RE׹s-.!}Ԣ7y-l9 t%5ȘxS1Ţ n`6-NTE.bk+X(5x8]R!Pd_/)waV ݗk~U;Ϭ6'%]|ݣ?lÿ|#fŇVPM|7"1+-ʗ`گUOqBTfˤ9_bCL*X`jUϳnv/U[DϾX<+Z>H ~CW"Ώ`~p$7N~y92spMpN,> D ̋c!_@IMi9"vvruRK"8Kw[*Q/۞&'~c{8P#:%~hb)u[)e37 huf[eһy]JG]ci1j:鵵sViK$~2q[P;{hͷ3o-v+bn O~ +逅MBr1'B&;兏>n>9.5;Hsͅe: s^~T&.37Lj;CGfzL\ei>wd* ; .]K*cH:e)_7"CՖSNlœm#wsf:X)D%{n{g͹*(`g.EER@CЧE$# D;½QLx:mz;FM{"^؞_cr")(J٬Q'c6XͼW#K$Lpa-PR=aϓ_; p`˵%soUQb~MKtz=whd'Pym|wbV>4S7$׳GVuaNeDNBsml {F~}g}yzfKa\*ɒ{m @Ý'\Nnу45ka^/y;P/-ڋIW韍=l ?O4: dT]BG9EN8ejU%rCsm@7Re+Zډ 4ExLʟdB)Y8D/0iX4'J!NVdq o{z\S7{gK.=E4PbЦEHwoC"ֈMX&A/`\4yڐéY?>ш{I>nfz=iS<<0yqA1+V*r06-;^$U$9/҇E4*|H9}^' )̚ ȹ7e;2gFJNiAٱǞ:"0܈2RQ%=\\ia>hڢ_\pp69)j,!k/I_>ǎ{妃ÓFm8T=Q+ &猳T~)C/1=ш},*\?χChNrjF{ )=! 2{f+a1Ѡ7cAu+FvOױn[`~b,32rBQPe=c@zysᅞN?kZBKt% b%=>4!J2d>x:XK6kDM7Y'(Hk YwK^{յ~! ;ۡenFݔW#zcvVa ,EqwbWv0MדQ誂Z?HVgO5W@#o\*a?~fE 罈?K|}T@0I55DC~WuqOD>A҅$Lj%{? !;>ΊTZBo9 9EIa!t%!=,-͗ :~^6CT^8WUA) s]++A8rtqNj_qҵ$F@T0%#T9UyM<.~ |WgnVdy~1,v2z >I_Re흇Y+?Ps^b6]a3:B,ly _܉!ͫl]q~ۡԔǐ#-нdn,\13Oն녒lؿ401jK|`=0Q+(1T;~U+)79SǣKAKlS0/pƋA vV9}p=/!ƥi{~5j<}i~zB߀kf7W)F|Lu#/ cXk\^of$&T*ި vو_zp%c`;;px4B9${@ʹ9J,S#҈L=t+7"0.w53d4 1qN Ŧ;ʏbD'jss rdWqWVN8)P0|.sreAZꚅetIc%*ֆuܫi,JW.0 ؚlm`A!PJA: ȝKܳ̎}X"OGrkEy b;ٚB4)c!Y6C?$kC\3 ^_\KRxrq/)1"#y,TfZ !ܪ'GNX04swf<_*xBv۪®-5n[ZGiU /',@[Mۏ8hʆ:a擛-R6&/gΙ wV@ gT!T3!&}XxT-M |7XyDo4ZOeYTSk!rS,;_2 Xd4GuU%)lʧ6#P{m` 1JvZV< |aT HVmg62@v%:k4@+tN\t{"S=5I/6u$ 1`{MxxJƨlwBG-1 $XK |PjʸAAA~% 1=\rqsym>oon%{0قO6]jkbY uޠVӖkm >HFa@X&rB7^e !.j85YmT%K>ZpRѝ[/@,b-kjZ^V')@i,V&T-MA'HoGdrl~rl2e%N3*?^Ωy`e |gʍXP$dGmj ^ºe@k"蛚&n%ĸyB3u,SjayWs㲃2ñ7s}9jY@Q pv4DPiXe=iO=YGK"G}﨤+\mΣ 8S-5_|_27RG'A9t\1[ԯi;sN*j=.>-G ,w݀`)G{K;>A/G#c0J\K9j")d0 ׷u]&zO7 . D&=SSݠ\{JweZ[r.e436DnZgٮҷ7p@CL1ܠ bATan+ p׉3i [X՛Vp_Ku[j(C/OsPT^d/Q cꚜ>6.lmrxܩ/&;-y&/z;Jňd;QiY/4C2QΠf ّ u>4)<9H-ꑕ"0Yݝ0Bh-%߈1h>|=i@#<,"c\nT_Fnhjղ -(}! ]ٟ)~oT.$Z0GG&:(;+BW*g)_ft*,Fe#l1pӺnmB2~LS)Fo~/naᝆ/*UMzD|K>L<9P>Q~IȨ-FsFZD5["ގmũgyFo^U$JHrRs ];&7B/8,Hb=H!;13޲=||Rẍ́M'1Әfq\ũZd ߩ:cP, ч֢I*Y?(MNWG kj814*,ny=Os=WYywp>PQfnܠ P%KHø59o7zO]7EqRW`Vb3E}OE:Sg/ 18KDWvI`ɬ3UwneX/%kPR5tv ;nhH}3L 7KKO "FQ9cpwh2RmKDdT$\@ut=7 T촉1Y|Iphl!>OE!.CCwώ{Z;bOb~py<*au9 Me+f_T4J9e2G=ӆ5K)8ٗăWܲD&.(J?1)C"f\)Un?C{FE]Xj,ˋÊ *'k91T+CcJ (\2o uw> endobj 77 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /CADDEB+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/ffi/quotedblright/numbersign/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/A/B/C/D/E/F/G/H/I/J/M/N/O/P/Q/R/S/T/U/V/W/quotedblleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash) /FontFile 6 0 R >> endobj 76 0 obj [583 556 0 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 833 0 0 0 278 389 389 0 0 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 0 778 0 0 0 750 708 722 764 681 653 785 750 361 514 0 0 917 750 778 681 778 736 556 722 750 750 1028 0 0 0 0 500 0 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 0 1000 ] endobj 75 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi 13/.notdef 14/ffi 15/.notdef 34/quotedblright/numbersign 36/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal 62/.notdef 65/A/B/C/D/E/F/G/H/I/J 75/.notdef 77/M/N/O/P/Q/R/S/T/U/V/W 88/.notdef 92/quotedblleft 93/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef 124/emdash 125/.notdef] >> endobj 4 0 obj << /Length1 1154 /Length2 5065 /Length3 532 /Length 5798 /Filter /FlateDecode >> stream xg<AEŬQB^wc02DG= z!z?3_{]כ^5$m`ӦHG.7H "zq33K`G-R@ 'K_,gHV6)60 AT V0hB0G7nܿk@C9ՖA 90Yο) -l(;kr@Cm79jњowqY'BbSu [;'G bkC!ظUpءQp P %G wV C{ F?؟!pۣuboF 0373$D?BA݄&>G\0Wtb 7>/- Uo&^P7T7 O7z$Ƨ4MhMAت ߛ ?F66Bߪh#?Ԝ ?_D:تh_ò@_ċ$)i灂 zBݖxFm$ U:P0ۋ=0+ ?=a  N **S6JmnT4&" $2k .?iB<锝G^s~^Owۉږ,`^cꯖB_A~vW~v::CvC@~=$v ޽ B.q1ޅxuMNYxt^)\F8$G43cx2D'q:%ڴf\Q ^+ CjcG g6Y0P=}5Ag$wS.}j(ڈÌ6Q[2;"ǎ7dJ|8DmXX33 RX{;-ܷ*;^Zx_tm2(w~g[ܰX!RĚbLd'RIԷVZ#mc&=ב\ ¨gE° y| j\wp}4b,.q%z]Sۨ-NcDX~xPKO^#R{p|UDQwy*CHki1OO h[EPVzDM\+^ a/^{$ wAUVGR{V[PX[)U \LuWkAM3lmN"N`R6Kf$z'Ab̐f'̪ ĄcEb̹f'sn+}RWVBÙ*cB\O83KTPt)Lbyŷ77BwS=>0EoD);<:#x_ٸ)XUggM7aw*8>diaY1oeMFvסT,5rvxab΃ۉXdfL1Vs"䒦 Qge_ͽ3l:?O3*QZ)j1-qqG+EI9*7KPb kz-uswœeZfQخeP4E؇;1Zc' D9E*?Uܩ16-!sf+nD^~--:K$SyA +9D!73WtA #Β>"]:qI;'uiyC#j}n%an utV 4ZxÑM+z.[L3QVsESkoyΣ'-C_x[|wW|Z3pt) -\A&="Q;-;{?sR %h ?5Z>`קڊxSip~us٬0e'?q1tI'Nvפuln_ "ˣ'?gOLkq$_)ƱZp.Wnp:ٶqkۏdN&*cJWr/;%u\::]]Y Wwڵ|ZJ vrB+`NZF9ϕv%CWkCb="ġ&93Λ)U) w]N< PG ыJ}yl9BJOb}{ÄdY~u+I|gPS.`3KߙKb|!f6{acդkqm >Zѝ#VuiCloL\}%8ɫ'Rn<8PhdiH&njRT逕wZ[~@ԷcK'빯h|ݐSo-F9kRf`'LӥDLȤe%fףkYq6=W ?P$2`) il5{R&8&-=VW 63 /m<^ msQkDmo|k ^E5!=lpUj%f[LRL)[/*=zSㅷlI%6Eġ 'I<:7h԰-T^b _ ;\znŲ1"bb)]3ejg饄欧ƥ/l$ظE`”%FiӀ 1Q)q3 =yF:+FlIodzN2*?8(^2AۃOe=9sSw#$D@ɜ@'|X[6l>^-7́О2w[p&2f5ϽoF)hfg^Oh&ga BU[xRmMj9Nu%t 뷙[7[ vm?l*ԛ`V;Nm7O1#_b5&`[^ iJys.r:U *oZF4:Z ҨfhŽnJ+f8 ؚ|s Oj`[;ٳ= 3fuA3I2vYx+?汄K->\G'wU7÷Bt A^^Wb?yq2Gv,bnʴOi8닿Q2| M3?Ru ZCt+y ݎP<4C9.LH?SAX3n'n[+J6'Iөm).9@aYFe8L\zC[$Kj9;$>Us"?XtxbkS!?z㺿% `qL\o|7NH}逦S͙I~k 3NMX20KbR2NxPRIT:v1Ea#貓6&((er`.s{gΜa4e1x{Zl~`@E,^ghX~r9vd0 {kGUYvUUK3>OQukg0wT#yU ͼi}=)&Y\'p5  c}̸?ӯ.U pѐYH*ǡpC{n@F+.!Y1@Zxѐ#>>c۷ГQUIFyJ?W˪5EG.# S/qH=wSl=31 x9Gb8;r[֭Kݻ~4_Q8; ~fL 4_2mm4M.32cxoyR gZ*PxUV.bF~#ʣHotC1;-d*c1}Q:%ۥUP% HLK>JB$䋌*6߫Ұ`E‡CuzP݈eY:P0IҾIӡK$ۆ>rIN~O_EٙK]uDLĄ""r`<r2Ƕ)yFxeC9!@}b5.(Q;x/=uK#ޠNZZrc3^Y0vStٌ /cAq6S2F2aӹԏA=B:Œl Mz{sQ(~z%]rmi# q=}4_7qԊjmyfjշP|E4ȎWG|B>EoU _W<-诏 &oI 13w dJ$69,tJZtd|;?̶ wMKCM~ ώs$ZvPƻ|Gd&Tbn1nyFg[ꄥ! {cFa@ -ͿTs!MauA5!u"QUKUF0.?'qB,cLϹЏUqv4x߽ "` Xendstream endobj 5 0 obj << /Type /Font /Subtype /Type1 /Encoding 78 0 R /FirstChar 12 /LastChar 120 /Widths 79 0 R /BaseFont /AADDDD+CMBX12 /FontDescriptor 80 0 R >> endobj 80 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /AADDDD+CMBX12 /ItalicAngle 0 /StemV 109 /XHeight 444 /FontBBox [-53 -251 1139 750] /Flags 4 /CharSet (/fi/C/D/I/N/O/P/S/U/a/b/c/d/e/f/h/i/l/m/n/o/r/s/t/u/v/w/x) /FontFile 4 0 R >> endobj 79 0 obj [625 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 813 862 0 0 0 0 419 0 0 0 0 880 845 769 0 0 625 0 865 0 0 0 0 0 0 0 0 0 0 0 547 625 500 625 513 344 0 625 313 0 0 313 938 625 563 0 0 459 444 438 625 594 813 594 ] endobj 78 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 67/C/D 69/.notdef 73/I 74/.notdef 78/N/O/P 81/.notdef 83/S 84/.notdef 85/U 86/.notdef 97/a/b/c/d/e/f 103/.notdef 104/h/i 106/.notdef 108/l/m/n/o 112/.notdef 114/r/s/t/u/v/w/x 121/.notdef] >> endobj 14 0 obj << /Type /Pages /Count 6 /Parent 81 0 R /Kids [2 0 R 16 0 R 21 0 R 24 0 R 27 0 R 30 0 R] >> endobj 37 0 obj << /Type /Pages /Count 6 /Parent 81 0 R /Kids [35 0 R 39 0 R 42 0 R 45 0 R 48 0 R 51 0 R] >> endobj 56 0 obj << /Type /Pages /Count 2 /Parent 81 0 R /Kids [54 0 R 58 0 R] >> endobj 81 0 obj << /Type /Pages /Count 14 /Kids [14 0 R 37 0 R 56 0 R] >> endobj 82 0 obj << /Type /Catalog /Pages 81 0 R >> endobj 83 0 obj << /Producer (pdfTeX-0.14e) /Creator (TeX) /CreationDate (D:20010209143600) >> endobj xref 0 84 0000000000 65535 f 0000003463 00000 n 0000003350 00000 n 0000000009 00000 n 0000091487 00000 n 0000097404 00000 n 0000074914 00000 n 0000089961 00000 n 0000070615 00000 n 0000074191 00000 n 0000068116 00000 n 0000069902 00000 n 0000054589 00000 n 0000066727 00000 n 0000098374 00000 n 0000006548 00000 n 0000006432 00000 n 0000003576 00000 n 0000047834 00000 n 0000053763 00000 n 0000009594 00000 n 0000009478 00000 n 0000006651 00000 n 0000012839 00000 n 0000012723 00000 n 0000009686 00000 n 0000016318 00000 n 0000016202 00000 n 0000012941 00000 n 0000019945 00000 n 0000019829 00000 n 0000016409 00000 n 0000045201 00000 n 0000047330 00000 n 0000022351 00000 n 0000022235 00000 n 0000020060 00000 n 0000098482 00000 n 0000025236 00000 n 0000025120 00000 n 0000022454 00000 n 0000027149 00000 n 0000027033 00000 n 0000025328 00000 n 0000031194 00000 n 0000031078 00000 n 0000027264 00000 n 0000034980 00000 n 0000034864 00000 n 0000031297 00000 n 0000038778 00000 n 0000038662 00000 n 0000035060 00000 n 0000042087 00000 n 0000041971 00000 n 0000038858 00000 n 0000098591 00000 n 0000045121 00000 n 0000045005 00000 n 0000042190 00000 n 0000047731 00000 n 0000047692 00000 n 0000047489 00000 n 0000054341 00000 n 0000054167 00000 n 0000053921 00000 n 0000067647 00000 n 0000067326 00000 n 0000066885 00000 n 0000070478 00000 n 0000070299 00000 n 0000070059 00000 n 0000074743 00000 n 0000074574 00000 n 0000074348 00000 n 0000090986 00000 n 0000090589 00000 n 0000090117 00000 n 0000098105 00000 n 0000097812 00000 n 0000097561 00000 n 0000098672 00000 n 0000098746 00000 n 0000098797 00000 n trailer << /Size 84 /Root 82 0 R /Info 83 0 R >> startxref 98892 %%EOF n/eight/nine/colon/semicolon/equal/A/B/C/D/E/F/G/H/I/J/M/N/O/P/Q/R/S/T/U/V/W/quotedblleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash) /FontFile 6 0 R >> endobj 76 0 obj [583 556 0 833 0 0 0 0 0 0./docs.dvi010064400125110000346000001371740724107026700135300ustar00dwassermgrad00003010004401; TeX output 2001.02.09:1435y?>N cmbx12OverviewکuT>K`y cmr10ThisVJavqaprogramisdesignedtodocomputationswithmoGdularlattices.In >particular,дithisintendedto ndanormalformforamoGdularlatticewitha>givenOpresentationbygeneratorsandrelations.oThisisknowntobGeimpossible>in)imanycases,^mbuteveninthesecasesthisprogrammaybGeabletoproduce>usefulUUinformation.MTheomaindatastructuresoftheprogramaretheelementlistandthe>join/meettable.;ElementsarenumbGeredintheordertheyarecreated,start->ingprogramMstarted;forexample,tocomputethefreemoGdularlatticeonthreegen->erators,htheusercreatesthethreegenerators.VOThejoinmeet/tablehasasmany>rows zandcolumnsasthereareelementsintheelementlist.6InpGosition( b> cmmi10i;j)>isZstoredthejoinofelementiandelementj,"\ifiu !", cmsy10j,"\orZtheirmeetifiuj.>Theusermayneedto llinsomeofthesquaresbyhandtoindicatethatthe>lattice~satis esrelations.STheprogram llsthetable, vstartingatpGosition(0;0),>followedby(1;0),)x(0;1),(1;1),(2;0),(2;1),(0;2),etc.,alternatelyaddingrows>and columnstothe lledarea.F*oreachsquareitvisits,itattemptstoprove>that"Otherelevqantjoinormeetisequaltooneoftheexistingelements.`Ifitfails>todoso,Vitcreatesanewelement.D(Thecomputationwillsometimesfaileven>whenwthejoinormeetreallyisequaltoanexistingelement.'Sotheob8jectsthatI>have {bGeencalling\elements"wouldbGemoreaccuratelycalled\terms",because>two5ofthemmayrepresentthesameelementofthelatticebGeingcomputed.)gIf>theUUtableis lled,thatmeansthatalltheelementshavebGeenfound.MOnefeatureofthisprogramisthatwhen llingasquare,?itdoGesnotstop>computingwhenit ndstheanswer.Inthecourseofthesecontinuedcompu->tations,Gitsometimesdiscoversthattwooftheelementsareinfactequal. The>programkeepstrackofthisinformationusingadatastructurethatrepresents>anLequivqalencerelationonthesetofelements.vWheneverLtheusercommands,>thelprogramwilldiscardallbutoneelementofeachequivqalenceclass,&qand>renumbGerUUtheremainingelements.MSoAfarIAhaveAusedthewords\lattice",E\element",andA\term"ambiguously*.>Henceforth,whentheyarecapitalizedtheywilldenoteJavqaclasses,andwhen>uncapitalizedUUtheywilldenotemathematicalob8jects.6>Notes>1.This`pprogramisnotsogoGod`pfromabig-OpGerspective,7and`p10yearsago>itwouldprobablyhaveruntoGoslowlytobGeuseful,Fbutnow,Frunningona>Sunworkstation, itcancomputethefreemoGdularlatticeonthreegeneratorsin>abGoutUU2seconds,andcanprocesshundredsofelementsinacoupleminutes.M2. gTheoclassesdescribGedheredonotconstituteastand-aloneprogram,>bGecausenoneofthemhasacreate=aModLattice,w llintheinformationneededtobGeginthecomputation,>andIpasstheModLatticetothestart()methoGdinclassDriver.DnI'canprovide1*y?>examplesshowinghowthisisdone."Inparticular,IhavewrittenaclassFree >with)amain()methoGdthatstartsthecomputationofafreemodularlatticeon>anynumbGerofgenerators.8Onecouldgetbywithjustthis,bGecausetheprogram>hastheabilitytoimpGoserelations,andanymoGdularlatticeisaquotientofa>freeUUmoGdularlattice.6>DataStructuresuT>"V cmbx10ClassTMoQdLattice>ThisUUclassisthecoreoftheprogram.qModLatticehasthefollowing elds: Mprotected?Element[]elements:@1The)listofElements;8allowsthemtobGe>accessedUUbynumbGer.Mprotected?Element[][]table:gpThe@join/meettable.jNotethatitstores>Elements,malthoughhitcouldalsohavehbGeenmadetoholdtheirnumbers.'Since>eachUUElementstoresitsnumbGer,itworkseitherway*.Mprotected?intcurrentSize:KThenumbGerofrowsandcolumnsintable.>ItkUisnotreallydeterminedbythenumbGerofElements,becauseitwouldbe>inecientYtoresizetableeverytimeanewElementiscreated.currentSizeis>alsoUUthelengthofelements.Mprotected?intelementCount:TheqnumbGerofElementsthathavebGeen>created.Mprotected?EqRelmyEqRel:qTheUUequivqalencerelation.Mprotected?intcurrentRow,currentColumn:xThese.storethepGositionof>theUUnextsquareoftabletobGe lled.Mprotected?intauto:$ThenumbGerofautomorphismsused.~Thisprogram>has'5thecapabilitytouseautomorphismsinitscomputations.bgAny nitesubset>of\nthelattice'sautomorphismgroupthatisclosedunderinverses\nmaybGeused,>but9theidentity9shouldnotbGeusedbecauseitdoesnothelp.Theautomorphisms>areUUnumbGeredfrom0to(auto?-1).Mprotected?int[]inverse:Anuarrayoflengthauto.IntheithpGosition>itwholdsthenumbGerwoftheinversewoftheithautomorphism.,Thisarraymust>bGezcreatedbytheuserbeforeconstructingtheModLattice. 5Ifthelatticehas>nownontrivialautomorphisms,?ortheuserdoGesnotwishtousethem,theuser>suppliesUUanarrayoflength0.ک6>ClassTSelfDualMoQdLatticeuT>ThisUclassisasubGclassofModLattice.sItprovidestheabilitytousedualityin>theUUcomputations.qIthasnoextra elds.>ClassTT ermuT>ThisUUclasshasthefollowing elds:Mfinal?charop:\Indicates+UwhattypGeoftermthisis.cIfopis'v'(lowercase>V),*thenthetermisajoin;ifIfopis'^'(shift-6onmostkeybGoards),`Bthen>thetermisameet.ZbIfopisanyothercharacter,@thenthetermisagenerator.2y?>(Donotusewhitespacecharactersforgenerators|thiswillinterferewiththe >methoGdGUthatreadsalatticefroma le.)GInthecode,generatorsareusually>calledvqariables.Thecharacters'0'and'1'arespGecial;aTermwithop?'0'>(resp.q'1')UUisassumedtorepresenttheleast(resp.greatest)element.Mfinal?Elementarg1,arg2: These"aretheElementsthatthisTermisa>joinormeetof._NoteonlybinaryTermsareallowed.These eldsareusedonly>ifUUopis'v'or'^'.کMTheparametersrequiredtoconstructaTermaretheop,plusarg1andarg2>whenUUrelevqant.6>ClassTElemenƨ9tuT>ThisUUclasshasthefollowing elds:Mfinal?ModLatticemyLattice:-TheModLatticethatthisElementisin.D\If>oneUUwantsthesameElementinmorethanoneModLattice,itmustbGecopied.MTerm?myTerm:qTheUUTermthatthisElementwasde nedwith.MTerm?[]altTerms:xAnjarraythatholdsotherTermsthathavebGeenfound>equalUUtothisElement.Mint?altsUsed:#TheЛnumbGerofentriesinaltTerms.{Itsmaximumvqalueis>theUUconstantALTS.Mfinal?intmyNumber:Indicates8thepGositionofthisElementintheModLattice's>listUUofElements.Mfinal?intconjCount:qNumbGerUUofconjugates;equaltomyLattice.auto.MElement?[]conjugates:Array8oflengthconjCountthatholdsthisElement's>conjugates.MElement?dual:*DualofthisElement; usedonlyifthisElementisina>SelfDualModLattice.MThe*TparametersrequiredtoconstructanElementareaModLattice,_and>eitherUUaTermortheparameterstomakeaTerm.6>ClassTEqReluT>T*o8understandthisclass,qithelpstoknowthatJavqadoGesnothavetwo-dimensional>arrayslikethoseinCorPascal.1Instead,ithasarraysofarrays.1ThedeclarationWa?=newint[5][10]>alloGcatesspacefor50intsin5rowsof10, andalsoallocatesaspacefor5 >references,')which2is lledwiththereferencestothese verows.i]Butthenwe>can[makeanassignmentlikea[1]?=newint[20],]Tand[thentherowsofaare>noDlongerallthesamelength.lOW*ecanalsoassigna[2]?=a[3],H4makingDtwoof>theUUreferencespGointtothesamespace.MEqRelUUhasthefollowing elds:Mint?size:?ThevFEqRelrepresentsanequivqalencerelationontheintegersfrom>0UUtosize?-1.3y?Mint?[][]classes:classes[i]jholdstheintegersintheequivqalenceclass >ofd/i.UIfiandjareinthesameclass,gthenclasses[i]andclasses[j]pGoint>toUUthesamespace,sotheEqRelrequiresOG(size)space.کMTheonlyparameterrequiredtoconstructanEqRelisthesize.AInitiallythe>EqRel]]holdsthediagonalrelation;aaafterwardstherelationcanbGemadecoarser>butUUnot ner.MNotetAthattheEqRelonlymanipulatesnumbGers;ittAneverseestheElements>thatK@thesenumbGersK@represent.STheconversionbGetweenthenumbGersandthe>ElementsUUishandledbytheModLattice.6>UserInterfaceuT>The ninterfaceistext-basedandmenu-driven:theprogramprintsoutamenu>andFaskstheusertochoGoseacommandfromthemenubytypinginanumbGer.>BeforeUeachprintingofthemenu,Qthefollowinginformationisdisplayed:the>numbGerofElementsintheactiveModLattice,R.therowandcolumnnumbGers>of)thenextsquaretobGe lled,thesizeoftheModLattice,andthenumbGer)of>equivqalenceUUclasses.q(OnlyoneModLatticeisactiveatatime.)MMenuUUoptions:M1.qGenerateUUnewelements.MUser>owillbGepromptedforanumber,v7which>oshouldbegreaterthanthecurrent>numbGer6ofElements,/butnotgreaterthanthecurrentsize(itdoesnotresize>automatically*,bGecausetheusermaywishtorepeatedlygeneratesmallnumbers>of]unewElements,_}butitisinecienttorepGeatedlyresizebysmallincrements).>Thesprogramwill llsquaresinthetableuntileitherthetableisfull(which>generatesB!aspGecialannouncement)ortherequestednumbGerofElementshas>bGeenUUreached.M2.qComputeUUcongruence.MIf8theModLattice'sequivqalencerelationrecordsthatcertainpairsofElements>are}knowntobGeequal,thiscommandattemptstoderiveotherequalitiesfrom>these.ItVisnotexhaustive,WandusingittwiceinarowmayproGduceequalities>that:werenotproGducedthe rsttime.vTheword\congruence"isusedloGosely>here,u asningeneralthiscalculationisnotappliedtothesetofallelementsofa>lattice,butrathertoasetofTermsrepresenting(pGerhapsredundantly)asubset>ofUUitselements.M3.qImpGoseUUarelation.MThiszcommandallowstheusertoforcetwoElementstobGeconsideredequal.>TheUUuserwillbGepromptedforthenumbersUUofthetwoUUElements.M4.qF*ormUUquotientlattice.MThis8commandcausestheactiveModLatticetobGereplacedbyanewModLattice,>which5TisformedbydiscardingallbutoneElementfromeachequivqalenceclass,>andgrenumbGeringthosethatremain.6\Quotient"isusedloGosely*.6Ifcommand3>hasFnotbGeenused,thenthenewModLatticerepresentsthesamelatticethat4(y?>theoldModLatticerepresented,Obutifcommand3hasbGeenused,thenew >latticeUUisahomomorphicimageoftheoldone.MTheprogramkeepstrackofwhetherornotcommand3hasbGeenused.)7If>it_has,theninformingthenewModLattice,allinformationabGoutconjugates>and dualityisdiscarded,bGecausethesefeaturesarenotnecessarilyinheritedby>theUUquotientlattice.M5.qResize.MTheTuserispromptedforanewsize,TandtheModLattice'sjoin/meettable>andDElementlistareexpandedtothenewsize.%RepGeatedresizingbysmall>incrementsisinecient,factorUUof1:5unlessthiswouldexceedmemorylimitations.M6.qExamineUUasquareinthetable.MTheCuserispromptedforarownumbGerandcolumnnumbGer,zandtheprogram>displaysUUthenumbGeroftheElementinthissquareofthejoin/meettable.M7.qExamineUUarowinthejointableormeettable.MTheuserispromptedtoenter1forjoinsor2formeets,andtoenterthe>numbGerofanElementtoformjoinsormeetswith.*=Theformoftheoutputis>theUUsameaswhenthewholetableisprinted;see#9bGelow.M8.qExamineUUanelement.MTheuserispromptedforthenumbGeroftheElement.STheprogramdisplays>theElement'sde ningTerminbGothshortandlongform.QF*oragenerator,both>forms6arejustthegeneratoritself.numbGerszlofthetwozlarguments,withtheappropriatesymbGolinbetween,while>insthelongformthesenumbGerssarereplacedbythelongformofthede ning>TermsUUofthearguments,yieldinganexpressioninvolvingonlygenerators.MThefQprogramalsodisplaystheElement'sequivqalenceclass,theshortformsof>its8alternateTerms,qthenumbGers8ofitsconjugates,and,ifitisinaSelfDualModLattice,>theUUnumbGerofitsdual.qAnyunknowninformationisgivenas\n/a".M9.qOutputUUinformationtoa le.MThiscommandisforprintinginformationthatislikelytobGetoobigto t>onLthescreen.aItprintsasubmenu,JandpromptstheuserforanumbGeranda> lename.pIfRwthe lealreadyexists,S theoutputwillbGeappendedtoit.pOption1>inqHthesubmenuprintstheElementlist.F*oreachElement,xEtheprogramprints>its̐numbGerandboththeshortandlongformsofitsde ningTerm.ANOptions2,3,>and4printthejointable,meettable,andjoin/meettable,respGectively*.MV(There>isnojointableormeettablestoredinmemory;$thisinformationisreadfrom>thejoin/meettable.)?WEachrowofthetableisalineoftext,Gandforeachsquare,>thenumbGeroftheElementinthatsquareisprinted,or\n/a"ifthesquareis>empty*.)AththebGeginningofeachrowtherownumbGerisgiven,separatedfrom>therowbyacolon.Option5printstheequivqalencerelation.Eachclassis>printed7once,/ononelineoftext.EmOption6allowstheusertosavetoa lea>compGetedescriptionoftheactiveModLattice.&TheModLatticecanthenbe>reconstructedZfromthe lewithcommand13.cTheoutputofthisoptionisnot>intendedUUtobGereadbyhumans.M10.qChangeUUsettings.56My?MThis%{commandallowstheusertochangethesymbGolicconstantsthatdeter- >mine howmuchworkisdoneinthecomputations.XItdisplaysthecurrentvqalue>of/thesettings,7Kdisplaysasubmenu,7KandpromptstheuserforanumbGer.eCDEPTH>isuthedepthoftherecursionthattheprogramuseswhencomputingasquare>in=thetable.) DEPTH2isusedinplaceofDEPTHisǭalreadyknown.tNBothareinitiallysetto5.IncreasingDEPTHlorDEPTH2will>expGonentially!increasetheamountoftimeittakesto llasquare,,andthebase>of theexpGonentdependsonALTS,whichisthemaximumnumbGerofalternative>TermsanElementcanstore.ZUALTSisinitiallysetto6.MandNareusedincom->putingucongruences(seethedescriptionofthecomputeCongruence()methoGd>bGelow.)qMUUisinitiallysetto100,andNto10.M11.qPerformUUexhaustivecheck.MThisQcommandprovidesmoretoGolsforshowingthatElementsareequal.LThe>submenu@optionsare1.OCheckjoinassoGciativity*,2.OCheckmeetassoGciativity*,3.>Checkfjoin/meetcompatibility*,jMand4.CheckmoGdularity*.(Thereisnoneedto>checksymmetry*,bGecausethisisguaranteedbythewayjoinsandmeetsareread>fromtthetable.SoaModLatticewithafulltablethatpassesallthesetestsis>a bGona demodularlattice.)iInoptions1and2,foreverytripleofElements,>theprogramcomputesbGothsidesoftheidentity*,andifbothsidesareknown>andaLunequal,dJitrecordsintheequivqalencerelationthattheyareequal.Option>4(Hsimilarlyexaminesalltriplesthatsatisfytheappropriateinequality*.(Note>theprogramdoGesnotstorethelattice'sorderrelation;itknowsa1bonlyif>either^a?vbhasbGeenfoundtobeb,"ora?^bhasbGeenfoundtobea.)\Option>3Echecksthata_b=bifandonlyifa^b=a;K ifoneoftheseisfoundtruebut>theÚotherisnot,theotherismadetrueeitherby llinginanemptysquareor>byUUrecordingtheequalityoftwoElements.MOptionsUU1and2areverytime-consuming,but3and4runquickly*.M12.qUseUUothermethoGd.MThis.commandallowstheuseofcoGdewrittenbytheuser,withoutaltering>theprogram'scoGde.Y(F*orexample,theusermightwriteamethodto ndand>correctallfailuresofacertainidentity*.)GTheuserispromptedforthenameofa>class @andthenameofamethoGdinthatclass,andthenthemethodisexecuted,>withdttheactiveModLatticeasitsargument.!|ThemethoGdmustbGestatic,itmust>havewexactlyoneparameter,andthetypGeofthisparametermustbGeModLattice>(': cmti10notsasubGclassofModLattice).OThereturntypemustbeeitherModLatticeor>void.IfthemethoGdreturnsaModLattice,theactiveModLatticeisreplaced>byUUthereturnedone.M13.qReadUUlatticefrom le.MTheuserispromptedforthenameofa le,]whichshouldcontaintheun->moGdi ed3routputofcommand9option6(seeabove).f|The3ractiveModLatticeis>replacedUUwithoneconstructedfromthe le.M0.qQuit.MQuits.6Ey?>Classesandmetho`dsuT>ClassTDrivƨ9er>ThisJclassisamenu-drivenJuserinterfacethatallowstheusertoexaminethe >activeModLattice,andcallitsessentialmethoGds."ClassDriverisnotmeant>toUUbGeinstantiated;allofitsmembGersarestatic.کMFields:Mstatic?ModLatticemyLattice:qTheUUactiveModLattice.Mstatic?booleankeepAuto:Changestfromtruetofalseiftheuseruses>commandUU3.MMethoGds:Mpublic?staticvoidstart(ModLattice):ŬAaBModLatticeaEmustbGepassed>to@thismethoGdtogettheprogramstarted.2Itisanin niteloop(itrunsuntilthe>System.exit()|commandisreachedwhentheuserselectscommand0).passthroughtheloGopcallsprintMenu()toprintthemenu,\getLine()toget>theUUuser'schoice,andactOn(),explainedbGelow.Mprivate?staticStringgetLine(String):S-Igot"thismethoGdfromoneof>myXCSCinstructors.UsItdisplaysitsargumentasaprompt,Xandreturnstheuser's>respGonse.Mprivate?staticvoidactOn(String):6Thisprogramconvertsitsparam->eteriintoanumbGer,p.andexecutesthecommandcorrespondingtothenum->bGer,afterpromptingtheuserforanyfurtherinputneeded,anderror-checking>this}input.>Anyexceptionsresultingfrombadinputarecaught,triggeringan>InvalidCommandExceptionUUthattransferscontrolbacktostart().Mpublic?staticvoidprintSubMenu1()Mpublic?staticvoidactOnSub1(String)Mpublic?staticvoidprintSubMenu2()Mpublic?staticvoidactOnSub2(String)Mpublic?staticvoidprintSubMenu3()Mpublic?staticvoidactOnSub3(String):ThesemethoGdshandlethesub->menusUUgeneratedincommands9,10,and11.Mpublic?staticvoidoutputAll(PrintStream):AThisisthecoGdeforcom->mandUU9option6.Mpublic?staticvoidinputAll(BufferedReader):htThisPisthecoGdefor>commandUU13.Mpublic?staticStringelementNumber(Element):Represents8anElement>inUUaformthatcanbGedisplayed.Mpublic?staticStringelementNumber2(Element):>AUUvqariantformakingamachine-readableform,usedinoutputAll().Mpublic?staticElementnumberElement(String):>TheUUinverseofelementNumber2,usedininputAll().7UAy?>ClassTElemenƨ9tکuT>SeeUUDataStructuresabGoveUUforthedescriptionofthe eldsandconstructors.MMethoGds: Mpublic?StringtoString():;ProGducesFtheshortformofthede ningTerm.Mpublic?StringfullName():ĬProGduceslFthelongformofthede ningTerm.>IttRisrecursive;iftheElementisajoinorameet,|itputstheopGerationsymbGol>bGetweenUUthefullName()softhearguments,addingparenthesesifnecessary*.Mpublic?voidaddAlt(char,Element,Element)Mpublic?voidaddAlt(Term):~QStores[anewalternateTerm,]+ifthereisspace>forzitanditisnotequaltoonealreadystored.TheTermcanbGepassedwhole>orUUinparts.6>ClassTEqRel>SeetDataStructuresabGovetforageneraldescriptionoftheclassandadescription>ofUUthe elds.MMethoGds:Mpublic?booleanrelated(int,int):T*ellsϐifthetwoϐargumentsareinthe>sameUUequivqalenceclass.Mpublic?voidrelate(int,int):Merges=theequivqalenceclassesofthetwo>arguments.Mpublic?int[]classOf(int):LReturnstheequivqalenceclassoftheargu->ment.Mpublic?intrepresentative(int):ReturnskEthe rstElementoftheequiv->alenceUUclassoftheargument.Mpublic?int[]repSet(IntCellcount,intelementCount):vReturns׍a>setofclassrepresentatives.TheModLattice'selementCountisneededbGe->causeLVthesizeoftheModLattice(whichisalsothesizeoftheEqRel)maybGe>greaterrthanitselementCount,lsosomeoftheEqRel'snumbGersrdonotrepresent>Elements.|ThisYmethoGdignorestheseextranumbers.|TheYnumberYofrepresen->tativesisstoredintheIntCellparameter(thenumbGerthatwastherebGefore>isUUignored);thisnumbGerUUmaybGelessthanthelengthofthearrayreturned.Mpublic?intcountClasses(intelementCount):Returns|thenumbGer|of>equivqalencesclasses.&Again,numbGersthatdonotrepresentElementsareignored.Mvoid?resize(intnewSize):Adds^?newnumbGers^?totheequivqalencerela->tion;UUallofthenewnumbGersUUareinitiallyinone-elementclasses.6>ClassTInƨ9tCell>This1classenclosesasingleint eldcalledmyInt.eUnlikejava.lang.Integer,>theddIntCell'sintismutable.!wInthisprogram,IntCellisusedonlytoallowthe>methoGdEqRel.repSet()to\return"twovqalues:voneasthereturnvalue,and>onebymoGdifyingtheIntCellparameter.(TheotherwaytomakeamethoGd>\return"UUtwovqaluesistoreturnanob8jectthathasbGothvaluesas elds.)8 `y?>ClassTMoQdLatticeuT>SeeUUDataStructuresabGoveUUfordescriptionofthe elds.MMethoGds: Mvoid?fillCurrentSquare():C ThisisthecentralmethoGdoftheprogram.RIt>computesWthejoinormeetofthetwoWElementswhosenumbGersWarethecurrent>rowbOandthecurrentcolumn.TheopGeratorisjoinifrow?<=column,eandbOmeet>ifUUrow?>=column.MMostWoftheworkwithinfillCurrentSquare()isdonebythe16mutually>recursivemethoGdshandle1()throughhandle16().EachoftheseproGcessesa>di erentUU\termtypGe":J81.Wa8_b_c_d J82.Wa8_b_(c^d)J83.W(a8^b)_(c^d)J84.Wa8_((b_c)^d)J85.Wa8_(b^c^d)J86.Wa8_b_cJ87.Wa8_(b^c)J88.Wa8_bJ89.Wa8^b^c^dE810.Wa8^b^(c_d)E811.W(a8_b)^(c_d)E812.Wa8^((b^c)_d)E813.Wa8^(b_c_d)E814.Wa8^b^cE815.Wa8^(b_c)E816.Wa8^b>Wheniahandle()methoGdiscalled,thismeansthatthejoinormeetbeing >computedq,hasbGeenfoundtobeequaltoanexpressionofthecorresponding>typGe.MNotethat9through16arethedualsof1through8respGectively*. ;The>coGdeǞofhandle9()throughhandle16()isdualtothatofhandle1()through>handle8().MAllthehandle()methoGdshavevoidreturntypGe.^Theyhavethefollowing>parameters:9 ly?M2,3,or&4Elementscalleda,b,c,and&d,correspGondingtothepositionsof >a,UUb,c,anddintheabGoveUUlistof\termtypes";MAnayintcalledfresh.2Atmostoneofa,۪b,c,andaydcanbGe\fresh"and>sub8jectZto\recharacterization"(explainedbGelow).Avqalueof1meansais>fresh,O2meansbisfresh,3meanscisfresh,4meansdisfresh,and0means>thatWnoneisfresh.wSomeofthesemethoGdsneverrefertothisparameter,Wbutit>isUUinallofthemforuniformity;MAnintcalleddeep.Thisisdecreasedbyoneeachtimeanotherrecursive>callUUismade;whenitis0therecursionstops;andMTwoVectorscalledtermResultsandelementResults. V$Eachtimethe>handle9()8orhandle16()iscalled,qanappropriateTermisaddedtotermResults,>andɶeachtimethecalculationreducestoasingleElement,thisElementisadded>toUUelementResults.کMEach handle()methoGdcanperformvqariousmanipulations,Sdependingon>whaty{relationsa,tb,c,andy{dsatisfy*,tandwhethercertainjoinsandmeetsofthem>areCknown.kThereare5categoriesofmanipulations:hjoin,G'meet,recharacterize,>absorb,UUandapplymoGdularlaw.MJoin:rReplaceUtwoofa,b,c,anddwiththeirjoin. rF*orexample,in>handle1(),ifthejoinofbandcisknowntobGex,handle6()iscalledwith>theUUElementsa,d,andx.MMeet:qReplaceUUtwoofa,b,c,anddwiththeirmeet;similartojoin.MRecharacterize:OneoftheElementsa,b,c,anddis\fresh"ifitwasjust>createdEbyajoinormeetinthelasthandle()methoGdcalled.7Recharacterization>meanszreplacingthe\fresh"elementwithoneofitsTerms. F*orexample,in>handle6(),0Uif'cisfreshandoneofitsTermsisx?vy,then'handle1()iscalled>withDGa,b,x,andy;ifanotherTermofcisz?^w,thenhandle2()iscalled>witha,$b,z,andw.]Ineachhandle(),onlysomeoftheparametersareallowed>tocbGefresh,gnandthejoinandmeetmanipulationsaredesignedtorespectthese>restrictions.MAbsorb:Simplifyuusingoneoftheidentities(xy_y[)^x=xuand(xy^y)_x=x.>ThisFistheonlymanipulationthatcanyieldasingleElement.lF*orexample,Iin>handle5(),UUifaisequaltob,c,ord,itisaddedtoelementResults.MApplymoGdularlaw:gforexample,Dyinhandle7(),ifaisknowntobGec,>thenUUhandle15()iscalledwithc,a,andb.MWhenB9morethanoneofthesemanipulationsisapplicable,F themethoGddoes>allofthem.-ThisproGducesatreeofcallstohandle()methods,Pandthistreecan>bGe`verylarge.;Sometimesthesamehandle()methodwillbecalledrepeatedly>withCthesameElements;thisyieldsredundantcalculations.ClTheprogramcould>have8bGeenwrittentoeliminatethisredundancybyusingaHashtabletokeep>track5ofthecalls.I5didnotdothisbGecauseIsuspGectedthatthetimespent>checking.theHashtablewouldbGegreaterthanthetimesavedbyeliminating>theUUrepGetition.MNowIcexplainhowfillCurrentSquare()works.xThetwoElementsthat10 tWy?>arebGeingjoinedormeetedarestoredinthelocalvqariableslhsandrhs,and >theopGerationisstoredinthelocalvqariableop.N:FirsthandleTrivialCases()is>called.Thisg methoGd llsinthesquareinthecaseswhenlhs?==rhs,k{org when>oneUXofthemis0or1.qIfoneofthesecasesapplies,XhandleTrivialCases()>returnsUUtrue,andtherestoffillCurrentSquare()isskippGed.MOtherwiseyitnextcallspreparation().(_ThismethoGd rstchecksytoseeifthe>squarexisalready lled; ifso,theElementthereisaddedtoelementResults.>ThenNittriestocomputethejoinormeetviatheautomorphisms.]Ifanyof>theseUUcomputationssucceed,theresultsareaddedtoelementResults.MNextNhandleEasyCases()iscalled.^jThismethoGddetectscertaincasesin>whichtheanswerisimmediatelygivenbytheabsorptionidentities;0oanyanswer>foundUUhereisalsoaddedtoelementResults.MNext8dispatchOnOps()iscalled,qwhichcallstheappropriatehandle()methoGd>depGendingonwhetherthede ningTermsoflhsandrhsarejoins,/Fmeets,or>generators. Thedeepparameterofthehandle()methoGdisinitiallyassigned>DEPTH if5elementResultsisempty*,-andDEPTH2ifitisnot.yhThehandle()>methoGdsUUcanaddTermstotermResultsandElementstoelementResults.MNextcomesturnTermsToElements().F*oreachTermintermResults,Ithis>methoGdJcheckstoseeifitsvqalueisgiveninthetable.n-Ifso,LtheElementfound>isaddedtoelementResults;ootherwise,theTermisaddedtoaVectorcalled>unknownTerms.MIf-afterallthisworkelementResultsisstillempty*,makeNewElement()(not>to{~bGeconfusedwithmakeNewElements())iscalledtocreatethenewElement.>If'elementResultscontainsmorethanoneElement,[identify()iscalledto>recordUUthattheyareequal.MFinallygthesquareis lled,0andfillOtherSquares()iscalled.6#EachTermin>unknownTermsgivesajoinormeetthathasbGeenprovedequaltotheElementin>theWTcurrentsquare,WsothisElementisalsoplacedinthesquaresforthesejoins>and.meets.RAlso,@$theseTermsareinstalledastheElement'salternateTerms,>but0monlyifbGothoftheirargumentsareElementswithlowernumbGers.ezW*eonly>want todescribGeElementsintermsofsimplerElements,8vandhavingalower>numbGerUUcorrespondsapproximatelytohavingashorterTerm.MOtherUUmethoGdsinclassModLattice:Mpublic?voidmakeNewElements(inttotal):fThisiscommand1inthe>menu.#NotejthattheparameteristhetotaltobGereached,notthenumbGerofnew>Elements`tobGecreated.BThismethodrepeatedlycallsfillCurrentSquare()>toX llthecurrentsquareofthetable,andupdatePointer()to ndthenext>square,(untilJeithertherequirednumbGerofElementshavebGeenmade,(orthe>tableKis lled(inwhichcaseitannouncesthatthelatticeiscomplete.)nThenit>callsUUcomputeAllConjugates().Mprotected?Elementjoin(Element,Element)Mprotected?Elementjoin(int,int)Mprotected?Elementmeet(Element,Element)Mprotected?Elementmeet(int,int):OThesecmethoGdsareforlookingup>informationinthetable,Mnotforcomputingnewjoinsandmeets.Eitherthe11 y?>Elements ortheirnumbGers maybGeusedasarguments.Perhapsthereshould >alsobGemethodsthatacceptoneargumentofeachtypGe.O_ThesewouldbGeuseful,>butUUtheyseemlikebadstyletome.Mprotected?voididentify(Element,Element):CRecordstheequalityof>theseUUtwoElements.Mpublic?booleancomputeConjugate(Elemente,inti):>This(methoGdattemptstocomputethee ectofautomorphismionElement?e,>returningtrueifsuccessful.Itusesthede ningTermofe rst,andthenany>alternateW`Terms.wTheanswerisrecordedine.conjugates[i].Ifadi erent>answerisalreadyrecordedthere,identify()iscalled.lThismethoGdusesthe>helpGerUUcomputeConjugate(Term,?int).Mpublic?voidcomputeAllConjugates():jCallscomputeConjugate()with>everyUUElementandeveryautomorphism.Mvoid?computeCongruence():gThismethoGdiscommand2inthemenu. It>hashtwoparts.5Inthe rstpart,foreverytwoElementsthatarerelated,their>joiniandmeetareloGokedup;ifeitheroftheseisde ned,itismaderelatedto>the(twoElements.bThesecondpartdepGendsoftheconstantsM'andN.The rst>M=nontrivialHequivqalenceclassesareexamined,andforeachoftheseclassesthe> rstElementiscomparedtoeachofthenextN.F*orthetwoElementsbGeing>compared,MthecorrespGondingrowsofthejointableareexaminedsquareby>square.j>Any>discrepanciesare xedbyeither llinginemptysquaresorcalling>identify().qTheUUsameopGerationisdonewiththemeettable.Mpublic?ModLatticecollapse(boolean):6.This#iscommand4inthemenu.>Iftheargumentisfalse,allinformationabGoutautomorphismsisleftoutofthe>newtModLattice.ThismethoGdcreatesanewModLattice,|withnewlycreated>Elements correspGondingtoasetofclassrepresentatives oftheoldModLattice.>NotethateveryElementcontainsreferencestootherElements;}ifaclassrep->resentative(containsareferencetoElement?x,1thenthecorrespGondingElement>inthenewModLatticegetsacorrespGondingreferencetothenewElementthat>correspGondsUUtotheclassrepresentativeUUofx.Mvoid?resize(intnewSize):u^This iscommand5inthemenu.)Theinfor->mationinthejoin/meettableandtheElementlistiscopiedintolargernewly>alloGcatedUUarrays,andtheEqRelisresized.Mvoid?forceJoin(int,int)Mvoid?forceMeet(int,int): These!methoGdsarenotavqailablefromthe>menu;theyNcanonlybGeinvokedbyuser-writtencoGde.Theyforcethejoin>ormeetoftwoElements(whosenumbGersarethearguments)tobecomputed,>deviatingfromtheorderinwhichthetableisnormally lled.;Inmostsituations>thesemethoGdsshouldnotbeused,becausetheycauseElementstobenumbered>inunusualways.xTheyarenecessaryforsomeapplications,bGecauseonemust>createmYElementsbGeforeonecanidentifythem,sZbutsometimescreatingthemin>theUUusualsequencewouldtaketoGolongorusetoomuchUUspace.MIfelementCount?==currentSizewhentheuserattemptstouseoneof>theseDtwomethoGdsto llanemptysquareinthetable,H"theprogramwillcrash.>Any1coGdethatinvokesforceJoin()orforceMeet()shouldhaveasafeguard>toUUpreventthis.12 py?>ClassTSelfDualMoQdLatticeکuT>ThisdclassisasubGclassofModLattice.!IthasmethodscomputeDual()and >computeAllDuals()'thatareanalogoustoModLattice'scomputeConjugate()>and8computeAllConjugates().Itoverrides8theModLatticemethoGdsmakeNewElements(),>preparation(),makeNewElement(),and6collapse(),ineachcaseaddingin->structionsX9todealwithduals,Xwhichareanaloguesoftheinstructionsthatdeal>with8conjugates.Incollapse(),qiftheargumentistrue,anewSelfDualModLattice>isE=constructed,7retainingtheinformationabGoutduals,butiftheargumentis>false,$aModLatticethatisnotaSelfDualModLatticeisreturned,without>thisUUinformation.6>ClassTT erm>MethoGds:Mpublic?booleanequals(Term):TwoƒTermsareconsideredequalifthey>have}>thesameopGerationandthesametwo}>arguments,9eveniftheorderofthe>argumentsUUisreversed.Mpublic?StringtoString():,IfthisTermisajoinorameet,/thismethoGd>returnsOtheopGerationsymbolinbetweenOthenumbersOofthetwoOarguments;>otherwiseUUitreturnsaStringconsistingofthegenerator.6>Performanceissues>BecauseethisprogramdoGesnotstopcomputingwhenithasfoundananswer,>increasingitscomputationalcapability(byusingautomorphismsandduality*,>byeincreasingDEPTH,DEPTH2,iorALTS,orbymoGdifyingthecode)makesitrun>slower,though̖itshouldyieldbGetterresults.However,bGetter̖resultscansave>time.[]F*orexample,!Sonemightusecommand1to ndthenext100elements,>andthen ndafterfurthercomputationthatthose100reducetoonly6distinct>newelements.OnemighthavetorepGeatthisprocedure15timesto ndthe>desired100newelements. tIfonecouldcomputemoreslowlyand ndthe>100 distinctelementsonthe rsttry*,7EthatmightbGefaster.Also,7Eusingmore>computationalpGowermayincreasethenumbGerofsquaresthatare lledby>fillOtherSquares();thisjwillsavejtimelaterifDEPTH2issetlowerjthanDEPTH.6>Possiblemo`di cationsandextensions>Themanipulationsusedinthehandle()methoGdsarenottheonlypossible>ones.EThereNweresomethatI-delibGeratelyleftoutbecauseI-thoughttheywould>primarily{leadtoredundantcalculations.TheremaybGeotherusefulonesthat>diddbnotoGccurtome.F*eelfreetoaddandremovedbmanipulationsasyousee t.>Other5handle()methoGdscouldalsobeaddedtodealwithlongerexpressions.>dispatchOnOps()YhcouldbGemodi edtodigdeeperintolhsandrhs,Zmandstart>theUUcomputationwithalongerexpression.MOne8couldtryusingaHashtabletoeliminateredundantcallstothehandle()>methoGds.fThis4Wmightspeedupexecution,:especiallyforhighervqaluesofDEPTH.13y?MIhavesaidthatthisprogramisforstudyingmoGdularlattices,$butitcould >easily\mbGemodi edtohandlenonmodularlatticesbyremovingalluseofmoGdu->larity6inthecoGde.piModularity6isusedinonlytwoplaces:the\applymoGdular>law"'manipulationsinthehandle()methoGds,\andthe\CheckmoGdularlaw">commandUUintheDriver.MOtherϘpropGertiesoflattices,Ysuchasthesemidistributivelaws,YcouldbGein->corpGoratedFasnewmanipulationsinthehandle()methods.C(Ifyouwantto>computeeindistributivelattices,iIethinkamuchsimplerprogramthanthisone>wouldsuce.)PropGertiesinvolvinglongerexpressions,NsuchastheArguesian>identity*,'couldFbGeincorporatedinthesamewayFiftheappropriatehandle()>methoGdswwereincluded.EHowever,IUthinkitwouldbGemoreecienttodealwith>such.propGertiesbywritingseparatemethoGds(invokedthroughcommand12)to>searchUUforandcorrectfailures.MThis|programhasnodatastructurethatdirectlyrepresentstheorderrela->tionofalattice.TherearemanyplacesinthecoGdewheretheprogramneeds>to AknowthatoneElementislessthananother,*andcurrentlyitcanonlydeter->minethisifthejoinormeetofthetwoElementshasbGeencomputed. aIfthis>datastructurewereadded,WtherewouldbGewaysthatcomparabilitiescouldbGe>determined,UUstored,andusedbGeforethejoinandmeetwerecomputed.MItshouldbGeeasytomodifyDrivertohavemultipleactiveModLattices.>PerhapsI?aclasscalledHomomorphismcouldbGedesignedtorepresenthomomor->phismsUUbGetweentheactiveModLattices.MSomeachangescouldbGemadeinthewayalternateTermsarestoredin>Elements.Currently*,anRElementonlystoresTermsthatinvolvetwolower->numbGered Elements,becauseElementswithlowernumbGersarepresumedtobe>simplery(thiscriteriaisencoGdedinModLattice'sfillOtherSquares()method,>whichOcallsElement'saddAlt()methoGd).7Instead,everyTermcouldbGemadeto>computeitsownlength,andlengthcouldbGeusedasthecriterionforsimplicity*.>Also,ecurrently/otheaddAlt()methoGdacceptsthe rstALTS/7Termsthatmeet>thejcriterion.Instead,itcouldbGewillingtodiscardaTerminordertoaccept>onethatisbGetterinsomesense.J\Better"mightmeanthatitisshorter,֖orthat>ithaslowerjoinandsorhighermeetands.FjAlso,ifanElement'sTermsareall>joins,UUitwouldbGeusefultoreplaceoneofthemwithameet.14Կ=;y': cmti10"V cmbx10 cmmi10K`y cmr10].Ifadi erent>answerisalreadyrecordedthere,identify()iscalled.lThismethoGdusesthe>helpGerUUcomputeConjugate(Term,?int).Mpublic?voidcomputeAllConjugates():jCallscomputeConjugate()with>everyUUElementandeveryautomorphism.Mvoid?computeCongruence():gThismethoGdiscommand2inth