passagemath-graphs 10.5.10__cp39-cp39-macosx_14_0_arm64.whl → 10.5.43__cp39-cp39-macosx_14_0_arm64.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.5.10.dist-info → passagemath_graphs-10.5.43.dist-info}/METADATA +126 -30
- passagemath_graphs-10.5.43.dist-info/RECORD +256 -0
- {passagemath_graphs-10.5.10.dist-info → passagemath_graphs-10.5.43.dist-info}/WHEEL +2 -1
- passagemath_graphs.dylibs/libgmp.10.dylib +0 -0
- sage/all__sagemath_graphs.py +5 -0
- sage/combinat/abstract_tree.py +1 -1
- sage/combinat/binary_tree.py +1 -1
- sage/combinat/cluster_algebra_quiver/all.py +1 -1
- sage/combinat/cluster_algebra_quiver/cluster_seed.py +28 -24
- sage/combinat/cluster_algebra_quiver/interact.py +4 -0
- sage/combinat/designs/MOLS_handbook_data.py +5 -5
- sage/combinat/designs/bibd.py +10 -9
- sage/combinat/designs/covering_array.py +3 -3
- sage/combinat/designs/covering_design.py +2 -1
- sage/combinat/designs/database.py +11 -10
- sage/combinat/designs/designs_pyx.cpython-39-darwin.so +0 -0
- sage/combinat/designs/designs_pyx.pyx +13 -45
- sage/combinat/designs/difference_family.py +6 -6
- sage/combinat/designs/difference_matrices.py +1 -1
- sage/combinat/designs/evenly_distributed_sets.cpython-39-darwin.so +0 -0
- sage/combinat/designs/evenly_distributed_sets.pyx +15 -22
- sage/combinat/designs/ext_rep.py +9 -14
- sage/combinat/designs/gen_quadrangles_with_spread.cpython-39-darwin.so +0 -0
- sage/combinat/designs/gen_quadrangles_with_spread.pyx +1 -1
- sage/combinat/designs/group_divisible_designs.py +1 -1
- sage/combinat/designs/incidence_structures.py +8 -8
- sage/combinat/designs/latin_squares.py +1 -1
- sage/combinat/designs/orthogonal_arrays_build_recursive.py +8 -7
- sage/combinat/designs/orthogonal_arrays_find_recursive.cpython-39-darwin.so +0 -0
- sage/combinat/designs/resolvable_bibd.py +1 -1
- sage/combinat/designs/steiner_quadruple_systems.py +1 -1
- sage/combinat/designs/subhypergraph_search.cpython-39-darwin.so +0 -0
- sage/combinat/designs/subhypergraph_search.pyx +9 -9
- sage/combinat/finite_state_machine_generators.py +2 -2
- sage/combinat/graph_path.py +3 -3
- sage/combinat/interval_posets.py +10 -10
- sage/combinat/ordered_tree.py +1 -1
- sage/combinat/posets/cartesian_product.py +1 -1
- sage/combinat/posets/d_complete.py +1 -1
- sage/combinat/posets/forest.py +1 -1
- sage/combinat/posets/hasse_cython.cpython-39-darwin.so +0 -0
- sage/combinat/posets/hasse_diagram.py +8 -6
- sage/combinat/posets/incidence_algebras.py +8 -8
- sage/combinat/posets/lattices.py +28 -4
- sage/combinat/posets/linear_extension_iterator.cpython-39-darwin.so +0 -0
- sage/combinat/posets/linear_extension_iterator.pyx +2 -0
- sage/combinat/posets/linear_extensions.py +7 -16
- sage/combinat/posets/moebius_algebra.py +1 -1
- sage/combinat/posets/poset_examples.py +1 -1
- sage/combinat/posets/posets.py +54 -56
- sage/combinat/rooted_tree.py +3 -3
- sage/combinat/tamari_lattices.py +1 -1
- 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/asteroidal_triples.cpython-39-darwin.so +0 -0
- sage/graphs/base/boost_graph.cpython-39-darwin.so +0 -0
- sage/graphs/base/boost_graph.pxd +1 -1
- sage/graphs/base/boost_graph.pyx +1 -1
- sage/graphs/base/c_graph.cpython-39-darwin.so +0 -0
- sage/graphs/base/c_graph.pxd +4 -4
- sage/graphs/base/c_graph.pyx +270 -184
- sage/graphs/base/dense_graph.cpython-39-darwin.so +0 -0
- sage/graphs/base/graph_backends.cpython-39-darwin.so +0 -0
- sage/graphs/base/sparse_graph.cpython-39-darwin.so +0 -0
- sage/graphs/base/static_dense_graph.cpython-39-darwin.so +0 -0
- sage/graphs/base/static_sparse_backend.cpython-39-darwin.so +0 -0
- sage/graphs/base/static_sparse_backend.pyx +93 -6
- sage/graphs/base/static_sparse_graph.cpython-39-darwin.so +0 -0
- sage/graphs/base/static_sparse_graph.pyx +1 -1
- sage/graphs/bipartite_graph.py +0 -1
- sage/graphs/centrality.cpython-39-darwin.so +0 -0
- sage/graphs/centrality.pyx +0 -0
- sage/graphs/comparability.cpython-39-darwin.so +0 -0
- sage/graphs/comparability.pyx +172 -138
- sage/graphs/connectivity.cpython-39-darwin.so +0 -0
- sage/graphs/connectivity.pyx +194 -18
- sage/graphs/convexity_properties.cpython-39-darwin.so +0 -0
- sage/graphs/digraph_generators.py +118 -74
- sage/graphs/distances_all_pairs.cpython-39-darwin.so +0 -0
- sage/graphs/distances_all_pairs.pyx +145 -27
- sage/graphs/edge_connectivity.cpython-39-darwin.so +0 -0
- sage/graphs/generators/basic.py +471 -130
- sage/graphs/generators/distance_regular.cpython-39-darwin.so +0 -0
- sage/graphs/generators/distance_regular.pyx +12 -12
- sage/graphs/generators/families.py +2 -2
- sage/graphs/generators/random.py +8 -13
- sage/graphs/generators/smallgraphs.py +12 -11
- sage/graphs/generic_graph.py +687 -265
- sage/graphs/generic_graph_pyx.cpython-39-darwin.so +0 -0
- sage/graphs/genus.cpython-39-darwin.so +0 -0
- sage/graphs/graph.py +12 -46
- sage/graphs/graph_coloring.cpython-39-darwin.so +0 -0
- sage/graphs/graph_database.py +1 -1
- sage/graphs/graph_decompositions/bandwidth.cpython-39-darwin.so +0 -0
- sage/graphs/graph_decompositions/clique_separators.cpython-39-darwin.so +0 -0
- sage/graphs/graph_decompositions/cutwidth.cpython-39-darwin.so +0 -0
- sage/graphs/graph_decompositions/fast_digraph.cpython-39-darwin.so +0 -0
- sage/graphs/graph_decompositions/graph_products.cpython-39-darwin.so +0 -0
- sage/graphs/graph_decompositions/modular_decomposition.cpython-39-darwin.so +0 -0
- sage/graphs/graph_decompositions/slice_decomposition.cpython-39-darwin.so +0 -0
- sage/graphs/graph_decompositions/tree_decomposition.cpython-39-darwin.so +0 -0
- sage/graphs/graph_decompositions/vertex_separation.cpython-39-darwin.so +0 -0
- sage/graphs/graph_generators.py +110 -55
- sage/graphs/graph_generators_pyx.cpython-39-darwin.so +0 -0
- sage/graphs/graph_latex.py +1 -1
- sage/graphs/graph_list.py +2 -3
- sage/graphs/graph_plot.py +225 -30
- sage/graphs/hyperbolicity.cpython-39-darwin.so +0 -0
- sage/graphs/independent_sets.cpython-39-darwin.so +0 -0
- sage/graphs/isgci.py +3 -8
- sage/graphs/isoperimetric_inequalities.cpython-39-darwin.so +0 -0
- sage/graphs/line_graph.cpython-39-darwin.so +0 -0
- sage/graphs/matching.py +14 -25
- sage/graphs/matching_covered_graph.py +871 -60
- sage/graphs/orientations.py +190 -134
- sage/graphs/path_enumeration.cpython-39-darwin.so +0 -0
- sage/graphs/path_enumeration.pyx +25 -25
- sage/graphs/spanning_tree.cpython-39-darwin.so +0 -0
- sage/graphs/strongly_regular_db.cpython-39-darwin.so +0 -0
- sage/graphs/strongly_regular_db.pyx +54 -52
- sage/graphs/traversals.cpython-39-darwin.so +0 -0
- sage/graphs/traversals.pyx +114 -46
- sage/graphs/trees.cpython-39-darwin.so +0 -0
- sage/graphs/views.cpython-39-darwin.so +0 -0
- sage/graphs/weakly_chordal.cpython-39-darwin.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_graphs.cpython-39-darwin.so +0 -0
- sage/knots/free_knotinfo_monoid.py +2 -3
- sage/knots/knot.py +1 -1
- sage/knots/knotinfo.py +4 -4
- sage/knots/link.py +58 -57
- sage/sandpiles/sandpile.py +2 -3
- sage/topology/cell_complex.py +1 -1
- sage/topology/cubical_complex.py +7 -7
- sage/topology/delta_complex.py +4 -4
- sage/topology/simplicial_complex.py +7 -22
- passagemath_graphs-10.5.10.dist-info/RECORD +0 -251
- {passagemath_graphs-10.5.10.dist-info → passagemath_graphs-10.5.43.dist-info}/top_level.txt +0 -0
@@ -112,9 +112,9 @@ def is_mathon_PC_srg(int v, int k, int l, int mu):
|
|
112
112
|
sage: from sage.graphs.strongly_regular_db import is_mathon_PC_srg
|
113
113
|
sage: t = is_mathon_PC_srg(45,22,10,11); t # needs sage.libs.pari
|
114
114
|
(..., 1)
|
115
|
-
sage: g = t[0](*t[1:]); g # needs sage.libs.pari
|
115
|
+
sage: g = t[0](*t[1:]); g # needs database_graphs sage.libs.pari
|
116
116
|
Mathon's PC SRG on 45 vertices: Graph on 45 vertices
|
117
|
-
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.pari
|
117
|
+
sage: g.is_strongly_regular(parameters=True) # needs database_graphs sage.libs.pari
|
118
118
|
(45, 22, 10, 11)
|
119
119
|
|
120
120
|
TESTS::
|
@@ -360,9 +360,9 @@ def is_affine_polar(int v, int k, int l, int mu):
|
|
360
360
|
sage: from sage.graphs.strongly_regular_db import is_affine_polar
|
361
361
|
sage: t = is_affine_polar(81,32,13,12); t # needs sage.rings.finite_rings
|
362
362
|
(..., 4, 3)
|
363
|
-
sage: g = t[0](*t[1:]); g # needs sage.rings.finite_rings
|
363
|
+
sage: g = t[0](*t[1:]); g # needs sage.libs.gap sage.rings.finite_rings
|
364
364
|
Affine Polar Graph VO^+(4,3): Graph on 81 vertices
|
365
|
-
sage: g.is_strongly_regular(parameters=True) # needs sage.rings.finite_rings
|
365
|
+
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.gap sage.rings.finite_rings
|
366
366
|
(81, 32, 13, 12)
|
367
367
|
|
368
368
|
sage: t = is_affine_polar(5,5,5,5); t
|
@@ -415,9 +415,9 @@ def is_orthogonal_polar(int v, int k, int l, int mu):
|
|
415
415
|
sage: from sage.graphs.strongly_regular_db import is_orthogonal_polar
|
416
416
|
sage: t = is_orthogonal_polar(85, 20, 3, 5); t
|
417
417
|
(<function OrthogonalPolarGraph at ...>, 5, 4, '')
|
418
|
-
sage: g = t[0](*t[1:]); g # needs sage.rings.finite_rings
|
418
|
+
sage: g = t[0](*t[1:]); g # needs sage.libs.gap sage.rings.finite_rings
|
419
419
|
Orthogonal Polar Graph O(5, 4): Graph on 85 vertices
|
420
|
-
sage: g.is_strongly_regular(parameters=True) # needs sage.rings.finite_rings
|
420
|
+
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.gap sage.rings.finite_rings
|
421
421
|
(85, 20, 3, 5)
|
422
422
|
|
423
423
|
sage: t = is_orthogonal_polar(5,5,5,5); t # needs sage.rings.finite_rings
|
@@ -571,9 +571,9 @@ def is_NOodd(int v, int k, int l, int mu):
|
|
571
571
|
sage: from sage.graphs.strongly_regular_db import is_NOodd
|
572
572
|
sage: t = is_NOodd(120, 51, 18, 24); t # needs sage.libs.pari
|
573
573
|
(<function NonisotropicOrthogonalPolarGraph at ...>, 5, 4, '-')
|
574
|
-
sage: g = t[0](*t[1:]); g # needs sage.libs.pari
|
574
|
+
sage: g = t[0](*t[1:]); g # needs sage.libs.gap sage.libs.pari
|
575
575
|
NO^-(5, 4): Graph on 120 vertices
|
576
|
-
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.pari
|
576
|
+
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.gap sage.libs.pari
|
577
577
|
(120, 51, 18, 24)
|
578
578
|
|
579
579
|
TESTS:
|
@@ -642,9 +642,9 @@ def is_NOperp_F5(int v, int k, int l, int mu):
|
|
642
642
|
sage: from sage.graphs.strongly_regular_db import is_NOperp_F5
|
643
643
|
sage: t = is_NOperp_F5(10, 3, 0, 1); t # needs sage.libs.pari
|
644
644
|
(<function NonisotropicOrthogonalPolarGraph at ...>, 3, 5, '-', 1)
|
645
|
-
sage: g = t[0](*t[1:]); g # needs sage.libs.pari
|
645
|
+
sage: g = t[0](*t[1:]); g # needs sage.libs.gap sage.libs.pari
|
646
646
|
NO^-,perp(3, 5): Graph on 10 vertices
|
647
|
-
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.pari
|
647
|
+
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.gap sage.libs.pari
|
648
648
|
(10, 3, 0, 1)
|
649
649
|
|
650
650
|
TESTS:
|
@@ -697,9 +697,9 @@ def is_NO_F2(int v, int k, int l, int mu):
|
|
697
697
|
sage: from sage.graphs.strongly_regular_db import is_NO_F2
|
698
698
|
sage: t = is_NO_F2(10, 3, 0, 1); t # needs sage.libs.pari
|
699
699
|
(<function NonisotropicOrthogonalPolarGraph at ...>, 4, 2, '-')
|
700
|
-
sage: g = t[0](*t[1:]); g # needs sage.libs.pari
|
700
|
+
sage: g = t[0](*t[1:]); g # needs sage.libs.gap sage.libs.pari
|
701
701
|
NO^-(4, 2): Graph on 10 vertices
|
702
|
-
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.pari
|
702
|
+
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.gap sage.libs.pari
|
703
703
|
(10, 3, 0, 1)
|
704
704
|
|
705
705
|
TESTS:
|
@@ -748,9 +748,9 @@ def is_NO_F3(int v, int k, int l, int mu):
|
|
748
748
|
sage: from sage.graphs.strongly_regular_db import is_NO_F3
|
749
749
|
sage: t = is_NO_F3(15, 6, 1, 3); t # needs sage.libs.pari
|
750
750
|
(<function NonisotropicOrthogonalPolarGraph at ...>, 4, 3, '-')
|
751
|
-
sage: g = t[0](*t[1:]); g # needs sage.libs.pari
|
751
|
+
sage: g = t[0](*t[1:]); g # needs sage.libs.gap sage.libs.pari
|
752
752
|
NO^-(4, 3): Graph on 15 vertices
|
753
|
-
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.pari
|
753
|
+
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.gap sage.libs.pari
|
754
754
|
(15, 6, 1, 3)
|
755
755
|
|
756
756
|
TESTS:
|
@@ -804,9 +804,9 @@ def is_NU(int v, int k, int l, int mu):
|
|
804
804
|
sage: from sage.graphs.strongly_regular_db import is_NU
|
805
805
|
sage: t = is_NU(40, 27, 18, 18); t # needs sage.libs.pari
|
806
806
|
(<function NonisotropicUnitaryPolarGraph at ...>, 4, 2)
|
807
|
-
sage: g = t[0](*t[1:]); g # needs sage.libs.pari
|
807
|
+
sage: g = t[0](*t[1:]); g # needs sage.libs.gap sage.libs.pari
|
808
808
|
NU(4, 2): Graph on 40 vertices
|
809
|
-
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.pari
|
809
|
+
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.gap sage.libs.pari
|
810
810
|
(40, 27, 18, 18)
|
811
811
|
|
812
812
|
TESTS::
|
@@ -1069,25 +1069,25 @@ def is_polhill(int v, int k, int l, int mu):
|
|
1069
1069
|
# We now define the P_{i,j}. see section 6.
|
1070
1070
|
|
1071
1071
|
P = {}
|
1072
|
-
P[0,1] = list(range((-1) + 1
|
1073
|
-
P[1,1] = list(range((-1) + 2**(s-2)+2
|
1074
|
-
P[2,1] = list(range((-1) + 2**(s-1)+2
|
1075
|
-
P[3,1] = list(range((-1) + 2**(s-1)+2**(s-2)+2, 2**(s)+1))
|
1076
|
-
|
1077
|
-
P[0,2] = list(range((-1) + 2**(s-2)+2
|
1078
|
-
P[1,2] = list(range((-1) + 2**(s-1)+3
|
1079
|
-
P[2,2] = list(range((-1) + 2**(s-1)+2**(s-2)+3, 2**(s)+1)) + [0]
|
1080
|
-
P[3,2] = list(range((-1) + 2
|
1081
|
-
|
1082
|
-
P[0,3] = list(range((-1) + 2**(s-1)+3
|
1083
|
-
P[1,3] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [0,1]
|
1084
|
-
P[2,3] = list(range((-1) + 3
|
1085
|
-
P[3,3] = list(range((-1) + 2**(s-2)+3
|
1086
|
-
|
1087
|
-
P[0,4] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1))
|
1088
|
-
P[1,4] = list(range((-1) + 3
|
1089
|
-
P[2,4] = list(range((-1) + 2**(s-2)+3
|
1090
|
-
P[3,4] = list(range((-1) + 2**(s-1)+3
|
1072
|
+
P[0, 1] = list(range((-1) + 1, 2**(s-2)+1))
|
1073
|
+
P[1, 1] = list(range((-1) + 2**(s-2)+2, 2**(s-1)+1))
|
1074
|
+
P[2, 1] = list(range((-1) + 2**(s-1)+2, 2**(s-1)+2**(s-2)+1))
|
1075
|
+
P[3, 1] = list(range((-1) + 2**(s-1)+2**(s-2)+2, 2**(s)+1))
|
1076
|
+
|
1077
|
+
P[0, 2] = list(range((-1) + 2**(s-2)+2, 2**(s-1)+2))
|
1078
|
+
P[1, 2] = list(range((-1) + 2**(s-1)+3, 2**(s-1)+2**(s-2)+2))
|
1079
|
+
P[2, 2] = list(range((-1) + 2**(s-1)+2**(s-2)+3, 2**(s)+1)) + [0]
|
1080
|
+
P[3, 2] = list(range((-1) + 2, 2**(s-2)+1))
|
1081
|
+
|
1082
|
+
P[0, 3] = list(range((-1) + 2**(s-1)+3, 2**(s-1)+2**(s-2)+3))
|
1083
|
+
P[1, 3] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [0,1]
|
1084
|
+
P[2, 3] = list(range((-1) + 3, 2**(s-2)+2))
|
1085
|
+
P[3, 3] = list(range((-1) + 2**(s-2)+3, 2**(s-1)+2))
|
1086
|
+
|
1087
|
+
P[0, 4] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1))
|
1088
|
+
P[1, 4] = list(range((-1) + 3, 2**(s-2)+1)) + [2**(s-1)+1,2**(s-1)+2**(s-2)+2]
|
1089
|
+
P[2, 4] = list(range((-1) + 2**(s-2)+3, 2**(s-1)+1)) + [2**(s-1)+2**(s-2)+1,1]
|
1090
|
+
P[3, 4] = list(range((-1) + 2**(s-1)+3, 2**(s-1)+2**(s-2)+1)) + [2**(s-2)+1,0]
|
1091
1091
|
|
1092
1092
|
R = {x: copy(P[x]) for x in P}
|
1093
1093
|
|
@@ -1101,10 +1101,10 @@ def is_polhill(int v, int k, int l, int mu):
|
|
1101
1101
|
|
1102
1102
|
# We now define the R_{i,j}. see *end* of section 6.
|
1103
1103
|
|
1104
|
-
R[0,3] = list(range((-1) + 2**(s-1)+3
|
1105
|
-
R[1,3] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [0,1,2**(s-1)+2**(s-2)+2]
|
1106
|
-
R[0,4] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [2**(s-1)+2**(s-2)+2]
|
1107
|
-
R[1,4] = list(range((-1) + 3
|
1104
|
+
R[0, 3] = list(range((-1) + 2**(s-1)+3, 2**(s-1)+2**(s-2)+2))
|
1105
|
+
R[1, 3] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [0,1,2**(s-1)+2**(s-2)+2]
|
1106
|
+
R[0, 4] = list(range((-1) + 2**(s-1)+2**(s-2)+4, 2**(s)+1)) + [2**(s-1)+2**(s-2)+2]
|
1107
|
+
R[1, 4] = list(range((-1) + 3, 2**(s-2)+1)) + [2**(s-1)+1]
|
1108
1108
|
|
1109
1109
|
for x in R:
|
1110
1110
|
R[x] = [K[i] for i in R[x]]
|
@@ -1273,9 +1273,9 @@ def is_unitary_polar(int v, int k, int l, int mu):
|
|
1273
1273
|
sage: from sage.graphs.strongly_regular_db import is_unitary_polar
|
1274
1274
|
sage: t = is_unitary_polar(45, 12, 3, 3); t # needs sage.libs.pari
|
1275
1275
|
(<function UnitaryPolarGraph at ...>, 4, 2)
|
1276
|
-
sage: g = t[0](*t[1:]); g # needs sage.libs.pari
|
1276
|
+
sage: g = t[0](*t[1:]); g # needs sage.libs.gap sage.libs.pari
|
1277
1277
|
Unitary Polar Graph U(4, 2); GQ(4, 2): Graph on 45 vertices
|
1278
|
-
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.pari
|
1278
|
+
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.gap sage.libs.pari
|
1279
1279
|
(45, 12, 3, 3)
|
1280
1280
|
|
1281
1281
|
sage: t = is_unitary_polar(5,5,5,5); t # needs sage.libs.pari
|
@@ -1351,9 +1351,9 @@ def is_unitary_dual_polar(int v, int k, int l, int mu):
|
|
1351
1351
|
sage: from sage.graphs.strongly_regular_db import is_unitary_dual_polar
|
1352
1352
|
sage: t = is_unitary_dual_polar(297, 40, 7, 5); t
|
1353
1353
|
(<function UnitaryDualPolarGraph at ...>, 5, 2)
|
1354
|
-
sage: g = t[0](*t[1:]); g
|
1354
|
+
sage: g = t[0](*t[1:]); g # needs sage.libs.gap
|
1355
1355
|
Unitary Dual Polar Graph DU(5, 2); GQ(8, 4): Graph on 297 vertices
|
1356
|
-
sage: g.is_strongly_regular(parameters=True)
|
1356
|
+
sage: g.is_strongly_regular(parameters=True) # needs sage.libs.gap
|
1357
1357
|
(297, 40, 7, 5)
|
1358
1358
|
sage: t = is_unitary_dual_polar(5,5,5,5); t
|
1359
1359
|
|
@@ -1492,11 +1492,11 @@ def is_twograph_descendant_of_srg(int v, int k0, int l, int mu):
|
|
1492
1492
|
EXAMPLES::
|
1493
1493
|
|
1494
1494
|
sage: from sage.graphs.strongly_regular_db import is_twograph_descendant_of_srg
|
1495
|
-
sage: t = is_twograph_descendant_of_srg(27, 10, 1, 5); t # needs sage.rings.finite_rings
|
1495
|
+
sage: t = is_twograph_descendant_of_srg(27, 10, 1, 5); t # needs database_graphs sage.rings.finite_rings
|
1496
1496
|
(<cyfunction is_twograph_descendant_of_srg.<locals>.la at...
|
1497
|
-
sage: g = t[0](*t[1:]); g # needs sage.rings.finite_rings
|
1497
|
+
sage: g = t[0](*t[1:]); g # needs database_graphs sage.rings.finite_rings
|
1498
1498
|
descendant of complement(Johnson graph with parameters 8,2) at {0, 1}: Graph on 27 vertices
|
1499
|
-
sage: g.is_strongly_regular(parameters=True) # needs sage.rings.finite_rings
|
1499
|
+
sage: g.is_strongly_regular(parameters=True) # needs database_graphs sage.rings.finite_rings
|
1500
1500
|
(27, 10, 1, 5)
|
1501
1501
|
sage: t = is_twograph_descendant_of_srg(5,5,5,5); t
|
1502
1502
|
|
@@ -1961,9 +1961,9 @@ def SRG_105_32_4_12():
|
|
1961
1961
|
EXAMPLES::
|
1962
1962
|
|
1963
1963
|
sage: from sage.graphs.strongly_regular_db import SRG_105_32_4_12
|
1964
|
-
sage: G = SRG_105_32_4_12(); G # needs sage.rings.finite_rings
|
1964
|
+
sage: G = SRG_105_32_4_12(); G # needs sage.groups sage.rings.finite_rings
|
1965
1965
|
Aut L(3,4) on flags: Graph on 105 vertices
|
1966
|
-
sage: G.is_strongly_regular(parameters=True) # needs sage.rings.finite_rings
|
1966
|
+
sage: G.is_strongly_regular(parameters=True) # needs sage.groups sage.rings.finite_rings
|
1967
1967
|
(105, 32, 4, 12)
|
1968
1968
|
"""
|
1969
1969
|
from sage.combinat.designs.block_design import ProjectiveGeometryDesign
|
@@ -2804,7 +2804,7 @@ def strongly_regular_graph(int v, int k, int l, int mu=-1, bint existence=False,
|
|
2804
2804
|
|
2805
2805
|
Petersen's graph from its set of parameters::
|
2806
2806
|
|
2807
|
-
sage: graphs.strongly_regular_graph(10,3,0,1,existence=True)
|
2807
|
+
sage: graphs.strongly_regular_graph(10,3,0,1, existence=True) # needs database_graphs sage.libs.pari
|
2808
2808
|
True
|
2809
2809
|
sage: graphs.strongly_regular_graph(10,3,0,1) # needs database_graphs
|
2810
2810
|
complement(Johnson graph with parameters 5,2): Graph on 10 vertices
|
@@ -2868,7 +2868,7 @@ def strongly_regular_graph(int v, int k, int l, int mu=-1, bint existence=False,
|
|
2868
2868
|
descendant of (540, 264, 138, 120)-strongly regular graph at ... 539 vertices
|
2869
2869
|
sage: graphs.strongly_regular_graph(539, 250, 105, 125) # needs sage.combinat
|
2870
2870
|
descendant of (540, 275, 130, 150)-strongly regular graph at ... 539 vertices
|
2871
|
-
sage: graphs.strongly_regular_graph(209, 100, 45, 50) # needs sage.libs.pari
|
2871
|
+
sage: graphs.strongly_regular_graph(209, 100, 45, 50) # needs database_graphs sage.libs.pari
|
2872
2872
|
descendant of complement(merging of S_7 on Circulant(6,[1,4])s) at ... 209 vertices
|
2873
2873
|
|
2874
2874
|
|
@@ -2886,6 +2886,7 @@ def strongly_regular_graph(int v, int k, int l, int mu=-1, bint existence=False,
|
|
2886
2886
|
|
2887
2887
|
`\mu=0` behaves correctly (:issue:`19712`)::
|
2888
2888
|
|
2889
|
+
sage: # needs database_graphs
|
2889
2890
|
sage: graphs.strongly_regular_graph(10,2,1)
|
2890
2891
|
Traceback (most recent call last):
|
2891
2892
|
...
|
@@ -3070,7 +3071,7 @@ def apparently_feasible_parameters(int n):
|
|
3070
3071
|
(16, 9, 4, 6),
|
3071
3072
|
(16, 10, 6, 6),
|
3072
3073
|
(17, 8, 3, 4)}
|
3073
|
-
sage: all(graphs.strongly_regular_graph(*x,existence=True) is True # needs sage.libs.pari
|
3074
|
+
sage: all(graphs.strongly_regular_graph(*x,existence=True) is True # needs database_graphs sage.libs.pari
|
3074
3075
|
....: for x in small_feasible)
|
3075
3076
|
True
|
3076
3077
|
|
@@ -3078,7 +3079,7 @@ def apparently_feasible_parameters(int n):
|
|
3078
3079
|
`(49,16,3,6)`-strongly regular graph)::
|
3079
3080
|
|
3080
3081
|
sage: small_feasible = apparently_feasible_parameters(60)
|
3081
|
-
sage: all(graphs.strongly_regular_graph(*x,existence=True) is True # needs sage.libs.pari
|
3082
|
+
sage: all(graphs.strongly_regular_graph(*x,existence=True) is True # needs database_graphs sage.libs.pari
|
3082
3083
|
....: for x in small_feasible)
|
3083
3084
|
False
|
3084
3085
|
"""
|
@@ -3114,6 +3115,7 @@ def _build_small_srg_database():
|
|
3114
3115
|
Make sure that all two-weight codes yield the strongly regular graphs we
|
3115
3116
|
expect::
|
3116
3117
|
|
3118
|
+
sage: # needs database_graphs
|
3117
3119
|
sage: graphs.strongly_regular_graph(81, 50, 31, 30) # needs sage.libs.pari
|
3118
3120
|
complement(two-intersection set in PG(4,3)): Graph on 81 vertices
|
3119
3121
|
sage: graphs.strongly_regular_graph(243, 220, 199, 200) # long time, needs sage.rings.finite_rings
|
Binary file
|
sage/graphs/traversals.pyx
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# sage_setup: distribution = sagemath-graphs
|
2
2
|
# cython: binding=True
|
3
3
|
# distutils: language = c++
|
4
|
+
# distutils: extra_compile_args = -std=c++11
|
4
5
|
r"""
|
5
6
|
Graph traversals
|
6
7
|
|
@@ -64,16 +65,17 @@ from collections import deque
|
|
64
65
|
|
65
66
|
from libc.string cimport memset
|
66
67
|
from libc.stdint cimport uint32_t
|
67
|
-
from libcpp.queue cimport priority_queue
|
68
|
-
from libcpp.pair cimport pair
|
69
68
|
from libcpp.vector cimport vector
|
70
69
|
from cysignals.signals cimport sig_on, sig_off
|
71
70
|
from memory_allocator cimport MemoryAllocator
|
72
71
|
|
72
|
+
from sage.data_structures.pairing_heap cimport PairingHeap_of_n_integers
|
73
|
+
from sage.graphs.base.c_graph cimport CGraph, CGraphBackend
|
74
|
+
from sage.graphs.base.static_sparse_backend cimport StaticSparseCGraph
|
75
|
+
from sage.graphs.base.static_sparse_backend cimport StaticSparseBackend
|
73
76
|
from sage.graphs.base.static_sparse_graph cimport init_short_digraph
|
74
77
|
from sage.graphs.base.static_sparse_graph cimport free_short_digraph
|
75
78
|
from sage.graphs.base.static_sparse_graph cimport out_degree
|
76
|
-
from sage.graphs.base.c_graph cimport CGraph, CGraphBackend
|
77
79
|
from sage.graphs.graph_decompositions.slice_decomposition cimport \
|
78
80
|
extended_lex_BFS
|
79
81
|
|
@@ -754,8 +756,7 @@ def lex_M(self, triangulation=False, labels=False, initial_vertex=None, algorith
|
|
754
756
|
- ``labels`` -- boolean (default: ``False``); whether to return the labels
|
755
757
|
assigned to each vertex
|
756
758
|
|
757
|
-
- ``initial_vertex`` -- (default: ``None``) the first vertex to
|
758
|
-
consider
|
759
|
+
- ``initial_vertex`` -- (default: ``None``); the first vertex to consider
|
759
760
|
|
760
761
|
- ``algorithm`` -- string (default: ``None``); one of the following
|
761
762
|
algorithms:
|
@@ -821,6 +822,18 @@ def lex_M(self, triangulation=False, labels=False, initial_vertex=None, algorith
|
|
821
822
|
sage: g.lex_M()
|
822
823
|
[6, 4, 5, 3, 2, 1]
|
823
824
|
|
825
|
+
The ordering depends on the initial vertex::
|
826
|
+
|
827
|
+
sage: G = graphs.HouseGraph()
|
828
|
+
sage: G.lex_M(algorithm='lex_M_slow', initial_vertex=0)
|
829
|
+
[4, 3, 2, 1, 0]
|
830
|
+
sage: G.lex_M(algorithm='lex_M_slow', initial_vertex=2)
|
831
|
+
[1, 4, 3, 0, 2]
|
832
|
+
sage: G.lex_M(algorithm='lex_M_fast', initial_vertex=0)
|
833
|
+
[4, 3, 2, 1, 0]
|
834
|
+
sage: G.lex_M(algorithm='lex_M_fast', initial_vertex=2)
|
835
|
+
[1, 4, 3, 0, 2]
|
836
|
+
|
824
837
|
TESTS:
|
825
838
|
|
826
839
|
``'lex_M_fast'`` cannot return labels::
|
@@ -1128,6 +1141,18 @@ def lex_M_fast(G, triangulation=False, initial_vertex=None):
|
|
1128
1141
|
Traceback (most recent call last):
|
1129
1142
|
...
|
1130
1143
|
ValueError: 'foo' is not a graph vertex
|
1144
|
+
|
1145
|
+
Immutable graphs::
|
1146
|
+
|
1147
|
+
sage: from sage.graphs.traversals import lex_M_fast
|
1148
|
+
sage: G = graphs.RandomGNP(10, .7)
|
1149
|
+
sage: G._backend
|
1150
|
+
<sage.graphs.base.sparse_graph.SparseGraphBackend ...>
|
1151
|
+
sage: H = Graph(G, immutable=True)
|
1152
|
+
sage: H._backend
|
1153
|
+
<sage.graphs.base.static_sparse_backend.StaticSparseBackend ...>
|
1154
|
+
sage: lex_M_fast(G) == lex_M_fast(H)
|
1155
|
+
True
|
1131
1156
|
"""
|
1132
1157
|
if initial_vertex is not None and initial_vertex not in G:
|
1133
1158
|
raise ValueError("'{}' is not a graph vertex".format(initial_vertex))
|
@@ -1137,16 +1162,19 @@ def lex_M_fast(G, triangulation=False, initial_vertex=None):
|
|
1137
1162
|
|
1138
1163
|
# ==> Initialization
|
1139
1164
|
|
1140
|
-
cdef list int_to_v = list(G)
|
1141
1165
|
cdef int i, j, k, v, w, z
|
1142
1166
|
|
1143
|
-
|
1144
|
-
|
1145
|
-
i = int_to_v.index(initial_vertex)
|
1146
|
-
int_to_v[0], int_to_v[i] = int_to_v[i], int_to_v[0]
|
1147
|
-
|
1167
|
+
cdef list int_to_v
|
1168
|
+
cdef StaticSparseCGraph cg
|
1148
1169
|
cdef short_digraph sd
|
1149
|
-
|
1170
|
+
if isinstance(G, StaticSparseBackend):
|
1171
|
+
cg = <StaticSparseCGraph> G._cg
|
1172
|
+
sd = <short_digraph> cg.g
|
1173
|
+
int_to_v = cg._vertex_to_labels
|
1174
|
+
else:
|
1175
|
+
int_to_v = list(G)
|
1176
|
+
init_short_digraph(sd, G, edge_labelled=False, vertex_list=int_to_v)
|
1177
|
+
|
1150
1178
|
cdef uint32_t* p_tmp
|
1151
1179
|
cdef uint32_t* p_end
|
1152
1180
|
|
@@ -1154,6 +1182,11 @@ def lex_M_fast(G, triangulation=False, initial_vertex=None):
|
|
1154
1182
|
|
1155
1183
|
cdef list unnumbered_vertices = list(range(n))
|
1156
1184
|
|
1185
|
+
if initial_vertex is not None:
|
1186
|
+
# We put the initial vertex at the first place
|
1187
|
+
i = int_to_v.index(initial_vertex)
|
1188
|
+
unnumbered_vertices[0], unnumbered_vertices[i] = unnumbered_vertices[i], unnumbered_vertices[0]
|
1189
|
+
|
1157
1190
|
cdef MemoryAllocator mem = MemoryAllocator()
|
1158
1191
|
cdef int* label = <int*>mem.allocarray(n, sizeof(int))
|
1159
1192
|
cdef int* alpha = <int*>mem.allocarray(n, sizeof(int))
|
@@ -1238,7 +1271,8 @@ def lex_M_fast(G, triangulation=False, initial_vertex=None):
|
|
1238
1271
|
k += 2
|
1239
1272
|
label[w] = k
|
1240
1273
|
|
1241
|
-
|
1274
|
+
if not isinstance(G, StaticSparseBackend):
|
1275
|
+
free_short_digraph(sd)
|
1242
1276
|
|
1243
1277
|
cdef list ordering = [int_to_v[alpha[i]] for i in range(n)]
|
1244
1278
|
|
@@ -1355,9 +1389,9 @@ def maximum_cardinality_search(G, reverse=False, tree=False, initial_vertex=None
|
|
1355
1389
|
sage: G.maximum_cardinality_search(initial_vertex=0)
|
1356
1390
|
[3, 2, 1, 0]
|
1357
1391
|
sage: G.maximum_cardinality_search(initial_vertex=1)
|
1358
|
-
[
|
1392
|
+
[3, 2, 0, 1]
|
1359
1393
|
sage: G.maximum_cardinality_search(initial_vertex=2)
|
1360
|
-
[0,
|
1394
|
+
[0, 3, 1, 2]
|
1361
1395
|
sage: G.maximum_cardinality_search(initial_vertex=3)
|
1362
1396
|
[0, 1, 2, 3]
|
1363
1397
|
sage: G.maximum_cardinality_search(initial_vertex=3, reverse=True)
|
@@ -1389,6 +1423,17 @@ def maximum_cardinality_search(G, reverse=False, tree=False, initial_vertex=None
|
|
1389
1423
|
Traceback (most recent call last):
|
1390
1424
|
...
|
1391
1425
|
ValueError: vertex (17) is not a vertex of the graph
|
1426
|
+
|
1427
|
+
Immutable graphs;:
|
1428
|
+
|
1429
|
+
sage: G = graphs.RandomGNP(10, .7)
|
1430
|
+
sage: G._backend
|
1431
|
+
<sage.graphs.base.sparse_graph.SparseGraphBackend ...>
|
1432
|
+
sage: H = Graph(G, immutable=True)
|
1433
|
+
sage: H._backend
|
1434
|
+
<sage.graphs.base.static_sparse_backend.StaticSparseBackend ...>
|
1435
|
+
sage: G.maximum_cardinality_search() == H.maximum_cardinality_search()
|
1436
|
+
True
|
1392
1437
|
"""
|
1393
1438
|
if tree:
|
1394
1439
|
from sage.graphs.digraph import DiGraph
|
@@ -1399,17 +1444,27 @@ def maximum_cardinality_search(G, reverse=False, tree=False, initial_vertex=None
|
|
1399
1444
|
if N == 1:
|
1400
1445
|
return (list(G), DiGraph(G)) if tree else list(G)
|
1401
1446
|
|
1402
|
-
cdef list int_to_vertex
|
1447
|
+
cdef list int_to_vertex
|
1448
|
+
cdef StaticSparseCGraph cg
|
1449
|
+
cdef short_digraph sd
|
1450
|
+
if isinstance(G, StaticSparseBackend):
|
1451
|
+
cg = <StaticSparseCGraph> G._cg
|
1452
|
+
sd = <short_digraph> cg.g
|
1453
|
+
int_to_vertex = cg._vertex_to_labels
|
1454
|
+
else:
|
1455
|
+
int_to_vertex = list(G)
|
1456
|
+
init_short_digraph(sd, G, edge_labelled=False, vertex_list=int_to_vertex)
|
1403
1457
|
|
1404
1458
|
if initial_vertex is None:
|
1405
1459
|
initial_vertex = 0
|
1406
1460
|
elif initial_vertex in G:
|
1407
|
-
|
1461
|
+
if isinstance(G, StaticSparseBackend):
|
1462
|
+
initial_vertex = cg._vertex_to_int[initial_vertex]
|
1463
|
+
else:
|
1464
|
+
initial_vertex = int_to_vertex.index(initial_vertex)
|
1408
1465
|
else:
|
1409
1466
|
raise ValueError("vertex ({0}) is not a vertex of the graph".format(initial_vertex))
|
1410
1467
|
|
1411
|
-
cdef short_digraph sd
|
1412
|
-
init_short_digraph(sd, G, edge_labelled=False, vertex_list=int_to_vertex)
|
1413
1468
|
cdef uint32_t** p_vertices = sd.neighbors
|
1414
1469
|
cdef uint32_t* p_tmp
|
1415
1470
|
cdef uint32_t* p_end
|
@@ -1421,27 +1476,18 @@ def maximum_cardinality_search(G, reverse=False, tree=False, initial_vertex=None
|
|
1421
1476
|
|
1422
1477
|
cdef int i, u, v
|
1423
1478
|
for i in range(N):
|
1424
|
-
weight[i] = 0
|
1425
|
-
seen[i] = False
|
1426
1479
|
pred[i] = i
|
1427
1480
|
|
1428
|
-
# We emulate a heap
|
1429
|
-
|
1430
|
-
|
1431
|
-
# never exceed O(m).
|
1432
|
-
cdef priority_queue[pair[int, int]] pq
|
1433
|
-
pq.push((0, initial_vertex))
|
1481
|
+
# We emulate a max-heap data structure using a min-heap with negative values
|
1482
|
+
cdef PairingHeap_of_n_integers P = PairingHeap_of_n_integers(N)
|
1483
|
+
P.push(initial_vertex, 0)
|
1434
1484
|
|
1435
1485
|
# The ordering alpha is feed in reversed order and revert afterword
|
1436
1486
|
cdef list alpha = []
|
1437
1487
|
|
1438
|
-
while
|
1439
|
-
|
1440
|
-
|
1441
|
-
if seen[u]:
|
1442
|
-
# We use a lazy decrease key mode, so u can be several times in pq
|
1443
|
-
continue
|
1444
|
-
|
1488
|
+
while P:
|
1489
|
+
u = P.top_item()
|
1490
|
+
P.pop()
|
1445
1491
|
alpha.append(int_to_vertex[u])
|
1446
1492
|
seen[u] = True
|
1447
1493
|
|
@@ -1451,12 +1497,13 @@ def maximum_cardinality_search(G, reverse=False, tree=False, initial_vertex=None
|
|
1451
1497
|
v = p_tmp[0]
|
1452
1498
|
if not seen[v]:
|
1453
1499
|
weight[v] += 1
|
1454
|
-
|
1500
|
+
P.decrease(v, -weight[v])
|
1455
1501
|
if pred[v] == v:
|
1456
1502
|
pred[v] = u
|
1457
1503
|
p_tmp += 1
|
1458
1504
|
|
1459
|
-
|
1505
|
+
if not isinstance(G, StaticSparseBackend):
|
1506
|
+
free_short_digraph(sd)
|
1460
1507
|
|
1461
1508
|
if len(alpha) < N:
|
1462
1509
|
raise ValueError("the input graph is not connected")
|
@@ -1763,16 +1810,18 @@ def maximum_cardinality_search_M(G, initial_vertex=None):
|
|
1763
1810
|
Traceback (most recent call last):
|
1764
1811
|
...
|
1765
1812
|
ValueError: vertex (17) is not a vertex of the graph
|
1766
|
-
"""
|
1767
|
-
cdef list int_to_vertex = list(G)
|
1768
1813
|
|
1769
|
-
|
1770
|
-
initial_vertex = 0
|
1771
|
-
elif initial_vertex in G:
|
1772
|
-
initial_vertex = int_to_vertex.index(initial_vertex)
|
1773
|
-
else:
|
1774
|
-
raise ValueError("vertex ({0}) is not a vertex of the graph".format(initial_vertex))
|
1814
|
+
Immutable graphs::
|
1775
1815
|
|
1816
|
+
sage: G = graphs.RandomGNP(10, .7)
|
1817
|
+
sage: G._backend
|
1818
|
+
<sage.graphs.base.sparse_graph.SparseGraphBackend ...>
|
1819
|
+
sage: H = Graph(G, immutable=True)
|
1820
|
+
sage: H._backend
|
1821
|
+
<sage.graphs.base.static_sparse_backend.StaticSparseBackend ...>
|
1822
|
+
sage: G.maximum_cardinality_search_M() == H.maximum_cardinality_search_M()
|
1823
|
+
True
|
1824
|
+
"""
|
1776
1825
|
cdef int N = G.order()
|
1777
1826
|
if not N:
|
1778
1827
|
return ([], [], [])
|
@@ -1782,8 +1831,26 @@ def maximum_cardinality_search_M(G, initial_vertex=None):
|
|
1782
1831
|
# Copying the whole graph to obtain the list of neighbors quicker than by
|
1783
1832
|
# calling out_neighbors. This data structure is well documented in the
|
1784
1833
|
# module sage.graphs.base.static_sparse_graph
|
1834
|
+
cdef list int_to_vertex
|
1835
|
+
cdef StaticSparseCGraph cg
|
1785
1836
|
cdef short_digraph sd
|
1786
|
-
|
1837
|
+
if isinstance(G, StaticSparseBackend):
|
1838
|
+
cg = <StaticSparseCGraph> G._cg
|
1839
|
+
sd = <short_digraph> cg.g
|
1840
|
+
int_to_vertex = cg._vertex_to_labels
|
1841
|
+
else:
|
1842
|
+
int_to_vertex = list(G)
|
1843
|
+
init_short_digraph(sd, G, edge_labelled=False, vertex_list=int_to_vertex)
|
1844
|
+
|
1845
|
+
if initial_vertex is None:
|
1846
|
+
initial_vertex = 0
|
1847
|
+
elif initial_vertex in G:
|
1848
|
+
if isinstance(G, StaticSparseBackend):
|
1849
|
+
initial_vertex = cg._vertex_to_int[initial_vertex]
|
1850
|
+
else:
|
1851
|
+
initial_vertex = int_to_vertex.index(initial_vertex)
|
1852
|
+
else:
|
1853
|
+
raise ValueError("vertex ({0}) is not a vertex of the graph".format(initial_vertex))
|
1787
1854
|
|
1788
1855
|
cdef MemoryAllocator mem = MemoryAllocator()
|
1789
1856
|
cdef int* alpha = <int*>mem.calloc(N, sizeof(int))
|
@@ -1795,7 +1862,8 @@ def maximum_cardinality_search_M(G, initial_vertex=None):
|
|
1795
1862
|
maximum_cardinality_search_M_short_digraph(sd, initial_vertex, alpha, alpha_inv, F, X)
|
1796
1863
|
sig_off()
|
1797
1864
|
|
1798
|
-
|
1865
|
+
if not isinstance(G, StaticSparseBackend):
|
1866
|
+
free_short_digraph(sd)
|
1799
1867
|
|
1800
1868
|
cdef int u, v
|
1801
1869
|
return ([int_to_vertex[alpha[u]] for u in range(N)],
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -340,8 +340,7 @@ class FreeKnotInfoMonoid(IndexedFreeAbelianMonoid):
|
|
340
340
|
if SymmetryMutant.concordance_inverse in hp_sym.keys():
|
341
341
|
hp_sym[SymmetryMutant.concordance_inverse] = hpm
|
342
342
|
|
343
|
-
for sym_mut in hp_sym.
|
344
|
-
hps = hp_sym[sym_mut]
|
343
|
+
for sym_mut, hps in hp_sym.items():
|
345
344
|
if hps.divides(hpoly):
|
346
345
|
Kgen = self((K, sym_mut))
|
347
346
|
h = hpoly // hps
|
@@ -376,7 +375,7 @@ class FreeKnotInfoMonoid(IndexedFreeAbelianMonoid):
|
|
376
375
|
sage: from sage.knots.free_knotinfo_monoid import FreeKnotInfoMonoid
|
377
376
|
sage: FKIM = FreeKnotInfoMonoid()
|
378
377
|
sage: K = KnotInfo.K5_1.link().mirror_image()
|
379
|
-
sage: FKIM._from_knot(K) # needs sage.modules
|
378
|
+
sage: FKIM._from_knot(K) # needs sage.groups sage.modules
|
380
379
|
(KnotInfo['K5_1m'],)
|
381
380
|
"""
|
382
381
|
hp = knot.homfly_polynomial(normalization='vz')
|
sage/knots/knot.py
CHANGED
@@ -293,7 +293,7 @@ class Knot(Link, Element, metaclass=InheritComparisonClasscallMetaclass):
|
|
293
293
|
crossing = i
|
294
294
|
break
|
295
295
|
if not string_found:
|
296
|
-
for i in range(
|
296
|
+
for i in range(crossing):
|
297
297
|
if abs(b[i]) == string or abs(b[i]) == string - 1:
|
298
298
|
string_found = True
|
299
299
|
crossing = i
|
sage/knots/knotinfo.py
CHANGED
@@ -18,7 +18,7 @@ package using
|
|
18
18
|
This will install a `Python wrapper <https://github.com/soehms/database_knotinfo#readme>`__
|
19
19
|
for the original databases in Sage. This wrapper perfoms an automatic progress
|
20
20
|
of version numbers. For more details and further install instructions please see
|
21
|
-
the
|
21
|
+
the corresponding web-page.
|
22
22
|
|
23
23
|
To perform all the doctests concerning the usage of the database on the installation
|
24
24
|
add the option ``-c``. In this case (for instance ``sage -f -c database_knotinfo``)
|
@@ -219,7 +219,7 @@ AUTHORS:
|
|
219
219
|
- Sebastian Oehms August 2020: initial version
|
220
220
|
- Sebastian Oehms June 2022: add :meth:`conway_polynomial` and :meth:`khovanov_polynomial` (:issue:`33969`)
|
221
221
|
|
222
|
-
Thanks to Chuck Livingston and Allison Moore for their support. For further acknowledgments see the
|
222
|
+
Thanks to Chuck Livingston and Allison Moore for their support. For further acknowledgments see the corresponding hompages.
|
223
223
|
"""
|
224
224
|
|
225
225
|
|
@@ -230,7 +230,7 @@ Thanks to Chuck Livingston and Allison Moore for their support. For further ackn
|
|
230
230
|
# it under the terms of the GNU General Public License as published by
|
231
231
|
# the Free Software Foundation, either version 2 of the License, or
|
232
232
|
# (at your option) any later version.
|
233
|
-
#
|
233
|
+
# https://www.gnu.org/licenses/
|
234
234
|
##############################################################################
|
235
235
|
|
236
236
|
|
@@ -1428,7 +1428,7 @@ class KnotInfoBase(Enum):
|
|
1428
1428
|
|
1429
1429
|
sage: H = KnotInfo.L11n459_1_1_1.homfly_polynomial() # optional - database_knotinfo
|
1430
1430
|
sage: all(L.homfly_polynomial() == L.link().homfly_polynomial(normalization='vz')\
|
1431
|
-
|
1431
|
+
....: for L in KnotInfo if L.crossing_number() < 7)
|
1432
1432
|
True
|
1433
1433
|
|
1434
1434
|
REFERENCES:
|