passagemath-flint 10.6.1rc10__cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.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_flint-10.6.1rc10.dist-info/METADATA +122 -0
- passagemath_flint-10.6.1rc10.dist-info/RECORD +361 -0
- passagemath_flint-10.6.1rc10.dist-info/WHEEL +6 -0
- passagemath_flint-10.6.1rc10.dist-info/top_level.txt +2 -0
- passagemath_flint.libs/libflint-aecb9cc5.so.21.0.0 +0 -0
- passagemath_flint.libs/libgf2x-a4cdec90.so.3.0.0 +0 -0
- passagemath_flint.libs/libgfortran-8f1e9814.so.5.0.0 +0 -0
- passagemath_flint.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_flint.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_flint.libs/libmpfi-e3c25853.so.0.0.0 +0 -0
- passagemath_flint.libs/libmpfr-82690d50.so.6.2.1 +0 -0
- passagemath_flint.libs/libntl-74e7d9a3.so.44.0.1 +0 -0
- passagemath_flint.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_flint.libs/libquadmath-828275a7.so.0.0.0 +0 -0
- sage/all__sagemath_flint.py +29 -0
- sage/combinat/all__sagemath_flint.py +1 -0
- sage/combinat/posets/all__sagemath_flint.py +1 -0
- sage/combinat/posets/hasse_cython_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/combinat/posets/hasse_cython_flint.pyx +194 -0
- sage/data_structures/all__sagemath_flint.py +1 -0
- sage/data_structures/bounded_integer_sequences.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/data_structures/bounded_integer_sequences.pxd +62 -0
- sage/data_structures/bounded_integer_sequences.pyx +1418 -0
- sage/graphs/all__sagemath_flint.py +1 -0
- sage/graphs/chrompoly.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/graphs/chrompoly.pyx +555 -0
- sage/graphs/matchpoly.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/graphs/matchpoly.pyx +412 -0
- sage/libs/all__sagemath_flint.py +17 -0
- sage/libs/arb/__init__.py +1 -0
- sage/libs/arb/acb.pxd +154 -0
- sage/libs/arb/acb_calc.pxd +9 -0
- sage/libs/arb/acb_elliptic.pxd +25 -0
- sage/libs/arb/acb_hypgeom.pxd +74 -0
- sage/libs/arb/acb_mat.pxd +62 -0
- sage/libs/arb/acb_modular.pxd +17 -0
- sage/libs/arb/acb_poly.pxd +216 -0
- sage/libs/arb/arb.pxd +240 -0
- sage/libs/arb/arb_fmpz_poly.pxd +21 -0
- sage/libs/arb/arb_hypgeom.pxd +83 -0
- sage/libs/arb/arb_wrap.h +34 -0
- sage/libs/arb/arf.pxd +131 -0
- sage/libs/arb/arith.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/arb/arith.pyx +87 -0
- sage/libs/arb/bernoulli.pxd +6 -0
- sage/libs/arb/mag.pxd +77 -0
- sage/libs/arb/types.pxd +37 -0
- sage/libs/flint/__init__.py +1 -0
- sage/libs/flint/acb.pxd +270 -0
- sage/libs/flint/acb_calc.pxd +22 -0
- sage/libs/flint/acb_dft.pxd +51 -0
- sage/libs/flint/acb_dirichlet.pxd +112 -0
- sage/libs/flint/acb_elliptic.pxd +42 -0
- sage/libs/flint/acb_hypgeom.pxd +169 -0
- sage/libs/flint/acb_macros.pxd +9 -0
- sage/libs/flint/acb_mat.pxd +136 -0
- sage/libs/flint/acb_mat_macros.pxd +10 -0
- sage/libs/flint/acb_modular.pxd +62 -0
- sage/libs/flint/acb_poly.pxd +251 -0
- sage/libs/flint/acb_poly_macros.pxd +8 -0
- sage/libs/flint/acb_theta.pxd +124 -0
- sage/libs/flint/acf.pxd +32 -0
- sage/libs/flint/aprcl.pxd +84 -0
- sage/libs/flint/arb.pxd +382 -0
- sage/libs/flint/arb_calc.pxd +31 -0
- sage/libs/flint/arb_fmpz_poly.pxd +34 -0
- sage/libs/flint/arb_fpwrap.pxd +215 -0
- sage/libs/flint/arb_hypgeom.pxd +147 -0
- sage/libs/flint/arb_macros.pxd +9 -0
- sage/libs/flint/arb_mat.pxd +140 -0
- sage/libs/flint/arb_mat_macros.pxd +10 -0
- sage/libs/flint/arb_poly.pxd +237 -0
- sage/libs/flint/arf.pxd +167 -0
- sage/libs/flint/arith.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/arith.pxd +76 -0
- sage/libs/flint/arith.pyx +77 -0
- sage/libs/flint/arith_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/arith_sage.pyx +308 -0
- sage/libs/flint/bernoulli.pxd +28 -0
- sage/libs/flint/bool_mat.pxd +52 -0
- sage/libs/flint/ca.pxd +203 -0
- sage/libs/flint/ca_ext.pxd +34 -0
- sage/libs/flint/ca_field.pxd +32 -0
- sage/libs/flint/ca_mat.pxd +117 -0
- sage/libs/flint/ca_poly.pxd +104 -0
- sage/libs/flint/ca_vec.pxd +46 -0
- sage/libs/flint/calcium.pxd +27 -0
- sage/libs/flint/d_mat.pxd +39 -0
- sage/libs/flint/d_vec.pxd +32 -0
- sage/libs/flint/dirichlet.pxd +57 -0
- sage/libs/flint/dlog.pxd +53 -0
- sage/libs/flint/double_extras.pxd +24 -0
- sage/libs/flint/double_interval.pxd +36 -0
- sage/libs/flint/fexpr.pxd +104 -0
- sage/libs/flint/fexpr_builtin.pxd +20 -0
- sage/libs/flint/fft.pxd +66 -0
- sage/libs/flint/flint.pxd +36 -0
- sage/libs/flint/flint_ntl_wrap.h +35 -0
- sage/libs/flint/flint_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/flint_sage.pyx +163 -0
- sage/libs/flint/flint_wrap.h +190 -0
- sage/libs/flint/fmpq.pxd +137 -0
- sage/libs/flint/fmpq_mat.pxd +105 -0
- sage/libs/flint/fmpq_mat_macros.pxd +10 -0
- sage/libs/flint/fmpq_mpoly.pxd +165 -0
- sage/libs/flint/fmpq_mpoly_factor.pxd +30 -0
- sage/libs/flint/fmpq_poly.pxd +241 -0
- sage/libs/flint/fmpq_poly_macros.pxd +9 -0
- sage/libs/flint/fmpq_poly_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/fmpq_poly_sage.pxd +31 -0
- sage/libs/flint/fmpq_poly_sage.pyx +48 -0
- sage/libs/flint/fmpq_vec.pxd +27 -0
- sage/libs/flint/fmpz.pxd +256 -0
- sage/libs/flint/fmpz_extras.pxd +32 -0
- sage/libs/flint/fmpz_factor.pxd +42 -0
- sage/libs/flint/fmpz_factor_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/fmpz_factor_sage.pxd +4 -0
- sage/libs/flint/fmpz_factor_sage.pyx +29 -0
- sage/libs/flint/fmpz_lll.pxd +49 -0
- sage/libs/flint/fmpz_macros.pxd +8 -0
- sage/libs/flint/fmpz_mat.pxd +184 -0
- sage/libs/flint/fmpz_mat_macros.pxd +10 -0
- sage/libs/flint/fmpz_mod.pxd +46 -0
- sage/libs/flint/fmpz_mod_mat.pxd +71 -0
- sage/libs/flint/fmpz_mod_mpoly.pxd +161 -0
- sage/libs/flint/fmpz_mod_mpoly_factor.pxd +28 -0
- sage/libs/flint/fmpz_mod_poly.pxd +249 -0
- sage/libs/flint/fmpz_mod_poly_factor.pxd +46 -0
- sage/libs/flint/fmpz_mod_vec.pxd +27 -0
- sage/libs/flint/fmpz_mpoly.pxd +224 -0
- sage/libs/flint/fmpz_mpoly_factor.pxd +29 -0
- sage/libs/flint/fmpz_mpoly_q.pxd +57 -0
- sage/libs/flint/fmpz_poly.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/fmpz_poly.pxd +407 -0
- sage/libs/flint/fmpz_poly.pyx +19 -0
- sage/libs/flint/fmpz_poly_factor.pxd +33 -0
- sage/libs/flint/fmpz_poly_macros.pxd +8 -0
- sage/libs/flint/fmpz_poly_mat.pxd +71 -0
- sage/libs/flint/fmpz_poly_q.pxd +55 -0
- sage/libs/flint/fmpz_poly_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/fmpz_poly_sage.pxd +20 -0
- sage/libs/flint/fmpz_poly_sage.pyx +500 -0
- sage/libs/flint/fmpz_vec.pxd +80 -0
- sage/libs/flint/fmpzi.pxd +52 -0
- sage/libs/flint/fq.pxd +97 -0
- sage/libs/flint/fq_default.pxd +84 -0
- sage/libs/flint/fq_default_mat.pxd +70 -0
- sage/libs/flint/fq_default_poly.pxd +97 -0
- sage/libs/flint/fq_default_poly_factor.pxd +39 -0
- sage/libs/flint/fq_embed.pxd +28 -0
- sage/libs/flint/fq_mat.pxd +83 -0
- sage/libs/flint/fq_nmod.pxd +95 -0
- sage/libs/flint/fq_nmod_embed.pxd +28 -0
- sage/libs/flint/fq_nmod_mat.pxd +83 -0
- sage/libs/flint/fq_nmod_mpoly.pxd +130 -0
- sage/libs/flint/fq_nmod_mpoly_factor.pxd +28 -0
- sage/libs/flint/fq_nmod_poly.pxd +202 -0
- sage/libs/flint/fq_nmod_poly_factor.pxd +47 -0
- sage/libs/flint/fq_nmod_vec.pxd +33 -0
- sage/libs/flint/fq_poly.pxd +204 -0
- sage/libs/flint/fq_poly_factor.pxd +47 -0
- sage/libs/flint/fq_vec.pxd +33 -0
- sage/libs/flint/fq_zech.pxd +99 -0
- sage/libs/flint/fq_zech_embed.pxd +28 -0
- sage/libs/flint/fq_zech_mat.pxd +78 -0
- sage/libs/flint/fq_zech_poly.pxd +198 -0
- sage/libs/flint/fq_zech_poly_factor.pxd +47 -0
- sage/libs/flint/fq_zech_vec.pxd +33 -0
- sage/libs/flint/gr.pxd +174 -0
- sage/libs/flint/gr_generic.pxd +215 -0
- sage/libs/flint/gr_mat.pxd +161 -0
- sage/libs/flint/gr_mpoly.pxd +68 -0
- sage/libs/flint/gr_poly.pxd +276 -0
- sage/libs/flint/gr_special.pxd +237 -0
- sage/libs/flint/gr_vec.pxd +120 -0
- sage/libs/flint/hypgeom.pxd +24 -0
- sage/libs/flint/long_extras.pxd +23 -0
- sage/libs/flint/mag.pxd +131 -0
- sage/libs/flint/mag_macros.pxd +8 -0
- sage/libs/flint/mpf_mat.pxd +36 -0
- sage/libs/flint/mpf_vec.pxd +34 -0
- sage/libs/flint/mpfr_mat.pxd +27 -0
- sage/libs/flint/mpfr_vec.pxd +25 -0
- sage/libs/flint/mpn_extras.pxd +41 -0
- sage/libs/flint/mpoly.pxd +72 -0
- sage/libs/flint/nf.pxd +19 -0
- sage/libs/flint/nf_elem.pxd +74 -0
- sage/libs/flint/nmod.pxd +35 -0
- sage/libs/flint/nmod_mat.pxd +104 -0
- sage/libs/flint/nmod_mpoly.pxd +144 -0
- sage/libs/flint/nmod_mpoly_factor.pxd +28 -0
- sage/libs/flint/nmod_poly.pxd +339 -0
- sage/libs/flint/nmod_poly_factor.pxd +44 -0
- sage/libs/flint/nmod_poly_linkage.pxi +710 -0
- sage/libs/flint/nmod_poly_mat.pxd +76 -0
- sage/libs/flint/nmod_vec.pxd +40 -0
- sage/libs/flint/ntl_interface.pxd +17 -0
- sage/libs/flint/padic.pxd +93 -0
- sage/libs/flint/padic_mat.pxd +64 -0
- sage/libs/flint/padic_poly.pxd +88 -0
- sage/libs/flint/partitions.pxd +23 -0
- sage/libs/flint/perm.pxd +26 -0
- sage/libs/flint/profiler.pxd +24 -0
- sage/libs/flint/qadic.pxd +77 -0
- sage/libs/flint/qfb.pxd +44 -0
- sage/libs/flint/qqbar.pxd +172 -0
- sage/libs/flint/qsieve.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/qsieve.pxd +41 -0
- sage/libs/flint/qsieve.pyx +21 -0
- sage/libs/flint/qsieve_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/qsieve_sage.pyx +67 -0
- sage/libs/flint/thread_pool.pxd +25 -0
- sage/libs/flint/types.pxd +2076 -0
- sage/libs/flint/ulong_extras.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/ulong_extras.pxd +141 -0
- sage/libs/flint/ulong_extras.pyx +21 -0
- sage/libs/flint/ulong_extras_sage.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/libs/flint/ulong_extras_sage.pyx +21 -0
- sage/matrix/all__sagemath_flint.py +1 -0
- sage/matrix/change_ring.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/change_ring.pyx +43 -0
- sage/matrix/matrix_complex_ball_dense.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_complex_ball_dense.pxd +14 -0
- sage/matrix/matrix_complex_ball_dense.pyx +973 -0
- sage/matrix/matrix_cyclo_dense.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_cyclo_dense.pxd +16 -0
- sage/matrix/matrix_cyclo_dense.pyx +1761 -0
- sage/matrix/matrix_integer_dense.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_integer_dense.pxd +32 -0
- sage/matrix/matrix_integer_dense.pyx +5801 -0
- sage/matrix/matrix_integer_dense_hnf.py +1294 -0
- sage/matrix/matrix_integer_dense_saturation.py +346 -0
- sage/matrix/matrix_integer_sparse.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_integer_sparse.pxd +9 -0
- sage/matrix/matrix_integer_sparse.pyx +1090 -0
- sage/matrix/matrix_rational_dense.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_rational_dense.pxd +23 -0
- sage/matrix/matrix_rational_dense.pyx +2995 -0
- sage/matrix/matrix_rational_sparse.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_rational_sparse.pxd +11 -0
- sage/matrix/matrix_rational_sparse.pyx +789 -0
- sage/matrix/misc_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/matrix/misc_flint.pyx +109 -0
- sage/modular/all__sagemath_flint.py +1 -0
- sage/modular/modform/all__sagemath_flint.py +1 -0
- sage/modular/modform/eis_series_cython.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/modular/modform/eis_series_cython.pyx +226 -0
- sage/modular/modsym/all__sagemath_flint.py +1 -0
- sage/modular/modsym/apply.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/modular/modsym/apply.pxd +6 -0
- sage/modular/modsym/apply.pyx +113 -0
- sage/modular/modsym/heilbronn.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/modular/modsym/heilbronn.pyx +966 -0
- sage/modular/pollack_stevens/all__sagemath_flint.py +1 -0
- sage/modular/pollack_stevens/dist.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/modular/pollack_stevens/dist.pxd +38 -0
- sage/modular/pollack_stevens/dist.pyx +1439 -0
- sage/quivers/algebra.py +691 -0
- sage/quivers/algebra_elements.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/quivers/algebra_elements.pxd +97 -0
- sage/quivers/algebra_elements.pxi +1324 -0
- sage/quivers/algebra_elements.pyx +1424 -0
- sage/quivers/all.py +1 -0
- sage/quivers/ar_quiver.py +917 -0
- sage/quivers/homspace.py +640 -0
- sage/quivers/morphism.py +1282 -0
- sage/quivers/path_semigroup.py +1155 -0
- sage/quivers/paths.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/quivers/paths.pxd +13 -0
- sage/quivers/paths.pyx +809 -0
- sage/quivers/representation.py +2975 -0
- sage/rings/all__sagemath_flint.py +37 -0
- sage/rings/cif.py +4 -0
- sage/rings/complex_arb.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_arb.pxd +29 -0
- sage/rings/complex_arb.pyx +5176 -0
- sage/rings/complex_interval.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_interval.pxd +30 -0
- sage/rings/complex_interval.pyx +2475 -0
- sage/rings/complex_interval_field.py +711 -0
- sage/rings/convert/all.py +1 -0
- sage/rings/convert/mpfi.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/convert/mpfi.pxd +6 -0
- sage/rings/convert/mpfi.pyx +576 -0
- sage/rings/factorint_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/factorint_flint.pyx +99 -0
- sage/rings/fraction_field_FpT.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/fraction_field_FpT.pxd +28 -0
- sage/rings/fraction_field_FpT.pyx +2043 -0
- sage/rings/imaginary_unit.py +5 -0
- sage/rings/monomials.py +73 -0
- sage/rings/number_field/S_unit_solver.py +2870 -0
- sage/rings/number_field/all__sagemath_flint.py +7 -0
- sage/rings/number_field/bdd_height.py +664 -0
- sage/rings/number_field/class_group.py +762 -0
- sage/rings/number_field/galois_group.py +1307 -0
- sage/rings/number_field/homset.py +612 -0
- sage/rings/number_field/maps.py +687 -0
- sage/rings/number_field/morphism.py +272 -0
- sage/rings/number_field/number_field.py +12820 -0
- sage/rings/number_field/number_field_element.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/number_field/number_field_element.pxd +59 -0
- sage/rings/number_field/number_field_element.pyx +5735 -0
- sage/rings/number_field/number_field_element_quadratic.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/number_field/number_field_element_quadratic.pxd +34 -0
- sage/rings/number_field/number_field_element_quadratic.pyx +3185 -0
- sage/rings/number_field/number_field_ideal_rel.py +925 -0
- sage/rings/number_field/number_field_morphisms.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/number_field/number_field_morphisms.pyx +781 -0
- sage/rings/number_field/number_field_rel.py +2734 -0
- sage/rings/number_field/order.py +2981 -0
- sage/rings/number_field/order_ideal.py +804 -0
- sage/rings/number_field/selmer_group.py +715 -0
- sage/rings/number_field/small_primes_of_degree_one.py +242 -0
- sage/rings/number_field/splitting_field.py +606 -0
- sage/rings/number_field/structure.py +380 -0
- sage/rings/number_field/unit_group.py +721 -0
- sage/rings/padics/all__sagemath_flint.py +3 -0
- sage/rings/polynomial/all__sagemath_flint.py +1 -0
- sage/rings/polynomial/complex_roots.py +312 -0
- sage/rings/polynomial/evaluation_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/evaluation_flint.pxd +7 -0
- sage/rings/polynomial/evaluation_flint.pyx +68 -0
- sage/rings/polynomial/hilbert.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/hilbert.pyx +602 -0
- sage/rings/polynomial/polynomial_complex_arb.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_complex_arb.pxd +7 -0
- sage/rings/polynomial/polynomial_complex_arb.pyx +963 -0
- sage/rings/polynomial/polynomial_integer_dense_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_integer_dense_flint.pxd +13 -0
- sage/rings/polynomial/polynomial_integer_dense_flint.pyx +1881 -0
- sage/rings/polynomial/polynomial_number_field.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_number_field.pyx +345 -0
- sage/rings/polynomial/polynomial_rational_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_rational_flint.pxd +20 -0
- sage/rings/polynomial/polynomial_rational_flint.pyx +2598 -0
- sage/rings/polynomial/polynomial_zmod_flint.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_zmod_flint.pxd +20 -0
- sage/rings/polynomial/polynomial_zmod_flint.pyx +1063 -0
- sage/rings/polynomial/real_roots.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/real_roots.pxd +81 -0
- sage/rings/polynomial/real_roots.pyx +4704 -0
- sage/rings/polynomial/refine_root.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/refine_root.pyx +142 -0
- sage/rings/polynomial/weil/all.py +4 -0
- sage/rings/polynomial/weil/power_sums.h +46 -0
- sage/rings/polynomial/weil/weil_polynomials.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/weil/weil_polynomials.pyx +596 -0
- sage/rings/qqbar.py +9025 -0
- sage/rings/real_arb.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/real_arb.pxd +21 -0
- sage/rings/real_arb.pyx +4065 -0
- sage/rings/real_interval_absolute.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/real_interval_absolute.pyx +1073 -0
- sage/rings/real_mpfi.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/rings/real_mpfi.pyx +5428 -0
- sage/schemes/all__sagemath_flint.py +1 -0
- sage/schemes/elliptic_curves/all__sagemath_flint.py +1 -0
- sage/schemes/elliptic_curves/descent_two_isogeny.cpython-312-x86_64-linux-gnu.so +0 -0
- sage/schemes/elliptic_curves/descent_two_isogeny.pyx +1387 -0
- sage/schemes/elliptic_curves/descent_two_isogeny_pari.pxd +5 -0
@@ -0,0 +1,917 @@
|
|
1
|
+
# sage_setup: distribution = sagemath-flint
|
2
|
+
# sage.doctest: needs sage.graphs sage.modules
|
3
|
+
r"""
|
4
|
+
Auslander-Reiten Quivers
|
5
|
+
"""
|
6
|
+
|
7
|
+
# ****************************************************************************
|
8
|
+
# Copyright (C) 2024 Travis Scrimshaw <tcscrims at gmail.com>
|
9
|
+
#
|
10
|
+
# This program is free software: you can redistribute it and/or modify
|
11
|
+
# it under the terms of the GNU General Public License as published by
|
12
|
+
# the Free Software Foundation, either version 2 of the License, or
|
13
|
+
# (at your option) any later version.
|
14
|
+
# https://www.gnu.org/licenses/
|
15
|
+
# ****************************************************************************
|
16
|
+
|
17
|
+
from sage.categories.sets_cat import Sets
|
18
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
19
|
+
from sage.combinat.root_system.cartan_type import CartanType
|
20
|
+
from sage.graphs.digraph import DiGraph
|
21
|
+
from sage.misc.cachefunc import cached_method
|
22
|
+
from sage.rings.integer_ring import ZZ
|
23
|
+
from sage.sets.family import Family
|
24
|
+
from sage.structure.element import Element
|
25
|
+
from sage.structure.global_options import GlobalOptions
|
26
|
+
from sage.structure.parent import Parent
|
27
|
+
from sage.structure.richcmp import richcmp
|
28
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
29
|
+
|
30
|
+
|
31
|
+
class AuslanderReitenQuiver(UniqueRepresentation, Parent):
|
32
|
+
r"""
|
33
|
+
The Auslander-Reiten quiver.
|
34
|
+
|
35
|
+
Let `Q = (Q_0, Q_1)` be a finite acyclic quiver. The
|
36
|
+
*Auslander-Reiten quiver* (AR quiver) `\Gamma_Q` is the quiver
|
37
|
+
whose vertices correspond to the indecompositible modules of `Q`
|
38
|
+
(equivalently its path algebra over an algebraically closed field)
|
39
|
+
and edges are irreducible morphisms.
|
40
|
+
|
41
|
+
In this implementation, we denote the vertices of `\Gamma_Q` as
|
42
|
+
certain pairs `\langle v, k \rangle`, where `v \in Q_0` and
|
43
|
+
`k \in \ZZ \setminus \{0\}` is called the *level*. When `k > 0`
|
44
|
+
(resp. `k < 0`), then it corresponds to a preprojective (resp.
|
45
|
+
postinjective) module. When the quiver is a finite type Dynkin
|
46
|
+
quiver, we consider all modules to be preprojectives and denoted
|
47
|
+
by a positive level.
|
48
|
+
|
49
|
+
.. NOTE::
|
50
|
+
|
51
|
+
We use the terminology *postinjective* instead of *preinjective*
|
52
|
+
given that they follow from injectives by AR translation.
|
53
|
+
|
54
|
+
ALGORITHM:
|
55
|
+
|
56
|
+
We compute the dimension vectors of a projective `\langle v, 1 \rangle`
|
57
|
+
by counting the number of (directed) paths `u \to v` in `Q`. We then
|
58
|
+
proceed inductively to compute all of the dimension vectors of level
|
59
|
+
`k` by using the translation equation
|
60
|
+
|
61
|
+
.. MATH::
|
62
|
+
|
63
|
+
dim \langle v, k-1 \rangle + \dim \langle v, k \rangle
|
64
|
+
= \sum_{u,k'} \dim \langle u, k' \rangle,
|
65
|
+
|
66
|
+
where the sum is over all paths from `\langle v, k-1 \rangle` to
|
67
|
+
`\langle v, k \rangle` in `\Gamma_Q`. More specifically, for each edge
|
68
|
+
`(u, v, \ell) \in Q_1` (resp. `(v, u, \ell) \in Q_1`), we have
|
69
|
+
`\langle u, k-1 \rangle` (resp. `\langle u, k \rangle`) in the sum
|
70
|
+
(assuming the node is in the AR quiver).
|
71
|
+
|
72
|
+
The algorithm for postinjectives is dual to the above.
|
73
|
+
|
74
|
+
.. TODO::
|
75
|
+
|
76
|
+
This only is implemented for the preprojectives and postinjectives
|
77
|
+
when the quiver is not a finite type Dynkin quiver.
|
78
|
+
|
79
|
+
.. TODO::
|
80
|
+
|
81
|
+
Implement this for general Artinian algebras.
|
82
|
+
|
83
|
+
EXAMPLES:
|
84
|
+
|
85
|
+
We create the AR quivers for finite type `A_3` Dynkin quivers::
|
86
|
+
|
87
|
+
sage: DA = DiGraph([[1, 2], [2, 3]])
|
88
|
+
sage: AR = DA.auslander_reiten_quiver()
|
89
|
+
sage: AR.digraph().edges(labels=False)
|
90
|
+
[(<1, 1>, <2, 2>), (<2, 1>, <1, 1>), (<2, 1>, <3, 2>), (<3, 1>, <2, 1>),
|
91
|
+
(<2, 2>, <3, 3>), (<3, 2>, <2, 2>)]
|
92
|
+
|
93
|
+
sage: DA = DiGraph([[1, 2], [3, 2]])
|
94
|
+
sage: AR = DA.auslander_reiten_quiver()
|
95
|
+
sage: AR.digraph().edges(labels=False)
|
96
|
+
[(<1, 1>, <2, 2>), (<2, 1>, <1, 1>), (<2, 1>, <3, 1>), (<3, 1>, <2, 2>),
|
97
|
+
(<2, 2>, <1, 2>), (<2, 2>, <3, 2>)]
|
98
|
+
|
99
|
+
sage: DA = DiGraph([[2, 1], [2, 3]])
|
100
|
+
sage: AR = DA.auslander_reiten_quiver()
|
101
|
+
sage: AR.digraph().edges(labels=False)
|
102
|
+
[(<1, 1>, <2, 1>), (<2, 1>, <1, 2>), (<2, 1>, <3, 2>), (<3, 1>, <2, 1>),
|
103
|
+
(<1, 2>, <2, 2>), (<3, 2>, <2, 2>)]
|
104
|
+
|
105
|
+
sage: DA = DiGraph([[2, 1], [3, 2]])
|
106
|
+
sage: AR = DA.auslander_reiten_quiver()
|
107
|
+
sage: AR.digraph().edges(labels=False)
|
108
|
+
[(<1, 1>, <2, 1>), (<2, 1>, <3, 1>), (<2, 1>, <1, 2>), (<3, 1>, <2, 2>),
|
109
|
+
(<1, 2>, <2, 2>), (<2, 2>, <1, 3>)]
|
110
|
+
|
111
|
+
An example for the type `D_5` Dynkin quiver::
|
112
|
+
|
113
|
+
sage: DD = DiGraph([[5,3], [4,3], [3,2], [2,1]])
|
114
|
+
sage: AR = DD.auslander_reiten_quiver()
|
115
|
+
sage: AR
|
116
|
+
Auslander-Reiten quiver of a ['D', 5] Dynkin quiver
|
117
|
+
sage: len(list(DD))
|
118
|
+
5
|
119
|
+
|
120
|
+
An `E_8` Dynkin quiver::
|
121
|
+
|
122
|
+
sage: DE = DiGraph([[8,7], [7,6], [5,6], [5,3], [3,4], [3,2], [2,1]])
|
123
|
+
sage: AR = DE.auslander_reiten_quiver()
|
124
|
+
sage: AR
|
125
|
+
Auslander-Reiten quiver of a ['E', 8] Dynkin quiver
|
126
|
+
sage: len(list(AR))
|
127
|
+
120
|
128
|
+
sage: len(list(RootSystem(['E', 8]).root_lattice().positive_roots()))
|
129
|
+
120
|
130
|
+
|
131
|
+
The Kronecker quiver::
|
132
|
+
|
133
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
134
|
+
sage: AR = D.auslander_reiten_quiver()
|
135
|
+
sage: for i in range(1, 5):
|
136
|
+
....: for v in D.vertices():
|
137
|
+
....: pp = AR(v, i)
|
138
|
+
....: pi = AR(v, -i)
|
139
|
+
....: print(pp, pp.dimension_vector(), " ", pi, pi.dimension_vector())
|
140
|
+
<1, 1> v1 + 2*v2 <1, -1> v1
|
141
|
+
<2, 1> v2 <2, -1> 2*v1 + v2
|
142
|
+
<1, 2> 3*v1 + 4*v2 <1, -2> 3*v1 + 2*v2
|
143
|
+
<2, 2> 2*v1 + 3*v2 <2, -2> 4*v1 + 3*v2
|
144
|
+
<1, 3> 5*v1 + 6*v2 <1, -3> 5*v1 + 4*v2
|
145
|
+
<2, 3> 4*v1 + 5*v2 <2, -3> 6*v1 + 5*v2
|
146
|
+
<1, 4> 7*v1 + 8*v2 <1, -4> 7*v1 + 6*v2
|
147
|
+
<2, 4> 6*v1 + 7*v2 <2, -4> 8*v1 + 7*v2
|
148
|
+
"""
|
149
|
+
@staticmethod
|
150
|
+
def __classcall_private__(cls, quiver):
|
151
|
+
"""
|
152
|
+
Normalize input to ensure a unique representation.
|
153
|
+
|
154
|
+
EXAMPLES::
|
155
|
+
|
156
|
+
sage: D = DiGraph([[1,2], [2,3], [3,1]])
|
157
|
+
sage: D.auslander_reiten_quiver()
|
158
|
+
Traceback (most recent call last):
|
159
|
+
...
|
160
|
+
ValueError: the quiver must not have cycles
|
161
|
+
"""
|
162
|
+
if quiver.has_loops() or not quiver.is_directed_acyclic():
|
163
|
+
raise ValueError("the quiver must not have cycles")
|
164
|
+
quiver = quiver.copy(immutable=True)
|
165
|
+
return super().__classcall__(cls, quiver)
|
166
|
+
|
167
|
+
def __init__(self, quiver):
|
168
|
+
r"""
|
169
|
+
Initialize ``self``.
|
170
|
+
|
171
|
+
EXAMPLES::
|
172
|
+
|
173
|
+
sage: DE = DiGraph([[7,6], [6,5], [5,3], [3,4], [2,3], [1,2]])
|
174
|
+
sage: AR = DE.auslander_reiten_quiver()
|
175
|
+
sage: TestSuite(AR).run()
|
176
|
+
|
177
|
+
sage: D = DiGraph([[1,2], [3,4]])
|
178
|
+
sage: AR = D.auslander_reiten_quiver()
|
179
|
+
sage: TestSuite(AR).run()
|
180
|
+
|
181
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
182
|
+
sage: AR = D.auslander_reiten_quiver()
|
183
|
+
sage: TestSuite(AR).run()
|
184
|
+
"""
|
185
|
+
self._quiver = quiver
|
186
|
+
self._top_sort = quiver.topological_sort()
|
187
|
+
self._dim_vec_space = CombinatorialFreeModule(ZZ, quiver.vertices(), prefix='v', bracket=False)
|
188
|
+
self._max_level = float('inf')
|
189
|
+
|
190
|
+
dynkin_type = detect_dynkin_quiver(quiver)
|
191
|
+
if dynkin_type is not None:
|
192
|
+
self._cartan_type = dynkin_type
|
193
|
+
self._is_finite = dynkin_type is not None
|
194
|
+
cat = Sets().Enumerated().Finite() if self._is_finite else Sets().Infinite()
|
195
|
+
super().__init__(self, category=cat)
|
196
|
+
|
197
|
+
def _repr_(self) -> str:
|
198
|
+
"""
|
199
|
+
Return a string representation of ``self``.
|
200
|
+
|
201
|
+
EXAMPLES::
|
202
|
+
|
203
|
+
sage: DE = DiGraph([[5,6], [5,3], [3,4], [2,3], [1,2]])
|
204
|
+
sage: DE.auslander_reiten_quiver()
|
205
|
+
Auslander-Reiten quiver of a ['E', 6] Dynkin quiver
|
206
|
+
|
207
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
208
|
+
sage: D.auslander_reiten_quiver()
|
209
|
+
Auslander-Reiten quiver of Multi-digraph on 2 vertices
|
210
|
+
"""
|
211
|
+
if self._is_finite:
|
212
|
+
return "Auslander-Reiten quiver of a {} Dynkin quiver".format(self._cartan_type)
|
213
|
+
return "Auslander-Reiten quiver of {}".format(self._quiver)
|
214
|
+
|
215
|
+
# add options to class
|
216
|
+
class options(GlobalOptions):
|
217
|
+
r"""
|
218
|
+
Set and display the global options for Auslander-Reiten quivers.
|
219
|
+
If no parameters are set, then the function returns a copy of the
|
220
|
+
options dictionary.
|
221
|
+
|
222
|
+
The ``options`` to partitions can be accessed as the method
|
223
|
+
:obj:`AuslanderReitenQuiver.options` of
|
224
|
+
:class:`~sage.quivers.ar_quiver.AuslanderReitenQuiver`.
|
225
|
+
|
226
|
+
@OPTIONS@
|
227
|
+
|
228
|
+
EXAMPLES::
|
229
|
+
|
230
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
231
|
+
sage: AR = D.auslander_reiten_quiver()
|
232
|
+
sage: node = AR(2, 2)
|
233
|
+
sage: latex(node)
|
234
|
+
\left\langle 2, 2 \right\rangle
|
235
|
+
sage: AR.options.latex = "dimension_vector"
|
236
|
+
sage: latex(node)
|
237
|
+
2 v_{1} + 3 v_{2}
|
238
|
+
sage: AR.options.latex = "both"
|
239
|
+
sage: latex(node)
|
240
|
+
\begin{gathered} \left\langle 2, 2 \right\rangle \\ 2 v_{1} + 3 v_{2} \end{gathered}
|
241
|
+
sage: AR.options._reset()
|
242
|
+
"""
|
243
|
+
NAME = 'AuslanderReitenQuiver'
|
244
|
+
module = 'sage.quivers.ar_quiver'
|
245
|
+
latex = dict(default='node',
|
246
|
+
description='Specifies how nodes of the AR quiver should be latexed',
|
247
|
+
values=dict(node='latex as the node description',
|
248
|
+
dimension_vector='latex as the dimension vector',
|
249
|
+
both='latex as both'),
|
250
|
+
case_sensitive=False)
|
251
|
+
|
252
|
+
def _an_element_(self):
|
253
|
+
r"""
|
254
|
+
Return an element of ``self``.
|
255
|
+
|
256
|
+
EXAMPLES::
|
257
|
+
|
258
|
+
sage: DE = DiGraph([[7,8], [7,6], [5,6], [3,5], [4,3], [2,3], [1,2]])
|
259
|
+
sage: AR = DE.auslander_reiten_quiver()
|
260
|
+
sage: AR._an_element_()
|
261
|
+
<1, 1>
|
262
|
+
|
263
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
264
|
+
sage: AR = D.auslander_reiten_quiver()
|
265
|
+
sage: AR._an_element_()
|
266
|
+
<1, 1>
|
267
|
+
"""
|
268
|
+
return next(iter(self.projectives()))
|
269
|
+
|
270
|
+
def quiver(self):
|
271
|
+
r"""
|
272
|
+
Return the quiver defining ``self``.
|
273
|
+
|
274
|
+
EXAMPLES::
|
275
|
+
|
276
|
+
sage: DE = DiGraph([[7,8], [7,6], [5,6], [3,5], [4,3], [2,3], [1,2]])
|
277
|
+
sage: AR = DE.auslander_reiten_quiver()
|
278
|
+
sage: AR.quiver() == DE
|
279
|
+
True
|
280
|
+
"""
|
281
|
+
return self._quiver
|
282
|
+
|
283
|
+
def projectives(self):
|
284
|
+
r"""
|
285
|
+
Return the projectives of ``self``.
|
286
|
+
|
287
|
+
EXAMPLES::
|
288
|
+
|
289
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
290
|
+
sage: AR = D.auslander_reiten_quiver()
|
291
|
+
sage: AR.projectives()
|
292
|
+
Finite family {1: <1, 1>, 2: <2, 1>}
|
293
|
+
"""
|
294
|
+
return Family({v: self.element_class(self, v, 1) for v in self._quiver.vertex_iterator()})
|
295
|
+
|
296
|
+
@cached_method
|
297
|
+
def simples(self):
|
298
|
+
r"""
|
299
|
+
Return the simples of ``self``.
|
300
|
+
|
301
|
+
EXAMPLES::
|
302
|
+
|
303
|
+
sage: DE = DiGraph([[7,8], [7,6], [5,6], [3,5], [4,3], [2,3], [1,2]])
|
304
|
+
sage: AR = DE.auslander_reiten_quiver()
|
305
|
+
sage: AR.simples()
|
306
|
+
Finite family {1: <1, 15>, 2: <1, 14>, 3: <8, 4>, 4: <4, 15>,
|
307
|
+
5: <8, 3>, 6: <6, 1>, 7: <7, 15>, 8: <8, 1>}
|
308
|
+
"""
|
309
|
+
ret = {}
|
310
|
+
for elt in self:
|
311
|
+
supp = elt.dimension_vector().support()
|
312
|
+
if len(supp) != 1:
|
313
|
+
continue
|
314
|
+
ret[next(iter(supp))] = elt
|
315
|
+
return Family(ret)
|
316
|
+
|
317
|
+
def injectives(self):
|
318
|
+
r"""
|
319
|
+
Return the injectives of ``self``.
|
320
|
+
|
321
|
+
EXAMPLES::
|
322
|
+
|
323
|
+
sage: DE = DiGraph([[7,6], [6,5], [5,3], [4,3], [2,3], [1,2]])
|
324
|
+
sage: AR = DE.auslander_reiten_quiver()
|
325
|
+
sage: AR.injectives()
|
326
|
+
Finite family {1: <1, 9>, 2: <2, 9>, 3: <3, 9>, 4: <4, 9>,
|
327
|
+
5: <5, 9>, 6: <6, 9>, 7: <7, 9>}
|
328
|
+
"""
|
329
|
+
if self._is_finite:
|
330
|
+
self.digraph() # sets self._injective attribute
|
331
|
+
return self._injectives
|
332
|
+
return Family({v: self(v, -1) for v in self._quiver.vertex_iterator()})
|
333
|
+
|
334
|
+
def _digraph_set_latex_options(self, G):
|
335
|
+
"""
|
336
|
+
Set the latex options of the digraph ``G``.
|
337
|
+
|
338
|
+
EXAMPLES::
|
339
|
+
|
340
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
341
|
+
sage: AR = D.auslander_reiten_quiver()
|
342
|
+
sage: G = AR.digraph_preprojectives(2)
|
343
|
+
sage: G = AR._digraph_set_latex_options(G)
|
344
|
+
sage: G.latex_options().get_option('edge_labels')
|
345
|
+
True
|
346
|
+
"""
|
347
|
+
G.set_latex_options(edge_labels=True)
|
348
|
+
|
349
|
+
from sage.graphs.dot2tex_utils import have_dot2tex
|
350
|
+
if have_dot2tex():
|
351
|
+
from sage.misc.latex import LatexExpr
|
352
|
+
|
353
|
+
def edge_options(data):
|
354
|
+
u, v, l = data
|
355
|
+
edge_opts = {}
|
356
|
+
if l == 'ART':
|
357
|
+
edge_opts["color"] = "dashed,blue"
|
358
|
+
edge_opts["label"] = LatexExpr(r"\tau")
|
359
|
+
return edge_opts
|
360
|
+
|
361
|
+
G.set_latex_options(format='dot2tex', edge_options=edge_options)
|
362
|
+
return G
|
363
|
+
|
364
|
+
def digraph_preprojectives(self, max_depth, with_translations=False):
|
365
|
+
r"""
|
366
|
+
Return the digraph of preprojectives of ``self`` up to ``max_depth``.
|
367
|
+
|
368
|
+
EXAMPLES::
|
369
|
+
|
370
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
371
|
+
sage: AR = D.auslander_reiten_quiver()
|
372
|
+
sage: G = AR.digraph_preprojectives(3)
|
373
|
+
sage: [node.dimension_vector() for node in G]
|
374
|
+
[v1 + 2*v2, v2, 3*v1 + 4*v2, 2*v1 + 3*v2, 5*v1 + 6*v2, 4*v1 + 5*v2]
|
375
|
+
sage: AR.digraph_preprojectives(0)
|
376
|
+
Digraph on 0 vertices
|
377
|
+
"""
|
378
|
+
if max_depth < 1:
|
379
|
+
return self._digraph_set_latex_options(DiGraph())
|
380
|
+
|
381
|
+
k = 2
|
382
|
+
prev = dict(self.projectives())
|
383
|
+
verts = list(prev.values())
|
384
|
+
edges = [(prev[v], prev[u], l) for u, v, l in self._quiver.edge_iterator()]
|
385
|
+
cur = self._dim_vecs_level(k)
|
386
|
+
while k <= max_depth:
|
387
|
+
# convert cur to the appropriate data
|
388
|
+
cur = {v: self.element_class(self, v, k) for v in cur}
|
389
|
+
verts.extend(cur.values())
|
390
|
+
edges.extend((cur[v], cur[u], l)
|
391
|
+
for u in cur for _, v, l in self._quiver.outgoing_edge_iterator(u) if v in cur)
|
392
|
+
edges.extend((prev[u], cur[v], l) for v in cur
|
393
|
+
for u, _, l in self._quiver.incoming_edge_iterator(v) if u in prev)
|
394
|
+
if with_translations:
|
395
|
+
edges.extend((cur[v], prev[v], 'ART') for v in cur if v in prev)
|
396
|
+
k += 1
|
397
|
+
prev = cur
|
398
|
+
cur = self._dim_vecs_level(k)
|
399
|
+
|
400
|
+
G = DiGraph([verts, edges], format='vertices_and_edges', multiedges=True, immutable=True)
|
401
|
+
return self._digraph_set_latex_options(G)
|
402
|
+
|
403
|
+
def digraph_postinjectives(self, max_depth, with_translations=False):
|
404
|
+
"""
|
405
|
+
Return the digraph of postinjectives of ``self`` up to ``max_depth``.
|
406
|
+
|
407
|
+
EXAMPLES::
|
408
|
+
|
409
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
410
|
+
sage: AR = D.auslander_reiten_quiver()
|
411
|
+
sage: G = AR.digraph_postinjectives(3)
|
412
|
+
sage: [node.dimension_vector() for node in G]
|
413
|
+
[5*v1 + 4*v2, 6*v1 + 5*v2, 3*v1 + 2*v2, 4*v1 + 3*v2, v1, 2*v1 + v2]
|
414
|
+
sage: AR.digraph_postinjectives(0)
|
415
|
+
Digraph on 0 vertices
|
416
|
+
"""
|
417
|
+
if max_depth < 1:
|
418
|
+
return self._digraph_set_latex_options(DiGraph())
|
419
|
+
|
420
|
+
k = 2
|
421
|
+
prev = dict(self.injectives())
|
422
|
+
verts = list(prev.values())
|
423
|
+
edges = [(prev[u], prev[v], l) for u, v, l in self._quiver.edge_iterator()]
|
424
|
+
cur = self._dim_vecs_level(-k)
|
425
|
+
while k <= max_depth:
|
426
|
+
# convert cur to the appropriate data
|
427
|
+
cur = {v: self.element_class(self, v, -k) for v in cur}
|
428
|
+
verts.extend(cur.values())
|
429
|
+
edges.extend((cur[u], cur[v], l)
|
430
|
+
for u in cur for _, v, l in self._quiver.outgoing_edge_iterator(u) if v in cur)
|
431
|
+
edges.extend((cur[v], prev[u], l) for v in cur
|
432
|
+
for u, _, l in self._quiver.incoming_edge_iterator(v) if u in prev)
|
433
|
+
if with_translations:
|
434
|
+
edges.extend((prev[v], cur[v], 'ART') for v in cur if v in prev)
|
435
|
+
k += 1
|
436
|
+
prev = cur
|
437
|
+
cur = self._dim_vecs_level(-k)
|
438
|
+
|
439
|
+
G = DiGraph([verts, edges], format='vertices_and_edges', multiedges=True, immutable=True)
|
440
|
+
return self._digraph_set_latex_options(G)
|
441
|
+
|
442
|
+
@cached_method
|
443
|
+
def digraph(self, with_translations=False):
|
444
|
+
r"""
|
445
|
+
Return the digraph of ``self``.
|
446
|
+
|
447
|
+
INPUT:
|
448
|
+
|
449
|
+
- ``with_translations`` -- boolean (default: ``False``); if ``True``,
|
450
|
+
then include the arrows corresponding to the translations
|
451
|
+
|
452
|
+
EXAMPLES::
|
453
|
+
|
454
|
+
sage: DA = DiGraph([[1,2]])
|
455
|
+
sage: AR = DA.auslander_reiten_quiver()
|
456
|
+
sage: G = AR.digraph(); G
|
457
|
+
Digraph on 3 vertices
|
458
|
+
sage: G.edges()
|
459
|
+
[(<1, 1>, <2, 2>, None), (<2, 1>, <1, 1>, None)]
|
460
|
+
sage: GT = AR.digraph(with_translations=True)
|
461
|
+
sage: GT.edges()
|
462
|
+
[(<1, 1>, <2, 2>, None), (<2, 1>, <1, 1>, None), (<2, 2>, <2, 1>, 'ART')]
|
463
|
+
"""
|
464
|
+
if not self._is_finite:
|
465
|
+
raise TypeError("the AR quiver is not finite")
|
466
|
+
|
467
|
+
if with_translations:
|
468
|
+
G = self.digraph().copy(immutable=False)
|
469
|
+
for v in G.vertex_iterator():
|
470
|
+
u = v.translation()
|
471
|
+
if u is not None:
|
472
|
+
G.add_edge(v, u, 'ART')
|
473
|
+
G = G.copy(immutable=True)
|
474
|
+
|
475
|
+
else:
|
476
|
+
k = 2
|
477
|
+
prev = dict(self.projectives())
|
478
|
+
injectives = dict(prev) # make a shallow copy since we will mutate it
|
479
|
+
verts = list(prev.values())
|
480
|
+
edges = [(prev[v], prev[u], l) for u, v, l in self._quiver.edge_iterator()]
|
481
|
+
cur = self._dim_vecs_level(k)
|
482
|
+
while cur:
|
483
|
+
# convert cur to the appropriate data
|
484
|
+
cur = {v: self.element_class(self, v, k) for v in cur}
|
485
|
+
injectives.update(cur)
|
486
|
+
verts.extend(cur.values())
|
487
|
+
edges.extend((cur[v], cur[u], l)
|
488
|
+
for u in cur for _, v, l in self._quiver.outgoing_edge_iterator(u) if v in cur)
|
489
|
+
edges.extend((prev[u], cur[v], l) for v in cur
|
490
|
+
for u, _, l in self._quiver.incoming_edge_iterator(v) if u in prev)
|
491
|
+
k += 1
|
492
|
+
prev = cur
|
493
|
+
cur = self._dim_vecs_level(k)
|
494
|
+
|
495
|
+
self._injectives = Family(injectives)
|
496
|
+
G = DiGraph([verts, edges], format='vertices_and_edges', immutable=True)
|
497
|
+
|
498
|
+
return self._digraph_set_latex_options(G)
|
499
|
+
|
500
|
+
def __iter__(self):
|
501
|
+
r"""
|
502
|
+
Iterate over ``self`` when possible.
|
503
|
+
|
504
|
+
EXAMPLES::
|
505
|
+
|
506
|
+
sage: DD = DiGraph([[3,2], [4,2], [2,1]])
|
507
|
+
sage: AR = DD.auslander_reiten_quiver()
|
508
|
+
sage: list(AR)
|
509
|
+
[<1, 1>, <2, 1>, <3, 1>, <4, 1>, <1, 2>, <2, 2>, <3, 2>, <4, 2>,
|
510
|
+
<1, 3>, <2, 3>, <3, 3>, <4, 3>]
|
511
|
+
"""
|
512
|
+
return iter(self.digraph())
|
513
|
+
|
514
|
+
def _element_constructor_(self, vertex, level=None):
|
515
|
+
r"""
|
516
|
+
Construct an element of ``self``.
|
517
|
+
|
518
|
+
EXAMPLES::
|
519
|
+
|
520
|
+
sage: DA = DiGraph([[4,3], [3,2], [2,1]])
|
521
|
+
sage: AR = DA.auslander_reiten_quiver()
|
522
|
+
sage: AR(2, 2)
|
523
|
+
<2, 2>
|
524
|
+
sage: AR((2, 3))
|
525
|
+
<2, 3>
|
526
|
+
sage: AR(2, 4)
|
527
|
+
Traceback (most recent call last):
|
528
|
+
...
|
529
|
+
ValueError: no 2 at level 4
|
530
|
+
sage: AR(2, 1/2)
|
531
|
+
Traceback (most recent call last):
|
532
|
+
...
|
533
|
+
ValueError: the level 1/2 must be an integer
|
534
|
+
sage: AR(10, 1)
|
535
|
+
Traceback (most recent call last):
|
536
|
+
...
|
537
|
+
ValueError: 10 is not a vertex of the quiver
|
538
|
+
"""
|
539
|
+
if level is None:
|
540
|
+
if len(vertex) == 2:
|
541
|
+
vertex, level = vertex
|
542
|
+
if vertex not in self._quiver:
|
543
|
+
raise ValueError(f"{vertex} is not a vertex of the quiver")
|
544
|
+
if level == 1:
|
545
|
+
return self.element_class(self, vertex, level)
|
546
|
+
if level not in ZZ:
|
547
|
+
raise ValueError(f"the level {level} must be an integer")
|
548
|
+
|
549
|
+
if not self._is_finite:
|
550
|
+
if level == -1 or vertex in self._dim_vecs_level(level):
|
551
|
+
return self.element_class(self, vertex, level)
|
552
|
+
# This is likely never true
|
553
|
+
raise ValueError(f"no {vertex} at level {level}")
|
554
|
+
|
555
|
+
# otherwise the AR quiver is finite
|
556
|
+
if level < 0:
|
557
|
+
self.digraph() # computes the max level
|
558
|
+
level = self._max_level - level
|
559
|
+
if level > 1:
|
560
|
+
if vertex in self._dim_vecs_level(level):
|
561
|
+
return self.element_class(self, vertex, level)
|
562
|
+
raise ValueError(f"no {vertex} at level {level}")
|
563
|
+
|
564
|
+
@cached_method
|
565
|
+
def _dim_vecs_level(self, k):
|
566
|
+
r"""
|
567
|
+
Return a ``dict`` of dimension vectors of level ``k``.
|
568
|
+
|
569
|
+
.. WARNING::
|
570
|
+
|
571
|
+
This is only meant to be used internally as the output is
|
572
|
+
mutable but cached. Thus, the output should not be changed.
|
573
|
+
|
574
|
+
EXAMPLES::
|
575
|
+
|
576
|
+
sage: DA = DiGraph([[4,3], [3,2], [2,1]])
|
577
|
+
sage: AR = DA.auslander_reiten_quiver()
|
578
|
+
sage: AR._dim_vecs_level(1)
|
579
|
+
{1: v1, 2: v1 + v2, 3: v1 + v2 + v3, 4: v1 + v2 + v3 + v4}
|
580
|
+
sage: AR._dim_vecs_level(2)
|
581
|
+
{1: v2, 2: v2 + v3, 3: v2 + v3 + v4}
|
582
|
+
sage: AR._dim_vecs_level(3)
|
583
|
+
{1: v3, 2: v3 + v4}
|
584
|
+
sage: AR._dim_vecs_level(4)
|
585
|
+
{1: v4}
|
586
|
+
sage: AR._dim_vecs_level(-1)
|
587
|
+
{1: v1 + v2 + v3 + v4, 2: v2 + v3 + v4, 3: v3 + v4, 4: v4}
|
588
|
+
sage: AR._dim_vecs_level(-2)
|
589
|
+
{2: v1 + v2 + v3, 3: v2 + v3, 4: v3}
|
590
|
+
sage: AR._dim_vecs_level(-3)
|
591
|
+
{3: v1 + v2, 4: v2}
|
592
|
+
sage: AR._dim_vecs_level(-4)
|
593
|
+
{4: v1}
|
594
|
+
"""
|
595
|
+
if k == 0:
|
596
|
+
raise ValueError("k must not be 0")
|
597
|
+
M = self._dim_vec_space
|
598
|
+
Q = self._quiver
|
599
|
+
if k == 1:
|
600
|
+
ret = {v: M._from_dict({u: ZZ(len(Q.all_paths(v, u, use_multiedges=True))) for u in Q.vertex_iterator()})
|
601
|
+
for v in Q.vertex_iterator()}
|
602
|
+
elif k > 1:
|
603
|
+
if k > self._max_level:
|
604
|
+
return {}
|
605
|
+
prev = self._dim_vecs_level(k - 1)
|
606
|
+
if k > self._max_level: # this might get set on the recursive call
|
607
|
+
return {}
|
608
|
+
ret = {}
|
609
|
+
for v in reversed(self._top_sort):
|
610
|
+
if v not in prev: # assumption: this vertex will never reappear
|
611
|
+
continue
|
612
|
+
temp = -prev[v]
|
613
|
+
for u, _, _ in Q.incoming_edge_iterator(v):
|
614
|
+
if u in prev:
|
615
|
+
temp += prev[u]
|
616
|
+
for _, u, _ in Q.outgoing_edge_iterator(v):
|
617
|
+
if u in ret:
|
618
|
+
temp += ret[u]
|
619
|
+
if all(coeff > 0 for key, coeff in temp):
|
620
|
+
ret[v] = temp
|
621
|
+
if not ret:
|
622
|
+
self._max_level = k
|
623
|
+
|
624
|
+
elif k == -1:
|
625
|
+
ret = {v: M._from_dict({u: ZZ(len(Q.all_paths(u, v, use_multiedges=True))) for u in Q.vertex_iterator()})
|
626
|
+
for v in Q.vertex_iterator()}
|
627
|
+
|
628
|
+
elif k < -1:
|
629
|
+
prev = self._dim_vecs_level(k + 1)
|
630
|
+
ret = {}
|
631
|
+
for v in self._top_sort:
|
632
|
+
if v not in prev: # assumption: this vertex will never reappear
|
633
|
+
continue
|
634
|
+
temp = -prev[v]
|
635
|
+
for _, u, _ in Q.outgoing_edge_iterator(v):
|
636
|
+
if u in prev:
|
637
|
+
temp += prev[u]
|
638
|
+
for u, _, _ in Q.incoming_edge_iterator(v):
|
639
|
+
if u in ret:
|
640
|
+
temp += ret[u]
|
641
|
+
if all(coeff > 0 for key, coeff in temp):
|
642
|
+
ret[v] = temp
|
643
|
+
|
644
|
+
return ret
|
645
|
+
|
646
|
+
def dimension_vectors_of_level(self, k):
|
647
|
+
r"""
|
648
|
+
Return a :class:`Family` of dimension vectors of level ``k``.
|
649
|
+
|
650
|
+
EXAMPLES::
|
651
|
+
|
652
|
+
sage: DA = DiGraph([[4,3], [2,3], [2,1]])
|
653
|
+
sage: AR = DA.auslander_reiten_quiver()
|
654
|
+
sage: AR.dimension_vectors_of_level(1)
|
655
|
+
{1: v1, 2: v1 + v2 + v3, 3: v3, 4: v3 + v4}
|
656
|
+
sage: AR.dimension_vectors_of_level(3)
|
657
|
+
{1: v4, 3: v2}
|
658
|
+
sage: AR.dimension_vectors_of_level(10)
|
659
|
+
{}
|
660
|
+
sage: AR.dimension_vectors_of_level(-1)
|
661
|
+
{1: v1 + v2, 2: v2, 3: v2 + v3 + v4, 4: v4}
|
662
|
+
sage: AR.dimension_vectors_of_level(-2)
|
663
|
+
{1: v3 + v4, 2: v1 + v2 + v3 + v4, 3: v1 + v2 + v3, 4: v2 + v3}
|
664
|
+
|
665
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
666
|
+
sage: AR = D.auslander_reiten_quiver()
|
667
|
+
sage: AR.dimension_vectors_of_level(1)
|
668
|
+
{1: v1 + 2*v2, 2: v2}
|
669
|
+
sage: AR.dimension_vectors_of_level(3)
|
670
|
+
{1: 5*v1 + 6*v2, 2: 4*v1 + 5*v2}
|
671
|
+
sage: AR.dimension_vectors_of_level(-1)
|
672
|
+
{1: v1, 2: 2*v1 + v2}
|
673
|
+
sage: AR.dimension_vectors_of_level(-3)
|
674
|
+
{1: 5*v1 + 4*v2, 2: 6*v1 + 5*v2}
|
675
|
+
"""
|
676
|
+
ret = self._dim_vecs_level(k)
|
677
|
+
return dict(ret) # make a (shallow) copy to allow a user to mutate it
|
678
|
+
|
679
|
+
class Element(Element):
|
680
|
+
r"""
|
681
|
+
A node in the AR quiver.
|
682
|
+
"""
|
683
|
+
def __init__(self, parent, vertex, level):
|
684
|
+
r"""
|
685
|
+
Initialize ``self``.
|
686
|
+
|
687
|
+
EXAMPLES::
|
688
|
+
|
689
|
+
sage: DA = DiGraph([[4,3], [3,2], [2,1]])
|
690
|
+
sage: AR = DA.auslander_reiten_quiver()
|
691
|
+
sage: TestSuite(AR(1, 3)).run()
|
692
|
+
|
693
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
694
|
+
sage: AR = D.auslander_reiten_quiver()
|
695
|
+
sage: TestSuite(AR(2, 3)).run()
|
696
|
+
sage: TestSuite(AR(1, -4)).run()
|
697
|
+
"""
|
698
|
+
self._vertex = vertex
|
699
|
+
self._level = ZZ(level)
|
700
|
+
Element.__init__(self, parent)
|
701
|
+
|
702
|
+
def _repr_(self) -> str:
|
703
|
+
r"""
|
704
|
+
Return a string representation of ``self``.
|
705
|
+
|
706
|
+
EXAMPLES::
|
707
|
+
|
708
|
+
sage: DA = DiGraph([[4,3], [3,2], [2,1]])
|
709
|
+
sage: AR = DA.auslander_reiten_quiver()
|
710
|
+
sage: AR(1, 3)
|
711
|
+
<1, 3>
|
712
|
+
"""
|
713
|
+
return f"<{self._vertex}, {self._level}>"
|
714
|
+
|
715
|
+
def _latex_(self) -> str:
|
716
|
+
r"""
|
717
|
+
Return a latex representation of ``self``.
|
718
|
+
|
719
|
+
EXAMPLES::
|
720
|
+
|
721
|
+
sage: DA = DiGraph([[4,3], [3,2], [2,1]])
|
722
|
+
sage: AR = DA.auslander_reiten_quiver()
|
723
|
+
sage: node = AR(2, 2)
|
724
|
+
sage: latex(node)
|
725
|
+
\left\langle 2, 2 \right\rangle
|
726
|
+
sage: AR.options.latex = "dimension_vector"
|
727
|
+
sage: latex(node)
|
728
|
+
v_{2} + v_{3}
|
729
|
+
sage: AR.options.latex = "both"
|
730
|
+
sage: latex(node)
|
731
|
+
\begin{gathered} \left\langle 2, 2 \right\rangle \\ v_{2} + v_{3} \end{gathered}
|
732
|
+
sage: AR.options._reset()
|
733
|
+
"""
|
734
|
+
from sage.misc.latex import latex
|
735
|
+
node = r"\left\langle {}, {} \right\rangle".format(latex(self._vertex), self._level)
|
736
|
+
latex_option = self.parent().options.latex
|
737
|
+
if latex_option == "node":
|
738
|
+
return node
|
739
|
+
dim_vec = latex(self.dimension_vector())
|
740
|
+
if latex_option == "dimension_vector":
|
741
|
+
return dim_vec
|
742
|
+
return r"\begin{{gathered}} {} \\ {} \end{{gathered}}".format(node, dim_vec)
|
743
|
+
|
744
|
+
def _richcmp_(self, other, op) -> bool:
|
745
|
+
r"""
|
746
|
+
Rich comparison of ``self`` to ``other`` by ``op``.
|
747
|
+
|
748
|
+
EXAMPLES::
|
749
|
+
|
750
|
+
sage: DA = DiGraph([[2,3], [2,1]])
|
751
|
+
sage: AR = DA.auslander_reiten_quiver()
|
752
|
+
sage: sorted(AR)
|
753
|
+
[<1, 1>, <2, 1>, <3, 1>, <1, 2>, <2, 2>, <3, 2>]
|
754
|
+
"""
|
755
|
+
return richcmp((self._level, self._vertex), (other._level, other._vertex), op)
|
756
|
+
|
757
|
+
def __hash__(self) -> int:
|
758
|
+
r"""
|
759
|
+
Return the hash of ``self``.
|
760
|
+
|
761
|
+
EXAMPLES::
|
762
|
+
|
763
|
+
sage: DA = DiGraph([[2,3], [2,1]])
|
764
|
+
sage: AR = DA.auslander_reiten_quiver()
|
765
|
+
sage: node = AR(1, 2)
|
766
|
+
sage: hash(node) == hash((2, 1))
|
767
|
+
True
|
768
|
+
"""
|
769
|
+
return hash((self._level, self._vertex))
|
770
|
+
|
771
|
+
def vertex(self):
|
772
|
+
r"""
|
773
|
+
Return the vertex of the quiver corresponding to ``self``.
|
774
|
+
|
775
|
+
EXAMPLES::
|
776
|
+
|
777
|
+
sage: DA = DiGraph([[2,3], [2,1]])
|
778
|
+
sage: AR = DA.auslander_reiten_quiver()
|
779
|
+
sage: node = AR(1, 2)
|
780
|
+
sage: node.vertex()
|
781
|
+
1
|
782
|
+
"""
|
783
|
+
return self._vertex
|
784
|
+
|
785
|
+
def level(self):
|
786
|
+
r"""
|
787
|
+
Return the level of ``self``.
|
788
|
+
|
789
|
+
EXAMPLES::
|
790
|
+
|
791
|
+
sage: DA = DiGraph([[2,3], [2,1]])
|
792
|
+
sage: AR = DA.auslander_reiten_quiver()
|
793
|
+
sage: node = AR(1, 2)
|
794
|
+
sage: node.level()
|
795
|
+
2
|
796
|
+
"""
|
797
|
+
return self._level
|
798
|
+
|
799
|
+
def translation(self):
|
800
|
+
r"""
|
801
|
+
Return the AR translation of ``self``.
|
802
|
+
|
803
|
+
EXAMPLES::
|
804
|
+
|
805
|
+
sage: DA = DiGraph([[4,3], [3,2], [2,1]])
|
806
|
+
sage: AR = DA.auslander_reiten_quiver()
|
807
|
+
sage: node = AR(1, 1)
|
808
|
+
sage: node.translation() is None
|
809
|
+
True
|
810
|
+
sage: node = AR(1, 2)
|
811
|
+
sage: node.translation()
|
812
|
+
<1, 1>
|
813
|
+
"""
|
814
|
+
if self._level == 1:
|
815
|
+
return None
|
816
|
+
dim_vecs = self.parent()._dim_vecs_level(self._level - 1)
|
817
|
+
if self._vertex not in dim_vecs: # this likely never happens
|
818
|
+
return None
|
819
|
+
return type(self)(self.parent(), self._vertex, self._level - 1)
|
820
|
+
|
821
|
+
def inverse_translation(self):
|
822
|
+
r"""
|
823
|
+
Return the inverse AR translation of ``self``.
|
824
|
+
|
825
|
+
EXAMPLES::
|
826
|
+
|
827
|
+
sage: DA = DiGraph([[2,3], [2,1]])
|
828
|
+
sage: AR = DA.auslander_reiten_quiver()
|
829
|
+
sage: node = AR(1, 1)
|
830
|
+
sage: node.inverse_translation()
|
831
|
+
<1, 2>
|
832
|
+
sage: node = AR(1, 2)
|
833
|
+
sage: node.inverse_translation() is None
|
834
|
+
True
|
835
|
+
|
836
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
837
|
+
sage: AR = D.auslander_reiten_quiver()
|
838
|
+
sage: AR(2, -1).inverse_translation() is None
|
839
|
+
True
|
840
|
+
"""
|
841
|
+
if self._level == -1:
|
842
|
+
return None
|
843
|
+
dim_vecs = self.parent()._dim_vecs_level(self._level + 1)
|
844
|
+
if self._vertex not in dim_vecs:
|
845
|
+
return None
|
846
|
+
return type(self)(self.parent(), self._vertex, self._level + 1)
|
847
|
+
|
848
|
+
def dimension_vector(self):
|
849
|
+
r"""
|
850
|
+
Return the dimension vector of ``self``.
|
851
|
+
|
852
|
+
EXAMPLES::
|
853
|
+
|
854
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
855
|
+
sage: AR = D.auslander_reiten_quiver()
|
856
|
+
sage: node = AR(2, -4)
|
857
|
+
sage: node.dimension_vector()
|
858
|
+
8*v1 + 7*v2
|
859
|
+
"""
|
860
|
+
return self.parent()._dim_vecs_level(self._level)[self._vertex]
|
861
|
+
|
862
|
+
|
863
|
+
def detect_dynkin_quiver(quiver):
|
864
|
+
"""
|
865
|
+
Determine if ``quiver`` is a finite type Dynkin quiver.
|
866
|
+
|
867
|
+
EXAMPLES::
|
868
|
+
|
869
|
+
sage: from sage.quivers.ar_quiver import detect_dynkin_quiver
|
870
|
+
sage: D = DiGraph([[1,2], [2,3], [3, 4], [4,0], ['a','b'], ['b','c'], ['c','d'], ['c','e']])
|
871
|
+
sage: detect_dynkin_quiver(D)
|
872
|
+
D5xA5
|
873
|
+
|
874
|
+
sage: D = DiGraph([[1,2,'a'], [1,2,'b']], multiedges=True)
|
875
|
+
sage: detect_dynkin_quiver(D) is None
|
876
|
+
True
|
877
|
+
sage: D = DiGraph([[1, 2], [2, 3], [1, 3]])
|
878
|
+
sage: detect_dynkin_quiver(D) is None
|
879
|
+
True
|
880
|
+
sage: D = DiGraph([[1,2], [1,3], [1,4], [1,5]])
|
881
|
+
sage: detect_dynkin_quiver(D) is None
|
882
|
+
True
|
883
|
+
sage: D = DiGraph([[1,2], [2,3], [2,4], [4,5], [6,4]])
|
884
|
+
sage: detect_dynkin_quiver(D) is None
|
885
|
+
True
|
886
|
+
sage: D = DiGraph([[1,2], [2,3], [3,4], [4,5], [5,6], [6,7], [7,8], [8,9], [0,3]])
|
887
|
+
sage: detect_dynkin_quiver(D) is None
|
888
|
+
True
|
889
|
+
sage: D = DiGraph([[1,2], [2,3], [3,4], [4,5], [5,6], [6,7], [0,4]])
|
890
|
+
sage: detect_dynkin_quiver(D) is None
|
891
|
+
True
|
892
|
+
"""
|
893
|
+
dynkin_type = []
|
894
|
+
for Q in quiver.connected_components_subgraphs():
|
895
|
+
if Q.has_multiple_edges():
|
896
|
+
return None
|
897
|
+
G = Q.to_undirected()
|
898
|
+
if G.is_path():
|
899
|
+
dynkin_type.append(['A', Q.num_verts()])
|
900
|
+
continue
|
901
|
+
degthree = G.vertices(degree=3)
|
902
|
+
if len(degthree) != 1:
|
903
|
+
return None
|
904
|
+
G = G.copy(immutable=False)
|
905
|
+
G.delete_vertex(degthree[0])
|
906
|
+
path_lengths = sorted(G.connected_components_sizes())
|
907
|
+
if len(path_lengths) != 3:
|
908
|
+
return None
|
909
|
+
if path_lengths[:2] == [1, 1]:
|
910
|
+
dynkin_type.append(['D', G.num_verts() + 1])
|
911
|
+
elif path_lengths[:2] == [1, 2] and path_lengths[2] in [2, 3, 4]:
|
912
|
+
dynkin_type.append(['E', G.num_verts() + 1])
|
913
|
+
else:
|
914
|
+
return None
|
915
|
+
if len(dynkin_type) == 1:
|
916
|
+
return CartanType(dynkin_type[0])
|
917
|
+
return CartanType(dynkin_type)
|