passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Enumeration of rational points on product projective schemes
|
|
4
|
+
|
|
5
|
+
Naive algorithms for enumerating rational points over `\QQ`, number fields or
|
|
6
|
+
finite fields over general schemes.
|
|
7
|
+
|
|
8
|
+
.. WARNING::
|
|
9
|
+
|
|
10
|
+
Incorrect results and infinite loops may occur if using a wrong function.
|
|
11
|
+
(For instance using an affine function for a product projective scheme
|
|
12
|
+
or a finite field function for a scheme defined over an infinite field.)
|
|
13
|
+
|
|
14
|
+
EXAMPLES:
|
|
15
|
+
|
|
16
|
+
Product Projective, over `\QQ`::
|
|
17
|
+
|
|
18
|
+
sage: PP.<x,y,z> = ProductProjectiveSpaces([1,0], QQ)
|
|
19
|
+
sage: from sage.schemes.product_projective.rational_point import \
|
|
20
|
+
....: enum_product_projective_rational_field
|
|
21
|
+
sage: enum_product_projective_rational_field(PP, 3)
|
|
22
|
+
[(-3 : 1 , 1), (-2 : 1 , 1), (-3/2 : 1 , 1),
|
|
23
|
+
(-1 : 1 , 1), (-2/3 : 1 , 1), (-1/2 : 1 , 1),
|
|
24
|
+
(-1/3 : 1 , 1), (0 : 1 , 1), (1/3 : 1 , 1),
|
|
25
|
+
(1/2 : 1 , 1), (2/3 : 1 , 1), (1 : 0 , 1),
|
|
26
|
+
(1 : 1 , 1), (3/2 : 1 , 1), (2 : 1 , 1),
|
|
27
|
+
(3 : 1 , 1)]
|
|
28
|
+
|
|
29
|
+
Product projective over finite field::
|
|
30
|
+
|
|
31
|
+
sage: P1.<x,y,a,b> = ProductProjectiveSpaces([1, 1], GF(7))
|
|
32
|
+
sage: X = P1.subscheme([2*x + 3*y])
|
|
33
|
+
sage: from sage.schemes.product_projective.rational_point import \
|
|
34
|
+
....: enum_product_projective_finite_field
|
|
35
|
+
sage: enum_product_projective_finite_field(X)
|
|
36
|
+
[(2 : 1 , 0 : 1), (2 : 1 , 1 : 0), (2 : 1 , 1 : 1),
|
|
37
|
+
(2 : 1 , 2 : 1), (2 : 1 , 3 : 1), (2 : 1 , 4 : 1),
|
|
38
|
+
(2 : 1 , 5 : 1), (2 : 1 , 6 : 1)]
|
|
39
|
+
|
|
40
|
+
AUTHORS:
|
|
41
|
+
|
|
42
|
+
- Volker Braun and Ben Hutz (2014): initial version
|
|
43
|
+
|
|
44
|
+
- Raghukul Raman (2018): code cleanup and added support for rational fields
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
# ****************************************************************************
|
|
48
|
+
# Copyright (C) 2014 Volker Braun <vbraun.name@gmail.com>
|
|
49
|
+
# Ben Hutz <bn4941@gmail.com>
|
|
50
|
+
#
|
|
51
|
+
# This program is free software: you can redistribute it and/or modify
|
|
52
|
+
# it under the terms of the GNU General Public License as published by
|
|
53
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
54
|
+
# (at your option) any later version.
|
|
55
|
+
# https://www.gnu.org/licenses/
|
|
56
|
+
# ****************************************************************************
|
|
57
|
+
|
|
58
|
+
from sage.schemes.generic.scheme import Scheme
|
|
59
|
+
from sage.schemes.product_projective.space import ProductProjectiveSpaces_ring
|
|
60
|
+
from sage.misc.lazy_import import lazy_import
|
|
61
|
+
from sage.misc.mrange import xmrange
|
|
62
|
+
from sage.misc.misc_c import prod
|
|
63
|
+
from sage.arith.misc import next_prime, previous_prime, crt
|
|
64
|
+
from sage.rings.integer_ring import ZZ
|
|
65
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF
|
|
66
|
+
from sage.parallel.ncpus import ncpus
|
|
67
|
+
from sage.parallel.use_fork import p_iter_fork
|
|
68
|
+
|
|
69
|
+
lazy_import('sage.matrix.constructor', 'matrix')
|
|
70
|
+
lazy_import('sage.rings.real_mpfr', 'RR')
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def enum_product_projective_rational_field(X, B):
|
|
74
|
+
r"""
|
|
75
|
+
Enumerate projective, rational points on scheme ``X`` of height up to
|
|
76
|
+
bound ``B``.
|
|
77
|
+
|
|
78
|
+
INPUT:
|
|
79
|
+
|
|
80
|
+
- ``X`` -- a scheme or set of abstract rational points of a scheme
|
|
81
|
+
|
|
82
|
+
- ``B`` -- positive integer bound
|
|
83
|
+
|
|
84
|
+
OUTPUT:
|
|
85
|
+
|
|
86
|
+
A list containing the product projective points of ``X`` of height up
|
|
87
|
+
to ``B``, sorted.
|
|
88
|
+
|
|
89
|
+
EXAMPLES::
|
|
90
|
+
|
|
91
|
+
sage: PP.<x0,x1,x2,x3,x4> = ProductProjectiveSpaces([1, 2], QQ)
|
|
92
|
+
sage: from sage.schemes.product_projective.rational_point import \
|
|
93
|
+
....: enum_product_projective_rational_field
|
|
94
|
+
sage: enum_product_projective_rational_field(PP, 1)
|
|
95
|
+
[(-1 : 1 , -1 : -1 : 1), (-1 : 1 , -1 : 0 : 1), (-1 : 1 , -1 : 1 : 0),
|
|
96
|
+
(-1 : 1 , -1 : 1 : 1), (-1 : 1 , 0 : -1 : 1), (-1 : 1 , 0 : 0 : 1),
|
|
97
|
+
(-1 : 1 , 0 : 1 : 0), (-1 : 1 , 0 : 1 : 1), (-1 : 1 , 1 : -1 : 1),
|
|
98
|
+
(-1 : 1 , 1 : 0 : 0), (-1 : 1 , 1 : 0 : 1), (-1 : 1 , 1 : 1 : 0),
|
|
99
|
+
(-1 : 1 , 1 : 1 : 1), (0 : 1 , -1 : -1 : 1), (0 : 1 , -1 : 0 : 1),
|
|
100
|
+
(0 : 1 , -1 : 1 : 0), (0 : 1 , -1 : 1 : 1), (0 : 1 , 0 : -1 : 1),
|
|
101
|
+
(0 : 1 , 0 : 0 : 1), (0 : 1 , 0 : 1 : 0), (0 : 1 , 0 : 1 : 1),
|
|
102
|
+
(0 : 1 , 1 : -1 : 1), (0 : 1 , 1 : 0 : 0), (0 : 1 , 1 : 0 : 1),
|
|
103
|
+
(0 : 1 , 1 : 1 : 0), (0 : 1 , 1 : 1 : 1), (1 : 0 , -1 : -1 : 1),
|
|
104
|
+
(1 : 0 , -1 : 0 : 1), (1 : 0 , -1 : 1 : 0), (1 : 0 , -1 : 1 : 1),
|
|
105
|
+
(1 : 0 , 0 : -1 : 1), (1 : 0 , 0 : 0 : 1), (1 : 0 , 0 : 1 : 0),
|
|
106
|
+
(1 : 0 , 0 : 1 : 1), (1 : 0 , 1 : -1 : 1), (1 : 0 , 1 : 0 : 0),
|
|
107
|
+
(1 : 0 , 1 : 0 : 1), (1 : 0 , 1 : 1 : 0), (1 : 0 , 1 : 1 : 1),
|
|
108
|
+
(1 : 1 , -1 : -1 : 1), (1 : 1 , -1 : 0 : 1), (1 : 1 , -1 : 1 : 0),
|
|
109
|
+
(1 : 1 , -1 : 1 : 1), (1 : 1 , 0 : -1 : 1), (1 : 1 , 0 : 0 : 1),
|
|
110
|
+
(1 : 1 , 0 : 1 : 0), (1 : 1 , 0 : 1 : 1), (1 : 1 , 1 : -1 : 1),
|
|
111
|
+
(1 : 1 , 1 : 0 : 0), (1 : 1 , 1 : 0 : 1), (1 : 1 , 1 : 1 : 0),
|
|
112
|
+
(1 : 1 , 1 : 1 : 1)]
|
|
113
|
+
|
|
114
|
+
::
|
|
115
|
+
|
|
116
|
+
sage: PP.<x,y,z,u,v> = ProductProjectiveSpaces([2, 1], QQ)
|
|
117
|
+
sage: X = PP.subscheme([x^2 + x*y + y*z, u*u - v*u])
|
|
118
|
+
sage: from sage.schemes.product_projective.rational_point import \
|
|
119
|
+
....: enum_product_projective_rational_field
|
|
120
|
+
sage: enum_product_projective_rational_field(X, 4)
|
|
121
|
+
[(-2 : 4 : 1 , 0 : 1), (-2 : 4 : 1 , 1 : 1), (-1 : 1 : 0 , 0 : 1),
|
|
122
|
+
(-1 : 1 : 0 , 1 : 1), (-2/3 : -4/3 : 1 , 0 : 1), (-2/3 : -4/3 : 1 , 1 : 1),
|
|
123
|
+
(-1/2 : -1/2 : 1 , 0 : 1), (-1/2 : -1/2 : 1 , 1 : 1),
|
|
124
|
+
(0 : 0 : 1 , 0 : 1), (0 : 0 : 1 , 1 : 1), (0 : 1 : 0 , 0 : 1),
|
|
125
|
+
(0 : 1 : 0 , 1 : 1), (1 : -1/2 : 1 , 0 : 1), (1 : -1/2 : 1 , 1 : 1)]
|
|
126
|
+
"""
|
|
127
|
+
if isinstance(X, Scheme):
|
|
128
|
+
if not isinstance(X.ambient_space(), ProductProjectiveSpaces_ring):
|
|
129
|
+
raise TypeError("ambient space must be product of projective space over the rational field")
|
|
130
|
+
X = X(X.base_ring())
|
|
131
|
+
else:
|
|
132
|
+
if not isinstance(X.codomain().ambient_space(), ProductProjectiveSpaces_ring):
|
|
133
|
+
raise TypeError("codomain must be product of projective space over the rational field")
|
|
134
|
+
|
|
135
|
+
R = X.codomain().ambient_space()
|
|
136
|
+
m = R.num_components()
|
|
137
|
+
iters = [ R[i].points_of_bounded_height(bound=B) for i in range(m) ]
|
|
138
|
+
dim = [R[i].dimension_relative() + 1 for i in range(m)]
|
|
139
|
+
|
|
140
|
+
dim_prefix = [0, dim[0]] # prefixes dim list
|
|
141
|
+
for i in range(1, len(dim)):
|
|
142
|
+
dim_prefix.append(dim_prefix[i] + dim[i])
|
|
143
|
+
|
|
144
|
+
pts = []
|
|
145
|
+
P = []
|
|
146
|
+
for i in range(m):
|
|
147
|
+
pt = next(iters[i])
|
|
148
|
+
for j in range(dim[i]):
|
|
149
|
+
P.append(pt[j]) # initial value of P
|
|
150
|
+
|
|
151
|
+
try: # add the initial point
|
|
152
|
+
pts.append(X(P))
|
|
153
|
+
except TypeError:
|
|
154
|
+
pass
|
|
155
|
+
|
|
156
|
+
i = 0
|
|
157
|
+
while i < m:
|
|
158
|
+
try:
|
|
159
|
+
pt = next(iters[i])
|
|
160
|
+
for j in range(dim[i]):
|
|
161
|
+
P[dim_prefix[i] + j] = pt[j]
|
|
162
|
+
try:
|
|
163
|
+
pts.append(X(P))
|
|
164
|
+
except TypeError:
|
|
165
|
+
pass
|
|
166
|
+
i = 0
|
|
167
|
+
except StopIteration:
|
|
168
|
+
iters[i] = R[i].points_of_bounded_height(bound=B)
|
|
169
|
+
pt = next(iters[i]) # reset
|
|
170
|
+
for j in range(dim[i]):
|
|
171
|
+
P[dim_prefix[i] + j] = pt[j]
|
|
172
|
+
i += 1
|
|
173
|
+
pts.sort()
|
|
174
|
+
|
|
175
|
+
return pts
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def enum_product_projective_number_field(X, **kwds):
|
|
179
|
+
r"""
|
|
180
|
+
Enumerates product projective points on scheme ``X`` defined over a number field.
|
|
181
|
+
|
|
182
|
+
Simply checks all of the points of absolute height of at most ``B``
|
|
183
|
+
and adds those that are on the scheme to the list.
|
|
184
|
+
|
|
185
|
+
This algorithm computes 2 lists: L containing elements x in `K` such that
|
|
186
|
+
H_k(x) <= B, and a list L' containing elements x in `K` that, due to
|
|
187
|
+
floating point issues,
|
|
188
|
+
may be slightly larger then the bound. This can be controlled
|
|
189
|
+
by lowering the tolerance.
|
|
190
|
+
|
|
191
|
+
ALGORITHM:
|
|
192
|
+
|
|
193
|
+
This is an implementation of the revised algorithm (Algorithm 4) in
|
|
194
|
+
[DK2013]_. Algorithm 5 is used for imaginary quadratic fields.
|
|
195
|
+
|
|
196
|
+
INPUT: keyword arguments:
|
|
197
|
+
|
|
198
|
+
- ``bound`` -- a real number
|
|
199
|
+
|
|
200
|
+
- ``tolerance`` -- a rational number in (0,1] used in Doyle-Krumm
|
|
201
|
+
algorithm-4
|
|
202
|
+
|
|
203
|
+
- ``precision`` -- the precision to use for computing the elements of
|
|
204
|
+
bounded height of number fields
|
|
205
|
+
|
|
206
|
+
OUTPUT:
|
|
207
|
+
|
|
208
|
+
A list containing the product projective points of ``X`` of
|
|
209
|
+
absolute height up to ``B``, sorted.
|
|
210
|
+
|
|
211
|
+
EXAMPLES::
|
|
212
|
+
|
|
213
|
+
sage: # needs sage.rings.number_field
|
|
214
|
+
sage: u = QQ['u'].0
|
|
215
|
+
sage: K = NumberField(u^2 + 2, 'v')
|
|
216
|
+
sage: PP.<x,y,z,w> = ProductProjectiveSpaces([1, 1], K)
|
|
217
|
+
sage: X = PP.subscheme([x^2 + 2*y^2])
|
|
218
|
+
sage: from sage.schemes.product_projective.rational_point import \
|
|
219
|
+
....: enum_product_projective_number_field
|
|
220
|
+
sage: enum_product_projective_number_field(X, bound=1.5)
|
|
221
|
+
[(-v : 1 , -1 : 1), (-v : 1 , -v : 1), (-v : 1 , -1/2*v : 1),
|
|
222
|
+
(-v : 1 , 0 : 1), (-v : 1 , 1/2*v : 1), (-v : 1 , v : 1),
|
|
223
|
+
(-v : 1 , 1 : 0), (-v : 1 , 1 : 1), (v : 1 , -1 : 1),
|
|
224
|
+
(v : 1 , -v : 1), (v : 1 , -1/2*v : 1), (v : 1 , 0 : 1),
|
|
225
|
+
(v : 1 , 1/2*v : 1), (v : 1 , v : 1), (v : 1 , 1 : 0),
|
|
226
|
+
(v : 1 , 1 : 1)]
|
|
227
|
+
"""
|
|
228
|
+
B = kwds.pop('bound')
|
|
229
|
+
tol = kwds.pop('tolerance', 1e-2)
|
|
230
|
+
prec = kwds.pop('precision', 53)
|
|
231
|
+
|
|
232
|
+
if isinstance(X, Scheme):
|
|
233
|
+
if not isinstance(X.ambient_space(), ProductProjectiveSpaces_ring):
|
|
234
|
+
raise TypeError("ambient space must be product of projective space over the rational field")
|
|
235
|
+
X = X(X.base_ring())
|
|
236
|
+
else:
|
|
237
|
+
if not isinstance(X.codomain().ambient_space(), ProductProjectiveSpaces_ring):
|
|
238
|
+
raise TypeError("codomain must be product of projective space over the rational field")
|
|
239
|
+
|
|
240
|
+
R = X.codomain().ambient_space()
|
|
241
|
+
|
|
242
|
+
pts = []
|
|
243
|
+
|
|
244
|
+
for P in R.points_of_bounded_height(bound=B, tolerance=tol, precision=prec):
|
|
245
|
+
try:
|
|
246
|
+
pts.append(X(P))
|
|
247
|
+
except TypeError:
|
|
248
|
+
pass
|
|
249
|
+
pts.sort()
|
|
250
|
+
return pts
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def enum_product_projective_finite_field(X):
|
|
254
|
+
r"""
|
|
255
|
+
Enumerates projective points on scheme ``X`` defined over a finite field.
|
|
256
|
+
|
|
257
|
+
INPUT:
|
|
258
|
+
|
|
259
|
+
- ``X`` -- a scheme defined over a finite field or a set of abstract
|
|
260
|
+
rational points of such a scheme
|
|
261
|
+
|
|
262
|
+
OUTPUT:
|
|
263
|
+
|
|
264
|
+
A list containing the projective points of ``X`` over the finite field,
|
|
265
|
+
sorted.
|
|
266
|
+
|
|
267
|
+
EXAMPLES::
|
|
268
|
+
|
|
269
|
+
sage: PP.<x,y,z,w> = ProductProjectiveSpaces([1, 1], GF(3))
|
|
270
|
+
sage: from sage.schemes.product_projective.rational_point import \
|
|
271
|
+
....: enum_product_projective_finite_field
|
|
272
|
+
sage: enum_product_projective_finite_field(PP)
|
|
273
|
+
[(0 : 1 , 0 : 1), (0 : 1 , 1 : 0), (0 : 1 , 1 : 1),
|
|
274
|
+
(0 : 1 , 2 : 1), (1 : 0 , 0 : 1), (1 : 0 , 1 : 0),
|
|
275
|
+
(1 : 0 , 1 : 1), (1 : 0 , 2 : 1), (1 : 1 , 0 : 1),
|
|
276
|
+
(1 : 1 , 1 : 0), (1 : 1 , 1 : 1), (1 : 1 , 2 : 1),
|
|
277
|
+
(2 : 1 , 0 : 1), (2 : 1 , 1 : 0), (2 : 1 , 1 : 1),
|
|
278
|
+
(2 : 1 , 2 : 1)]
|
|
279
|
+
|
|
280
|
+
::
|
|
281
|
+
|
|
282
|
+
sage: PP.<x0,x1,x2,x3> = ProductProjectiveSpaces([1, 1], GF(17))
|
|
283
|
+
sage: X = PP.subscheme([x0^2 + 2*x1^2])
|
|
284
|
+
sage: from sage.schemes.product_projective.rational_point import \
|
|
285
|
+
....: enum_product_projective_finite_field
|
|
286
|
+
sage: len(enum_product_projective_finite_field(X))
|
|
287
|
+
36
|
|
288
|
+
"""
|
|
289
|
+
if isinstance(X, Scheme):
|
|
290
|
+
if not isinstance(X.ambient_space(), ProductProjectiveSpaces_ring):
|
|
291
|
+
raise TypeError("ambient space must be product of projective space over the rational field")
|
|
292
|
+
X = X(X.base_ring())
|
|
293
|
+
else:
|
|
294
|
+
if not isinstance(X.codomain().ambient_space(), ProductProjectiveSpaces_ring):
|
|
295
|
+
raise TypeError("codomain must be product of projective space over the rational field")
|
|
296
|
+
|
|
297
|
+
R = X.codomain().ambient_space()
|
|
298
|
+
pts = []
|
|
299
|
+
|
|
300
|
+
for P in R.rational_points():
|
|
301
|
+
try:
|
|
302
|
+
pts.append(X(P))
|
|
303
|
+
except TypeError:
|
|
304
|
+
pass
|
|
305
|
+
pts.sort()
|
|
306
|
+
|
|
307
|
+
return pts
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def sieve(X, bound):
|
|
311
|
+
r"""
|
|
312
|
+
Return the list of all rational points on scheme
|
|
313
|
+
``X`` of height up to ``bound``.
|
|
314
|
+
|
|
315
|
+
ALGORITHM:
|
|
316
|
+
|
|
317
|
+
Main idea behind the algorithm is to find points modulo primes
|
|
318
|
+
and then reconstruct them using chinese remainder theorem.
|
|
319
|
+
We compute the points modulo primes parallelly and then lift
|
|
320
|
+
them via chinese remainder theorem in parallel. The LLL reduction
|
|
321
|
+
algorithm is applied to each component of the points, and finally
|
|
322
|
+
the result is merged and converted to a point on the subscheme.
|
|
323
|
+
|
|
324
|
+
For the algorithm to work correctly, sufficient primes need
|
|
325
|
+
to be chosen, these are determined using the bounds dependent
|
|
326
|
+
on the bound given in [Hutz2015]_.
|
|
327
|
+
|
|
328
|
+
INPUT:
|
|
329
|
+
|
|
330
|
+
- ``X`` -- a scheme with ambient space defined over a product of projective spaces
|
|
331
|
+
|
|
332
|
+
- ``bound`` -- positive integer bound
|
|
333
|
+
|
|
334
|
+
OUTPUT:
|
|
335
|
+
|
|
336
|
+
A list containing the rational points of ``X`` of height
|
|
337
|
+
up to ``bound``, sorted
|
|
338
|
+
|
|
339
|
+
EXAMPLES::
|
|
340
|
+
|
|
341
|
+
sage: from sage.schemes.product_projective.rational_point import sieve
|
|
342
|
+
sage: PP.<x,y,z,u,v> = ProductProjectiveSpaces([2, 1], QQ)
|
|
343
|
+
sage: X = PP.subscheme([x^2 + y^2 - x*z, u*u - v*u])
|
|
344
|
+
sage: sieve(X, 2) # needs sage.libs.singular sage.symbolic
|
|
345
|
+
[(0 : 0 : 1 , 0 : 1), (0 : 0 : 1 , 1 : 1), (1/2 : -1/2 : 1 , 0 : 1),
|
|
346
|
+
(1/2 : -1/2 : 1 , 1 : 1), (1/2 : 1/2 : 1 , 0 : 1), (1/2 : 1/2 : 1 , 1 : 1),
|
|
347
|
+
(1 : 0 : 1 , 0 : 1), (1 : 0 : 1 , 1 : 1)]
|
|
348
|
+
"""
|
|
349
|
+
|
|
350
|
+
if bound < 1:
|
|
351
|
+
return []
|
|
352
|
+
|
|
353
|
+
modulo_points = []
|
|
354
|
+
len_modulo_points = []
|
|
355
|
+
primes_list = []
|
|
356
|
+
|
|
357
|
+
P = X.ambient_space()
|
|
358
|
+
N = P.ngens()
|
|
359
|
+
dim_scheme = X.dimension()
|
|
360
|
+
|
|
361
|
+
num_comp = P.num_components()
|
|
362
|
+
comp_dim_relative = [P[i].dimension_relative() + 1 for i in range(num_comp)]
|
|
363
|
+
|
|
364
|
+
dim_prefix = [0, comp_dim_relative[0]] # prefixes dim list
|
|
365
|
+
for i in range(1, len(comp_dim_relative)):
|
|
366
|
+
dim_prefix.append(dim_prefix[i] + comp_dim_relative[i])
|
|
367
|
+
|
|
368
|
+
dim_max = max(P[i].dimension() for i in range(num_comp))
|
|
369
|
+
B = RR(2**(dim_max/4+1)*bound**2*(dim_max+1).sqrt())
|
|
370
|
+
m = []
|
|
371
|
+
|
|
372
|
+
def sufficient_primes(x):
|
|
373
|
+
r"""
|
|
374
|
+
Return a list of primes whose product is > `x`.
|
|
375
|
+
"""
|
|
376
|
+
small_primes = [2,3]
|
|
377
|
+
prod_primes = 6
|
|
378
|
+
|
|
379
|
+
while prod_primes < x:
|
|
380
|
+
p = next_prime(small_primes[-1])
|
|
381
|
+
small_primes.append(p)
|
|
382
|
+
prod_primes *= p
|
|
383
|
+
return small_primes
|
|
384
|
+
|
|
385
|
+
def good_primes(B):
|
|
386
|
+
r"""
|
|
387
|
+
Given the bound, returns the primes whose product is greater than ``B``
|
|
388
|
+
and which would take the least amount of time to run the main sieve algorithm
|
|
389
|
+
|
|
390
|
+
Complexity of finding points modulo primes is assumed to be N^2 * P_max^{N}.
|
|
391
|
+
Complexity of lifting points and the LLL() function is assumed to
|
|
392
|
+
be close to (dim_max^5) * (alpha / P_max)^dim_scheme.
|
|
393
|
+
where alpha is the product of all primes, P_max is the largest prime in
|
|
394
|
+
the list, dim_max is the max dimension of all components, and N is the dimension
|
|
395
|
+
of the ambient space.
|
|
396
|
+
"""
|
|
397
|
+
|
|
398
|
+
M = {} # stores optimal list of primes, corresponding to list size
|
|
399
|
+
small_primes = sufficient_primes(B)
|
|
400
|
+
max_length = len(small_primes)
|
|
401
|
+
M[max_length] = small_primes
|
|
402
|
+
current_count = max_length - 1
|
|
403
|
+
dim = X.ambient_space().dimension()
|
|
404
|
+
|
|
405
|
+
while current_count > 1:
|
|
406
|
+
current_list = [] # stores prime which are bigger than least
|
|
407
|
+
updated_list = []
|
|
408
|
+
best_list = []
|
|
409
|
+
|
|
410
|
+
least = (RR(B)**(1.00/current_count)).floor()
|
|
411
|
+
for i in range(current_count):
|
|
412
|
+
current_list.append(next_prime(least))
|
|
413
|
+
least = current_list[-1]
|
|
414
|
+
# improving list of primes by taking primes less than least
|
|
415
|
+
# this part of algorithm is used to centralize primes around `least`
|
|
416
|
+
prod_prime = prod(current_list)
|
|
417
|
+
least = current_list[0]
|
|
418
|
+
while least != 2 and prod_prime > B and len(updated_list) < current_count:
|
|
419
|
+
best_list = updated_list + current_list[:current_count - len(updated_list)]
|
|
420
|
+
updated_list.append(previous_prime(least))
|
|
421
|
+
least = updated_list[-1]
|
|
422
|
+
|
|
423
|
+
removed_prime = current_list[current_count - len(updated_list)]
|
|
424
|
+
prod_prime = (prod_prime * least) / removed_prime
|
|
425
|
+
|
|
426
|
+
M[current_count] = sorted(best_list)
|
|
427
|
+
current_count = current_count - 1
|
|
428
|
+
|
|
429
|
+
best_size = 2
|
|
430
|
+
best_time = (dim**2)*M[2][-1]**(dim) + (dim_max**5 * (prod(M[2])/M[2][-1])**dim_scheme)
|
|
431
|
+
for i in range(2, max_length + 1):
|
|
432
|
+
current_time = (dim**2)*M[i][-1]**(dim) + (dim_max**5 * (prod(M[i])/M[i][-1])**dim_scheme)
|
|
433
|
+
if current_time < best_time:
|
|
434
|
+
best_size = i
|
|
435
|
+
best_time = current_time
|
|
436
|
+
|
|
437
|
+
return M[best_size]
|
|
438
|
+
|
|
439
|
+
def parallel_function(X, p):
|
|
440
|
+
r"""
|
|
441
|
+
Function used in parallel computation, computes a list of
|
|
442
|
+
all rational points in modulo p.
|
|
443
|
+
"""
|
|
444
|
+
Xp = X.change_ring(GF(p))
|
|
445
|
+
L = Xp.rational_points()
|
|
446
|
+
|
|
447
|
+
return [list(_) for _ in L]
|
|
448
|
+
|
|
449
|
+
def points_modulo_primes(X, primes):
|
|
450
|
+
r"""
|
|
451
|
+
Return a list of rational points modulo all `p` in primes,
|
|
452
|
+
computed parallelly.
|
|
453
|
+
"""
|
|
454
|
+
normalized_input = []
|
|
455
|
+
for p in primes_list:
|
|
456
|
+
normalized_input.append(((X, p, ), {}))
|
|
457
|
+
p_iter = p_iter_fork(ncpus())
|
|
458
|
+
|
|
459
|
+
points_pair = list(p_iter(parallel_function, normalized_input))
|
|
460
|
+
points_pair.sort()
|
|
461
|
+
modulo_points = []
|
|
462
|
+
for pair in points_pair:
|
|
463
|
+
modulo_points.append(pair[1])
|
|
464
|
+
|
|
465
|
+
return modulo_points
|
|
466
|
+
|
|
467
|
+
def parallel_function_combination(point_p_max):
|
|
468
|
+
r"""
|
|
469
|
+
Function used in parallel computation, computes rational
|
|
470
|
+
points lifted.
|
|
471
|
+
"""
|
|
472
|
+
rat_points = set()
|
|
473
|
+
for tupl in xmrange(len_modulo_points):
|
|
474
|
+
point = []
|
|
475
|
+
for k in range(N):
|
|
476
|
+
# lift all coordinates of given point using chinese remainder theorem
|
|
477
|
+
L = [modulo_points[j][tupl[j]][k].lift() for j in range(len_primes - 1)]
|
|
478
|
+
L.append(point_p_max[k].lift())
|
|
479
|
+
point.append(crt(L, primes_list))
|
|
480
|
+
|
|
481
|
+
for i in range(num_comp):
|
|
482
|
+
for j in range(comp_dim_relative[i]):
|
|
483
|
+
m[i][j] = point[dim_prefix[i] + j]
|
|
484
|
+
|
|
485
|
+
# generating matrix to compute LLL reduction for each component
|
|
486
|
+
M = [matrix(ZZ, comp_dim_relative[i] + 1,
|
|
487
|
+
comp_dim_relative[i], m[i])
|
|
488
|
+
for i in range(num_comp)]
|
|
489
|
+
A = [M[i].LLL() for i in range(num_comp)]
|
|
490
|
+
point = []
|
|
491
|
+
for i in range(num_comp):
|
|
492
|
+
point.extend(A[i][1])
|
|
493
|
+
|
|
494
|
+
# check if all coordinates of this point satisfy height bound
|
|
495
|
+
bound_satisfied = True
|
|
496
|
+
for coordinate in point:
|
|
497
|
+
if coordinate.abs() > bound:
|
|
498
|
+
bound_satisfied = False
|
|
499
|
+
break
|
|
500
|
+
if not bound_satisfied:
|
|
501
|
+
continue
|
|
502
|
+
|
|
503
|
+
try:
|
|
504
|
+
# checks if this point lies on X or not
|
|
505
|
+
rat_points.add(X(point))
|
|
506
|
+
except (TypeError, ValueError):
|
|
507
|
+
pass
|
|
508
|
+
|
|
509
|
+
return [list(pt) for pt in rat_points]
|
|
510
|
+
|
|
511
|
+
def lift_all_points():
|
|
512
|
+
r"""
|
|
513
|
+
Return list of all rational points lifted parallelly.
|
|
514
|
+
"""
|
|
515
|
+
normalized_input = []
|
|
516
|
+
points = modulo_points.pop() # remove the list of points corresponding to largest prime
|
|
517
|
+
len_modulo_points.pop()
|
|
518
|
+
|
|
519
|
+
for point in points:
|
|
520
|
+
normalized_input.append(( (point, ), {}))
|
|
521
|
+
p_iter = p_iter_fork(ncpus())
|
|
522
|
+
points_satisfying = list(p_iter(parallel_function_combination, normalized_input))
|
|
523
|
+
|
|
524
|
+
lifted_points = set()
|
|
525
|
+
for pair in points_satisfying:
|
|
526
|
+
L = pair[1]
|
|
527
|
+
for point in L:
|
|
528
|
+
lifted_points.add(X(tuple(point)))
|
|
529
|
+
|
|
530
|
+
return list(lifted_points)
|
|
531
|
+
|
|
532
|
+
primes_list = good_primes(B.ceil())
|
|
533
|
+
modulo_points = points_modulo_primes(X, primes_list)
|
|
534
|
+
len_modulo_points = [len(_) for _ in modulo_points]
|
|
535
|
+
len_primes = len(primes_list)
|
|
536
|
+
prod_primes = prod(primes_list)
|
|
537
|
+
|
|
538
|
+
# construct m for each component projective space
|
|
539
|
+
for i in range(num_comp):
|
|
540
|
+
dim = comp_dim_relative[i]
|
|
541
|
+
temp = [0 for _ in range(dim)]
|
|
542
|
+
for j in range(dim):
|
|
543
|
+
w = [0 for _ in range(dim)]
|
|
544
|
+
w[j] = prod_primes
|
|
545
|
+
temp.extend(w)
|
|
546
|
+
m.append(temp)
|
|
547
|
+
|
|
548
|
+
rat_points = lift_all_points()
|
|
549
|
+
|
|
550
|
+
return sorted(rat_points)
|