passagemath-combinat 10.6.31rc3__cp314-cp314-macosx_13_0_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.
Potentially problematic release.
This version of passagemath-combinat might be problematic. Click here for more details.
- passagemath_combinat-10.6.31rc3.dist-info/METADATA +160 -0
- passagemath_combinat-10.6.31rc3.dist-info/RECORD +399 -0
- passagemath_combinat-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_combinat-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_combinat.dylibs/libgmp.10.dylib +0 -0
- passagemath_combinat.dylibs/libsymmetrica.3.0.0.dylib +0 -0
- sage/algebras/affine_nil_temperley_lieb.py +263 -0
- sage/algebras/all.py +25 -0
- sage/algebras/all__sagemath_combinat.py +35 -0
- sage/algebras/askey_wilson.py +935 -0
- sage/algebras/associated_graded.py +345 -0
- sage/algebras/cellular_basis.py +350 -0
- sage/algebras/cluster_algebra.py +2766 -0
- sage/algebras/down_up_algebra.py +860 -0
- sage/algebras/free_algebra.py +1698 -0
- sage/algebras/free_algebra_element.py +345 -0
- sage/algebras/free_algebra_quotient.py +405 -0
- sage/algebras/free_algebra_quotient_element.py +295 -0
- sage/algebras/free_zinbiel_algebra.py +885 -0
- sage/algebras/hall_algebra.py +783 -0
- sage/algebras/hecke_algebras/all.py +4 -0
- sage/algebras/hecke_algebras/ariki_koike_algebra.py +1796 -0
- sage/algebras/hecke_algebras/ariki_koike_specht_modules.py +475 -0
- sage/algebras/hecke_algebras/cubic_hecke_algebra.py +3520 -0
- sage/algebras/hecke_algebras/cubic_hecke_base_ring.py +1473 -0
- sage/algebras/hecke_algebras/cubic_hecke_matrix_rep.py +1079 -0
- sage/algebras/iwahori_hecke_algebra.py +3095 -0
- sage/algebras/jordan_algebra.py +1773 -0
- sage/algebras/lie_conformal_algebras/abelian_lie_conformal_algebra.py +113 -0
- sage/algebras/lie_conformal_algebras/affine_lie_conformal_algebra.py +156 -0
- sage/algebras/lie_conformal_algebras/all.py +18 -0
- sage/algebras/lie_conformal_algebras/bosonic_ghosts_lie_conformal_algebra.py +134 -0
- sage/algebras/lie_conformal_algebras/examples.py +43 -0
- sage/algebras/lie_conformal_algebras/fermionic_ghosts_lie_conformal_algebra.py +131 -0
- sage/algebras/lie_conformal_algebras/finitely_freely_generated_lca.py +139 -0
- sage/algebras/lie_conformal_algebras/free_bosons_lie_conformal_algebra.py +174 -0
- sage/algebras/lie_conformal_algebras/free_fermions_lie_conformal_algebra.py +167 -0
- sage/algebras/lie_conformal_algebras/freely_generated_lie_conformal_algebra.py +107 -0
- sage/algebras/lie_conformal_algebras/graded_lie_conformal_algebra.py +135 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra.py +353 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_element.py +236 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_basis.py +78 -0
- sage/algebras/lie_conformal_algebras/lie_conformal_algebra_with_structure_coefs.py +328 -0
- sage/algebras/lie_conformal_algebras/n2_lie_conformal_algebra.py +117 -0
- sage/algebras/lie_conformal_algebras/neveu_schwarz_lie_conformal_algebra.py +86 -0
- sage/algebras/lie_conformal_algebras/virasoro_lie_conformal_algebra.py +82 -0
- sage/algebras/lie_conformal_algebras/weyl_lie_conformal_algebra.py +205 -0
- sage/algebras/nil_coxeter_algebra.py +191 -0
- sage/algebras/q_commuting_polynomials.py +673 -0
- sage/algebras/q_system.py +608 -0
- sage/algebras/quantum_clifford.py +959 -0
- sage/algebras/quantum_groups/ace_quantum_onsager.py +693 -0
- sage/algebras/quantum_groups/all.py +9 -0
- sage/algebras/quantum_groups/fock_space.py +2219 -0
- sage/algebras/quantum_groups/q_numbers.py +207 -0
- sage/algebras/quantum_groups/quantum_group_gap.py +2695 -0
- sage/algebras/quantum_groups/representations.py +591 -0
- sage/algebras/quantum_matrix_coordinate_algebra.py +1006 -0
- sage/algebras/quantum_oscillator.py +623 -0
- sage/algebras/quaternion_algebra.py +20 -0
- sage/algebras/quaternion_algebra_element.py +55 -0
- sage/algebras/rational_cherednik_algebra.py +525 -0
- sage/algebras/schur_algebra.py +670 -0
- sage/algebras/shuffle_algebra.py +1011 -0
- sage/algebras/splitting_algebra.py +779 -0
- sage/algebras/tensor_algebra.py +709 -0
- sage/algebras/yangian.py +1082 -0
- sage/algebras/yokonuma_hecke_algebra.py +1018 -0
- sage/all__sagemath_combinat.py +35 -0
- sage/combinat/SJT.py +255 -0
- sage/combinat/affine_permutation.py +2405 -0
- sage/combinat/algebraic_combinatorics.py +55 -0
- sage/combinat/all.py +53 -0
- sage/combinat/all__sagemath_combinat.py +195 -0
- sage/combinat/alternating_sign_matrix.py +2063 -0
- sage/combinat/baxter_permutations.py +346 -0
- sage/combinat/bijectionist.py +3220 -0
- sage/combinat/binary_recurrence_sequences.py +1180 -0
- sage/combinat/blob_algebra.py +685 -0
- sage/combinat/catalog_partitions.py +27 -0
- sage/combinat/chas/all.py +23 -0
- sage/combinat/chas/fsym.py +1180 -0
- sage/combinat/chas/wqsym.py +2601 -0
- sage/combinat/cluster_complex.py +326 -0
- sage/combinat/colored_permutations.py +2039 -0
- sage/combinat/colored_permutations_representations.py +964 -0
- sage/combinat/composition_signed.py +142 -0
- sage/combinat/composition_tableau.py +855 -0
- sage/combinat/constellation.py +1729 -0
- sage/combinat/core.py +751 -0
- sage/combinat/counting.py +12 -0
- sage/combinat/crystals/affine.py +742 -0
- sage/combinat/crystals/affine_factorization.py +518 -0
- sage/combinat/crystals/affinization.py +331 -0
- sage/combinat/crystals/alcove_path.py +2013 -0
- sage/combinat/crystals/all.py +22 -0
- sage/combinat/crystals/bkk_crystals.py +141 -0
- sage/combinat/crystals/catalog.py +115 -0
- sage/combinat/crystals/catalog_elementary_crystals.py +18 -0
- sage/combinat/crystals/catalog_infinity_crystals.py +33 -0
- sage/combinat/crystals/catalog_kirillov_reshetikhin.py +18 -0
- sage/combinat/crystals/crystals.py +257 -0
- sage/combinat/crystals/direct_sum.py +260 -0
- sage/combinat/crystals/elementary_crystals.py +1251 -0
- sage/combinat/crystals/fast_crystals.py +441 -0
- sage/combinat/crystals/fully_commutative_stable_grothendieck.py +1205 -0
- sage/combinat/crystals/generalized_young_walls.py +1076 -0
- sage/combinat/crystals/highest_weight_crystals.py +436 -0
- sage/combinat/crystals/induced_structure.py +695 -0
- sage/combinat/crystals/infinity_crystals.py +730 -0
- sage/combinat/crystals/kac_modules.py +863 -0
- sage/combinat/crystals/kirillov_reshetikhin.py +4196 -0
- sage/combinat/crystals/kyoto_path_model.py +497 -0
- sage/combinat/crystals/letters.cpython-314-darwin.so +0 -0
- sage/combinat/crystals/letters.pxd +79 -0
- sage/combinat/crystals/letters.pyx +3056 -0
- sage/combinat/crystals/littelmann_path.py +1518 -0
- sage/combinat/crystals/monomial_crystals.py +1262 -0
- sage/combinat/crystals/multisegments.py +462 -0
- sage/combinat/crystals/mv_polytopes.py +467 -0
- sage/combinat/crystals/pbw_crystal.py +511 -0
- sage/combinat/crystals/pbw_datum.cpython-314-darwin.so +0 -0
- sage/combinat/crystals/pbw_datum.pxd +4 -0
- sage/combinat/crystals/pbw_datum.pyx +487 -0
- sage/combinat/crystals/polyhedral_realization.py +372 -0
- sage/combinat/crystals/spins.cpython-314-darwin.so +0 -0
- sage/combinat/crystals/spins.pxd +21 -0
- sage/combinat/crystals/spins.pyx +756 -0
- sage/combinat/crystals/star_crystal.py +290 -0
- sage/combinat/crystals/subcrystal.py +464 -0
- sage/combinat/crystals/tensor_product.py +1177 -0
- sage/combinat/crystals/tensor_product_element.cpython-314-darwin.so +0 -0
- sage/combinat/crystals/tensor_product_element.pxd +35 -0
- sage/combinat/crystals/tensor_product_element.pyx +1870 -0
- sage/combinat/crystals/virtual_crystal.py +420 -0
- sage/combinat/cyclic_sieving_phenomenon.py +204 -0
- sage/combinat/debruijn_sequence.cpython-314-darwin.so +0 -0
- sage/combinat/debruijn_sequence.pyx +355 -0
- sage/combinat/decorated_permutation.py +270 -0
- sage/combinat/degree_sequences.cpython-314-darwin.so +0 -0
- sage/combinat/degree_sequences.pyx +588 -0
- sage/combinat/derangements.py +527 -0
- sage/combinat/descent_algebra.py +1008 -0
- sage/combinat/diagram.py +1551 -0
- sage/combinat/diagram_algebras.py +5886 -0
- sage/combinat/dyck_word.py +4349 -0
- sage/combinat/e_one_star.py +1623 -0
- sage/combinat/enumerated_sets.py +123 -0
- sage/combinat/expnums.cpython-314-darwin.so +0 -0
- sage/combinat/expnums.pyx +148 -0
- sage/combinat/fast_vector_partitions.cpython-314-darwin.so +0 -0
- sage/combinat/fast_vector_partitions.pyx +346 -0
- sage/combinat/fqsym.py +1977 -0
- sage/combinat/free_dendriform_algebra.py +954 -0
- sage/combinat/free_prelie_algebra.py +1141 -0
- sage/combinat/fully_commutative_elements.py +1077 -0
- sage/combinat/fully_packed_loop.py +1523 -0
- sage/combinat/gelfand_tsetlin_patterns.py +1409 -0
- sage/combinat/gray_codes.py +311 -0
- sage/combinat/grossman_larson_algebras.py +667 -0
- sage/combinat/growth.py +4352 -0
- sage/combinat/hall_polynomial.py +188 -0
- sage/combinat/hillman_grassl.py +866 -0
- sage/combinat/integer_matrices.py +329 -0
- sage/combinat/integer_vectors_mod_permgroup.py +1238 -0
- sage/combinat/k_tableau.py +4564 -0
- sage/combinat/kazhdan_lusztig.py +215 -0
- sage/combinat/key_polynomial.py +885 -0
- sage/combinat/knutson_tao_puzzles.py +2286 -0
- sage/combinat/lr_tableau.py +311 -0
- sage/combinat/matrices/all.py +24 -0
- sage/combinat/matrices/hadamard_matrix.py +3790 -0
- sage/combinat/matrices/latin.py +2912 -0
- sage/combinat/misc.py +401 -0
- sage/combinat/multiset_partition_into_sets_ordered.py +3541 -0
- sage/combinat/ncsf_qsym/all.py +21 -0
- sage/combinat/ncsf_qsym/combinatorics.py +317 -0
- sage/combinat/ncsf_qsym/generic_basis_code.py +1427 -0
- sage/combinat/ncsf_qsym/ncsf.py +5637 -0
- sage/combinat/ncsf_qsym/qsym.py +4053 -0
- sage/combinat/ncsf_qsym/tutorial.py +447 -0
- sage/combinat/ncsym/all.py +21 -0
- sage/combinat/ncsym/bases.py +855 -0
- sage/combinat/ncsym/dual.py +593 -0
- sage/combinat/ncsym/ncsym.py +2076 -0
- sage/combinat/necklace.py +551 -0
- sage/combinat/non_decreasing_parking_function.py +634 -0
- sage/combinat/nu_dyck_word.py +1474 -0
- sage/combinat/output.py +861 -0
- sage/combinat/parallelogram_polyomino.py +4326 -0
- sage/combinat/parking_functions.py +1602 -0
- sage/combinat/partition_algebra.py +1998 -0
- sage/combinat/partition_kleshchev.py +1982 -0
- sage/combinat/partition_shifting_algebras.py +584 -0
- sage/combinat/partition_tuple.py +3114 -0
- sage/combinat/path_tableaux/all.py +13 -0
- sage/combinat/path_tableaux/catalog.py +29 -0
- sage/combinat/path_tableaux/dyck_path.py +380 -0
- sage/combinat/path_tableaux/frieze.py +476 -0
- sage/combinat/path_tableaux/path_tableau.py +728 -0
- sage/combinat/path_tableaux/semistandard.py +510 -0
- sage/combinat/perfect_matching.py +779 -0
- sage/combinat/plane_partition.py +3300 -0
- sage/combinat/q_bernoulli.cpython-314-darwin.so +0 -0
- sage/combinat/q_bernoulli.pyx +128 -0
- sage/combinat/quickref.py +81 -0
- sage/combinat/recognizable_series.py +2051 -0
- sage/combinat/regular_sequence.py +4316 -0
- sage/combinat/regular_sequence_bounded.py +543 -0
- sage/combinat/restricted_growth.py +81 -0
- sage/combinat/ribbon.py +20 -0
- sage/combinat/ribbon_shaped_tableau.py +489 -0
- sage/combinat/ribbon_tableau.py +1180 -0
- sage/combinat/rigged_configurations/all.py +46 -0
- sage/combinat/rigged_configurations/bij_abstract_class.py +548 -0
- sage/combinat/rigged_configurations/bij_infinity.py +370 -0
- sage/combinat/rigged_configurations/bij_type_A.py +163 -0
- sage/combinat/rigged_configurations/bij_type_A2_dual.py +338 -0
- sage/combinat/rigged_configurations/bij_type_A2_even.py +218 -0
- sage/combinat/rigged_configurations/bij_type_A2_odd.py +199 -0
- sage/combinat/rigged_configurations/bij_type_B.py +900 -0
- sage/combinat/rigged_configurations/bij_type_C.py +267 -0
- sage/combinat/rigged_configurations/bij_type_D.py +771 -0
- sage/combinat/rigged_configurations/bij_type_D_tri.py +392 -0
- sage/combinat/rigged_configurations/bij_type_D_twisted.py +576 -0
- sage/combinat/rigged_configurations/bij_type_E67.py +402 -0
- sage/combinat/rigged_configurations/bijection.py +143 -0
- sage/combinat/rigged_configurations/kleber_tree.py +1475 -0
- sage/combinat/rigged_configurations/kr_tableaux.py +1898 -0
- sage/combinat/rigged_configurations/rc_crystal.py +461 -0
- sage/combinat/rigged_configurations/rc_infinity.py +540 -0
- sage/combinat/rigged_configurations/rigged_configuration_element.py +2403 -0
- sage/combinat/rigged_configurations/rigged_configurations.py +1918 -0
- sage/combinat/rigged_configurations/rigged_partition.cpython-314-darwin.so +0 -0
- sage/combinat/rigged_configurations/rigged_partition.pxd +15 -0
- sage/combinat/rigged_configurations/rigged_partition.pyx +680 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux.py +499 -0
- sage/combinat/rigged_configurations/tensor_product_kr_tableaux_element.py +428 -0
- sage/combinat/rsk.py +3438 -0
- sage/combinat/schubert_polynomial.py +508 -0
- sage/combinat/set_partition.py +3318 -0
- sage/combinat/set_partition_iterator.cpython-314-darwin.so +0 -0
- sage/combinat/set_partition_iterator.pyx +136 -0
- sage/combinat/set_partition_ordered.py +1590 -0
- sage/combinat/sf/abreu_nigro.py +346 -0
- sage/combinat/sf/all.py +52 -0
- sage/combinat/sf/character.py +576 -0
- sage/combinat/sf/classical.py +319 -0
- sage/combinat/sf/dual.py +996 -0
- sage/combinat/sf/elementary.py +549 -0
- sage/combinat/sf/hall_littlewood.py +1028 -0
- sage/combinat/sf/hecke.py +336 -0
- sage/combinat/sf/homogeneous.py +464 -0
- sage/combinat/sf/jack.py +1428 -0
- sage/combinat/sf/k_dual.py +1458 -0
- sage/combinat/sf/kfpoly.py +447 -0
- sage/combinat/sf/llt.py +789 -0
- sage/combinat/sf/macdonald.py +2019 -0
- sage/combinat/sf/monomial.py +525 -0
- sage/combinat/sf/multiplicative.py +113 -0
- sage/combinat/sf/new_kschur.py +1786 -0
- sage/combinat/sf/ns_macdonald.py +964 -0
- sage/combinat/sf/orthogonal.py +246 -0
- sage/combinat/sf/orthotriang.py +355 -0
- sage/combinat/sf/powersum.py +963 -0
- sage/combinat/sf/schur.py +880 -0
- sage/combinat/sf/sf.py +1653 -0
- sage/combinat/sf/sfa.py +7053 -0
- sage/combinat/sf/symplectic.py +253 -0
- sage/combinat/sf/witt.py +721 -0
- sage/combinat/shifted_primed_tableau.py +2735 -0
- sage/combinat/shuffle.py +830 -0
- sage/combinat/sidon_sets.py +146 -0
- sage/combinat/similarity_class_type.py +1721 -0
- sage/combinat/sine_gordon.py +618 -0
- sage/combinat/six_vertex_model.py +784 -0
- sage/combinat/skew_partition.py +2053 -0
- sage/combinat/skew_tableau.py +2989 -0
- sage/combinat/sloane_functions.py +8935 -0
- sage/combinat/specht_module.py +1403 -0
- sage/combinat/species/all.py +48 -0
- sage/combinat/species/characteristic_species.py +321 -0
- sage/combinat/species/composition_species.py +273 -0
- sage/combinat/species/cycle_species.py +284 -0
- sage/combinat/species/empty_species.py +155 -0
- sage/combinat/species/functorial_composition_species.py +148 -0
- sage/combinat/species/generating_series.py +673 -0
- sage/combinat/species/library.py +148 -0
- sage/combinat/species/linear_order_species.py +169 -0
- sage/combinat/species/misc.py +83 -0
- sage/combinat/species/partition_species.py +290 -0
- sage/combinat/species/permutation_species.py +268 -0
- sage/combinat/species/product_species.py +423 -0
- sage/combinat/species/recursive_species.py +476 -0
- sage/combinat/species/set_species.py +192 -0
- sage/combinat/species/species.py +820 -0
- sage/combinat/species/structure.py +539 -0
- sage/combinat/species/subset_species.py +243 -0
- sage/combinat/species/sum_species.py +225 -0
- sage/combinat/subword.py +564 -0
- sage/combinat/subword_complex.py +2122 -0
- sage/combinat/subword_complex_c.cpython-314-darwin.so +0 -0
- sage/combinat/subword_complex_c.pyx +119 -0
- sage/combinat/super_tableau.py +821 -0
- sage/combinat/superpartition.py +1154 -0
- sage/combinat/symmetric_group_algebra.py +3774 -0
- sage/combinat/symmetric_group_representations.py +1830 -0
- sage/combinat/t_sequences.py +877 -0
- sage/combinat/tableau.py +9506 -0
- sage/combinat/tableau_residues.py +860 -0
- sage/combinat/tableau_tuple.py +5353 -0
- sage/combinat/tiling.py +2432 -0
- sage/combinat/triangles_FHM.py +777 -0
- sage/combinat/tutorial.py +1857 -0
- sage/combinat/vector_partition.py +337 -0
- sage/combinat/words/abstract_word.py +1722 -0
- sage/combinat/words/all.py +59 -0
- sage/combinat/words/alphabet.py +268 -0
- sage/combinat/words/finite_word.py +7201 -0
- sage/combinat/words/infinite_word.py +113 -0
- sage/combinat/words/lyndon_word.py +652 -0
- sage/combinat/words/morphic.py +351 -0
- sage/combinat/words/morphism.py +3878 -0
- sage/combinat/words/paths.py +2932 -0
- sage/combinat/words/shuffle_product.py +278 -0
- sage/combinat/words/suffix_trees.py +1873 -0
- sage/combinat/words/word.py +765 -0
- sage/combinat/words/word_char.cpython-314-darwin.so +0 -0
- sage/combinat/words/word_char.pyx +847 -0
- sage/combinat/words/word_datatypes.cpython-314-darwin.so +0 -0
- sage/combinat/words/word_datatypes.pxd +4 -0
- sage/combinat/words/word_datatypes.pyx +1067 -0
- sage/combinat/words/word_generators.py +2026 -0
- sage/combinat/words/word_infinite_datatypes.py +1218 -0
- sage/combinat/words/word_options.py +99 -0
- sage/combinat/words/words.py +2396 -0
- sage/data_structures/all__sagemath_combinat.py +1 -0
- sage/databases/all__sagemath_combinat.py +13 -0
- sage/databases/findstat.py +4897 -0
- sage/databases/oeis.py +2058 -0
- sage/databases/sloane.py +393 -0
- sage/dynamics/all__sagemath_combinat.py +14 -0
- sage/dynamics/cellular_automata/all.py +7 -0
- sage/dynamics/cellular_automata/catalog.py +34 -0
- sage/dynamics/cellular_automata/elementary.py +612 -0
- sage/dynamics/cellular_automata/glca.py +477 -0
- sage/dynamics/cellular_automata/solitons.py +1463 -0
- sage/dynamics/finite_dynamical_system.py +1249 -0
- sage/dynamics/finite_dynamical_system_catalog.py +382 -0
- sage/games/all.py +7 -0
- sage/games/hexad.py +704 -0
- sage/games/quantumino.py +591 -0
- sage/games/sudoku.py +889 -0
- sage/games/sudoku_backtrack.cpython-314-darwin.so +0 -0
- sage/games/sudoku_backtrack.pyx +189 -0
- sage/groups/all__sagemath_combinat.py +1 -0
- sage/groups/indexed_free_group.py +489 -0
- sage/libs/all__sagemath_combinat.py +6 -0
- sage/libs/lrcalc/__init__.py +1 -0
- sage/libs/lrcalc/lrcalc.py +525 -0
- sage/libs/symmetrica/__init__.py +7 -0
- sage/libs/symmetrica/all.py +101 -0
- sage/libs/symmetrica/kostka.pxi +168 -0
- sage/libs/symmetrica/part.pxi +193 -0
- sage/libs/symmetrica/plet.pxi +42 -0
- sage/libs/symmetrica/sab.pxi +196 -0
- sage/libs/symmetrica/sb.pxi +332 -0
- sage/libs/symmetrica/sc.pxi +192 -0
- sage/libs/symmetrica/schur.pxi +956 -0
- sage/libs/symmetrica/symmetrica.cpython-314-darwin.so +0 -0
- sage/libs/symmetrica/symmetrica.pxi +1172 -0
- sage/libs/symmetrica/symmetrica.pyx +39 -0
- sage/monoids/all.py +13 -0
- sage/monoids/automatic_semigroup.py +1054 -0
- sage/monoids/free_abelian_monoid.py +315 -0
- sage/monoids/free_abelian_monoid_element.cpython-314-darwin.so +0 -0
- sage/monoids/free_abelian_monoid_element.pxd +16 -0
- sage/monoids/free_abelian_monoid_element.pyx +397 -0
- sage/monoids/free_monoid.py +335 -0
- sage/monoids/free_monoid_element.py +431 -0
- sage/monoids/hecke_monoid.py +65 -0
- sage/monoids/string_monoid.py +817 -0
- sage/monoids/string_monoid_element.py +547 -0
- sage/monoids/string_ops.py +143 -0
- sage/monoids/trace_monoid.py +972 -0
- sage/rings/all__sagemath_combinat.py +2 -0
- sage/sat/all.py +4 -0
- sage/sat/boolean_polynomials.py +405 -0
- sage/sat/converters/__init__.py +6 -0
- sage/sat/converters/anf2cnf.py +14 -0
- sage/sat/converters/polybori.py +611 -0
- sage/sat/solvers/__init__.py +5 -0
- sage/sat/solvers/cryptominisat.py +287 -0
- sage/sat/solvers/dimacs.py +783 -0
- sage/sat/solvers/picosat.py +228 -0
- sage/sat/solvers/sat_lp.py +156 -0
- sage/sat/solvers/satsolver.cpython-314-darwin.so +0 -0
- sage/sat/solvers/satsolver.pxd +3 -0
- sage/sat/solvers/satsolver.pyx +405 -0
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.modules
|
|
3
|
+
r"""
|
|
4
|
+
Quantum Oscillator Algebras
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Travis Scrimshaw (2023-12): initial version
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
#*****************************************************************************
|
|
12
|
+
# Copyright (C) 2023 Travis Scrimshaw <tcscrims at gmail.com>
|
|
13
|
+
#
|
|
14
|
+
# This program is free software: you can redistribute it and/or modify
|
|
15
|
+
# it under the terms of the GNU General Public License as published by
|
|
16
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
17
|
+
# (at your option) any later version.
|
|
18
|
+
# https://www.gnu.org/licenses/
|
|
19
|
+
#*****************************************************************************
|
|
20
|
+
|
|
21
|
+
from sage.misc.cachefunc import cached_method
|
|
22
|
+
from sage.misc.misc_c import prod
|
|
23
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
24
|
+
from sage.rings.integer_ring import ZZ
|
|
25
|
+
from sage.categories.algebras import Algebras
|
|
26
|
+
from sage.combinat.free_module import CombinatorialFreeModule
|
|
27
|
+
from sage.categories.cartesian_product import cartesian_product
|
|
28
|
+
from sage.sets.family import Family
|
|
29
|
+
from sage.sets.non_negative_integers import NonNegativeIntegers
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class QuantumOscillatorAlgebra(CombinatorialFreeModule):
|
|
33
|
+
r"""
|
|
34
|
+
The quantum oscillator algebra.
|
|
35
|
+
|
|
36
|
+
Let `R` be a commutative algebra and `q \in R` be a unit.
|
|
37
|
+
The *quantum oscillator algebra*, or `q`-oscillator algebra,
|
|
38
|
+
is the unital associative `R`-algebra with generators `a^+`,
|
|
39
|
+
`a^-` and `k^{\pm 1}` satisfying the following relations:
|
|
40
|
+
|
|
41
|
+
.. MATH::
|
|
42
|
+
|
|
43
|
+
k a^{\pm} = q^{\pm 1} a^{\pm} k, \qquad
|
|
44
|
+
a^- a^+ = 1 - q^2 k^2, \qquad
|
|
45
|
+
a^+ a^- = 1 - k^2.
|
|
46
|
+
|
|
47
|
+
INPUT:
|
|
48
|
+
|
|
49
|
+
- ``q`` -- (optional) the parameter `q`
|
|
50
|
+
- ``R`` -- (default: `\QQ(q)`) the base ring that contains ``q``
|
|
51
|
+
|
|
52
|
+
EXAMPLES:
|
|
53
|
+
|
|
54
|
+
We construct the algebra and perform some basic computations::
|
|
55
|
+
|
|
56
|
+
sage: O = algebras.QuantumOscillator()
|
|
57
|
+
sage: ap, am, k, ki = O.algebra_generators()
|
|
58
|
+
sage: q = O.q()
|
|
59
|
+
sage: k^-3 * ap * ki * am^2 * k - q^3 * ap * k^3
|
|
60
|
+
q^5*a-*k^-3 - q^3*a-*k^-1 - q^3*a+*k^3
|
|
61
|
+
|
|
62
|
+
We construct representations of the type `A_1` quantum coordinate ring
|
|
63
|
+
using the quantum oscillator algebra and verify the quantum determinant::
|
|
64
|
+
|
|
65
|
+
sage: pi = matrix([[am, k], [-q*k, ap]]); pi
|
|
66
|
+
[ a- k]
|
|
67
|
+
[-q*k a+]
|
|
68
|
+
sage: pi[0,0] * pi[1,1] - q * pi[0,1] * pi[1,0]
|
|
69
|
+
1
|
|
70
|
+
|
|
71
|
+
Next, we use this to build representations for type `A_2`::
|
|
72
|
+
|
|
73
|
+
sage: def quantum_det(M):
|
|
74
|
+
....: n = M.nrows()
|
|
75
|
+
....: return sum((-q)**sigma.length()
|
|
76
|
+
....: * prod(M[i,sigma[i]-1] for i in range(n))
|
|
77
|
+
....: for sigma in Permutations(n))
|
|
78
|
+
sage: def build_repr(wd, gens):
|
|
79
|
+
....: n = gens[0].nrows()
|
|
80
|
+
....: ret = gens[wd[0]-1]
|
|
81
|
+
....: for ind in wd[1:]:
|
|
82
|
+
....: g = gens[ind-1]
|
|
83
|
+
....: temp = [[None]*n for _ in range(n)]
|
|
84
|
+
....: for i in range(n):
|
|
85
|
+
....: for j in range(n):
|
|
86
|
+
....: temp[i][j] = sum(tensor([ret[i,k], g[k,j]]) for k in range(n))
|
|
87
|
+
....: ret = matrix(temp)
|
|
88
|
+
....: return ret
|
|
89
|
+
sage: pi1 = matrix.block_diagonal(pi, matrix.identity(1)); pi1
|
|
90
|
+
[ a- k| 0]
|
|
91
|
+
[-q*k a+| 0]
|
|
92
|
+
[---------+----]
|
|
93
|
+
[ 0 0| 1]
|
|
94
|
+
sage: pi2 = matrix.block_diagonal(matrix.identity(1), pi); pi2
|
|
95
|
+
[ 1| 0 0]
|
|
96
|
+
[----+---------]
|
|
97
|
+
[ 0| a- k]
|
|
98
|
+
[ 0|-q*k a+]
|
|
99
|
+
sage: quantum_det(pi1) == 1
|
|
100
|
+
True
|
|
101
|
+
sage: quantum_det(pi2) == 1
|
|
102
|
+
True
|
|
103
|
+
sage: pi12 = build_repr([1,2], [pi1, pi2]); pi12
|
|
104
|
+
[ a- # 1 k # a- k # k]
|
|
105
|
+
[-q*k # 1 a+ # a- a+ # k]
|
|
106
|
+
[ 0 -q*1 # k 1 # a+]
|
|
107
|
+
sage: quantum_det(pi12)
|
|
108
|
+
1 # 1
|
|
109
|
+
sage: pi121 = build_repr([1,2,1], [pi1, pi2]); pi121
|
|
110
|
+
[ a- # 1 # a- - q*k # a- # k a- # 1 # k + k # a- # a+ k # k # 1]
|
|
111
|
+
[-q*k # 1 # a- - q*a+ # a- # k -q*k # 1 # k + a+ # a- # a+ a+ # k # 1]
|
|
112
|
+
[ q^2*1 # k # k -q*1 # k # a+ 1 # a+ # 1]
|
|
113
|
+
sage: quantum_det(pi121)
|
|
114
|
+
1 # 1 # 1
|
|
115
|
+
sage: pi212 = build_repr([2,1,2], [pi1, pi2]); pi212
|
|
116
|
+
[ 1 # a- # 1 1 # k # a- 1 # k # k]
|
|
117
|
+
[ -q*a- # k # 1 a- # a+ # a- - q*k # 1 # k a- # a+ # k + k # 1 # a+]
|
|
118
|
+
[ q^2*k # k # 1 -q*k # a+ # a- - q*a+ # 1 # k -q*k # a+ # k + a+ # 1 # a+]
|
|
119
|
+
sage: quantum_det(pi212)
|
|
120
|
+
1 # 1 # 1
|
|
121
|
+
|
|
122
|
+
REFERENCES:
|
|
123
|
+
|
|
124
|
+
- [Kuniba2022]_ Section 3.2
|
|
125
|
+
"""
|
|
126
|
+
@staticmethod
|
|
127
|
+
def __classcall_private__(cls, q=None, R=None):
|
|
128
|
+
r"""
|
|
129
|
+
Standardize input to ensure a unique representation.
|
|
130
|
+
|
|
131
|
+
TESTS::
|
|
132
|
+
|
|
133
|
+
sage: O1 = algebras.QuantumOscillator()
|
|
134
|
+
sage: q = PolynomialRing(ZZ, 'q').fraction_field().gen()
|
|
135
|
+
sage: O2 = algebras.QuantumOscillator(q=q)
|
|
136
|
+
sage: O3 = algebras.QuantumOscillator(q, q.parent())
|
|
137
|
+
sage: O1 is O2 and O2 is O3
|
|
138
|
+
True
|
|
139
|
+
"""
|
|
140
|
+
if q is None:
|
|
141
|
+
q = PolynomialRing(ZZ, 'q').fraction_field().gen()
|
|
142
|
+
if R is None:
|
|
143
|
+
R = q.parent()
|
|
144
|
+
q = R(q)
|
|
145
|
+
|
|
146
|
+
return super().__classcall__(cls, q, R)
|
|
147
|
+
|
|
148
|
+
def __init__(self, q, R):
|
|
149
|
+
r"""
|
|
150
|
+
Initialize ``self``.
|
|
151
|
+
|
|
152
|
+
EXAMPLES::
|
|
153
|
+
|
|
154
|
+
sage: O = algebras.QuantumOscillator()
|
|
155
|
+
sage: TestSuite(O).run()
|
|
156
|
+
"""
|
|
157
|
+
self._q = q
|
|
158
|
+
self._k_poly = PolynomialRing(R, 'k')
|
|
159
|
+
indices = cartesian_product([ZZ, ZZ])
|
|
160
|
+
|
|
161
|
+
cat = Algebras(R).WithBasis()
|
|
162
|
+
CombinatorialFreeModule.__init__(self, R, indices, category=cat)
|
|
163
|
+
self._assign_names(('ap', 'am', 'k', 'ki'))
|
|
164
|
+
|
|
165
|
+
def _repr_(self) -> str:
|
|
166
|
+
r"""
|
|
167
|
+
Return a string representation of ``self``.
|
|
168
|
+
|
|
169
|
+
EXAMPLES::
|
|
170
|
+
|
|
171
|
+
sage: algebras.QuantumOscillator()
|
|
172
|
+
Quantum oscillator algebra with q=q over
|
|
173
|
+
Fraction Field of Univariate Polynomial Ring in q over Integer Ring
|
|
174
|
+
"""
|
|
175
|
+
return "Quantum oscillator algebra with q={} over {}".format(
|
|
176
|
+
self._q, self.base_ring())
|
|
177
|
+
|
|
178
|
+
def _latex_(self):
|
|
179
|
+
r"""
|
|
180
|
+
Return a latex representation of ``self``.
|
|
181
|
+
|
|
182
|
+
EXAMPLES::
|
|
183
|
+
|
|
184
|
+
sage: O = algebras.QuantumOscillator()
|
|
185
|
+
sage: latex(O)
|
|
186
|
+
\operatorname{Osc}_{q}
|
|
187
|
+
"""
|
|
188
|
+
return "\\operatorname{Osc}_{%s}" % self._q
|
|
189
|
+
|
|
190
|
+
def q(self):
|
|
191
|
+
r"""
|
|
192
|
+
Return the `q` of ``self``.
|
|
193
|
+
|
|
194
|
+
EXAMPLES::
|
|
195
|
+
|
|
196
|
+
sage: O = algebras.QuantumOscillator()
|
|
197
|
+
sage: O.q()
|
|
198
|
+
q
|
|
199
|
+
sage: O = algebras.QuantumOscillator(q=QQ(-5))
|
|
200
|
+
sage: O.q()
|
|
201
|
+
-5
|
|
202
|
+
"""
|
|
203
|
+
return self._q
|
|
204
|
+
|
|
205
|
+
@cached_method
|
|
206
|
+
def algebra_generators(self):
|
|
207
|
+
r"""
|
|
208
|
+
Return the algebra generators of ``self``.
|
|
209
|
+
|
|
210
|
+
EXAMPLES::
|
|
211
|
+
|
|
212
|
+
sage: O = algebras.QuantumOscillator()
|
|
213
|
+
sage: O.algebra_generators()
|
|
214
|
+
Finite family {'am': a-, 'ap': a+, 'k': k, 'ki': k^-1}
|
|
215
|
+
"""
|
|
216
|
+
d = {'ap': self.monomial((ZZ.one(), ZZ.zero())),
|
|
217
|
+
'am': self.monomial((-ZZ.one(), ZZ.zero())),
|
|
218
|
+
'k': self.monomial((ZZ.zero(), ZZ.one())),
|
|
219
|
+
'ki': self.monomial((ZZ.zero(), -ZZ.one()))}
|
|
220
|
+
return Family(d)
|
|
221
|
+
|
|
222
|
+
@cached_method
|
|
223
|
+
def gens(self) -> tuple:
|
|
224
|
+
r"""
|
|
225
|
+
Return the generators of ``self``.
|
|
226
|
+
|
|
227
|
+
EXAMPLES::
|
|
228
|
+
|
|
229
|
+
sage: O = algebras.QuantumOscillator()
|
|
230
|
+
sage: O.gens()
|
|
231
|
+
(a+, a-, k, k^-1)
|
|
232
|
+
"""
|
|
233
|
+
return tuple(self.algebra_generators())
|
|
234
|
+
|
|
235
|
+
@cached_method
|
|
236
|
+
def one_basis(self) -> tuple:
|
|
237
|
+
r"""
|
|
238
|
+
Return the index of the basis element of `1`.
|
|
239
|
+
|
|
240
|
+
EXAMPLES::
|
|
241
|
+
|
|
242
|
+
sage: O = algebras.QuantumOscillator()
|
|
243
|
+
sage: O.one_basis()
|
|
244
|
+
(0, 0)
|
|
245
|
+
"""
|
|
246
|
+
return (ZZ.zero(), ZZ.zero())
|
|
247
|
+
|
|
248
|
+
def some_elements(self) -> tuple:
|
|
249
|
+
r"""
|
|
250
|
+
Return some elements of ``self``.
|
|
251
|
+
|
|
252
|
+
EXAMPLES::
|
|
253
|
+
|
|
254
|
+
sage: O = algebras.QuantumOscillator()
|
|
255
|
+
sage: O.some_elements()
|
|
256
|
+
(a+, a-, k, k^-1, 1, a+^3, a-^4, k^2, k^-5, a+*k,
|
|
257
|
+
a-^4*k^-3, 1 + 3*k + 2*a+ + a+*k)
|
|
258
|
+
"""
|
|
259
|
+
ap, am, k, ki = self.gens()
|
|
260
|
+
return (ap, am, k, ki, self.one(),
|
|
261
|
+
ap**3, am**4, k**2, ki**5, ap*k, am**4*ki**3,
|
|
262
|
+
self.an_element())
|
|
263
|
+
|
|
264
|
+
def fock_space_representation(self):
|
|
265
|
+
r"""
|
|
266
|
+
Return the Fock space representation of ``self``.
|
|
267
|
+
|
|
268
|
+
.. SEEALSO::
|
|
269
|
+
|
|
270
|
+
:class:`~sage.algebras.quantum_oscillator.FockSpaceRepresentation`
|
|
271
|
+
|
|
272
|
+
EXAMPLES::
|
|
273
|
+
|
|
274
|
+
sage: O = algebras.QuantumOscillator()
|
|
275
|
+
sage: O.fock_space_representation()
|
|
276
|
+
Fock space representation of Quantum oscillator algebra with q=q
|
|
277
|
+
over Fraction Field of Univariate Polynomial Ring in q over Integer Ring
|
|
278
|
+
"""
|
|
279
|
+
return FockSpaceRepresentation(self)
|
|
280
|
+
|
|
281
|
+
def _repr_term(self, m) -> str:
|
|
282
|
+
r"""
|
|
283
|
+
Return a string representation of the basis element indexed by ``m``.
|
|
284
|
+
|
|
285
|
+
EXAMPLES::
|
|
286
|
+
|
|
287
|
+
sage: O = algebras.QuantumOscillator()
|
|
288
|
+
sage: O._repr_term((1, 3))
|
|
289
|
+
'a+*k^3'
|
|
290
|
+
sage: O._repr_term((-1, 1))
|
|
291
|
+
'a-*k'
|
|
292
|
+
sage: O._repr_term((5, 0))
|
|
293
|
+
'a+^5'
|
|
294
|
+
sage: O._repr_term((-4, -2))
|
|
295
|
+
'a-^4*k^-2'
|
|
296
|
+
sage: O._repr_term((0, -4))
|
|
297
|
+
'k^-4'
|
|
298
|
+
sage: O._repr_term((0, 0))
|
|
299
|
+
'1'
|
|
300
|
+
|
|
301
|
+
sage: O(5)
|
|
302
|
+
5
|
|
303
|
+
"""
|
|
304
|
+
a, k = m
|
|
305
|
+
|
|
306
|
+
astr = ''
|
|
307
|
+
if a == 1:
|
|
308
|
+
astr = 'a+'
|
|
309
|
+
elif a > 1:
|
|
310
|
+
astr = 'a+^{}'.format(a)
|
|
311
|
+
elif a == -1:
|
|
312
|
+
astr = 'a-'
|
|
313
|
+
elif a < -1:
|
|
314
|
+
astr = 'a-^{}'.format(-a)
|
|
315
|
+
|
|
316
|
+
kstr = ''
|
|
317
|
+
if k == 1:
|
|
318
|
+
kstr = 'k'
|
|
319
|
+
elif k != 0:
|
|
320
|
+
kstr = 'k^{}'.format(k)
|
|
321
|
+
|
|
322
|
+
if astr:
|
|
323
|
+
if kstr:
|
|
324
|
+
return astr + '*' + kstr
|
|
325
|
+
return astr
|
|
326
|
+
if kstr:
|
|
327
|
+
return kstr
|
|
328
|
+
return '1'
|
|
329
|
+
|
|
330
|
+
def _latex_term(self, m):
|
|
331
|
+
r"""
|
|
332
|
+
Return a latex representation for the basis element indexed by ``m``.
|
|
333
|
+
|
|
334
|
+
EXAMPLES::
|
|
335
|
+
|
|
336
|
+
sage: O = algebras.QuantumOscillator()
|
|
337
|
+
sage: O._latex_term((1, 3))
|
|
338
|
+
'a^+ k^{3}'
|
|
339
|
+
sage: O._latex_term((-1, 1))
|
|
340
|
+
'a^- k'
|
|
341
|
+
sage: O._latex_term((5, 0))
|
|
342
|
+
'(a^+)^{5}'
|
|
343
|
+
sage: O._latex_term((-4, -2))
|
|
344
|
+
'(a^-)^{4} k^{-2}'
|
|
345
|
+
sage: O._latex_term((0, -4))
|
|
346
|
+
'k^{-4}'
|
|
347
|
+
sage: O._latex_term((0, 0))
|
|
348
|
+
'1'
|
|
349
|
+
|
|
350
|
+
sage: latex(O(5))
|
|
351
|
+
5
|
|
352
|
+
"""
|
|
353
|
+
a, k = m
|
|
354
|
+
|
|
355
|
+
astr = ''
|
|
356
|
+
if a == 1:
|
|
357
|
+
astr = 'a^+'
|
|
358
|
+
elif a > 1:
|
|
359
|
+
astr = '(a^+)^{{{}}}'.format(a)
|
|
360
|
+
elif a == -1:
|
|
361
|
+
astr = 'a^-'
|
|
362
|
+
elif a < -1:
|
|
363
|
+
astr = '(a^-)^{{{}}}'.format(-a)
|
|
364
|
+
|
|
365
|
+
kstr = ''
|
|
366
|
+
if k == 1:
|
|
367
|
+
kstr = 'k'
|
|
368
|
+
elif k != 0:
|
|
369
|
+
kstr = 'k^{{{}}}'.format(k)
|
|
370
|
+
|
|
371
|
+
if astr:
|
|
372
|
+
if kstr:
|
|
373
|
+
return astr + ' ' + kstr
|
|
374
|
+
return astr
|
|
375
|
+
if kstr:
|
|
376
|
+
return kstr
|
|
377
|
+
return '1'
|
|
378
|
+
|
|
379
|
+
@cached_method
|
|
380
|
+
def product_on_basis(self, ml, mr):
|
|
381
|
+
r"""
|
|
382
|
+
Return the product of the basis elements indexed by ``ml`` and ``mr``.
|
|
383
|
+
|
|
384
|
+
EXAMPLES::
|
|
385
|
+
|
|
386
|
+
sage: O = algebras.QuantumOscillator()
|
|
387
|
+
sage: ap, am, k, ki = O.algebra_generators()
|
|
388
|
+
sage: O.product_on_basis((-2, 3), (-4, 5))
|
|
389
|
+
1/q^12*a-^6*k^8
|
|
390
|
+
sage: O.product_on_basis((2, 3), (4, -5))
|
|
391
|
+
q^12*a+^6*k^-2
|
|
392
|
+
sage: O.product_on_basis((2, 3), (0, -3))
|
|
393
|
+
a+^2
|
|
394
|
+
sage: k^5 * ki^10
|
|
395
|
+
k^-5
|
|
396
|
+
sage: k^10 * ki^5
|
|
397
|
+
k^5
|
|
398
|
+
sage: ap^3 * k^5
|
|
399
|
+
a+^3*k^5
|
|
400
|
+
sage: am^3 * k^5
|
|
401
|
+
a-^3*k^5
|
|
402
|
+
sage: k^5 * ap^3
|
|
403
|
+
q^15*a+^3*k^5
|
|
404
|
+
sage: k^5 * am^3
|
|
405
|
+
1/q^15*a-^3*k^5
|
|
406
|
+
sage: ki^5 * ap^3
|
|
407
|
+
1/q^15*a+^3*k^-5
|
|
408
|
+
sage: ki^5 * am^3
|
|
409
|
+
q^15*a-^3*k^-5
|
|
410
|
+
sage: ap * am
|
|
411
|
+
1 - k^2
|
|
412
|
+
sage: am * ap
|
|
413
|
+
1 - q^2*k^2
|
|
414
|
+
|
|
415
|
+
sage: (ap + am + k + ki)^2
|
|
416
|
+
a-^2 + (q+1)*a-*k^-1 + ((q+1)/q)*a-*k + k^-2 + 4 - q^2*k^2
|
|
417
|
+
+ ((q+1)/q)*a+*k^-1 + (q+1)*a+*k + a+^2
|
|
418
|
+
|
|
419
|
+
sage: (ap)^3 * (am)^5
|
|
420
|
+
a-^2 + ((-q^4-q^2-1)/q^8)*a-^2*k^2 + ((q^4+q^2+1)/q^14)*a-^2*k^4 - 1/q^18*a-^2*k^6
|
|
421
|
+
sage: (ap)^5 * (am)^3
|
|
422
|
+
a+^2 + ((-q^4-q^2-1)/q^4)*a+^2*k^2 + ((q^4+q^2+1)/q^6)*a+^2*k^4 - 1/q^6*a+^2*k^6
|
|
423
|
+
sage: (am)^3 * (ap)^5
|
|
424
|
+
a+^2 + (-q^10-q^8-q^6)*a+^2*k^2 + (q^18+q^16+q^14)*a+^2*k^4 - q^24*a+^2*k^6
|
|
425
|
+
sage: (am)^5 * (ap)^3
|
|
426
|
+
a-^2 + (-q^6-q^4-q^2)*a-^2*k^2 + (q^10+q^8+q^6)*a-^2*k^4 - q^12*a-^2*k^6
|
|
427
|
+
"""
|
|
428
|
+
q = self._q
|
|
429
|
+
k = self._k_poly.gen()
|
|
430
|
+
al, kl = ml
|
|
431
|
+
ar, kr = mr
|
|
432
|
+
coeff = q ** (kl * ar)
|
|
433
|
+
if (al <= 0 and ar <= 0) or (al >= 0 and ar >= 0):
|
|
434
|
+
return self.element_class(self, {(al + ar, kl + kr): coeff})
|
|
435
|
+
# now al and ar have different signs
|
|
436
|
+
if al < 0: # a^- * a^+ case
|
|
437
|
+
kp = self._k_poly.prod(1 - q**(2*(ar-i)) * k**2 for i in range(min(-al,ar)))
|
|
438
|
+
else: # a^+ * a^- case
|
|
439
|
+
kp = self._k_poly.prod(1 - q**(2*(ar+i)) * k**2 for i in range(1,min(al,-ar)+1))
|
|
440
|
+
a = al + ar
|
|
441
|
+
return self.element_class(self, {(a, kl+kr+i): c * coeff for i, c in enumerate(kp) if c})
|
|
442
|
+
|
|
443
|
+
class Element(CombinatorialFreeModule.Element):
|
|
444
|
+
def __invert__(self):
|
|
445
|
+
r"""
|
|
446
|
+
Return the inverse if ``self`` is a basis element.
|
|
447
|
+
|
|
448
|
+
EXAMPLES::
|
|
449
|
+
|
|
450
|
+
sage: O = algebras.QuantumOscillator()
|
|
451
|
+
sage: ap, am, k, ki = O.algebra_generators()
|
|
452
|
+
sage: k.inverse()
|
|
453
|
+
k^-1
|
|
454
|
+
sage: ~k^5
|
|
455
|
+
k^-5
|
|
456
|
+
sage: ~ki^2
|
|
457
|
+
k^2
|
|
458
|
+
sage: O.zero().inverse()
|
|
459
|
+
Traceback (most recent call last):
|
|
460
|
+
...
|
|
461
|
+
ZeroDivisionError
|
|
462
|
+
sage: ~ap
|
|
463
|
+
Traceback (most recent call last):
|
|
464
|
+
...
|
|
465
|
+
NotImplementedError: only implemented for monomials in k
|
|
466
|
+
sage: ~(k + ki)
|
|
467
|
+
Traceback (most recent call last):
|
|
468
|
+
...
|
|
469
|
+
NotImplementedError: only implemented for monomials in k
|
|
470
|
+
"""
|
|
471
|
+
if not self:
|
|
472
|
+
raise ZeroDivisionError
|
|
473
|
+
if len(self) != 1 or self.leading_support()[0] != 0:
|
|
474
|
+
raise NotImplementedError("only implemented for monomials in k")
|
|
475
|
+
|
|
476
|
+
((a, k), coeff), = list(self._monomial_coefficients.items())
|
|
477
|
+
O = self.parent()
|
|
478
|
+
return O.element_class(O, {(a, -k): coeff.inverse_of_unit()})
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
class FockSpaceRepresentation(CombinatorialFreeModule):
|
|
482
|
+
r"""
|
|
483
|
+
The unique Fock space representation of the
|
|
484
|
+
:class:`~sage.algebras.quantum_oscillator.QuantumOscillatorAlgebra`.
|
|
485
|
+
"""
|
|
486
|
+
def __init__(self, oscillator_algebra):
|
|
487
|
+
r"""
|
|
488
|
+
Initialize ``self``.
|
|
489
|
+
|
|
490
|
+
EXAMPLES::
|
|
491
|
+
|
|
492
|
+
sage: O = algebras.QuantumOscillator()
|
|
493
|
+
sage: F = O.fock_space_representation()
|
|
494
|
+
sage: TestSuite(F).run()
|
|
495
|
+
"""
|
|
496
|
+
self._O = oscillator_algebra
|
|
497
|
+
ind = NonNegativeIntegers()
|
|
498
|
+
CombinatorialFreeModule.__init__(self, oscillator_algebra.base_ring(), ind, prefix='', bracket=['|', '>'],
|
|
499
|
+
latex_bracket=[r'\lvert', r'\rangle'])
|
|
500
|
+
|
|
501
|
+
def _test_representation(self, **options):
|
|
502
|
+
r"""
|
|
503
|
+
Test that ``self`` is a representation of the quantum
|
|
504
|
+
oscillator algebra.
|
|
505
|
+
|
|
506
|
+
EXAMPLES::
|
|
507
|
+
|
|
508
|
+
sage: O = algebras.QuantumOscillator(q=GF(7)(3))
|
|
509
|
+
sage: F = O.fock_space_representation()
|
|
510
|
+
sage: F._test_representation()
|
|
511
|
+
"""
|
|
512
|
+
tester = self._tester(**options)
|
|
513
|
+
S = self._O.some_elements()
|
|
514
|
+
num_trials = 0
|
|
515
|
+
from itertools import product
|
|
516
|
+
for a, b in product(S, repeat=2):
|
|
517
|
+
for elt in tester.some_elements():
|
|
518
|
+
num_trials += 1
|
|
519
|
+
if num_trials > tester._max_runs:
|
|
520
|
+
return
|
|
521
|
+
tester.assertEqual((a*b)*elt, a*(b*elt))
|
|
522
|
+
|
|
523
|
+
def _repr_(self) -> str:
|
|
524
|
+
r"""
|
|
525
|
+
Return a string representation of ``self``.
|
|
526
|
+
|
|
527
|
+
EXAMPLES::
|
|
528
|
+
|
|
529
|
+
sage: O = algebras.QuantumOscillator(q=GF(5)(2))
|
|
530
|
+
sage: O.fock_space_representation()
|
|
531
|
+
Fock space representation of Quantum oscillator algebra
|
|
532
|
+
with q=2 over Finite Field of size 5
|
|
533
|
+
"""
|
|
534
|
+
return "Fock space representation of {}".format(self._O)
|
|
535
|
+
|
|
536
|
+
def _latex_(self):
|
|
537
|
+
r"""
|
|
538
|
+
Return a latex representation of ``self``.
|
|
539
|
+
|
|
540
|
+
EXAMPLES::
|
|
541
|
+
|
|
542
|
+
sage: O = algebras.QuantumOscillator()
|
|
543
|
+
sage: F = O.fock_space_representation()
|
|
544
|
+
sage: latex(F)
|
|
545
|
+
\mathfrak{F}_{q}
|
|
546
|
+
"""
|
|
547
|
+
return r"\mathfrak{{F}}_{{{}}}".format(self._O._q)
|
|
548
|
+
|
|
549
|
+
def vacuum(self):
|
|
550
|
+
r"""
|
|
551
|
+
Return the vacuum element `|0\rangle` of ``self``.
|
|
552
|
+
|
|
553
|
+
EXAMPLES::
|
|
554
|
+
|
|
555
|
+
sage: O = algebras.QuantumOscillator()
|
|
556
|
+
sage: F = O.fock_space_representation()
|
|
557
|
+
sage: F.vacuum()
|
|
558
|
+
|0>
|
|
559
|
+
"""
|
|
560
|
+
return self.basis()[0]
|
|
561
|
+
|
|
562
|
+
def some_elements(self):
|
|
563
|
+
r"""
|
|
564
|
+
Return some elements of ``self``.
|
|
565
|
+
|
|
566
|
+
EXAMPLES::
|
|
567
|
+
|
|
568
|
+
sage: O = algebras.QuantumOscillator()
|
|
569
|
+
sage: F = O.fock_space_representation()
|
|
570
|
+
sage: F.some_elements()
|
|
571
|
+
(|0>, |1>, |52>, |0> + 2*|1> + 3*|2> + |42>)
|
|
572
|
+
"""
|
|
573
|
+
B = self.basis()
|
|
574
|
+
return (B[0], B[1], B[52], self.an_element())
|
|
575
|
+
|
|
576
|
+
class Element(CombinatorialFreeModule.Element):
|
|
577
|
+
def _acted_upon_(self, scalar, self_on_left=True):
|
|
578
|
+
r"""
|
|
579
|
+
Return the action of ``scalar`` on ``self``.
|
|
580
|
+
|
|
581
|
+
EXAMPLES::
|
|
582
|
+
|
|
583
|
+
sage: O = algebras.QuantumOscillator()
|
|
584
|
+
sage: ap, am, k, ki = O.gens()
|
|
585
|
+
sage: F = O.fock_space_representation()
|
|
586
|
+
sage: B = F.basis()
|
|
587
|
+
sage: [ap * B[i] for i in range(3)]
|
|
588
|
+
[|1>, |2>, |3>]
|
|
589
|
+
sage: [am * B[i] for i in range(3)]
|
|
590
|
+
[0, (-q^2+1)*|0>, (-q^4+1)*|1>]
|
|
591
|
+
sage: [k * B[i] for i in range(3)]
|
|
592
|
+
[|0>, q*|1>, q^2*|2>]
|
|
593
|
+
sage: [ki * B[i] for i in range(3)]
|
|
594
|
+
[|0>, 1/q*|1>, 1/q^2*|2>]
|
|
595
|
+
sage: (am)^3 * B[5]
|
|
596
|
+
(-q^24+q^18+q^16+q^14-q^10-q^8-q^6+1)*|2>
|
|
597
|
+
sage: (7*k^3 + am) * (B[0] + B[1] + B[2])
|
|
598
|
+
(-q^2+8)*|0> + (-q^4+7*q^3+1)*|1> + 7*q^6*|2>
|
|
599
|
+
sage: 5 * (B[2] + B[3])
|
|
600
|
+
5*|2> + 5*|3>
|
|
601
|
+
"""
|
|
602
|
+
# Check for scalars first
|
|
603
|
+
ret = super()._acted_upon_(scalar, self_on_left)
|
|
604
|
+
if ret is not None:
|
|
605
|
+
return ret
|
|
606
|
+
P = self.parent()
|
|
607
|
+
if self_on_left or scalar not in P._O: # needs to be a left Osc-action
|
|
608
|
+
return None
|
|
609
|
+
scalar = P._O(scalar)
|
|
610
|
+
q = P._O._q
|
|
611
|
+
|
|
612
|
+
ret = []
|
|
613
|
+
for om, oc in scalar:
|
|
614
|
+
a, k = om
|
|
615
|
+
for fm, fc in self:
|
|
616
|
+
if fm < -a: # the result will be 0
|
|
617
|
+
continue
|
|
618
|
+
c = q ** (fm*k)
|
|
619
|
+
if a < 0:
|
|
620
|
+
c *= prod(1 - q**(2*(fm-i)) for i in range(-a))
|
|
621
|
+
if c:
|
|
622
|
+
ret.append((fm+a, oc * fc * c))
|
|
623
|
+
return P.sum_of_terms(ret)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.libs.singular sage.modules
|
|
3
|
+
|
|
4
|
+
############################################################
|
|
5
|
+
# Backwards compatible unpickling
|
|
6
|
+
############################################################
|
|
7
|
+
|
|
8
|
+
def unpickle_QuaternionAlgebra_v0(*key):
|
|
9
|
+
"""
|
|
10
|
+
The `0`-th version of pickling for quaternion algebras.
|
|
11
|
+
|
|
12
|
+
EXAMPLES::
|
|
13
|
+
|
|
14
|
+
sage: t = (QQ, -5, -19, ('i', 'j', 'k'))
|
|
15
|
+
sage: import sage.algebras.quaternion_algebra
|
|
16
|
+
sage: sage.algebras.quaternion_algebra.unpickle_QuaternionAlgebra_v0(*t)
|
|
17
|
+
Quaternion Algebra (-5, -19) with base ring Rational Field
|
|
18
|
+
"""
|
|
19
|
+
from .quatalg.quaternion_algebra import QuaternionAlgebra
|
|
20
|
+
return QuaternionAlgebra(*key)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-combinat
|
|
2
|
+
# sage.doctest: needs sage.libs.singular sage.modules
|
|
3
|
+
|
|
4
|
+
#######################################################################
|
|
5
|
+
# Backward compatible unpickle functions
|
|
6
|
+
#######################################################################
|
|
7
|
+
|
|
8
|
+
from .quatalg.quaternion_algebra_element import (QuaternionAlgebraElement_generic,
|
|
9
|
+
QuaternionAlgebraElement_rational_field,
|
|
10
|
+
QuaternionAlgebraElement_number_field)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def unpickle_QuaternionAlgebraElement_generic_v0(*args):
|
|
14
|
+
"""
|
|
15
|
+
EXAMPLES::
|
|
16
|
+
|
|
17
|
+
sage: K.<X> = QQ[]
|
|
18
|
+
sage: Q.<i,j,k> = QuaternionAlgebra(Frac(K), -5,-19); z = 2/3 + i*X - X^2*j + X^3*k
|
|
19
|
+
sage: f, t = z.__reduce__()
|
|
20
|
+
sage: import sage.algebras.quaternion_algebra_element
|
|
21
|
+
sage: sage.algebras.quaternion_algebra_element.unpickle_QuaternionAlgebraElement_generic_v0(*t)
|
|
22
|
+
2/3 + X*i + (-X^2)*j + X^3*k
|
|
23
|
+
sage: sage.algebras.quaternion_algebra_element.unpickle_QuaternionAlgebraElement_generic_v0(*t) == z
|
|
24
|
+
True
|
|
25
|
+
"""
|
|
26
|
+
return QuaternionAlgebraElement_generic(*args)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def unpickle_QuaternionAlgebraElement_rational_field_v0(*args):
|
|
30
|
+
"""
|
|
31
|
+
EXAMPLES::
|
|
32
|
+
|
|
33
|
+
sage: Q.<i,j,k> = QuaternionAlgebra(-5,-19); a = 2/3 + i*5/7 - j*2/5 +19/2
|
|
34
|
+
sage: f, t = a.__reduce__()
|
|
35
|
+
sage: import sage.algebras.quaternion_algebra_element
|
|
36
|
+
sage: sage.algebras.quaternion_algebra_element.unpickle_QuaternionAlgebraElement_rational_field_v0(*t)
|
|
37
|
+
61/6 + 5/7*i - 2/5*j
|
|
38
|
+
"""
|
|
39
|
+
return QuaternionAlgebraElement_rational_field(*args)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def unpickle_QuaternionAlgebraElement_number_field_v0(*args):
|
|
43
|
+
"""
|
|
44
|
+
EXAMPLES::
|
|
45
|
+
|
|
46
|
+
sage: # needs sage.symbolic
|
|
47
|
+
sage: K.<a> = QQ[2^(1/3)]; Q.<i,j,k> = QuaternionAlgebra(K, -3, a); z = i + j
|
|
48
|
+
sage: f, t = z.__reduce__()
|
|
49
|
+
sage: import sage.algebras.quaternion_algebra_element
|
|
50
|
+
sage: sage.algebras.quaternion_algebra_element.unpickle_QuaternionAlgebraElement_number_field_v0(*t)
|
|
51
|
+
i + j
|
|
52
|
+
sage: sage.algebras.quaternion_algebra_element.unpickle_QuaternionAlgebraElement_number_field_v0(*t) == z
|
|
53
|
+
True
|
|
54
|
+
"""
|
|
55
|
+
return QuaternionAlgebraElement_number_field(*args)
|