passagemath-graphs 10.6.1rc1__cp310-cp310-musllinux_1_2_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. passagemath_graphs-10.6.1rc1.dist-info/METADATA +292 -0
  2. passagemath_graphs-10.6.1rc1.dist-info/RECORD +260 -0
  3. passagemath_graphs-10.6.1rc1.dist-info/WHEEL +5 -0
  4. passagemath_graphs-10.6.1rc1.dist-info/top_level.txt +2 -0
  5. passagemath_graphs.libs/libgcc_s-69c45f16.so.1 +0 -0
  6. passagemath_graphs.libs/libgmp-8e78bd9b.so.10.5.0 +0 -0
  7. passagemath_graphs.libs/libstdc++-1f1a71be.so.6.0.33 +0 -0
  8. sage/all__sagemath_graphs.py +39 -0
  9. sage/combinat/abstract_tree.py +2723 -0
  10. sage/combinat/all__sagemath_graphs.py +34 -0
  11. sage/combinat/binary_tree.py +5306 -0
  12. sage/combinat/cluster_algebra_quiver/all.py +22 -0
  13. sage/combinat/cluster_algebra_quiver/cluster_seed.py +5208 -0
  14. sage/combinat/cluster_algebra_quiver/interact.py +124 -0
  15. sage/combinat/cluster_algebra_quiver/mutation_class.py +625 -0
  16. sage/combinat/cluster_algebra_quiver/mutation_type.py +1555 -0
  17. sage/combinat/cluster_algebra_quiver/quiver.py +2290 -0
  18. sage/combinat/cluster_algebra_quiver/quiver_mutation_type.py +2468 -0
  19. sage/combinat/designs/MOLS_handbook_data.py +570 -0
  20. sage/combinat/designs/all.py +58 -0
  21. sage/combinat/designs/bibd.py +1655 -0
  22. sage/combinat/designs/block_design.py +1071 -0
  23. sage/combinat/designs/covering_array.py +269 -0
  24. sage/combinat/designs/covering_design.py +530 -0
  25. sage/combinat/designs/database.py +5615 -0
  26. sage/combinat/designs/design_catalog.py +122 -0
  27. sage/combinat/designs/designs_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
  28. sage/combinat/designs/designs_pyx.pxd +21 -0
  29. sage/combinat/designs/designs_pyx.pyx +993 -0
  30. sage/combinat/designs/difference_family.py +3951 -0
  31. sage/combinat/designs/difference_matrices.py +279 -0
  32. sage/combinat/designs/evenly_distributed_sets.cpython-310-aarch64-linux-gnu.so +0 -0
  33. sage/combinat/designs/evenly_distributed_sets.pyx +661 -0
  34. sage/combinat/designs/ext_rep.py +1064 -0
  35. sage/combinat/designs/gen_quadrangles_with_spread.cpython-310-aarch64-linux-gnu.so +0 -0
  36. sage/combinat/designs/gen_quadrangles_with_spread.pyx +339 -0
  37. sage/combinat/designs/group_divisible_designs.py +361 -0
  38. sage/combinat/designs/incidence_structures.py +2357 -0
  39. sage/combinat/designs/latin_squares.py +581 -0
  40. sage/combinat/designs/orthogonal_arrays.py +2244 -0
  41. sage/combinat/designs/orthogonal_arrays_build_recursive.py +1780 -0
  42. sage/combinat/designs/orthogonal_arrays_find_recursive.cpython-310-aarch64-linux-gnu.so +0 -0
  43. sage/combinat/designs/orthogonal_arrays_find_recursive.pyx +967 -0
  44. sage/combinat/designs/resolvable_bibd.py +815 -0
  45. sage/combinat/designs/steiner_quadruple_systems.py +1306 -0
  46. sage/combinat/designs/subhypergraph_search.cpython-310-aarch64-linux-gnu.so +0 -0
  47. sage/combinat/designs/subhypergraph_search.pyx +530 -0
  48. sage/combinat/designs/twographs.py +306 -0
  49. sage/combinat/finite_state_machine.py +14874 -0
  50. sage/combinat/finite_state_machine_generators.py +2006 -0
  51. sage/combinat/graph_path.py +448 -0
  52. sage/combinat/interval_posets.py +3908 -0
  53. sage/combinat/nu_tamari_lattice.py +269 -0
  54. sage/combinat/ordered_tree.py +1446 -0
  55. sage/combinat/posets/all.py +46 -0
  56. sage/combinat/posets/bubble_shuffle.py +247 -0
  57. sage/combinat/posets/cartesian_product.py +493 -0
  58. sage/combinat/posets/d_complete.py +182 -0
  59. sage/combinat/posets/elements.py +273 -0
  60. sage/combinat/posets/forest.py +30 -0
  61. sage/combinat/posets/hasse_cython.cpython-310-aarch64-linux-gnu.so +0 -0
  62. sage/combinat/posets/hasse_cython.pyx +174 -0
  63. sage/combinat/posets/hasse_diagram.py +3672 -0
  64. sage/combinat/posets/hochschild_lattice.py +158 -0
  65. sage/combinat/posets/incidence_algebras.py +794 -0
  66. sage/combinat/posets/lattices.py +5117 -0
  67. sage/combinat/posets/linear_extension_iterator.cpython-310-aarch64-linux-gnu.so +0 -0
  68. sage/combinat/posets/linear_extension_iterator.pyx +292 -0
  69. sage/combinat/posets/linear_extensions.py +1037 -0
  70. sage/combinat/posets/mobile.py +275 -0
  71. sage/combinat/posets/moebius_algebra.py +776 -0
  72. sage/combinat/posets/poset_examples.py +2178 -0
  73. sage/combinat/posets/posets.py +9360 -0
  74. sage/combinat/rooted_tree.py +1070 -0
  75. sage/combinat/shard_order.py +239 -0
  76. sage/combinat/tamari_lattices.py +384 -0
  77. sage/combinat/yang_baxter_graph.py +923 -0
  78. sage/databases/all__sagemath_graphs.py +1 -0
  79. sage/databases/knotinfo_db.py +1231 -0
  80. sage/ext_data/all__sagemath_graphs.py +1 -0
  81. sage/ext_data/graphs/graph_plot_js.html +330 -0
  82. sage/ext_data/kenzo/CP2.txt +45 -0
  83. sage/ext_data/kenzo/CP3.txt +349 -0
  84. sage/ext_data/kenzo/CP4.txt +4774 -0
  85. sage/ext_data/kenzo/README.txt +49 -0
  86. sage/ext_data/kenzo/S4.txt +20 -0
  87. sage/graphs/all.py +42 -0
  88. sage/graphs/asteroidal_triples.cpython-310-aarch64-linux-gnu.so +0 -0
  89. sage/graphs/asteroidal_triples.pyx +320 -0
  90. sage/graphs/base/all.py +1 -0
  91. sage/graphs/base/boost_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  92. sage/graphs/base/boost_graph.pxd +106 -0
  93. sage/graphs/base/boost_graph.pyx +3045 -0
  94. sage/graphs/base/c_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  95. sage/graphs/base/c_graph.pxd +106 -0
  96. sage/graphs/base/c_graph.pyx +5096 -0
  97. sage/graphs/base/dense_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  98. sage/graphs/base/dense_graph.pxd +28 -0
  99. sage/graphs/base/dense_graph.pyx +801 -0
  100. sage/graphs/base/graph_backends.cpython-310-aarch64-linux-gnu.so +0 -0
  101. sage/graphs/base/graph_backends.pxd +5 -0
  102. sage/graphs/base/graph_backends.pyx +797 -0
  103. sage/graphs/base/overview.py +85 -0
  104. sage/graphs/base/sparse_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  105. sage/graphs/base/sparse_graph.pxd +90 -0
  106. sage/graphs/base/sparse_graph.pyx +1653 -0
  107. sage/graphs/base/static_dense_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  108. sage/graphs/base/static_dense_graph.pxd +5 -0
  109. sage/graphs/base/static_dense_graph.pyx +1032 -0
  110. sage/graphs/base/static_sparse_backend.cpython-310-aarch64-linux-gnu.so +0 -0
  111. sage/graphs/base/static_sparse_backend.pxd +27 -0
  112. sage/graphs/base/static_sparse_backend.pyx +1583 -0
  113. sage/graphs/base/static_sparse_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  114. sage/graphs/base/static_sparse_graph.pxd +37 -0
  115. sage/graphs/base/static_sparse_graph.pyx +1375 -0
  116. sage/graphs/bipartite_graph.py +2732 -0
  117. sage/graphs/centrality.cpython-310-aarch64-linux-gnu.so +0 -0
  118. sage/graphs/centrality.pyx +1038 -0
  119. sage/graphs/cographs.py +519 -0
  120. sage/graphs/comparability.cpython-310-aarch64-linux-gnu.so +0 -0
  121. sage/graphs/comparability.pyx +851 -0
  122. sage/graphs/connectivity.cpython-310-aarch64-linux-gnu.so +0 -0
  123. sage/graphs/connectivity.pxd +157 -0
  124. sage/graphs/connectivity.pyx +4813 -0
  125. sage/graphs/convexity_properties.cpython-310-aarch64-linux-gnu.so +0 -0
  126. sage/graphs/convexity_properties.pxd +16 -0
  127. sage/graphs/convexity_properties.pyx +870 -0
  128. sage/graphs/digraph.py +4754 -0
  129. sage/graphs/digraph_generators.py +1993 -0
  130. sage/graphs/distances_all_pairs.cpython-310-aarch64-linux-gnu.so +0 -0
  131. sage/graphs/distances_all_pairs.pxd +12 -0
  132. sage/graphs/distances_all_pairs.pyx +2938 -0
  133. sage/graphs/domination.py +1363 -0
  134. sage/graphs/dot2tex_utils.py +100 -0
  135. sage/graphs/edge_connectivity.cpython-310-aarch64-linux-gnu.so +0 -0
  136. sage/graphs/edge_connectivity.pyx +1215 -0
  137. sage/graphs/generators/all.py +1 -0
  138. sage/graphs/generators/basic.py +1769 -0
  139. sage/graphs/generators/chessboard.py +538 -0
  140. sage/graphs/generators/classical_geometries.py +1611 -0
  141. sage/graphs/generators/degree_sequence.py +235 -0
  142. sage/graphs/generators/distance_regular.cpython-310-aarch64-linux-gnu.so +0 -0
  143. sage/graphs/generators/distance_regular.pyx +2846 -0
  144. sage/graphs/generators/families.py +4759 -0
  145. sage/graphs/generators/intersection.py +565 -0
  146. sage/graphs/generators/platonic_solids.py +262 -0
  147. sage/graphs/generators/random.py +2623 -0
  148. sage/graphs/generators/smallgraphs.py +5741 -0
  149. sage/graphs/generators/world_map.py +724 -0
  150. sage/graphs/generic_graph.py +26867 -0
  151. sage/graphs/generic_graph_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
  152. sage/graphs/generic_graph_pyx.pxd +34 -0
  153. sage/graphs/generic_graph_pyx.pyx +1673 -0
  154. sage/graphs/genus.cpython-310-aarch64-linux-gnu.so +0 -0
  155. sage/graphs/genus.pyx +622 -0
  156. sage/graphs/graph.py +9645 -0
  157. sage/graphs/graph_coloring.cpython-310-aarch64-linux-gnu.so +0 -0
  158. sage/graphs/graph_coloring.pyx +2284 -0
  159. sage/graphs/graph_database.py +1177 -0
  160. sage/graphs/graph_decompositions/all.py +1 -0
  161. sage/graphs/graph_decompositions/bandwidth.cpython-310-aarch64-linux-gnu.so +0 -0
  162. sage/graphs/graph_decompositions/bandwidth.pyx +428 -0
  163. sage/graphs/graph_decompositions/clique_separators.cpython-310-aarch64-linux-gnu.so +0 -0
  164. sage/graphs/graph_decompositions/clique_separators.pyx +616 -0
  165. sage/graphs/graph_decompositions/cutwidth.cpython-310-aarch64-linux-gnu.so +0 -0
  166. sage/graphs/graph_decompositions/cutwidth.pyx +753 -0
  167. sage/graphs/graph_decompositions/fast_digraph.cpython-310-aarch64-linux-gnu.so +0 -0
  168. sage/graphs/graph_decompositions/fast_digraph.pxd +13 -0
  169. sage/graphs/graph_decompositions/fast_digraph.pyx +212 -0
  170. sage/graphs/graph_decompositions/graph_products.cpython-310-aarch64-linux-gnu.so +0 -0
  171. sage/graphs/graph_decompositions/graph_products.pyx +508 -0
  172. sage/graphs/graph_decompositions/modular_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
  173. sage/graphs/graph_decompositions/modular_decomposition.pxd +27 -0
  174. sage/graphs/graph_decompositions/modular_decomposition.pyx +1536 -0
  175. sage/graphs/graph_decompositions/slice_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
  176. sage/graphs/graph_decompositions/slice_decomposition.pxd +18 -0
  177. sage/graphs/graph_decompositions/slice_decomposition.pyx +1106 -0
  178. sage/graphs/graph_decompositions/tree_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
  179. sage/graphs/graph_decompositions/tree_decomposition.pxd +17 -0
  180. sage/graphs/graph_decompositions/tree_decomposition.pyx +1996 -0
  181. sage/graphs/graph_decompositions/vertex_separation.cpython-310-aarch64-linux-gnu.so +0 -0
  182. sage/graphs/graph_decompositions/vertex_separation.pxd +5 -0
  183. sage/graphs/graph_decompositions/vertex_separation.pyx +1963 -0
  184. sage/graphs/graph_editor.py +82 -0
  185. sage/graphs/graph_generators.py +3314 -0
  186. sage/graphs/graph_generators_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
  187. sage/graphs/graph_generators_pyx.pyx +95 -0
  188. sage/graphs/graph_input.py +812 -0
  189. sage/graphs/graph_latex.py +2064 -0
  190. sage/graphs/graph_list.py +410 -0
  191. sage/graphs/graph_plot.py +1756 -0
  192. sage/graphs/graph_plot_js.py +338 -0
  193. sage/graphs/hyperbolicity.cpython-310-aarch64-linux-gnu.so +0 -0
  194. sage/graphs/hyperbolicity.pyx +1704 -0
  195. sage/graphs/hypergraph_generators.py +364 -0
  196. sage/graphs/independent_sets.cpython-310-aarch64-linux-gnu.so +0 -0
  197. sage/graphs/independent_sets.pxd +13 -0
  198. sage/graphs/independent_sets.pyx +402 -0
  199. sage/graphs/isgci.py +1033 -0
  200. sage/graphs/isoperimetric_inequalities.cpython-310-aarch64-linux-gnu.so +0 -0
  201. sage/graphs/isoperimetric_inequalities.pyx +489 -0
  202. sage/graphs/line_graph.cpython-310-aarch64-linux-gnu.so +0 -0
  203. sage/graphs/line_graph.pyx +743 -0
  204. sage/graphs/lovasz_theta.py +77 -0
  205. sage/graphs/matching.py +1633 -0
  206. sage/graphs/matching_covered_graph.py +3590 -0
  207. sage/graphs/orientations.py +1489 -0
  208. sage/graphs/partial_cube.py +459 -0
  209. sage/graphs/path_enumeration.cpython-310-aarch64-linux-gnu.so +0 -0
  210. sage/graphs/path_enumeration.pyx +2040 -0
  211. sage/graphs/pq_trees.py +1129 -0
  212. sage/graphs/print_graphs.py +201 -0
  213. sage/graphs/schnyder.py +865 -0
  214. sage/graphs/spanning_tree.cpython-310-aarch64-linux-gnu.so +0 -0
  215. sage/graphs/spanning_tree.pyx +1457 -0
  216. sage/graphs/strongly_regular_db.cpython-310-aarch64-linux-gnu.so +0 -0
  217. sage/graphs/strongly_regular_db.pyx +3340 -0
  218. sage/graphs/traversals.cpython-310-aarch64-linux-gnu.so +0 -0
  219. sage/graphs/traversals.pxd +9 -0
  220. sage/graphs/traversals.pyx +1872 -0
  221. sage/graphs/trees.cpython-310-aarch64-linux-gnu.so +0 -0
  222. sage/graphs/trees.pxd +15 -0
  223. sage/graphs/trees.pyx +310 -0
  224. sage/graphs/tutte_polynomial.py +713 -0
  225. sage/graphs/views.cpython-310-aarch64-linux-gnu.so +0 -0
  226. sage/graphs/views.pyx +794 -0
  227. sage/graphs/weakly_chordal.cpython-310-aarch64-linux-gnu.so +0 -0
  228. sage/graphs/weakly_chordal.pyx +604 -0
  229. sage/groups/all__sagemath_graphs.py +1 -0
  230. sage/groups/perm_gps/all__sagemath_graphs.py +1 -0
  231. sage/groups/perm_gps/partn_ref/all__sagemath_graphs.py +1 -0
  232. sage/groups/perm_gps/partn_ref/refinement_graphs.cpython-310-aarch64-linux-gnu.so +0 -0
  233. sage/groups/perm_gps/partn_ref/refinement_graphs.pxd +38 -0
  234. sage/groups/perm_gps/partn_ref/refinement_graphs.pyx +1666 -0
  235. sage/knots/all.py +6 -0
  236. sage/knots/free_knotinfo_monoid.py +507 -0
  237. sage/knots/gauss_code.py +291 -0
  238. sage/knots/knot.py +682 -0
  239. sage/knots/knot_table.py +284 -0
  240. sage/knots/knotinfo.py +2900 -0
  241. sage/knots/link.py +4715 -0
  242. sage/sandpiles/all.py +13 -0
  243. sage/sandpiles/examples.py +225 -0
  244. sage/sandpiles/sandpile.py +6365 -0
  245. sage/topology/all.py +22 -0
  246. sage/topology/cell_complex.py +1214 -0
  247. sage/topology/cubical_complex.py +1976 -0
  248. sage/topology/delta_complex.py +1806 -0
  249. sage/topology/filtered_simplicial_complex.py +744 -0
  250. sage/topology/moment_angle_complex.py +823 -0
  251. sage/topology/simplicial_complex.py +5160 -0
  252. sage/topology/simplicial_complex_catalog.py +92 -0
  253. sage/topology/simplicial_complex_examples.py +1680 -0
  254. sage/topology/simplicial_complex_homset.py +205 -0
  255. sage/topology/simplicial_complex_morphism.py +836 -0
  256. sage/topology/simplicial_set.py +4102 -0
  257. sage/topology/simplicial_set_catalog.py +55 -0
  258. sage/topology/simplicial_set_constructions.py +2954 -0
  259. sage/topology/simplicial_set_examples.py +865 -0
  260. sage/topology/simplicial_set_morphism.py +1464 -0
