def MOLS_table(start, stop=None, compare=False, width=None): r""" Prints the MOLS table that Sage can produce. INPUT: - ``start,stop`` (integers) -- print the table of MOLS for value of `n` such that ``start<=n<stop``. If only one integer is given as input, it is interpreted as the value of ``stop`` with ``start=0`` (same behaviour as ``range``). - ``compare`` (boolean) -- if sets to ``True`` the MOLS displays with `+` and `-` entries its difference with the table from the Handbook of Combinatorial Designs (2ed). - ``width`` (integer) -- the width of each column of the table. By default, it is computed from range of values determined by the parameters ``start`` and ``stop``. EXAMPLES:: sage: from sage.combinat.designs.latin_squares import MOLS_table sage: MOLS_table(100) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ________________________________________________________________________________ 0| +oo +oo 1 2 3 4 1 6 7 8 2 10 5 12 4 4 15 16 5 18 20| 4 5 3 22 7 24 4 26 5 28 4 30 31 5 4 5 8 36 4 5 40| 7 40 5 42 5 6 4 46 8 48 6 5 5 52 5 6 7 7 5 58 60| 5 60 5 6 63 7 5 66 5 6 6 70 7 72 5 7 6 6 6 78 80| 9 80 8 82 6 6 6 6 7 88 6 7 6 6 6 6 7 96 6 8 sage: MOLS_table(100, width=4) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ____________________________________________________________________________________________________ 0| +oo +oo 1 2 3 4 1 6 7 8 2 10 5 12 4 4 15 16 5 18 20| 4 5 3 22 7 24 4 26 5 28 4 30 31 5 4 5 8 36 4 5 40| 7 40 5 42 5 6 4 46 8 48 6 5 5 52 5 6 7 7 5 58 60| 5 60 5 6 63 7 5 66 5 6 6 70 7 72 5 7 6 6 6 78 80| 9 80 8 82 6 6 6 6 7 88 6 7 6 6 6 6 7 96 6 8 sage: MOLS_table(100, compare=True) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ________________________________________________________________________________ 0| + + 20| 40| 60| + 80| sage: MOLS_table(50, 100, compare=True) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ________________________________________________________________________________ 40| 60| + 80| """ from orthogonal_arrays import largest_available_k if stop is None: start, stop = 0, start # make start and stop be congruent to 0 mod 20 start = start - (start % 20) stop = stop - 1 stop = stop + (20 - (stop % 20)) assert start % 20 == 0 and stop % 20 == 0 if stop <= start: return if compare: from sage.misc.misc import SAGE_SHARE handbook_file = open( SAGE_SHARE + "/combinatorial_designs/MOLS_table.txt", 'r') hb = map(int, handbook_file.readlines()[9].split(',')) handbook_file.close() # choose an appropriate width (needs to be >= 3 because "+oo" should fit) if width is None: from sage.rings.integer import Integer width = max(3, Integer(stop - 1).ndigits(10)) from string import join print " " * (width + 2) + join("{i:>{width}}".format(i=i, width=width) for i in range(20)) print " " * (width + 1) + "_" * ((width + 1) * 20), for i in range(start, stop): if i % 20 == 0: print "\n{:>{width}}|".format(i, width=width), k = largest_available_k(i) - 2 if compare: if i < 2 or hb[i] == k: c = "" elif hb[i] < k: c = "+" else: c = "-" else: if i < 2: c = "+oo" else: c = k print '{:>{width}}'.format(c, width=width),
def MOLS_table(start,stop=None,compare=False,width=None): r""" Prints the MOLS table that Sage can produce. INPUT: - ``start,stop`` (integers) -- print the table of MOLS for value of `n` such that ``start<=n<stop``. If only one integer is given as input, it is interpreted as the value of ``stop`` with ``start=0`` (same behaviour as ``range``). - ``compare`` (boolean) -- if sets to ``True`` the MOLS displays with `+` and `-` entries its difference with the table from the Handbook of Combinatorial Designs (2ed). - ``width`` (integer) -- the width of each column of the table. By default, it is computed from range of values determined by the parameters ``start`` and ``stop``. EXAMPLES:: sage: from sage.combinat.designs.latin_squares import MOLS_table sage: MOLS_table(100) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ________________________________________________________________________________ 0| +oo +oo 1 2 3 4 1 6 7 8 2 10 5 12 4 4 15 16 5 18 20| 4 5 3 22 7 24 4 26 5 28 4 30 31 5 4 5 8 36 4 5 40| 7 40 5 42 5 6 4 46 8 48 6 5 5 52 5 6 7 7 5 58 60| 5 60 5 6 63 7 5 66 5 6 6 70 7 72 5 7 6 6 6 78 80| 9 80 8 82 6 6 6 6 7 88 6 7 6 6 6 6 7 96 6 8 sage: MOLS_table(100, width=4) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ____________________________________________________________________________________________________ 0| +oo +oo 1 2 3 4 1 6 7 8 2 10 5 12 4 4 15 16 5 18 20| 4 5 3 22 7 24 4 26 5 28 4 30 31 5 4 5 8 36 4 5 40| 7 40 5 42 5 6 4 46 8 48 6 5 5 52 5 6 7 7 5 58 60| 5 60 5 6 63 7 5 66 5 6 6 70 7 72 5 7 6 6 6 78 80| 9 80 8 82 6 6 6 6 7 88 6 7 6 6 6 6 7 96 6 8 sage: MOLS_table(100, compare=True) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ________________________________________________________________________________ 0| + + 20| 40| 60| + 80| sage: MOLS_table(50, 100, compare=True) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ________________________________________________________________________________ 40| 60| + 80| """ from orthogonal_arrays import largest_available_k if stop is None: start,stop = 0,start # make start and stop be congruent to 0 mod 20 start = start - (start%20) stop = stop-1 stop = stop + (20-(stop%20)) assert start%20 == 0 and stop%20 == 0 if stop <= start: return if compare: from sage.misc.misc import SAGE_SHARE handbook_file = open(SAGE_SHARE+"/combinatorial_designs/MOLS_table.txt",'r') hb = map(int,handbook_file.readlines()[9].split(',')) handbook_file.close() # choose an appropriate width (needs to be >= 3 because "+oo" should fit) if width is None: from sage.rings.integer import Integer width = max(3,Integer(stop-1).ndigits(10)) from string import join print " "*(width+2) + join("{i:>{width}}".format(i=i,width=width) for i in range(20)) print " "*(width+1) + "_"*((width+1)*20), for i in range(start,stop): if i%20==0: print "\n{:>{width}}|".format(i,width=width), k = largest_available_k(i)-2 if compare: if i < 2 or hb[i] == k: c = "" elif hb[i] < k: c = "+" else: c = "-" else: if i < 2: c = "+oo" else: c = k print '{:>{width}}'.format(c,width=width),