diff --git a/setup.py b/setup.py index b20748a..5e842fd 100644 --- a/setup.py +++ b/setup.py @@ -205,7 +205,8 @@ def run(self): 'networkx', 'packaging', 'snappy_manifolds>=1.4', - 'knot_floer_homology>=1.2.2'] + 'knot_floer_homology>=1.2.2', + 'opt_einsum>=3.4.0'] setup( name = 'spherogram', version = version, @@ -214,9 +215,11 @@ def run(self): dependency_links = [], packages = ['spherogram', 'spherogram.links', 'spherogram.links.bands', 'spherogram.links.test', 'spherogram.codecs', - 'spherogram.dev', 'spherogram.dev.dev_jennet'], + 'spherogram.dev', 'spherogram.dev.dev_jennet', + 'spherogram.links.reshetikhin_turaev'], package_dir = {'spherogram' : 'spherogram_src', 'spherogram.dev':'dev'}, - package_data = {'spherogram.links' : ['doc.pdf']}, + package_data = {'spherogram.links' : ['doc.pdf'], + 'spherogram.links.reshetikhin_turaev': ['R_matrices/*/*']}, ext_modules = ext_modules, cmdclass = {'clean': SpherogramClean, 'test': SpherogramTest, diff --git a/spherogram_src/__init__.py b/spherogram_src/__init__.py index fc98bef..7a06789 100644 --- a/spherogram_src/__init__.py +++ b/spherogram_src/__init__.py @@ -1,6 +1,7 @@ from .presentations import * from .links import * from .codecs import * +from .links.reshetikhin_turaev import DictLaurentPolynomial, RMatrix, colored_links_gould_R_matrices, colored_jones_R_matrices, prefactor_colored_jones # Make the module version number easily accessible. from . import version as _version @@ -23,4 +24,5 @@ def version(): # from spherogram.links.tangles: 'Tangle', 'CapTangle', 'CupTangle', 'RationalTangle', 'ZeroTangle', 'InfinityTangle', 'MinusOneTangle', 'OneTangle', 'IntegerTangle', - 'IdentityBraid', 'BraidTangle', 'ComponentTangle', 'join_strands'] + 'IdentityBraid', 'BraidTangle', 'ComponentTangle', 'join_strands', + 'DictLaurentPolynomial', 'RMatrix', 'colored_links_gould_R_matrices', 'colored_jones_R_matrices', 'prefactor_colored_jones'] diff --git a/spherogram_src/links/invariants.py b/spherogram_src/links/invariants.py index 2729340..0caa8f9 100644 --- a/spherogram_src/links/invariants.py +++ b/spherogram_src/links/invariants.py @@ -88,7 +88,6 @@ def sage_braid_as_int_word(braid): see the documentation for the "sage_link" method for details. """ - class Link(links_base.Link): __doc__ = links_base.Link.__doc__ + extra_docstring @@ -331,6 +330,157 @@ def alexander_polynomial(self, multivar=True, v='no', method='default', if multivar and factored: # it's easier to view this way return p.factor() return p + + def colored_links_gould_polynomial(self, + n, + sage_output=_within_sage, + sage_polynomials=False, + timed=False): + """ + Computes the n-colored Links--Gould polynomial of a link. + The output is an instance of Sage's LaurentPolynomial if in sage, + otherwise a DictLaurentPolynomial. + + Colored Links--Gould polynomials are bivariate, for which we default to + using DictLaurentPolynomial during the procedure to reduce RAM consumption. + + >>> Link('3_1').colored_links_gould_polynomial(1) + t^2*q^2 - t*q^3 - t*q + 2*q^2 - t^-1*q^3 + 1 - t^-1*q + t^-2*q^2 + >>> Link('4_1').colored_links_gould_polynomial(1) + t^2 - 3*t*q + 2*q^2 - 3*t*q^-1 + 7 - 3*t^-1*q + 2*q^-2 - 3*t^-1*q^-1 + t^-2 + + Mirror image is equal to substituting q with q^-1: + + >>> mtref = Link('3_1').mirror() + >>> mtref_LG = mtref.colored_links_gould_polynomial(1, sage_output=False) + >>> mtref_LG.change_vars({'q': 'q^-1'}) + t^2*q^2 - t*q^3 - t*q + 2*q^2 - t^-1*q^3 + 1 - t^-1*q + t^-2*q^2 + + The colored Links--Gould polynomial specializes to the square of + the Alexander polynomial: + + >>> tref_LG = Link('3_1').colored_links_gould_polynomial(1, sage_output=False) + >>> tref_LG.change_vars({'q': '1'}) + t^2 - 2*t + 3 - 2*t^-1 + t^-2 + >>> fig8_LG = Link('4_1').colored_links_gould_polynomial(1, sage_output=False) + >>> fig8_LG.change_vars({'q': '1'}) + t^2 - 6*t + 11 - 6*t^-1 + t^-2 + + 1-colored Links--Gould polynomial is invariant under mutation: + + >>> conway_LG = Link('11n34').colored_links_gould_polynomial(1) + >>> KT_LG = Link('11n42').colored_links_gould_polynomial(1) + >>> conway_LG == KT_LG + True + + A mutation pair with the same 2-colored Links--Gould polynomial: + + >>> K1 = Link('12n364') + >>> K2 = Link('12n365').mirror() + >>> K1.colored_links_gould_polynomial(2) == K2.colored_links_gould_polynomial(2) + True + + Some higher colored values for the trefoil: + + >>> K = Link('3_1') + >>> K.colored_links_gould_polynomial(2) # doctest: +NORMALIZE_WHITESPACE + -t^2*q^5 + t*q^6 + t^2*q^4 - t*q^5 + t*q^4 - 2*q^5 + t^-1*q^6 + t^2*q^2 + - 2*t*q^3 + 2*q^4 - t^-1*q^5 + t^-1*q^4 - t^-2*q^5 - t*q + 2*q^2 - + 2*t^-1*q^3 + t^-2*q^4 + 1 - t^-1*q + t^-2*q^2 + + >>> K.colored_links_gould_polynomial(3) # doctest: +NORMALIZE_WHITESPACE + -t*q^27 + t^2*q^24 + t*q^25 - t^-1*q^27 - t^2*q^22 + t*q^23 + 2*q^24 + + t^-1*q^25 - t^2*q^20 - 2*t*q^21 - 2*q^22 + t^-1*q^23 + t^-2*q^24 + + t^2*q^18 + 2*t*q^19 - 2*q^20 - 2*t^-1*q^21 - t^-2*q^22 - t^2*q^16 + + t*q^17 + 2*q^18 + 2*t^-1*q^19 - t^-2*q^20 - 2*t*q^15 - 2*q^16 + t^-1*q^17 + + t^-2*q^18 + t^2*q^12 + t*q^13 - 2*t^-1*q^15 - t^-2*q^16 + 2*q^12 + + t^-1*q^13 - 2*t*q^9 + t^-2*q^12 + t^2*q^6 - 2*t^-1*q^9 + 2*q^6 - t*q^3 + + t^-2*q^6 - t^-1*q^3 + 1 + + >>> K.colored_links_gould_polynomial(4) # doctest: +NORMALIZE_WHITESPACE + t*q^24 - t^2*q^22 - t*q^23 + t^2*q^21 - t*q^22 + t^-1*q^24 + t^2*q^20 - + 2*q^22 - t^-1*q^23 + 2*t*q^20 + 2*q^21 - t^-1*q^22 - t^2*q^18 - t*q^19 + + 2*q^20 - t^-2*q^22 - 2*t*q^18 + 2*t^-1*q^20 + t^-2*q^21 + t^2*q^16 + + t*q^17 - 2*q^18 - t^-1*q^19 + t^-2*q^20 - t^2*q^15 + 2*t*q^16 - 2*t^-1*q^18 + - t^2*q^14 + 2*q^16 + t^-1*q^17 - t^-2*q^18 - 2*t*q^14 - 2*q^15 + 2*t^-1*q^16 + + t^2*q^12 + 2*t*q^13 - 2*q^14 + t^-2*q^16 - t^2*q^11 + t*q^12 - 2*t^-1*q^14 + - t^-2*q^15 + 2*q^12 + 2*t^-1*q^13 - t^-2*q^14 - 2*t*q^10 - 2*q^11 + t^-1*q^12 + + t^2*q^8 + t*q^9 + t^-2*q^12 - 2*t^-1*q^10 - t^-2*q^11 + 2*q^8 + t^-1*q^9 - + 2*t*q^6 + t^2*q^4 + t^-2*q^8 - 2*t^-1*q^6 + 2*q^4 - t*q^2 + t^-2*q^4 - t^-1*q^2 + + 1 + """ + from .reshetikhin_turaev import colored_links_gould_R_matrices, DictLaurentPolynomial + + ans = self.min_long_diagram().reshetikhin_turaev_network(colored_links_gould_R_matrices(n, sage_polynomials=sage_polynomials)).evaluate(timed=timed) + + if sage_output: + if not sage_polynomials: + ans = (ans[0].to_sage(), ans[1]) + else: + if sage_polynomials: + ans = (DictLaurentPolynomial.from_sage(ans[0]), ans[1]) + else: + ans = (ans[0].to_checked(), ans[1]) + + if timed: + return ans + else: + return ans[0] + + def colored_jones_polynomial(self, + n, + sage_output=_within_sage, + sage_polynomials=_within_sage, + timed=False): + """ + Computes the n-colored Jones polynomial of a link. + The output is an instance of Sage's PuiseuxSeries if in sage, + otherwise a DictLaurentPolynomial. + + The 1-colored Jones polynomial is equal to the usual Jones polynomial. + Here we follow the ordinary convention of variables for Jones polynomials, + instead of the squared q in jones_polynomial() + + Colored Jones polynomials are univariate, for whom sage's PuiseuxSeries + has highly optimized multiplications, hence we default to use sage + during the procedure whenever possible. + + >>> Link('3_1').colored_jones_polynomial(1) + -q^-4 + q^-3 + q^-1 + >>> Link('4_1').colored_jones_polynomial(1) + q^-2 - q^-1 + 1 - q + q^2 + >>> Link('L2a1').colored_jones_polynomial(1) + q^(-5/2) + q^(-1/2) + + Some values of higher colored Jones polynomials for the trefoil: + + >>> Link('3_1').colored_jones_polynomial(2) + q^-11 - q^-10 - q^-9 + q^-8 - q^-7 + q^-5 + q^-2 + >>> Link('3_1').colored_jones_polynomial(3) # doctest: +NORMALIZE_WHITESPACE + -q^-21 + q^-20 + q^-19 - q^-17 + q^-15 - q^-14 - q^-13 + q^-11 - q^-10 + q^-7 + + q^-3 + >>> Link('3_1').colored_jones_polynomial(4) # doctest: +NORMALIZE_WHITESPACE + q^-34 - q^-33 - q^-32 + 2*q^-29 - q^-28 + 2*q^-24 - q^-23 - q^-22 + q^-19 - + q^-18 - q^-17 + q^-14 - q^-13 + q^-9 + q^-4 + """ + from .reshetikhin_turaev import colored_jones_R_matrices, prefactor_colored_jones, DictLaurentPolynomial + + ans = self.min_long_diagram().reshetikhin_turaev_network(colored_jones_R_matrices(n, sage_polynomials=sage_polynomials)).evaluate(timed=timed) + ans = (ans[0] * prefactor_colored_jones(n, self.writhe(), sage_polynomial=sage_polynomials), ans[1]) + + if sage_output: + if not sage_polynomials: + ans = (ans[0].to_sage(), ans[1]) + else: + if sage_polynomials: + ans = (DictLaurentPolynomial.from_sage(ans[0]), ans[1]) + else: + ans = (ans[0].to_checked(), ans[1]) + + if timed: + return ans + else: + return ans[0] def knot_floer_homology(self, prime=2, complex=False): """ diff --git a/spherogram_src/links/links_base.py b/spherogram_src/links/links_base.py index 51e559a..8a9bd4b 100644 --- a/spherogram_src/links/links_base.py +++ b/spherogram_src/links/links_base.py @@ -893,7 +893,8 @@ def reverse_orientation(self, component_index): """ Reverse the orientation of components specified by component_index. - component_index: either a single index of component or a list of indices of components + component_index: either a single index of component + or a list of indices of components >>> L = Link([(4, 0, 5, 3), (0, 6, 1, 5), (6, 2, 7, 1), (2, 4, 3, 7)]) >>> L @@ -1370,6 +1371,57 @@ def keep(C): A[a] = B[b] return type(self)(final_crossings, check_planarity=False) + + def long_diagram(self, cut_at=None): + """ + Returns the long diagram of self obtained + by cutting open the strand specified by cut_at. + + cut_at should be a pair of integers (i, j) + representing the j-th strand of the i-th crossing. + If not specified, the first strand of the first + crossing will be chosen by default. + + >>> T = Link('4_1').long_diagram() + >>> T.PD_code() + ((1, 1), [(0, 5, 1, 6), (4, 1, 5, 2), (2, 8, 3, 7), (6, 4, 7, 3)], [0, 8]) + """ + from .tangles import Tangle + L = self.copy() + + if cut_at is None: + strand = L.crossings[0].crossing_strands()[0] + else: + i, j = cut_at + strand = L.crossings[i].crossing_strands()[j] + + open_strands = [strand, strand.opposite()] + + for c in L.crossings: + c._clear() + + return Tangle((1,1), L.crossings, open_strands) + + def min_long_diagram(self): + """ + Return the long diagram of self with the minimal contraction width + """ + + if not self.crossings: + return self.long_diagram() + + min_width = None + + for i in range(len(self.crossings)): + entry_indices = [3, 0] if self.crossings[i].sign == 1 else [0, 1] + for j in entry_indices: + diagram = self.long_diagram(cut_at=(i,j)) + width = diagram.contraction_width()[0] + if min_width is None or width < min_width: + ans = diagram + min_width = width + + return ans def __len__(self): return len(self.crossings) diff --git a/spherogram_src/links/reshetikhin_turaev/RT_network.py b/spherogram_src/links/reshetikhin_turaev/RT_network.py new file mode 100644 index 0000000..8d9683f --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/RT_network.py @@ -0,0 +1,476 @@ +class DirectedEdge: + __slots__ = ["label", "index", "sign", "reversed_edge"] + + def __init__(self, label, reversed_edge=None): + self.label = label + self.index = max(label, ~label) + self.sign = 1 if label == self.index else -1 + + if reversed_edge is None: + reversed_edge = DirectedEdge(~self.label, self) + self.reversed_edge = reversed_edge + + def __str__(self): + return ("" if self.sign == 1 else "~") + str(self.index) + + def __repr__(self): + return str(self) + + def __hash__(self): + return hash(self.label) + + def __eq__(self, other): + return self.label == other.label + + def __invert__(self): + return self.reversed_edge + + +class RTNetwork: + + def __init__( + self, + tensors, + T=None, + network=None, + rot_num=None, + boundary=None, + boundary_labels=None, + ): + """ + Represent the tensor network obtained by applying + the Reshetikhin--Turaev functor determined by the + given RMatrix tensors to the tangle T. + + The network is represented as a list of pairs (tensor, legs) + + Requires numpy and opt_einsum modules for finding out the optimal contraction sequences + """ + self.tensors = tensors + + if T is not None: + assert ( + T.is_upward() + ), "Tangle should be upward for the Reshetikhin--Turaev functor to apply" + self.rot_num = T.rot_num() + self.tangle = T.copy() + + self.boundary = T.boundary + self.boundary_labels = T.strand_labels + + self.idle_labels = set(self.boundary_labels) + + self.edge = edge = dict() + + self.network = network = [] + for c in T.crossings: + labels = c.strand_labels + for lab in labels: + if lab not in edge.keys(): + edge[lab] = DirectedEdge(lab) + + if c.sign == 1: + key = ( + ~edge[labels[3]], + ~edge[labels[0]], + edge[labels[2]], + edge[labels[1]], + ) + else: + assert c.sign == -1, f"Crossing {c} is not oriented" + key = ( + ~edge[labels[0]], + ~edge[labels[1]], + edge[labels[3]], + edge[labels[2]], + ) + + if tensors is not None: + tensor = tensors.R(c.sign) + for i, e in enumerate(list(key[:2])): + if e.index in self.idle_labels and self.rot_num[e.index] != 0: + perm = list(range(i)) + [3] + list(range(i, 3)) + tensor = tensor.decorated_contract( + tensors.h(0), + {(i, 1): (1, tensors.h(self.rot_num[e.index]))}, + ) + tensor = tensor.permute(perm) + + network.append((tensor, key)) + else: + network.append((None, key)) + + for arc in self.idle_labels: + if arc not in edge.keys(): + edge[arc] = DirectedEdge(arc) + + if tensors is not None: + network.append((tensors.h(0), (~edge[arc], edge[arc]))) + else: + network.append((None, (~edge[arc], edge[arc]))) + else: + assert all( + item is not None + for item in (network, rot_num, boundary, boundary_labels) + ) + self.network = network + self.rot_num = rot_num + self.boundary = boundary + self.boundary_labels = boundary_labels + self.idle_labels = set(boundary_labels) + + self.edge = edge = dict() + for _, key in network: + for e in key: + if e.index not in edge.keys(): + edge[e.index] = e if e.sign == 1 else ~e + + def __eq__(self, other): + if len(self.network) != 1 or len(other.network) != 1: + raise NotImplementedError( + "Equality is only implemented for contracted networks" + ) + else: + return self.network[0][0] == other.network[0][0] + + def optimal_contraction_sequence(self): + try: + import opt_einsum as oe + except ImportError: + raise ModuleNotFoundError( + "Module opt_einsum is required for computing the optimal contraction sequences" + ) + + class _ShapeOnly: + __slots__ = ["shape"] + + def __init__(self, shape): + self.shape = shape + + oe_network = [] + idle = set(self.idle_labels) + for tensor, key in self.network: + if len(key) == 2 and key[0].index == key[1].index: + try: + idle.remove(key[0].index) + except: + raise ValueError(f"key {key[0].index} not found in {idle}") + else: + shape = tensor.shape if tensor is not None else tuple(8 for _ in key) + oe_network.append(_ShapeOnly(shape)) + oe_network.append([edge.index for edge in key]) + + return oe.contract_path(*oe_network, idle)[0] + + @staticmethod + def local_contraction_width(abstract_network, indices): + idx1, idx2 = indices + ans = list(abstract_network) + key1 = abstract_network[idx1] + key2 = abstract_network[idx2] + + contracted_indices = set() + + pairs = [] + for pos_i, ei in enumerate(key1): + for pos_j, ej in enumerate(key2): + if ei.index == ej.index and ei.sign * ej.sign == -1: + pairs.append((pos_i, pos_j)) + contracted_indices.add(ei.index) + + contracted1 = {pos_i for pos_i, _ in pairs} + contracted2 = {pos_j for _, pos_j in pairs} + + if idx1 == idx2: + contracted_all = contracted1 | contracted2 + new_key = tuple( + e for pos, e in enumerate(key1) if pos not in contracted_all + ) + ans.pop(idx1) + else: + new_key = tuple( + e for pos, e in enumerate(key1) if pos not in contracted1 + ) + tuple(e for pos, e in enumerate(key2) if pos not in contracted2) + hi, lo = max(idx1, idx2), min(idx1, idx2) + ans.pop(hi) + ans.pop(lo) + + ans.append(new_key) + + return len(new_key) + len(contracted_indices), ans + + def seq_contraction_width(self, seq): + abstract_network = [key for _, key in self.network] + + w = 0 + m = 0 + + for indices in seq: + local_width, abstract_network = RTNetwork.local_contraction_width( + abstract_network, indices + ) + + if local_width > w: + w = local_width + m = 1 + elif local_width == w: + m += 1 + + return (w, m), abstract_network + + def contraction_width(self, omit_idle_arcs=True): + abstract_network = [] + for _, key in self.network: + if omit_idle_arcs: + non_idle_key = tuple(e for e in key if e.index not in self.idle_labels) + abstract_network.append((None, non_idle_key)) + else: + abstract_network.append((None, key)) + + abstract_copy = RTNetwork( + None, + network=abstract_network, + rot_num=self.rot_num, + boundary=(0, 0) if omit_idle_arcs else self.boundary, + boundary_labels=[] if omit_idle_arcs else self.boundary_labels, + ) + + loops = abstract_copy._resolve_self_loops() + if loops: + if all(len(loop) > 1 for loop in loops): + width = (2, len(loops)) + else: + width = (3, len([loop for loop in loops if len(loop) == 1])) + else: + width = (0, 0) + + seq_width, ans = abstract_copy.seq_contraction_width( + abstract_copy.optimal_contraction_sequence() + ) + + return max(width, seq_width), ans + + @staticmethod + def local_contraction_seq(abstract_network, indices): + idx1, idx2 = indices + ans = list(abstract_network) + key1 = abstract_network[idx1] + key2 = abstract_network[idx2] + + contracted_indices = set() + + pairs = [] + for pos_i, ei in enumerate(key1): + for pos_j, ej in enumerate(key2): + if ei.index == ej.index and ei.sign * ej.sign == -1: + pairs.append((pos_i, pos_j)) + contracted_indices.add(ei.index) + + contracted1 = {pos_i for pos_i, _ in pairs} + contracted2 = {pos_j for _, pos_j in pairs} + + if idx1 == idx2: + contracted_all = contracted1 | contracted2 + new_key = tuple( + e for pos, e in enumerate(key1) if pos not in contracted_all + ) + ans.pop(idx1) + else: + new_key = tuple( + e for pos, e in enumerate(key1) if pos not in contracted1 + ) + tuple(e for pos, e in enumerate(key2) if pos not in contracted2) + hi, lo = max(idx1, idx2), min(idx1, idx2) + ans.pop(hi) + ans.pop(lo) + + ans.append(new_key) + + return contracted_indices, ans + + def seq_contraction_seq(self, seq): + abstract_network = [key for _, key in self.network] + + ans = [] + + for indices in seq: + contracted_indices, abstract_network = RTNetwork.local_contraction_seq( + abstract_network, indices + ) + + ans.append(contracted_indices) + + return ans, abstract_network + + def contraction_sequence(self, omit_idle_arcs=True): + abstract_network = [] + for _, key in self.network: + if omit_idle_arcs: + non_idle_key = tuple(e for e in key if e.index not in self.idle_labels) + abstract_network.append((None, non_idle_key)) + else: + abstract_network.append((None, key)) + + abstract_copy = RTNetwork( + None, + network=abstract_network, + rot_num=self.rot_num, + boundary=(0, 0) if omit_idle_arcs else self.boundary, + boundary_labels=[] if omit_idle_arcs else self.boundary_labels, + ) + + loops = abstract_copy._resolve_self_loops() + + contraction_seq, ans = abstract_copy.seq_contraction_seq( + abstract_copy.optimal_contraction_sequence() + ) + + return loops + contraction_seq, ans + + def contract_nodes(self, indices): + """ + This modifies self to avoid holding duplicate data in memory. + """ + idx1, idx2 = indices + tensor1, key1 = self.network[idx1] + tensor2, key2 = self.network[idx2] + + pairs = {} + for pos_i, ei in enumerate(key1): + for pos_j, ej in enumerate(key2): + if ei.index == ej.index and ei.sign * ej.sign == -1: + side = 0 if ei.sign == 1 else 1 + pairs[(pos_i, pos_j)] = ( + side, + self.tensors.h(self.rot_num[ei.index]), + ) + + if tensor1 is not None: + result_tensor = tensor1.decorated_contract(tensor2, pairs) + else: + result_tensor = None + + contracted1 = {pos_i for pos_i, _ in pairs} + contracted2 = {pos_j for _, pos_j in pairs} + + if idx1 == idx2: + contracted_all = contracted1 | contracted2 + new_key = tuple( + e for pos, e in enumerate(key1) if pos not in contracted_all + ) + self.network.pop(idx1) + else: + new_key = tuple( + e for pos, e in enumerate(key1) if pos not in contracted1 + ) + tuple(e for pos, e in enumerate(key2) if pos not in contracted2) + hi, lo = max(idx1, idx2), min(idx1, idx2) + self.network.pop(hi) + self.network.pop(lo) + + del tensor1, tensor2 + + self.network.append((result_tensor, new_key)) + + def _resolve_self_loop_at(self, idx): + _, key = self.network[idx] + edge_indices = [] + seen = {} + for pos, e in enumerate(key): + if e.index in seen: + _, other_e = seen[e.index] + if e.sign * other_e.sign == -1: + edge_indices.append(e.index) + break + else: + seen[e.index] = (pos, e) + if edge_indices: + self.contract_nodes((idx, idx)) + return edge_indices + + def _resolve_self_loops(self): + ans = [] + for i in range(len(self.network)): + loop = self._resolve_self_loop_at(i) + if loop: + ans.append(loop) + return ans + + def contract_sequence(self, seq, timed=False): + if timed: + import time + + start_time = time.time() + + for indices in seq: + self.contract_nodes(indices) + + if timed: + time_cost = time.time() - start_time + + return time_cost + + def contract_all(self, timed=False): + """ + Perform all possible contractions on self. + + Return modified self and time (None if not timed). + """ + self._resolve_self_loops() + time = self.contract_sequence(self.optimal_contraction_sequence(), timed=timed) + + assert len(self.network) == 1 + + if self.boundary_labels: + desired_order = [] + for i in range(self.boundary[0]): + desired_order.append(~self.edge[self.boundary_labels[i]]) + for i in range(self.boundary[1]): + desired_order.append( + self.edge[self.boundary_labels[self.boundary[0] + i]] + ) + + _, key = self.network[0] + key_pos = {e: i for i, e in enumerate(key)} + reshape_indices = [key_pos[e] for e in desired_order] + + reshape_tensor = self.network[0][0].permute(reshape_indices) + self.network[0] = (reshape_tensor, tuple(desired_order)) + + return (self, time) + + def evaluate(self, timed=False): + """ + Fixate all idle labels at value 0, obtaining a new RTNework with (0,0) boundary (without modifying self), + contract_all on the new RTNetwork and return the product of all values of the resulting tensors. + """ + assert self.boundary == (1, 1) + + new_network = [] + prefactor = 1 + + for tensor, key in self.network: + idle_positions = sorted( + [pos for pos, e in enumerate(key) if e.index in self.idle_labels], + reverse=True, + ) + non_idle_key = tuple(e for e in key if e.index not in self.idle_labels) + t = tensor + for pos in idle_positions: + t = t.fixate(pos, 0) + if t.rank == 0: + prefactor *= t[()] + else: + new_network.append((t, non_idle_key)) + + reduced = RTNetwork( + self.tensors, + network=new_network, + rot_num=self.rot_num, + boundary=(0, 0), + boundary_labels=[], + ) + time = reduced.contract_all(timed=timed)[1] + + result = prefactor + for tensor, _ in reduced.network: + result *= tensor[()] + return (result, time) diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices.py b/spherogram_src/links/reshetikhin_turaev/R_matrices.py new file mode 100644 index 0000000..75a8a5d --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices.py @@ -0,0 +1,248 @@ +from .dict_laurent_polynomial import FastDictLaurentPolynomial, LaurentVariable + +from .sparse_array import SparseTensor + +import csv, ast, pathlib, os, math + +dir_path = pathlib.Path(__file__).resolve().parent + +_cache = dict() + + +def laurent_sparse_tensor_from_file(file, vars=["t", "q"], sage_polynomials=False): + reader = csv.reader(file) + header = next(reader) + shape = ast.literal_eval(header[0]) + + if header[1] != "ZZ": + raise NotImplementedError + + data = dict() + for line in reader: + key, value = line + key = tuple(ast.literal_eval(key)) + assert key not in data.keys(), f"{key} appeared multiple times in {file.name}" + data[key] = FastDictLaurentPolynomial.from_str(value, vars=vars) + + # Unify variable denominators: compute LCM across all loaded polynomials so + # every value shares the same vars tuple (enabling interning and consistent arithmetic). + if data: + common_denoms = [1] * len(vars) + for poly in data.values(): + for i, var in enumerate(poly.vars): + d = common_denoms[i] + common_denoms[i] = d * var.denominator // math.gcd(d, var.denominator) + common_vars = tuple(LaurentVariable(v, d) for v, d in zip(vars, common_denoms)) + data = {key: poly.refactor_variables(common_vars) for key, poly in data.items()} + + if sage_polynomials: + data = {key: poly.to_sage() for key, poly in data.items()} + + return SparseTensor(shape=shape, data=data) + + +def laurent_sparse_tensor_from_path( + path, vars=["t", "q"], compressed=False, sage_polynomials=False +): + if compressed: + import bz2 + + with bz2.open(path, "rt") as f: + return laurent_sparse_tensor_from_file( + f, vars=vars, sage_polynomials=sage_polynomials + ) + else: + with open(path, "r") as f: + return laurent_sparse_tensor_from_file( + f, vars=vars, sage_polynomials=sage_polynomials + ) + + +class RMatrix: + __slots__ = ["_R", "_h", "_id"] + + def __init__(self, Rp, Rm, hp, hm): + self._R = (Rp, Rm) + self._h = (hp, hm) + + self._id = SparseTensor(hp.shape, data={(i, i): 1 for i in range(hp.shape[0])}) + + def R(self, sign): + if sign == 1: + return self._R[0].copy() + else: + assert sign == -1 + return self._R[1].copy() + + def h(self, sign): + if sign == 1: + return self._h[0].copy() + elif sign == -1: + return self._h[1].copy() + else: + assert sign == 0 + return self._id + + @staticmethod + def from_directory( + dir_path, vars=["t", "q"], compressed=False, sage_polynomials=False + ): + names = [ + name + ".csv" + (".bz2" if compressed else "") + for name in ["Rp", "Rn", "hp", "hn"] + ] + + tensors = [ + laurent_sparse_tensor_from_path( + os.path.join(dir_path, name), + vars=vars, + compressed=compressed, + sage_polynomials=sage_polynomials, + ) + for name in names + ] + + return RMatrix(*tensors) + + +def colored_links_gould_R_matrices(n, sage_polynomials=False): + if 0 < n <= 4: + key = (f"V{n}", sage_polynomials) + if key in _cache.keys(): + return _cache[key] + else: + _cache[key] = RMatrix.from_directory( + dir_path=os.path.join(dir_path, f"R_matrices/V{n}/"), + vars=["t", "q"], + compressed=False, + sage_polynomials=sage_polynomials, + ) + return _cache[key] + else: + raise NotImplementedError + + +def _q_binomial(n, k, q): + if k < 0 or k > n: + return 0 + # table[i][j] = q_binomial(i, j, q) + table = [[0] * (k + 1) for _ in range(n + 1)] + for i in range(n + 1): + table[i][0] = 1 + for i in range(1, n + 1): + for j in range(1, min(i, k) + 1): + table[i][j] = table[i - 1][j - 1] + q**j * table[i - 1][j] + return table[n][k] + + +def _q_pochhammer(a, q, n): + result = 1 + for k in range(n): + result = result * (1 - a * q**k) + return result + + +def _q_pow(e): + """ + DictLaurentPolynomial representing q^(e/2). e must be an integer. + """ + return FastDictLaurentPolynomial._make((LaurentVariable("q", 4),), {(e,): 1}) + + +def colored_jones_R_matrices(n, sage_polynomials=False): + """ + The R matrices for the n-colored Jones polynomial. + In particular, n = 1 gives the Jones polynomial. + """ + if n < 0: + raise NotImplementedError + + key = (f"J{n}", sage_polynomials) + if key in _cache.keys(): + return _cache[key] + + n = n + 1 + + q_actual = _q_pow(4) # q^1 + q_inv = _q_pow(-4) # q^(-1) + + shape = (n, n, n, n) + data_p = {} + data_n = {} + + for i in range(n): + for j in range(n): + for k in range(n): + l = i + j - k + if l < 0 or l >= n: + continue + + # JRRp[i,j,k,l] = JRp[i, j, m_p, n] with m_p = j - k + # = q^(-(n-1)^2/4) * q^(-(i+j-k)*k) * q^((n-1)*(i+k)/2) + # * qbin[j, m_p] * qp[q^(n-1-i), q^-1, m_p] + m_p = j - k + e4_p = -((n - 1) ** 2) - 4 * (i + j - k) * k + 2 * (n - 1) * (i + k) + mono = _q_pow(e4_p) + qb = _q_binomial(j, m_p, q_actual) # 0 when m_p < 0 or m_p > j + qp = _q_pochhammer(_q_pow(4 * (n - 1 - i)), q_inv, m_p) + val = mono * qb * qp + if val: + if not sage_polynomials: + data_p[(i, j, k, l)] = val + else: + data_p[(i, j, k, l)] = val.to_sage() + + # JRRn[i,j,k,l] = JRn[i, j, m_n, n] with m_n = k - j + # = q^((n-1)^2/4) * (-1)^m_n * q^(i*j + m_n*(m_n-1)/2) * q^(-(n-1)*(i+k)/2) + # * qbin[i, m_n] * qp[q^(n-1-j), q^-1, m_n] + m_n = k - j + # m_n*(m_n-1) is always even (product of consecutive integers) + e4_n = ( + (n - 1) ** 2 + + 4 * (i * j + m_n * (m_n - 1) // 2) + - 2 * (n - 1) * (i + k) + ) + sign = (-1) ** m_n + mono = _q_pow(e4_n) * sign + qb = _q_binomial(i, m_n, q_actual) # 0 when m_n < 0 or m_n > i + qp = _q_pochhammer(_q_pow(4 * (n - 1 - j)), q_inv, m_n) + val = mono * qb * qp + if val: + if not sage_polynomials: + data_n[(i, j, k, l)] = val + else: + data_n[(i, j, k, l)] = val.to_sage() + + Rp = SparseTensor(shape, data=data_p) + Rn = SparseTensor(shape, data=data_n) + + # hp[i,i] = q^(i + (1-n)/2) = q^(i - (n-1)/2), key e4 = 4*i - 2*(n-1) + # hn[i,i] = 1 / hp[i,i] , key e4 = 2*(n-1) - 4*i + if not sage_polynomials: + hp = SparseTensor( + (n, n), data={(i, i): _q_pow(4 * i - 2 * (n - 1)) for i in range(n)} + ) + hn = SparseTensor( + (n, n), data={(i, i): _q_pow(2 * (n - 1) - 4 * i) for i in range(n)} + ) + else: + hp = SparseTensor( + (n, n), + data={(i, i): _q_pow(4 * i - 2 * (n - 1)).to_sage() for i in range(n)}, + ) + hn = SparseTensor( + (n, n), + data={(i, i): _q_pow(2 * (n - 1) - 4 * i).to_sage() for i in range(n)}, + ) + + _cache[key] = RMatrix(Rp, Rn, hp, hn) + return _cache[key] + + +def prefactor_colored_jones(n, writhe, sage_polynomial=False): + n = n + 1 + + if not sage_polynomial: + return _q_pow(writhe * ((n**2) - 1)) + else: + return _q_pow(writhe * ((n**2) - 1)).to_sage() diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/Rn.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/Rn.csv new file mode 100644 index 0000000..56349e6 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/Rn.csv @@ -0,0 +1,26 @@ +"(4,4,4,4)","ZZ" +"(0,0,0,0)","1" +"(0,1,1,0)","1" +"(0,2,2,0)","1" +"(0,3,3,0)","1" +"(1,0,0,1)","q*t" +"(1,0,1,0)","1-q*t" +"(1,1,1,1)","-(q*t)" +"(1,2,2,1)","t/q" +"(1,2,3,0)","1" +"(1,3,3,1)","-(t/q)" +"(2,0,0,2)","q/t" +"(2,1,1,2)","q/t" +"(2,0,2,0)","1-q/t" +"(2,2,2,2)","-(q/t)" +"(2,1,3,0)","-(q/t)" +"(2,3,3,2)","-(q/t)" +"(3,0,0,3)","q^2" +"(3,0,1,2)","-1-q^2+q/t+q*t" +"(3,1,1,3)","-q^2" +"(3,0,2,1)","-1+t/q+q*t-t^2" +"(3,2,2,3)","-1" +"(3,0,3,0)","2-q/t-q*t" +"(3,1,3,1)","1-q*t" +"(3,2,3,2)","1-q/t" +"(3,3,3,3)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/Rp.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/Rp.csv new file mode 100644 index 0000000..238ccc2 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/Rp.csv @@ -0,0 +1,26 @@ +"(4,4,4,4)","ZZ" +"(0,0,0,0)","1" +"(0,1,0,1)","1-1/(q*t)" +"(0,2,0,2)","1-t/q" +"(0,3,0,3)","2-1/(q*t)-t/q" +"(0,1,1,0)","1/(q*t)" +"(0,3,1,2)","-1-q^(-2)+1/(q*t)+t/q" +"(0,2,2,0)","t/q" +"(0,3,2,1)","-q^(-2)+t/q^3+t/q-t^2/q^2" +"(0,3,3,0)","q^(-2)" +"(1,0,0,1)","1" +"(1,2,0,3)","1" +"(1,1,1,1)","-(1/(q*t))" +"(1,3,1,3)","1-1/(q*t)" +"(1,2,2,1)","t/q" +"(1,3,3,1)","-q^(-2)" +"(2,0,0,2)","1" +"(2,1,0,3)","-(q/t)" +"(2,1,1,2)","q/t" +"(2,2,2,2)","-(t/q)" +"(2,3,2,3)","1-t/q" +"(2,3,3,2)","-1" +"(3,0,0,3)","1" +"(3,1,1,3)","-(q/t)" +"(3,2,2,3)","-(t/q)" +"(3,3,3,3)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/hn.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/hn.csv new file mode 100644 index 0000000..f848bbb --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/hn.csv @@ -0,0 +1,5 @@ +"(4,4)","ZZ" +"(0,0)","1" +"(1,1)","-1" +"(2,2)","-1" +"(3,3)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/hp.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/hp.csv new file mode 100644 index 0000000..f848bbb --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V1/hp.csv @@ -0,0 +1,5 @@ +"(4,4)","ZZ" +"(0,0)","1" +"(1,1)","-1" +"(2,2)","-1" +"(3,3)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/Rn.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/Rn.csv new file mode 100644 index 0000000..29bded3 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/Rn.csv @@ -0,0 +1,178 @@ +"(8,8,8,8)","ZZ" +"(0,0,0,0)","1" +"(0,1,1,0)","1" +"(0,2,2,0)","1" +"(0,3,3,0)","1" +"(0,4,4,0)","1" +"(0,5,5,0)","1" +"(0,6,6,0)","1" +"(0,7,7,0)","1" +"(1,0,0,1)","q*t" +"(1,0,1,0)","1-q*t" +"(1,1,1,1)","-(q*t)" +"(1,2,2,1)","t" +"(1,2,3,0)","1" +"(1,3,3,1)","-t" +"(1,2,4,0)","-t" +"(1,4,4,1)","-t" +"(1,3,5,0)","t" +"(1,4,5,0)","1" +"(1,5,5,1)","t" +"(1,6,6,1)","-(t/q)" +"(1,6,7,0)","1" +"(1,7,7,1)","t/q" +"(2,0,0,2)","q/t" +"(2,1,1,2)","q/t" +"(2,0,2,0)","1-q/t" +"(2,2,2,2)","-(q/t)" +"(2,1,3,0)","-(q/t)" +"(2,3,3,2)","-(q/t)" +"(2,1,4,0)","1" +"(2,4,4,2)","-(q/t)" +"(2,5,5,2)","-(q/t)" +"(2,3,6,0)","1" +"(2,4,6,0)","q/t" +"(2,6,6,2)","q/t" +"(2,5,7,0)","q/t" +"(2,7,7,2)","q/t" +"(3,0,0,3)","q^2" +"(3,0,1,2)","-q^2+q/t" +"(3,1,1,3)","-q^2" +"(3,0,2,1)","-q+t" +"(3,2,2,3)","-q" +"(3,0,3,0)","1-q/t" +"(3,1,3,1)","q" +"(3,2,3,2)","-(q/t)" +"(3,3,3,3)","q" +"(3,0,4,0)","q-t" +"(3,1,4,1)","-t" +"(3,2,4,2)","q" +"(3,4,4,3)","q" +"(3,1,5,0)","1-q" +"(3,3,5,2)","-q" +"(3,4,5,2)","-(q/t)" +"(3,5,5,3)","-q" +"(3,3,6,1)","-(t/q)" +"(3,4,6,1)","-1" +"(3,6,6,3)","-1" +"(3,3,7,0)","1" +"(3,4,7,0)","q/t" +"(3,5,7,1)","1" +"(3,6,7,2)","q/t" +"(3,7,7,3)","1" +"(4,0,0,4)","q^2" +"(4,0,1,2)","-q^2+q/t" +"(4,1,1,4)","-q^2" +"(4,0,2,1)","-q^2+q*t" +"(4,2,2,4)","-q" +"(4,0,3,0)","q^2-q/t" +"(4,1,3,1)","q^2" +"(4,2,3,2)","-(q/t)" +"(4,3,3,4)","q" +"(4,0,4,0)","1-q*t" +"(4,1,4,1)","-(q*t)" +"(4,2,4,2)","q" +"(4,4,4,4)","q" +"(4,3,5,2)","-q" +"(4,4,5,2)","-(q/t)" +"(4,5,5,4)","-q" +"(4,2,6,0)","1-q" +"(4,3,6,1)","-t" +"(4,4,6,1)","-q" +"(4,6,6,4)","-1" +"(4,3,7,0)","q" +"(4,4,7,0)","q/t" +"(4,5,7,1)","q" +"(4,6,7,2)","q/t" +"(4,7,7,4)","1" +"(5,0,0,5)","q^3*t" +"(5,0,1,3)","-q^2+q^3*t" +"(5,0,1,4)","q^2-q^3*t" +"(5,1,1,5)","q^3*t" +"(5,2,2,5)","-(q*t)" +"(5,0,3,1)","q-q^2+q*t-q^2*t" +"(5,2,3,3)","q" +"(5,2,3,4)","-q" +"(5,3,3,5)","-(q*t)" +"(5,0,4,1)","-t+q^2*t" +"(5,2,4,3)","-(q*t)" +"(5,2,4,4)","q*t" +"(5,4,4,5)","-(q*t)" +"(5,0,5,0)","1-q-q*t+q^2*t" +"(5,1,5,1)","-(q*t)+q^2*t" +"(5,3,5,3)","-(q*t)" +"(5,4,5,3)","-q" +"(5,3,5,4)","q*t" +"(5,4,5,4)","q" +"(5,5,5,5)","-(q*t)" +"(5,2,6,1)","t-t/q" +"(5,6,6,5)","t/q" +"(5,2,7,0)","1-q" +"(5,4,7,1)","1-q" +"(5,6,7,3)","1" +"(5,6,7,4)","-1" +"(5,7,7,5)","t/q" +"(6,0,0,6)","q^3/t" +"(6,1,1,6)","-(q^3/t)" +"(6,0,2,3)","q^2-q^3/t" +"(6,0,2,4)","-q+q^2/t" +"(6,2,2,6)","q^2/t" +"(6,0,3,2)","-(q/t)+q^3/t" +"(6,1,3,3)","q^3/t" +"(6,1,3,4)","-(q^2/t)" +"(6,3,3,6)","-(q^2/t)" +"(6,0,4,2)","q-q^2+q/t-q^2/t" +"(6,1,4,3)","-q^2" +"(6,1,4,4)","q" +"(6,4,4,6)","-(q^2/t)" +"(6,1,5,2)","-(q/t)+q^2/t" +"(6,5,5,6)","q^2/t" +"(6,0,6,0)","1-q-q/t+q^2/t" +"(6,2,6,2)","-(q/t)+q^2/t" +"(6,3,6,3)","q" +"(6,4,6,3)","q^2/t" +"(6,3,6,4)","-1" +"(6,4,6,4)","-(q/t)" +"(6,6,6,6)","-(q/t)" +"(6,1,7,0)","q/t-q^2/t" +"(6,3,7,2)","q/t-q^2/t" +"(6,5,7,3)","-(q^2/t)" +"(6,5,7,4)","q/t" +"(6,7,7,6)","q/t" +"(7,0,0,7)","q^4" +"(7,0,1,6)","-q^2-q^4+q^3/t+q^3*t" +"(7,1,1,7)","q^4" +"(7,0,2,5)","q^2-q*t-q^3*t+q^2*t^2" +"(7,2,2,7)","q^2" +"(7,0,3,3)","q+2*q^2-q^3-q^3/t-q^3*t" +"(7,0,3,4)","-2*q+q^2/t-q*t+q^2*t+q^3*t" +"(7,1,3,5)","q^2-q^3*t" +"(7,2,3,6)","-q+q^2/t" +"(7,3,3,7)","q^2" +"(7,0,4,3)","-q+q^2+q^3-2*q*t+q^2*t^2" +"(7,0,4,4)","-q^2+t+2*q*t-q^2*t-q^2*t^2" +"(7,1,4,5)","-(q*t)+q^2*t^2" +"(7,2,4,6)","-q^2+q*t" +"(7,4,4,7)","q^2" +"(7,0,5,2)","-1+q-q^2+q^3+q/t-q^2/t+q*t-q^2*t" +"(7,1,5,3)","-q+q^3" +"(7,1,5,4)","q-q^2+q*t-q^2*t" +"(7,3,5,6)","-q^2+q*t" +"(7,4,5,6)","q-q^2/t" +"(7,5,5,7)","q^2" +"(7,0,6,1)","1-q+t-t/q-q*t+q^2*t+t^2-q*t^2" +"(7,2,6,3)","1-q+t-q*t" +"(7,2,6,4)","-(t/q)+q*t" +"(7,3,6,5)","t/q-t^2" +"(7,4,6,5)","1-q*t" +"(7,6,6,7)","1" +"(7,0,7,0)","2-2*q-q/t+q^2/t-q*t+q^2*t" +"(7,1,7,1)","1-q-q*t+q^2*t" +"(7,2,7,2)","1-q-q/t+q^2/t" +"(7,3,7,3)","1-q*t" +"(7,4,7,3)","-q+q^2/t" +"(7,3,7,4)","-1+q*t" +"(7,4,7,4)","1-q/t" +"(7,5,7,5)","1-q*t" +"(7,6,7,6)","1-q/t" +"(7,7,7,7)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/Rp.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/Rp.csv new file mode 100644 index 0000000..53f1303 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/Rp.csv @@ -0,0 +1,178 @@ +"(8,8,8,8)","ZZ" +"(0,0,0,0)","1" +"(0,1,0,1)","1-1/(q*t)" +"(0,2,0,2)","1-t/q" +"(0,3,0,3)","1-1/(q*t)" +"(0,4,0,3)","q^(-1)-t^(-1)" +"(0,3,0,4)","q^(-2)-t/q" +"(0,4,0,4)","1-t/q" +"(0,5,0,5)","1-q^(-1)+1/(q^2*t)-1/(q*t)" +"(0,6,0,6)","1-q^(-1)+t/q^2-t/q" +"(0,7,0,7)","2-2/q+1/(q^2*t)-1/(q*t)+t/q^2-t/q" +"(0,1,1,0)","1/(q*t)" +"(0,3,1,2)","-q^(-2)+1/(q*t)" +"(0,4,1,2)","-q^(-1)+t^(-1)" +"(0,5,1,3)","-t^(-1)+1/(q^2*t)" +"(0,5,1,4)","-q^(-2)+q^(-1)-1/(q^2*t)+1/(q*t)" +"(0,7,1,6)","-1+q^(-3)-q^(-2)+q^(-1)-1/(q^2*t)+1/(q*t)-t/q^2+t/q" +"(0,2,2,0)","t/q" +"(0,3,2,1)","-q^(-2)+t/q" +"(0,4,2,1)","-q^(-2)+t/q" +"(0,6,2,3)","-q^(-2)+q^(-1)-t/q^2+t/q" +"(0,6,2,4)","t/q^3-t/q" +"(0,7,2,5)","-q^(-3)+q^(-2)+t/q^4-t/q^3+t/q^2-t/q-t^2/q^3+t^2/q^2" +"(0,3,3,0)","q^(-2)" +"(0,5,3,1)","q^(-2)-1/(q^3*t)" +"(0,6,3,2)","-q^(-1)+t/q^2" +"(0,7,3,3)","-q^(-3)+2/q^2+q^(-1)-1/(q^3*t)-t/q^3" +"(0,7,3,4)","q^(-4)+q^(-3)-q^(-2)-(2*t)/q^2+t^2/q^3" +"(0,4,4,0)","q^(-2)" +"(0,5,4,1)","-q^(-2)+1/(q^3*t)" +"(0,6,4,2)","q^(-2)-t/q^3" +"(0,7,4,3)","-2/q^2+1/(q^3*t)+t/q^4+t/q^3-t/q^2" +"(0,7,4,4)","-q^(-4)-t/q^4+(2*t)/q^3+t/q^2-t^2/q^4" +"(0,5,5,0)","1/(q^3*t)" +"(0,7,5,2)","-q^(-4)-q^(-2)+1/(q^3*t)+t/q^3" +"(0,6,6,0)","t/q^3" +"(0,7,6,1)","q^(-4)-t/q^5-t/q^3+t^2/q^4" +"(0,7,7,0)","q^(-4)" +"(1,0,0,1)","1" +"(1,2,0,3)","1" +"(1,2,0,4)","-(t/q)" +"(1,4,0,5)","1-q^(-1)" +"(1,6,0,7)","1-q^(-1)" +"(1,1,1,1)","-(1/(q*t))" +"(1,3,1,3)","-(1/(q*t))" +"(1,4,1,3)","-t^(-1)" +"(1,3,1,4)","q^(-2)" +"(1,4,1,4)","q^(-1)" +"(1,5,1,5)","1/(q^2*t)-1/(q*t)" +"(1,7,1,7)","1-q^(-1)+1/(q^2*t)-1/(q*t)" +"(1,2,2,1)","t/q" +"(1,6,2,5)","t/q^2-t/q" +"(1,3,3,1)","-q^(-2)" +"(1,6,3,3)","q^(-1)" +"(1,6,3,4)","-(t/q^2)" +"(1,7,3,5)","-q^(-3)+q^(-2)-t/q^3+t/q^2" +"(1,4,4,1)","-q^(-2)" +"(1,6,4,3)","-q^(-2)" +"(1,6,4,4)","t/q^3" +"(1,7,4,5)","t/q^4-t/q^2" +"(1,5,5,1)","1/(q^3*t)" +"(1,7,5,3)","-q^(-2)+1/(q^3*t)" +"(1,7,5,4)","-q^(-4)+t/q^3" +"(1,6,6,1)","-(t/q^3)" +"(1,7,7,1)","q^(-4)" +"(2,0,0,2)","1" +"(2,1,0,3)","-t^(-1)" +"(2,1,0,4)","1" +"(2,3,0,6)","1-q^(-1)" +"(2,5,0,7)","-t^(-1)+q/t" +"(2,1,1,2)","t^(-1)" +"(2,5,1,6)","t^(-1)-q/t" +"(2,2,2,2)","-(t/q)" +"(2,3,2,3)","q^(-1)" +"(2,4,2,3)","q^(-1)" +"(2,3,2,4)","-(t/q)" +"(2,4,2,4)","-(t/q)" +"(2,6,2,6)","t/q^2-t/q" +"(2,7,2,7)","1-q^(-1)+t/q^2-t/q" +"(2,3,3,2)","-q^(-1)" +"(2,5,3,3)","1/(q*t)" +"(2,5,3,4)","-q^(-1)" +"(2,7,3,6)","-1+q^(-2)" +"(2,4,4,2)","-q^(-1)" +"(2,5,4,3)","-(1/(q*t))" +"(2,5,4,4)","q^(-1)" +"(2,7,4,6)","-q^(-2)+q^(-1)-t/q^2+t/q" +"(2,5,5,2)","-(1/(q*t))" +"(2,6,6,2)","t/q^2" +"(2,7,6,3)","q^(-2)-t/q^3" +"(2,7,6,4)","-(t/q^2)+t^2/q^3" +"(2,7,7,2)","q^(-2)" +"(3,0,0,3)","1" +"(3,1,0,5)","1" +"(3,2,0,6)","t/q" +"(3,3,0,7)","1" +"(3,4,0,7)","1" +"(3,1,1,3)","-t^(-1)" +"(3,3,1,6)","-q^(-1)" +"(3,4,1,6)","-1" +"(3,5,1,7)","-t^(-1)+q/t" +"(3,2,2,3)","-(t/q)" +"(3,3,2,5)","-(t/q)" +"(3,4,2,5)","-(t/q)" +"(3,3,3,3)","q^(-1)" +"(3,5,3,5)","q^(-1)" +"(3,6,3,6)","-(t/q)" +"(3,7,3,7)","1-t/q" +"(3,4,4,3)","q^(-1)" +"(3,5,4,5)","-q^(-1)" +"(3,6,4,6)","t/q^2" +"(3,7,4,7)","-q^(-1)+t/q^2" +"(3,5,5,3)","-(1/(q*t))" +"(3,7,5,6)","-q^(-2)+t/q" +"(3,6,6,3)","-(t/q^2)" +"(3,7,6,5)","t/q^2-t^2/q^3" +"(3,7,7,3)","q^(-2)" +"(4,0,0,4)","1" +"(4,1,0,5)","t^(-1)" +"(4,2,0,6)","1" +"(4,3,0,7)","t^(-1)" +"(4,4,0,7)","q/t" +"(4,1,1,4)","-t^(-1)" +"(4,3,1,6)","-t^(-1)" +"(4,4,1,6)","-(q/t)" +"(4,2,2,4)","-(t/q)" +"(4,3,2,5)","-q^(-1)" +"(4,4,2,5)","-q^(-1)" +"(4,6,2,7)","1-q^(-1)" +"(4,3,3,4)","q^(-1)" +"(4,5,3,5)","1/(q*t)" +"(4,6,3,6)","-1" +"(4,7,3,7)","-1+1/(q*t)" +"(4,4,4,4)","q^(-1)" +"(4,5,4,5)","-(1/(q*t))" +"(4,6,4,6)","q^(-1)" +"(4,7,4,7)","1-1/(q*t)" +"(4,5,5,4)","-(1/(q*t))" +"(4,7,5,6)","1-1/(q*t)" +"(4,6,6,4)","-(t/q^2)" +"(4,7,6,5)","q^(-2)-t/q^3" +"(4,7,7,4)","q^(-2)" +"(5,0,0,5)","1" +"(5,2,0,7)","1" +"(5,1,1,5)","t^(-1)" +"(5,3,1,7)","t^(-1)" +"(5,4,1,7)","q/t" +"(5,2,2,5)","-(t/q)" +"(5,3,3,5)","-q^(-1)" +"(5,6,3,7)","1" +"(5,4,4,5)","-q^(-1)" +"(5,6,4,7)","-q^(-1)" +"(5,5,5,5)","-(1/(q*t))" +"(5,7,5,7)","1-1/(q*t)" +"(5,6,6,5)","t/q^2" +"(5,7,7,5)","q^(-2)" +"(6,0,0,6)","1" +"(6,1,0,7)","q/t" +"(6,1,1,6)","-(q/t)" +"(6,2,2,6)","t/q" +"(6,3,2,7)","1" +"(6,4,2,7)","1" +"(6,3,3,6)","-1" +"(6,5,3,7)","-(q/t)" +"(6,4,4,6)","-1" +"(6,5,4,7)","q/t" +"(6,5,5,6)","q/t" +"(6,6,6,6)","-(t/q)" +"(6,7,6,7)","1-t/q" +"(6,7,7,6)","1" +"(7,0,0,7)","1" +"(7,1,1,7)","q/t" +"(7,2,2,7)","t/q" +"(7,3,3,7)","1" +"(7,4,4,7)","1" +"(7,5,5,7)","q/t" +"(7,6,6,7)","t/q" +"(7,7,7,7)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/hn.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/hn.csv new file mode 100644 index 0000000..8394cdc --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/hn.csv @@ -0,0 +1,9 @@ +"(8,8)","ZZ" +"(0,0)","1" +"(1,1)","-1" +"(2,2)","-1" +"(3,3)","1" +"(4,4)","1" +"(5,5)","-1" +"(6,6)","-1" +"(7,7)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/hp.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/hp.csv new file mode 100644 index 0000000..8394cdc --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V2/hp.csv @@ -0,0 +1,9 @@ +"(8,8)","ZZ" +"(0,0)","1" +"(1,1)","-1" +"(2,2)","-1" +"(3,3)","1" +"(4,4)","1" +"(5,5)","-1" +"(6,6)","-1" +"(7,7)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/Rn.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/Rn.csv new file mode 100644 index 0000000..bc4bb3a --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/Rn.csv @@ -0,0 +1,586 @@ +"(12,12,12,12)","ZZ" +"(0,0,0,0)","1" +"(0,1,1,0)","1" +"(0,2,2,0)","1" +"(0,3,3,0)","1" +"(0,4,4,0)","1" +"(0,5,5,0)","1" +"(0,6,6,0)","1" +"(0,7,7,0)","1" +"(0,8,8,0)","1" +"(0,9,9,0)","1" +"(0,10,10,0)","1" +"(0,11,11,0)","1" +"(1,0,0,1)","q^3*t" +"(1,0,1,0)","1-q^3*t" +"(1,1,1,1)","-(q^3*t)" +"(1,2,2,1)","q*t" +"(1,2,3,0)","1" +"(1,3,3,1)","-(q*t)" +"(1,2,4,0)","-(q*t)" +"(1,4,4,1)","-(q*t)" +"(1,3,5,0)","q*t" +"(1,4,5,0)","1" +"(1,5,5,1)","q*t" +"(1,6,6,1)","-(t/q)" +"(1,6,7,0)","1" +"(1,7,7,1)","t/q" +"(1,6,8,0)","t/q" +"(1,8,8,1)","t/q" +"(1,7,9,0)","-(t/q)" +"(1,8,9,0)","1" +"(1,9,9,1)","-(t/q)" +"(1,10,10,1)","t/q^3" +"(1,10,11,0)","1" +"(1,11,11,1)","-(t/q^3)" +"(2,0,0,2)","q^3/t" +"(2,1,1,2)","q^3/t" +"(2,0,2,0)","1-q^3/t" +"(2,2,2,2)","-(q^3/t)" +"(2,1,3,0)","-(q^3/t)" +"(2,3,3,2)","-(q^3/t)" +"(2,1,4,0)","1" +"(2,4,4,2)","-(q^3/t)" +"(2,5,5,2)","-(q^3/t)" +"(2,3,6,0)","1" +"(2,4,6,0)","q^3/t" +"(2,6,6,2)","q^3/t" +"(2,5,7,0)","q^3/t" +"(2,7,7,2)","q^3/t" +"(2,5,8,0)","1" +"(2,8,8,2)","q^3/t" +"(2,9,9,2)","q^3/t" +"(2,7,10,0)","1" +"(2,8,10,0)","-(q^3/t)" +"(2,10,10,2)","-(q^3/t)" +"(2,9,11,0)","-(q^3/t)" +"(2,11,11,2)","-(q^3/t)" +"(3,0,0,3)","q^6" +"(3,0,1,2)","-q^6+q^3/t" +"(3,1,1,3)","-q^6" +"(3,0,2,1)","-q^4+q*t" +"(3,2,2,3)","-q^4" +"(3,0,3,0)","1-q^3/t" +"(3,1,3,1)","q^4" +"(3,2,3,2)","-(q^3/t)" +"(3,3,3,3)","q^4" +"(3,0,4,0)","q^4-q*t" +"(3,1,4,1)","-(q*t)" +"(3,2,4,2)","q^4" +"(3,4,4,3)","q^4" +"(3,1,5,0)","1-q^4" +"(3,3,5,2)","-q^4" +"(3,4,5,2)","-(q^3/t)" +"(3,5,5,3)","-q^4" +"(3,3,6,1)","-(t/q)" +"(3,4,6,1)","-q^2" +"(3,6,6,3)","-q^2" +"(3,3,7,0)","1" +"(3,4,7,0)","q^3/t" +"(3,5,7,1)","q^2" +"(3,6,7,2)","q^3/t" +"(3,7,7,3)","q^2" +"(3,3,8,0)","t/q" +"(3,4,8,0)","q^2" +"(3,5,8,1)","t/q" +"(3,6,8,2)","q^2" +"(3,8,8,3)","q^2" +"(3,5,9,0)","1-q^2" +"(3,7,9,2)","-q^2" +"(3,8,9,2)","q^3/t" +"(3,9,9,3)","-q^2" +"(3,7,10,1)","t/q^3" +"(3,8,10,1)","-1" +"(3,10,10,3)","-1" +"(3,7,11,0)","1" +"(3,8,11,0)","-(q^3/t)" +"(3,9,11,1)","1" +"(3,10,11,2)","-(q^3/t)" +"(3,11,11,3)","1" +"(4,0,0,4)","q^6" +"(4,0,1,2)","-q^6+q^3/t" +"(4,1,1,4)","-q^6" +"(4,0,2,1)","-q^6+q^3*t" +"(4,2,2,4)","-q^4" +"(4,0,3,0)","q^6-q^3/t" +"(4,1,3,1)","q^6" +"(4,2,3,2)","-(q^3/t)" +"(4,3,3,4)","q^4" +"(4,0,4,0)","1-q^3*t" +"(4,1,4,1)","-(q^3*t)" +"(4,2,4,2)","q^4" +"(4,4,4,4)","q^4" +"(4,3,5,2)","-q^4" +"(4,4,5,2)","-(q^3/t)" +"(4,5,5,4)","-q^4" +"(4,2,6,0)","1-q^4" +"(4,3,6,1)","-(q*t)" +"(4,4,6,1)","-q^4" +"(4,6,6,4)","-q^2" +"(4,3,7,0)","q^4" +"(4,4,7,0)","q^3/t" +"(4,5,7,1)","q^4" +"(4,6,7,2)","q^3/t" +"(4,7,7,4)","q^2" +"(4,3,8,0)","q*t" +"(4,4,8,0)","1" +"(4,5,8,1)","q*t" +"(4,6,8,2)","q^2" +"(4,8,8,4)","q^2" +"(4,7,9,2)","-q^2" +"(4,8,9,2)","q^3/t" +"(4,9,9,4)","-q^2" +"(4,6,10,0)","1-q^2" +"(4,7,10,1)","t/q" +"(4,8,10,1)","-q^2" +"(4,10,10,4)","-1" +"(4,7,11,0)","q^2" +"(4,8,11,0)","-(q^3/t)" +"(4,9,11,1)","q^2" +"(4,10,11,2)","-(q^3/t)" +"(4,11,11,4)","1" +"(5,0,0,5)","q^9*t" +"(5,0,1,3)","-q^6+q^9*t" +"(5,0,1,4)","q^6-q^9*t" +"(5,1,1,5)","q^9*t" +"(5,2,2,5)","-(q^5*t)" +"(5,0,3,1)","q^4-q^6+q^3*t-q^7*t" +"(5,2,3,3)","q^4" +"(5,2,3,4)","-q^4" +"(5,3,3,5)","-(q^5*t)" +"(5,0,4,1)","-(q*t)+q^7*t" +"(5,2,4,3)","-(q^5*t)" +"(5,2,4,4)","q^5*t" +"(5,4,4,5)","-(q^5*t)" +"(5,0,5,0)","1-q^4-q^3*t+q^7*t" +"(5,1,5,1)","-(q^3*t)+q^7*t" +"(5,3,5,3)","-(q^5*t)" +"(5,4,5,3)","-q^4" +"(5,3,5,4)","q^5*t" +"(5,4,5,4)","q^4" +"(5,5,5,5)","-(q^5*t)" +"(5,2,6,1)","-(t/q)+q^3*t" +"(5,6,6,5)","q*t" +"(5,2,7,0)","1-q^4" +"(5,3,7,1)","-(q*t)+q^3*t" +"(5,4,7,1)","q^2-q^4" +"(5,6,7,3)","q^2" +"(5,6,7,4)","-q^2" +"(5,7,7,5)","q*t" +"(5,2,8,0)","t/q-q^3*t" +"(5,4,8,1)","t/q-q^3*t" +"(5,6,8,3)","q*t" +"(5,6,8,4)","-(q*t)" +"(5,8,8,5)","q*t" +"(5,3,9,0)","q*t-q^3*t" +"(5,4,9,0)","1-q^2" +"(5,5,9,1)","q*t-q^3*t" +"(5,7,9,3)","q*t" +"(5,8,9,3)","-q^2" +"(5,7,9,4)","-(q*t)" +"(5,8,9,4)","q^2" +"(5,9,9,5)","q*t" +"(5,6,10,1)","t/q^3-t/q" +"(5,10,10,5)","-(t/q^3)" +"(5,6,11,0)","1-q^2" +"(5,8,11,1)","1-q^2" +"(5,10,11,3)","1" +"(5,10,11,4)","-1" +"(5,11,11,5)","-(t/q^3)" +"(6,0,0,6)","q^9/t" +"(6,1,1,6)","-(q^9/t)" +"(6,0,2,3)","q^6-q^9/t" +"(6,0,2,4)","-q^4+q^7/t" +"(6,2,2,6)","q^7/t" +"(6,0,3,2)","-(q^3/t)+q^9/t" +"(6,1,3,3)","q^9/t" +"(6,1,3,4)","-(q^7/t)" +"(6,3,3,6)","-(q^7/t)" +"(6,0,4,2)","q^4-q^6+q^3/t-q^7/t" +"(6,1,4,3)","-q^6" +"(6,1,4,4)","q^4" +"(6,4,4,6)","-(q^7/t)" +"(6,1,5,2)","-(q^3/t)+q^7/t" +"(6,5,5,6)","q^7/t" +"(6,0,6,0)","1-q^4-q^3/t+q^7/t" +"(6,2,6,2)","-(q^3/t)+q^7/t" +"(6,3,6,3)","q^4" +"(6,4,6,3)","q^7/t" +"(6,3,6,4)","-q^2" +"(6,4,6,4)","-(q^5/t)" +"(6,6,6,6)","-(q^5/t)" +"(6,1,7,0)","q^3/t-q^7/t" +"(6,3,7,2)","q^3/t-q^7/t" +"(6,5,7,3)","-(q^7/t)" +"(6,5,7,4)","q^5/t" +"(6,7,7,6)","q^5/t" +"(6,1,8,0)","1-q^4" +"(6,3,8,2)","q^2-q^4" +"(6,4,8,2)","-(q^3/t)+q^5/t" +"(6,5,8,3)","-q^4" +"(6,5,8,4)","q^2" +"(6,8,8,6)","q^5/t" +"(6,5,9,2)","q^3/t-q^5/t" +"(6,9,9,6)","-(q^5/t)" +"(6,3,10,0)","1-q^2" +"(6,4,10,0)","q^3/t-q^5/t" +"(6,6,10,2)","q^3/t-q^5/t" +"(6,7,10,3)","q^2" +"(6,8,10,3)","-(q^5/t)" +"(6,7,10,4)","-1" +"(6,8,10,4)","q^3/t" +"(6,10,10,6)","q^3/t" +"(6,5,11,0)","-(q^3/t)+q^5/t" +"(6,7,11,2)","-(q^3/t)+q^5/t" +"(6,9,11,3)","q^5/t" +"(6,9,11,4)","-(q^3/t)" +"(6,11,11,6)","-(q^3/t)" +"(7,0,0,7)","q^12" +"(7,0,1,6)","-q^12+q^9/t" +"(7,1,1,7)","q^12" +"(7,0,2,5)","q^8-q^5*t" +"(7,2,2,7)","q^8" +"(7,0,3,3)","q^4+q^6-q^10-q^9/t" +"(7,0,3,4)","-q^4+q^7/t" +"(7,1,3,5)","q^8" +"(7,2,3,6)","q^7/t" +"(7,3,3,7)","q^8" +"(7,0,4,3)","-q^4+q^8+q^10-q^5*t" +"(7,0,4,4)","-q^8+q^5*t" +"(7,1,4,5)","-(q^5*t)" +"(7,2,4,6)","-q^8" +"(7,4,4,7)","q^8" +"(7,0,5,2)","-q^6+q^10+q^3/t-q^7/t" +"(7,1,5,3)","-q^4-q^6+q^8+q^10" +"(7,1,5,4)","q^4-q^8" +"(7,3,5,6)","-q^8" +"(7,4,5,6)","-(q^7/t)" +"(7,5,5,7)","q^8" +"(7,0,6,1)","q^2-q^6-t/q+q^3*t" +"(7,2,6,3)","q^2-q^6" +"(7,3,6,5)","q*t" +"(7,4,6,5)","q^4" +"(7,6,6,7)","q^4" +"(7,0,7,0)","1-q^4-q^3/t+q^7/t" +"(7,1,7,1)","q^2-q^6" +"(7,2,7,2)","-(q^3/t)+q^7/t" +"(7,3,7,3)","q^2+q^4-q^6" +"(7,4,7,3)","q^7/t" +"(7,3,7,4)","-q^2" +"(7,4,7,4)","-(q^5/t)" +"(7,5,7,5)","q^4" +"(7,6,7,6)","-(q^5/t)" +"(7,7,7,7)","q^4" +"(7,0,8,0)","-q^2+q^6+t/q-q^3*t" +"(7,1,8,1)","t/q-q^3*t" +"(7,2,8,2)","-q^2+q^6" +"(7,3,8,3)","q*t" +"(7,4,8,3)","-q^2+q^4+q^6" +"(7,3,8,4)","-(q*t)" +"(7,4,8,4)","-q^4" +"(7,5,8,5)","q*t" +"(7,6,8,6)","-q^4" +"(7,8,8,7)","q^4" +"(7,1,9,0)","1-q^2-q^4+q^6" +"(7,3,9,2)","-q^4+q^6" +"(7,4,9,2)","-(q^3/t)+q^5/t" +"(7,5,9,3)","-q^2+q^6" +"(7,5,9,4)","q^2-q^4" +"(7,7,9,6)","-q^4" +"(7,8,9,6)","q^5/t" +"(7,9,9,7)","q^4" +"(7,3,10,1)","t/q^3-t/q" +"(7,4,10,1)","1-q^2" +"(7,6,10,3)","1-q^2" +"(7,7,10,5)","-(t/q^3)" +"(7,8,10,5)","1" +"(7,10,10,7)","1" +"(7,3,11,0)","1-q^2" +"(7,4,11,0)","q^3/t-q^5/t" +"(7,5,11,1)","1-q^2" +"(7,6,11,2)","q^3/t-q^5/t" +"(7,7,11,3)","1" +"(7,8,11,3)","-(q^5/t)" +"(7,7,11,4)","-1" +"(7,8,11,4)","q^3/t" +"(7,9,11,5)","1" +"(7,10,11,6)","q^3/t" +"(7,11,11,7)","1" +"(8,0,0,8)","q^12" +"(8,0,1,6)","q^12-q^9/t" +"(8,1,1,8)","q^12" +"(8,0,2,5)","-q^12+q^9*t" +"(8,2,2,8)","q^8" +"(8,0,3,3)","-q^12+q^9/t" +"(8,0,3,4)","-q^6+q^10+q^12-q^7/t" +"(8,1,3,5)","-q^12" +"(8,2,3,6)","-(q^7/t)" +"(8,3,3,8)","q^8" +"(8,0,4,3)","-q^6+q^9*t" +"(8,0,4,4)","q^4+q^6-q^10-q^9*t" +"(8,1,4,5)","q^9*t" +"(8,2,4,6)","q^8" +"(8,4,4,8)","q^8" +"(8,0,5,2)","q^6-q^10-q^3/t+q^7/t" +"(8,1,5,4)","q^6-q^10" +"(8,3,5,6)","q^8" +"(8,4,5,6)","q^7/t" +"(8,5,5,8)","q^8" +"(8,0,6,1)","-q^6+q^10+q^3*t-q^7*t" +"(8,2,6,3)","q^4-q^8" +"(8,2,6,4)","-q^2-q^4+q^6+q^8" +"(8,3,6,5)","-(q^5*t)" +"(8,4,6,5)","-q^8" +"(8,6,6,8)","q^4" +"(8,0,7,0)","-q^6+q^10+q^3/t-q^7/t" +"(8,1,7,1)","-q^6+q^10" +"(8,2,7,2)","q^3/t-q^7/t" +"(8,3,7,3)","-q^8" +"(8,4,7,3)","-(q^7/t)" +"(8,3,7,4)","-q^4+q^6+q^8" +"(8,4,7,4)","q^5/t" +"(8,5,7,5)","-q^8" +"(8,6,7,6)","q^5/t" +"(8,7,7,8)","q^4" +"(8,0,8,0)","1-q^4-q^3*t+q^7*t" +"(8,1,8,1)","-(q^3*t)+q^7*t" +"(8,2,8,2)","q^2-q^6" +"(8,3,8,3)","-(q^5*t)" +"(8,4,8,3)","-q^4" +"(8,3,8,4)","q^5*t" +"(8,4,8,4)","q^2+q^4-q^6" +"(8,5,8,5)","-(q^5*t)" +"(8,6,8,6)","q^4" +"(8,8,8,8)","q^4" +"(8,3,9,2)","q^4-q^6" +"(8,4,9,2)","q^3/t-q^5/t" +"(8,5,9,4)","q^4-q^6" +"(8,7,9,6)","q^4" +"(8,8,9,6)","-(q^5/t)" +"(8,9,9,8)","q^4" +"(8,2,10,0)","1-q^2-q^4+q^6" +"(8,3,10,1)","-(q*t)+q^3*t" +"(8,4,10,1)","-q^4+q^6" +"(8,6,10,3)","q^2-q^4" +"(8,6,10,4)","-1+q^4" +"(8,7,10,5)","q*t" +"(8,8,10,5)","-q^4" +"(8,10,10,8)","1" +"(8,3,11,0)","-q^4+q^6" +"(8,4,11,0)","-(q^3/t)+q^5/t" +"(8,5,11,1)","-q^4+q^6" +"(8,6,11,2)","-(q^3/t)+q^5/t" +"(8,7,11,3)","-q^4" +"(8,8,11,3)","q^5/t" +"(8,7,11,4)","q^4" +"(8,8,11,4)","-(q^3/t)" +"(8,9,11,5)","-q^4" +"(8,10,11,6)","-(q^3/t)" +"(8,11,11,8)","1" +"(9,0,0,9)","q^15*t" +"(9,0,1,7)","q^12-q^15*t" +"(9,0,1,8)","q^12-q^15*t" +"(9,1,1,9)","-(q^15*t)" +"(9,2,2,9)","q^9*t" +"(9,0,3,5)","q^8-q^12+q^7*t+q^9*t-q^11*t-q^13*t" +"(9,2,3,7)","q^8" +"(9,2,3,8)","q^8" +"(9,3,3,9)","-(q^9*t)" +"(9,0,4,5)","-(q^5*t)-q^7*t+q^11*t+q^13*t" +"(9,2,4,7)","-(q^9*t)" +"(9,2,4,8)","-(q^9*t)" +"(9,4,4,9)","-(q^9*t)" +"(9,0,5,3)","-q^4-q^6+q^8+q^10+q^7*t+q^9*t-q^11*t-q^13*t" +"(9,0,5,4)","q^4+q^6-q^8-q^10-q^7*t-q^9*t+q^11*t+q^13*t" +"(9,1,5,5)","q^7*t+q^9*t-q^11*t-q^13*t" +"(9,3,5,7)","q^9*t" +"(9,4,5,7)","q^8" +"(9,3,5,8)","q^9*t" +"(9,4,5,8)","q^8" +"(9,5,5,9)","q^9*t" +"(9,2,6,5)","q*t+q^3*t-q^5*t-q^7*t" +"(9,6,6,9)","-(q^3*t)" +"(9,0,7,1)","q^2-2*q^6+q^10+q^3*t-q^5*t-q^7*t+q^9*t" +"(9,2,7,3)","q^2+q^4-q^6-q^8" +"(9,2,7,4)","-q^2-q^4+q^6+q^8" +"(9,3,7,5)","-(q^3*t)+q^7*t" +"(9,4,7,5)","q^4-q^8" +"(9,6,7,7)","q^4" +"(9,6,7,8)","q^4" +"(9,7,7,9)","q^3*t" +"(9,0,8,1)","t/q-q^3*t-q^5*t+q^9*t" +"(9,2,8,3)","q*t+q^3*t-q^5*t-q^7*t" +"(9,2,8,4)","-(q*t)-q^3*t+q^5*t+q^7*t" +"(9,4,8,5)","q*t+q^3*t-q^5*t-q^7*t" +"(9,6,8,7)","q^3*t" +"(9,6,8,8)","q^3*t" +"(9,8,8,9)","q^3*t" +"(9,0,9,0)","1-q^2-q^4+q^6-q^3*t+q^5*t+q^7*t-q^9*t" +"(9,1,9,1)","-(q^3*t)+q^5*t+q^7*t-q^9*t" +"(9,3,9,3)","-(q^3*t)+q^7*t" +"(9,4,9,3)","-q^2+q^6" +"(9,3,9,4)","q^3*t-q^7*t" +"(9,4,9,4)","q^2-q^6" +"(9,5,9,5)","-(q^3*t)+q^7*t" +"(9,7,9,7)","-(q^3*t)" +"(9,8,9,7)","q^4" +"(9,7,9,8)","-(q^3*t)" +"(9,8,9,8)","q^4" +"(9,9,9,9)","-(q^3*t)" +"(9,2,10,1)","t/q^3-t/q-q*t+q^3*t" +"(9,6,10,5)","-(t/q^3)+q*t" +"(9,10,10,9)","t/q^3" +"(9,2,11,0)","1-q^2-q^4+q^6" +"(9,4,11,1)","1-q^2-q^4+q^6" +"(9,6,11,3)","1-q^4" +"(9,6,11,4)","-1+q^4" +"(9,8,11,5)","1-q^4" +"(9,10,11,7)","1" +"(9,10,11,8)","1" +"(9,11,11,9)","-(t/q^3)" +"(10,0,0,10)","q^15/t" +"(10,1,1,10)","q^15/t" +"(10,0,2,7)","q^12-q^15/t" +"(10,0,2,8)","q^8-q^11/t" +"(10,2,2,10)","-(q^11/t)" +"(10,0,3,6)","-(q^7/t)-q^9/t+q^13/t+q^15/t" +"(10,1,3,7)","-(q^15/t)" +"(10,1,3,8)","-(q^11/t)" +"(10,3,3,10)","-(q^11/t)" +"(10,0,4,6)","q^8-q^12+q^7/t+q^9/t-q^11/t-q^13/t" +"(10,1,4,7)","q^12" +"(10,1,4,8)","q^8" +"(10,4,4,10)","-(q^11/t)" +"(10,1,5,6)","q^7/t+q^9/t-q^11/t-q^13/t" +"(10,5,5,10)","-(q^11/t)" +"(10,0,6,3)","q^4+q^6-q^8-q^10-q^7/t-q^9/t+q^11/t+q^13/t" +"(10,0,6,4)","-q^2-q^4+q^6+q^8+q^5/t+q^7/t-q^9/t-q^11/t" +"(10,2,6,6)","q^5/t+q^7/t-q^9/t-q^11/t" +"(10,3,6,7)","q^8" +"(10,4,6,7)","q^11/t" +"(10,3,6,8)","q^4" +"(10,4,6,8)","q^7/t" +"(10,6,6,10)","q^7/t" +"(10,0,7,2)","q^3/t-q^7/t-q^9/t+q^13/t" +"(10,1,7,3)","-(q^7/t)-q^9/t+q^11/t+q^13/t" +"(10,1,7,4)","q^5/t+q^7/t-q^9/t-q^11/t" +"(10,3,7,6)","q^5/t+q^7/t-q^9/t-q^11/t" +"(10,5,7,7)","q^11/t" +"(10,5,7,8)","q^7/t" +"(10,7,7,10)","q^7/t" +"(10,0,8,2)","q^2-2*q^6+q^10+q^3/t-q^5/t-q^7/t+q^9/t" +"(10,1,8,3)","-q^4-q^6+q^8+q^10" +"(10,1,8,4)","q^2+q^4-q^6-q^8" +"(10,3,8,6)","q^4-q^8" +"(10,4,8,6)","-(q^5/t)+q^9/t" +"(10,5,8,7)","q^8" +"(10,5,8,8)","q^4" +"(10,8,8,10)","q^7/t" +"(10,1,9,2)","q^3/t-q^5/t-q^7/t+q^9/t" +"(10,5,9,6)","-(q^5/t)+q^9/t" +"(10,9,9,10)","q^7/t" +"(10,0,10,0)","1-q^2-q^4+q^6-q^3/t+q^5/t+q^7/t-q^9/t" +"(10,2,10,2)","-(q^3/t)+q^5/t+q^7/t-q^9/t" +"(10,3,10,3)","q^2-q^6" +"(10,4,10,3)","q^5/t-q^9/t" +"(10,3,10,4)","-1+q^4" +"(10,4,10,4)","-(q^3/t)+q^7/t" +"(10,6,10,6)","-(q^3/t)+q^7/t" +"(10,7,10,7)","q^4" +"(10,8,10,7)","-(q^7/t)" +"(10,7,10,8)","1" +"(10,8,10,8)","-(q^3/t)" +"(10,10,10,10)","-(q^3/t)" +"(10,1,11,0)","-(q^3/t)+q^5/t+q^7/t-q^9/t" +"(10,3,11,2)","-(q^3/t)+q^5/t+q^7/t-q^9/t" +"(10,5,11,3)","q^5/t-q^9/t" +"(10,5,11,4)","-(q^3/t)+q^7/t" +"(10,7,11,6)","-(q^3/t)+q^7/t" +"(10,9,11,7)","-(q^7/t)" +"(10,9,11,8)","-(q^3/t)" +"(10,11,11,10)","-(q^3/t)" +"(11,0,0,11)","q^18" +"(11,0,1,10)","-q^12-q^18+q^15/t+q^15*t" +"(11,1,1,11)","-q^18" +"(11,0,2,9)","-q^12+q^9*t+q^15*t-q^12*t^2" +"(11,2,2,11)","-q^12" +"(11,0,3,7)","q^8+q^10+2*q^12-q^14-q^16-q^15/t-q^15*t" +"(11,0,3,8)","2*q^8-q^11/t+q^7*t+q^9*t-q^11*t-q^13*t-q^15*t" +"(11,1,3,9)","q^12-q^15*t" +"(11,2,3,10)","q^8-q^11/t" +"(11,3,3,11)","q^12" +"(11,0,4,7)","-q^8-q^10+q^12+q^14+q^16-2*q^9*t+q^12*t^2" +"(11,0,4,8)","q^12-q^5*t-q^7*t-2*q^9*t+q^11*t+q^13*t+q^12*t^2" +"(11,1,4,9)","-(q^9*t)+q^12*t^2" +"(11,2,4,10)","q^12-q^9*t" +"(11,4,4,11)","q^12" +"(11,0,5,6)","-q^4-q^6+q^8-q^12+q^14+q^16+q^7/t+q^9/t-q^11/t-q^13/t+q^7*t+q^9*t-q^11*t-q^13*t" +"(11,1,5,7)","q^8+q^10-q^14-q^16" +"(11,1,5,8)","q^8-q^12+q^7*t+q^9*t-q^11*t-q^13*t" +"(11,3,5,10)","-q^12+q^9*t" +"(11,4,5,10)","q^8-q^11/t" +"(11,5,5,11)","-q^12" +"(11,0,6,5)","-q^4-q^6+q^8+q^10+q*t+q^3*t-q^5*t+q^9*t-q^11*t-q^13*t-q^4*t^2-q^6*t^2+q^8*t^2+q^10*t^2" +"(11,2,6,7)","-q^4-q^6+q^8+q^10-q^5*t+q^9*t" +"(11,2,6,8)","-(q*t)-q^3*t+q^7*t+q^9*t" +"(11,3,6,9)","-(q^3*t)+q^6*t^2" +"(11,4,6,9)","-q^6+q^9*t" +"(11,6,6,11)","-q^6" +"(11,0,7,3)","q^2+2*q^4+q^6-3*q^8-2*q^10+q^12-q^7/t-q^9/t+q^11/t+q^13/t-q^7*t-q^9*t+q^11*t+q^13*t" +"(11,0,7,4)","-2*q^2-2*q^4+2*q^6+2*q^8+q^5/t+q^7/t-q^9/t-q^11/t-q^3*t+q^5*t+2*q^7*t-q^11*t-q^13*t" +"(11,1,7,5)","q^4+q^6-q^8-q^10-q^7*t-q^9*t+q^11*t+q^13*t" +"(11,2,7,6)","-q^2-q^4+q^6+q^8+q^5/t+q^7/t-q^9/t-q^11/t" +"(11,3,7,7)","q^4+q^6-q^10-q^9*t" +"(11,4,7,7)","-q^8+q^11/t" +"(11,3,7,8)","q^4+q^3*t-q^7*t-q^9*t" +"(11,4,7,8)","-q^4+q^7/t" +"(11,5,7,9)","q^6-q^9*t" +"(11,6,7,10)","-q^4+q^7/t" +"(11,7,7,11)","q^6" +"(11,0,8,3)","q^2-q^4-2*q^6+q^10+q^12+2*q*t+2*q^3*t-2*q^5*t-2*q^7*t-q^4*t^2-q^6*t^2+q^8*t^2+q^10*t^2" +"(11,0,8,4)","q^4+q^6-q^8-q^10-t/q-2*q*t-q^3*t+3*q^5*t+2*q^7*t-q^9*t+q^4*t^2+q^6*t^2-q^8*t^2-q^10*t^2" +"(11,1,8,5)","q*t+q^3*t-q^5*t-q^7*t-q^4*t^2-q^6*t^2+q^8*t^2+q^10*t^2" +"(11,2,8,6)","q^4+q^6-q^8-q^10-q*t-q^3*t+q^5*t+q^7*t" +"(11,3,8,7)","q^3*t-q^6*t^2" +"(11,4,8,7)","-q^4+q^8+q^10-q^5*t" +"(11,3,8,8)","q^3*t-q^6*t^2" +"(11,4,8,8)","q^6-q*t-q^3*t+q^7*t" +"(11,5,8,9)","q^3*t-q^6*t^2" +"(11,6,8,10)","q^6-q^3*t" +"(11,8,8,11)","q^6" +"(11,0,9,2)","-1+q^2+q^4-2*q^6+q^8+q^10-q^12+q^3/t-q^5/t-q^7/t+q^9/t+q^3*t-q^5*t-q^7*t+q^9*t" +"(11,1,9,3)","-q^2+q^6+q^8-q^12" +"(11,1,9,4)","q^2-2*q^6+q^10+q^3*t-q^5*t-q^7*t+q^9*t" +"(11,3,9,6)","-q^6+q^10+q^3*t-q^7*t" +"(11,4,9,6)","q^2-q^6-q^5/t+q^9/t" +"(11,5,9,7)","q^4-q^10" +"(11,5,9,8)","q^4-q^6+q^3*t-q^7*t" +"(11,7,9,10)","-q^6+q^3*t" +"(11,8,9,10)","-q^4+q^7/t" +"(11,9,9,11)","-q^6" +"(11,0,10,1)","-1+q^2+q^4-q^6+t/q^3-t/q-q*t+2*q^3*t-q^5*t-q^7*t+q^9*t-t^2+q^2*t^2+q^4*t^2-q^6*t^2" +"(11,2,10,3)","-1+q^2+q^4-q^6-t/q+2*q^3*t-q^7*t" +"(11,2,10,4)","t/q^3-q*t-q^3*t+q^7*t" +"(11,3,10,5)","-(t/q^3)+q*t+t^2-q^4*t^2" +"(11,4,10,5)","-1+q^4+q^3*t-q^7*t" +"(11,6,10,7)","-1+q^4-q*t+q^3*t" +"(11,6,10,8)","-(t/q^3)+q^3*t" +"(11,7,10,9)","t/q^3-t^2" +"(11,8,10,9)","-1+q^3*t" +"(11,10,10,11)","-1" +"(11,0,11,0)","2-2*q^2-2*q^4+2*q^6-q^3/t+q^5/t+q^7/t-q^9/t-q^3*t+q^5*t+q^7*t-q^9*t" +"(11,1,11,1)","1-q^2-q^4+q^6-q^3*t+q^5*t+q^7*t-q^9*t" +"(11,2,11,2)","1-q^2-q^4+q^6-q^3/t+q^5/t+q^7/t-q^9/t" +"(11,3,11,3)","1-q^4-q^3*t+q^7*t" +"(11,4,11,3)","-q^2+q^6+q^5/t-q^9/t" +"(11,3,11,4)","-1+q^4+q^3*t-q^7*t" +"(11,4,11,4)","1-q^4-q^3/t+q^7/t" +"(11,5,11,5)","1-q^4-q^3*t+q^7*t" +"(11,6,11,6)","1-q^4-q^3/t+q^7/t" +"(11,7,11,7)","1-q^3*t" +"(11,8,11,7)","q^4-q^7/t" +"(11,7,11,8)","1-q^3*t" +"(11,8,11,8)","1-q^3/t" +"(11,9,11,9)","1-q^3*t" +"(11,10,11,10)","1-q^3/t" +"(11,11,11,11)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/Rp.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/Rp.csv new file mode 100644 index 0000000..85992d5 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/Rp.csv @@ -0,0 +1,586 @@ +"(12,12,12,12)","ZZ" +"(0,0,0,0)","1" +"(0,1,0,1)","1-1/(q^3*t)" +"(0,2,0,2)","1-t/q^3" +"(0,3,0,3)","1-1/(q^3*t)" +"(0,4,0,3)","q^(-4)-1/(q*t)" +"(0,3,0,4)","q^(-6)-t/q^3" +"(0,4,0,4)","1-t/q^3" +"(0,5,0,5)","1-q^(-4)+1/(q^7*t)-1/(q^3*t)" +"(0,6,0,6)","1-q^(-4)+t/q^7-t/q^3" +"(0,7,0,7)","1-q^(-4)+1/(q^7*t)-1/(q^3*t)" +"(0,8,0,7)","q^(-6)-q^(-2)-1/(q^3*t)+q/t" +"(0,7,0,8)","q^(-10)-q^(-6)-t/q^7+t/q^3" +"(0,8,0,8)","1-q^(-4)+t/q^7-t/q^3" +"(0,9,0,9)","1+q^(-6)-q^(-4)-q^(-2)-1/(q^9*t)+1/(q^7*t)+1/(q^5*t)-1/(q^3*t)" +"(0,10,0,10)","1+q^(-6)-q^(-4)-q^(-2)-t/q^9+t/q^7+t/q^5-t/q^3" +"(0,11,0,11)","2+2/q^6-2/q^4-2/q^2-1/(q^9*t)+1/(q^7*t)+1/(q^5*t)-1/(q^3*t)-t/q^9+t/q^7+t/q^5-t/q^3" +"(0,1,1,0)","1/(q^3*t)" +"(0,3,1,2)","-q^(-6)+1/(q^3*t)" +"(0,4,1,2)","-q^(-4)+1/(q*t)" +"(0,5,1,3)","1/(q^7*t)-1/(q*t)" +"(0,5,1,4)","-q^(-6)+q^(-4)-1/(q^7*t)+1/(q^3*t)" +"(0,7,1,6)","q^(-10)-q^(-6)-1/(q^7*t)+1/(q^3*t)" +"(0,8,1,6)","-q^(-6)+q^(-2)+1/(q^3*t)-q/t" +"(0,9,1,7)","1/(q^9*t)-1/(q^5*t)-1/(q^3*t)+q/t" +"(0,9,1,8)","q^(-10)-2/q^6+q^(-2)+1/(q^9*t)-1/(q^7*t)-1/(q^5*t)+1/(q^3*t)" +"(0,11,1,10)","-1-q^(-12)+q^(-10)+q^(-8)-2/q^6+q^(-4)+q^(-2)+1/(q^9*t)-1/(q^7*t)-1/(q^5*t)+1/(q^3*t)+t/q^9-t/q^7-t/q^5+t/q^3" +"(0,2,2,0)","t/q^3" +"(0,3,2,1)","-q^(-6)+t/q^3" +"(0,4,2,1)","-q^(-6)+t/q^3" +"(0,6,2,3)","-q^(-6)+q^(-4)-t/q^7+t/q^3" +"(0,6,2,4)","t/q^9-t/q^3" +"(0,7,2,5)","-q^(-10)+q^(-6)+t/q^7-t/q^3" +"(0,8,2,5)","q^(-10)-q^(-6)-t/q^7+t/q^3" +"(0,10,2,7)","q^(-10)-2/q^6+q^(-2)+t/q^9-t/q^7-t/q^5+t/q^3" +"(0,10,2,8)","t/q^13-t/q^9-t/q^7+t/q^3" +"(0,11,2,9)","-q^(-12)+q^(-10)+q^(-8)-q^(-6)+t/q^15-t/q^13-t/q^11+(2*t)/q^9-t/q^7-t/q^5+t/q^3-t^2/q^12+t^2/q^10+t^2/q^8-t^2/q^6" +"(0,3,3,0)","q^(-6)" +"(0,5,3,1)","q^(-6)-1/(q^9*t)" +"(0,6,3,2)","-q^(-4)+t/q^7" +"(0,7,3,3)","-q^(-10)+q^(-6)+q^(-4)-1/(q^9*t)" +"(0,8,3,3)","-q^(-8)+1/(q^5*t)" +"(0,7,3,4)","q^(-12)+q^(-10)-q^(-6)-t/q^7" +"(0,8,3,4)","-q^(-4)+t/q^7" +"(0,9,3,5)","-q^(-10)-q^(-8)+q^(-6)+q^(-4)+1/(q^13*t)+1/(q^11*t)-1/(q^9*t)-1/(q^7*t)" +"(0,10,3,6)","q^(-8)+q^(-6)-q^(-4)-q^(-2)-t/q^11-t/q^9+t/q^7+t/q^5" +"(0,11,3,7)","q^(-12)-2/q^10-3/q^8+q^(-6)+2/q^4+q^(-2)+1/(q^13*t)+1/(q^11*t)-1/(q^9*t)-1/(q^7*t)+t/q^13+t/q^11-t/q^9-t/q^7" +"(0,11,3,8)","q^(-16)+q^(-14)-2/q^10-q^(-8)+q^(-6)-(2*t)/q^11-(2*t)/q^9+(2*t)/q^7+(2*t)/q^5+t^2/q^14+t^2/q^12-t^2/q^10-t^2/q^8" +"(0,4,4,0)","q^(-6)" +"(0,5,4,1)","-q^(-6)+1/(q^9*t)" +"(0,6,4,2)","q^(-6)-t/q^9" +"(0,7,4,3)","-q^(-6)+1/(q^9*t)" +"(0,8,4,3)","q^(-10)+q^(-8)-q^(-4)-1/(q^5*t)" +"(0,7,4,4)","-q^(-12)+t/q^9" +"(0,8,4,4)","-q^(-10)+q^(-6)+q^(-4)-t/q^9" +"(0,9,4,5)","q^(-10)+q^(-8)-q^(-6)-q^(-4)-1/(q^13*t)-1/(q^11*t)+1/(q^9*t)+1/(q^7*t)" +"(0,10,4,6)","-q^(-10)-q^(-8)+q^(-6)+q^(-4)+t/q^13+t/q^11-t/q^9-t/q^7" +"(0,11,4,7)","2/q^10+2/q^8-2/q^6-2/q^4-1/(q^13*t)-1/(q^11*t)+1/(q^9*t)+1/(q^7*t)-t/q^15-t/q^13+(2*t)/q^9+t/q^7-t/q^5" +"(0,11,4,8)","-q^(-16)-q^(-14)+q^(-12)+q^(-10)-t/q^15+(2*t)/q^13+(3*t)/q^11-t/q^9-(2*t)/q^7-t/q^5-t^2/q^16-t^2/q^14+t^2/q^12+t^2/q^10" +"(0,5,5,0)","1/(q^9*t)" +"(0,7,5,2)","-q^(-12)+1/(q^9*t)" +"(0,8,5,2)","q^(-8)-1/(q^5*t)" +"(0,9,5,3)","1/(q^13*t)+1/(q^11*t)-1/(q^7*t)-1/(q^5*t)" +"(0,9,5,4)","-q^(-12)+q^(-8)-1/(q^13*t)-1/(q^11*t)+1/(q^9*t)+1/(q^7*t)" +"(0,11,5,6)","q^(-16)+q^(-14)-q^(-12)+q^(-8)-q^(-6)-q^(-4)-1/(q^13*t)-1/(q^11*t)+1/(q^9*t)+1/(q^7*t)-t/q^13-t/q^11+t/q^9+t/q^7" +"(0,6,6,0)","t/q^9" +"(0,7,6,1)","q^(-12)-t/q^9" +"(0,8,6,1)","-q^(-12)+t/q^9" +"(0,10,6,3)","-q^(-12)+q^(-8)-t/q^13-t/q^11+t/q^9+t/q^7" +"(0,10,6,4)","t/q^15+t/q^13-t/q^9-t/q^7" +"(0,11,6,5)","q^(-16)+q^(-14)-q^(-12)-q^(-10)-t/q^19-t/q^17+t/q^15-t/q^11+t/q^9+t/q^7+t^2/q^16+t^2/q^14-t^2/q^12-t^2/q^10" +"(0,7,7,0)","q^(-12)" +"(0,9,7,1)","q^(-12)-1/(q^15*t)" +"(0,10,7,2)","q^(-8)-t/q^11" +"(0,11,7,3)","-q^(-16)-q^(-14)+2/q^12+q^(-10)+q^(-8)-1/(q^15*t)-t/q^15" +"(0,11,7,4)","q^(-18)+q^(-16)+q^(-14)-q^(-12)-q^(-10)-(2*t)/q^11+t^2/q^14" +"(0,8,8,0)","q^(-12)" +"(0,9,8,1)","q^(-12)-1/(q^15*t)" +"(0,10,8,2)","q^(-12)-t/q^15" +"(0,11,8,3)","2/q^12-1/(q^15*t)-t/q^19-t/q^17-t/q^15+t/q^13+t/q^11" +"(0,11,8,4)","q^(-18)+t/q^19+t/q^17-(2*t)/q^15-t/q^13-t/q^11+t^2/q^18" +"(0,9,9,0)","1/(q^15*t)" +"(0,11,9,2)","-q^(-18)-q^(-12)+1/(q^15*t)+t/q^15" +"(0,10,10,0)","t/q^15" +"(0,11,10,1)","-q^(-18)+t/q^21+t/q^15-t^2/q^18" +"(0,11,11,0)","q^(-18)" +"(1,0,0,1)","1" +"(1,2,0,3)","1" +"(1,2,0,4)","-(t/q^3)" +"(1,4,0,5)","1-q^(-4)" +"(1,6,0,7)","1-q^(-4)" +"(1,6,0,8)","-(t/q^7)+t/q^3" +"(1,8,0,9)","1+q^(-6)-q^(-4)-q^(-2)" +"(1,10,0,11)","1+q^(-6)-q^(-4)-q^(-2)" +"(1,1,1,1)","-(1/(q^3*t))" +"(1,3,1,3)","-(1/(q^3*t))" +"(1,4,1,3)","-(1/(q*t))" +"(1,3,1,4)","q^(-6)" +"(1,4,1,4)","q^(-4)" +"(1,5,1,5)","1/(q^7*t)-1/(q^3*t)" +"(1,7,1,7)","1/(q^7*t)-1/(q^3*t)" +"(1,8,1,7)","-(1/(q^3*t))+q/t" +"(1,7,1,8)","q^(-10)-q^(-6)" +"(1,8,1,8)","-q^(-6)+q^(-2)" +"(1,9,1,9)","-(1/(q^9*t))+1/(q^7*t)+1/(q^5*t)-1/(q^3*t)" +"(1,11,1,11)","1+q^(-6)-q^(-4)-q^(-2)-1/(q^9*t)+1/(q^7*t)+1/(q^5*t)-1/(q^3*t)" +"(1,2,2,1)","t/q^3" +"(1,6,2,5)","t/q^7-t/q^3" +"(1,10,2,9)","t/q^9-t/q^7-t/q^5+t/q^3" +"(1,3,3,1)","-q^(-6)" +"(1,6,3,3)","q^(-4)" +"(1,6,3,4)","-(t/q^7)" +"(1,7,3,5)","-q^(-10)+q^(-6)" +"(1,8,3,5)","-q^(-8)+q^(-4)" +"(1,10,3,7)","-q^(-8)-q^(-6)+q^(-4)+q^(-2)" +"(1,10,3,8)","-(t/q^11)-t/q^9+t/q^7+t/q^5" +"(1,11,3,9)","-q^(-12)+q^(-10)+q^(-8)-q^(-6)-t/q^13+(2*t)/q^9-t/q^5" +"(1,4,4,1)","-q^(-6)" +"(1,6,4,3)","-q^(-6)" +"(1,6,4,4)","t/q^9" +"(1,8,4,5)","q^(-10)+q^(-8)-q^(-6)-q^(-4)" +"(1,10,4,7)","q^(-10)+q^(-8)-q^(-6)-q^(-4)" +"(1,10,4,8)","t/q^13+t/q^11-t/q^9-t/q^7" +"(1,11,4,9)","t/q^15-t/q^11-t/q^9+t/q^5" +"(1,5,5,1)","1/(q^9*t)" +"(1,7,5,3)","1/(q^9*t)" +"(1,8,5,3)","-(1/(q^5*t))" +"(1,7,5,4)","-q^(-12)" +"(1,8,5,4)","q^(-8)" +"(1,9,5,5)","-(1/(q^13*t))-1/(q^11*t)+1/(q^9*t)+1/(q^7*t)" +"(1,11,5,7)","q^(-10)+q^(-8)-q^(-6)-q^(-4)-1/(q^13*t)-1/(q^11*t)+1/(q^9*t)+1/(q^7*t)" +"(1,11,5,8)","-q^(-16)-q^(-14)+q^(-12)+q^(-10)+t/q^13+t/q^11-t/q^9-t/q^7" +"(1,6,6,1)","-(t/q^9)" +"(1,10,6,5)","-(t/q^13)-t/q^11+t/q^9+t/q^7" +"(1,7,7,1)","q^(-12)" +"(1,10,7,3)","q^(-8)" +"(1,10,7,4)","-(t/q^11)" +"(1,11,7,5)","q^(-16)+q^(-14)-q^(-12)-q^(-10)+t/q^15-t/q^11" +"(1,8,8,1)","q^(-12)" +"(1,10,8,3)","q^(-12)" +"(1,10,8,4)","-(t/q^15)" +"(1,11,8,5)","t/q^19+t/q^17-t/q^13-t/q^11" +"(1,9,9,1)","-(1/(q^15*t))" +"(1,11,9,3)","q^(-12)-1/(q^15*t)" +"(1,11,9,4)","q^(-18)-t/q^15" +"(1,10,10,1)","t/q^15" +"(1,11,11,1)","-q^(-18)" +"(2,0,0,2)","1" +"(2,1,0,3)","-(1/(q*t))" +"(2,1,0,4)","1" +"(2,3,0,6)","1-q^(-4)" +"(2,5,0,7)","-(1/(q^3*t))+q/t" +"(2,5,0,8)","1-q^(-4)" +"(2,7,0,10)","1+q^(-6)-q^(-4)-q^(-2)" +"(2,9,0,11)","-(1/(q^3*t))+1/(q*t)+q/t-q^3/t" +"(2,1,1,2)","1/(q*t)" +"(2,5,1,6)","1/(q^3*t)-q/t" +"(2,9,1,10)","1/(q^3*t)-1/(q*t)-q/t+q^3/t" +"(2,2,2,2)","-(t/q^3)" +"(2,3,2,3)","q^(-4)" +"(2,4,2,3)","q^(-4)" +"(2,3,2,4)","-(t/q^3)" +"(2,4,2,4)","-(t/q^3)" +"(2,6,2,6)","t/q^7-t/q^3" +"(2,7,2,7)","-q^(-6)+q^(-2)" +"(2,8,2,7)","q^(-6)-q^(-2)" +"(2,7,2,8)","-(t/q^7)+t/q^3" +"(2,8,2,8)","t/q^7-t/q^3" +"(2,10,2,10)","-(t/q^9)+t/q^7+t/q^5-t/q^3" +"(2,11,2,11)","1+q^(-6)-q^(-4)-q^(-2)-t/q^9+t/q^7+t/q^5-t/q^3" +"(2,3,3,2)","-q^(-4)" +"(2,5,3,3)","1/(q^5*t)" +"(2,5,3,4)","-q^(-4)" +"(2,7,3,6)","q^(-8)+q^(-6)-q^(-4)-q^(-2)" +"(2,9,3,7)","1/(q^7*t)+1/(q^5*t)-1/(q^3*t)-1/(q*t)" +"(2,9,3,8)","q^(-8)+q^(-6)-q^(-4)-q^(-2)" +"(2,11,3,10)","-1-q^(-10)+q^(-6)+q^(-4)" +"(2,4,4,2)","-q^(-4)" +"(2,5,4,3)","-(1/(q^5*t))" +"(2,5,4,4)","q^(-4)" +"(2,7,4,6)","-q^(-8)+q^(-4)" +"(2,8,4,6)","-q^(-6)+q^(-2)" +"(2,9,4,7)","-(1/(q^7*t))-1/(q^5*t)+1/(q^3*t)+1/(q*t)" +"(2,9,4,8)","-q^(-8)-q^(-6)+q^(-4)+q^(-2)" +"(2,11,4,10)","q^(-10)-2/q^6+q^(-2)+t/q^9-t/q^7-t/q^5+t/q^3" +"(2,5,5,2)","-(1/(q^5*t))" +"(2,9,5,6)","-(1/(q^7*t))-1/(q^5*t)+1/(q^3*t)+1/(q*t)" +"(2,6,6,2)","t/q^7" +"(2,7,6,3)","q^(-8)" +"(2,8,6,3)","-q^(-8)" +"(2,7,6,4)","-(t/q^7)" +"(2,8,6,4)","t/q^7" +"(2,10,6,6)","-(t/q^11)-t/q^9+t/q^7+t/q^5" +"(2,11,6,7)","-q^(-10)-q^(-8)+q^(-6)+q^(-4)+t/q^13+t/q^11-t/q^9-t/q^7" +"(2,11,6,8)","-(t/q^11)-t/q^9+t/q^7+t/q^5+t^2/q^14+t^2/q^12-t^2/q^10-t^2/q^8" +"(2,7,7,2)","q^(-8)" +"(2,9,7,3)","-(1/(q^9*t))" +"(2,9,7,4)","q^(-8)" +"(2,11,7,6)","-q^(-12)-q^(-10)+q^(-6)+q^(-4)" +"(2,8,8,2)","q^(-8)" +"(2,9,8,3)","-(1/(q^9*t))" +"(2,9,8,4)","q^(-8)" +"(2,11,8,6)","-q^(-12)+q^(-8)-t/q^13-t/q^11+t/q^9+t/q^7" +"(2,9,9,2)","1/(q^9*t)" +"(2,10,10,2)","-(t/q^11)" +"(2,11,10,3)","q^(-12)-t/q^15" +"(2,11,10,4)","-(t/q^11)+t^2/q^14" +"(2,11,11,2)","-q^(-12)" +"(3,0,0,3)","1" +"(3,1,0,5)","1" +"(3,2,0,6)","t/q^3" +"(3,3,0,7)","1" +"(3,4,0,7)","q^(-2)" +"(3,3,0,8)","t/q^3" +"(3,4,0,8)","t/q^3" +"(3,5,0,9)","1-q^(-2)" +"(3,6,0,10)","-(t/q^5)+t/q^3" +"(3,7,0,11)","1-q^(-2)" +"(3,8,0,11)","-1+q^(-2)" +"(3,1,1,3)","-(1/(q*t))" +"(3,3,1,6)","-q^(-4)" +"(3,4,1,6)","-q^(-2)" +"(3,5,1,7)","-(1/(q^3*t))+q/t" +"(3,5,1,8)","-q^(-4)+q^(-2)" +"(3,7,1,10)","q^(-6)-q^(-4)" +"(3,8,1,10)","1-q^(-2)" +"(3,9,1,11)","-(1/(q^3*t))+1/(q*t)+q/t-q^3/t" +"(3,2,2,3)","-(t/q^3)" +"(3,3,2,5)","-(t/q^3)" +"(3,4,2,5)","-(t/q^3)" +"(3,6,2,7)","t/q^5-t/q^3" +"(3,7,2,9)","-(t/q^5)+t/q^3" +"(3,8,2,9)","t/q^5-t/q^3" +"(3,3,3,3)","q^(-4)" +"(3,5,3,5)","q^(-4)" +"(3,6,3,6)","-(t/q^5)" +"(3,7,3,7)","-q^(-6)+q^(-4)+q^(-2)" +"(3,8,3,7)","-q^(-4)" +"(3,7,3,8)","t/q^5" +"(3,8,3,8)","-(t/q^5)" +"(3,9,3,9)","-q^(-6)+q^(-2)" +"(3,10,3,10)","t/q^7-t/q^3" +"(3,11,3,11)","1-q^(-4)+t/q^7-t/q^3" +"(3,4,4,3)","q^(-4)" +"(3,5,4,5)","-q^(-4)" +"(3,6,4,6)","t/q^7" +"(3,7,4,7)","-q^(-4)" +"(3,8,4,7)","q^(-6)+q^(-4)-q^(-2)" +"(3,7,4,8)","-(t/q^7)" +"(3,8,4,8)","t/q^7" +"(3,9,4,9)","q^(-6)-q^(-2)" +"(3,10,4,10)","-(t/q^9)+t/q^5" +"(3,11,4,11)","q^(-6)-q^(-2)-t/q^9+t/q^5" +"(3,5,5,3)","-(1/(q^5*t))" +"(3,7,5,6)","-q^(-8)" +"(3,8,5,6)","q^(-4)" +"(3,9,5,7)","-(1/(q^7*t))-1/(q^5*t)+1/(q^3*t)+1/(q*t)" +"(3,9,5,8)","-q^(-8)+q^(-4)" +"(3,11,5,10)","q^(-10)-q^(-6)-t/q^7+t/q^3" +"(3,6,6,3)","-(t/q^7)" +"(3,7,6,5)","t/q^7" +"(3,8,6,5)","-(t/q^7)" +"(3,10,6,7)","t/q^9-t/q^5" +"(3,11,6,9)","t/q^9-t/q^5-t^2/q^12+t^2/q^8" +"(3,7,7,3)","q^(-8)" +"(3,9,7,5)","q^(-8)" +"(3,10,7,6)","t/q^7" +"(3,11,7,7)","-q^(-10)+q^(-6)+q^(-4)-t/q^9" +"(3,11,7,8)","t/q^7-t^2/q^10" +"(3,8,8,3)","q^(-8)" +"(3,9,8,5)","q^(-8)" +"(3,10,8,6)","t/q^11" +"(3,11,8,7)","q^(-8)-t/q^13-t/q^11+t/q^7" +"(3,11,8,8)","t/q^11-t^2/q^14" +"(3,9,9,3)","-(1/(q^9*t))" +"(3,11,9,6)","-q^(-12)+t/q^9" +"(3,10,10,3)","-(t/q^11)" +"(3,11,10,5)","-(t/q^11)+t^2/q^14" +"(3,11,11,3)","q^(-12)" +"(4,0,0,4)","1" +"(4,1,0,5)","1/(q*t)" +"(4,2,0,6)","1" +"(4,3,0,7)","1/(q*t)" +"(4,4,0,7)","q/t" +"(4,3,0,8)","q^(-4)" +"(4,4,0,8)","1" +"(4,5,0,9)","-(1/(q^3*t))+1/(q*t)" +"(4,6,0,10)","1-q^(-2)" +"(4,7,0,11)","-(1/(q^3*t))+1/(q*t)" +"(4,8,0,11)","q/t-q^3/t" +"(4,1,1,4)","-(1/(q*t))" +"(4,3,1,6)","-(1/(q*t))" +"(4,4,1,6)","-(q/t)" +"(4,5,1,8)","1/(q^3*t)-1/(q*t)" +"(4,7,1,10)","1/(q^3*t)-1/(q*t)" +"(4,8,1,10)","-(q/t)+q^3/t" +"(4,2,2,4)","-(t/q^3)" +"(4,3,2,5)","-q^(-4)" +"(4,4,2,5)","-q^(-4)" +"(4,6,2,7)","-q^(-4)+q^(-2)" +"(4,6,2,8)","-(t/q^7)+t/q^3" +"(4,7,2,9)","-q^(-6)+q^(-4)" +"(4,8,2,9)","q^(-6)-q^(-4)" +"(4,10,2,11)","1+q^(-6)-q^(-4)-q^(-2)" +"(4,3,3,4)","q^(-4)" +"(4,5,3,5)","1/(q^5*t)" +"(4,6,3,6)","-q^(-2)" +"(4,7,3,7)","1/(q^5*t)" +"(4,8,3,7)","-(1/(q*t))" +"(4,7,3,8)","q^(-8)+q^(-6)-q^(-4)" +"(4,8,3,8)","-q^(-2)" +"(4,9,3,9)","-(1/(q^7*t))+1/(q^3*t)" +"(4,10,3,10)","-1+q^(-4)" +"(4,11,3,11)","-1+q^(-4)-1/(q^7*t)+1/(q^3*t)" +"(4,4,4,4)","q^(-4)" +"(4,5,4,5)","-(1/(q^5*t))" +"(4,6,4,6)","q^(-4)" +"(4,7,4,7)","-(1/(q^5*t))" +"(4,8,4,7)","1/(q*t)" +"(4,7,4,8)","-q^(-8)" +"(4,8,4,8)","-q^(-6)+q^(-4)+q^(-2)" +"(4,9,4,9)","1/(q^7*t)-1/(q^3*t)" +"(4,10,4,10)","-q^(-6)+q^(-2)" +"(4,11,4,11)","1-q^(-4)+1/(q^7*t)-1/(q^3*t)" +"(4,5,5,4)","-(1/(q^5*t))" +"(4,7,5,6)","-(1/(q^5*t))" +"(4,8,5,6)","1/(q*t)" +"(4,9,5,8)","1/(q^7*t)-1/(q^3*t)" +"(4,11,5,10)","1-q^(-4)+1/(q^7*t)-1/(q^3*t)" +"(4,6,6,4)","-(t/q^7)" +"(4,7,6,5)","q^(-8)" +"(4,8,6,5)","-q^(-8)" +"(4,10,6,7)","-q^(-8)+q^(-4)" +"(4,10,6,8)","-(t/q^11)-t/q^9+t/q^7+t/q^5" +"(4,11,6,9)","q^(-10)-q^(-6)-t/q^13+t/q^9" +"(4,7,7,4)","q^(-8)" +"(4,9,7,5)","1/(q^9*t)" +"(4,10,7,6)","q^(-4)" +"(4,11,7,7)","-q^(-6)+1/(q^9*t)" +"(4,11,7,8)","q^(-12)+q^(-10)-q^(-6)-t/q^7" +"(4,8,8,4)","q^(-8)" +"(4,9,8,5)","1/(q^9*t)" +"(4,10,8,6)","q^(-8)" +"(4,11,8,7)","-q^(-6)+1/(q^9*t)" +"(4,11,8,8)","q^(-12)+t/q^13-t/q^9-t/q^7" +"(4,9,9,4)","-(1/(q^9*t))" +"(4,11,9,6)","q^(-6)-1/(q^9*t)" +"(4,10,10,4)","-(t/q^11)" +"(4,11,10,5)","-q^(-12)+t/q^15" +"(4,11,11,4)","q^(-12)" +"(5,0,0,5)","1" +"(5,2,0,7)","1" +"(5,2,0,8)","t/q^3" +"(5,4,0,9)","1-q^(-2)" +"(5,6,0,11)","1-q^(-2)" +"(5,1,1,5)","1/(q*t)" +"(5,3,1,7)","1/(q*t)" +"(5,4,1,7)","q/t" +"(5,3,1,8)","q^(-4)" +"(5,4,1,8)","q^(-2)" +"(5,5,1,9)","-(1/(q^3*t))+1/(q*t)" +"(5,7,1,11)","-(1/(q^3*t))+1/(q*t)" +"(5,8,1,11)","q/t-q^3/t" +"(5,2,2,5)","-(t/q^3)" +"(5,6,2,9)","-(t/q^5)+t/q^3" +"(5,3,3,5)","-q^(-4)" +"(5,6,3,7)","q^(-2)" +"(5,6,3,8)","t/q^5" +"(5,7,3,9)","-q^(-6)+q^(-4)" +"(5,8,3,9)","-q^(-4)+q^(-2)" +"(5,10,3,11)","1-q^(-4)" +"(5,4,4,5)","-q^(-4)" +"(5,6,4,7)","-q^(-4)" +"(5,6,4,8)","-(t/q^7)" +"(5,8,4,9)","q^(-6)-q^(-2)" +"(5,10,4,11)","q^(-6)-q^(-2)" +"(5,5,5,5)","-(1/(q^5*t))" +"(5,7,5,7)","-(1/(q^5*t))" +"(5,8,5,7)","1/(q*t)" +"(5,7,5,8)","-q^(-8)" +"(5,8,5,8)","q^(-4)" +"(5,9,5,9)","1/(q^7*t)-1/(q^3*t)" +"(5,11,5,11)","1-q^(-4)+1/(q^7*t)-1/(q^3*t)" +"(5,6,6,5)","t/q^7" +"(5,10,6,9)","t/q^9-t/q^5" +"(5,7,7,5)","q^(-8)" +"(5,10,7,7)","q^(-4)" +"(5,10,7,8)","t/q^7" +"(5,11,7,9)","q^(-10)-q^(-6)+t/q^9-t/q^7" +"(5,8,8,5)","q^(-8)" +"(5,10,8,7)","q^(-8)" +"(5,10,8,8)","t/q^11" +"(5,11,8,9)","t/q^13-t/q^7" +"(5,9,9,5)","1/(q^9*t)" +"(5,11,9,7)","-q^(-6)+1/(q^9*t)" +"(5,11,9,8)","q^(-12)-t/q^9" +"(5,10,10,5)","-(t/q^11)" +"(5,11,11,5)","-q^(-12)" +"(6,0,0,6)","1" +"(6,1,0,7)","q/t" +"(6,1,0,8)","1" +"(6,3,0,10)","1-q^(-2)" +"(6,5,0,11)","q/t-q^3/t" +"(6,1,1,6)","-(q/t)" +"(6,5,1,10)","-(q/t)+q^3/t" +"(6,2,2,6)","t/q^3" +"(6,3,2,7)","q^(-2)" +"(6,4,2,7)","q^(-2)" +"(6,3,2,8)","t/q^3" +"(6,4,2,8)","t/q^3" +"(6,6,2,10)","-(t/q^5)+t/q^3" +"(6,7,2,11)","1-q^(-2)" +"(6,8,2,11)","-1+q^(-2)" +"(6,3,3,6)","-q^(-2)" +"(6,5,3,7)","-(1/(q*t))" +"(6,5,3,8)","-q^(-2)" +"(6,7,3,10)","-1+q^(-4)" +"(6,9,3,11)","-(1/(q*t))+q^3/t" +"(6,4,4,6)","-q^(-2)" +"(6,5,4,7)","1/(q*t)" +"(6,5,4,8)","q^(-2)" +"(6,7,4,10)","-q^(-4)+q^(-2)" +"(6,8,4,10)","1-q^(-2)" +"(6,9,4,11)","1/(q*t)-q^3/t" +"(6,5,5,6)","1/(q*t)" +"(6,9,5,10)","1/(q*t)-q^3/t" +"(6,6,6,6)","-(t/q^5)" +"(6,7,6,7)","q^(-4)" +"(6,8,6,7)","-q^(-4)" +"(6,7,6,8)","t/q^5" +"(6,8,6,8)","-(t/q^5)" +"(6,10,6,10)","t/q^7-t/q^3" +"(6,11,6,11)","1-q^(-4)+t/q^7-t/q^3" +"(6,7,7,6)","q^(-4)" +"(6,9,7,7)","1/(q^3*t)" +"(6,9,7,8)","q^(-4)" +"(6,11,7,10)","1-q^(-6)" +"(6,8,8,6)","q^(-4)" +"(6,9,8,7)","1/(q^3*t)" +"(6,9,8,8)","q^(-4)" +"(6,11,8,10)","-q^(-6)+q^(-4)-t/q^7+t/q^3" +"(6,9,9,6)","-(1/(q^3*t))" +"(6,10,10,6)","t/q^7" +"(6,11,10,7)","q^(-6)-t/q^9" +"(6,11,10,8)","t/q^7-t^2/q^10" +"(6,11,11,6)","-q^(-6)" +"(7,0,0,7)","1" +"(7,1,0,9)","1" +"(7,2,0,10)","-(t/q^3)" +"(7,3,0,11)","1" +"(7,4,0,11)","1" +"(7,1,1,7)","q/t" +"(7,3,1,10)","-q^(-2)" +"(7,4,1,10)","-1" +"(7,5,1,11)","q/t-q^3/t" +"(7,2,2,7)","t/q^3" +"(7,3,2,9)","t/q^3" +"(7,4,2,9)","t/q^3" +"(7,3,3,7)","q^(-2)" +"(7,5,3,9)","q^(-2)" +"(7,6,3,10)","t/q^3" +"(7,7,3,11)","1" +"(7,8,3,11)","-1" +"(7,4,4,7)","q^(-2)" +"(7,5,4,9)","-q^(-2)" +"(7,6,4,10)","-(t/q^5)" +"(7,7,4,11)","-q^(-2)" +"(7,8,4,11)","q^(-2)" +"(7,5,5,7)","1/(q*t)" +"(7,7,5,10)","-q^(-4)" +"(7,8,5,10)","1" +"(7,9,5,11)","1/(q*t)-q^3/t" +"(7,6,6,7)","t/q^5" +"(7,7,6,9)","-(t/q^5)" +"(7,8,6,9)","t/q^5" +"(7,7,7,7)","q^(-4)" +"(7,9,7,9)","q^(-4)" +"(7,10,7,10)","-(t/q^3)" +"(7,11,7,11)","1-t/q^3" +"(7,8,8,7)","q^(-4)" +"(7,9,8,9)","q^(-4)" +"(7,10,8,10)","-(t/q^7)" +"(7,11,8,11)","q^(-4)-t/q^7" +"(7,9,9,7)","1/(q^3*t)" +"(7,11,9,10)","-q^(-6)+t/q^3" +"(7,10,10,7)","t/q^7" +"(7,11,10,9)","t/q^7-t^2/q^10" +"(7,11,11,7)","q^(-6)" +"(8,0,0,8)","1" +"(8,1,0,9)","-(q/t)" +"(8,2,0,10)","1" +"(8,3,0,11)","-(q/t)" +"(8,4,0,11)","-(q^3/t)" +"(8,1,1,8)","q/t" +"(8,3,1,10)","q/t" +"(8,4,1,10)","q^3/t" +"(8,2,2,8)","t/q^3" +"(8,3,2,9)","-q^(-2)" +"(8,4,2,9)","-q^(-2)" +"(8,6,2,11)","1-q^(-2)" +"(8,3,3,8)","q^(-2)" +"(8,5,3,9)","-(1/(q*t))" +"(8,6,3,10)","-1" +"(8,7,3,11)","-(1/(q*t))" +"(8,8,3,11)","q^3/t" +"(8,4,4,8)","q^(-2)" +"(8,5,4,9)","1/(q*t)" +"(8,6,4,10)","q^(-2)" +"(8,7,4,11)","1/(q*t)" +"(8,8,4,11)","-(q^3/t)" +"(8,5,5,8)","1/(q*t)" +"(8,7,5,10)","1/(q*t)" +"(8,8,5,10)","-(q^3/t)" +"(8,6,6,8)","t/q^5" +"(8,7,6,9)","q^(-4)" +"(8,8,6,9)","-q^(-4)" +"(8,10,6,11)","1-q^(-4)" +"(8,7,7,8)","q^(-4)" +"(8,9,7,9)","-(1/(q^3*t))" +"(8,10,7,10)","1" +"(8,11,7,11)","1-1/(q^3*t)" +"(8,8,8,8)","q^(-4)" +"(8,9,8,9)","-(1/(q^3*t))" +"(8,10,8,10)","q^(-4)" +"(8,11,8,11)","1-1/(q^3*t)" +"(8,9,9,8)","1/(q^3*t)" +"(8,11,9,10)","-1+1/(q^3*t)" +"(8,10,10,8)","t/q^7" +"(8,11,10,9)","-q^(-6)+t/q^9" +"(8,11,11,8)","q^(-6)" +"(9,0,0,9)","1" +"(9,2,0,11)","1" +"(9,1,1,9)","-(q/t)" +"(9,3,1,11)","-(q/t)" +"(9,4,1,11)","-(q^3/t)" +"(9,2,2,9)","t/q^3" +"(9,3,3,9)","-q^(-2)" +"(9,6,3,11)","1" +"(9,4,4,9)","-q^(-2)" +"(9,6,4,11)","-q^(-2)" +"(9,5,5,9)","1/(q*t)" +"(9,7,5,11)","1/(q*t)" +"(9,8,5,11)","-(q^3/t)" +"(9,6,6,9)","-(t/q^5)" +"(9,7,7,9)","q^(-4)" +"(9,10,7,11)","1" +"(9,8,8,9)","q^(-4)" +"(9,10,8,11)","q^(-4)" +"(9,9,9,9)","-(1/(q^3*t))" +"(9,11,9,11)","1-1/(q^3*t)" +"(9,10,10,9)","t/q^7" +"(9,11,11,9)","-q^(-6)" +"(10,0,0,10)","1" +"(10,1,0,11)","-(q^3/t)" +"(10,1,1,10)","q^3/t" +"(10,2,2,10)","-(t/q^3)" +"(10,3,2,11)","1" +"(10,4,2,11)","1" +"(10,3,3,10)","-1" +"(10,5,3,11)","q^3/t" +"(10,4,4,10)","-1" +"(10,5,4,11)","-(q^3/t)" +"(10,5,5,10)","-(q^3/t)" +"(10,6,6,10)","t/q^3" +"(10,7,6,11)","1" +"(10,8,6,11)","-1" +"(10,7,7,10)","1" +"(10,9,7,11)","-(q^3/t)" +"(10,8,8,10)","1" +"(10,9,8,11)","-(q^3/t)" +"(10,9,9,10)","q^3/t" +"(10,10,10,10)","-(t/q^3)" +"(10,11,10,11)","1-t/q^3" +"(10,11,11,10)","-1" +"(11,0,0,11)","1" +"(11,1,1,11)","-(q^3/t)" +"(11,2,2,11)","-(t/q^3)" +"(11,3,3,11)","1" +"(11,4,4,11)","1" +"(11,5,5,11)","-(q^3/t)" +"(11,6,6,11)","-(t/q^3)" +"(11,7,7,11)","1" +"(11,8,8,11)","1" +"(11,9,9,11)","-(q^3/t)" +"(11,10,10,11)","-(t/q^3)" +"(11,11,11,11)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/hn.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/hn.csv new file mode 100644 index 0000000..1e73983 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/hn.csv @@ -0,0 +1,13 @@ +"(12,12)","ZZ" +"(0,0)","1" +"(1,1)","-1" +"(2,2)","-1" +"(3,3)","1" +"(4,4)","1" +"(5,5)","-1" +"(6,6)","-1" +"(7,7)","1" +"(8,8)","1" +"(9,9)","-1" +"(10,10)","-1" +"(11,11)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/hp.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/hp.csv new file mode 100644 index 0000000..1e73983 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V3/hp.csv @@ -0,0 +1,13 @@ +"(12,12)","ZZ" +"(0,0)","1" +"(1,1)","-1" +"(2,2)","-1" +"(3,3)","1" +"(4,4)","1" +"(5,5)","-1" +"(6,6)","-1" +"(7,7)","1" +"(8,8)","1" +"(9,9)","-1" +"(10,10)","-1" +"(11,11)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/Rn.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/Rn.csv new file mode 100644 index 0000000..c18266d --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/Rn.csv @@ -0,0 +1,1378 @@ +"(16,16,16,16)","ZZ" +"(0,0,0,0)","1" +"(0,1,1,0)","1" +"(0,2,2,0)","1" +"(0,3,3,0)","1" +"(0,4,4,0)","1" +"(0,5,5,0)","1" +"(0,6,6,0)","1" +"(0,7,7,0)","1" +"(0,8,8,0)","1" +"(0,9,9,0)","1" +"(0,10,10,0)","1" +"(0,11,11,0)","1" +"(0,12,12,0)","1" +"(0,13,13,0)","1" +"(0,14,14,0)","1" +"(0,15,15,0)","1" +"(1,0,0,1)","q^2*t" +"(1,0,1,0)","1-q^2*t" +"(1,1,1,1)","-(q^2*t)" +"(1,2,2,1)","q*t" +"(1,2,3,0)","1" +"(1,3,3,1)","-(q*t)" +"(1,2,4,0)","-(q*t)" +"(1,4,4,1)","-(q*t)" +"(1,3,5,0)","q*t" +"(1,4,5,0)","1" +"(1,5,5,1)","q*t" +"(1,6,6,1)","-t" +"(1,6,7,0)","1" +"(1,7,7,1)","t" +"(1,6,8,0)","t" +"(1,8,8,1)","t" +"(1,7,9,0)","-t" +"(1,8,9,0)","1" +"(1,9,9,1)","-t" +"(1,10,10,1)","t/q" +"(1,10,11,0)","1" +"(1,11,11,1)","-(t/q)" +"(1,10,12,0)","-(t/q)" +"(1,12,12,1)","-(t/q)" +"(1,11,13,0)","t/q" +"(1,12,13,0)","1" +"(1,13,13,1)","t/q" +"(1,14,14,1)","-(t/q^2)" +"(1,14,15,0)","1" +"(1,15,15,1)","t/q^2" +"(2,0,0,2)","q^2/t" +"(2,1,1,2)","q^2/t" +"(2,0,2,0)","1-q^2/t" +"(2,2,2,2)","-(q^2/t)" +"(2,1,3,0)","-(q^2/t)" +"(2,3,3,2)","-(q^2/t)" +"(2,1,4,0)","1" +"(2,4,4,2)","-(q^2/t)" +"(2,5,5,2)","-(q^2/t)" +"(2,3,6,0)","1" +"(2,4,6,0)","q^2/t" +"(2,6,6,2)","q^2/t" +"(2,5,7,0)","q^2/t" +"(2,7,7,2)","q^2/t" +"(2,5,8,0)","1" +"(2,8,8,2)","q^2/t" +"(2,9,9,2)","q^2/t" +"(2,7,10,0)","1" +"(2,8,10,0)","-(q^2/t)" +"(2,10,10,2)","-(q^2/t)" +"(2,9,11,0)","-(q^2/t)" +"(2,11,11,2)","-(q^2/t)" +"(2,9,12,0)","1" +"(2,12,12,2)","-(q^2/t)" +"(2,13,13,2)","-(q^2/t)" +"(2,11,14,0)","1" +"(2,12,14,0)","q^2/t" +"(2,14,14,2)","q^2/t" +"(2,13,15,0)","q^2/t" +"(2,15,15,2)","q^2/t" +"(3,0,0,3)","q^4" +"(3,0,1,2)","-q^4+q^2/t" +"(3,1,1,3)","-q^4" +"(3,0,2,1)","-q^3+q*t" +"(3,2,2,3)","-q^3" +"(3,0,3,0)","1-q^2/t" +"(3,1,3,1)","q^3" +"(3,2,3,2)","-(q^2/t)" +"(3,3,3,3)","q^3" +"(3,0,4,0)","q^3-q*t" +"(3,1,4,1)","-(q*t)" +"(3,2,4,2)","q^3" +"(3,4,4,3)","q^3" +"(3,1,5,0)","1-q^3" +"(3,3,5,2)","-q^3" +"(3,4,5,2)","-(q^2/t)" +"(3,5,5,3)","-q^3" +"(3,3,6,1)","-t" +"(3,4,6,1)","-q^2" +"(3,6,6,3)","-q^2" +"(3,3,7,0)","1" +"(3,4,7,0)","q^2/t" +"(3,5,7,1)","q^2" +"(3,6,7,2)","q^2/t" +"(3,7,7,3)","q^2" +"(3,3,8,0)","t" +"(3,4,8,0)","q^2" +"(3,5,8,1)","t" +"(3,6,8,2)","q^2" +"(3,8,8,3)","q^2" +"(3,5,9,0)","1-q^2" +"(3,7,9,2)","-q^2" +"(3,8,9,2)","q^2/t" +"(3,9,9,3)","-q^2" +"(3,7,10,1)","t/q" +"(3,8,10,1)","-q" +"(3,10,10,3)","-q" +"(3,7,11,0)","1" +"(3,8,11,0)","-(q^2/t)" +"(3,9,11,1)","q" +"(3,10,11,2)","-(q^2/t)" +"(3,11,11,3)","q" +"(3,7,12,0)","-(t/q)" +"(3,8,12,0)","q" +"(3,9,12,1)","-(t/q)" +"(3,10,12,2)","q" +"(3,12,12,3)","q" +"(3,9,13,0)","1-q" +"(3,11,13,2)","-q" +"(3,12,13,2)","-(q^2/t)" +"(3,13,13,3)","-q" +"(3,11,14,1)","-(t/q^2)" +"(3,12,14,1)","-1" +"(3,14,14,3)","-1" +"(3,11,15,0)","1" +"(3,12,15,0)","q^2/t" +"(3,13,15,1)","1" +"(3,14,15,2)","q^2/t" +"(3,15,15,3)","1" +"(4,0,0,4)","q^4" +"(4,0,1,2)","-q^4+q^2/t" +"(4,1,1,4)","-q^4" +"(4,0,2,1)","-q^4+q^2*t" +"(4,2,2,4)","-q^3" +"(4,0,3,0)","q^4-q^2/t" +"(4,1,3,1)","q^4" +"(4,2,3,2)","-(q^2/t)" +"(4,3,3,4)","q^3" +"(4,0,4,0)","1-q^2*t" +"(4,1,4,1)","-(q^2*t)" +"(4,2,4,2)","q^3" +"(4,4,4,4)","q^3" +"(4,3,5,2)","-q^3" +"(4,4,5,2)","-(q^2/t)" +"(4,5,5,4)","-q^3" +"(4,2,6,0)","1-q^3" +"(4,3,6,1)","-(q*t)" +"(4,4,6,1)","-q^3" +"(4,6,6,4)","-q^2" +"(4,3,7,0)","q^3" +"(4,4,7,0)","q^2/t" +"(4,5,7,1)","q^3" +"(4,6,7,2)","q^2/t" +"(4,7,7,4)","q^2" +"(4,3,8,0)","q*t" +"(4,4,8,0)","1" +"(4,5,8,1)","q*t" +"(4,6,8,2)","q^2" +"(4,8,8,4)","q^2" +"(4,7,9,2)","-q^2" +"(4,8,9,2)","q^2/t" +"(4,9,9,4)","-q^2" +"(4,6,10,0)","1-q^2" +"(4,7,10,1)","t" +"(4,8,10,1)","-q^2" +"(4,10,10,4)","-q" +"(4,7,11,0)","q^2" +"(4,8,11,0)","-(q^2/t)" +"(4,9,11,1)","q^2" +"(4,10,11,2)","-(q^2/t)" +"(4,11,11,4)","q" +"(4,7,12,0)","-t" +"(4,8,12,0)","1" +"(4,9,12,1)","-t" +"(4,10,12,2)","q" +"(4,12,12,4)","q" +"(4,11,13,2)","-q" +"(4,12,13,2)","-(q^2/t)" +"(4,13,13,4)","-q" +"(4,10,14,0)","1-q" +"(4,11,14,1)","-(t/q)" +"(4,12,14,1)","-q" +"(4,14,14,4)","-1" +"(4,11,15,0)","q" +"(4,12,15,0)","q^2/t" +"(4,13,15,1)","q" +"(4,14,15,2)","q^2/t" +"(4,15,15,4)","1" +"(5,0,0,5)","q^6*t" +"(5,0,1,3)","-q^4+q^6*t" +"(5,0,1,4)","q^4-q^6*t" +"(5,1,1,5)","q^6*t" +"(5,2,2,5)","-(q^4*t)" +"(5,0,3,1)","q^3-q^4+q^2*t-q^5*t" +"(5,2,3,3)","q^3" +"(5,2,3,4)","-q^3" +"(5,3,3,5)","-(q^4*t)" +"(5,0,4,1)","-(q*t)+q^5*t" +"(5,2,4,3)","-(q^4*t)" +"(5,2,4,4)","q^4*t" +"(5,4,4,5)","-(q^4*t)" +"(5,0,5,0)","1-q^3-q^2*t+q^5*t" +"(5,1,5,1)","-(q^2*t)+q^5*t" +"(5,3,5,3)","-(q^4*t)" +"(5,4,5,3)","-q^3" +"(5,3,5,4)","q^4*t" +"(5,4,5,4)","q^3" +"(5,5,5,5)","-(q^4*t)" +"(5,2,6,1)","-t+q^3*t" +"(5,6,6,5)","q^2*t" +"(5,2,7,0)","1-q^3" +"(5,3,7,1)","-(q*t)+q^3*t" +"(5,4,7,1)","q^2-q^3" +"(5,6,7,3)","q^2" +"(5,6,7,4)","-q^2" +"(5,7,7,5)","q^2*t" +"(5,2,8,0)","t-q^3*t" +"(5,4,8,1)","t-q^3*t" +"(5,6,8,3)","q^2*t" +"(5,6,8,4)","-(q^2*t)" +"(5,8,8,5)","q^2*t" +"(5,3,9,0)","q*t-q^3*t" +"(5,4,9,0)","1-q^2" +"(5,5,9,1)","q*t-q^3*t" +"(5,7,9,3)","q^2*t" +"(5,8,9,3)","-q^2" +"(5,7,9,4)","-(q^2*t)" +"(5,8,9,4)","q^2" +"(5,9,9,5)","q^2*t" +"(5,6,10,1)","t/q-q*t" +"(5,10,10,5)","-t" +"(5,6,11,0)","1-q^2" +"(5,7,11,1)","t-q*t" +"(5,8,11,1)","q-q^2" +"(5,10,11,3)","q" +"(5,10,11,4)","-q" +"(5,11,11,5)","-t" +"(5,6,12,0)","-(t/q)+q*t" +"(5,8,12,1)","-(t/q)+q*t" +"(5,10,12,3)","-t" +"(5,10,12,4)","t" +"(5,12,12,5)","-t" +"(5,7,13,0)","-t+q*t" +"(5,8,13,0)","1-q" +"(5,9,13,1)","-t+q*t" +"(5,11,13,3)","-t" +"(5,12,13,3)","-q" +"(5,11,13,4)","t" +"(5,12,13,4)","q" +"(5,13,13,5)","-t" +"(5,10,14,1)","-(t/q^2)+t/q" +"(5,14,14,5)","t/q^2" +"(5,10,15,0)","1-q" +"(5,12,15,1)","1-q" +"(5,14,15,3)","1" +"(5,14,15,4)","-1" +"(5,15,15,5)","t/q^2" +"(6,0,0,6)","q^6/t" +"(6,1,1,6)","-(q^6/t)" +"(6,0,2,3)","q^4-q^6/t" +"(6,0,2,4)","-q^3+q^5/t" +"(6,2,2,6)","q^5/t" +"(6,0,3,2)","-(q^2/t)+q^6/t" +"(6,1,3,3)","q^6/t" +"(6,1,3,4)","-(q^5/t)" +"(6,3,3,6)","-(q^5/t)" +"(6,0,4,2)","q^3-q^4+q^2/t-q^5/t" +"(6,1,4,3)","-q^4" +"(6,1,4,4)","q^3" +"(6,4,4,6)","-(q^5/t)" +"(6,1,5,2)","-(q^2/t)+q^5/t" +"(6,5,5,6)","q^5/t" +"(6,0,6,0)","1-q^3-q^2/t+q^5/t" +"(6,2,6,2)","-(q^2/t)+q^5/t" +"(6,3,6,3)","q^3" +"(6,4,6,3)","q^5/t" +"(6,3,6,4)","-q^2" +"(6,4,6,4)","-(q^4/t)" +"(6,6,6,6)","-(q^4/t)" +"(6,1,7,0)","q^2/t-q^5/t" +"(6,3,7,2)","q^2/t-q^5/t" +"(6,5,7,3)","-(q^5/t)" +"(6,5,7,4)","q^4/t" +"(6,7,7,6)","q^4/t" +"(6,1,8,0)","1-q^3" +"(6,3,8,2)","q^2-q^3" +"(6,4,8,2)","-(q^2/t)+q^4/t" +"(6,5,8,3)","-q^3" +"(6,5,8,4)","q^2" +"(6,8,8,6)","q^4/t" +"(6,5,9,2)","q^2/t-q^4/t" +"(6,9,9,6)","-(q^4/t)" +"(6,3,10,0)","1-q^2" +"(6,4,10,0)","q^2/t-q^4/t" +"(6,6,10,2)","q^2/t-q^4/t" +"(6,7,10,3)","q^2" +"(6,8,10,3)","-(q^4/t)" +"(6,7,10,4)","-q" +"(6,8,10,4)","q^3/t" +"(6,10,10,6)","q^3/t" +"(6,5,11,0)","-(q^2/t)+q^4/t" +"(6,7,11,2)","-(q^2/t)+q^4/t" +"(6,9,11,3)","q^4/t" +"(6,9,11,4)","-(q^3/t)" +"(6,11,11,6)","-(q^3/t)" +"(6,5,12,0)","1-q^2" +"(6,7,12,2)","q-q^2" +"(6,8,12,2)","q^2/t-q^3/t" +"(6,9,12,3)","-q^2" +"(6,9,12,4)","q" +"(6,12,12,6)","-(q^3/t)" +"(6,9,13,2)","-(q^2/t)+q^3/t" +"(6,13,13,6)","q^3/t" +"(6,7,14,0)","1-q" +"(6,8,14,0)","-(q^2/t)+q^3/t" +"(6,10,14,2)","-(q^2/t)+q^3/t" +"(6,11,14,3)","q" +"(6,12,14,3)","q^3/t" +"(6,11,14,4)","-1" +"(6,12,14,4)","-(q^2/t)" +"(6,14,14,6)","-(q^2/t)" +"(6,9,15,0)","q^2/t-q^3/t" +"(6,11,15,2)","q^2/t-q^3/t" +"(6,13,15,3)","-(q^3/t)" +"(6,13,15,4)","q^2/t" +"(6,15,15,6)","q^2/t" +"(7,0,0,7)","q^8" +"(7,0,1,6)","-q^8+q^6/t" +"(7,1,1,7)","q^8" +"(7,0,2,5)","q^6-q^4*t" +"(7,2,2,7)","q^6" +"(7,0,3,3)","q^3+q^4-q^7-q^6/t" +"(7,0,3,4)","-q^3+q^5/t" +"(7,1,3,5)","q^6" +"(7,2,3,6)","q^5/t" +"(7,3,3,7)","q^6" +"(7,0,4,3)","-q^3+q^6+q^7-q^4*t" +"(7,0,4,4)","-q^6+q^4*t" +"(7,1,4,5)","-(q^4*t)" +"(7,2,4,6)","-q^6" +"(7,4,4,7)","q^6" +"(7,0,5,2)","-q^4+q^7+q^2/t-q^5/t" +"(7,1,5,3)","-q^3-q^4+q^6+q^7" +"(7,1,5,4)","q^3-q^6" +"(7,3,5,6)","-q^6" +"(7,4,5,6)","-(q^5/t)" +"(7,5,5,7)","q^6" +"(7,0,6,1)","q^2-q^5-t+q^3*t" +"(7,2,6,3)","q^2-q^5" +"(7,3,6,5)","q^2*t" +"(7,4,6,5)","q^4" +"(7,6,6,7)","q^4" +"(7,0,7,0)","1-q^3-q^2/t+q^5/t" +"(7,1,7,1)","q^2-q^5" +"(7,2,7,2)","-(q^2/t)+q^5/t" +"(7,3,7,3)","q^2+q^3-q^5" +"(7,4,7,3)","q^5/t" +"(7,3,7,4)","-q^2" +"(7,4,7,4)","-(q^4/t)" +"(7,5,7,5)","q^4" +"(7,6,7,6)","-(q^4/t)" +"(7,7,7,7)","q^4" +"(7,0,8,0)","-q^2+q^5+t-q^3*t" +"(7,1,8,1)","t-q^3*t" +"(7,2,8,2)","-q^2+q^5" +"(7,3,8,3)","q^2*t" +"(7,4,8,3)","-q^2+q^4+q^5" +"(7,3,8,4)","-(q^2*t)" +"(7,4,8,4)","-q^4" +"(7,5,8,5)","q^2*t" +"(7,6,8,6)","-q^4" +"(7,8,8,7)","q^4" +"(7,1,9,0)","1-q^2-q^3+q^5" +"(7,3,9,2)","-q^3+q^5" +"(7,4,9,2)","-(q^2/t)+q^4/t" +"(7,5,9,3)","-q^2-q^3+q^4+q^5" +"(7,5,9,4)","q^2-q^4" +"(7,7,9,6)","-q^4" +"(7,8,9,6)","q^4/t" +"(7,9,9,7)","q^4" +"(7,3,10,1)","t/q-q*t" +"(7,4,10,1)","q-q^3" +"(7,6,10,3)","q-q^3" +"(7,7,10,5)","-t" +"(7,8,10,5)","q^2" +"(7,10,10,7)","q^2" +"(7,3,11,0)","1-q^2" +"(7,4,11,0)","q^2/t-q^4/t" +"(7,5,11,1)","q-q^3" +"(7,6,11,2)","q^2/t-q^4/t" +"(7,7,11,3)","q+q^2-q^3" +"(7,8,11,3)","-(q^4/t)" +"(7,7,11,4)","-q" +"(7,8,11,4)","q^3/t" +"(7,9,11,5)","q^2" +"(7,10,11,6)","q^3/t" +"(7,11,11,7)","q^2" +"(7,3,12,0)","-(t/q)+q*t" +"(7,4,12,0)","-q+q^3" +"(7,5,12,1)","-(t/q)+q*t" +"(7,6,12,2)","-q+q^3" +"(7,7,12,3)","-t" +"(7,8,12,3)","-q+q^2+q^3" +"(7,7,12,4)","t" +"(7,8,12,4)","-q^2" +"(7,9,12,5)","-t" +"(7,10,12,6)","-q^2" +"(7,12,12,7)","q^2" +"(7,5,13,0)","1-q-q^2+q^3" +"(7,7,13,2)","-q^2+q^3" +"(7,8,13,2)","q^2/t-q^3/t" +"(7,9,13,3)","-q+q^3" +"(7,9,13,4)","q-q^2" +"(7,11,13,6)","-q^2" +"(7,12,13,6)","-(q^3/t)" +"(7,13,13,7)","q^2" +"(7,7,14,1)","-(t/q^2)+t/q" +"(7,8,14,1)","1-q" +"(7,10,14,3)","1-q" +"(7,11,14,5)","t/q^2" +"(7,12,14,5)","1" +"(7,14,14,7)","1" +"(7,7,15,0)","1-q" +"(7,8,15,0)","-(q^2/t)+q^3/t" +"(7,9,15,1)","1-q" +"(7,10,15,2)","-(q^2/t)+q^3/t" +"(7,11,15,3)","1" +"(7,12,15,3)","q^3/t" +"(7,11,15,4)","-1" +"(7,12,15,4)","-(q^2/t)" +"(7,13,15,5)","1" +"(7,14,15,6)","-(q^2/t)" +"(7,15,15,7)","1" +"(8,0,0,8)","q^8" +"(8,0,1,6)","q^8-q^6/t" +"(8,1,1,8)","q^8" +"(8,0,2,5)","-q^8+q^6*t" +"(8,2,2,8)","q^6" +"(8,0,3,3)","-q^8+q^6/t" +"(8,0,3,4)","-q^4+q^7+q^8-q^5/t" +"(8,1,3,5)","-q^8" +"(8,2,3,6)","-(q^5/t)" +"(8,3,3,8)","q^6" +"(8,0,4,3)","-q^4+q^6*t" +"(8,0,4,4)","q^3+q^4-q^7-q^6*t" +"(8,1,4,5)","q^6*t" +"(8,2,4,6)","q^6" +"(8,4,4,8)","q^6" +"(8,0,5,2)","q^4-q^7-q^2/t+q^5/t" +"(8,1,5,4)","q^4-q^7" +"(8,3,5,6)","q^6" +"(8,4,5,6)","q^5/t" +"(8,5,5,8)","q^6" +"(8,0,6,1)","-q^4+q^7+q^2*t-q^5*t" +"(8,2,6,3)","q^3-q^6" +"(8,2,6,4)","-q^2-q^3+q^5+q^6" +"(8,3,6,5)","-(q^4*t)" +"(8,4,6,5)","-q^6" +"(8,6,6,8)","q^4" +"(8,0,7,0)","-q^4+q^7+q^2/t-q^5/t" +"(8,1,7,1)","-q^4+q^7" +"(8,2,7,2)","q^2/t-q^5/t" +"(8,3,7,3)","-q^6" +"(8,4,7,3)","-(q^5/t)" +"(8,3,7,4)","-q^3+q^5+q^6" +"(8,4,7,4)","q^4/t" +"(8,5,7,5)","-q^6" +"(8,6,7,6)","q^4/t" +"(8,7,7,8)","q^4" +"(8,0,8,0)","1-q^3-q^2*t+q^5*t" +"(8,1,8,1)","-(q^2*t)+q^5*t" +"(8,2,8,2)","q^2-q^5" +"(8,3,8,3)","-(q^4*t)" +"(8,4,8,3)","-q^3" +"(8,3,8,4)","q^4*t" +"(8,4,8,4)","q^2+q^3-q^5" +"(8,5,8,5)","-(q^4*t)" +"(8,6,8,6)","q^4" +"(8,8,8,8)","q^4" +"(8,3,9,2)","q^3-q^5" +"(8,4,9,2)","q^2/t-q^4/t" +"(8,5,9,4)","q^3-q^5" +"(8,7,9,6)","q^4" +"(8,8,9,6)","-(q^4/t)" +"(8,9,9,8)","q^4" +"(8,2,10,0)","1-q^2-q^3+q^5" +"(8,3,10,1)","-(q*t)+q^3*t" +"(8,4,10,1)","-q^3+q^5" +"(8,6,10,3)","q^2-q^4" +"(8,6,10,4)","-q-q^2+q^3+q^4" +"(8,7,10,5)","q^2*t" +"(8,8,10,5)","-q^4" +"(8,10,10,8)","q^2" +"(8,3,11,0)","-q^3+q^5" +"(8,4,11,0)","-(q^2/t)+q^4/t" +"(8,5,11,1)","-q^3+q^5" +"(8,6,11,2)","-(q^2/t)+q^4/t" +"(8,7,11,3)","-q^4" +"(8,8,11,3)","q^4/t" +"(8,7,11,4)","-q^2+q^3+q^4" +"(8,8,11,4)","-(q^3/t)" +"(8,9,11,5)","-q^4" +"(8,10,11,6)","-(q^3/t)" +"(8,11,11,8)","q^2" +"(8,3,12,0)","q*t-q^3*t" +"(8,4,12,0)","1-q^2" +"(8,5,12,1)","q*t-q^3*t" +"(8,6,12,2)","q-q^3" +"(8,7,12,3)","q^2*t" +"(8,8,12,3)","-q^2" +"(8,7,12,4)","-(q^2*t)" +"(8,8,12,4)","q+q^2-q^3" +"(8,9,12,5)","q^2*t" +"(8,10,12,6)","q^2" +"(8,12,12,8)","q^2" +"(8,7,13,2)","q^2-q^3" +"(8,8,13,2)","-(q^2/t)+q^3/t" +"(8,9,13,4)","q^2-q^3" +"(8,11,13,6)","q^2" +"(8,12,13,6)","q^3/t" +"(8,13,13,8)","q^2" +"(8,6,14,0)","1-q-q^2+q^3" +"(8,7,14,1)","t-q*t" +"(8,8,14,1)","-q^2+q^3" +"(8,10,14,3)","q-q^2" +"(8,10,14,4)","-1+q^2" +"(8,11,14,5)","-t" +"(8,12,14,5)","-q^2" +"(8,14,14,8)","1" +"(8,7,15,0)","-q^2+q^3" +"(8,8,15,0)","q^2/t-q^3/t" +"(8,9,15,1)","-q^2+q^3" +"(8,10,15,2)","q^2/t-q^3/t" +"(8,11,15,3)","-q^2" +"(8,12,15,3)","-(q^3/t)" +"(8,11,15,4)","q^2" +"(8,12,15,4)","q^2/t" +"(8,13,15,5)","-q^2" +"(8,14,15,6)","q^2/t" +"(8,15,15,8)","1" +"(9,0,0,9)","q^10*t" +"(9,0,1,7)","q^8-q^10*t" +"(9,0,1,8)","q^8-q^10*t" +"(9,1,1,9)","-(q^10*t)" +"(9,2,2,9)","q^7*t" +"(9,0,3,5)","q^6-q^8+q^5*t+q^6*t-q^8*t-q^9*t" +"(9,2,3,7)","q^6" +"(9,2,3,8)","q^6" +"(9,3,3,9)","-(q^7*t)" +"(9,0,4,5)","-(q^4*t)-q^5*t+q^8*t+q^9*t" +"(9,2,4,7)","-(q^7*t)" +"(9,2,4,8)","-(q^7*t)" +"(9,4,4,9)","-(q^7*t)" +"(9,0,5,3)","-q^3-q^4+q^6+q^7+q^5*t+q^6*t-q^8*t-q^9*t" +"(9,0,5,4)","q^3+q^4-q^6-q^7-q^5*t-q^6*t+q^8*t+q^9*t" +"(9,1,5,5)","q^5*t+q^6*t-q^8*t-q^9*t" +"(9,3,5,7)","q^7*t" +"(9,4,5,7)","q^6" +"(9,3,5,8)","q^7*t" +"(9,4,5,8)","q^6" +"(9,5,5,9)","q^7*t" +"(9,2,6,5)","q^2*t+q^3*t-q^5*t-q^6*t" +"(9,6,6,9)","-(q^4*t)" +"(9,0,7,1)","q^2-q^4-q^5+q^7+q^2*t-q^4*t-q^5*t+q^7*t" +"(9,2,7,3)","q^2+q^3-q^5-q^6" +"(9,2,7,4)","-q^2-q^3+q^5+q^6" +"(9,3,7,5)","-(q^3*t)-q^4*t+q^5*t+q^6*t" +"(9,4,7,5)","q^4-q^6" +"(9,6,7,7)","q^4" +"(9,6,7,8)","q^4" +"(9,7,7,9)","q^4*t" +"(9,0,8,1)","t-q^3*t-q^4*t+q^7*t" +"(9,2,8,3)","q^2*t+q^3*t-q^5*t-q^6*t" +"(9,2,8,4)","-(q^2*t)-q^3*t+q^5*t+q^6*t" +"(9,4,8,5)","q^2*t+q^3*t-q^5*t-q^6*t" +"(9,6,8,7)","q^4*t" +"(9,6,8,8)","q^4*t" +"(9,8,8,9)","q^4*t" +"(9,0,9,0)","1-q^2-q^3+q^5-q^2*t+q^4*t+q^5*t-q^7*t" +"(9,1,9,1)","-(q^2*t)+q^4*t+q^5*t-q^7*t" +"(9,3,9,3)","-(q^3*t)-q^4*t+q^5*t+q^6*t" +"(9,4,9,3)","-q^2-q^3+q^4+q^5" +"(9,3,9,4)","q^3*t+q^4*t-q^5*t-q^6*t" +"(9,4,9,4)","q^2+q^3-q^4-q^5" +"(9,5,9,5)","-(q^3*t)-q^4*t+q^5*t+q^6*t" +"(9,7,9,7)","-(q^4*t)" +"(9,8,9,7)","q^4" +"(9,7,9,8)","-(q^4*t)" +"(9,8,9,8)","q^4" +"(9,9,9,9)","-(q^4*t)" +"(9,2,10,1)","t/q-q*t-q^2*t+q^4*t" +"(9,6,10,5)","-t-q*t+q^2*t+q^3*t" +"(9,10,10,9)","q*t" +"(9,2,11,0)","1-q^2-q^3+q^5" +"(9,3,11,1)","-(q*t)+q^2*t+q^3*t-q^4*t" +"(9,4,11,1)","q-2*q^3+q^5" +"(9,6,11,3)","q+q^2-q^3-q^4" +"(9,6,11,4)","-q-q^2+q^3+q^4" +"(9,7,11,5)","q*t-q^3*t" +"(9,8,11,5)","q^2-q^4" +"(9,10,11,7)","q^2" +"(9,10,11,8)","q^2" +"(9,11,11,9)","-(q*t)" +"(9,2,12,0)","-(t/q)+q*t+q^2*t-q^4*t" +"(9,4,12,1)","-(t/q)+q*t+q^2*t-q^4*t" +"(9,6,12,3)","-t-q*t+q^2*t+q^3*t" +"(9,6,12,4)","t+q*t-q^2*t-q^3*t" +"(9,8,12,5)","-t-q*t+q^2*t+q^3*t" +"(9,10,12,7)","-(q*t)" +"(9,10,12,8)","-(q*t)" +"(9,12,12,9)","-(q*t)" +"(9,3,13,0)","q*t-q^2*t-q^3*t+q^4*t" +"(9,4,13,0)","1-q-q^2+q^3" +"(9,5,13,1)","q*t-q^2*t-q^3*t+q^4*t" +"(9,7,13,3)","q*t-q^3*t" +"(9,8,13,3)","-q+q^3" +"(9,7,13,4)","-(q*t)+q^3*t" +"(9,8,13,4)","q-q^3" +"(9,9,13,5)","q*t-q^3*t" +"(9,11,13,7)","q*t" +"(9,12,13,7)","q^2" +"(9,11,13,8)","q*t" +"(9,12,13,8)","q^2" +"(9,13,13,9)","q*t" +"(9,6,14,1)","t-t/q^2+t/q-q*t" +"(9,10,14,5)","-t+t/q^2" +"(9,14,14,9)","-(t/q^2)" +"(9,6,15,0)","1-q-q^2+q^3" +"(9,8,15,1)","1-q-q^2+q^3" +"(9,10,15,3)","1-q^2" +"(9,10,15,4)","-1+q^2" +"(9,12,15,5)","1-q^2" +"(9,14,15,7)","1" +"(9,14,15,8)","1" +"(9,15,15,9)","t/q^2" +"(10,0,0,10)","q^10/t" +"(10,1,1,10)","q^10/t" +"(10,0,2,7)","q^8-q^10/t" +"(10,0,2,8)","q^6-q^8/t" +"(10,2,2,10)","-(q^8/t)" +"(10,0,3,6)","-(q^5/t)-q^6/t+q^9/t+q^10/t" +"(10,1,3,7)","-(q^10/t)" +"(10,1,3,8)","-(q^8/t)" +"(10,3,3,10)","-(q^8/t)" +"(10,0,4,6)","q^6-q^8+q^5/t+q^6/t-q^8/t-q^9/t" +"(10,1,4,7)","q^8" +"(10,1,4,8)","q^6" +"(10,4,4,10)","-(q^8/t)" +"(10,1,5,6)","q^5/t+q^6/t-q^8/t-q^9/t" +"(10,5,5,10)","-(q^8/t)" +"(10,0,6,3)","q^3+q^4-q^6-q^7-q^5/t-q^6/t+q^8/t+q^9/t" +"(10,0,6,4)","-q^2-q^3+q^5+q^6+q^4/t+q^5/t-q^7/t-q^8/t" +"(10,2,6,6)","q^4/t+q^5/t-q^7/t-q^8/t" +"(10,3,6,7)","q^6" +"(10,4,6,7)","q^8/t" +"(10,3,6,8)","q^4" +"(10,4,6,8)","q^6/t" +"(10,6,6,10)","q^6/t" +"(10,0,7,2)","q^2/t-q^5/t-q^6/t+q^9/t" +"(10,1,7,3)","-(q^5/t)-q^6/t+q^8/t+q^9/t" +"(10,1,7,4)","q^4/t+q^5/t-q^7/t-q^8/t" +"(10,3,7,6)","q^4/t+q^5/t-q^7/t-q^8/t" +"(10,5,7,7)","q^8/t" +"(10,5,7,8)","q^6/t" +"(10,7,7,10)","q^6/t" +"(10,0,8,2)","q^2-q^4-q^5+q^7+q^2/t-q^4/t-q^5/t+q^7/t" +"(10,1,8,3)","-q^3-q^4+q^6+q^7" +"(10,1,8,4)","q^2+q^3-q^5-q^6" +"(10,3,8,6)","q^4-q^6" +"(10,4,8,6)","-(q^4/t)-q^5/t+q^6/t+q^7/t" +"(10,5,8,7)","q^6" +"(10,5,8,8)","q^4" +"(10,8,8,10)","q^6/t" +"(10,1,9,2)","q^2/t-q^4/t-q^5/t+q^7/t" +"(10,5,9,6)","-(q^4/t)-q^5/t+q^6/t+q^7/t" +"(10,9,9,10)","q^6/t" +"(10,0,10,0)","1-q^2-q^3+q^5-q^2/t+q^4/t+q^5/t-q^7/t" +"(10,2,10,2)","-(q^2/t)+q^4/t+q^5/t-q^7/t" +"(10,3,10,3)","q^2+q^3-q^4-q^5" +"(10,4,10,3)","q^4/t+q^5/t-q^6/t-q^7/t" +"(10,3,10,4)","-q-q^2+q^3+q^4" +"(10,4,10,4)","-(q^3/t)-q^4/t+q^5/t+q^6/t" +"(10,6,10,6)","-(q^3/t)-q^4/t+q^5/t+q^6/t" +"(10,7,10,7)","q^4" +"(10,8,10,7)","-(q^6/t)" +"(10,7,10,8)","q^2" +"(10,8,10,8)","-(q^4/t)" +"(10,10,10,10)","-(q^4/t)" +"(10,1,11,0)","-(q^2/t)+q^4/t+q^5/t-q^7/t" +"(10,3,11,2)","-(q^2/t)+q^4/t+q^5/t-q^7/t" +"(10,5,11,3)","q^4/t+q^5/t-q^6/t-q^7/t" +"(10,5,11,4)","-(q^3/t)-q^4/t+q^5/t+q^6/t" +"(10,7,11,6)","-(q^3/t)-q^4/t+q^5/t+q^6/t" +"(10,9,11,7)","-(q^6/t)" +"(10,9,11,8)","-(q^4/t)" +"(10,11,11,10)","-(q^4/t)" +"(10,1,12,0)","1-q^2-q^3+q^5" +"(10,3,12,2)","q-2*q^3+q^5" +"(10,4,12,2)","-(q^2/t)+q^3/t+q^4/t-q^5/t" +"(10,5,12,3)","-q^2-q^3+q^4+q^5" +"(10,5,12,4)","q+q^2-q^3-q^4" +"(10,7,12,6)","q^2-q^4" +"(10,8,12,6)","q^3/t-q^5/t" +"(10,9,12,7)","q^4" +"(10,9,12,8)","q^2" +"(10,12,12,10)","-(q^4/t)" +"(10,5,13,2)","-(q^2/t)+q^3/t+q^4/t-q^5/t" +"(10,9,13,6)","q^3/t-q^5/t" +"(10,13,13,10)","-(q^4/t)" +"(10,3,14,0)","1-q-q^2+q^3" +"(10,4,14,0)","q^2/t-q^3/t-q^4/t+q^5/t" +"(10,6,14,2)","q^2/t-q^3/t-q^4/t+q^5/t" +"(10,7,14,3)","q-q^3" +"(10,8,14,3)","-(q^3/t)+q^5/t" +"(10,7,14,4)","-1+q^2" +"(10,8,14,4)","q^2/t-q^4/t" +"(10,10,14,6)","q^2/t-q^4/t" +"(10,11,14,7)","q^2" +"(10,12,14,7)","q^4/t" +"(10,11,14,8)","1" +"(10,12,14,8)","q^2/t" +"(10,14,14,10)","q^2/t" +"(10,5,15,0)","q^2/t-q^3/t-q^4/t+q^5/t" +"(10,7,15,2)","q^2/t-q^3/t-q^4/t+q^5/t" +"(10,9,15,3)","-(q^3/t)+q^5/t" +"(10,9,15,4)","q^2/t-q^4/t" +"(10,11,15,6)","q^2/t-q^4/t" +"(10,13,15,7)","q^4/t" +"(10,13,15,8)","q^2/t" +"(10,15,15,10)","q^2/t" +"(11,0,0,11)","q^12" +"(11,0,1,10)","-q^12+q^10/t" +"(11,1,1,11)","-q^12" +"(11,0,2,9)","-q^9+q^7*t" +"(11,2,2,11)","-q^9" +"(11,0,3,7)","q^6+q^7+q^8-q^10-q^11-q^10/t" +"(11,0,3,8)","q^6-q^8/t" +"(11,1,3,9)","q^9" +"(11,2,3,10)","-(q^8/t)" +"(11,3,3,11)","q^9" +"(11,0,4,7)","-q^6-q^7+q^9+q^10+q^11-q^7*t" +"(11,0,4,8)","q^9-q^7*t" +"(11,1,4,9)","-(q^7*t)" +"(11,2,4,10)","q^9" +"(11,4,4,11)","q^9" +"(11,0,5,6)","-q^7-q^8+q^10+q^11+q^5/t+q^6/t-q^8/t-q^9/t" +"(11,1,5,7)","q^6+q^7+q^8-q^9-q^10-q^11" +"(11,1,5,8)","q^6-q^9" +"(11,3,5,10)","-q^9" +"(11,4,5,10)","-(q^8/t)" +"(11,5,5,11)","-q^9" +"(11,0,6,5)","-q^4-q^5+q^7+q^8+q^2*t+q^3*t-q^5*t-q^6*t" +"(11,2,6,7)","-q^4-q^5+q^7+q^8" +"(11,3,6,9)","-(q^4*t)" +"(11,4,6,9)","-q^6" +"(11,6,6,11)","-q^6" +"(11,0,7,3)","q^2+q^3+q^4-q^5-2*q^6-q^7+q^9-q^5/t-q^6/t+q^8/t+q^9/t" +"(11,0,7,4)","-q^2-q^3+q^5+q^6+q^4/t+q^5/t-q^7/t-q^8/t" +"(11,1,7,5)","q^4+q^5-q^7-q^8" +"(11,2,7,6)","q^4/t+q^5/t-q^7/t-q^8/t" +"(11,3,7,7)","q^4+q^5+q^6-q^7-q^8" +"(11,4,7,7)","q^8/t" +"(11,3,7,8)","q^4" +"(11,4,7,8)","q^6/t" +"(11,5,7,9)","q^6" +"(11,6,7,10)","q^6/t" +"(11,7,7,11)","q^6" +"(11,0,8,3)","q^2-q^4-2*q^5-q^6+q^7+q^8+q^9+q^2*t+q^3*t-q^5*t-q^6*t" +"(11,0,8,4)","q^4+q^5-q^7-q^8-q^2*t-q^3*t+q^5*t+q^6*t" +"(11,1,8,5)","q^2*t+q^3*t-q^5*t-q^6*t" +"(11,2,8,6)","q^4+q^5-q^7-q^8" +"(11,3,8,7)","q^4*t" +"(11,4,8,7)","-q^4-q^5+q^6+q^7+q^8" +"(11,3,8,8)","q^4*t" +"(11,4,8,8)","q^6" +"(11,5,8,9)","q^4*t" +"(11,6,8,10)","q^6" +"(11,8,8,11)","q^6" +"(11,0,9,2)","-q^4+q^6+q^7-q^9+q^2/t-q^4/t-q^5/t+q^7/t" +"(11,1,9,3)","-q^2-q^3+2*q^5+2*q^6-q^8-q^9" +"(11,1,9,4)","q^2+q^3-q^4-2*q^5-q^6+q^7+q^8" +"(11,3,9,6)","-q^5-q^6+q^7+q^8" +"(11,4,9,6)","-(q^4/t)-q^5/t+q^6/t+q^7/t" +"(11,5,9,7)","q^4+q^5-q^7-q^8" +"(11,5,9,8)","q^4-q^6" +"(11,7,9,10)","-q^6" +"(11,8,9,10)","q^6/t" +"(11,9,9,11)","-q^6" +"(11,0,10,1)","-q+q^3+q^4-q^6+t/q-q*t-q^2*t+q^4*t" +"(11,2,10,3)","-q+q^3+q^4-q^6" +"(11,3,10,5)","-t-q*t+q^2*t+q^3*t" +"(11,4,10,5)","-q^2-q^3+q^4+q^5" +"(11,6,10,7)","-q^2-q^3+q^4+q^5" +"(11,7,10,9)","q*t" +"(11,8,10,9)","-q^3" +"(11,10,10,11)","-q^3" +"(11,0,11,0)","1-q^2-q^3+q^5-q^2/t+q^4/t+q^5/t-q^7/t" +"(11,1,11,1)","q-q^3-q^4+q^6" +"(11,2,11,2)","-(q^2/t)+q^4/t+q^5/t-q^7/t" +"(11,3,11,3)","q+q^2-2*q^4-q^5+q^6" +"(11,4,11,3)","q^4/t+q^5/t-q^6/t-q^7/t" +"(11,3,11,4)","-q-q^2+q^3+q^4" +"(11,4,11,4)","-(q^3/t)-q^4/t+q^5/t+q^6/t" +"(11,5,11,5)","q^2+q^3-q^4-q^5" +"(11,6,11,6)","-(q^3/t)-q^4/t+q^5/t+q^6/t" +"(11,7,11,7)","q^2+q^3-q^5" +"(11,8,11,7)","-(q^6/t)" +"(11,7,11,8)","q^2" +"(11,8,11,8)","-(q^4/t)" +"(11,9,11,9)","q^3" +"(11,10,11,10)","-(q^4/t)" +"(11,11,11,11)","q^3" +"(11,0,12,0)","q-q^3-q^4+q^6-t/q+q*t+q^2*t-q^4*t" +"(11,1,12,1)","-(t/q)+q*t+q^2*t-q^4*t" +"(11,2,12,2)","q-q^3-q^4+q^6" +"(11,3,12,3)","-t-q*t+q^2*t+q^3*t" +"(11,4,12,3)","q-q^2-2*q^3+q^5+q^6" +"(11,3,12,4)","t+q*t-q^2*t-q^3*t" +"(11,4,12,4)","q^2+q^3-q^4-q^5" +"(11,5,12,5)","-t-q*t+q^2*t+q^3*t" +"(11,6,12,6)","q^2+q^3-q^4-q^5" +"(11,7,12,7)","-(q*t)" +"(11,8,12,7)","-q^2+q^4+q^5" +"(11,7,12,8)","-(q*t)" +"(11,8,12,8)","q^3" +"(11,9,12,9)","-(q*t)" +"(11,10,12,10)","q^3" +"(11,12,12,11)","q^3" +"(11,1,13,0)","1-q-q^2+q^4+q^5-q^6" +"(11,3,13,2)","-q^3+q^4+q^5-q^6" +"(11,4,13,2)","-(q^2/t)+q^3/t+q^4/t-q^5/t" +"(11,5,13,3)","-q+q^3+q^4-q^6" +"(11,5,13,4)","q-2*q^3+q^5" +"(11,7,13,6)","-q^3+q^5" +"(11,8,13,6)","q^3/t-q^5/t" +"(11,9,13,7)","q^2-q^5" +"(11,9,13,8)","q^2-q^3" +"(11,11,13,10)","-q^3" +"(11,12,13,10)","-(q^4/t)" +"(11,13,13,11)","-q^3" +"(11,3,14,1)","t-t/q^2+t/q-q*t" +"(11,4,14,1)","-1+q+q^2-q^3" +"(11,6,14,3)","-1+q+q^2-q^3" +"(11,7,14,5)","-t+t/q^2" +"(11,8,14,5)","-1+q^2" +"(11,10,14,7)","-1+q^2" +"(11,11,14,9)","-(t/q^2)" +"(11,12,14,9)","-1" +"(11,14,14,11)","-1" +"(11,3,15,0)","1-q-q^2+q^3" +"(11,4,15,0)","q^2/t-q^3/t-q^4/t+q^5/t" +"(11,5,15,1)","1-q-q^2+q^3" +"(11,6,15,2)","q^2/t-q^3/t-q^4/t+q^5/t" +"(11,7,15,3)","1-q^2" +"(11,8,15,3)","-(q^3/t)+q^5/t" +"(11,7,15,4)","-1+q^2" +"(11,8,15,4)","q^2/t-q^4/t" +"(11,9,15,5)","1-q^2" +"(11,10,15,6)","q^2/t-q^4/t" +"(11,11,15,7)","1" +"(11,12,15,7)","q^4/t" +"(11,11,15,8)","1" +"(11,12,15,8)","q^2/t" +"(11,13,15,9)","1" +"(11,14,15,10)","q^2/t" +"(11,15,15,11)","1" +"(12,0,0,12)","q^12" +"(12,0,1,10)","-q^12+q^10/t" +"(12,1,1,12)","-q^12" +"(12,0,2,9)","-q^12+q^10*t" +"(12,2,2,12)","-q^9" +"(12,0,3,7)","q^12-q^10/t" +"(12,0,3,8)","-q^7-q^8+q^10+q^11+q^12-q^8/t" +"(12,1,3,9)","q^12" +"(12,2,3,10)","-(q^8/t)" +"(12,3,3,12)","q^9" +"(12,0,4,7)","q^8-q^10*t" +"(12,0,4,8)","q^6+q^7+q^8-q^10-q^11-q^10*t" +"(12,1,4,9)","-(q^10*t)" +"(12,2,4,10)","q^9" +"(12,4,4,12)","q^9" +"(12,0,5,6)","-q^7-q^8+q^10+q^11+q^5/t+q^6/t-q^8/t-q^9/t" +"(12,1,5,8)","-q^7-q^8+q^10+q^11" +"(12,3,5,10)","-q^9" +"(12,4,5,10)","-(q^8/t)" +"(12,5,5,12)","-q^9" +"(12,0,6,5)","-q^7-q^8+q^10+q^11+q^5*t+q^6*t-q^8*t-q^9*t" +"(12,2,6,7)","q^6-q^9" +"(12,2,6,8)","q^4+q^5+q^6-q^7-q^8-q^9" +"(12,3,6,9)","-(q^7*t)" +"(12,4,6,9)","-q^9" +"(12,6,6,12)","-q^6" +"(12,0,7,3)","q^7+q^8-q^10-q^11-q^5/t-q^6/t+q^8/t+q^9/t" +"(12,0,7,4)","q^4-q^6-2*q^7-q^8+q^9+q^10+q^11+q^4/t+q^5/t-q^7/t-q^8/t" +"(12,1,7,5)","q^7+q^8-q^10-q^11" +"(12,2,7,6)","q^4/t+q^5/t-q^7/t-q^8/t" +"(12,3,7,7)","q^9" +"(12,4,7,7)","q^8/t" +"(12,3,7,8)","-q^5-q^6+q^7+q^8+q^9" +"(12,4,7,8)","q^6/t" +"(12,5,7,9)","q^9" +"(12,6,7,10)","q^6/t" +"(12,7,7,12)","q^6" +"(12,0,8,3)","-q^3-q^4+q^6+q^7+q^5*t+q^6*t-q^8*t-q^9*t" +"(12,0,8,4)","q^2+q^3+q^4-q^5-2*q^6-q^7+q^9-q^5*t-q^6*t+q^8*t+q^9*t" +"(12,1,8,5)","q^5*t+q^6*t-q^8*t-q^9*t" +"(12,2,8,6)","q^4+q^5-q^7-q^8" +"(12,3,8,7)","q^7*t" +"(12,4,8,7)","q^6" +"(12,3,8,8)","q^7*t" +"(12,4,8,8)","q^4+q^5+q^6-q^7-q^8" +"(12,5,8,9)","q^7*t" +"(12,6,8,10)","q^6" +"(12,8,8,12)","q^6" +"(12,0,9,2)","-q^4+q^6+q^7-q^9+q^2/t-q^4/t-q^5/t+q^7/t" +"(12,1,9,4)","-q^4+q^6+q^7-q^9" +"(12,3,9,6)","-q^5-q^6+q^7+q^8" +"(12,4,9,6)","-(q^4/t)-q^5/t+q^6/t+q^7/t" +"(12,5,9,8)","-q^5-q^6+q^7+q^8" +"(12,7,9,10)","-q^6" +"(12,8,9,10)","q^6/t" +"(12,9,9,12)","-q^6" +"(12,0,10,1)","-q^4+q^6+q^7-q^9+q^2*t-q^4*t-q^5*t+q^7*t" +"(12,2,10,3)","q^2+q^3-q^4-2*q^5-q^6+q^7+q^8" +"(12,2,10,4)","-q-q^2+2*q^4+2*q^5-q^7-q^8" +"(12,3,10,5)","-(q^3*t)-q^4*t+q^5*t+q^6*t" +"(12,4,10,5)","-q^5-q^6+q^7+q^8" +"(12,6,10,7)","q^4-q^6" +"(12,6,10,8)","q^2+q^3-q^5-q^6" +"(12,7,10,9)","q^4*t" +"(12,8,10,9)","-q^6" +"(12,10,10,12)","-q^3" +"(12,0,11,0)","q^4-q^6-q^7+q^9-q^2/t+q^4/t+q^5/t-q^7/t" +"(12,1,11,1)","q^4-q^6-q^7+q^9" +"(12,2,11,2)","-(q^2/t)+q^4/t+q^5/t-q^7/t" +"(12,3,11,3)","q^5+q^6-q^7-q^8" +"(12,4,11,3)","q^4/t+q^5/t-q^6/t-q^7/t" +"(12,3,11,4)","q^3-q^4-2*q^5+q^7+q^8" +"(12,4,11,4)","-(q^3/t)-q^4/t+q^5/t+q^6/t" +"(12,5,11,5)","q^5+q^6-q^7-q^8" +"(12,6,11,6)","-(q^3/t)-q^4/t+q^5/t+q^6/t" +"(12,7,11,7)","q^6" +"(12,8,11,7)","-(q^6/t)" +"(12,7,11,8)","-q^3+q^5+q^6" +"(12,8,11,8)","-(q^4/t)" +"(12,9,11,9)","q^6" +"(12,10,11,10)","-(q^4/t)" +"(12,11,11,12)","q^3" +"(12,0,12,0)","1-q^2-q^3+q^5-q^2*t+q^4*t+q^5*t-q^7*t" +"(12,1,12,1)","-(q^2*t)+q^4*t+q^5*t-q^7*t" +"(12,2,12,2)","q-q^3-q^4+q^6" +"(12,3,12,3)","-(q^3*t)-q^4*t+q^5*t+q^6*t" +"(12,4,12,3)","-q^2-q^3+q^4+q^5" +"(12,3,12,4)","q^3*t+q^4*t-q^5*t-q^6*t" +"(12,4,12,4)","q+q^2-2*q^4-q^5+q^6" +"(12,5,12,5)","-(q^3*t)-q^4*t+q^5*t+q^6*t" +"(12,6,12,6)","q^2+q^3-q^4-q^5" +"(12,7,12,7)","-(q^4*t)" +"(12,8,12,7)","q^4" +"(12,7,12,8)","-(q^4*t)" +"(12,8,12,8)","q^2+q^3-q^5" +"(12,9,12,9)","-(q^4*t)" +"(12,10,12,10)","q^3" +"(12,12,12,12)","q^3" +"(12,3,13,2)","-q^3+q^4+q^5-q^6" +"(12,4,13,2)","-(q^2/t)+q^3/t+q^4/t-q^5/t" +"(12,5,13,4)","-q^3+q^4+q^5-q^6" +"(12,7,13,6)","-q^3+q^5" +"(12,8,13,6)","q^3/t-q^5/t" +"(12,9,13,8)","-q^3+q^5" +"(12,11,13,10)","-q^3" +"(12,12,13,10)","-(q^4/t)" +"(12,13,13,12)","-q^3" +"(12,2,14,0)","1-q-q^2+q^4+q^5-q^6" +"(12,3,14,1)","-(q*t)+q^2*t+q^3*t-q^4*t" +"(12,4,14,1)","-q^3+q^4+q^5-q^6" +"(12,6,14,3)","q-2*q^3+q^5" +"(12,6,14,4)","-1+q^2+q^3-q^5" +"(12,7,14,5)","q*t-q^3*t" +"(12,8,14,5)","-q^3+q^5" +"(12,10,14,7)","q^2-q^3" +"(12,10,14,8)","1-q^3" +"(12,11,14,9)","-(q*t)" +"(12,12,14,9)","-q^3" +"(12,14,14,12)","-1" +"(12,3,15,0)","q^3-q^4-q^5+q^6" +"(12,4,15,0)","q^2/t-q^3/t-q^4/t+q^5/t" +"(12,5,15,1)","q^3-q^4-q^5+q^6" +"(12,6,15,2)","q^2/t-q^3/t-q^4/t+q^5/t" +"(12,7,15,3)","q^3-q^5" +"(12,8,15,3)","-(q^3/t)+q^5/t" +"(12,7,15,4)","-q^3+q^5" +"(12,8,15,4)","q^2/t-q^4/t" +"(12,9,15,5)","q^3-q^5" +"(12,10,15,6)","q^2/t-q^4/t" +"(12,11,15,7)","q^3" +"(12,12,15,7)","q^4/t" +"(12,11,15,8)","q^3" +"(12,12,15,8)","q^2/t" +"(12,13,15,9)","q^3" +"(12,14,15,10)","q^2/t" +"(12,15,15,12)","1" +"(13,0,0,13)","q^14*t" +"(13,0,1,11)","-q^12+q^14*t" +"(13,0,1,12)","q^12-q^14*t" +"(13,1,1,13)","q^14*t" +"(13,2,2,13)","-(q^10*t)" +"(13,0,3,9)","q^9-q^12+q^8*t+q^9*t+q^10*t-q^11*t-q^12*t-q^13*t" +"(13,2,3,11)","q^9" +"(13,2,3,12)","-q^9" +"(13,3,3,13)","-(q^10*t)" +"(13,0,4,9)","-(q^7*t)-q^8*t-q^9*t+q^11*t+q^12*t+q^13*t" +"(13,2,4,11)","-(q^10*t)" +"(13,2,4,12)","q^10*t" +"(13,4,4,13)","-(q^10*t)" +"(13,0,5,7)","q^6+q^7+q^8-q^9-q^10-q^11-q^8*t-q^9*t-q^10*t+q^11*t+q^12*t+q^13*t" +"(13,0,5,8)","q^6+q^7+q^8-q^9-q^10-q^11-q^8*t-q^9*t-q^10*t+q^11*t+q^12*t+q^13*t" +"(13,1,5,9)","-(q^8*t)-q^9*t-q^10*t+q^11*t+q^12*t+q^13*t" +"(13,3,5,11)","-(q^10*t)" +"(13,4,5,11)","-q^9" +"(13,3,5,12)","q^10*t" +"(13,4,5,12)","q^9" +"(13,5,5,13)","-(q^10*t)" +"(13,2,6,9)","-(q^4*t)-q^5*t-q^6*t+q^7*t+q^8*t+q^9*t" +"(13,6,6,13)","q^6*t" +"(13,0,7,5)","q^4+q^5-2*q^7-2*q^8+q^10+q^11+q^4*t+q^5*t-2*q^7*t-2*q^8*t+q^10*t+q^11*t" +"(13,2,7,7)","q^4+q^5+q^6-q^7-q^8-q^9" +"(13,2,7,8)","q^4+q^5+q^6-q^7-q^8-q^9" +"(13,3,7,9)","-(q^5*t)-q^6*t+q^8*t+q^9*t" +"(13,4,7,9)","q^6-q^9" +"(13,6,7,11)","q^6" +"(13,6,7,12)","-q^6" +"(13,7,7,13)","q^6*t" +"(13,0,8,5)","q^2*t+q^3*t+q^4*t-q^5*t-2*q^6*t-2*q^7*t-q^8*t+q^9*t+q^10*t+q^11*t" +"(13,2,8,7)","q^4*t+q^5*t+q^6*t-q^7*t-q^8*t-q^9*t" +"(13,2,8,8)","q^4*t+q^5*t+q^6*t-q^7*t-q^8*t-q^9*t" +"(13,4,8,9)","q^4*t+q^5*t+q^6*t-q^7*t-q^8*t-q^9*t" +"(13,6,8,11)","q^6*t" +"(13,6,8,12)","-(q^6*t)" +"(13,8,8,13)","q^6*t" +"(13,0,9,3)","-q^2-q^3+2*q^5+2*q^6-q^8-q^9+q^4*t+q^5*t-2*q^7*t-2*q^8*t+q^10*t+q^11*t" +"(13,0,9,4)","q^2+q^3-2*q^5-2*q^6+q^8+q^9-q^4*t-q^5*t+2*q^7*t+2*q^8*t-q^10*t-q^11*t" +"(13,1,9,5)","q^4*t+q^5*t-2*q^7*t-2*q^8*t+q^10*t+q^11*t" +"(13,3,9,7)","q^5*t+q^6*t-q^8*t-q^9*t" +"(13,4,9,7)","q^4+q^5-q^7-q^8" +"(13,3,9,8)","q^5*t+q^6*t-q^8*t-q^9*t" +"(13,4,9,8)","q^4+q^5-q^7-q^8" +"(13,5,9,9)","q^5*t+q^6*t-q^8*t-q^9*t" +"(13,7,9,11)","q^6*t" +"(13,8,9,11)","-q^6" +"(13,7,9,12)","-(q^6*t)" +"(13,8,9,12)","q^6" +"(13,9,9,13)","q^6*t" +"(13,2,10,5)","-t-q*t+2*q^3*t+2*q^4*t-q^6*t-q^7*t" +"(13,6,10,9)","q*t+q^2*t-q^4*t-q^5*t" +"(13,10,10,13)","-(q^2*t)" +"(13,0,11,1)","q-q^3-2*q^4+2*q^6+q^7-q^9+q^2*t-q^3*t-q^4*t+q^6*t+q^7*t-q^8*t" +"(13,2,11,3)","q+q^2-2*q^4-2*q^5+q^7+q^8" +"(13,2,11,4)","-q-q^2+2*q^4+2*q^5-q^7-q^8" +"(13,3,11,5)","-(q^2*t)+q^4*t+q^5*t-q^7*t" +"(13,4,11,5)","q^2+q^3-q^4-2*q^5-q^6+q^7+q^8" +"(13,6,11,7)","q^2+q^3-q^5-q^6" +"(13,6,11,8)","q^2+q^3-q^5-q^6" +"(13,7,11,9)","q^2*t-q^5*t" +"(13,8,11,9)","q^3-q^6" +"(13,10,11,11)","q^3" +"(13,10,11,12)","-q^3" +"(13,11,11,13)","-(q^2*t)" +"(13,0,12,1)","-(t/q)+q*t+q^2*t+q^3*t-q^4*t-q^5*t-q^6*t+q^8*t" +"(13,2,12,3)","-t-q*t+2*q^3*t+2*q^4*t-q^6*t-q^7*t" +"(13,2,12,4)","t+q*t-2*q^3*t-2*q^4*t+q^6*t+q^7*t" +"(13,4,12,5)","-t-q*t+2*q^3*t+2*q^4*t-q^6*t-q^7*t" +"(13,6,12,7)","-(q*t)-q^2*t+q^4*t+q^5*t" +"(13,6,12,8)","-(q*t)-q^2*t+q^4*t+q^5*t" +"(13,8,12,9)","-(q*t)-q^2*t+q^4*t+q^5*t" +"(13,10,12,11)","-(q^2*t)" +"(13,10,12,12)","q^2*t" +"(13,12,12,13)","-(q^2*t)" +"(13,0,13,0)","1-q-q^2+q^4+q^5-q^6-q^2*t+q^3*t+q^4*t-q^6*t-q^7*t+q^8*t" +"(13,1,13,1)","-(q^2*t)+q^3*t+q^4*t-q^6*t-q^7*t+q^8*t" +"(13,3,13,3)","-(q^2*t)+q^4*t+q^5*t-q^7*t" +"(13,4,13,3)","-q+q^3+q^4-q^6" +"(13,3,13,4)","q^2*t-q^4*t-q^5*t+q^7*t" +"(13,4,13,4)","q-q^3-q^4+q^6" +"(13,5,13,5)","-(q^2*t)+q^4*t+q^5*t-q^7*t" +"(13,7,13,7)","-(q^2*t)+q^5*t" +"(13,8,13,7)","q^2-q^5" +"(13,7,13,8)","-(q^2*t)+q^5*t" +"(13,8,13,8)","q^2-q^5" +"(13,9,13,9)","-(q^2*t)+q^5*t" +"(13,11,13,11)","-(q^2*t)" +"(13,12,13,11)","-q^3" +"(13,11,13,12)","q^2*t" +"(13,12,13,12)","q^3" +"(13,13,13,13)","-(q^2*t)" +"(13,2,14,1)","t-t/q^2+t/q-q^2*t-q^3*t+q^4*t" +"(13,6,14,5)","-t+t/q^2-q*t+q^3*t" +"(13,10,14,9)","-(t/q^2)+q*t" +"(13,14,14,13)","t/q^2" +"(13,2,15,0)","1-q-q^2+q^4+q^5-q^6" +"(13,4,15,1)","1-q-q^2+q^4+q^5-q^6" +"(13,6,15,3)","1-q^2-q^3+q^5" +"(13,6,15,4)","-1+q^2+q^3-q^5" +"(13,8,15,5)","1-q^2-q^3+q^5" +"(13,10,15,7)","1-q^3" +"(13,10,15,8)","1-q^3" +"(13,12,15,9)","1-q^3" +"(13,14,15,11)","1" +"(13,14,15,12)","-1" +"(13,15,15,13)","t/q^2" +"(14,0,0,14)","q^14/t" +"(14,1,1,14)","-(q^14/t)" +"(14,0,2,11)","q^12-q^14/t" +"(14,0,2,12)","-q^9+q^11/t" +"(14,2,2,14)","q^11/t" +"(14,0,3,10)","-(q^8/t)-q^9/t-q^10/t+q^12/t+q^13/t+q^14/t" +"(14,1,3,11)","q^14/t" +"(14,1,3,12)","-(q^11/t)" +"(14,3,3,14)","-(q^11/t)" +"(14,0,4,10)","q^9-q^12+q^8/t+q^9/t+q^10/t-q^11/t-q^12/t-q^13/t" +"(14,1,4,11)","-q^12" +"(14,1,4,12)","q^9" +"(14,4,4,14)","-(q^11/t)" +"(14,1,5,10)","-(q^8/t)-q^9/t-q^10/t+q^11/t+q^12/t+q^13/t" +"(14,5,5,14)","q^11/t" +"(14,0,6,7)","q^6+q^7+q^8-q^9-q^10-q^11-q^8/t-q^9/t-q^10/t+q^11/t+q^12/t+q^13/t" +"(14,0,6,8)","q^4+q^5+q^6-q^7-q^8-q^9-q^6/t-q^7/t-q^8/t+q^9/t+q^10/t+q^11/t" +"(14,2,6,10)","-(q^6/t)-q^7/t-q^8/t+q^9/t+q^10/t+q^11/t" +"(14,3,6,11)","q^9" +"(14,4,6,11)","q^11/t" +"(14,3,6,12)","-q^6" +"(14,4,6,12)","-(q^8/t)" +"(14,6,6,14)","-(q^8/t)" +"(14,0,7,6)","q^4/t+q^5/t+q^6/t-q^7/t-(2*q^8)/t-(2*q^9)/t-q^10/t+q^11/t+q^12/t+q^13/t" +"(14,1,7,7)","q^8/t+q^9/t+q^10/t-q^11/t-q^12/t-q^13/t" +"(14,1,7,8)","q^6/t+q^7/t+q^8/t-q^9/t-q^10/t-q^11/t" +"(14,3,7,10)","q^6/t+q^7/t+q^8/t-q^9/t-q^10/t-q^11/t" +"(14,5,7,11)","-(q^11/t)" +"(14,5,7,12)","q^8/t" +"(14,7,7,14)","q^8/t" +"(14,0,8,6)","q^4+q^5-2*q^7-2*q^8+q^10+q^11+q^4/t+q^5/t-(2*q^7)/t-(2*q^8)/t+q^10/t+q^11/t" +"(14,1,8,7)","q^6+q^7+q^8-q^9-q^10-q^11" +"(14,1,8,8)","q^4+q^5+q^6-q^7-q^8-q^9" +"(14,3,8,10)","q^6-q^9" +"(14,4,8,10)","-(q^6/t)-q^7/t+q^9/t+q^10/t" +"(14,5,8,11)","-q^9" +"(14,5,8,12)","q^6" +"(14,8,8,14)","q^8/t" +"(14,1,9,6)","-(q^4/t)-q^5/t+(2*q^7)/t+(2*q^8)/t-q^10/t-q^11/t" +"(14,5,9,10)","q^6/t+q^7/t-q^9/t-q^10/t" +"(14,9,9,14)","-(q^8/t)" +"(14,0,10,3)","q^2+q^3-2*q^5-2*q^6+q^8+q^9-q^4/t-q^5/t+(2*q^7)/t+(2*q^8)/t-q^10/t-q^11/t" +"(14,0,10,4)","-q-q^2+2*q^4+2*q^5-q^7-q^8+q^3/t+q^4/t-(2*q^6)/t-(2*q^7)/t+q^9/t+q^10/t" +"(14,2,10,6)","q^3/t+q^4/t-(2*q^6)/t-(2*q^7)/t+q^9/t+q^10/t" +"(14,3,10,7)","q^4+q^5-q^7-q^8" +"(14,4,10,7)","q^6/t+q^7/t-q^9/t-q^10/t" +"(14,3,10,8)","q^2+q^3-q^5-q^6" +"(14,4,10,8)","q^4/t+q^5/t-q^7/t-q^8/t" +"(14,6,10,10)","q^4/t+q^5/t-q^7/t-q^8/t" +"(14,7,10,11)","q^6" +"(14,8,10,11)","-(q^8/t)" +"(14,7,10,12)","-q^3" +"(14,8,10,12)","q^5/t" +"(14,10,10,14)","q^5/t" +"(14,0,11,2)","-(q^2/t)+q^4/t+q^5/t+q^6/t-q^7/t-q^8/t-q^9/t+q^11/t" +"(14,1,11,3)","q^4/t+q^5/t-(2*q^7)/t-(2*q^8)/t+q^10/t+q^11/t" +"(14,1,11,4)","-(q^3/t)-q^4/t+(2*q^6)/t+(2*q^7)/t-q^9/t-q^10/t" +"(14,3,11,6)","-(q^3/t)-q^4/t+(2*q^6)/t+(2*q^7)/t-q^9/t-q^10/t" +"(14,5,11,7)","-(q^6/t)-q^7/t+q^9/t+q^10/t" +"(14,5,11,8)","-(q^4/t)-q^5/t+q^7/t+q^8/t" +"(14,7,11,10)","-(q^4/t)-q^5/t+q^7/t+q^8/t" +"(14,9,11,11)","q^8/t" +"(14,9,11,12)","-(q^5/t)" +"(14,11,11,14)","-(q^5/t)" +"(14,0,12,2)","q-q^3-2*q^4+2*q^6+q^7-q^9+q^2/t-q^3/t-q^4/t+q^6/t+q^7/t-q^8/t" +"(14,1,12,3)","-q^2-q^3+2*q^5+2*q^6-q^8-q^9" +"(14,1,12,4)","q+q^2-2*q^4-2*q^5+q^7+q^8" +"(14,3,12,6)","q^2+q^3-q^4-2*q^5-q^6+q^7+q^8" +"(14,4,12,6)","-(q^3/t)+q^5/t+q^6/t-q^8/t" +"(14,5,12,7)","q^4+q^5-q^7-q^8" +"(14,5,12,8)","q^2+q^3-q^5-q^6" +"(14,7,12,10)","q^3-q^6" +"(14,8,12,10)","q^4/t-q^7/t" +"(14,9,12,11)","-q^6" +"(14,9,12,12)","q^3" +"(14,12,12,14)","-(q^5/t)" +"(14,1,13,2)","-(q^2/t)+q^3/t+q^4/t-q^6/t-q^7/t+q^8/t" +"(14,5,13,6)","q^3/t-q^5/t-q^6/t+q^8/t" +"(14,9,13,10)","-(q^4/t)+q^7/t" +"(14,13,13,14)","q^5/t" +"(14,0,14,0)","1-q-q^2+q^4+q^5-q^6-q^2/t+q^3/t+q^4/t-q^6/t-q^7/t+q^8/t" +"(14,2,14,2)","-(q^2/t)+q^3/t+q^4/t-q^6/t-q^7/t+q^8/t" +"(14,3,14,3)","q-q^3-q^4+q^6" +"(14,4,14,3)","q^3/t-q^5/t-q^6/t+q^8/t" +"(14,3,14,4)","-1+q^2+q^3-q^5" +"(14,4,14,4)","-(q^2/t)+q^4/t+q^5/t-q^7/t" +"(14,6,14,6)","-(q^2/t)+q^4/t+q^5/t-q^7/t" +"(14,7,14,7)","q^2-q^5" +"(14,8,14,7)","-(q^4/t)+q^7/t" +"(14,7,14,8)","1-q^3" +"(14,8,14,8)","-(q^2/t)+q^5/t" +"(14,10,14,10)","-(q^2/t)+q^5/t" +"(14,11,14,11)","q^3" +"(14,12,14,11)","q^5/t" +"(14,11,14,12)","-1" +"(14,12,14,12)","-(q^2/t)" +"(14,14,14,14)","-(q^2/t)" +"(14,1,15,0)","q^2/t-q^3/t-q^4/t+q^6/t+q^7/t-q^8/t" +"(14,3,15,2)","q^2/t-q^3/t-q^4/t+q^6/t+q^7/t-q^8/t" +"(14,5,15,3)","-(q^3/t)+q^5/t+q^6/t-q^8/t" +"(14,5,15,4)","q^2/t-q^4/t-q^5/t+q^7/t" +"(14,7,15,6)","q^2/t-q^4/t-q^5/t+q^7/t" +"(14,9,15,7)","q^4/t-q^7/t" +"(14,9,15,8)","q^2/t-q^5/t" +"(14,11,15,10)","q^2/t-q^5/t" +"(14,13,15,11)","-(q^5/t)" +"(14,13,15,12)","q^2/t" +"(14,15,15,14)","q^2/t" +"(15,0,0,15)","q^16" +"(15,0,1,14)","-q^12-q^16+q^14/t+q^14*t" +"(15,1,1,15)","q^16" +"(15,0,2,13)","q^12-q^10*t-q^14*t+q^12*t^2" +"(15,2,2,15)","q^12" +"(15,0,3,11)","q^9+q^10+q^11+2*q^12-q^13-q^14-q^15-q^14/t-q^14*t" +"(15,0,3,12)","-2*q^9+q^11/t-q^8*t-q^9*t-q^10*t+q^11*t+q^12*t+q^13*t+q^14*t" +"(15,1,3,13)","q^12-q^14*t" +"(15,2,3,14)","-q^9+q^11/t" +"(15,3,3,15)","q^12" +"(15,0,4,11)","-q^9-q^10-q^11+q^12+q^13+q^14+q^15-2*q^10*t+q^12*t^2" +"(15,0,4,12)","-q^12+q^7*t+q^8*t+q^9*t+2*q^10*t-q^11*t-q^12*t-q^13*t-q^12*t^2" +"(15,1,4,13)","-(q^10*t)+q^12*t^2" +"(15,2,4,14)","-q^12+q^10*t" +"(15,4,4,15)","q^12" +"(15,0,5,10)","-q^6-q^7-q^8+q^9-q^12+q^13+q^14+q^15+q^8/t+q^9/t+q^10/t-q^11/t-q^12/t-q^13/t+q^8*t+q^9*t+q^10*t-q^11*t-q^12*t-q^13*t" +"(15,1,5,11)","-q^9-q^10-q^11+q^13+q^14+q^15" +"(15,1,5,12)","q^9-q^12+q^8*t+q^9*t+q^10*t-q^11*t-q^12*t-q^13*t" +"(15,3,5,14)","-q^12+q^10*t" +"(15,4,5,14)","q^9-q^11/t" +"(15,5,5,15)","q^12" +"(15,0,6,9)","q^6+q^7+q^8-q^9-q^10-q^11-q^4*t-q^5*t-q^6*t+q^7*t-q^10*t+q^11*t+q^12*t+q^13*t+q^6*t^2+q^7*t^2+q^8*t^2-q^9*t^2-q^10*t^2-q^11*t^2" +"(15,2,6,11)","q^6+q^7+q^8-q^9-q^10-q^11+q^7*t-q^10*t" +"(15,2,6,12)","-(q^4*t)-q^5*t-q^6*t+q^8*t+q^9*t+q^10*t" +"(15,3,6,13)","q^6*t-q^8*t^2" +"(15,4,6,13)","q^8-q^10*t" +"(15,6,6,15)","q^8" +"(15,0,7,7)","q^4+q^5+3*q^6+q^7-4*q^9-3*q^10-q^11+q^12+q^13-q^8/t-q^9/t-q^10/t+q^11/t+q^12/t+q^13/t-q^8*t-q^9*t-q^10*t+q^11*t+q^12*t+q^13*t" +"(15,0,7,8)","2*q^4+2*q^5+2*q^6-2*q^7-2*q^8-2*q^9-q^6/t-q^7/t-q^8/t+q^9/t+q^10/t+q^11/t+q^4*t+q^5*t-2*q^7*t-3*q^8*t-q^9*t+2*q^11*t+q^12*t+q^13*t" +"(15,1,7,9)","q^6+q^7+q^8-q^9-q^10-q^11-q^8*t-q^9*t-q^10*t+q^11*t+q^12*t+q^13*t" +"(15,2,7,10)","q^4+q^5+q^6-q^7-q^8-q^9-q^6/t-q^7/t-q^8/t+q^9/t+q^10/t+q^11/t" +"(15,3,7,11)","q^6+q^7+q^8-q^10-q^11-q^10*t" +"(15,4,7,11)","-q^9+q^11/t" +"(15,3,7,12)","-q^6-q^5*t-q^6*t+q^8*t+q^9*t+q^10*t" +"(15,4,7,12)","q^6-q^8/t" +"(15,5,7,13)","q^8-q^10*t" +"(15,6,7,14)","q^6-q^8/t" +"(15,7,7,15)","q^8" +"(15,0,8,7)","q^4+q^5-2*q^7-3*q^8-q^9+2*q^11+q^12+q^13+2*q^4*t+2*q^5*t+2*q^6*t-2*q^7*t-2*q^8*t-2*q^9*t-q^6*t^2-q^7*t^2-q^8*t^2+q^9*t^2+q^10*t^2+q^11*t^2" +"(15,0,8,8)","-q^6-q^7-q^8+q^9+q^10+q^11+q^2*t+q^3*t+3*q^4*t+q^5*t-4*q^7*t-3*q^8*t-q^9*t+q^10*t+q^11*t-q^6*t^2-q^7*t^2-q^8*t^2+q^9*t^2+q^10*t^2+q^11*t^2" +"(15,1,8,9)","q^4*t+q^5*t+q^6*t-q^7*t-q^8*t-q^9*t-q^6*t^2-q^7*t^2-q^8*t^2+q^9*t^2+q^10*t^2+q^11*t^2" +"(15,2,8,10)","-q^6-q^7-q^8+q^9+q^10+q^11+q^4*t+q^5*t+q^6*t-q^7*t-q^8*t-q^9*t" +"(15,3,8,11)","q^6*t-q^8*t^2" +"(15,4,8,11)","-q^6-q^7+q^9+q^10+q^11-q^7*t" +"(15,3,8,12)","-(q^6*t)+q^8*t^2" +"(15,4,8,12)","-q^8+q^4*t+q^5*t+q^6*t-q^8*t-q^9*t" +"(15,5,8,13)","q^6*t-q^8*t^2" +"(15,6,8,14)","-q^8+q^6*t" +"(15,8,8,15)","q^8" +"(15,0,9,6)","-q^2-q^3+2*q^5+q^6-q^7-q^8+q^9+2*q^10-q^12-q^13+q^4/t+q^5/t-(2*q^7)/t-(2*q^8)/t+q^10/t+q^11/t+q^4*t+q^5*t-2*q^7*t-2*q^8*t+q^10*t+q^11*t" +"(15,1,9,7)","q^4+q^5+q^6-q^7-2*q^8-2*q^9-q^10+q^11+q^12+q^13" +"(15,1,9,8)","q^4+q^5-2*q^7-2*q^8+q^10+q^11+q^4*t+q^5*t-2*q^7*t-2*q^8*t+q^10*t+q^11*t" +"(15,3,9,10)","-q^7-q^8+q^10+q^11+q^5*t+q^6*t-q^8*t-q^9*t" +"(15,4,9,10)","q^4+q^5-q^7-q^8-q^6/t-q^7/t+q^9/t+q^10/t" +"(15,5,9,11)","-q^6-q^7+q^10+q^11" +"(15,5,9,12)","q^6-q^8+q^5*t+q^6*t-q^8*t-q^9*t" +"(15,7,9,14)","-q^8+q^6*t" +"(15,8,9,14)","-q^6+q^8/t" +"(15,9,9,15)","q^8" +"(15,0,10,5)","q^2+q^3-2*q^5-2*q^6+q^8+q^9-t-q*t+2*q^3*t+q^4*t-q^5*t-q^6*t+q^7*t+2*q^8*t-q^10*t-q^11*t+q^2*t^2+q^3*t^2-2*q^5*t^2-2*q^6*t^2+q^8*t^2+q^9*t^2" +"(15,2,10,7)","q^2+q^3-2*q^5-2*q^6+q^8+q^9+q^2*t+q^3*t-2*q^5*t-2*q^6*t+q^8*t+q^9*t" +"(15,2,10,8)","t+q*t+q^2*t-q^3*t-2*q^4*t-2*q^5*t-q^6*t+q^7*t+q^8*t+q^9*t" +"(15,3,10,9)","q*t+q^2*t-q^4*t-q^5*t-q^3*t^2-q^4*t^2+q^6*t^2+q^7*t^2" +"(15,4,10,9)","q^3+q^4-q^6-q^7-q^5*t-q^6*t+q^8*t+q^9*t" +"(15,6,10,11)","q^3+q^4-q^6-q^7+q^4*t-q^6*t" +"(15,6,10,12)","-(q*t)-q^2*t+q^5*t+q^6*t" +"(15,7,10,13)","-(q^2*t)+q^4*t^2" +"(15,8,10,13)","q^4-q^6*t" +"(15,10,10,15)","q^4" +"(15,0,11,3)","q+2*q^2+q^3-q^4-5*q^5-3*q^6+q^7+3*q^8+2*q^9-q^10-q^4/t-q^5/t+(2*q^7)/t+(2*q^8)/t-q^10/t-q^11/t-q^4*t-q^5*t+2*q^7*t+2*q^8*t-q^10*t-q^11*t" +"(15,0,11,4)","-2*q-2*q^2+4*q^4+4*q^5-2*q^7-2*q^8+q^3/t+q^4/t-(2*q^6)/t-(2*q^7)/t+q^9/t+q^10/t-q^2*t+q^3*t+2*q^4*t+q^5*t-q^6*t-3*q^7*t-q^8*t+q^10*t+q^11*t" +"(15,1,11,5)","q^2+q^3-2*q^5-2*q^6+q^8+q^9-q^4*t-q^5*t+2*q^7*t+2*q^8*t-q^10*t-q^11*t" +"(15,2,11,6)","-q-q^2+2*q^4+2*q^5-q^7-q^8+q^3/t+q^4/t-(2*q^6)/t-(2*q^7)/t+q^9/t+q^10/t" +"(15,3,11,7)","q^2+q^3+q^4-q^5-2*q^6-q^7+q^9-q^5*t-q^6*t+q^8*t+q^9*t" +"(15,4,11,7)","-q^4-q^5+q^7+q^8+q^6/t+q^7/t-q^9/t-q^10/t" +"(15,3,11,8)","q^2+q^3-q^5-q^6+q^2*t-q^4*t-2*q^5*t-q^6*t+q^7*t+q^8*t+q^9*t" +"(15,4,11,8)","-q^2-q^3+q^5+q^6+q^4/t+q^5/t-q^7/t-q^8/t" +"(15,5,11,9)","q^3+q^4-q^6-q^7-q^5*t-q^6*t+q^8*t+q^9*t" +"(15,6,11,10)","-q^2-q^3+q^5+q^6+q^4/t+q^5/t-q^7/t-q^8/t" +"(15,7,11,11)","q^3+q^4-q^7-q^6*t" +"(15,8,11,11)","q^6-q^8/t" +"(15,7,11,12)","-q^3-q^2*t+q^5*t+q^6*t" +"(15,8,11,12)","-q^3+q^5/t" +"(15,9,11,13)","q^4-q^6*t" +"(15,10,11,14)","-q^3+q^5/t" +"(15,11,11,15)","q^4" +"(15,0,12,3)","-q+q^2+2*q^3+q^4-q^5-3*q^6-q^7+q^9+q^10-2*t-2*q*t+4*q^3*t+4*q^4*t-2*q^6*t-2*q^7*t+q^2*t^2+q^3*t^2-2*q^5*t^2-2*q^6*t^2+q^8*t^2+q^9*t^2" +"(15,0,12,4)","-q^2-q^3+2*q^5+2*q^6-q^8-q^9+2*t+t/q+q*t-q^2*t-5*q^3*t-3*q^4*t+q^5*t+3*q^6*t+2*q^7*t-q^8*t-q^2*t^2-q^3*t^2+2*q^5*t^2+2*q^6*t^2-q^8*t^2-q^9*t^2" +"(15,1,12,5)","-t-q*t+2*q^3*t+2*q^4*t-q^6*t-q^7*t+q^2*t^2+q^3*t^2-2*q^5*t^2-2*q^6*t^2+q^8*t^2+q^9*t^2" +"(15,2,12,6)","-q^2-q^3+2*q^5+2*q^6-q^8-q^9+t+q*t-2*q^3*t-2*q^4*t+q^6*t+q^7*t" +"(15,3,12,7)","-(q*t)-q^2*t+q^4*t+q^5*t+q^3*t^2+q^4*t^2-q^6*t^2-q^7*t^2" +"(15,4,12,7)","q^2-q^4-2*q^5-q^6+q^7+q^8+q^9+q^2*t+q^3*t-q^5*t-q^6*t" +"(15,3,12,8)","-(q*t)-q^2*t+q^4*t+q^5*t+q^3*t^2+q^4*t^2-q^6*t^2-q^7*t^2" +"(15,4,12,8)","-q^3-q^4+q^6+q^7+t+q*t+q^2*t-q^3*t-2*q^4*t-q^5*t+q^7*t" +"(15,5,12,9)","-(q*t)-q^2*t+q^4*t+q^5*t+q^3*t^2+q^4*t^2-q^6*t^2-q^7*t^2" +"(15,6,12,10)","-q^3-q^4+q^6+q^7+q*t+q^2*t-q^4*t-q^5*t" +"(15,7,12,11)","-(q^2*t)+q^4*t^2" +"(15,8,12,11)","-q^3+q^6+q^7-q^4*t" +"(15,7,12,12)","q^2*t-q^4*t^2" +"(15,8,12,12)","-q^4+q*t+q^2*t-q^5*t" +"(15,9,12,13)","-(q^2*t)+q^4*t^2" +"(15,10,12,14)","-q^4+q^2*t" +"(15,12,12,15)","q^4" +"(15,0,13,2)","-1+q+q^2-2*q^4+2*q^6-q^8-q^9+q^10+q^2/t-q^3/t-q^4/t+q^6/t+q^7/t-q^8/t+q^2*t-q^3*t-q^4*t+q^6*t+q^7*t-q^8*t" +"(15,1,13,3)","-q+q^3+q^4+q^5-q^6-q^7-q^8+q^10" +"(15,1,13,4)","q-q^3-2*q^4+2*q^6+q^7-q^9+q^2*t-q^3*t-q^4*t+q^6*t+q^7*t-q^8*t" +"(15,3,13,6)","-q^4+q^6+q^7-q^9+q^2*t-q^4*t-q^5*t+q^7*t" +"(15,4,13,6)","q-q^3-q^4+q^6-q^3/t+q^5/t+q^6/t-q^8/t" +"(15,5,13,7)","q^2-q^5-q^6+q^9" +"(15,5,13,8)","q^2-q^4-q^5+q^7+q^2*t-q^4*t-q^5*t+q^7*t" +"(15,7,13,10)","-q^4+q^7+q^2*t-q^5*t" +"(15,8,13,10)","-q^2+q^5+q^4/t-q^7/t" +"(15,9,13,11)","-q^3+q^7" +"(15,9,13,12)","q^3-q^4+q^2*t-q^5*t" +"(15,11,13,14)","-q^4+q^2*t" +"(15,12,13,14)","q^3-q^5/t" +"(15,13,13,15)","q^4" +"(15,0,14,1)","1-q-q^2+q^4+q^5-q^6+t-t/q^2+t/q-2*q^2*t+2*q^4*t-q^6*t-q^7*t+q^8*t+t^2-q*t^2-q^2*t^2+q^4*t^2+q^5*t^2-q^6*t^2" +"(15,2,14,3)","1-q-q^2+q^4+q^5-q^6+t/q-q*t-2*q^2*t+2*q^4*t+q^5*t-q^7*t" +"(15,2,14,4)","t-t/q^2+q*t+q^2*t-q^3*t-q^4*t-q^5*t+q^7*t" +"(15,3,14,5)","-t+t/q^2-q*t+q^3*t-t^2+q^2*t^2+q^3*t^2-q^5*t^2" +"(15,4,14,5)","1-q^2-q^3+q^5-q^2*t+q^4*t+q^5*t-q^7*t" +"(15,6,14,7)","1-q^2-q^3+q^5+t-q^2*t-q^3*t+q^5*t" +"(15,6,14,8)","t/q^2-q*t-q^2*t+q^5*t" +"(15,7,14,9)","-(t/q^2)+q*t+t^2-q^3*t^2" +"(15,8,14,9)","1-q^3-q^2*t+q^5*t" +"(15,10,14,11)","1-q^3+q*t-q^2*t" +"(15,10,14,12)","-(t/q^2)+q^2*t" +"(15,11,14,13)","t/q^2-t^2" +"(15,12,14,13)","1-q^2*t" +"(15,14,14,15)","1" +"(15,0,15,0)","2-2*q-2*q^2+2*q^4+2*q^5-2*q^6-q^2/t+q^3/t+q^4/t-q^6/t-q^7/t+q^8/t-q^2*t+q^3*t+q^4*t-q^6*t-q^7*t+q^8*t" +"(15,1,15,1)","1-q-q^2+q^4+q^5-q^6-q^2*t+q^3*t+q^4*t-q^6*t-q^7*t+q^8*t" +"(15,2,15,2)","1-q-q^2+q^4+q^5-q^6-q^2/t+q^3/t+q^4/t-q^6/t-q^7/t+q^8/t" +"(15,3,15,3)","1-q^2-q^3+q^5-q^2*t+q^4*t+q^5*t-q^7*t" +"(15,4,15,3)","-q+q^3+q^4-q^6+q^3/t-q^5/t-q^6/t+q^8/t" +"(15,3,15,4)","-1+q^2+q^3-q^5+q^2*t-q^4*t-q^5*t+q^7*t" +"(15,4,15,4)","1-q^2-q^3+q^5-q^2/t+q^4/t+q^5/t-q^7/t" +"(15,5,15,5)","1-q^2-q^3+q^5-q^2*t+q^4*t+q^5*t-q^7*t" +"(15,6,15,6)","1-q^2-q^3+q^5-q^2/t+q^4/t+q^5/t-q^7/t" +"(15,7,15,7)","1-q^3-q^2*t+q^5*t" +"(15,8,15,7)","q^2-q^5-q^4/t+q^7/t" +"(15,7,15,8)","1-q^3-q^2*t+q^5*t" +"(15,8,15,8)","1-q^3-q^2/t+q^5/t" +"(15,9,15,9)","1-q^3-q^2*t+q^5*t" +"(15,10,15,10)","1-q^3-q^2/t+q^5/t" +"(15,11,15,11)","1-q^2*t" +"(15,12,15,11)","-q^3+q^5/t" +"(15,11,15,12)","-1+q^2*t" +"(15,12,15,12)","1-q^2/t" +"(15,13,15,13)","1-q^2*t" +"(15,14,15,14)","1-q^2/t" +"(15,15,15,15)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/Rp.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/Rp.csv new file mode 100644 index 0000000..b361ed3 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/Rp.csv @@ -0,0 +1,1378 @@ +"(16,16,16,16)","ZZ" +"(0,0,0,0)","1" +"(0,1,0,1)","1-1/(q^2*t)" +"(0,2,0,2)","1-t/q^2" +"(0,3,0,3)","1-1/(q^2*t)" +"(0,4,0,3)","q^(-3)-1/(q*t)" +"(0,3,0,4)","q^(-4)-t/q^2" +"(0,4,0,4)","1-t/q^2" +"(0,5,0,5)","1-q^(-3)+1/(q^5*t)-1/(q^2*t)" +"(0,6,0,6)","1-q^(-3)+t/q^5-t/q^2" +"(0,7,0,7)","1-q^(-3)+1/(q^5*t)-1/(q^2*t)" +"(0,8,0,7)","q^(-5)-q^(-2)+t^(-1)-1/(q^3*t)" +"(0,7,0,8)","q^(-7)-q^(-4)-t/q^5+t/q^2" +"(0,8,0,8)","1-q^(-3)+t/q^5-t/q^2" +"(0,9,0,9)","1+q^(-5)-q^(-3)-q^(-2)-1/(q^7*t)+1/(q^5*t)+1/(q^4*t)-1/(q^2*t)" +"(0,10,0,10)","1+q^(-5)-q^(-3)-q^(-2)-t/q^7+t/q^5+t/q^4-t/q^2" +"(0,11,0,11)","1+q^(-5)-q^(-3)-q^(-2)-1/(q^7*t)+1/(q^5*t)+1/(q^4*t)-1/(q^2*t)" +"(0,12,0,11)","q^(-6)-q^(-4)-q^(-3)+q^(-1)-1/(q^4*t)+1/(q^2*t)+1/(q*t)-q/t" +"(0,11,0,12)","q^(-9)-q^(-7)-q^(-6)+q^(-4)-t/q^7+t/q^5+t/q^4-t/q^2" +"(0,12,0,12)","1+q^(-5)-q^(-3)-q^(-2)-t/q^7+t/q^5+t/q^4-t/q^2" +"(0,13,0,13)","1-q^(-6)+q^(-5)+q^(-4)-q^(-2)-q^(-1)+1/(q^8*t)-1/(q^7*t)-1/(q^6*t)+1/(q^4*t)+1/(q^3*t)-1/(q^2*t)" +"(0,14,0,14)","1-q^(-6)+q^(-5)+q^(-4)-q^(-2)-q^(-1)+t/q^8-t/q^7-t/q^6+t/q^4+t/q^3-t/q^2" +"(0,15,0,15)","2-2/q^6+2/q^5+2/q^4-2/q^2-2/q+1/(q^8*t)-1/(q^7*t)-1/(q^6*t)+1/(q^4*t)+1/(q^3*t)-1/(q^2*t)+t/q^8-t/q^7-t/q^6+t/q^4+t/q^3-t/q^2" +"(0,1,1,0)","1/(q^2*t)" +"(0,3,1,2)","-q^(-4)+1/(q^2*t)" +"(0,4,1,2)","-q^(-3)+1/(q*t)" +"(0,5,1,3)","1/(q^5*t)-1/(q*t)" +"(0,5,1,4)","-q^(-4)+q^(-3)-1/(q^5*t)+1/(q^2*t)" +"(0,7,1,6)","q^(-7)-q^(-4)-1/(q^5*t)+1/(q^2*t)" +"(0,8,1,6)","-q^(-5)+q^(-2)-t^(-1)+1/(q^3*t)" +"(0,9,1,7)","t^(-1)+1/(q^7*t)-1/(q^4*t)-1/(q^3*t)" +"(0,9,1,8)","q^(-7)-q^(-5)-q^(-4)+q^(-2)+1/(q^7*t)-1/(q^5*t)-1/(q^4*t)+1/(q^2*t)" +"(0,11,1,10)","-q^(-9)+q^(-7)+q^(-6)-q^(-4)+1/(q^7*t)-1/(q^5*t)-1/(q^4*t)+1/(q^2*t)" +"(0,12,1,10)","-q^(-6)+q^(-4)+q^(-3)-q^(-1)+1/(q^4*t)-1/(q^2*t)-1/(q*t)+q/t" +"(0,13,1,11)","1/(q^8*t)-1/(q^6*t)-1/(q^5*t)-1/(q^4*t)+1/(q^3*t)+1/(q^2*t)+1/(q*t)-q/t" +"(0,13,1,12)","-q^(-9)+q^(-7)+2/q^6-2/q^4-q^(-3)+q^(-1)-1/(q^8*t)+1/(q^7*t)+1/(q^6*t)-1/(q^4*t)-1/(q^3*t)+1/(q^2*t)" +"(0,15,1,14)","-1+q^(-10)-q^(-9)-q^(-8)+2/q^6-2/q^4+q^(-2)+q^(-1)-1/(q^8*t)+1/(q^7*t)+1/(q^6*t)-1/(q^4*t)-1/(q^3*t)+1/(q^2*t)-t/q^8+t/q^7+t/q^6-t/q^4-t/q^3+t/q^2" +"(0,2,2,0)","t/q^2" +"(0,3,2,1)","-q^(-4)+t/q^2" +"(0,4,2,1)","-q^(-4)+t/q^2" +"(0,6,2,3)","-q^(-4)+q^(-3)-t/q^5+t/q^2" +"(0,6,2,4)","t/q^6-t/q^2" +"(0,7,2,5)","-q^(-7)+q^(-4)+t/q^5-t/q^2" +"(0,8,2,5)","q^(-7)-q^(-4)-t/q^5+t/q^2" +"(0,10,2,7)","q^(-7)-q^(-5)-q^(-4)+q^(-2)+t/q^7-t/q^5-t/q^4+t/q^2" +"(0,10,2,8)","t/q^9-t/q^6-t/q^5+t/q^2" +"(0,11,2,9)","-q^(-9)+q^(-7)+q^(-6)-q^(-4)+t/q^7-t/q^5-t/q^4+t/q^2" +"(0,12,2,9)","-q^(-9)+q^(-7)+q^(-6)-q^(-4)+t/q^7-t/q^5-t/q^4+t/q^2" +"(0,14,2,11)","-q^(-9)+q^(-7)+2/q^6-2/q^4-q^(-3)+q^(-1)-t/q^8+t/q^7+t/q^6-t/q^4-t/q^3+t/q^2" +"(0,14,2,12)","t/q^11-t/q^9-t/q^8-t/q^7+t/q^6+t/q^5+t/q^4-t/q^2" +"(0,15,2,13)","-q^(-10)+q^(-9)+q^(-8)-q^(-6)-q^(-5)+q^(-4)+t/q^12-t/q^11-t/q^10+(2*t)/q^8-(2*t)/q^6+t/q^4+t/q^3-t/q^2-t^2/q^10+t^2/q^9+t^2/q^8-t^2/q^6-t^2/q^5+t^2/q^4" +"(0,3,3,0)","q^(-4)" +"(0,5,3,1)","q^(-4)-1/(q^6*t)" +"(0,6,3,2)","-q^(-3)+t/q^5" +"(0,7,3,3)","-q^(-7)+q^(-4)+q^(-3)-1/(q^6*t)" +"(0,8,3,3)","-q^(-6)+1/(q^4*t)" +"(0,7,3,4)","q^(-8)+q^(-7)-q^(-4)-t/q^5" +"(0,8,3,4)","-q^(-3)+t/q^5" +"(0,9,3,5)","-q^(-7)-q^(-6)+q^(-4)+q^(-3)+1/(q^9*t)+1/(q^8*t)-1/(q^6*t)-1/(q^5*t)" +"(0,10,3,6)","q^(-6)+q^(-5)-q^(-3)-q^(-2)-t/q^8-t/q^7+t/q^5+t/q^4" +"(0,11,3,7)","q^(-9)-q^(-7)-2/q^6-q^(-5)+q^(-4)+q^(-3)+q^(-2)+1/(q^9*t)+1/(q^8*t)-1/(q^6*t)-1/(q^5*t)" +"(0,12,3,7)","-q^(-8)-q^(-7)+q^(-5)+q^(-4)+1/(q^6*t)+1/(q^5*t)-1/(q^3*t)-1/(q^2*t)" +"(0,11,3,8)","q^(-11)+q^(-10)+q^(-9)-q^(-8)-2/q^7-q^(-6)+q^(-4)-t/q^8-t/q^7+t/q^5+t/q^4" +"(0,12,3,8)","q^(-6)+q^(-5)-q^(-3)-q^(-2)-t/q^8-t/q^7+t/q^5+t/q^4" +"(0,13,3,9)","q^(-9)+q^(-8)-2/q^6-2/q^5+q^(-3)+q^(-2)-1/(q^11*t)-1/(q^10*t)+2/(q^8*t)+2/(q^7*t)-1/(q^5*t)-1/(q^4*t)" +"(0,14,3,10)","-q^(-8)-q^(-7)+2/q^5+2/q^4-q^(-2)-q^(-1)+t/q^10+t/q^9-(2*t)/q^7-(2*t)/q^6+t/q^4+t/q^3" +"(0,15,3,11)","-q^(-10)+2/q^9+3/q^8+q^(-7)-3/q^6-5/q^5-q^(-4)+q^(-3)+2/q^2+q^(-1)-1/(q^11*t)-1/(q^10*t)+2/(q^8*t)+2/(q^7*t)-1/(q^5*t)-1/(q^4*t)-t/q^11-t/q^10+(2*t)/q^8+(2*t)/q^7-t/q^5-t/q^4" +"(0,15,3,12)","q^(-13)+q^(-12)-q^(-10)-3/q^9-q^(-8)+q^(-7)+2/q^6+q^(-5)-q^(-4)-(2*t)/q^10-(2*t)/q^9+(4*t)/q^7+(4*t)/q^6-(2*t)/q^4-(2*t)/q^3+t^2/q^12+t^2/q^11-(2*t^2)/q^9-(2*t^2)/q^8+t^2/q^6+t^2/q^5" +"(0,4,4,0)","q^(-4)" +"(0,5,4,1)","-q^(-4)+1/(q^6*t)" +"(0,6,4,2)","q^(-4)-t/q^6" +"(0,7,4,3)","-q^(-4)+1/(q^6*t)" +"(0,8,4,3)","q^(-7)+q^(-6)-q^(-3)-1/(q^4*t)" +"(0,7,4,4)","-q^(-8)+t/q^6" +"(0,8,4,4)","-q^(-7)+q^(-4)+q^(-3)-t/q^6" +"(0,9,4,5)","q^(-7)+q^(-6)-q^(-4)-q^(-3)-1/(q^9*t)-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(0,10,4,6)","-q^(-7)-q^(-6)+q^(-4)+q^(-3)+t/q^9+t/q^8-t/q^6-t/q^5" +"(0,11,4,7)","q^(-7)+q^(-6)-q^(-4)-q^(-3)-1/(q^9*t)-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(0,12,4,7)","q^(-9)+q^(-8)+q^(-7)-q^(-6)-2/q^5-q^(-4)+q^(-2)-1/(q^6*t)-1/(q^5*t)+1/(q^3*t)+1/(q^2*t)" +"(0,11,4,8)","-q^(-11)-q^(-10)+q^(-8)+q^(-7)+t/q^9+t/q^8-t/q^6-t/q^5" +"(0,12,4,8)","q^(-9)-q^(-7)-2/q^6-q^(-5)+q^(-4)+q^(-3)+q^(-2)+t/q^9+t/q^8-t/q^6-t/q^5" +"(0,13,4,9)","-q^(-9)-q^(-8)+2/q^6+2/q^5-q^(-3)-q^(-2)+1/(q^11*t)+1/(q^10*t)-2/(q^8*t)-2/(q^7*t)+1/(q^5*t)+1/(q^4*t)" +"(0,14,4,10)","q^(-9)+q^(-8)-2/q^6-2/q^5+q^(-3)+q^(-2)-t/q^11-t/q^10+(2*t)/q^8+(2*t)/q^7-t/q^5-t/q^4" +"(0,15,4,11)","-2/q^9-2/q^8+4/q^6+4/q^5-2/q^3-2/q^2+1/(q^11*t)+1/(q^10*t)-2/(q^8*t)-2/(q^7*t)+1/(q^5*t)+1/(q^4*t)+t/q^12+t/q^11-t/q^9-(3*t)/q^8-t/q^7+t/q^6+(2*t)/q^5+t/q^4-t/q^3" +"(0,15,4,12)","-q^(-13)-q^(-12)+2/q^10+2/q^9-q^(-7)-q^(-6)-t/q^12+(2*t)/q^11+(3*t)/q^10+t/q^9-(3*t)/q^8-(5*t)/q^7-t/q^6+t/q^5+(2*t)/q^4+t/q^3-t^2/q^13-t^2/q^12+(2*t^2)/q^10+(2*t^2)/q^9-t^2/q^7-t^2/q^6" +"(0,5,5,0)","1/(q^6*t)" +"(0,7,5,2)","-q^(-8)+1/(q^6*t)" +"(0,8,5,2)","q^(-6)-1/(q^4*t)" +"(0,9,5,3)","1/(q^9*t)+1/(q^8*t)-1/(q^5*t)-1/(q^4*t)" +"(0,9,5,4)","-q^(-8)+q^(-6)-1/(q^9*t)-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(0,11,5,6)","q^(-11)+q^(-10)-q^(-8)-q^(-7)-1/(q^9*t)-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(0,12,5,6)","q^(-8)+q^(-7)-q^(-5)-q^(-4)-1/(q^6*t)-1/(q^5*t)+1/(q^3*t)+1/(q^2*t)" +"(0,13,5,7)","1/(q^11*t)+1/(q^10*t)+1/(q^9*t)-1/(q^8*t)-2/(q^7*t)-2/(q^6*t)-1/(q^5*t)+1/(q^4*t)+1/(q^3*t)+1/(q^2*t)" +"(0,13,5,8)","q^(-11)+q^(-10)-2/q^8-2/q^7+q^(-5)+q^(-4)+1/(q^11*t)+1/(q^10*t)-2/(q^8*t)-2/(q^7*t)+1/(q^5*t)+1/(q^4*t)" +"(0,15,5,10)","-q^(-13)-q^(-12)+2/q^10+q^(-9)-q^(-8)-q^(-7)+q^(-6)+2/q^5-q^(-3)-q^(-2)+1/(q^11*t)+1/(q^10*t)-2/(q^8*t)-2/(q^7*t)+1/(q^5*t)+1/(q^4*t)+t/q^11+t/q^10-(2*t)/q^8-(2*t)/q^7+t/q^5+t/q^4" +"(0,6,6,0)","t/q^6" +"(0,7,6,1)","q^(-8)-t/q^6" +"(0,8,6,1)","-q^(-8)+t/q^6" +"(0,10,6,3)","-q^(-8)+q^(-6)-t/q^9-t/q^8+t/q^6+t/q^5" +"(0,10,6,4)","t/q^10+t/q^9-t/q^6-t/q^5" +"(0,11,6,5)","q^(-11)+q^(-10)-q^(-8)-q^(-7)-t/q^9-t/q^8+t/q^6+t/q^5" +"(0,12,6,5)","q^(-11)+q^(-10)-q^(-8)-q^(-7)-t/q^9-t/q^8+t/q^6+t/q^5" +"(0,14,6,7)","q^(-11)+q^(-10)-2/q^8-2/q^7+q^(-5)+q^(-4)+t/q^11+t/q^10-(2*t)/q^8-(2*t)/q^7+t/q^5+t/q^4" +"(0,14,6,8)","t/q^13+t/q^12+t/q^11-t/q^10-(2*t)/q^9-(2*t)/q^8-t/q^7+t/q^6+t/q^5+t/q^4" +"(0,15,6,9)","q^(-13)+q^(-12)-2/q^10-2/q^9+q^(-7)+q^(-6)-t/q^15-t/q^14+(2*t)/q^12+t/q^11-t/q^10-t/q^9+t/q^8+(2*t)/q^7-t/q^5-t/q^4+t^2/q^13+t^2/q^12-(2*t^2)/q^10-(2*t^2)/q^9+t^2/q^7+t^2/q^6" +"(0,7,7,0)","q^(-8)" +"(0,9,7,1)","q^(-8)-1/(q^10*t)" +"(0,10,7,2)","q^(-6)-t/q^8" +"(0,11,7,3)","-q^(-11)-q^(-10)+q^(-8)+q^(-7)+q^(-6)-1/(q^10*t)" +"(0,12,7,3)","q^(-9)-1/(q^7*t)" +"(0,11,7,4)","q^(-12)+q^(-11)+q^(-10)-q^(-8)-q^(-7)-t/q^8" +"(0,12,7,4)","q^(-6)-t/q^8" +"(0,13,7,5)","-q^(-11)-q^(-10)-q^(-9)+q^(-8)+q^(-7)+q^(-6)+1/(q^13*t)+1/(q^12*t)+1/(q^11*t)-1/(q^10*t)-1/(q^9*t)-1/(q^8*t)" +"(0,14,7,6)","-q^(-9)-q^(-8)-q^(-7)+q^(-6)+q^(-5)+q^(-4)+t/q^11+t/q^10+t/q^9-t/q^8-t/q^7-t/q^6" +"(0,15,7,7)","q^(-13)+q^(-12)-q^(-11)-3/q^10-4/q^9+q^(-7)+3/q^6+q^(-5)+q^(-4)+1/(q^13*t)+1/(q^12*t)+1/(q^11*t)-1/(q^10*t)-1/(q^9*t)-1/(q^8*t)+t/q^13+t/q^12+t/q^11-t/q^10-t/q^9-t/q^8" +"(0,15,7,8)","q^(-15)+q^(-14)+2/q^13-q^(-11)-3/q^10-2/q^9+q^(-7)+q^(-6)-(2*t)/q^11-(2*t)/q^10-(2*t)/q^9+(2*t)/q^8+(2*t)/q^7+(2*t)/q^6+t^2/q^13+t^2/q^12+t^2/q^11-t^2/q^10-t^2/q^9-t^2/q^8" +"(0,8,8,0)","q^(-8)" +"(0,9,8,1)","q^(-8)-1/(q^10*t)" +"(0,10,8,2)","q^(-8)-t/q^10" +"(0,11,8,3)","q^(-8)-1/(q^10*t)" +"(0,12,8,3)","q^(-11)+q^(-10)+q^(-9)-q^(-7)-q^(-6)-1/(q^7*t)" +"(0,11,8,4)","q^(-12)-t/q^10" +"(0,12,8,4)","-q^(-11)-q^(-10)+q^(-8)+q^(-7)+q^(-6)-t/q^10" +"(0,13,8,5)","-q^(-11)-q^(-10)-q^(-9)+q^(-8)+q^(-7)+q^(-6)+1/(q^13*t)+1/(q^12*t)+1/(q^11*t)-1/(q^10*t)-1/(q^9*t)-1/(q^8*t)" +"(0,14,8,6)","-q^(-11)-q^(-10)-q^(-9)+q^(-8)+q^(-7)+q^(-6)+t/q^13+t/q^12+t/q^11-t/q^10-t/q^9-t/q^8" +"(0,15,8,7)","-2/q^11-2/q^10-2/q^9+2/q^8+2/q^7+2/q^6+1/(q^13*t)+1/(q^12*t)+1/(q^11*t)-1/(q^10*t)-1/(q^9*t)-1/(q^8*t)+t/q^15+t/q^14+(2*t)/q^13-t/q^11-(3*t)/q^10-(2*t)/q^9+t/q^7+t/q^6" +"(0,15,8,8)","q^(-15)+q^(-14)+q^(-13)-q^(-12)-q^(-11)-q^(-10)+t/q^15+t/q^14-t/q^13-(3*t)/q^12-(4*t)/q^11+t/q^9+(3*t)/q^8+t/q^7+t/q^6+t^2/q^15+t^2/q^14+t^2/q^13-t^2/q^12-t^2/q^11-t^2/q^10" +"(0,9,9,0)","1/(q^10*t)" +"(0,11,9,2)","-q^(-12)+1/(q^10*t)" +"(0,12,9,2)","-q^(-9)+1/(q^7*t)" +"(0,13,9,3)","1/(q^13*t)+1/(q^12*t)+1/(q^11*t)-1/(q^9*t)-1/(q^8*t)-1/(q^7*t)" +"(0,13,9,4)","-q^(-12)+q^(-9)-1/(q^13*t)-1/(q^12*t)-1/(q^11*t)+1/(q^10*t)+1/(q^9*t)+1/(q^8*t)" +"(0,15,9,6)","q^(-15)+q^(-14)+q^(-13)-q^(-12)+q^(-9)-q^(-8)-q^(-7)-q^(-6)-1/(q^13*t)-1/(q^12*t)-1/(q^11*t)+1/(q^10*t)+1/(q^9*t)+1/(q^8*t)-t/q^13-t/q^12-t/q^11+t/q^10+t/q^9+t/q^8" +"(0,10,10,0)","t/q^10" +"(0,11,10,1)","-q^(-12)+t/q^10" +"(0,12,10,1)","-q^(-12)+t/q^10" +"(0,14,10,3)","-q^(-12)+q^(-9)-t/q^13-t/q^12-t/q^11+t/q^10+t/q^9+t/q^8" +"(0,14,10,4)","t/q^14+t/q^13+t/q^12-t/q^10-t/q^9-t/q^8" +"(0,15,10,5)","-q^(-15)-q^(-14)-q^(-13)+q^(-12)+q^(-11)+q^(-10)+t/q^17+t/q^16+t/q^15-t/q^14+t/q^11-t/q^10-t/q^9-t/q^8-t^2/q^15-t^2/q^14-t^2/q^13+t^2/q^12+t^2/q^11+t^2/q^10" +"(0,11,11,0)","q^(-12)" +"(0,13,11,1)","q^(-12)-1/(q^14*t)" +"(0,14,11,2)","-q^(-9)+t/q^11" +"(0,15,11,3)","-q^(-15)-q^(-14)-q^(-13)+2/q^12+q^(-11)+q^(-10)+q^(-9)-1/(q^14*t)-t/q^14" +"(0,15,11,4)","q^(-16)+q^(-15)+q^(-14)+q^(-13)-q^(-12)-q^(-11)-q^(-10)-(2*t)/q^11+t^2/q^13" +"(0,12,12,0)","q^(-12)" +"(0,13,12,1)","-q^(-12)+1/(q^14*t)" +"(0,14,12,2)","q^(-12)-t/q^14" +"(0,15,12,3)","-2/q^12+1/(q^14*t)+t/q^17+t/q^16+t/q^15+t/q^14-t/q^13-t/q^12-t/q^11" +"(0,15,12,4)","-q^(-16)-t/q^17-t/q^16-t/q^15+(2*t)/q^14+t/q^13+t/q^12+t/q^11-t^2/q^16" +"(0,13,13,0)","1/(q^14*t)" +"(0,15,13,2)","-q^(-16)-q^(-12)+1/(q^14*t)+t/q^14" +"(0,14,14,0)","t/q^14" +"(0,15,14,1)","q^(-16)-t/q^18-t/q^14+t^2/q^16" +"(0,15,15,0)","q^(-16)" +"(1,0,0,1)","1" +"(1,2,0,3)","1" +"(1,2,0,4)","-(t/q^2)" +"(1,4,0,5)","1-q^(-3)" +"(1,6,0,7)","1-q^(-3)" +"(1,6,0,8)","-(t/q^5)+t/q^2" +"(1,8,0,9)","1+q^(-5)-q^(-3)-q^(-2)" +"(1,10,0,11)","1+q^(-5)-q^(-3)-q^(-2)" +"(1,10,0,12)","-(t/q^7)+t/q^5+t/q^4-t/q^2" +"(1,12,0,13)","1-q^(-6)+q^(-5)+q^(-4)-q^(-2)-q^(-1)" +"(1,14,0,15)","1-q^(-6)+q^(-5)+q^(-4)-q^(-2)-q^(-1)" +"(1,1,1,1)","-(1/(q^2*t))" +"(1,3,1,3)","-(1/(q^2*t))" +"(1,4,1,3)","-(1/(q*t))" +"(1,3,1,4)","q^(-4)" +"(1,4,1,4)","q^(-3)" +"(1,5,1,5)","1/(q^5*t)-1/(q^2*t)" +"(1,7,1,7)","1/(q^5*t)-1/(q^2*t)" +"(1,8,1,7)","t^(-1)-1/(q^3*t)" +"(1,7,1,8)","q^(-7)-q^(-4)" +"(1,8,1,8)","-q^(-5)+q^(-2)" +"(1,9,1,9)","-(1/(q^7*t))+1/(q^5*t)+1/(q^4*t)-1/(q^2*t)" +"(1,11,1,11)","-(1/(q^7*t))+1/(q^5*t)+1/(q^4*t)-1/(q^2*t)" +"(1,12,1,11)","-(1/(q^4*t))+1/(q^2*t)+1/(q*t)-q/t" +"(1,11,1,12)","q^(-9)-q^(-7)-q^(-6)+q^(-4)" +"(1,12,1,12)","q^(-6)-q^(-4)-q^(-3)+q^(-1)" +"(1,13,1,13)","1/(q^8*t)-1/(q^7*t)-1/(q^6*t)+1/(q^4*t)+1/(q^3*t)-1/(q^2*t)" +"(1,15,1,15)","1-q^(-6)+q^(-5)+q^(-4)-q^(-2)-q^(-1)+1/(q^8*t)-1/(q^7*t)-1/(q^6*t)+1/(q^4*t)+1/(q^3*t)-1/(q^2*t)" +"(1,2,2,1)","t/q^2" +"(1,6,2,5)","t/q^5-t/q^2" +"(1,10,2,9)","t/q^7-t/q^5-t/q^4+t/q^2" +"(1,14,2,13)","t/q^8-t/q^7-t/q^6+t/q^4+t/q^3-t/q^2" +"(1,3,3,1)","-q^(-4)" +"(1,6,3,3)","q^(-3)" +"(1,6,3,4)","-(t/q^5)" +"(1,7,3,5)","-q^(-7)+q^(-4)" +"(1,8,3,5)","-q^(-6)+q^(-3)" +"(1,10,3,7)","-q^(-6)-q^(-5)+q^(-3)+q^(-2)" +"(1,10,3,8)","-(t/q^8)-t/q^7+t/q^5+t/q^4" +"(1,11,3,9)","-q^(-9)+q^(-7)+q^(-6)-q^(-4)" +"(1,12,3,9)","q^(-8)+q^(-7)-q^(-6)-2/q^5-q^(-4)+q^(-3)+q^(-2)" +"(1,14,3,11)","q^(-8)+q^(-7)-2/q^5-2/q^4+q^(-2)+q^(-1)" +"(1,14,3,12)","-(t/q^10)-t/q^9+(2*t)/q^7+(2*t)/q^6-t/q^4-t/q^3" +"(1,15,3,13)","-q^(-10)+q^(-9)+q^(-8)-q^(-6)-q^(-5)+q^(-4)-t/q^11+t/q^9+(2*t)/q^8-(2*t)/q^6-t/q^5+t/q^3" +"(1,4,4,1)","-q^(-4)" +"(1,6,4,3)","-q^(-4)" +"(1,6,4,4)","t/q^6" +"(1,8,4,5)","q^(-7)+q^(-6)-q^(-4)-q^(-3)" +"(1,10,4,7)","q^(-7)+q^(-6)-q^(-4)-q^(-3)" +"(1,10,4,8)","t/q^9+t/q^8-t/q^6-t/q^5" +"(1,12,4,9)","-q^(-9)-q^(-8)+2/q^6+2/q^5-q^(-3)-q^(-2)" +"(1,14,4,11)","-q^(-9)-q^(-8)+2/q^6+2/q^5-q^(-3)-q^(-2)" +"(1,14,4,12)","t/q^11+t/q^10-(2*t)/q^8-(2*t)/q^7+t/q^5+t/q^4" +"(1,15,4,13)","t/q^12-t/q^10-t/q^9-t/q^8+t/q^7+t/q^6+t/q^5-t/q^3" +"(1,5,5,1)","1/(q^6*t)" +"(1,7,5,3)","1/(q^6*t)" +"(1,8,5,3)","-(1/(q^4*t))" +"(1,7,5,4)","-q^(-8)" +"(1,8,5,4)","q^(-6)" +"(1,9,5,5)","-(1/(q^9*t))-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(1,11,5,7)","-(1/(q^9*t))-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(1,12,5,7)","-(1/(q^6*t))-1/(q^5*t)+1/(q^3*t)+1/(q^2*t)" +"(1,11,5,8)","-q^(-11)-q^(-10)+q^(-8)+q^(-7)" +"(1,12,5,8)","-q^(-8)-q^(-7)+q^(-5)+q^(-4)" +"(1,13,5,9)","1/(q^11*t)+1/(q^10*t)-2/(q^8*t)-2/(q^7*t)+1/(q^5*t)+1/(q^4*t)" +"(1,15,5,11)","-q^(-9)-q^(-8)+2/q^6+2/q^5-q^(-3)-q^(-2)+1/(q^11*t)+1/(q^10*t)-2/(q^8*t)-2/(q^7*t)+1/(q^5*t)+1/(q^4*t)" +"(1,15,5,12)","-q^(-13)-q^(-12)+2/q^10+2/q^9-q^(-7)-q^(-6)+t/q^11+t/q^10-(2*t)/q^8-(2*t)/q^7+t/q^5+t/q^4" +"(1,6,6,1)","-(t/q^6)" +"(1,10,6,5)","-(t/q^9)-t/q^8+t/q^6+t/q^5" +"(1,14,6,9)","-(t/q^11)-t/q^10+(2*t)/q^8+(2*t)/q^7-t/q^5-t/q^4" +"(1,7,7,1)","q^(-8)" +"(1,10,7,3)","q^(-6)" +"(1,10,7,4)","-(t/q^8)" +"(1,11,7,5)","q^(-11)+q^(-10)-q^(-8)-q^(-7)" +"(1,12,7,5)","-q^(-9)+q^(-6)" +"(1,14,7,7)","-q^(-9)-q^(-8)-q^(-7)+q^(-6)+q^(-5)+q^(-4)" +"(1,14,7,8)","-(t/q^11)-t/q^10-t/q^9+t/q^8+t/q^7+t/q^6" +"(1,15,7,9)","q^(-13)+q^(-12)-2/q^10-2/q^9+q^(-7)+q^(-6)+t/q^13+t/q^12-(2*t)/q^10-(2*t)/q^9+t/q^7+t/q^6" +"(1,8,8,1)","q^(-8)" +"(1,10,8,3)","q^(-8)" +"(1,10,8,4)","-(t/q^10)" +"(1,12,8,5)","-q^(-11)-q^(-10)-q^(-9)+q^(-8)+q^(-7)+q^(-6)" +"(1,14,8,7)","-q^(-11)-q^(-10)-q^(-9)+q^(-8)+q^(-7)+q^(-6)" +"(1,14,8,8)","-(t/q^13)-t/q^12-t/q^11+t/q^10+t/q^9+t/q^8" +"(1,15,8,9)","t/q^15+t/q^14+t/q^13-t/q^12-(2*t)/q^11-(2*t)/q^10-t/q^9+t/q^8+t/q^7+t/q^6" +"(1,9,9,1)","-(1/(q^10*t))" +"(1,11,9,3)","-(1/(q^10*t))" +"(1,12,9,3)","-(1/(q^7*t))" +"(1,11,9,4)","q^(-12)" +"(1,12,9,4)","q^(-9)" +"(1,13,9,5)","1/(q^13*t)+1/(q^12*t)+1/(q^11*t)-1/(q^10*t)-1/(q^9*t)-1/(q^8*t)" +"(1,15,9,7)","-q^(-11)-q^(-10)-q^(-9)+q^(-8)+q^(-7)+q^(-6)+1/(q^13*t)+1/(q^12*t)+1/(q^11*t)-1/(q^10*t)-1/(q^9*t)-1/(q^8*t)" +"(1,15,9,8)","q^(-15)+q^(-14)+q^(-13)-q^(-12)-q^(-11)-q^(-10)-t/q^13-t/q^12-t/q^11+t/q^10+t/q^9+t/q^8" +"(1,10,10,1)","t/q^10" +"(1,14,10,5)","t/q^13+t/q^12+t/q^11-t/q^10-t/q^9-t/q^8" +"(1,11,11,1)","-q^(-12)" +"(1,14,11,3)","q^(-9)" +"(1,14,11,4)","-(t/q^11)" +"(1,15,11,5)","-q^(-15)-q^(-14)-q^(-13)+q^(-12)+q^(-11)+q^(-10)-t/q^14+t/q^11" +"(1,12,12,1)","-q^(-12)" +"(1,14,12,3)","-q^(-12)" +"(1,14,12,4)","t/q^14" +"(1,15,12,5)","t/q^17+t/q^16+t/q^15-t/q^13-t/q^12-t/q^11" +"(1,13,13,1)","1/(q^14*t)" +"(1,15,13,3)","-q^(-12)+1/(q^14*t)" +"(1,15,13,4)","-q^(-16)+t/q^14" +"(1,14,14,1)","-(t/q^14)" +"(1,15,15,1)","q^(-16)" +"(2,0,0,2)","1" +"(2,1,0,3)","-(1/(q*t))" +"(2,1,0,4)","1" +"(2,3,0,6)","1-q^(-3)" +"(2,5,0,7)","t^(-1)-1/(q^3*t)" +"(2,5,0,8)","1-q^(-3)" +"(2,7,0,10)","1+q^(-5)-q^(-3)-q^(-2)" +"(2,9,0,11)","-(1/(q^4*t))+1/(q^2*t)+1/(q*t)-q/t" +"(2,9,0,12)","1+q^(-5)-q^(-3)-q^(-2)" +"(2,11,0,14)","1-q^(-6)+q^(-5)+q^(-4)-q^(-2)-q^(-1)" +"(2,13,0,15)","-t^(-1)-1/(q^4*t)+1/(q^3*t)+1/(q^2*t)-q/t+q^2/t" +"(2,1,1,2)","1/(q*t)" +"(2,5,1,6)","-t^(-1)+1/(q^3*t)" +"(2,9,1,10)","1/(q^4*t)-1/(q^2*t)-1/(q*t)+q/t" +"(2,13,1,14)","t^(-1)+1/(q^4*t)-1/(q^3*t)-1/(q^2*t)+q/t-q^2/t" +"(2,2,2,2)","-(t/q^2)" +"(2,3,2,3)","q^(-3)" +"(2,4,2,3)","q^(-3)" +"(2,3,2,4)","-(t/q^2)" +"(2,4,2,4)","-(t/q^2)" +"(2,6,2,6)","t/q^5-t/q^2" +"(2,7,2,7)","-q^(-5)+q^(-2)" +"(2,8,2,7)","q^(-5)-q^(-2)" +"(2,7,2,8)","-(t/q^5)+t/q^2" +"(2,8,2,8)","t/q^5-t/q^2" +"(2,10,2,10)","-(t/q^7)+t/q^5+t/q^4-t/q^2" +"(2,11,2,11)","q^(-6)-q^(-4)-q^(-3)+q^(-1)" +"(2,12,2,11)","q^(-6)-q^(-4)-q^(-3)+q^(-1)" +"(2,11,2,12)","-(t/q^7)+t/q^5+t/q^4-t/q^2" +"(2,12,2,12)","-(t/q^7)+t/q^5+t/q^4-t/q^2" +"(2,14,2,14)","t/q^8-t/q^7-t/q^6+t/q^4+t/q^3-t/q^2" +"(2,15,2,15)","1-q^(-6)+q^(-5)+q^(-4)-q^(-2)-q^(-1)+t/q^8-t/q^7-t/q^6+t/q^4+t/q^3-t/q^2" +"(2,3,3,2)","-q^(-3)" +"(2,5,3,3)","1/(q^4*t)" +"(2,5,3,4)","-q^(-3)" +"(2,7,3,6)","q^(-6)+q^(-5)-q^(-3)-q^(-2)" +"(2,9,3,7)","1/(q^6*t)+1/(q^5*t)-1/(q^3*t)-1/(q^2*t)" +"(2,9,3,8)","q^(-6)+q^(-5)-q^(-3)-q^(-2)" +"(2,11,3,10)","-q^(-8)-q^(-7)+2/q^5+2/q^4-q^(-2)-q^(-1)" +"(2,13,3,11)","t^(-1)+1/(q^7*t)+1/(q^6*t)-2/(q^4*t)-2/(q^3*t)+1/(q*t)" +"(2,13,3,12)","-q^(-8)-q^(-7)+2/q^5+2/q^4-q^(-2)-q^(-1)" +"(2,15,3,14)","-1+q^(-9)-q^(-7)-q^(-6)-q^(-5)+q^(-4)+q^(-3)+q^(-2)" +"(2,4,4,2)","-q^(-3)" +"(2,5,4,3)","-(1/(q^4*t))" +"(2,5,4,4)","q^(-3)" +"(2,7,4,6)","-q^(-6)+q^(-3)" +"(2,8,4,6)","-q^(-5)+q^(-2)" +"(2,9,4,7)","-(1/(q^6*t))-1/(q^5*t)+1/(q^3*t)+1/(q^2*t)" +"(2,9,4,8)","-q^(-6)-q^(-5)+q^(-3)+q^(-2)" +"(2,11,4,10)","q^(-8)+q^(-7)-q^(-6)-2/q^5-q^(-4)+q^(-3)+q^(-2)" +"(2,12,4,10)","-q^(-6)+q^(-4)+q^(-3)-q^(-1)" +"(2,13,4,11)","-t^(-1)-1/(q^7*t)-1/(q^6*t)+2/(q^4*t)+2/(q^3*t)-1/(q*t)" +"(2,13,4,12)","q^(-8)+q^(-7)-2/q^5-2/q^4+q^(-2)+q^(-1)" +"(2,15,4,14)","-q^(-9)+q^(-7)+2/q^6-2/q^4-q^(-3)+q^(-1)-t/q^8+t/q^7+t/q^6-t/q^4-t/q^3+t/q^2" +"(2,5,5,2)","-(1/(q^4*t))" +"(2,9,5,6)","-(1/(q^6*t))-1/(q^5*t)+1/(q^3*t)+1/(q^2*t)" +"(2,13,5,10)","-t^(-1)-1/(q^7*t)-1/(q^6*t)+2/(q^4*t)+2/(q^3*t)-1/(q*t)" +"(2,6,6,2)","t/q^5" +"(2,7,6,3)","q^(-6)" +"(2,8,6,3)","-q^(-6)" +"(2,7,6,4)","-(t/q^5)" +"(2,8,6,4)","t/q^5" +"(2,10,6,6)","-(t/q^8)-t/q^7+t/q^5+t/q^4" +"(2,11,6,7)","-q^(-8)-q^(-7)+q^(-5)+q^(-4)" +"(2,12,6,7)","-q^(-8)-q^(-7)+q^(-5)+q^(-4)" +"(2,11,6,8)","-(t/q^8)-t/q^7+t/q^5+t/q^4" +"(2,12,6,8)","-(t/q^8)-t/q^7+t/q^5+t/q^4" +"(2,14,6,10)","t/q^10+t/q^9-(2*t)/q^7-(2*t)/q^6+t/q^4+t/q^3" +"(2,15,6,11)","q^(-9)+q^(-8)-2/q^6-2/q^5+q^(-3)+q^(-2)-t/q^11-t/q^10+(2*t)/q^8+(2*t)/q^7-t/q^5-t/q^4" +"(2,15,6,12)","-(t/q^10)-t/q^9+(2*t)/q^7+(2*t)/q^6-t/q^4-t/q^3+t^2/q^12+t^2/q^11-(2*t^2)/q^9-(2*t^2)/q^8+t^2/q^6+t^2/q^5" +"(2,7,7,2)","q^(-6)" +"(2,9,7,3)","-(1/(q^7*t))" +"(2,9,7,4)","q^(-6)" +"(2,11,7,6)","-q^(-9)-q^(-8)-q^(-7)+q^(-6)+q^(-5)+q^(-4)" +"(2,13,7,7)","-(1/(q^9*t))-1/(q^8*t)-1/(q^7*t)+1/(q^6*t)+1/(q^5*t)+1/(q^4*t)" +"(2,13,7,8)","-q^(-9)-q^(-8)-q^(-7)+q^(-6)+q^(-5)+q^(-4)" +"(2,15,7,10)","q^(-11)+q^(-10)+q^(-9)-q^(-8)-2/q^7-2/q^6-q^(-5)+q^(-4)+q^(-3)+q^(-2)" +"(2,8,8,2)","q^(-6)" +"(2,9,8,3)","-(1/(q^7*t))" +"(2,9,8,4)","q^(-6)" +"(2,11,8,6)","-q^(-9)+q^(-6)" +"(2,12,8,6)","q^(-8)+q^(-7)-q^(-5)-q^(-4)" +"(2,13,8,7)","-(1/(q^9*t))-1/(q^8*t)-1/(q^7*t)+1/(q^6*t)+1/(q^5*t)+1/(q^4*t)" +"(2,13,8,8)","-q^(-9)-q^(-8)-q^(-7)+q^(-6)+q^(-5)+q^(-4)" +"(2,15,8,10)","q^(-11)+q^(-10)-2/q^8-2/q^7+q^(-5)+q^(-4)+t/q^11+t/q^10-(2*t)/q^8-(2*t)/q^7+t/q^5+t/q^4" +"(2,9,9,2)","1/(q^7*t)" +"(2,13,9,6)","1/(q^9*t)+1/(q^8*t)+1/(q^7*t)-1/(q^6*t)-1/(q^5*t)-1/(q^4*t)" +"(2,10,10,2)","-(t/q^8)" +"(2,11,10,3)","q^(-9)" +"(2,12,10,3)","q^(-9)" +"(2,11,10,4)","-(t/q^8)" +"(2,12,10,4)","-(t/q^8)" +"(2,14,10,6)","t/q^11+t/q^10+t/q^9-t/q^8-t/q^7-t/q^6" +"(2,15,10,7)","-q^(-11)-q^(-10)-q^(-9)+q^(-8)+q^(-7)+q^(-6)+t/q^13+t/q^12+t/q^11-t/q^10-t/q^9-t/q^8" +"(2,15,10,8)","-(t/q^11)-t/q^10-t/q^9+t/q^8+t/q^7+t/q^6+t^2/q^13+t^2/q^12+t^2/q^11-t^2/q^10-t^2/q^9-t^2/q^8" +"(2,11,11,2)","-q^(-9)" +"(2,13,11,3)","1/(q^10*t)" +"(2,13,11,4)","-q^(-9)" +"(2,15,11,6)","q^(-12)+q^(-11)+q^(-10)-q^(-8)-q^(-7)-q^(-6)" +"(2,12,12,2)","-q^(-9)" +"(2,13,12,3)","-(1/(q^10*t))" +"(2,13,12,4)","q^(-9)" +"(2,15,12,6)","-q^(-12)+q^(-9)-t/q^13-t/q^12-t/q^11+t/q^10+t/q^9+t/q^8" +"(2,13,13,2)","-(1/(q^10*t))" +"(2,14,14,2)","t/q^11" +"(2,15,14,3)","q^(-12)-t/q^14" +"(2,15,14,4)","-(t/q^11)+t^2/q^13" +"(2,15,15,2)","q^(-12)" +"(3,0,0,3)","1" +"(3,1,0,5)","1" +"(3,2,0,6)","t/q^2" +"(3,3,0,7)","1" +"(3,4,0,7)","q^(-2)" +"(3,3,0,8)","t/q^2" +"(3,4,0,8)","t/q^2" +"(3,5,0,9)","1-q^(-2)" +"(3,6,0,10)","-(t/q^4)+t/q^2" +"(3,7,0,11)","1-q^(-2)" +"(3,8,0,11)","q^(-3)-q^(-1)" +"(3,7,0,12)","t/q^4-t/q^2" +"(3,8,0,12)","-(t/q^4)+t/q^2" +"(3,9,0,13)","1+q^(-3)-q^(-2)-q^(-1)" +"(3,10,0,14)","t/q^5-t/q^4-t/q^3+t/q^2" +"(3,11,0,15)","1+q^(-3)-q^(-2)-q^(-1)" +"(3,12,0,15)","1+q^(-3)-q^(-2)-q^(-1)" +"(3,1,1,3)","-(1/(q*t))" +"(3,3,1,6)","-q^(-3)" +"(3,4,1,6)","-q^(-2)" +"(3,5,1,7)","t^(-1)-1/(q^3*t)" +"(3,5,1,8)","-q^(-3)+q^(-2)" +"(3,7,1,10)","q^(-5)-q^(-3)" +"(3,8,1,10)","-q^(-3)+q^(-1)" +"(3,9,1,11)","-(1/(q^4*t))+1/(q^2*t)+1/(q*t)-q/t" +"(3,9,1,12)","q^(-5)-2/q^3+q^(-1)" +"(3,11,1,14)","-q^(-6)+q^(-5)+q^(-4)-q^(-3)" +"(3,12,1,14)","-1-q^(-3)+q^(-2)+q^(-1)" +"(3,13,1,15)","-t^(-1)-1/(q^4*t)+1/(q^3*t)+1/(q^2*t)-q/t+q^2/t" +"(3,2,2,3)","-(t/q^2)" +"(3,3,2,5)","-(t/q^2)" +"(3,4,2,5)","-(t/q^2)" +"(3,6,2,7)","t/q^4-t/q^2" +"(3,7,2,9)","-(t/q^4)+t/q^2" +"(3,8,2,9)","t/q^4-t/q^2" +"(3,10,2,11)","-(t/q^5)+t/q^4+t/q^3-t/q^2" +"(3,11,2,13)","-(t/q^5)+t/q^4+t/q^3-t/q^2" +"(3,12,2,13)","-(t/q^5)+t/q^4+t/q^3-t/q^2" +"(3,3,3,3)","q^(-3)" +"(3,5,3,5)","q^(-3)" +"(3,6,3,6)","-(t/q^4)" +"(3,7,3,7)","-q^(-5)+q^(-3)+q^(-2)" +"(3,8,3,7)","-q^(-4)" +"(3,7,3,8)","t/q^4" +"(3,8,3,8)","-(t/q^4)" +"(3,9,3,9)","-q^(-5)-q^(-4)+q^(-3)+q^(-2)" +"(3,10,3,10)","t/q^6+t/q^5-t/q^4-t/q^3" +"(3,11,3,11)","q^(-6)-q^(-5)-2/q^4+q^(-2)+q^(-1)" +"(3,12,3,11)","-q^(-5)-q^(-4)+q^(-3)+q^(-2)" +"(3,11,3,12)","t/q^6+t/q^5-t/q^4-t/q^3" +"(3,12,3,12)","t/q^6+t/q^5-t/q^4-t/q^3" +"(3,13,3,13)","q^(-6)-q^(-4)-q^(-3)+q^(-1)" +"(3,14,3,14)","-(t/q^7)+t/q^5+t/q^4-t/q^2" +"(3,15,3,15)","1+q^(-5)-q^(-3)-q^(-2)-t/q^7+t/q^5+t/q^4-t/q^2" +"(3,4,4,3)","q^(-3)" +"(3,5,4,5)","-q^(-3)" +"(3,6,4,6)","t/q^5" +"(3,7,4,7)","-q^(-3)" +"(3,8,4,7)","q^(-5)+q^(-4)-q^(-2)" +"(3,7,4,8)","-(t/q^5)" +"(3,8,4,8)","t/q^5" +"(3,9,4,9)","q^(-5)+q^(-4)-q^(-3)-q^(-2)" +"(3,10,4,10)","-(t/q^7)-t/q^6+t/q^5+t/q^4" +"(3,11,4,11)","q^(-5)+q^(-4)-q^(-3)-q^(-2)" +"(3,12,4,11)","q^(-6)+q^(-5)-2/q^3-q^(-2)+q^(-1)" +"(3,11,4,12)","-(t/q^7)-t/q^6+t/q^5+t/q^4" +"(3,12,4,12)","-(t/q^7)-t/q^6+t/q^5+t/q^4" +"(3,13,4,13)","-q^(-6)+q^(-4)+q^(-3)-q^(-1)" +"(3,14,4,14)","t/q^8-t/q^6-t/q^5+t/q^3" +"(3,15,4,15)","-q^(-6)+q^(-4)+q^(-3)-q^(-1)+t/q^8-t/q^6-t/q^5+t/q^3" +"(3,5,5,3)","-(1/(q^4*t))" +"(3,7,5,6)","-q^(-6)" +"(3,8,5,6)","q^(-4)" +"(3,9,5,7)","-(1/(q^6*t))-1/(q^5*t)+1/(q^3*t)+1/(q^2*t)" +"(3,9,5,8)","-q^(-6)+q^(-4)" +"(3,11,5,10)","q^(-8)+q^(-7)-q^(-6)-q^(-5)" +"(3,12,5,10)","q^(-5)+q^(-4)-q^(-3)-q^(-2)" +"(3,13,5,11)","-t^(-1)-1/(q^7*t)-1/(q^6*t)+2/(q^4*t)+2/(q^3*t)-1/(q*t)" +"(3,13,5,12)","q^(-8)+q^(-7)-q^(-6)-2/q^5-q^(-4)+q^(-3)+q^(-2)" +"(3,15,5,14)","-q^(-9)+q^(-7)+q^(-6)-q^(-4)+t/q^7-t/q^5-t/q^4+t/q^2" +"(3,6,6,3)","-(t/q^5)" +"(3,7,6,5)","t/q^5" +"(3,8,6,5)","-(t/q^5)" +"(3,10,6,7)","t/q^7+t/q^6-t/q^5-t/q^4" +"(3,11,6,9)","t/q^7+t/q^6-t/q^5-t/q^4" +"(3,12,6,9)","t/q^7+t/q^6-t/q^5-t/q^4" +"(3,14,6,11)","-(t/q^8)+t/q^6+t/q^5-t/q^3" +"(3,15,6,13)","t/q^8-t/q^6-t/q^5+t/q^3-t^2/q^10+t^2/q^8+t^2/q^7-t^2/q^5" +"(3,7,7,3)","q^(-6)" +"(3,9,7,5)","q^(-6)" +"(3,10,7,6)","t/q^6" +"(3,11,7,7)","-q^(-8)-q^(-7)+q^(-6)+q^(-5)+q^(-4)" +"(3,12,7,7)","q^(-6)" +"(3,11,7,8)","t/q^6" +"(3,12,7,8)","t/q^6" +"(3,13,7,9)","-q^(-8)-q^(-7)+q^(-5)+q^(-4)" +"(3,14,7,10)","-(t/q^8)-t/q^7+t/q^5+t/q^4" +"(3,15,7,11)","q^(-9)-q^(-7)-2/q^6-q^(-5)+q^(-4)+q^(-3)+q^(-2)+t/q^9+t/q^8-t/q^6-t/q^5" +"(3,15,7,12)","t/q^8+t/q^7-t/q^5-t/q^4-t^2/q^10-t^2/q^9+t^2/q^7+t^2/q^6" +"(3,8,8,3)","q^(-6)" +"(3,9,8,5)","q^(-6)" +"(3,10,8,6)","t/q^8" +"(3,11,8,7)","q^(-6)" +"(3,12,8,7)","q^(-8)+q^(-7)+q^(-6)-q^(-5)-q^(-4)" +"(3,11,8,8)","t/q^8" +"(3,12,8,8)","t/q^8" +"(3,13,8,9)","-q^(-8)-q^(-7)+q^(-5)+q^(-4)" +"(3,14,8,10)","-(t/q^10)-t/q^9+t/q^7+t/q^6" +"(3,15,8,11)","-q^(-8)-q^(-7)+q^(-5)+q^(-4)+t/q^11+t/q^10+t/q^9-t/q^8-(2*t)/q^7-t/q^6+t/q^4" +"(3,15,8,12)","t/q^10+t/q^9-t/q^7-t/q^6-t^2/q^12-t^2/q^11+t^2/q^9+t^2/q^8" +"(3,9,9,3)","-(1/(q^7*t))" +"(3,11,9,6)","-q^(-9)" +"(3,12,9,6)","-q^(-6)" +"(3,13,9,7)","-(1/(q^9*t))-1/(q^8*t)-1/(q^7*t)+1/(q^6*t)+1/(q^5*t)+1/(q^4*t)" +"(3,13,9,8)","-q^(-9)+q^(-6)" +"(3,15,9,10)","q^(-11)+q^(-10)-q^(-8)-q^(-7)-t/q^9-t/q^8+t/q^6+t/q^5" +"(3,10,10,3)","-(t/q^8)" +"(3,11,10,5)","-(t/q^8)" +"(3,12,10,5)","-(t/q^8)" +"(3,14,10,7)","t/q^10+t/q^9-t/q^7-t/q^6" +"(3,15,10,9)","-(t/q^10)-t/q^9+t/q^7+t/q^6+t^2/q^12+t^2/q^11-t^2/q^9-t^2/q^8" +"(3,11,11,3)","q^(-9)" +"(3,13,11,5)","q^(-9)" +"(3,14,11,6)","-(t/q^8)" +"(3,15,11,7)","-q^(-11)-q^(-10)+q^(-8)+q^(-7)+q^(-6)-t/q^10" +"(3,15,11,8)","t/q^8-t^2/q^10" +"(3,12,12,3)","q^(-9)" +"(3,13,12,5)","-q^(-9)" +"(3,14,12,6)","t/q^11" +"(3,15,12,7)","-q^(-9)+t/q^13+t/q^12+t/q^11-t/q^9-t/q^8" +"(3,15,12,8)","-(t/q^11)+t^2/q^13" +"(3,13,13,3)","-(1/(q^10*t))" +"(3,15,13,6)","-q^(-12)+t/q^10" +"(3,14,14,3)","-(t/q^11)" +"(3,15,14,5)","t/q^11-t^2/q^13" +"(3,15,15,3)","q^(-12)" +"(4,0,0,4)","1" +"(4,1,0,5)","1/(q*t)" +"(4,2,0,6)","1" +"(4,3,0,7)","1/(q*t)" +"(4,4,0,7)","t^(-1)" +"(4,3,0,8)","q^(-3)" +"(4,4,0,8)","1" +"(4,5,0,9)","-(1/(q^3*t))+1/(q*t)" +"(4,6,0,10)","1-q^(-2)" +"(4,7,0,11)","-(1/(q^3*t))+1/(q*t)" +"(4,8,0,11)","1/(q*t)-q/t" +"(4,7,0,12)","q^(-5)-q^(-3)" +"(4,8,0,12)","1-q^(-2)" +"(4,9,0,13)","1/(q^4*t)-1/(q^3*t)-1/(q^2*t)+1/(q*t)" +"(4,10,0,14)","1+q^(-3)-q^(-2)-q^(-1)" +"(4,11,0,15)","1/(q^4*t)-1/(q^3*t)-1/(q^2*t)+1/(q*t)" +"(4,12,0,15)","-t^(-1)+1/(q*t)-q/t+q^2/t" +"(4,1,1,4)","-(1/(q*t))" +"(4,3,1,6)","-(1/(q*t))" +"(4,4,1,6)","-t^(-1)" +"(4,5,1,8)","1/(q^3*t)-1/(q*t)" +"(4,7,1,10)","1/(q^3*t)-1/(q*t)" +"(4,8,1,10)","-(1/(q*t))+q/t" +"(4,9,1,12)","-(1/(q^4*t))+1/(q^3*t)+1/(q^2*t)-1/(q*t)" +"(4,11,1,14)","-(1/(q^4*t))+1/(q^3*t)+1/(q^2*t)-1/(q*t)" +"(4,12,1,14)","t^(-1)-1/(q*t)+q/t-q^2/t" +"(4,2,2,4)","-(t/q^2)" +"(4,3,2,5)","-q^(-3)" +"(4,4,2,5)","-q^(-3)" +"(4,6,2,7)","-q^(-3)+q^(-2)" +"(4,6,2,8)","-(t/q^5)+t/q^2" +"(4,7,2,9)","-q^(-5)+q^(-3)" +"(4,8,2,9)","q^(-5)-q^(-3)" +"(4,10,2,11)","q^(-5)-2/q^3+q^(-1)" +"(4,10,2,12)","-(t/q^7)+t/q^5+t/q^4-t/q^2" +"(4,11,2,13)","-q^(-6)+q^(-5)+q^(-4)-q^(-3)" +"(4,12,2,13)","-q^(-6)+q^(-5)+q^(-4)-q^(-3)" +"(4,14,2,15)","1-q^(-6)+q^(-5)+q^(-4)-q^(-2)-q^(-1)" +"(4,3,3,4)","q^(-3)" +"(4,5,3,5)","1/(q^4*t)" +"(4,6,3,6)","-q^(-2)" +"(4,7,3,7)","1/(q^4*t)" +"(4,8,3,7)","-(1/(q^2*t))" +"(4,7,3,8)","q^(-6)+q^(-5)-q^(-3)" +"(4,8,3,8)","-q^(-2)" +"(4,9,3,9)","-(1/(q^6*t))-1/(q^5*t)+1/(q^4*t)+1/(q^3*t)" +"(4,10,3,10)","q^(-4)+q^(-3)-q^(-2)-q^(-1)" +"(4,11,3,11)","-(1/(q^6*t))-1/(q^5*t)+1/(q^4*t)+1/(q^3*t)" +"(4,12,3,11)","t^(-1)-1/(q^3*t)-1/(q^2*t)+1/(q*t)" +"(4,11,3,12)","q^(-8)+q^(-7)-2/q^5-q^(-4)+q^(-3)" +"(4,12,3,12)","q^(-4)+q^(-3)-q^(-2)-q^(-1)" +"(4,13,3,13)","1/(q^7*t)-1/(q^5*t)-1/(q^4*t)+1/(q^2*t)" +"(4,14,3,14)","-1-q^(-5)+q^(-3)+q^(-2)" +"(4,15,3,15)","-1-q^(-5)+q^(-3)+q^(-2)+1/(q^7*t)-1/(q^5*t)-1/(q^4*t)+1/(q^2*t)" +"(4,4,4,4)","q^(-3)" +"(4,5,4,5)","-(1/(q^4*t))" +"(4,6,4,6)","q^(-3)" +"(4,7,4,7)","-(1/(q^4*t))" +"(4,8,4,7)","1/(q^2*t)" +"(4,7,4,8)","-q^(-6)" +"(4,8,4,8)","-q^(-5)+q^(-3)+q^(-2)" +"(4,9,4,9)","1/(q^6*t)+1/(q^5*t)-1/(q^4*t)-1/(q^3*t)" +"(4,10,4,10)","-q^(-5)-q^(-4)+q^(-3)+q^(-2)" +"(4,11,4,11)","1/(q^6*t)+1/(q^5*t)-1/(q^4*t)-1/(q^3*t)" +"(4,12,4,11)","-t^(-1)+1/(q^3*t)+1/(q^2*t)-1/(q*t)" +"(4,11,4,12)","-q^(-8)-q^(-7)+q^(-6)+q^(-5)" +"(4,12,4,12)","q^(-6)-q^(-5)-2/q^4+q^(-2)+q^(-1)" +"(4,13,4,13)","-(1/(q^7*t))+1/(q^5*t)+1/(q^4*t)-1/(q^2*t)" +"(4,14,4,14)","q^(-6)-q^(-4)-q^(-3)+q^(-1)" +"(4,15,4,15)","1+q^(-5)-q^(-3)-q^(-2)-1/(q^7*t)+1/(q^5*t)+1/(q^4*t)-1/(q^2*t)" +"(4,5,5,4)","-(1/(q^4*t))" +"(4,7,5,6)","-(1/(q^4*t))" +"(4,8,5,6)","1/(q^2*t)" +"(4,9,5,8)","1/(q^6*t)+1/(q^5*t)-1/(q^4*t)-1/(q^3*t)" +"(4,11,5,10)","1/(q^6*t)+1/(q^5*t)-1/(q^4*t)-1/(q^3*t)" +"(4,12,5,10)","-t^(-1)+1/(q^3*t)+1/(q^2*t)-1/(q*t)" +"(4,13,5,12)","-(1/(q^7*t))+1/(q^5*t)+1/(q^4*t)-1/(q^2*t)" +"(4,15,5,14)","1+q^(-5)-q^(-3)-q^(-2)-1/(q^7*t)+1/(q^5*t)+1/(q^4*t)-1/(q^2*t)" +"(4,6,6,4)","-(t/q^5)" +"(4,7,6,5)","q^(-6)" +"(4,8,6,5)","-q^(-6)" +"(4,10,6,7)","-q^(-6)+q^(-4)" +"(4,10,6,8)","-(t/q^8)-t/q^7+t/q^5+t/q^4" +"(4,11,6,9)","q^(-8)+q^(-7)-q^(-6)-q^(-5)" +"(4,12,6,9)","q^(-8)+q^(-7)-q^(-6)-q^(-5)" +"(4,14,6,11)","q^(-8)+q^(-7)-q^(-6)-2/q^5-q^(-4)+q^(-3)+q^(-2)" +"(4,14,6,12)","-(t/q^10)-t/q^9+(2*t)/q^7+(2*t)/q^6-t/q^4-t/q^3" +"(4,15,6,13)","q^(-9)-q^(-7)-q^(-6)+q^(-4)-t/q^11+t/q^9+t/q^8-t/q^6" +"(4,7,7,4)","q^(-6)" +"(4,9,7,5)","1/(q^7*t)" +"(4,10,7,6)","q^(-4)" +"(4,11,7,7)","1/(q^7*t)" +"(4,12,7,7)","1/(q^4*t)" +"(4,11,7,8)","q^(-9)+q^(-8)+q^(-7)-q^(-6)-q^(-5)" +"(4,12,7,8)","q^(-4)" +"(4,13,7,9)","-(1/(q^9*t))-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(4,14,7,10)","-q^(-6)-q^(-5)+q^(-3)+q^(-2)" +"(4,15,7,11)","q^(-7)+q^(-6)-q^(-4)-q^(-3)-1/(q^9*t)-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(4,15,7,12)","q^(-11)+q^(-10)+q^(-9)-q^(-8)-2/q^7-q^(-6)+q^(-4)-t/q^8-t/q^7+t/q^5+t/q^4" +"(4,8,8,4)","q^(-6)" +"(4,9,8,5)","1/(q^7*t)" +"(4,10,8,6)","q^(-6)" +"(4,11,8,7)","1/(q^7*t)" +"(4,12,8,7)","1/(q^4*t)" +"(4,11,8,8)","q^(-9)" +"(4,12,8,8)","-q^(-8)-q^(-7)+q^(-6)+q^(-5)+q^(-4)" +"(4,13,8,9)","-(1/(q^9*t))-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(4,14,8,10)","-q^(-8)-q^(-7)+q^(-5)+q^(-4)" +"(4,15,8,11)","q^(-7)+q^(-6)-q^(-4)-q^(-3)-1/(q^9*t)-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(4,15,8,12)","q^(-11)+q^(-10)-q^(-8)-q^(-7)+t/q^11-t/q^9-(2*t)/q^8-t/q^7+t/q^6+t/q^5+t/q^4" +"(4,9,9,4)","-(1/(q^7*t))" +"(4,11,9,6)","-(1/(q^7*t))" +"(4,12,9,6)","-(1/(q^4*t))" +"(4,13,9,8)","1/(q^9*t)+1/(q^8*t)-1/(q^6*t)-1/(q^5*t)" +"(4,15,9,10)","-q^(-7)-q^(-6)+q^(-4)+q^(-3)+1/(q^9*t)+1/(q^8*t)-1/(q^6*t)-1/(q^5*t)" +"(4,10,10,4)","-(t/q^8)" +"(4,11,10,5)","-q^(-9)" +"(4,12,10,5)","-q^(-9)" +"(4,14,10,7)","-q^(-9)+q^(-6)" +"(4,14,10,8)","-(t/q^11)-t/q^10-t/q^9+t/q^8+t/q^7+t/q^6" +"(4,15,10,9)","-q^(-11)-q^(-10)+q^(-8)+q^(-7)+t/q^13+t/q^12-t/q^10-t/q^9" +"(4,11,11,4)","q^(-9)" +"(4,13,11,5)","1/(q^10*t)" +"(4,14,11,6)","-q^(-6)" +"(4,15,11,7)","-q^(-8)+1/(q^10*t)" +"(4,15,11,8)","q^(-12)+q^(-11)+q^(-10)-q^(-8)-q^(-7)-t/q^8" +"(4,12,12,4)","q^(-9)" +"(4,13,12,5)","-(1/(q^10*t))" +"(4,14,12,6)","q^(-9)" +"(4,15,12,7)","q^(-8)-1/(q^10*t)" +"(4,15,12,8)","-q^(-12)-t/q^13-t/q^12+t/q^10+t/q^9+t/q^8" +"(4,13,13,4)","-(1/(q^10*t))" +"(4,15,13,6)","q^(-8)-1/(q^10*t)" +"(4,14,14,4)","-(t/q^11)" +"(4,15,14,5)","q^(-12)-t/q^14" +"(4,15,15,4)","q^(-12)" +"(5,0,0,5)","1" +"(5,2,0,7)","1" +"(5,2,0,8)","t/q^2" +"(5,4,0,9)","1-q^(-2)" +"(5,6,0,11)","1-q^(-2)" +"(5,6,0,12)","t/q^4-t/q^2" +"(5,8,0,13)","1+q^(-3)-q^(-2)-q^(-1)" +"(5,10,0,15)","1+q^(-3)-q^(-2)-q^(-1)" +"(5,1,1,5)","1/(q*t)" +"(5,3,1,7)","1/(q*t)" +"(5,4,1,7)","t^(-1)" +"(5,3,1,8)","q^(-3)" +"(5,4,1,8)","q^(-2)" +"(5,5,1,9)","-(1/(q^3*t))+1/(q*t)" +"(5,7,1,11)","-(1/(q^3*t))+1/(q*t)" +"(5,8,1,11)","1/(q*t)-q/t" +"(5,7,1,12)","q^(-5)-q^(-3)" +"(5,8,1,12)","-q^(-3)+q^(-1)" +"(5,9,1,13)","1/(q^4*t)-1/(q^3*t)-1/(q^2*t)+1/(q*t)" +"(5,11,1,15)","1/(q^4*t)-1/(q^3*t)-1/(q^2*t)+1/(q*t)" +"(5,12,1,15)","-t^(-1)+1/(q*t)-q/t+q^2/t" +"(5,2,2,5)","-(t/q^2)" +"(5,6,2,9)","-(t/q^4)+t/q^2" +"(5,10,2,13)","-(t/q^5)+t/q^4+t/q^3-t/q^2" +"(5,3,3,5)","-q^(-3)" +"(5,6,3,7)","q^(-2)" +"(5,6,3,8)","t/q^4" +"(5,7,3,9)","-q^(-5)+q^(-3)" +"(5,8,3,9)","-q^(-4)+q^(-2)" +"(5,10,3,11)","-q^(-4)-q^(-3)+q^(-2)+q^(-1)" +"(5,10,3,12)","t/q^6+t/q^5-t/q^4-t/q^3" +"(5,11,3,13)","-q^(-6)+q^(-5)+q^(-4)-q^(-3)" +"(5,12,3,13)","q^(-5)-2/q^3+q^(-1)" +"(5,14,3,15)","1+q^(-5)-q^(-3)-q^(-2)" +"(5,4,4,5)","-q^(-3)" +"(5,6,4,7)","-q^(-3)" +"(5,6,4,8)","-(t/q^5)" +"(5,8,4,9)","q^(-5)+q^(-4)-q^(-3)-q^(-2)" +"(5,10,4,11)","q^(-5)+q^(-4)-q^(-3)-q^(-2)" +"(5,10,4,12)","-(t/q^7)-t/q^6+t/q^5+t/q^4" +"(5,12,4,13)","-q^(-6)+q^(-4)+q^(-3)-q^(-1)" +"(5,14,4,15)","-q^(-6)+q^(-4)+q^(-3)-q^(-1)" +"(5,5,5,5)","-(1/(q^4*t))" +"(5,7,5,7)","-(1/(q^4*t))" +"(5,8,5,7)","1/(q^2*t)" +"(5,7,5,8)","-q^(-6)" +"(5,8,5,8)","q^(-4)" +"(5,9,5,9)","1/(q^6*t)+1/(q^5*t)-1/(q^4*t)-1/(q^3*t)" +"(5,11,5,11)","1/(q^6*t)+1/(q^5*t)-1/(q^4*t)-1/(q^3*t)" +"(5,12,5,11)","-t^(-1)+1/(q^3*t)+1/(q^2*t)-1/(q*t)" +"(5,11,5,12)","-q^(-8)-q^(-7)+q^(-6)+q^(-5)" +"(5,12,5,12)","-q^(-5)-q^(-4)+q^(-3)+q^(-2)" +"(5,13,5,13)","-(1/(q^7*t))+1/(q^5*t)+1/(q^4*t)-1/(q^2*t)" +"(5,15,5,15)","1+q^(-5)-q^(-3)-q^(-2)-1/(q^7*t)+1/(q^5*t)+1/(q^4*t)-1/(q^2*t)" +"(5,6,6,5)","t/q^5" +"(5,10,6,9)","t/q^7+t/q^6-t/q^5-t/q^4" +"(5,14,6,13)","t/q^8-t/q^6-t/q^5+t/q^3" +"(5,7,7,5)","q^(-6)" +"(5,10,7,7)","q^(-4)" +"(5,10,7,8)","t/q^6" +"(5,11,7,9)","q^(-8)+q^(-7)-q^(-6)-q^(-5)" +"(5,12,7,9)","-q^(-6)+q^(-4)" +"(5,14,7,11)","-q^(-6)-q^(-5)+q^(-3)+q^(-2)" +"(5,14,7,12)","t/q^8+t/q^7-t/q^5-t/q^4" +"(5,15,7,13)","q^(-9)-q^(-7)-q^(-6)+q^(-4)+t/q^9-t/q^7-t/q^6+t/q^4" +"(5,8,8,5)","q^(-6)" +"(5,10,8,7)","q^(-6)" +"(5,10,8,8)","t/q^8" +"(5,12,8,9)","-q^(-8)-q^(-7)+q^(-5)+q^(-4)" +"(5,14,8,11)","-q^(-8)-q^(-7)+q^(-5)+q^(-4)" +"(5,14,8,12)","t/q^10+t/q^9-t/q^7-t/q^6" +"(5,15,8,13)","t/q^11-t/q^8-t/q^7+t/q^4" +"(5,9,9,5)","1/(q^7*t)" +"(5,11,9,7)","1/(q^7*t)" +"(5,12,9,7)","1/(q^4*t)" +"(5,11,9,8)","q^(-9)" +"(5,12,9,8)","q^(-6)" +"(5,13,9,9)","-(1/(q^9*t))-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(5,15,9,11)","q^(-7)+q^(-6)-q^(-4)-q^(-3)-1/(q^9*t)-1/(q^8*t)+1/(q^6*t)+1/(q^5*t)" +"(5,15,9,12)","q^(-11)+q^(-10)-q^(-8)-q^(-7)-t/q^9-t/q^8+t/q^6+t/q^5" +"(5,10,10,5)","-(t/q^8)" +"(5,14,10,9)","-(t/q^10)-t/q^9+t/q^7+t/q^6" +"(5,11,11,5)","-q^(-9)" +"(5,14,11,7)","q^(-6)" +"(5,14,11,8)","t/q^8" +"(5,15,11,9)","-q^(-11)-q^(-10)+q^(-8)+q^(-7)-t/q^10+t/q^8" +"(5,12,12,5)","-q^(-9)" +"(5,14,12,7)","-q^(-9)" +"(5,14,12,8)","-(t/q^11)" +"(5,15,12,9)","t/q^13+t/q^12-t/q^9-t/q^8" +"(5,13,13,5)","-(1/(q^10*t))" +"(5,15,13,7)","q^(-8)-1/(q^10*t)" +"(5,15,13,8)","-q^(-12)+t/q^10" +"(5,14,14,5)","t/q^11" +"(5,15,15,5)","q^(-12)" +"(6,0,0,6)","1" +"(6,1,0,7)","t^(-1)" +"(6,1,0,8)","1" +"(6,3,0,10)","1-q^(-2)" +"(6,5,0,11)","1/(q*t)-q/t" +"(6,5,0,12)","1-q^(-2)" +"(6,7,0,14)","1+q^(-3)-q^(-2)-q^(-1)" +"(6,9,0,15)","-t^(-1)+1/(q*t)-q/t+q^2/t" +"(6,1,1,6)","-t^(-1)" +"(6,5,1,10)","-(1/(q*t))+q/t" +"(6,9,1,14)","t^(-1)-1/(q*t)+q/t-q^2/t" +"(6,2,2,6)","t/q^2" +"(6,3,2,7)","q^(-2)" +"(6,4,2,7)","q^(-2)" +"(6,3,2,8)","t/q^2" +"(6,4,2,8)","t/q^2" +"(6,6,2,10)","-(t/q^4)+t/q^2" +"(6,7,2,11)","-q^(-3)+q^(-1)" +"(6,8,2,11)","q^(-3)-q^(-1)" +"(6,7,2,12)","t/q^4-t/q^2" +"(6,8,2,12)","-(t/q^4)+t/q^2" +"(6,10,2,14)","t/q^5-t/q^4-t/q^3+t/q^2" +"(6,11,2,15)","1+q^(-3)-q^(-2)-q^(-1)" +"(6,12,2,15)","1+q^(-3)-q^(-2)-q^(-1)" +"(6,3,3,6)","-q^(-2)" +"(6,5,3,7)","-(1/(q^2*t))" +"(6,5,3,8)","-q^(-2)" +"(6,7,3,10)","q^(-4)+q^(-3)-q^(-2)-q^(-1)" +"(6,9,3,11)","t^(-1)-1/(q^3*t)-1/(q^2*t)+1/(q*t)" +"(6,9,3,12)","q^(-4)+q^(-3)-q^(-2)-q^(-1)" +"(6,11,3,14)","-1-q^(-5)+q^(-3)+q^(-2)" +"(6,13,3,15)","t^(-1)-1/(q^3*t)+1/(q*t)-q^2/t" +"(6,4,4,6)","-q^(-2)" +"(6,5,4,7)","1/(q^2*t)" +"(6,5,4,8)","q^(-2)" +"(6,7,4,10)","-q^(-4)+q^(-2)" +"(6,8,4,10)","-q^(-3)+q^(-1)" +"(6,9,4,11)","-t^(-1)+1/(q^3*t)+1/(q^2*t)-1/(q*t)" +"(6,9,4,12)","-q^(-4)-q^(-3)+q^(-2)+q^(-1)" +"(6,11,4,14)","q^(-5)-2/q^3+q^(-1)" +"(6,12,4,14)","-1-q^(-3)+q^(-2)+q^(-1)" +"(6,13,4,15)","-t^(-1)+1/(q^3*t)-1/(q*t)+q^2/t" +"(6,5,5,6)","1/(q^2*t)" +"(6,9,5,10)","-t^(-1)+1/(q^3*t)+1/(q^2*t)-1/(q*t)" +"(6,13,5,14)","-t^(-1)+1/(q^3*t)-1/(q*t)+q^2/t" +"(6,6,6,6)","-(t/q^4)" +"(6,7,6,7)","q^(-4)" +"(6,8,6,7)","-q^(-4)" +"(6,7,6,8)","t/q^4" +"(6,8,6,8)","-(t/q^4)" +"(6,10,6,10)","t/q^6+t/q^5-t/q^4-t/q^3" +"(6,11,6,11)","-q^(-5)-q^(-4)+q^(-3)+q^(-2)" +"(6,12,6,11)","-q^(-5)-q^(-4)+q^(-3)+q^(-2)" +"(6,11,6,12)","t/q^6+t/q^5-t/q^4-t/q^3" +"(6,12,6,12)","t/q^6+t/q^5-t/q^4-t/q^3" +"(6,14,6,14)","-(t/q^7)+t/q^5+t/q^4-t/q^2" +"(6,15,6,15)","1+q^(-5)-q^(-3)-q^(-2)-t/q^7+t/q^5+t/q^4-t/q^2" +"(6,7,7,6)","q^(-4)" +"(6,9,7,7)","1/(q^4*t)" +"(6,9,7,8)","q^(-4)" +"(6,11,7,10)","-q^(-6)-q^(-5)+q^(-3)+q^(-2)" +"(6,13,7,11)","1/(q^5*t)+1/(q^4*t)-1/(q^2*t)-1/(q*t)" +"(6,13,7,12)","-q^(-6)-q^(-5)+q^(-3)+q^(-2)" +"(6,15,7,14)","1+q^(-7)-q^(-4)-q^(-3)" +"(6,8,8,6)","q^(-4)" +"(6,9,8,7)","1/(q^4*t)" +"(6,9,8,8)","q^(-4)" +"(6,11,8,10)","-q^(-6)+q^(-4)" +"(6,12,8,10)","q^(-5)+q^(-4)-q^(-3)-q^(-2)" +"(6,13,8,11)","1/(q^5*t)+1/(q^4*t)-1/(q^2*t)-1/(q*t)" +"(6,13,8,12)","-q^(-6)-q^(-5)+q^(-3)+q^(-2)" +"(6,15,8,14)","q^(-7)-q^(-5)-q^(-4)+q^(-2)+t/q^7-t/q^5-t/q^4+t/q^2" +"(6,9,9,6)","-(1/(q^4*t))" +"(6,13,9,10)","-(1/(q^5*t))-1/(q^4*t)+1/(q^2*t)+1/(q*t)" +"(6,10,10,6)","t/q^6" +"(6,11,10,7)","q^(-6)" +"(6,12,10,7)","q^(-6)" +"(6,11,10,8)","t/q^6" +"(6,12,10,8)","t/q^6" +"(6,14,10,10)","-(t/q^8)-t/q^7+t/q^5+t/q^4" +"(6,15,10,11)","-q^(-7)-q^(-6)+q^(-4)+q^(-3)+t/q^9+t/q^8-t/q^6-t/q^5" +"(6,15,10,12)","t/q^8+t/q^7-t/q^5-t/q^4-t^2/q^10-t^2/q^9+t^2/q^7+t^2/q^6" +"(6,11,11,6)","-q^(-6)" +"(6,13,11,7)","-(1/(q^6*t))" +"(6,13,11,8)","-q^(-6)" +"(6,15,11,10)","q^(-8)+q^(-7)-q^(-4)-q^(-3)" +"(6,12,12,6)","-q^(-6)" +"(6,13,12,7)","1/(q^6*t)" +"(6,13,12,8)","q^(-6)" +"(6,15,12,10)","-q^(-8)+q^(-6)-t/q^9-t/q^8+t/q^6+t/q^5" +"(6,13,13,6)","1/(q^6*t)" +"(6,14,14,6)","-(t/q^8)" +"(6,15,14,7)","q^(-8)-t/q^10" +"(6,15,14,8)","t/q^8-t^2/q^10" +"(6,15,15,6)","q^(-8)" +"(7,0,0,7)","1" +"(7,1,0,9)","1" +"(7,2,0,10)","-(t/q^2)" +"(7,3,0,11)","1" +"(7,4,0,11)","q^(-1)" +"(7,3,0,12)","-(t/q^2)" +"(7,4,0,12)","-(t/q^2)" +"(7,5,0,13)","1-q^(-1)" +"(7,6,0,14)","t/q^3-t/q^2" +"(7,7,0,15)","1-q^(-1)" +"(7,8,0,15)","-1+q^(-1)" +"(7,1,1,7)","t^(-1)" +"(7,3,1,10)","-q^(-2)" +"(7,4,1,10)","-q^(-1)" +"(7,5,1,11)","1/(q*t)-q/t" +"(7,5,1,12)","-q^(-2)+q^(-1)" +"(7,7,1,14)","q^(-3)-q^(-2)" +"(7,8,1,14)","1-q^(-1)" +"(7,9,1,15)","-t^(-1)+1/(q*t)-q/t+q^2/t" +"(7,2,2,7)","t/q^2" +"(7,3,2,9)","t/q^2" +"(7,4,2,9)","t/q^2" +"(7,6,2,11)","-(t/q^3)+t/q^2" +"(7,7,2,13)","t/q^3-t/q^2" +"(7,8,2,13)","-(t/q^3)+t/q^2" +"(7,3,3,7)","q^(-2)" +"(7,5,3,9)","q^(-2)" +"(7,6,3,10)","t/q^3" +"(7,7,3,11)","-q^(-3)+q^(-2)+q^(-1)" +"(7,8,3,11)","-q^(-2)" +"(7,7,3,12)","-(t/q^3)" +"(7,8,3,12)","t/q^3" +"(7,9,3,13)","-q^(-3)+q^(-1)" +"(7,10,3,14)","-(t/q^4)+t/q^2" +"(7,11,3,15)","1-q^(-2)" +"(7,12,3,15)","1-q^(-2)" +"(7,4,4,7)","q^(-2)" +"(7,5,4,9)","-q^(-2)" +"(7,6,4,10)","-(t/q^4)" +"(7,7,4,11)","-q^(-2)" +"(7,8,4,11)","q^(-3)+q^(-2)-q^(-1)" +"(7,7,4,12)","t/q^4" +"(7,8,4,12)","-(t/q^4)" +"(7,9,4,13)","q^(-3)-q^(-1)" +"(7,10,4,14)","t/q^5-t/q^3" +"(7,11,4,15)","q^(-3)-q^(-1)" +"(7,12,4,15)","q^(-3)-q^(-1)" +"(7,5,5,7)","1/(q^2*t)" +"(7,7,5,10)","-q^(-4)" +"(7,8,5,10)","q^(-2)" +"(7,9,5,11)","-t^(-1)+1/(q^3*t)+1/(q^2*t)-1/(q*t)" +"(7,9,5,12)","-q^(-4)+q^(-2)" +"(7,11,5,14)","q^(-5)-q^(-3)" +"(7,12,5,14)","-1+q^(-2)" +"(7,13,5,15)","-t^(-1)+1/(q^3*t)-1/(q*t)+q^2/t" +"(7,6,6,7)","t/q^4" +"(7,7,6,9)","-(t/q^4)" +"(7,8,6,9)","t/q^4" +"(7,10,6,11)","-(t/q^5)+t/q^3" +"(7,11,6,13)","-(t/q^5)+t/q^3" +"(7,12,6,13)","-(t/q^5)+t/q^3" +"(7,7,7,7)","q^(-4)" +"(7,9,7,9)","q^(-4)" +"(7,10,7,10)","-(t/q^4)" +"(7,11,7,11)","-q^(-5)+q^(-3)+q^(-2)" +"(7,12,7,11)","q^(-3)" +"(7,11,7,12)","-(t/q^4)" +"(7,12,7,12)","-(t/q^4)" +"(7,13,7,13)","-q^(-5)+q^(-2)" +"(7,14,7,14)","t/q^5-t/q^2" +"(7,15,7,15)","1-q^(-3)+t/q^5-t/q^2" +"(7,8,8,7)","q^(-4)" +"(7,9,8,9)","q^(-4)" +"(7,10,8,10)","-(t/q^6)" +"(7,11,8,11)","q^(-4)" +"(7,12,8,11)","q^(-5)+q^(-4)-q^(-2)" +"(7,11,8,12)","-(t/q^6)" +"(7,12,8,12)","-(t/q^6)" +"(7,13,8,13)","-q^(-5)+q^(-2)" +"(7,14,8,14)","t/q^7-t/q^4" +"(7,15,8,15)","-q^(-5)+q^(-2)+t/q^7-t/q^4" +"(7,9,9,7)","1/(q^4*t)" +"(7,11,9,10)","-q^(-6)" +"(7,12,9,10)","-q^(-3)" +"(7,13,9,11)","1/(q^5*t)+1/(q^4*t)-1/(q^2*t)-1/(q*t)" +"(7,13,9,12)","-q^(-6)+q^(-3)" +"(7,15,9,14)","q^(-7)-q^(-4)-t/q^5+t/q^2" +"(7,10,10,7)","t/q^6" +"(7,11,10,9)","t/q^6" +"(7,12,10,9)","t/q^6" +"(7,14,10,11)","-(t/q^7)+t/q^4" +"(7,15,10,13)","t/q^7-t/q^4-t^2/q^9+t^2/q^6" +"(7,11,11,7)","q^(-6)" +"(7,13,11,9)","q^(-6)" +"(7,14,11,10)","t/q^5" +"(7,15,11,11)","-q^(-7)+q^(-4)+q^(-3)-t/q^6" +"(7,15,11,12)","-(t/q^5)+t^2/q^7" +"(7,12,12,7)","q^(-6)" +"(7,13,12,9)","-q^(-6)" +"(7,14,12,10)","-(t/q^8)" +"(7,15,12,11)","-q^(-6)+t/q^9+t/q^8-t/q^5" +"(7,15,12,12)","t/q^8-t^2/q^10" +"(7,13,13,7)","1/(q^6*t)" +"(7,15,13,10)","-q^(-8)+t/q^6" +"(7,14,14,7)","t/q^8" +"(7,15,14,9)","-(t/q^8)+t^2/q^10" +"(7,15,15,7)","q^(-8)" +"(8,0,0,8)","1" +"(8,1,0,9)","-t^(-1)" +"(8,2,0,10)","1" +"(8,3,0,11)","-t^(-1)" +"(8,4,0,11)","-(q/t)" +"(8,3,0,12)","q^(-2)" +"(8,4,0,12)","1" +"(8,5,0,13)","-t^(-1)+1/(q*t)" +"(8,6,0,14)","1-q^(-1)" +"(8,7,0,15)","-t^(-1)+1/(q*t)" +"(8,8,0,15)","-(q/t)+q^2/t" +"(8,1,1,8)","t^(-1)" +"(8,3,1,10)","t^(-1)" +"(8,4,1,10)","q/t" +"(8,5,1,12)","t^(-1)-1/(q*t)" +"(8,7,1,14)","t^(-1)-1/(q*t)" +"(8,8,1,14)","q/t-q^2/t" +"(8,2,2,8)","t/q^2" +"(8,3,2,9)","-q^(-2)" +"(8,4,2,9)","-q^(-2)" +"(8,6,2,11)","-q^(-2)+q^(-1)" +"(8,6,2,12)","t/q^4-t/q^2" +"(8,7,2,13)","-q^(-3)+q^(-2)" +"(8,8,2,13)","q^(-3)-q^(-2)" +"(8,10,2,15)","1+q^(-3)-q^(-2)-q^(-1)" +"(8,3,3,8)","q^(-2)" +"(8,5,3,9)","-(1/(q^2*t))" +"(8,6,3,10)","-q^(-1)" +"(8,7,3,11)","-(1/(q^2*t))" +"(8,8,3,11)","t^(-1)" +"(8,7,3,12)","q^(-4)+q^(-3)-q^(-2)" +"(8,8,3,12)","-q^(-1)" +"(8,9,3,13)","1/(q^3*t)-1/(q*t)" +"(8,10,3,14)","-1+q^(-2)" +"(8,11,3,15)","1/(q^3*t)-1/(q*t)" +"(8,12,3,15)","t^(-1)-q^2/t" +"(8,4,4,8)","q^(-2)" +"(8,5,4,9)","1/(q^2*t)" +"(8,6,4,10)","q^(-2)" +"(8,7,4,11)","1/(q^2*t)" +"(8,8,4,11)","-t^(-1)" +"(8,7,4,12)","-q^(-4)" +"(8,8,4,12)","-q^(-3)+q^(-2)+q^(-1)" +"(8,9,4,13)","-(1/(q^3*t))+1/(q*t)" +"(8,10,4,14)","-q^(-3)+q^(-1)" +"(8,11,4,15)","-(1/(q^3*t))+1/(q*t)" +"(8,12,4,15)","-t^(-1)+q^2/t" +"(8,5,5,8)","1/(q^2*t)" +"(8,7,5,10)","1/(q^2*t)" +"(8,8,5,10)","-t^(-1)" +"(8,9,5,12)","-(1/(q^3*t))+1/(q*t)" +"(8,11,5,14)","-(1/(q^3*t))+1/(q*t)" +"(8,12,5,14)","-t^(-1)+q^2/t" +"(8,6,6,8)","t/q^4" +"(8,7,6,9)","q^(-4)" +"(8,8,6,9)","-q^(-4)" +"(8,10,6,11)","-q^(-4)+q^(-2)" +"(8,10,6,12)","t/q^6+t/q^5-t/q^4-t/q^3" +"(8,11,6,13)","q^(-5)-q^(-3)" +"(8,12,6,13)","q^(-5)-q^(-3)" +"(8,14,6,15)","1+q^(-5)-q^(-3)-q^(-2)" +"(8,7,7,8)","q^(-4)" +"(8,9,7,9)","-(1/(q^4*t))" +"(8,10,7,10)","q^(-2)" +"(8,11,7,11)","-(1/(q^4*t))" +"(8,12,7,11)","-(1/(q*t))" +"(8,11,7,12)","q^(-6)+q^(-5)-q^(-3)" +"(8,12,7,12)","q^(-2)" +"(8,13,7,13)","1/(q^5*t)-1/(q^2*t)" +"(8,14,7,14)","1-q^(-3)" +"(8,15,7,15)","1-q^(-3)+1/(q^5*t)-1/(q^2*t)" +"(8,8,8,8)","q^(-4)" +"(8,9,8,9)","-(1/(q^4*t))" +"(8,10,8,10)","q^(-4)" +"(8,11,8,11)","-(1/(q^4*t))" +"(8,12,8,11)","-(1/(q*t))" +"(8,11,8,12)","q^(-6)" +"(8,12,8,12)","-q^(-5)+q^(-3)+q^(-2)" +"(8,13,8,13)","1/(q^5*t)-1/(q^2*t)" +"(8,14,8,14)","-q^(-5)+q^(-2)" +"(8,15,8,15)","1-q^(-3)+1/(q^5*t)-1/(q^2*t)" +"(8,9,9,8)","1/(q^4*t)" +"(8,11,9,10)","1/(q^4*t)" +"(8,12,9,10)","1/(q*t)" +"(8,13,9,12)","-(1/(q^5*t))+1/(q^2*t)" +"(8,15,9,14)","-1+q^(-3)-1/(q^5*t)+1/(q^2*t)" +"(8,10,10,8)","t/q^6" +"(8,11,10,9)","-q^(-6)" +"(8,12,10,9)","-q^(-6)" +"(8,14,10,11)","-q^(-6)+q^(-3)" +"(8,14,10,12)","t/q^8+t/q^7-t/q^5-t/q^4" +"(8,15,10,13)","-q^(-7)+q^(-4)+t/q^9-t/q^6" +"(8,11,11,8)","q^(-6)" +"(8,13,11,9)","-(1/(q^6*t))" +"(8,14,11,10)","-q^(-3)" +"(8,15,11,11)","q^(-4)-1/(q^6*t)" +"(8,15,11,12)","q^(-8)+q^(-7)-q^(-4)-t/q^5" +"(8,12,12,8)","q^(-6)" +"(8,13,12,9)","1/(q^6*t)" +"(8,14,12,10)","q^(-6)" +"(8,15,12,11)","-q^(-4)+1/(q^6*t)" +"(8,15,12,12)","-q^(-8)-t/q^9+t/q^6+t/q^5" +"(8,13,13,8)","1/(q^6*t)" +"(8,15,13,10)","-q^(-4)+1/(q^6*t)" +"(8,14,14,8)","t/q^8" +"(8,15,14,9)","q^(-8)-t/q^10" +"(8,15,15,8)","q^(-8)" +"(9,0,0,9)","1" +"(9,2,0,11)","1" +"(9,2,0,12)","-(t/q^2)" +"(9,4,0,13)","1-q^(-1)" +"(9,6,0,15)","1-q^(-1)" +"(9,1,1,9)","-t^(-1)" +"(9,3,1,11)","-t^(-1)" +"(9,4,1,11)","-(q/t)" +"(9,3,1,12)","q^(-2)" +"(9,4,1,12)","q^(-1)" +"(9,5,1,13)","-t^(-1)+1/(q*t)" +"(9,7,1,15)","-t^(-1)+1/(q*t)" +"(9,8,1,15)","-(q/t)+q^2/t" +"(9,2,2,9)","t/q^2" +"(9,6,2,13)","t/q^3-t/q^2" +"(9,3,3,9)","-q^(-2)" +"(9,6,3,11)","q^(-1)" +"(9,6,3,12)","-(t/q^3)" +"(9,7,3,13)","-q^(-3)+q^(-2)" +"(9,8,3,13)","-q^(-2)+q^(-1)" +"(9,10,3,15)","1-q^(-2)" +"(9,4,4,9)","-q^(-2)" +"(9,6,4,11)","-q^(-2)" +"(9,6,4,12)","t/q^4" +"(9,8,4,13)","q^(-3)-q^(-1)" +"(9,10,4,15)","q^(-3)-q^(-1)" +"(9,5,5,9)","1/(q^2*t)" +"(9,7,5,11)","1/(q^2*t)" +"(9,8,5,11)","-t^(-1)" +"(9,7,5,12)","-q^(-4)" +"(9,8,5,12)","q^(-2)" +"(9,9,5,13)","-(1/(q^3*t))+1/(q*t)" +"(9,11,5,15)","-(1/(q^3*t))+1/(q*t)" +"(9,12,5,15)","-t^(-1)+q^2/t" +"(9,6,6,9)","-(t/q^4)" +"(9,10,6,13)","-(t/q^5)+t/q^3" +"(9,7,7,9)","q^(-4)" +"(9,10,7,11)","q^(-2)" +"(9,10,7,12)","-(t/q^4)" +"(9,11,7,13)","q^(-5)-q^(-3)" +"(9,12,7,13)","-q^(-3)+q^(-2)" +"(9,14,7,15)","1-q^(-3)" +"(9,8,8,9)","q^(-4)" +"(9,10,8,11)","q^(-4)" +"(9,10,8,12)","-(t/q^6)" +"(9,12,8,13)","-q^(-5)+q^(-2)" +"(9,14,8,15)","-q^(-5)+q^(-2)" +"(9,9,9,9)","-(1/(q^4*t))" +"(9,11,9,11)","-(1/(q^4*t))" +"(9,12,9,11)","-(1/(q*t))" +"(9,11,9,12)","q^(-6)" +"(9,12,9,12)","q^(-3)" +"(9,13,9,13)","1/(q^5*t)-1/(q^2*t)" +"(9,15,9,15)","1-q^(-3)+1/(q^5*t)-1/(q^2*t)" +"(9,10,10,9)","t/q^6" +"(9,14,10,13)","t/q^7-t/q^4" +"(9,11,11,9)","-q^(-6)" +"(9,14,11,11)","q^(-3)" +"(9,14,11,12)","-(t/q^5)" +"(9,15,11,13)","-q^(-7)+q^(-4)-t/q^6+t/q^5" +"(9,12,12,9)","-q^(-6)" +"(9,14,12,11)","-q^(-6)" +"(9,14,12,12)","t/q^8" +"(9,15,12,13)","t/q^9-t/q^5" +"(9,13,13,9)","1/(q^6*t)" +"(9,15,13,11)","-q^(-4)+1/(q^6*t)" +"(9,15,13,12)","-q^(-8)+t/q^6" +"(9,14,14,9)","-(t/q^8)" +"(9,15,15,9)","q^(-8)" +"(10,0,0,10)","1" +"(10,1,0,11)","-(q/t)" +"(10,1,0,12)","1" +"(10,3,0,14)","1-q^(-1)" +"(10,5,0,15)","-(q/t)+q^2/t" +"(10,1,1,10)","q/t" +"(10,5,1,14)","q/t-q^2/t" +"(10,2,2,10)","-(t/q^2)" +"(10,3,2,11)","q^(-1)" +"(10,4,2,11)","q^(-1)" +"(10,3,2,12)","-(t/q^2)" +"(10,4,2,12)","-(t/q^2)" +"(10,6,2,14)","t/q^3-t/q^2" +"(10,7,2,15)","1-q^(-1)" +"(10,8,2,15)","-1+q^(-1)" +"(10,3,3,10)","-q^(-1)" +"(10,5,3,11)","t^(-1)" +"(10,5,3,12)","-q^(-1)" +"(10,7,3,14)","-1+q^(-2)" +"(10,9,3,15)","t^(-1)-q^2/t" +"(10,4,4,10)","-q^(-1)" +"(10,5,4,11)","-t^(-1)" +"(10,5,4,12)","q^(-1)" +"(10,7,4,14)","-q^(-2)+q^(-1)" +"(10,8,4,14)","1-q^(-1)" +"(10,9,4,15)","-t^(-1)+q^2/t" +"(10,5,5,10)","-t^(-1)" +"(10,9,5,14)","-t^(-1)+q^2/t" +"(10,6,6,10)","t/q^3" +"(10,7,6,11)","q^(-2)" +"(10,8,6,11)","-q^(-2)" +"(10,7,6,12)","-(t/q^3)" +"(10,8,6,12)","t/q^3" +"(10,10,6,14)","-(t/q^4)+t/q^2" +"(10,11,6,15)","1-q^(-2)" +"(10,12,6,15)","1-q^(-2)" +"(10,7,7,10)","q^(-2)" +"(10,9,7,11)","-(1/(q*t))" +"(10,9,7,12)","q^(-2)" +"(10,11,7,14)","1-q^(-3)" +"(10,13,7,15)","-(1/(q*t))+q^2/t" +"(10,8,8,10)","q^(-2)" +"(10,9,8,11)","-(1/(q*t))" +"(10,9,8,12)","q^(-2)" +"(10,11,8,14)","-q^(-3)+q^(-2)" +"(10,12,8,14)","-1+q^(-2)" +"(10,13,8,15)","-(1/(q*t))+q^2/t" +"(10,9,9,10)","1/(q*t)" +"(10,13,9,14)","1/(q*t)-q^2/t" +"(10,10,10,10)","-(t/q^4)" +"(10,11,10,11)","q^(-3)" +"(10,12,10,11)","q^(-3)" +"(10,11,10,12)","-(t/q^4)" +"(10,12,10,12)","-(t/q^4)" +"(10,14,10,14)","t/q^5-t/q^2" +"(10,15,10,15)","1-q^(-3)+t/q^5-t/q^2" +"(10,11,11,10)","-q^(-3)" +"(10,13,11,11)","1/(q^2*t)" +"(10,13,11,12)","-q^(-3)" +"(10,15,11,14)","-1+q^(-4)" +"(10,12,12,10)","-q^(-3)" +"(10,13,12,11)","-(1/(q^2*t))" +"(10,13,12,12)","q^(-3)" +"(10,15,12,14)","-q^(-4)+q^(-3)-t/q^5+t/q^2" +"(10,13,13,10)","-(1/(q^2*t))" +"(10,14,14,10)","t/q^5" +"(10,15,14,11)","q^(-4)-t/q^6" +"(10,15,14,12)","-(t/q^5)+t^2/q^7" +"(10,15,15,10)","q^(-4)" +"(11,0,0,11)","1" +"(11,1,0,13)","1" +"(11,2,0,14)","t/q^2" +"(11,3,0,15)","1" +"(11,4,0,15)","1" +"(11,1,1,11)","-(q/t)" +"(11,3,1,14)","-q^(-1)" +"(11,4,1,14)","-1" +"(11,5,1,15)","-(q/t)+q^2/t" +"(11,2,2,11)","-(t/q^2)" +"(11,3,2,13)","-(t/q^2)" +"(11,4,2,13)","-(t/q^2)" +"(11,3,3,11)","q^(-1)" +"(11,5,3,13)","q^(-1)" +"(11,6,3,14)","-(t/q^2)" +"(11,7,3,15)","1" +"(11,8,3,15)","-1" +"(11,4,4,11)","q^(-1)" +"(11,5,4,13)","-q^(-1)" +"(11,6,4,14)","t/q^3" +"(11,7,4,15)","-q^(-1)" +"(11,8,4,15)","q^(-1)" +"(11,5,5,11)","-t^(-1)" +"(11,7,5,14)","-q^(-2)" +"(11,8,5,14)","1" +"(11,9,5,15)","-t^(-1)+q^2/t" +"(11,6,6,11)","-(t/q^3)" +"(11,7,6,13)","t/q^3" +"(11,8,6,13)","-(t/q^3)" +"(11,7,7,11)","q^(-2)" +"(11,9,7,13)","q^(-2)" +"(11,10,7,14)","t/q^2" +"(11,11,7,15)","1" +"(11,12,7,15)","1" +"(11,8,8,11)","q^(-2)" +"(11,9,8,13)","q^(-2)" +"(11,10,8,14)","t/q^4" +"(11,11,8,15)","q^(-2)" +"(11,12,8,15)","q^(-2)" +"(11,9,9,11)","-(1/(q*t))" +"(11,11,9,14)","-q^(-3)" +"(11,12,9,14)","-1" +"(11,13,9,15)","-(1/(q*t))+q^2/t" +"(11,10,10,11)","-(t/q^4)" +"(11,11,10,13)","-(t/q^4)" +"(11,12,10,13)","-(t/q^4)" +"(11,11,11,11)","q^(-3)" +"(11,13,11,13)","q^(-3)" +"(11,14,11,14)","-(t/q^2)" +"(11,15,11,15)","1-t/q^2" +"(11,12,12,11)","q^(-3)" +"(11,13,12,13)","-q^(-3)" +"(11,14,12,14)","t/q^5" +"(11,15,12,15)","-q^(-3)+t/q^5" +"(11,13,13,11)","-(1/(q^2*t))" +"(11,15,13,14)","-q^(-4)+t/q^2" +"(11,14,14,11)","-(t/q^5)" +"(11,15,14,13)","t/q^5-t^2/q^7" +"(11,15,15,11)","q^(-4)" +"(12,0,0,12)","1" +"(12,1,0,13)","q/t" +"(12,2,0,14)","1" +"(12,3,0,15)","q/t" +"(12,4,0,15)","q^2/t" +"(12,1,1,12)","-(q/t)" +"(12,3,1,14)","-(q/t)" +"(12,4,1,14)","-(q^2/t)" +"(12,2,2,12)","-(t/q^2)" +"(12,3,2,13)","-q^(-1)" +"(12,4,2,13)","-q^(-1)" +"(12,6,2,15)","1-q^(-1)" +"(12,3,3,12)","q^(-1)" +"(12,5,3,13)","t^(-1)" +"(12,6,3,14)","-1" +"(12,7,3,15)","t^(-1)" +"(12,8,3,15)","-(q^2/t)" +"(12,4,4,12)","q^(-1)" +"(12,5,4,13)","-t^(-1)" +"(12,6,4,14)","q^(-1)" +"(12,7,4,15)","-t^(-1)" +"(12,8,4,15)","q^2/t" +"(12,5,5,12)","-t^(-1)" +"(12,7,5,14)","-t^(-1)" +"(12,8,5,14)","q^2/t" +"(12,6,6,12)","-(t/q^3)" +"(12,7,6,13)","q^(-2)" +"(12,8,6,13)","-q^(-2)" +"(12,10,6,15)","1-q^(-2)" +"(12,7,7,12)","q^(-2)" +"(12,9,7,13)","1/(q*t)" +"(12,10,7,14)","1" +"(12,11,7,15)","1/(q*t)" +"(12,12,7,15)","q^2/t" +"(12,8,8,12)","q^(-2)" +"(12,9,8,13)","1/(q*t)" +"(12,10,8,14)","q^(-2)" +"(12,11,8,15)","1/(q*t)" +"(12,12,8,15)","q^2/t" +"(12,9,9,12)","-(1/(q*t))" +"(12,11,9,14)","-(1/(q*t))" +"(12,12,9,14)","-(q^2/t)" +"(12,10,10,12)","-(t/q^4)" +"(12,11,10,13)","-q^(-3)" +"(12,12,10,13)","-q^(-3)" +"(12,14,10,15)","1-q^(-3)" +"(12,11,11,12)","q^(-3)" +"(12,13,11,13)","1/(q^2*t)" +"(12,14,11,14)","-1" +"(12,15,11,15)","-1+1/(q^2*t)" +"(12,12,12,12)","q^(-3)" +"(12,13,12,13)","-(1/(q^2*t))" +"(12,14,12,14)","q^(-3)" +"(12,15,12,15)","1-1/(q^2*t)" +"(12,13,13,12)","-(1/(q^2*t))" +"(12,15,13,14)","1-1/(q^2*t)" +"(12,14,14,12)","-(t/q^5)" +"(12,15,14,13)","q^(-4)-t/q^6" +"(12,15,15,12)","q^(-4)" +"(13,0,0,13)","1" +"(13,2,0,15)","1" +"(13,1,1,13)","q/t" +"(13,3,1,15)","q/t" +"(13,4,1,15)","q^2/t" +"(13,2,2,13)","-(t/q^2)" +"(13,3,3,13)","-q^(-1)" +"(13,6,3,15)","1" +"(13,4,4,13)","-q^(-1)" +"(13,6,4,15)","-q^(-1)" +"(13,5,5,13)","-t^(-1)" +"(13,7,5,15)","-t^(-1)" +"(13,8,5,15)","q^2/t" +"(13,6,6,13)","t/q^3" +"(13,7,7,13)","q^(-2)" +"(13,10,7,15)","1" +"(13,8,8,13)","q^(-2)" +"(13,10,8,15)","q^(-2)" +"(13,9,9,13)","1/(q*t)" +"(13,11,9,15)","1/(q*t)" +"(13,12,9,15)","q^2/t" +"(13,10,10,13)","-(t/q^4)" +"(13,11,11,13)","-q^(-3)" +"(13,14,11,15)","1" +"(13,12,12,13)","-q^(-3)" +"(13,14,12,15)","-q^(-3)" +"(13,13,13,13)","-(1/(q^2*t))" +"(13,15,13,15)","1-1/(q^2*t)" +"(13,14,14,13)","t/q^5" +"(13,15,15,13)","q^(-4)" +"(14,0,0,14)","1" +"(14,1,0,15)","q^2/t" +"(14,1,1,14)","-(q^2/t)" +"(14,2,2,14)","t/q^2" +"(14,3,2,15)","1" +"(14,4,2,15)","1" +"(14,3,3,14)","-1" +"(14,5,3,15)","-(q^2/t)" +"(14,4,4,14)","-1" +"(14,5,4,15)","q^2/t" +"(14,5,5,14)","q^2/t" +"(14,6,6,14)","-(t/q^2)" +"(14,7,6,15)","1" +"(14,8,6,15)","-1" +"(14,7,7,14)","1" +"(14,9,7,15)","q^2/t" +"(14,8,8,14)","1" +"(14,9,8,15)","q^2/t" +"(14,9,9,14)","-(q^2/t)" +"(14,10,10,14)","t/q^2" +"(14,11,10,15)","1" +"(14,12,10,15)","1" +"(14,11,11,14)","-1" +"(14,13,11,15)","-(q^2/t)" +"(14,12,12,14)","-1" +"(14,13,12,15)","q^2/t" +"(14,13,13,14)","q^2/t" +"(14,14,14,14)","-(t/q^2)" +"(14,15,14,15)","1-t/q^2" +"(14,15,15,14)","1" +"(15,0,0,15)","1" +"(15,1,1,15)","q^2/t" +"(15,2,2,15)","t/q^2" +"(15,3,3,15)","1" +"(15,4,4,15)","1" +"(15,5,5,15)","q^2/t" +"(15,6,6,15)","t/q^2" +"(15,7,7,15)","1" +"(15,8,8,15)","1" +"(15,9,9,15)","q^2/t" +"(15,10,10,15)","t/q^2" +"(15,11,11,15)","1" +"(15,12,12,15)","1" +"(15,13,13,15)","q^2/t" +"(15,14,14,15)","t/q^2" +"(15,15,15,15)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/hn.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/hn.csv new file mode 100644 index 0000000..877d0c5 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/hn.csv @@ -0,0 +1,17 @@ +"(16,16)","ZZ" +"(0,0)","1" +"(1,1)","-1" +"(2,2)","-1" +"(3,3)","1" +"(4,4)","1" +"(5,5)","-1" +"(6,6)","-1" +"(7,7)","1" +"(8,8)","1" +"(9,9)","-1" +"(10,10)","-1" +"(11,11)","1" +"(12,12)","1" +"(13,13)","-1" +"(14,14)","-1" +"(15,15)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/hp.csv b/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/hp.csv new file mode 100644 index 0000000..877d0c5 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/R_matrices/V4/hp.csv @@ -0,0 +1,17 @@ +"(16,16)","ZZ" +"(0,0)","1" +"(1,1)","-1" +"(2,2)","-1" +"(3,3)","1" +"(4,4)","1" +"(5,5)","-1" +"(6,6)","-1" +"(7,7)","1" +"(8,8)","1" +"(9,9)","-1" +"(10,10)","-1" +"(11,11)","1" +"(12,12)","1" +"(13,13)","-1" +"(14,14)","-1" +"(15,15)","1" diff --git a/spherogram_src/links/reshetikhin_turaev/__init__.py b/spherogram_src/links/reshetikhin_turaev/__init__.py new file mode 100644 index 0000000..21ba508 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/__init__.py @@ -0,0 +1,20 @@ +from .RT_network import RTNetwork +from .dict_laurent_polynomial import DictLaurentPolynomial +from .R_matrices import ( + RMatrix, + colored_links_gould_R_matrices, + colored_jones_R_matrices, + prefactor_colored_jones, +) +from .sparse_array import SparseArray, SparseTensor + +__all__ = [ + "RTNetwork", + "RMatrix", + "DictLaurentPolynomial", + "SparseArray", + "SparseTensor", + "colored_links_gould_R_matrices", + "colored_jones_R_matrices", + "prefactor_colored_jones", +] diff --git a/spherogram_src/links/reshetikhin_turaev/dict_laurent_polynomial.py b/spherogram_src/links/reshetikhin_turaev/dict_laurent_polynomial.py new file mode 100644 index 0000000..44640e2 --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/dict_laurent_polynomial.py @@ -0,0 +1,1165 @@ +from ...sage_helper import _within_sage, sage_method + +if _within_sage: + from sage.all import PuiseuxSeriesRing, LaurentPolynomialRing, ZZ + + +@sage_method +def laurent_poly_from_dict(dict, vars, F): + L = LaurentPolynomialRing(F, vars) + return L(dict) + + +@sage_method +def puiseux_series_from_dict(poly_dict, var, F): + """ + Build a Sage Puiseux series from a poly_dict and a single LaurentVariable. + Key k represents var^(k / var.denominator). + """ + P = PuiseuxSeriesRing(F, var.name) + t = P.gen() + result = P.zero() + den = ZZ(var.denominator) + for key, coef in poly_dict.items(): + (k,) = key + result += coef * t ** (ZZ(k) / den) + return result + + +class LaurentVariable: + """ + A named variable with an optional denominator. + Exponent key k represents var^(k / denominator). + + Examples: + LaurentVariable('q') # q^k for integer k + LaurentVariable('q', 2) # q^(k/2), so key 1 means q^(1/2) + """ + + __slots__ = ["name", "denominator"] + + def __init__(self, name, denominator=1): + self.name = name + self.denominator = denominator + + def __eq__(self, other): + if isinstance(other, LaurentVariable): + return self.name == other.name and self.denominator == other.denominator + return NotImplemented + + def __hash__(self): + return hash((self.name, self.denominator)) + + def __repr__(self): + if self.denominator == 1: + return self.name + return f"{self.name}[1/{self.denominator}]" + + def fmt_exp(self, k): + """Format exponent k as a string for display.""" + if k == 0: + return None + num, den = k, self.denominator + g = _gcd(abs(num), den) + num, den = num // g, den // g + if den == 1: + if num == 1: + return "" + return f"^{num}" + return f"^({num}/{den})" + + +def _gcd(a, b): + while b: + a, b = b, a % b + return a + + +_vars_cache = {} + + +def _intern_vars(vars_tuple): + return _vars_cache.setdefault(vars_tuple, vars_tuple) + + +class FastDictLaurentPolynomial: + """ + A sparse Laurent polynomial in arbitrarily many variables. + + Represented as a dict mapping exponent tuples (of integers) to nonzero + coefficients. Each variable's denominator is encoded in its LaurentVariable, + so exponent key k for variable v means v^(k / v.denominator). + + Warning: arithmetic operations (+, -, *, /, **) do NOT check that the two + operands have compatible variables. It is the caller's responsibility to + ensure both polynomials share the same vars tuple (same names, same order, + same denominators) before combining them. The denoiminators can be normalized + via refactor_variables(new_vars) method. + + >>> p = DictLaurentPolynomial.from_str('q^2 - q^-1 + 3', ['q']) + >>> p + -q^-1 + 3 + q^2 + >>> r = DictLaurentPolynomial.from_str('q^2*t - 1', ['q', 't']) + >>> r + q^2*t - 1 + """ + + __slots__ = ["vars", "poly_dict"] + + def __init__(self, vars, poly_dict): + self.vars = _intern_vars( + tuple( + ( + v + if isinstance(v, LaurentVariable) + else LaurentVariable(*((v,) if isinstance(v, str) else v)) + ) + for v in vars + ) + ) + self.poly_dict = {k: v for k, v in poly_dict.items() if v != 0} + + def to_checked(self): + """ + Return a DictLaurentPolynomial with the same variables and coefficients. + + >>> p = FastDictLaurentPolynomial.from_str('q^2 - 1', ['q']) + >>> type(p).__name__ + 'FastDictLaurentPolynomial' + >>> c = p.to_checked() + >>> type(c).__name__ + 'DictLaurentPolynomial' + >>> c == p + True + """ + return DictLaurentPolynomial._make(self.vars, self.poly_dict, _interned=True) + + @sage_method + def to_sage(self): + if len(self.vars) == 1: + return puiseux_series_from_dict(self.poly_dict, self.vars[0], F=ZZ) + elif all(var.denominator == 1 for var in self.vars): + return laurent_poly_from_dict( + self.poly_dict, [var.name for var in self.vars], F=ZZ + ) + else: + raise NotImplementedError( + "Multi-variable Puiseux conversion to Sage is not supported." + ) + + @classmethod + @sage_method + def from_sage(cls, p, var_names=None): + """ + Convert a Sage PuiseuxSeries or LaurentPolynomial to a DictLaurentPolynomial. + + var_names: optional list of variable name strings; defaults to the + variable names from p's parent ring. + + For PuiseuxSeries the conversion relies on the internal _l (Laurent + series) and _e (ramification index) attributes of Sage's implementation. + + sage: p = DictLaurentPolynomial.from_str('q^2 + 3 - q^-1', ['q']) + sage: DictLaurentPolynomial.from_sage(p.to_sage()) == p + True + sage: r = DictLaurentPolynomial.from_str('q^2*t - 1', ['q', 't']) + sage: DictLaurentPolynomial.from_sage(r.to_sage()) == r + True + sage: s = DictLaurentPolynomial.from_str('q^(1/2) + q^(-1/4)', ['q']) + sage: DictLaurentPolynomial.from_sage(s.to_sage()) == s + True + """ + from sage.rings.puiseux_series_ring_element import PuiseuxSeries + + if isinstance(p, PuiseuxSeries): + e = int(p.ramification_index()) + name = var_names[0] if var_names else str(p.variable()) + var = LaurentVariable(name, e) + l = p.laurent_part() + poly_dict = { + (int(k),): int(v) + for k, v in zip(l.exponents(), l.coefficients()) + if v != 0 + } + return cls._make((var,), poly_dict) + + # LaurentPolynomial (univariate or multivariate, all denominators 1). + parent = p.parent() + names = var_names or [str(v) for v in parent.gens()] + vars_tuple = tuple(LaurentVariable(name) for name in names) + nvars = len(names) + poly_dict = {} + for exp, v in p.dict().items(): + if v == 0: + continue + key = (int(exp),) if nvars == 1 else tuple(int(k) for k in exp) + poly_dict[key] = int(v) + return cls._make(vars_tuple, poly_dict) + + @classmethod + def _make(cls, vars, poly_dict, _interned=False): + """Construct without cleaning — caller guarantees no zero values. + Pass _interned=True when vars is already a canonical interned tuple.""" + obj = object.__new__(cls) + obj.vars = ( + vars + if _interned + else _intern_vars(vars if isinstance(vars, tuple) else tuple(vars)) + ) + obj.poly_dict = poly_dict + return obj + + @classmethod + def generator(cls, vars, index=0): + """ + Return the unit monomial for the variable at `index`. + Exponent key 1 represents var^(1/denominator). + + >>> q = LaurentVariable('q', 2) + >>> g = DictLaurentPolynomial.generator([q]) + >>> g + q^(1/2) + >>> g ** 3 + q^(3/2) + """ + exp = tuple(1 if i == index else 0 for i in range(len(vars))) + return cls._make(vars, {exp: 1}) + + def __bool__(self): + """ + >>> bool(DictLaurentPolynomial.from_str('q + 1', ['q'])) + True + >>> bool(DictLaurentPolynomial.from_str('q - q', ['q'])) + False + """ + return bool(self.poly_dict) + + def __eq__(self, other): + """ + >>> p = DictLaurentPolynomial.from_str('q + 1', ['q']) + >>> p == DictLaurentPolynomial.from_str('1 + q', ['q']) + True + >>> p == 0 + False + >>> DictLaurentPolynomial.from_str('q - q', ['q']) == 0 + True + >>> DictLaurentPolynomial.from_str('1', ['q']) == 1 + True + >>> v4 = LaurentVariable('q', 4) + >>> p4 = DictLaurentPolynomial._make((v4,), {(4,): 1}) + >>> p4 == DictLaurentPolynomial.from_str('q', ['q']) + True + """ + if isinstance(other, FastDictLaurentPolynomial): + if self.vars is other.vars: + return self.poly_dict == other.poly_dict + if len(self.vars) != len(other.vars): + return False + if any(v1.name != v2.name for v1, v2 in zip(self.vars, other.vars)): + return False + + def lcm(a, b): + return a * b // _gcd(a, b) + + common_vars = tuple( + LaurentVariable(v1.name, lcm(v1.denominator, v2.denominator)) + for v1, v2 in zip(self.vars, other.vars) + ) + return ( + self.refactor_variables(common_vars).poly_dict + == other.refactor_variables(common_vars).poly_dict + ) + if other == 0: + return not self.poly_dict + if other == 1: + return ( + len(self.poly_dict) == 1 + and self.poly_dict.get((0,) * len(self.vars), 0) == 1 + ) + return NotImplemented + + __hash__ = None + + def __neg__(self): + """ + >>> p = DictLaurentPolynomial.from_str('q + 2', ['q']) + >>> -p + -2 - q + """ + return FastDictLaurentPolynomial._make( + self.vars, {k: -v for k, v in self.poly_dict.items()}, _interned=True + ) + + def __add__(self, other): + """ + >>> p = DictLaurentPolynomial.from_str('q + 1', ['q']) + >>> r = DictLaurentPolynomial.from_str('q^-1 - 1', ['q']) + >>> p + r + q^-1 + q + >>> p + 3 + 4 + q + """ + if isinstance(other, FastDictLaurentPolynomial): + sp, op = self.poly_dict, other.poly_dict + # Copy the larger dict; iterate over the smaller to minimise lookups. + if len(sp) >= len(op): + result, iterate = dict(sp), op + else: + result, iterate = dict(op), sp + for k, v in iterate.items(): + if k in result: + s = result[k] + v + if s: + result[k] = s + else: + del result[k] + else: + result[k] = v + return FastDictLaurentPolynomial._make(self.vars, result, _interned=True) + + if other == 0: + return FastDictLaurentPolynomial._make( + self.vars, dict(self.poly_dict), _interned=True + ) + + zero_key = (0,) * len(self.vars) + result = dict(self.poly_dict) + s = result.get(zero_key, 0) + other + if s: + result[zero_key] = s + else: + result.pop(zero_key, None) + return FastDictLaurentPolynomial._make(self.vars, result, _interned=True) + + def __radd__(self, other): + return self.__add__(other) + + def __sub__(self, other): + """ + >>> p = DictLaurentPolynomial.from_str('q^2 + q', ['q']) + >>> r = DictLaurentPolynomial.from_str('q', ['q']) + >>> p - r + q^2 + >>> p - 1 + -1 + q + q^2 + """ + if isinstance(other, FastDictLaurentPolynomial): + result = dict(self.poly_dict) + for k, v in other.poly_dict.items(): + if k in result: + s = result[k] - v + if s: + result[k] = s + else: + del result[k] + else: + result[k] = -v + return FastDictLaurentPolynomial._make(self.vars, result, _interned=True) + return self.__add__(-other) + + def __rsub__(self, other): + return (-self).__add__(other) + + def __mul__(self, other): + """ + >>> p = DictLaurentPolynomial.from_str('q + 1', ['q']) + >>> r = DictLaurentPolynomial.from_str('q - 1', ['q']) + >>> p * r + -1 + q^2 + >>> p * 3 + 3 + 3*q + """ + if isinstance(other, FastDictLaurentPolynomial): + result = {} + if len(self.poly_dict) == 1: + # monomial * polynomial: no cancellation possible, assign directly + ((k1, v1),) = self.poly_dict.items() + n = len(k1) + if n == 1: + for k2, v2 in other.poly_dict.items(): + result[(k1[0] + k2[0],)] = v1 * v2 + elif n == 2: + for k2, v2 in other.poly_dict.items(): + result[(k1[0] + k2[0], k1[1] + k2[1])] = v1 * v2 + else: + for k2, v2 in other.poly_dict.items(): + result[tuple(a + b for a, b in zip(k1, k2))] = v1 * v2 + elif len(other.poly_dict) == 1: + # polynomial * monomial: no cancellation possible, assign directly + ((k2, v2),) = other.poly_dict.items() + n = len(k2) + if n == 1: + for k1, v1 in self.poly_dict.items(): + result[(k1[0] + k2[0],)] = v1 * v2 + elif n == 2: + for k1, v1 in self.poly_dict.items(): + result[(k1[0] + k2[0], k1[1] + k2[1])] = v1 * v2 + else: + for k1, v1 in self.poly_dict.items(): + result[tuple(a + b for a, b in zip(k1, k2))] = v1 * v2 + else: + n = len(self.vars) + if n == 1: + for k1, v1 in self.poly_dict.items(): + for k2, v2 in other.poly_dict.items(): + k = (k1[0] + k2[0],) + prod = v1 * v2 + if k in result: + s = result[k] + prod + if s: + result[k] = s + else: + del result[k] + else: + result[k] = prod + elif n == 2: + for k1, v1 in self.poly_dict.items(): + for k2, v2 in other.poly_dict.items(): + k = (k1[0] + k2[0], k1[1] + k2[1]) + prod = v1 * v2 + if k in result: + s = result[k] + prod + if s: + result[k] = s + else: + del result[k] + else: + result[k] = prod + else: + for k1, v1 in self.poly_dict.items(): + for k2, v2 in other.poly_dict.items(): + k = tuple(a + b for a, b in zip(k1, k2)) + prod = v1 * v2 + if k in result: + s = result[k] + prod + if s: + result[k] = s + else: + del result[k] + else: + result[k] = prod + return FastDictLaurentPolynomial._make(self.vars, result, _interned=True) + + if self == 0 or other == 0: + return FastDictLaurentPolynomial._make(self.vars, {}, _interned=True) + + if other == 1: + return FastDictLaurentPolynomial._make( + self.vars, dict(self.poly_dict), _interned=True + ) + + return FastDictLaurentPolynomial._make( + self.vars, {k: v * other for k, v in self.poly_dict.items()}, _interned=True + ) + + def __rmul__(self, other): + return self.__mul__(other) + + def __truediv__(self, other): + """ + Divide by a monomial DictLaurentPolynomial, or by a scalar that evenly + divides all coefficients. Raises ValueError otherwise. + + >>> p = DictLaurentPolynomial.from_str('q^2 - 1', ['q']) + >>> q = DictLaurentPolynomial.from_str('q', ['q']) + >>> p / q + -q^-1 + q + >>> r = DictLaurentPolynomial.from_str('2*q^2 + 4*q', ['q']) + >>> r / 2 + 2*q + q^2 + >>> r / 3 + Traceback (most recent call last): + ... + ValueError: DictLaurentPolynomial division: scalar 3 does not divide all coefficients + >>> p / DictLaurentPolynomial.from_str('q + 1', ['q']) + Traceback (most recent call last): + ... + ValueError: DictLaurentPolynomial division: divisor must be a monomial + """ + if isinstance(other, FastDictLaurentPolynomial): + if len(other.poly_dict) != 1: + raise ValueError( + "DictLaurentPolynomial division: divisor must be a monomial" + ) + return self * other**-1 + if other == 0: + raise ZeroDivisionError("DictLaurentPolynomial division by zero") + if not all(c % other == 0 for c in self.poly_dict.values()): + raise ValueError( + f"DictLaurentPolynomial division: scalar {other!r} does not " + f"divide all coefficients" + ) + return type(self)._make( + self.vars, + {k: c // other for k, c in self.poly_dict.items()}, + _interned=True, + ) + + def simplify_denominator(self): + """ + Return a simplified copy where each variable's denominator is divided + by the GCD it shares with all exponents for that variable. + + >>> v = LaurentVariable('q', 4) + >>> p = DictLaurentPolynomial._make((v,), {(2,): 1, (-2,): -1}) + >>> p.vars[0].denominator + 4 + >>> s = p.simplify_denominator() + >>> s.vars[0].denominator + 2 + >>> p == s + True + """ + reductions = [] + for i, var in enumerate(self.vars): + g = 0 + for key in self.poly_dict: + g = _gcd(abs(key[i]), g) + if g == 1: + break + reductions.append(_gcd(g, var.denominator)) + + new_vars = tuple( + LaurentVariable(var.name, var.denominator // r) + for var, r in zip(self.vars, reductions) + ) + new_poly_dict = { + tuple(k // r for k, r in zip(key, reductions)): coef + for key, coef in self.poly_dict.items() + } + return FastDictLaurentPolynomial._make(new_vars, new_poly_dict) + + def refactor_variables(self, new_vars): + """ + Return a copy rescaled to use new_vars. + + new_vars must list the same variable names in the same order, and each + new denominator must be a multiple of the current denominator. Exponent + keys are multiplied by the ratio new_denom / old_denom so the rational + exponents (key / denom) remain unchanged. + + >>> v1 = LaurentVariable('q', 1) + >>> p = DictLaurentPolynomial._make((v1,), {(1,): 1, (-1,): -1}) + >>> p + -q^-1 + q + >>> v4 = LaurentVariable('q', 4) + >>> p4 = p.refactor_variables([v4]) + >>> p4.vars[0].denominator + 4 + >>> p4 + -q^-1 + q + """ + new_vars = tuple( + v if isinstance(v, LaurentVariable) else LaurentVariable(v) + for v in new_vars + ) + scales = [] + for old_var, new_var in zip(self.vars, new_vars): + if old_var.name != new_var.name: + raise ValueError( + f"refactor_variables: variable name mismatch: " + f"{old_var.name!r} vs {new_var.name!r}" + ) + if new_var.denominator % old_var.denominator != 0: + raise ValueError( + f"refactor_variables: new denominator {new_var.denominator} " + f"is not a multiple of old denominator {old_var.denominator} " + f"for variable {old_var.name!r}" + ) + scales.append(new_var.denominator // old_var.denominator) + new_poly_dict = { + tuple(k * s for k, s in zip(key, scales)): coef + for key, coef in self.poly_dict.items() + } + return FastDictLaurentPolynomial._make(new_vars, new_poly_dict) + + def change_vars(self, rules, new_var_names=None): + """ + Return a new DictLaurentPolynomial with variables substituted by rules. + + rules: dict mapping LaurentVariable (or variable name string) -> + DictLaurentPolynomial (or expression string), or a list of + DictLaurentPolynomials (one per variable, in order). Variables absent + from a dict-style rules are kept as themselves (identity substitution). + + String values are parsed using the source variable names as the ring, + or new_var_names if provided. A string value describes the image of + the full variable (e.g. q^1); for source variables with denominator + d > 1 the image must be a monomial. + + new_var_names: optional list of variable name strings for the target + ring. Source variables absent from rules are auto-mapped to themselves + (by name); if their name is not already in new_var_names it is appended. + + >>> q_var = LaurentVariable('q') + >>> t_var = LaurentVariable('t') + >>> p = DictLaurentPolynomial.from_str('q^2 + q', ['q']) + >>> t = DictLaurentPolynomial.generator([t_var]) + >>> p.change_vars({q_var: t}) + t + t^2 + >>> p.change_vars([DictLaurentPolynomial.from_str('t^-1', ['t'])]) + t^-2 + t^-1 + >>> p.change_vars({'q': 'q^-1'}) + q^-2 + q^-1 + >>> r = DictLaurentPolynomial.from_str('q + t', ['q', 't']) + >>> r.change_vars({'q': 'q*t^2', 't': 't^-1'}) + q*t^2 + t^-1 + >>> s = DictLaurentPolynomial.from_str('q^(1/2)*t^(1/3)', ['q', 't']) + >>> s.change_vars({'q': 'q*t^2', 't': 't^-1'}) + q^(1/2)*t^(2/3) + >>> p.change_vars({'q': 'a^2'}, new_var_names=['a']) + a^2 + a^4 + >>> r.change_vars({'q': 'a^2'}, new_var_names=['a']) + a^2 + t + >>> r.change_vars({'q': 'a^2', 't': 'b^-1'}, new_var_names=['a', 'b']) + a^2 + b^-1 + >>> half_q = DictLaurentPolynomial.from_str('q^(1/2)', ['q']) + >>> half_q.change_vars({'q': 'a^4'}, new_var_names=['a']) + a^2 + """ + if isinstance(rules, list): + rules = dict(zip(self.vars, rules)) + + # Normalize string keys to LaurentVariable via name lookup. + if any(isinstance(k, str) for k in rules): + name_to_var = {v.name: v for v in self.vars} + rules = { + (name_to_var[k] if isinstance(k, str) else k): v + for k, v in rules.items() + } + + # When new_var_names is provided, auto-fill unspecified source vars + # with string identity rules, extending new_var_names as needed. + if new_var_names is not None: + rules = dict(rules) + new_var_names = list(new_var_names) + for var in self.vars: + if var not in rules: + if var.name not in new_var_names: + new_var_names.append(var.name) + rules[var] = var.name + + # Parse string values. + var_names = ( + new_var_names if new_var_names is not None else [v.name for v in self.vars] + ) + has_str_values = any(isinstance(v, str) for v in rules.values()) + if has_str_values: + parsed_rules = {} + for src_var, img in rules.items(): + if isinstance(img, str): + parsed = FastDictLaurentPolynomial.from_str(img, var_names) + d = src_var.denominator + if d > 1: + # String describes image of the full variable (src_var^1). + # We need the image of the unit generator (src_var^(1/d)). + # Only valid when image is a monomial (can be raised to 1/d power). + if len(parsed.poly_dict) > 1: + raise ValueError( + f"change_vars: image of {src_var!r} has denominator " + f"{d} > 1 but the image is not a monomial" + ) + # Scale image variable denominators by d; keys unchanged. + new_img_vars = tuple( + LaurentVariable(v.name, v.denominator * d) + for v in parsed.vars + ) + parsed = FastDictLaurentPolynomial._make( + new_img_vars, parsed.poly_dict + ) + parsed_rules[src_var] = parsed + else: + parsed_rules[src_var] = img + rules = parsed_rules + + # Build identity images for variables not in rules. + full_rules = {} + for i, var in enumerate(self.vars): + if var in rules: + full_rules[var] = rules[var] + else: + full_rules[var] = FastDictLaurentPolynomial.generator( + self.vars, index=i + ) + + # Unify all image DLPs to a common vars tuple when string values were used. + if has_str_values and full_rules: + all_imgs = list(full_rules.values()) + ref_vars = all_imgs[0].vars + + def _lcm2(a, b): + return a * b // _gcd(a, b) + + common_denoms = [v.denominator for v in ref_vars] + for img in all_imgs[1:]: + for i, v in enumerate(img.vars): + common_denoms[i] = _lcm2(common_denoms[i], v.denominator) + common_vars = tuple( + LaurentVariable(v.name, d) for v, d in zip(ref_vars, common_denoms) + ) + full_rules = { + src_var: img.refactor_variables(common_vars) + for src_var, img in full_rules.items() + } + + result = None + for key, coef in self.poly_dict.items(): + term = None + for var, k in zip(self.vars, key): + if k == 0: + continue + factor = full_rules[var] ** k + term = factor if term is None else term * factor + + if term is None: + zero_key = (0,) * len(next(iter(full_rules.values())).vars) + term = FastDictLaurentPolynomial._make( + next(iter(full_rules.values())).vars, {zero_key: coef} + ) + else: + term = term * coef + + result = term if result is None else result + term + + if result is None: + img = next(iter(full_rules.values())) + return FastDictLaurentPolynomial._make(img.vars, {}) + return result + + @classmethod + def from_str(cls, s, vars): + """ + Parse a string into a DictLaurentPolynomial. + + vars: list of variable name strings, e.g. ['q'] or ['q', 't']. + The denominator for each LaurentVariable is the LCM of all + denominators appearing in its exponents in the string. + + >>> DictLaurentPolynomial.from_str('q^2 - q^-1 + 3', ['q']) + -q^-1 + 3 + q^2 + >>> DictLaurentPolynomial.from_str('q^(1/2) + q^(-1/2)', ['q']) + q^(-1/2) + q^(1/2) + >>> DictLaurentPolynomial.from_str('1 - 1/(q*t)', ['q', 't']) + 1 - q^-1*t^-1 + >>> DictLaurentPolynomial.from_str('(q^2 - 1) / q', ['q']) + -q^-1 + q + >>> DictLaurentPolynomial.from_str('t1^2 + t2^-1', ['t1', 't2']) + t1^2 + t2^-1 + >>> DictLaurentPolynomial.from_str('t^2 + t1', ['t', 't1']) + t^2 + t1 + >>> DictLaurentPolynomial.from_str('t1^2*t10 + t1 - t10^-1', ['t1', 't10']) + t1^2*t10 + t1 - t10^-1 + >>> DictLaurentPolynomial.from_str('(t1^2 - 1) / t1', ['t1', 't2']) + t1 - t1^-1 + >>> DictLaurentPolynomial.from_str('3', []) + 3 + """ + if len(vars) != len(set(vars)): + raise ValueError(f"from_str: duplicate variable names in {vars!r}") + + s = s.replace(" ", "") + + # --- tokeniser state (mutable via single-element list) --- + pos = [0] + + def expect(ch): + if pos[0] >= len(s) or s[pos[0]] != ch: + got = repr(s[pos[0]]) if pos[0] < len(s) else "end of string" + raise ValueError( + f"from_str: expected {ch!r}, got {got} " + f"at position {pos[0]} in {s!r}" + ) + pos[0] += 1 + + def parse_pos_int(): + start = pos[0] + while pos[0] < len(s) and s[pos[0]].isdigit(): + pos[0] += 1 + if pos[0] == start: + got = repr(s[pos[0]]) if pos[0] < len(s) else "end of string" + raise ValueError( + f"from_str: expected integer at position {pos[0]} " + f"in {s!r}, got {got}" + ) + return int(s[start : pos[0]]) + + def parse_signed_int(): + sign = 1 + if pos[0] < len(s) and s[pos[0]] in "+-": + if s[pos[0]] == "-": + sign = -1 + pos[0] += 1 + return sign * parse_pos_int() + + def parse_exponent(): + # Called after '^' has been consumed. + if pos[0] < len(s) and s[pos[0]] == "(": + pos[0] += 1 + num = parse_signed_int() + den = 1 + if pos[0] < len(s) and s[pos[0]] == "/": + pos[0] += 1 + den = parse_pos_int() + if den == 0: + raise ValueError( + f"from_str: zero denominator in exponent in {s!r}" + ) + expect(")") + return num, den + return parse_signed_int(), 1 + + # --- grammar (builds AST as nested tuples) --- + # Nodes: ('v', name, num, den) variable^(num/den) + # ('c', n) integer constant + # ('u-', expr) unary negation + # (op, left, right) op in '+', '-', '*', '/' + + sorted_vars = sorted(vars, key=len, reverse=True) + + def parse_expr(): + result = parse_term() + while pos[0] < len(s) and s[pos[0]] in "+-": + op = s[pos[0]] + pos[0] += 1 + result = (op, result, parse_term()) + return result + + def parse_term(): + result = parse_factor() + while pos[0] < len(s) and s[pos[0]] in "*/": + op = s[pos[0]] + pos[0] += 1 + result = (op, result, parse_factor()) + return result + + def parse_factor(): + sign = 1 + while pos[0] < len(s) and s[pos[0]] in "+-": + if s[pos[0]] == "-": + sign = -sign + pos[0] += 1 + result = parse_atom() + return ("u-", result) if sign == -1 else result + + def parse_atom(): + if pos[0] >= len(s): + raise ValueError(f"from_str: unexpected end of expression in {s!r}") + c = s[pos[0]] + + if c == "(": + pos[0] += 1 + result = parse_expr() + expect(")") + return result + + # Match a variable name (longest first to handle ambiguous prefixes). + for var in sorted_vars: + end = pos[0] + len(var) + if s[pos[0] : end] == var: + # Require a non-identifier character to follow (avoid prefix match). + if end < len(s) and (s[end].isalnum() or s[end] == "_"): + continue + pos[0] = end + num, den = 1, 1 + if pos[0] < len(s) and s[pos[0]] == "^": + pos[0] += 1 + num, den = parse_exponent() + return ("v", var, num, den) + + # Must be an integer coefficient. + if c.isdigit(): + n = parse_pos_int() + if pos[0] < len(s) and s[pos[0]] == ".": + raise ValueError( + f"from_str: decimal numbers not supported " + f"at position {pos[0]} in {s!r}" + ) + return ("c", n) + + raise ValueError( + f"from_str: unexpected character {c!r} " + f"at position {pos[0]} in {s!r}; known variables: {vars!r}" + ) + + # --- parse --- + + ast = parse_expr() + + if pos[0] != len(s): + raise ValueError( + f"from_str: unexpected content {s[pos[0]:]!r} " + f"at position {pos[0]} in {s!r}" + ) + + # --- scan AST for per-variable denominator LCMs --- + + def lcm(a, b): + return a * b // _gcd(a, b) + + var_lcms = {v: 1 for v in vars} + + def collect_denoms(node): + tag = node[0] + if tag == "v": + _, name, num, den = node + if num != 0: + var_lcms[name] = lcm(var_lcms[name], den) + elif tag == "u-": + collect_denoms(node[1]) + elif tag != "c": + collect_denoms(node[1]) + collect_denoms(node[2]) + + collect_denoms(ast) + + # --- build generators in the joint variable space --- + + vars_list = tuple(LaurentVariable(v, var_lcms[v]) for v in vars) + n = len(vars) + generators = { + v: cls._make(vars_list, {tuple(1 if j == i else 0 for j in range(n)): 1}) + for i, v in enumerate(vars) + } + + # --- evaluate AST using DictLaurentPolynomial arithmetic --- + + def evaluate(node): + tag = node[0] + if tag == "c": + return node[1] + if tag == "v": + _, name, num, den = node + if num == 0: + return 1 + return generators[name] ** (num * var_lcms[name] // den) + if tag == "u-": + return -evaluate(node[1]) + if tag == "+": + return evaluate(node[1]) + evaluate(node[2]) + if tag == "-": + return evaluate(node[1]) - evaluate(node[2]) + if tag == "*": + return evaluate(node[1]) * evaluate(node[2]) + # tag == '/' + right_val = evaluate(node[2]) + if isinstance(right_val, int): + if abs(right_val) != 1: + raise ValueError( + f"from_str: division by non-unit coefficient {right_val} " + f"in {s!r}; write the coefficient in the numerator" + ) + return evaluate(node[1]) * right_val + if len(right_val.poly_dict) != 1: + raise ValueError(f"from_str: can only divide by a monomial in {s!r}") + return evaluate(node[1]) * (right_val**-1) + + result = evaluate(ast) + + if isinstance(result, int): + zero_key = (0,) * n + return cls._make(vars_list, {zero_key: result} if result != 0 else {}) + return result + + def __pow__(self, n): + """ + >>> p = DictLaurentPolynomial.from_str('q', ['q']) + >>> p ** 3 + q^3 + >>> p ** -2 + q^-2 + >>> p ** 0 + 1 + """ + try: + n = n.__index__() + except (AttributeError, TypeError): + raise ValueError(f"exponent must be an integer, got {n!r}") + if n == 0: + zero_key = (0,) * len(self.vars) + return FastDictLaurentPolynomial._make( + self.vars, {zero_key: 1}, _interned=True + ) + if n < 0: + if len(self.poly_dict) != 1: + raise ValueError("negative powers only supported for monomials") + ((key, coef),) = self.poly_dict.items() + if coef != 1 and coef != -1: + raise ValueError( + f"negative powers require a ±1 leading coefficient, got {coef!r}" + ) + inv_key = tuple(k * n for k in key) + inv_coef = coef ** (-n) # -n > 0, so int**int stays int; (±1)^k = (±1)^{-k} + return FastDictLaurentPolynomial._make( + self.vars, {inv_key: inv_coef}, _interned=True + ) + result = self + base = self + n -= 1 + while n: + if n & 1: + result = result * base + base = base * base + n >>= 1 + return result + + def __repr__(self): + if not self.poly_dict: + return "0" + # Sort by total degree descending (exact rational arithmetic), then lex descending. + L = 1 + for var in self.vars: + L = L * var.denominator // _gcd(L, var.denominator) + scales = tuple(L // var.denominator for var in self.vars) + + def _sort_key(item): + exp = item[0] + total = sum(k * s for k, s in zip(exp, scales)) + if len(self.vars) == 1: + return total # ascending for univariate (matches PuiseuxSeries) + return (-total, tuple(-k for k in exp)) # descending for multivariate + + terms = [] + for exp, coef in sorted(self.poly_dict.items(), key=_sort_key): + parts = [] + for var, k in zip(self.vars, exp): + fmt = var.fmt_exp(k) + if fmt is not None: + parts.append(var.name + fmt) + monomial = "*".join(parts) + if not monomial: + terms.append(str(coef)) + elif coef == 1: + terms.append(monomial) + elif coef == -1: + terms.append(f"-{monomial}") + else: + terms.append(f"{coef}*{monomial}") + return " + ".join(terms).replace("+ -", "- ") + + +class DictLaurentPolynomial(FastDictLaurentPolynomial): + """ + A checked variant of FastDictLaurentPolynomial that normalises denominators + to their LCM and expands to the union of variable sets before each binary + arithmetic operation. + + >>> a = DictLaurentPolynomial.from_str('q^2', ['q']) + >>> b = DictLaurentPolynomial.from_str('q^(1/2)', ['q']) + >>> a + b + q^(1/2) + q^2 + >>> t = DictLaurentPolynomial.from_str('t', ['t']) + >>> a + t + q^2 + t + """ + + def _match(self, other): + """Return (self, other) refactored to share a common vars tuple. + + If the variable sets differ, both are expanded to their union (self's + variable order first, then other's exclusive variables appended). + Denominators for shared variables are normalised to their LCM. + """ + if self.vars is other.vars: + return self, other + + def lcm(a, b): + return a * b // _gcd(a, b) + + self_by_name = {v.name: v for v in self.vars} + other_by_name = {v.name: v for v in other.vars} + + union_list = [] + for v in self.vars: + d = ( + lcm(v.denominator, other_by_name[v.name].denominator) + if v.name in other_by_name + else v.denominator + ) + union_list.append(LaurentVariable(v.name, d)) + for v in other.vars: + if v.name not in self_by_name: + union_list.append(LaurentVariable(v.name, v.denominator)) + union_vars = _intern_vars(tuple(union_list)) + + def expand(poly_obj): + old_vars = poly_obj.vars + name_to_old = {v.name: i for i, v in enumerate(old_vars)} + slots = [] + for uv in union_vars: + oi = name_to_old.get(uv.name) + if oi is not None: + slots.append((oi, uv.denominator // old_vars[oi].denominator)) + else: + slots.append(None) + new_dict = {} + for old_key, coeff in poly_obj.poly_dict.items(): + new_key = [] + for slot in slots: + new_key.append( + old_key[slot[0]] * slot[1] if slot is not None else 0 + ) + new_dict[tuple(new_key)] = coeff + return FastDictLaurentPolynomial._make(union_vars, new_dict, _interned=True) + + return expand(self), expand(other) + + def __add__(self, other): + lhs, rhs = ( + self._match(other) + if isinstance(other, FastDictLaurentPolynomial) + else (self, other) + ) + result = FastDictLaurentPolynomial.__add__(lhs, rhs) + return DictLaurentPolynomial._make( + result.vars, result.poly_dict, _interned=True + ) + + def __sub__(self, other): + lhs, rhs = ( + self._match(other) + if isinstance(other, FastDictLaurentPolynomial) + else (self, other) + ) + result = FastDictLaurentPolynomial.__sub__(lhs, rhs) + return DictLaurentPolynomial._make( + result.vars, result.poly_dict, _interned=True + ) + + def __mul__(self, other): + lhs, rhs = ( + self._match(other) + if isinstance(other, FastDictLaurentPolynomial) + else (self, other) + ) + result = FastDictLaurentPolynomial.__mul__(lhs, rhs) + return DictLaurentPolynomial._make( + result.vars, result.poly_dict, _interned=True + ) + + def simplify_variables(self): + """ + Return a copy with any variable whose exponent is 0 in every term removed. + + >>> p = DictLaurentPolynomial.from_str('q^2 + 1', ['q', 't']) + >>> p.simplify_variables() + 1 + q^2 + >>> p.simplify_variables().vars + (q,) + >>> DictLaurentPolynomial.from_str('3', ['q', 't']).simplify_variables() + 3 + >>> DictLaurentPolynomial.from_str('q*t + q', ['q', 't']).simplify_variables() + q*t + q + """ + if not self.poly_dict or not self.vars: + return self + keep = [ + any(key[i] != 0 for key in self.poly_dict) for i in range(len(self.vars)) + ] + if all(keep): + return self + new_vars = _intern_vars(tuple(v for v, k in zip(self.vars, keep) if k)) + new_dict = { + tuple(exp for exp, k in zip(key, keep) if k): coeff + for key, coeff in self.poly_dict.items() + } + return DictLaurentPolynomial._make(new_vars, new_dict, _interned=True) diff --git a/spherogram_src/links/reshetikhin_turaev/sparse_array.py b/spherogram_src/links/reshetikhin_turaev/sparse_array.py new file mode 100644 index 0000000..ce60a4b --- /dev/null +++ b/spherogram_src/links/reshetikhin_turaev/sparse_array.py @@ -0,0 +1,426 @@ +from itertools import product as cartesian_product + + +class SparseArray: + """ + A sparse array supporting arbitrary-dimensional indexing via tuples. + + Internally stores only non-default entries in a dict keyed by index tuples. + Indices can be integers or tuples of integers of any length. + """ + + __slots__ = ("_data", "_default", "_rank", "_shape") + + def __init__(self, shape, data=None, default=0): + self._data = {} + self._default = default + self._shape = tuple(shape) + self._rank = len(self._shape) + + if data is not None: + if isinstance(data, dict): + data = data.items() + for k, v in data: + self[k] = v + + def __eq__(self, other): + if not isinstance(other, SparseArray): + return False + return ( + self._shape == other._shape + and self._default == other._default + and self._data == other._data + ) + + def _key(self, index): + if isinstance(index, tuple): + return index + return (index,) + + def __getitem__(self, index): + return self._data.get(self._key(index), self._default) + + def __setitem__(self, index, value): + key = self._key(index) + if value == self._default: + self._data.pop(key, None) + else: + if len(key) != self._rank: + raise ValueError( + f"key length {len(key)} does not match rank {self._rank}" + ) + for i, (idx, dim) in enumerate(zip(key, self._shape)): + if not (0 <= idx < dim): + raise ValueError( + f"index {idx} at axis {i} is out of range [0, {dim})" + ) + self._data[key] = value + + def __delitem__(self, index): + key = self._key(index) + if key not in self._data: + raise KeyError(index) + del self._data[key] + + def __contains__(self, index): + return self._key(index) in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __repr__(self): + return f"SparseArray({self._data!r}, default={self._default!r})" + + def keys(self): + return self._data.keys() + + def values(self): + return self._data.values() + + def items(self): + return self._data.items() + + def get(self, index, default=None): + if default is None: + default = self._default + return self._data.get(self._key(index), default) + + def clear(self): + self._data.clear() + + def copy(self): + return SparseArray(self._shape, data=self._data.copy(), default=self._default) + + @property + def rank(self): + """Dimension of the indices.""" + return self._rank + + @property + def shape(self): + return self._shape + + @property + def default(self): + return self._default + + def nonzero_indices(self): + """Return list of all indices with non-default values.""" + return list(self._data.keys()) + + def to_dict(self): + return dict(self._data) + + @classmethod + def from_dict(cls, shape, d, default=0): + result = cls(shape, default=default) + for k, v in d.items(): + result[k] = v + return result + + +class SparseTensor(SparseArray): + """ + A sparse tensor supporting pairwise and multi-tensor contraction. + + Indices are tuples of integers. contract(other, pairs) contracts two + tensors over specified index pairs (summing the product over those axes). + multi_contract handles networks of arbitrarily many tensors at once. + """ + + def __repr__(self): + return f"SparseTensor({self._data!r}, default={self._default!r})" + + def copy(self): + return SparseTensor(self._shape, data=self._data.copy(), default=self._default) + + def _set(self, key, value): + """Write self[key] = value, dropping the entry if it equals default.""" + if value == self._default: + self._data.pop(key, None) + else: + self._data[key] = value + + def _accumulate(self, key, value): + """Add value into self[key], maintaining sparsity.""" + if key in self._data: + result = self._data[key] + value + if not result: + del self._data[key] + else: + self._data[key] = result + else: + self._data[key] = value + + def contract(self, other: "SparseTensor", pairs): + """ + Contract self with other over the specified index pairs, returning a + new SparseTensor whose axes are the free axes of self followed by the + free axes of other. + + pairs: iterable of (self_axis, other_axis) to be summed over. + Only entries where self[..., v, ...] == other[..., v, ...] on + every contracted axis contribute; their products are accumulated. + + Result axes: free axes of self (in order) + free axes of other (in order). + + Examples: + # matrix multiply A[i,j] * B[j,k] -> C[i,k] + A.contract(B, [(1, 0)]) + + # double contraction A[i,j,k] * B[j,k,l] -> C[i,l] + A.contract(B, [(1, 0), (2, 1)]) + """ + pairs = list(pairs) + for ai, bj in pairs: + if self._shape[ai] != other._shape[bj]: + raise ValueError( + f"axis {ai} of self (size {self._shape[ai]}) is incompatible " + f"with axis {bj} of other (size {other._shape[bj]})" + ) + + self_contracted = {ai for ai, _ in pairs} + other_contracted = {bj for _, bj in pairs} + self_free = [i for i in range(self.rank) if i not in self_contracted] + other_free = [i for i in range(other.rank) if i not in other_contracted] + result_shape = [self._shape[i] for i in self_free] + [ + other._shape[i] for i in other_free + ] + + if not self._data or not other._data: + return SparseTensor(result_shape, default=self._default) + + # Group self entries by their values at the contracted axes (in pairs order). + # For each contraction key, we only need to visit other entries that match. + self_groups = {} + for key, val in self.items(): + c_key = tuple(key[ai] for ai, _ in pairs) + f_key = tuple(key[i] for i in self_free) + self_groups.setdefault(c_key, []).append((f_key, val)) + + result = SparseTensor(result_shape, default=self._default) + for key_b, val_b in other.items(): + c_key = tuple(key_b[bj] for _, bj in pairs) + group = self_groups.get(c_key) + if group is None: + continue + f_key_b = tuple(key_b[i] for i in other_free) + for f_key_a, val_a in group: + result._accumulate(f_key_a + f_key_b, val_a * val_b) + return result + + def decorated_contract(self, other: "SparseTensor", pairs): + """ + An enhanced version of contract, where: + + pairs: a dictionary whose keys are (self_axis, other_axis) to be summed over, + and values are tuples of the form (0/1, h[i,j]), where h[i,j] is a tensor of rank 2 + the 0 or 1 indicates whether i or j is contracted with self_axis. + + For example, let A[i,j] and B[k,l] be two tensors, then + A.contract(B, {(1,0): (0, h)}) gives C[i,l]:= sum_{j,k} A[i,j] * h[j,k] * B[k,l] + and + A.contract(B, {(1,0): (1, h)}) gives C[i,l]:= sum_{j,k} A[i,j] * h[k,j] * B[k,l] + """ + if self is other: + return self._decorated_trace_pairs(pairs) + + for (ai, bj), (side, h) in pairs.items(): + h_self, h_other = (0, 1) if side == 0 else (1, 0) + if self._shape[ai] != h._shape[h_self]: + raise ValueError( + f"self axis {ai} (size {self._shape[ai]}) is incompatible " + f"with h axis {h_self} (size {h._shape[h_self]})" + ) + if other._shape[bj] != h._shape[h_other]: + raise ValueError( + f"other axis {bj} (size {other._shape[bj]}) is incompatible " + f"with h axis {h_other} (size {h._shape[h_other]})" + ) + + pair_list = list(pairs.keys()) + self_contracted = {ai for ai, _ in pair_list} + other_contracted = {bj for _, bj in pair_list} + self_free = [i for i in range(self.rank) if i not in self_contracted] + other_free = [i for i in range(other.rank) if i not in other_contracted] + result_shape = [self._shape[i] for i in self_free] + [ + other._shape[i] for i in other_free + ] + + if not self._data or not other._data: + return SparseTensor(result_shape, default=self._default) + + # Group self entries by their contracted-axis values (in pair_list order). + self_groups = {} + for key, val in self._data.items(): + c_key = tuple(key[ai] for ai, _ in pair_list) + f_key = tuple(key[i] for i in self_free) + self_groups.setdefault(c_key, []).append((f_key, val)) + + # For each pair m, precompute: given k (other's contracted value), + # which j values in self are reachable and with what h weight? + # h_lookup[m][k] = [(j, h_val), ...] + h_lookups = [] + for ai, bj in pair_list: + side, h = pairs[(ai, bj)] + lookup = {} + for hkey, hval in h._data.items(): + hi, hj = hkey + j, k = (hi, hj) if side == 0 else (hj, hi) + lookup.setdefault(k, []).append((j, hval)) + h_lookups.append(lookup) + + result = SparseTensor(result_shape, default=self._default) + + for key_b, val_b in other._data.items(): + f_key_b = tuple(key_b[i] for i in other_free) + + # For each pair m, collect reachable (j_m, h_val_m) from h_m. + per_pair = [] + for m, (ai, bj) in enumerate(pair_list): + k = key_b[bj] + js = h_lookups[m].get(k) + if not js: + break + per_pair.append(js) + else: + # Cartesian product: try every combination of j values across pairs. + for combo in cartesian_product(*per_pair): + c_key = tuple(j for j, _ in combo) + group = self_groups.get(c_key) + if group is None: + continue + h_weight = 1 + for _, hval in combo: + h_weight *= hval + hval_b = h_weight * val_b + for f_key_a, val_a in group: + result._accumulate(f_key_a + f_key_b, val_a * hval_b) + + return result + + def trace(self, i, j): + """ + Single-tensor contraction: set indices i and j equal and sum, + returning a SparseTensor of rank reduced by 2. + + Example: T[i,j,k].trace(0, 2) -> result[j] = sum_k T[k, j, k] + """ + assert self.rank >= 2 + n = self.rank + i, j = i % n, j % n + if i == j: + raise ValueError("trace indices must be distinct") + + result_shape = [v for idx, v in enumerate(self._shape) if idx != i and idx != j] + if not self._data: + return SparseTensor(result_shape, default=self._default) + + result = SparseTensor(result_shape, default=self._default) + for key, value in self.items(): + if key[i] != key[j]: + continue + free_key = tuple(v for idx, v in enumerate(key) if idx != i and idx != j) + result._accumulate(free_key, value) + return result + + def decorated_trace(self, i, j, decoration): + """ + Contract axes i and j of self with an edge tensor h inserted between + them, returning a SparseTensor of rank reduced by 2. + + decoration: (side, h) where h is a rank-2 SparseTensor. + side=0: result[free] = sum_{a,b} self[...,a at i,...,b at j,...] * h[a,b] + side=1: result[free] = sum_{a,b} self[...,a at i,...,b at j,...] * h[b,a] + + Example: A[i,j,k].decorated_trace(0, 2, (0, h)) + -> result[j] = sum_{i,k} A[i,j,k] * h[i,k] + """ + return self._decorated_trace_pairs({(i, j): decoration}) + + def _decorated_trace_pairs(self, pairs): + """ + Multi-pair decorated trace. All axis indices refer to self's original axes. + + pairs: dict {(i, j): (side, h)} — each entry contracts axes i and j of + self via the edge tensor h, simultaneously in a single pass. + """ + contracted = set() + for i, j in pairs: + n = self.rank + i, j = i % n, j % n + if i == j: + raise ValueError("trace indices must be distinct") + for ax in (i, j): + if ax in contracted: + raise ValueError(f"axis {ax} appears in more than one pair") + contracted.add(ax) + + for (i, j), (side, h) in pairs.items(): + h_i, h_j = (0, 1) if side == 0 else (1, 0) + if self._shape[i] != h._shape[h_i]: + raise ValueError( + f"axis {i} of self (size {self._shape[i]}) is incompatible " + f"with h axis {h_i} (size {h._shape[h_i]})" + ) + if self._shape[j] != h._shape[h_j]: + raise ValueError( + f"axis {j} of self (size {self._shape[j]}) is incompatible " + f"with h axis {h_j} (size {h._shape[h_j]})" + ) + + free = [idx for idx in range(self.rank) if idx not in contracted] + result_shape = [self._shape[idx] for idx in free] + result = SparseTensor(result_shape, default=self._default) + + for key, val in self._data.items(): + weight = 1 + for (i, j), (side, h) in pairs.items(): + a, b = key[i], key[j] + h_val = h[a, b] if side == 0 else h[b, a] + if h_val == h._default: + weight = 0 + break + weight *= h_val + if weight == 0: + continue + free_key = tuple(key[idx] for idx in free) + result._accumulate(free_key, val * weight) + + return result + + def fixate(self, i, value): + """ + Set index i to a fixed value, obtaining a new tensor with one less rank. + + T[i,j,k,l].fixate(i, 0) -> T[0,j,k,l] + """ + n = self.rank + i = i % n + result_shape = [v for idx, v in enumerate(self._shape) if idx != i] + result = SparseTensor(result_shape, default=self._default) + for key, val in self._data.items(): + if key[i] != value: + continue + free_key = tuple(v for idx, v in enumerate(key) if idx != i) + result._data[free_key] = val + return result + + def permute(self, indices): + """ + Reorder axes using pull-style indices: indices[i] is the axis of self + that becomes axis i of the result. + + result[i0, i1, ...] = self[i_{indices[0]}, i_{indices[1]}, ...] + + Example: A.permute([2, 0, 1]) produces B where B[a,b,c] = A[b,c,a]. + """ + result_shape = [self._shape[i] for i in indices] + result = SparseTensor(result_shape, default=self._default) + for key, val in self._data.items(): + new_key = tuple(key[i] for i in indices) + result._data[new_key] = val + return result diff --git a/spherogram_src/links/tangles.py b/spherogram_src/links/tangles.py index 44c5dcf..316fb6e 100644 --- a/spherogram_src/links/tangles.py +++ b/spherogram_src/links/tangles.py @@ -24,6 +24,8 @@ from collections import OrderedDict, Counter from .ordered_set import OrderedSet from .links import Crossing, Strand, Link, CrossingStrand, CrossingEntryPoint +from .reshetikhin_turaev import RTNetwork +from .. import graphs class CyclicList(list): def __init__(self, iterable): @@ -106,7 +108,7 @@ def add(self, c): return component class Tangle: - def __init__(self, boundary=2, crossings=None, entry_points=None, build = True, label=None, start_orientations = None, component_starts = None): + def __init__(self, boundary=2, crossings=None, entry_points=None, build=True, label=None, start_orientations=None, component_starts=None, check_planarity=True): """ A tangle is a fragment of a Link with some number of boundary strands. Tangles can be composed in various ways along their boundary strands, @@ -131,7 +133,8 @@ def __init__(self, boundary=2, crossings=None, entry_points=None, build = True, Tangles now support creation from PD_code, for example: - >>> Tangle(3, [[0,4,1,5],[1,8,2,9],[2,7,3,6],[5,9,6,10]], [0,4,8,10,3,7], label = 'RIII') + >>> Tangle(3, [[0,4,1,5],[1,8,2,9],[2,7,3,6],[5,9,6,10]],\ + [0,4,8,10,3,7], label = 'RIII') see doc of ``PD_code`` for more details. @@ -194,33 +197,37 @@ def __init__(self, boundary=2, crossings=None, entry_points=None, build = True, self._build(start_orientations, component_starts) assert self.is_oriented(), 'Tangle is not oriented after build' - # Remove all Strands from crossings and components. + # Remove all Strands in crossings; erase them also from the components. # Note that this will not affect strands in boundary_strands for s in reversed(crossings): if isinstance(s, Strand): comp = self.components[s.strand_component] - - if isinstance(comp[0].crossing, Tangle): - for cep in reversed(comp): - if cep.crossing == s: - comp.remove(cep) - break - else: - raise RuntimeError(f"Component strand {s} not found in component {comp}") + for cep in reversed(comp): + if cep.crossing == s: + comp.remove(cep) + break + else: + raise RuntimeError(f"Component strand {s} not found in component {comp}") # Note that the components are always built following the orientation # hence below always insists that the comp_id is labeled on the entrance strand - if s.component_idx is not None: - comp_id = s.component_idx - if comp[1].crossing.component_idx is not None: - assert comp[1].crossing.component_idx == comp_id - else: - comp[1].crossing.component_idx = comp_id + if s.component_idx is not None: + assert isinstance(comp[0].crossing, Tangle), f'Strands with component_idx should be in an unclosed component' + + comp_id = s.component_idx + if comp[1].crossing.component_idx is not None: + assert comp[1].crossing.component_idx == comp_id + else: + comp[1].crossing.component_idx = comp_id + if s.is_loop(): self.unlinked_unknot_components += 1 else: s.fuse() self.crossings.remove(s) + + if check_planarity and not self.is_planar(): + raise ValueError("Tangle isn't planar") def __getitem__(self, i): return (self, i % (self.boundary[0] + self.boundary[1])) @@ -273,10 +280,15 @@ def make_upward(self): self.reverse_orientation(to_reverse) def entry_points(self): - assert self.is_oriented(), 'Tangle should be oriented to tell the entry points' + assert self.is_oriented(), 'Tangle should be oriented for the entry points to make sense' return [CrossingEntryPoint(self, i) for i in range(self.boundary[0] + self.boundary[1]) if self.boundary_signs[i] == -1] + def exit_points(self): + assert self.is_oriented(), 'Tangle should be oriented for the exit points to make sense' + return [CrossingStrand(self, i) for i in range(self.boundary[0] + self.boundary[1]) + if self.boundary_signs[i] == 1] + def update_label(self, label): self.label = label for i, s in enumerate(self.boundary_strands): @@ -388,7 +400,10 @@ def _build_components(self, component_starts=None): >>> len(Tangle(3, [[0,4,1,5],[1,8,2,9],[2,7,3,6],[5,9,6,10]], ... [0,4,8,10,3,7], label = 'RIII').components) 3 - >>> len(((RationalTangle(2,3)+IdentityBraid(1))|(RationalTangle(2,5)+ComponentTangle(-1))).components) + + >>> T1 = RationalTangle(2,3)+IdentityBraid(1) + >>> T2 = RationalTangle(2,5)+ComponentTangle(-1) + >>> len((T1|T2).components) 2 """ if component_starts is not None: @@ -494,7 +509,7 @@ def _crossings_from_PD_code(self, code, entry_points): if any(len(v) > 2 for v in gluings.values()): raise ValueError("PD code isn't consistent") - crossings = [Crossing(i) for i, d in enumerate(code)] + crossings = [Crossing(i) for i, _ in enumerate(code)] for item in gluings.values(): if len(item) > 1: @@ -526,13 +541,15 @@ def _crossings_from_PD_code(self, code, entry_points): return crossings, component_starts, entry_strands - def PD_code(self, KnotTheory=False, min_strand_index = 0): + def PD_code(self, KnotTheory=False, min_strand_index=0): """ - The planar diagram code for the tangle. Unlike for links, it returns two extra fields, - boundary and entry_info in addition to the PD code of crossings, in order to specify - how the boundary and entries of the tangle is arranged. The fields are ordered as follows: + The planar diagram code for the tangle. + + Unlike for links, it returns two extra fields, boundary and entry_info + in addition to the PD code of crossings, in order to specify how the boundary + and entries of the tangle is arranged. The fields are ordered as: - boundary, PD, entry_info + boundary, PD, entry_info so that they can be unpacked immediately for creating Tangles. @@ -557,6 +574,202 @@ def PD_code(self, KnotTheory=False, min_strand_index = 0): PD = [tuple(x) for x in PD] return self.boundary, PD, entry_info + + def rot_num(self): + """ + Requires self to be upward oriented so that the entry strands + of crossings make sense for computing rotation numbers. + + Rotation numbers should always be all zeros for BraidTangles: + + >>> BraidTangle([1,2,1]).rot_num() + [0, 0, 0, 0, 0, 0, 0, 0, 0] + + The following gives the rotation number of a long diagram of the 4_1 knot: + + >>> T1 = Tangle((1,1), [(5,1,6,0), (1,5,2,4),(7,2,8,3),(3,6,4,7)], [0,8]) + >>> T1.rot_num() + [0, 0, 0, 0, 1, -1, -1, 1, 0] + + A (2,2)-tangle obtained by cutting 4_1 twice: + + >>> T2 = Tangle((2,2), [(6,1,7,0), (1,5,2,4),(8,2,9,3),(3,7,4,8)], [0,6,9,5]) + >>> T2.rot_num() + [0, 0, 0, 0, 1, 0, 0, -1, 1, 0] + + Works also for tangles with disconnected shadow graphs: + + >>> (T1|T2).rot_num() + [0, 0, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 1, 0] + + Entry strands may have nonzero rotation numbers: + + >>> T = Tangle((2, 2),\ + [(9, 2, 10, 3), (1, 10, 2, 11), (6, 12, 7, 11), \ + (12, 6, 13, 5), (3, 1, 4, 0), (4, 7, 5, 8)], \ + [0, 9, 8, 13]) + >>> T.rot_num() + [0, 0, 0, -1, 0, 0, 0, -1, 0, 1, -1, 1, -1, 0] + """ + assert self.is_upward(), 'Tangle should be upward oriented in order to compute rotation numbers' + assert self.boundary[0] == self.boundary[1] + + n = len(self.crossings) + ans = [0 for i in range(2 * n + self.boundary[0])] + + front = [self.strand_labels[0]] + next_entry_id = 1 + + #entry_strands = set([cep.strand_label() for cep in self.entry_points()]) + exit_strands = set([cs.strand_label() for cs in self.exit_points()]) + + to_do = set([s for s in self.strand_labels] + [s for c in self.crossings for s in c.strand_labels]) - exit_strands + + def next_arc(): + nonlocal next_entry_id + + inter = set(front) & to_do + if inter: + return min(inter) + else: + assert next_entry_id < self.boundary[0] + arc = self.strand_labels[next_entry_id] + front.append(arc) + next_entry_id += 1 + return arc + + def entry_crossing(k): + for c in self.crossings: + if k in [cep.strand_label() for cep in c.entry_points()]: + return c + + raise ValueError(f'No crossing contains strand labeled {k}') + + while to_do: + k = next_arc() + + if ~k not in front: + c = entry_crossing(k) + entry_arcs = c.entry_points() if c.sign == -1 else list(reversed(c.entry_points())) + left_label = entry_arcs[0].strand_label() + i = front.index(k) + + if left_label == k: + front[i:i+1] = entry_arcs[1].rotate(2).strand_label(), \ + entry_arcs[0].rotate(2).strand_label(), \ + ~entry_arcs[1].strand_label() + else: + #if left_label not in entry_strands: + ans[left_label] += 1 + front[i:i+1] = ~left_label, \ + entry_arcs[1].rotate(2).strand_label(), \ + entry_arcs[0].rotate(2).strand_label() + + elif [s for s in front if s in [k, ~k]] == [k, ~k]: + ans[k] += -1 + + to_do.remove(k) + + for s in exit_strands: + assert ans[s] == 0 + + return ans + + def flip(self): + """ + Given a Tangle, flip it over in 3D along the vertical axis. + Preserves the orientation of the original tangle. + + >>> RT = RationalTangle + >>> T = (RT(3, 4) + RT(1, 2)) * RT(-3, 2) + >>> T.PD_code() # doctest: +NORMALIZE_WHITESPACE + ((2, 2), [(18, 8, 19, 7), (6, 16, 7, 15), (14, 6, 15, 5), + (4, 14, 5, 19), (12, 17, 13, 18), (16, 11, 17, 12), (3, 1, 4, 0), + (1, 10, 2, 11), (9, 2, 10, 3)], [0, 9, 8, 13]) + + >>> fT = T.flip() + >>> fT.PD_code() # doctest: +NORMALIZE_WHITESPACE + ((2, 2), [(12, 16, 13, 15), (18, 12, 19, 11), (10, 18, 11, 17), + (16, 10, 17, 9), (14, 3, 15, 4), (2, 19, 3, 14), (5, 9, 6, 8), + (1, 6, 2, 7), (7, 0, 8, 1)], [0, 5, 4, 13]) + >>> T.flip().flip().PD_code() == T.PD_code() + True + + >>> rT = T.circular_rotate(1) + >>> rT.boundary_signs + [-1, 1, -1, 1] + >>> rT.flip().boundary_signs + [1, -1, 1, -1] + + Some tests for corner cases: + + >>> T = Tangle((2,0), [], [0,0]) + >>> T.boundary_signs + [-1, 1] + >>> T.flip().boundary_signs + [1, -1] + >>> T = Tangle((0,2), [], [0,0]) + >>> T.boundary_signs + [-1, 1] + >>> T.flip().boundary_signs + [1, -1] + """ + cross_perm = (1, 0, 3, 2) + + boundary_perm = [self.boundary[0] - 1 - i for i in range(self.boundary[0])] + \ + [self.boundary[0] + self.boundary[1] - 1 - i for i in range(self.boundary[1])] + + crossings = [Crossing(i) for i, _ in enumerate(self.crossings)] + \ + [Strand(len(self.crossings) + i) for i, _ in enumerate(self.boundary_strands)] + + old_crossings = self.crossings + self.boundary_strands + old_to_index = {C: i for i, C in enumerate(old_crossings)} + + start_css = self._start_orientations() + + entry_points_dict = {} + + def old_to_new(crossing, strand): + C = crossings[old_to_index[crossing]] + if isinstance(crossing, Strand): + return (C, strand) + else: + return (C, cross_perm[strand]) + + # This glues everything twice, but... + for i, C_new in enumerate(crossings): + C_old = old_crossings[i] + for i in range(C_new._adjacent_len): + D_old, j = C_old.adjacent[i] + + if isinstance(D_old, Tangle): + assert isinstance(C_new, Strand) + entry_points_dict[boundary_perm[j]] = (C_new, i) + else: + if isinstance(C_new, Strand): + C_new[i] = old_to_new(D_old, j) + else: + C_new[cross_perm[i]] = old_to_new(D_old, j) + + + new_start_css = [] + for css in start_css: + c, s = css + new_start_css.append(old_to_new(c, s)) + + return Tangle(self.boundary, crossings, [entry_points_dict[i] for i in range(len(entry_points_dict))], start_orientations=new_start_css) + + def reshetikhin_turaev_network(self, tensors): + """ + tensors should either be None or an instance of reshetikhin_turaev.RMatrix + """ + return RTNetwork(tensors, T = self) + + def contraction_width(self, omit_idle_arcs = True): + return RTNetwork(None, T = self).contraction_width(omit_idle_arcs = omit_idle_arcs) + + def contraction_sequence(self, omit_idle_arcs = True): + return RTNetwork(None, T = self).contraction_sequence(omit_idle_arcs = omit_idle_arcs) def _component_starts_from_PD(self, code, labels, gluings, entry_dict): """ @@ -646,8 +859,10 @@ def _component_starts_from_PD(self, code, labels, gluings, entry_dict): # The following operators always clear the current orientations on both tangles # and recreate an orientation with default behaviour. def __add__(self, other): - """Put self to left of other and fuse the top-right strand of self to the top-left - strand of other and the bottom-right strand of self to the bottom-left strand of other. + """ + Put self to left of other and fuse the top-right strand of self to + the top-left strand of other and the bottom-right strand of self to + the bottom-left strand of other. >>> (IdentityBraid(2) + BraidTangle([1])).describe() 'Tangle[{1,2}, {3,4}, X[2,4,5,5], P[1,3]]' @@ -726,7 +941,9 @@ def _start_orientations(self): def __or__(self, other): """ - Put self to left of other. This is like tangle addition but without the fusing of strands. + Put self to left of other. + This is like tangle addition but without the fusing of strands. + Preserves the orientations of both tangles, since no gluing happens. >>> (IdentityBraid(1) | CupTangle()).describe() @@ -762,7 +979,10 @@ def copy(self): return pickle.loads(pickle.dumps(self)) def rotate(self, s): - """Rotate anticlockwise by s*90 degrees. This is only for (2,2) tangles. + """ + Rotate anticlockwise by s*90 degrees. This is only for (2,2) tangles. + + Preserves orientation of the tangle. See ``Tangle.reshape()`` for a generalization to all tangle shapes.""" if self.boundary != (2, 2): @@ -793,6 +1013,12 @@ def numerator_closure(self): A synonym for this is ``Tangle.bridge_closure()``. + >>> BraidTangle([2,-1,2],4).numerator_closure().colored_jones_polynomial(1) + -q^-4 + q^-3 + q^-1 + >>> K = BraidTangle([1,1,1]).rotate(1).numerator_closure() + >>> K.colored_jones_polynomial(1) + q + q^3 - q^4 + sage: BraidTangle([2,-1,2],4).numerator_closure().alexander_polynomial() t^2 - t + 1 sage: BraidTangle([1,1,1]).rotate(1).numerator_closure().alexander_polynomial() @@ -824,7 +1050,9 @@ def denominator_closure(self): t^2 - t + 1 sage: BraidTangle([1,-2,1,-2]).braid_closure().alexander_polynomial() t^2 - 3*t + 1 - >>> BraidTangle([1,-2,1,-2]).braid_closure().exterior().identify() # doctest: +SNAPPY + + >>> K = BraidTangle([1,-2,1,-2]).braid_closure() + >>> K.exterior().identify() # doctest: +SNAPPY [m004(0,0), 4_1(0,0), K2_1(0,0), K4a1(0,0), otet02_00001(0,0)] """ m, n = self.boundary @@ -860,6 +1088,7 @@ def reshape(self, boundary, displace=0): becomes the new lower-left strand). This is a generalization of ``Tangle.rotate()``. + Preserves the orientation of the tangle. >>> T = BraidTangle([1,2,1]) >>> T.PD_code() @@ -900,6 +1129,7 @@ def reshape(self, boundary, displace=0): def circular_rotate(self, n): """ Rotate a tangle in a circular fashion clockwise, keeping the same boundary. + Preserves orientation of the tangle. This generalizes ``Tangle.rotate()``, and it is a mild specialization of ``Tangle.reshape()``. """ @@ -941,7 +1171,9 @@ def isosig(self, root=None, over_or_under=False): True >>> BraidTangle([1,1]).isosig() == BraidTangle([-1,-1]).isosig() True - >>> BraidTangle([1,1]).isosig(over_or_under=True) == BraidTangle([-1,-1]).isosig(over_or_under=True) + >>> iso1 = BraidTangle([1,1]).isosig(over_or_under=True) + >>> iso2 = BraidTangle([-1,-1]).isosig(over_or_under=True) + >>> iso1 == iso2 False """ @@ -1009,9 +1241,14 @@ def faces(self): similarly, if c is the tangle itself, it denots the corner as one stands at the j-th boundary entry and look *counterclockwisely*. + Boundary points of the tangle are seen as points with induced orientations + from the oriented strands of the tangle. + Alternatively, the sequence of CrossingStrands can be regarded as the *heads* of the oriented edges of the face. + >>> len(Tangle((2,0),[],[0,0]).faces()) + 2 >>> len(IdentityBraid(2).faces()) 3 >>> len(BraidTangle([1,2,1]).faces()) @@ -1029,14 +1266,20 @@ def faces(self): c, e = next.crossing, next.strand_index if isinstance(c, Tangle): if e == 0: - next = CrossingStrand(*c.adjacent[c.boundary[0]]) + if c.boundary[1] and c.boundary[0]: + next = CrossingStrand(*c.adjacent[c.boundary[0]]) + else: + next = CrossingStrand(*c.adjacent[c.boundary[0]-1]) elif e < c.boundary[0]: next = CrossingStrand(*c.adjacent[e-1]) elif e < c.boundary[0] + c.boundary[1] - 1: next = CrossingStrand(*c.adjacent[e+1]) else: assert e == c.boundary[0] + c.boundary[1] - 1 - next = CrossingStrand(*c.adjacent[c.boundary[0]-1]) + if c.boundary[0]: + next = CrossingStrand(*c.adjacent[c.boundary[0]-1]) + else: + next = CrossingStrand(*c.adjacent[c.boundary[0]]) else: next = next.next_corner() @@ -1048,8 +1291,125 @@ def faces(self): face.append(next) return faces + + def digraph(self): + """ + The underlying directed graph for the tangle diagram. + """ + G = graphs.Digraph() + for component in self.components: + if isinstance(component[0].crossing, Tangle): + # Strip off the first element which is not an *entry* strand. + comp = component[1:] + else: + comp = component + for c in comp: + cs0 = CrossingStrand(c.crossing, c.strand_index) + cs1 = cs0.opposite() + + node0 = cs0.crossing if not isinstance(cs0.crossing, Tangle) else cs0 + node1 = cs1.crossing if not isinstance(cs1.crossing, Tangle) else cs1 + + G.add_edge(node0, node1) + + assert len(G.edges) == 2 * len(self.crossings) + (3 * len(self.boundary_strands) // 2) + + return G + + def split_tangle_diagram(self, destroy_original=False, check_planarity=False): + """ + Split the tangle diagram into its connected components. + Returns a list of Tangles. + + If check_planarity is True, return in addition if the boundary strands + of the components are laid out in a planar manner with respect to each other. + + >>> len(RationalTangle(0,1).split_tangle_diagram()) + 2 + + >>> len(Tangle(4, [(0, 2, 1, 3)], [0,2,4,5,3,1,4,5]).split_tangle_diagram()) + 3 + + >>> np_T = Tangle(4, [(0, 2, 1, 3)], [0,4,2,5,3,1,4,5], check_planarity=False) + >>> np_T.split_tangle_diagram(check_planarity=True)[0] + False + """ + T = self.copy() if not destroy_original else self + components = T.digraph().weak_components() + + ans = [] + boundary_index = dict() + counterclock_bd_id = [i for i in range(T.boundary[0])] + list(reversed([T.boundary[0] + i for i in range(T.boundary[1])])) + + for i, component in enumerate(components): + boundaries = [] + crossings = [] # Strands will be included here + for c in component: + if isinstance(c, CrossingStrand): + boundaries.append(c) + else: + assert isinstance(c, (Crossing, Strand)) + crossings.append(c) + + boundaries.sort(key = lambda cs: cs.strand_index) + + boundary = (len([cs for cs in boundaries if cs.strand_index < T.boundary[0]]), + len([cs for cs in boundaries if cs.strand_index >= T.boundary[0]])) + entry_points = [cs.opposite() for cs in boundaries] + start_orientations = [(cs.crossing, 1) for cs in entry_points] + + for cs in boundaries: + boundary_index.setdefault(i, []).append(cs.strand_index) + + ans.append(Tangle(boundary, crossings, entry_points, + label = f'{self.label}_component_{i}', + start_orientations = start_orientations, + check_planarity = False)) + + if not check_planarity: + return ans + else: + # Here we only check whether the boundary strands of components + # are laied out in a planar manner with respect to each other. + for i in range(len(ans)): + for j in range(len(ans)): + if i != j: + counterclock_i = [counterclock_bd_id[k] for k in boundary_index[i]] + i_min = min(counterclock_i) + i_max = max(counterclock_i) + + in_between = [i_min < counterclock_bd_id[k] < i_max for k in boundary_index[j]] + + if any(in_between): + if not all(in_between): + return (False, ans) + + return (True, ans) + + def is_planar(self): + """ + Checks whether the tangle diagram can be planarly embedded into the disk. + + >>> np_T = Tangle(4, [(0, 2, 1, 3)], [2,0,4,5,3,1,4,5], check_planarity = False) + >>> np_T.is_planar() + False + """ + G = self.digraph() + if not G.is_weakly_connected(): + boundary_planarity, components = self.split_tangle_diagram(destroy_original = False, check_planarity = True) + if not boundary_planarity: + return False + else: + return all([c.is_planar() for c in components]) + + v = len(self.crossings) + len(self.boundary_strands) + 1 + # view the boundary as a vertex at infinity + + euler = v - len(G.edges) + len(self.faces()) + + return euler == 2 or v == 1 - def simplify(self, mode = 'basic', type_III_limit = 100): + def simplify(self, mode='basic', type_III_limit=100): """ Tries to simplify the tangle diagram. Returns whether it succeeded in reducing the number of crossings. Modifies the tangle in place, @@ -1102,7 +1462,8 @@ def simplify(self, mode = 'basic', type_III_limit = 100): raise NotImplementedError() def is_planar_isotopic(self, other, root=None, over_or_under=False) -> bool: - return self.isosig(root = root, over_or_under=over_or_under) == other.isosig(root = root, over_or_under = over_or_under) + return self.isosig(root=root, over_or_under=over_or_under) == \ + other.isosig(root=root, over_or_under=over_or_under) def __repr__(self): return "" % (self.label, len(self.components), len(self.crossings), self.boundary[0], self.boundary[1]) @@ -1163,7 +1524,7 @@ def ComponentTangle(component_idx): ValueError: Two Strand objects in different components have the same component_idx values """ s = Strand(component_idx=component_idx) - return Tangle((1, 1), [s], [(s, 0), (s, 1)], label = f'ComponentTangle({component_idx})') + return Tangle((1, 1), [s], [(s, 0), (s, 1)], label=f'ComponentTangle({component_idx})') def CapTangle(): @@ -1286,7 +1647,7 @@ def __init__(self, a, b=1): Tangle.__init__(self, 2, crossings, T.adjacent, - label = f"RationalTangle({a}, {b})") + label=f"RationalTangle({a}, {b})") # --------------------------------------------------- # @@ -1316,7 +1677,7 @@ def IdentityBraid(n): raise ValueError("Expecting non-negative int") entry_points = 2* [i for i in range(n)] return Tangle(n, [], entry_points, - label = f"IdentityBraid({n})") + label=f"IdentityBraid({n})") def BraidTangle(gens, n=None): diff --git a/spherogram_src/test.py b/spherogram_src/test.py index 18c7d25..32b581d 100644 --- a/spherogram_src/test.py +++ b/spherogram_src/test.py @@ -43,6 +43,7 @@ spherogram.links.bands.core, spherogram.links.bands.search, spherogram.links.bands.regression, + spherogram.links.reshetikhin_turaev.dict_laurent_polynomial ] diff --git a/spherogram_src/version.py b/spherogram_src/version.py index dc4633d..2109f58 100644 --- a/spherogram_src/version.py +++ b/spherogram_src/version.py @@ -1 +1 @@ -version = '2.4.2b' +version = '2.4.3b'