@@ -0,0 +1,279 @@
1
+ # sage_setup: distribution = sagemath-graphs
2
+ # sage.doctest: needs sage.rings.finite_rings
3
+ r"""
4
+ Difference matrices
5
+
6
+ This module gathers code related to difference matrices. One can build those
7
+ objects (or know if they can be built) with :func:`difference_matrix`::
8
+
9
+ sage: G,DM = designs.difference_matrix(9,5,1)
10
+
11
+ Functions
12
+ ---------
13
+ """
14
+
15
+ from sage.arith.misc import divisors, is_prime_power
16
+ from sage.misc.unknown import Unknown
17
+ from sage.misc.cachefunc import cached_function
18
+ from sage.categories.sets_cat import EmptySetError
19
+ from sage.rings.finite_rings.finite_field_constructor import FiniteField
20
+ from .designs_pyx import is_difference_matrix
21
+ from .database import DM as DM_constructions
22
+
23
+
24
+ @cached_function
25
+ def find_product_decomposition(g, k, lmbda=1):
26
+ r"""
27
+ Try to find a product decomposition construction for difference matrices.
28
+
29
+ INPUT:
30
+
31
+ - ``g``, ``k``, ``lmbda`` -- integers, parameters of the difference matrix
32
+
33
+ OUTPUT:
34
+
35
+ A pair of pairs ``(g1,lmbda),(g2,lmbda2)`` if Sage knows how to build
36
+ `(g1,k,lmbda1)` and `(g2,k,lmbda2)` difference matrices and ``False``
37
+ otherwise.
38
+
39
+ EXAMPLES::
40
+
41
+ sage: from sage.combinat.designs.difference_matrices import find_product_decomposition
42
+ sage: find_product_decomposition(77,6)
43
+ ((7, 1), (11, 1))
44
+ sage: find_product_decomposition(616,7)
45
+ ((7, 1), (88, 1))
46
+ sage: find_product_decomposition(24,10)
47
+ False
48
+ """
49
+ for lmbda1 in divisors(lmbda):
50
+ lmbda2 = lmbda//lmbda1
51
+
52
+ # To avoid infinite loop:
53
+ # if lmbda1 == lmbda, then g1 should not be g
54
+ # if lmbda2 == lmbda, then g2 should not be g
55
+ if lmbda1 == lmbda:
56
+ if lmbda2 == lmbda:
57
+ div = divisors(g)[1:-1]
58
+ else:
59
+ div = divisors(g)[:-1]
60
+ else:
61
+ if lmbda2 == lmbda:
62
+ div = divisors(g)[1:]
63
+ else:
64
+ div = divisors(g)
65
+
66
+ for g1 in div:
67
+ g2 = g//g1
68
+ if g1 > g2:
69
+ break
70
+ if (difference_matrix(g1,k,lmbda1,existence=True) is True and
71
+ difference_matrix(g2,k,lmbda2,existence=True) is True):
72
+ return (g1,lmbda1),(g2,lmbda2)
73
+
74
+ return False
75
+
76
+
77
+ def difference_matrix_product(k, M1, G1, lmbda1, M2, G2, lmbda2, check=True):
78
+ r"""
79
+ Return the product of the ``(G1, k, lmbda1)`` and ``(G2, k, lmbda2)``
80
+ difference matrices ``M1`` and ``M2``.
81
+
82
+ The result is a `(G1 \times G2, k, \lambda_1 \lambda_2)`-difference matrix.
83
+
84
+ INPUT:
85
+
86
+ - ``k``, ``lmbda1``, ``lmbda2`` -- positive integers
87
+
88
+ - ``G1``, ``G2`` -- groups
89
+
90
+ - ``M1``, ``M2`` -- ``(G1, k, lmbda1)`` and ``(G, k, lmbda2)`` difference
91
+ matrices
92
+
93
+ - ``check`` -- boolean (default: ``True``); whether to check the output
94
+ before it is returned
95
+
96
+ EXAMPLES::
97
+
98
+ sage: from sage.combinat.designs.difference_matrices import (
99
+ ....: difference_matrix_product,
100
+ ....: is_difference_matrix)
101
+ sage: G1,M1 = designs.difference_matrix(11,6)
102
+ sage: G2,M2 = designs.difference_matrix(7,6)
103
+ sage: G,M = difference_matrix_product(6,M1,G1,1,M2,G2,1)
104
+ sage: G1
105
+ Finite Field of size 11
106
+ sage: G2
107
+ Finite Field of size 7
108
+ sage: G
109
+ The Cartesian product of (Finite Field of size 11, Finite Field of size 7)
110
+ sage: is_difference_matrix(M,G,6,1)
111
+ True
112
+ """
113
+ g1 = G1.cardinality()
114
+ g2 = G2.cardinality()
115
+ g = g1*g2
116
+ lmbda = lmbda1*lmbda2
117
+ from sage.categories.cartesian_product import cartesian_product
118
+ G = cartesian_product([G1,G2])
119
+
120
+ M = [[G((M1[j1][i],M2[j2][i])) for i in range(k)] for j1 in range(lmbda1*g1) for j2 in range(lmbda2*g2)]
121
+
122
+ if check and not is_difference_matrix(M,G,k,lmbda,True):
123
+ raise RuntimeError("In the product construction, Sage built something which is not a ({},{},{})-DM!".format(g,k,lmbda))
124
+
125
+ return G,M
126
+
127
+
128
+ def difference_matrix(g, k, lmbda=1, existence=False, check=True):
129
+ r"""
130
+ Return a `(g,k,\lambda)`-difference matrix.
131
+
132
+ A matrix `M` is a `(g,k,\lambda)`-difference matrix if it has size `\lambda
133
+ g\times k`, its entries belong to the group `G` of cardinality `g`, and
134
+ for any two rows `R,R'` of `M` and `x\in G` there are exactly `\lambda`
135
+ values `i` such that `R_i-R'_i=x`.
136
+
137
+ INPUT:
138
+
139
+ - ``k`` -- integer; number of columns. If ``k`` is ``None`` it is set to the
140
+ largest value available
141
+
142
+ - ``g`` -- integer; cardinality of the group `G`
143
+
144
+ - ``lmbda`` -- integer (default: 1); number of times each element of `G`
145
+ appears as a difference
146
+
147
+ - ``check`` -- boolean (default: ``True``); whether to check that output is
148
+ correct before returning it. As this is expected to be useless, you may
149
+ want to disable it whenever you want speed.
150
+
151
+ - ``existence`` -- boolean; instead of building the design, return:
152
+
153
+ - ``True`` -- meaning that Sage knows how to build the design
154
+
155
+ - ``Unknown`` -- meaning that Sage does not know how to build the
156
+ design, but that the design may exist (see :mod:`sage.misc.unknown`)
157
+
158
+ - ``False`` -- meaning that the design does not exist
159
+
160
+ .. NOTE::
161
+
162
+ When ``k=None`` and ``existence=True`` the function returns an
163
+ integer, i.e. the largest `k` such that we can build a
164
+ `(g,k,\lambda)`-DM.
165
+
166
+ EXAMPLES::
167
+
168
+ sage: G,M = designs.difference_matrix(25,10); G
169
+ Finite Field in x of size 5^2
170
+ sage: designs.difference_matrix(993,None,existence=1)
171
+ 32
172
+
173
+ Here we print for each `g` the maximum possible `k` for which Sage knows
174
+ how to build a `(g,k,1)`-difference matrix::
175
+
176
+ sage: for g in range(2,30):
177
+ ....: k_max = designs.difference_matrix(g=g,k=None,existence=True)
178
+ ....: print("{:2} {}".format(g, k_max))
179
+ ....: _ = designs.difference_matrix(g,k_max)
180
+ 2 2
181
+ 3 3
182
+ 4 4
183
+ 5 5
184
+ 6 2
185
+ 7 7
186
+ 8 8
187
+ 9 9
188
+ 10 2
189
+ 11 11
190
+ 12 6
191
+ 13 13
192
+ 14 2
193
+ 15 3
194
+ 16 16
195
+ 17 17
196
+ 18 2
197
+ 19 19
198
+ 20 4
199
+ 21 6
200
+ 22 2
201
+ 23 23
202
+ 24 8
203
+ 25 25
204
+ 26 2
205
+ 27 27
206
+ 28 6
207
+ 29 29
208
+
209
+ TESTS::
210
+
211
+ sage: designs.difference_matrix(10,12,1,existence=True)
212
+ False
213
+ sage: designs.difference_matrix(10,12,1)
214
+ Traceback (most recent call last):
215
+ ...
216
+ EmptySetError: No (10,12,1)-Difference Matrix exists as k(=12)>g(=10)
217
+ sage: designs.difference_matrix(10,9,1,existence=True)
218
+ Unknown
219
+ sage: designs.difference_matrix(10,9,1)
220
+ Traceback (most recent call last):
221
+ ...
222
+ NotImplementedError: I don't know how to build a (10,9,1)-Difference Matrix!
223
+ """
224
+
225
+ if lmbda == 1 and k is not None and k > g:
226
+ if existence:
227
+ return False
228
+ raise EmptySetError("No ({},{},{})-Difference Matrix exists as k(={})>g(={})".format(g,k,lmbda,k,g))
229
+
230
+ # Prime powers
231
+ elif lmbda == 1 and is_prime_power(g):
232
+ if k is None:
233
+ if existence:
234
+ return g
235
+ else:
236
+ k = g
237
+ elif existence:
238
+ return True
239
+ F = FiniteField(g,'x')
240
+ F_set = list(F)
241
+ F_k_set = F_set[:k]
242
+
243
+ G = F
244
+ M = [[x*y for y in F_k_set] for x in F_set]
245
+
246
+ # Treat the case k=None
247
+ # (find the max k such that there exists a DM)
248
+ elif k is None:
249
+ i = 2
250
+ while difference_matrix(g=g,k=i,lmbda=lmbda,existence=True) is True:
251
+ i += 1
252
+ return i-1
253
+
254
+ # From the database
255
+ elif (g,lmbda) in DM_constructions and DM_constructions[g,lmbda][0] >= k:
256
+ if existence:
257
+ return True
258
+ _,f = DM_constructions[g,lmbda]
259
+ G, M = f()
260
+ M = [R[:k] for R in M]
261
+
262
+ # Product construction
263
+ elif find_product_decomposition(g,k,lmbda):
264
+ if existence:
265
+ return True
266
+ (g1,lmbda1),(g2,lmbda2) = find_product_decomposition(g,k,lmbda)
267
+ G1,M1 = difference_matrix(g1,k,lmbda1)
268
+ G2,M2 = difference_matrix(g2,k,lmbda2)
269
+ G,M = difference_matrix_product(k,M1,G1,lmbda1,M2,G2,lmbda2,check=False)
270
+
271
+ else:
272
+ if existence:
273
+ return Unknown
274
+ raise NotImplementedError("I don't know how to build a ({},{},{})-Difference Matrix!".format(g,k,lmbda))
275
+
276
+ if check and not is_difference_matrix(M,G,k,lmbda,1):
277
+ raise RuntimeError("Sage built something which is not a ({},{},{})-DM!".format(g,k,lmbda))
278
+
279
+ return G,M