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.
- passagemath_graphs-10.6.1rc1.dist-info/METADATA +292 -0
- passagemath_graphs-10.6.1rc1.dist-info/RECORD +260 -0
- passagemath_graphs-10.6.1rc1.dist-info/WHEEL +5 -0
- passagemath_graphs-10.6.1rc1.dist-info/top_level.txt +2 -0
- passagemath_graphs.libs/libgcc_s-69c45f16.so.1 +0 -0
- passagemath_graphs.libs/libgmp-8e78bd9b.so.10.5.0 +0 -0
- passagemath_graphs.libs/libstdc++-1f1a71be.so.6.0.33 +0 -0
- sage/all__sagemath_graphs.py +39 -0
- sage/combinat/abstract_tree.py +2723 -0
- sage/combinat/all__sagemath_graphs.py +34 -0
- sage/combinat/binary_tree.py +5306 -0
- sage/combinat/cluster_algebra_quiver/all.py +22 -0
- sage/combinat/cluster_algebra_quiver/cluster_seed.py +5208 -0
- sage/combinat/cluster_algebra_quiver/interact.py +124 -0
- sage/combinat/cluster_algebra_quiver/mutation_class.py +625 -0
- sage/combinat/cluster_algebra_quiver/mutation_type.py +1555 -0
- sage/combinat/cluster_algebra_quiver/quiver.py +2290 -0
- sage/combinat/cluster_algebra_quiver/quiver_mutation_type.py +2468 -0
- sage/combinat/designs/MOLS_handbook_data.py +570 -0
- sage/combinat/designs/all.py +58 -0
- sage/combinat/designs/bibd.py +1655 -0
- sage/combinat/designs/block_design.py +1071 -0
- sage/combinat/designs/covering_array.py +269 -0
- sage/combinat/designs/covering_design.py +530 -0
- sage/combinat/designs/database.py +5615 -0
- sage/combinat/designs/design_catalog.py +122 -0
- sage/combinat/designs/designs_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/designs/designs_pyx.pxd +21 -0
- sage/combinat/designs/designs_pyx.pyx +993 -0
- sage/combinat/designs/difference_family.py +3951 -0
- sage/combinat/designs/difference_matrices.py +279 -0
- sage/combinat/designs/evenly_distributed_sets.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/designs/evenly_distributed_sets.pyx +661 -0
- sage/combinat/designs/ext_rep.py +1064 -0
- sage/combinat/designs/gen_quadrangles_with_spread.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/designs/gen_quadrangles_with_spread.pyx +339 -0
- sage/combinat/designs/group_divisible_designs.py +361 -0
- sage/combinat/designs/incidence_structures.py +2357 -0
- sage/combinat/designs/latin_squares.py +581 -0
- sage/combinat/designs/orthogonal_arrays.py +2244 -0
- sage/combinat/designs/orthogonal_arrays_build_recursive.py +1780 -0
- sage/combinat/designs/orthogonal_arrays_find_recursive.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/designs/orthogonal_arrays_find_recursive.pyx +967 -0
- sage/combinat/designs/resolvable_bibd.py +815 -0
- sage/combinat/designs/steiner_quadruple_systems.py +1306 -0
- sage/combinat/designs/subhypergraph_search.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/designs/subhypergraph_search.pyx +530 -0
- sage/combinat/designs/twographs.py +306 -0
- sage/combinat/finite_state_machine.py +14874 -0
- sage/combinat/finite_state_machine_generators.py +2006 -0
- sage/combinat/graph_path.py +448 -0
- sage/combinat/interval_posets.py +3908 -0
- sage/combinat/nu_tamari_lattice.py +269 -0
- sage/combinat/ordered_tree.py +1446 -0
- sage/combinat/posets/all.py +46 -0
- sage/combinat/posets/bubble_shuffle.py +247 -0
- sage/combinat/posets/cartesian_product.py +493 -0
- sage/combinat/posets/d_complete.py +182 -0
- sage/combinat/posets/elements.py +273 -0
- sage/combinat/posets/forest.py +30 -0
- sage/combinat/posets/hasse_cython.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/posets/hasse_cython.pyx +174 -0
- sage/combinat/posets/hasse_diagram.py +3672 -0
- sage/combinat/posets/hochschild_lattice.py +158 -0
- sage/combinat/posets/incidence_algebras.py +794 -0
- sage/combinat/posets/lattices.py +5117 -0
- sage/combinat/posets/linear_extension_iterator.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/combinat/posets/linear_extension_iterator.pyx +292 -0
- sage/combinat/posets/linear_extensions.py +1037 -0
- sage/combinat/posets/mobile.py +275 -0
- sage/combinat/posets/moebius_algebra.py +776 -0
- sage/combinat/posets/poset_examples.py +2178 -0
- sage/combinat/posets/posets.py +9360 -0
- sage/combinat/rooted_tree.py +1070 -0
- sage/combinat/shard_order.py +239 -0
- sage/combinat/tamari_lattices.py +384 -0
- sage/combinat/yang_baxter_graph.py +923 -0
- sage/databases/all__sagemath_graphs.py +1 -0
- sage/databases/knotinfo_db.py +1231 -0
- sage/ext_data/all__sagemath_graphs.py +1 -0
- sage/ext_data/graphs/graph_plot_js.html +330 -0
- sage/ext_data/kenzo/CP2.txt +45 -0
- sage/ext_data/kenzo/CP3.txt +349 -0
- sage/ext_data/kenzo/CP4.txt +4774 -0
- sage/ext_data/kenzo/README.txt +49 -0
- sage/ext_data/kenzo/S4.txt +20 -0
- sage/graphs/all.py +42 -0
- sage/graphs/asteroidal_triples.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/asteroidal_triples.pyx +320 -0
- sage/graphs/base/all.py +1 -0
- sage/graphs/base/boost_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/boost_graph.pxd +106 -0
- sage/graphs/base/boost_graph.pyx +3045 -0
- sage/graphs/base/c_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/c_graph.pxd +106 -0
- sage/graphs/base/c_graph.pyx +5096 -0
- sage/graphs/base/dense_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/dense_graph.pxd +28 -0
- sage/graphs/base/dense_graph.pyx +801 -0
- sage/graphs/base/graph_backends.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/graph_backends.pxd +5 -0
- sage/graphs/base/graph_backends.pyx +797 -0
- sage/graphs/base/overview.py +85 -0
- sage/graphs/base/sparse_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/sparse_graph.pxd +90 -0
- sage/graphs/base/sparse_graph.pyx +1653 -0
- sage/graphs/base/static_dense_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/static_dense_graph.pxd +5 -0
- sage/graphs/base/static_dense_graph.pyx +1032 -0
- sage/graphs/base/static_sparse_backend.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/static_sparse_backend.pxd +27 -0
- sage/graphs/base/static_sparse_backend.pyx +1583 -0
- sage/graphs/base/static_sparse_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/base/static_sparse_graph.pxd +37 -0
- sage/graphs/base/static_sparse_graph.pyx +1375 -0
- sage/graphs/bipartite_graph.py +2732 -0
- sage/graphs/centrality.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/centrality.pyx +1038 -0
- sage/graphs/cographs.py +519 -0
- sage/graphs/comparability.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/comparability.pyx +851 -0
- sage/graphs/connectivity.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/connectivity.pxd +157 -0
- sage/graphs/connectivity.pyx +4813 -0
- sage/graphs/convexity_properties.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/convexity_properties.pxd +16 -0
- sage/graphs/convexity_properties.pyx +870 -0
- sage/graphs/digraph.py +4754 -0
- sage/graphs/digraph_generators.py +1993 -0
- sage/graphs/distances_all_pairs.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/distances_all_pairs.pxd +12 -0
- sage/graphs/distances_all_pairs.pyx +2938 -0
- sage/graphs/domination.py +1363 -0
- sage/graphs/dot2tex_utils.py +100 -0
- sage/graphs/edge_connectivity.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/edge_connectivity.pyx +1215 -0
- sage/graphs/generators/all.py +1 -0
- sage/graphs/generators/basic.py +1769 -0
- sage/graphs/generators/chessboard.py +538 -0
- sage/graphs/generators/classical_geometries.py +1611 -0
- sage/graphs/generators/degree_sequence.py +235 -0
- sage/graphs/generators/distance_regular.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/generators/distance_regular.pyx +2846 -0
- sage/graphs/generators/families.py +4759 -0
- sage/graphs/generators/intersection.py +565 -0
- sage/graphs/generators/platonic_solids.py +262 -0
- sage/graphs/generators/random.py +2623 -0
- sage/graphs/generators/smallgraphs.py +5741 -0
- sage/graphs/generators/world_map.py +724 -0
- sage/graphs/generic_graph.py +26867 -0
- sage/graphs/generic_graph_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/generic_graph_pyx.pxd +34 -0
- sage/graphs/generic_graph_pyx.pyx +1673 -0
- sage/graphs/genus.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/genus.pyx +622 -0
- sage/graphs/graph.py +9645 -0
- sage/graphs/graph_coloring.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_coloring.pyx +2284 -0
- sage/graphs/graph_database.py +1177 -0
- sage/graphs/graph_decompositions/all.py +1 -0
- sage/graphs/graph_decompositions/bandwidth.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/bandwidth.pyx +428 -0
- sage/graphs/graph_decompositions/clique_separators.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/clique_separators.pyx +616 -0
- sage/graphs/graph_decompositions/cutwidth.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/cutwidth.pyx +753 -0
- sage/graphs/graph_decompositions/fast_digraph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/fast_digraph.pxd +13 -0
- sage/graphs/graph_decompositions/fast_digraph.pyx +212 -0
- sage/graphs/graph_decompositions/graph_products.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/graph_products.pyx +508 -0
- sage/graphs/graph_decompositions/modular_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/modular_decomposition.pxd +27 -0
- sage/graphs/graph_decompositions/modular_decomposition.pyx +1536 -0
- sage/graphs/graph_decompositions/slice_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/slice_decomposition.pxd +18 -0
- sage/graphs/graph_decompositions/slice_decomposition.pyx +1106 -0
- sage/graphs/graph_decompositions/tree_decomposition.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/tree_decomposition.pxd +17 -0
- sage/graphs/graph_decompositions/tree_decomposition.pyx +1996 -0
- sage/graphs/graph_decompositions/vertex_separation.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_decompositions/vertex_separation.pxd +5 -0
- sage/graphs/graph_decompositions/vertex_separation.pyx +1963 -0
- sage/graphs/graph_editor.py +82 -0
- sage/graphs/graph_generators.py +3314 -0
- sage/graphs/graph_generators_pyx.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/graph_generators_pyx.pyx +95 -0
- sage/graphs/graph_input.py +812 -0
- sage/graphs/graph_latex.py +2064 -0
- sage/graphs/graph_list.py +410 -0
- sage/graphs/graph_plot.py +1756 -0
- sage/graphs/graph_plot_js.py +338 -0
- sage/graphs/hyperbolicity.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/hyperbolicity.pyx +1704 -0
- sage/graphs/hypergraph_generators.py +364 -0
- sage/graphs/independent_sets.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/independent_sets.pxd +13 -0
- sage/graphs/independent_sets.pyx +402 -0
- sage/graphs/isgci.py +1033 -0
- sage/graphs/isoperimetric_inequalities.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/isoperimetric_inequalities.pyx +489 -0
- sage/graphs/line_graph.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/line_graph.pyx +743 -0
- sage/graphs/lovasz_theta.py +77 -0
- sage/graphs/matching.py +1633 -0
- sage/graphs/matching_covered_graph.py +3590 -0
- sage/graphs/orientations.py +1489 -0
- sage/graphs/partial_cube.py +459 -0
- sage/graphs/path_enumeration.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/path_enumeration.pyx +2040 -0
- sage/graphs/pq_trees.py +1129 -0
- sage/graphs/print_graphs.py +201 -0
- sage/graphs/schnyder.py +865 -0
- sage/graphs/spanning_tree.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/spanning_tree.pyx +1457 -0
- sage/graphs/strongly_regular_db.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/strongly_regular_db.pyx +3340 -0
- sage/graphs/traversals.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/traversals.pxd +9 -0
- sage/graphs/traversals.pyx +1872 -0
- sage/graphs/trees.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/trees.pxd +15 -0
- sage/graphs/trees.pyx +310 -0
- sage/graphs/tutte_polynomial.py +713 -0
- sage/graphs/views.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/views.pyx +794 -0
- sage/graphs/weakly_chordal.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/graphs/weakly_chordal.pyx +604 -0
- sage/groups/all__sagemath_graphs.py +1 -0
- sage/groups/perm_gps/all__sagemath_graphs.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_graphs.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_graphs.cpython-310-aarch64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_graphs.pxd +38 -0
- sage/groups/perm_gps/partn_ref/refinement_graphs.pyx +1666 -0
- sage/knots/all.py +6 -0
- sage/knots/free_knotinfo_monoid.py +507 -0
- sage/knots/gauss_code.py +291 -0
- sage/knots/knot.py +682 -0
- sage/knots/knot_table.py +284 -0
- sage/knots/knotinfo.py +2900 -0
- sage/knots/link.py +4715 -0
- sage/sandpiles/all.py +13 -0
- sage/sandpiles/examples.py +225 -0
- sage/sandpiles/sandpile.py +6365 -0
- sage/topology/all.py +22 -0
- sage/topology/cell_complex.py +1214 -0
- sage/topology/cubical_complex.py +1976 -0
- sage/topology/delta_complex.py +1806 -0
- sage/topology/filtered_simplicial_complex.py +744 -0
- sage/topology/moment_angle_complex.py +823 -0
- sage/topology/simplicial_complex.py +5160 -0
- sage/topology/simplicial_complex_catalog.py +92 -0
- sage/topology/simplicial_complex_examples.py +1680 -0
- sage/topology/simplicial_complex_homset.py +205 -0
- sage/topology/simplicial_complex_morphism.py +836 -0
- sage/topology/simplicial_set.py +4102 -0
- sage/topology/simplicial_set_catalog.py +55 -0
- sage/topology/simplicial_set_constructions.py +2954 -0
- sage/topology/simplicial_set_examples.py +865 -0
- 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
|