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,569 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Enumeration of rational points on projective schemes
|
|
4
|
+
|
|
5
|
+
Naive algorithms for enumerating rational points over `\QQ` or finite fields
|
|
6
|
+
over for 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 projective scheme or a finite
|
|
12
|
+
field function for a scheme defined over an infinite field.)
|
|
13
|
+
|
|
14
|
+
EXAMPLES:
|
|
15
|
+
|
|
16
|
+
Projective, over `\QQ`::
|
|
17
|
+
|
|
18
|
+
sage: from sage.schemes.projective.projective_rational_point import enum_projective_rational_field
|
|
19
|
+
sage: P.<X,Y,Z> = ProjectiveSpace(2, QQ)
|
|
20
|
+
sage: C = P.subscheme([X + Y - Z])
|
|
21
|
+
sage: enum_projective_rational_field(C, 3)
|
|
22
|
+
[(-2 : 3 : 1), (-1 : 1 : 0), (-1 : 2 : 1), (-1/2 : 3/2 : 1),
|
|
23
|
+
(0 : 1 : 1), (1/3 : 2/3 : 1), (1/2 : 1/2 : 1), (2/3 : 1/3 : 1),
|
|
24
|
+
(1 : 0 : 1), (3/2 : -1/2 : 1), (2 : -1 : 1), (3 : -2 : 1)]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
Projective over a finite field::
|
|
28
|
+
|
|
29
|
+
sage: # needs database_cremona_mini_ellcurve sage.schemes
|
|
30
|
+
sage: from sage.schemes.projective.projective_rational_point import enum_projective_finite_field
|
|
31
|
+
sage: E = EllipticCurve('72').change_ring(GF(19))
|
|
32
|
+
sage: enum_projective_finite_field(E)
|
|
33
|
+
[(0 : 1 : 0), (1 : 0 : 1), (3 : 0 : 1), (4 : 9 : 1), (4 : 10 : 1),
|
|
34
|
+
(6 : 6 : 1), (6 : 13 : 1), (7 : 6 : 1), (7 : 13 : 1), (9 : 4 : 1),
|
|
35
|
+
(9 : 15 : 1), (12 : 8 : 1), (12 : 11 : 1), (13 : 8 : 1), (13 : 11 : 1),
|
|
36
|
+
(14 : 3 : 1), (14 : 16 : 1), (15 : 0 : 1), (16 : 9 : 1), (16 : 10 : 1),
|
|
37
|
+
(17 : 7 : 1), (17 : 12 : 1), (18 : 9 : 1), (18 : 10 : 1)]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
AUTHORS:
|
|
41
|
+
|
|
42
|
+
- David R. Kohel <kohel@maths.usyd.edu.au>: original version.
|
|
43
|
+
|
|
44
|
+
- John Cremona and Charlie Turner <charlotteturner@gmail.com> (06-2010):
|
|
45
|
+
improvements to clarity and documentation.
|
|
46
|
+
|
|
47
|
+
- Raghukul Raman <raghukul.raman01@gmail.com> (2018): Added sieve algorithm
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
# ****************************************************************************
|
|
51
|
+
# Copyright (C) 2010 William Stein, David Kohel, John Cremona, Charlie Turner
|
|
52
|
+
#
|
|
53
|
+
# This program is free software: you can redistribute it and/or modify
|
|
54
|
+
# it under the terms of the GNU General Public License as published by
|
|
55
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
56
|
+
# (at your option) any later version.
|
|
57
|
+
# https://www.gnu.org/licenses/
|
|
58
|
+
# ****************************************************************************
|
|
59
|
+
|
|
60
|
+
from itertools import product
|
|
61
|
+
|
|
62
|
+
from sage.arith.misc import gcd, next_prime, previous_prime, crt
|
|
63
|
+
from sage.arith.srange import srange
|
|
64
|
+
from sage.misc.lazy_import import lazy_import
|
|
65
|
+
from sage.misc.misc_c import prod
|
|
66
|
+
from sage.misc.mrange import xmrange
|
|
67
|
+
from sage.schemes.generic.scheme import Scheme
|
|
68
|
+
from sage.parallel.ncpus import ncpus
|
|
69
|
+
from sage.parallel.use_fork import p_iter_fork
|
|
70
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField as GF
|
|
71
|
+
from sage.rings.integer_ring import ZZ
|
|
72
|
+
|
|
73
|
+
lazy_import('sage.matrix.constructor', 'matrix')
|
|
74
|
+
lazy_import('sage.rings.real_mpfr', 'RR')
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def enum_projective_rational_field(X, B):
|
|
78
|
+
r"""
|
|
79
|
+
Enumerate projective, rational points on scheme ``X`` of height up to
|
|
80
|
+
bound ``B``.
|
|
81
|
+
|
|
82
|
+
INPUT:
|
|
83
|
+
|
|
84
|
+
- ``X`` -- a scheme or set of abstract rational points of a scheme
|
|
85
|
+
|
|
86
|
+
- ``B`` -- a positive integer bound
|
|
87
|
+
|
|
88
|
+
OUTPUT:
|
|
89
|
+
|
|
90
|
+
A list containing the projective points of ``X`` of height up to ``B``,
|
|
91
|
+
sorted.
|
|
92
|
+
|
|
93
|
+
EXAMPLES::
|
|
94
|
+
|
|
95
|
+
sage: P.<X,Y,Z> = ProjectiveSpace(2, QQ)
|
|
96
|
+
sage: C = P.subscheme([X + Y - Z])
|
|
97
|
+
sage: from sage.schemes.projective.projective_rational_point import enum_projective_rational_field
|
|
98
|
+
sage: enum_projective_rational_field(C(QQ), 6)
|
|
99
|
+
[(-5 : 6 : 1), (-4 : 5 : 1), (-3 : 4 : 1), (-2 : 3 : 1),
|
|
100
|
+
(-3/2 : 5/2 : 1), (-1 : 1 : 0), (-1 : 2 : 1), (-2/3 : 5/3 : 1),
|
|
101
|
+
(-1/2 : 3/2 : 1), (-1/3 : 4/3 : 1), (-1/4 : 5/4 : 1),
|
|
102
|
+
(-1/5 : 6/5 : 1), (0 : 1 : 1), (1/6 : 5/6 : 1), (1/5 : 4/5 : 1),
|
|
103
|
+
(1/4 : 3/4 : 1), (1/3 : 2/3 : 1), (2/5 : 3/5 : 1), (1/2 : 1/2 : 1),
|
|
104
|
+
(3/5 : 2/5 : 1), (2/3 : 1/3 : 1), (3/4 : 1/4 : 1), (4/5 : 1/5 : 1),
|
|
105
|
+
(5/6 : 1/6 : 1), (1 : 0 : 1), (6/5 : -1/5 : 1), (5/4 : -1/4 : 1),
|
|
106
|
+
(4/3 : -1/3 : 1), (3/2 : -1/2 : 1), (5/3 : -2/3 : 1), (2 : -1 : 1),
|
|
107
|
+
(5/2 : -3/2 : 1), (3 : -2 : 1), (4 : -3 : 1), (5 : -4 : 1),
|
|
108
|
+
(6 : -5 : 1)]
|
|
109
|
+
sage: enum_projective_rational_field(C,6) == enum_projective_rational_field(C(QQ),6)
|
|
110
|
+
True
|
|
111
|
+
|
|
112
|
+
::
|
|
113
|
+
|
|
114
|
+
sage: P3.<W,X,Y,Z> = ProjectiveSpace(3, QQ)
|
|
115
|
+
sage: enum_projective_rational_field(P3, 1)
|
|
116
|
+
[(-1 : -1 : -1 : 1), (-1 : -1 : 0 : 1), (-1 : -1 : 1 : 0), (-1 : -1 : 1 : 1),
|
|
117
|
+
(-1 : 0 : -1 : 1), (-1 : 0 : 0 : 1), (-1 : 0 : 1 : 0), (-1 : 0 : 1 : 1),
|
|
118
|
+
(-1 : 1 : -1 : 1), (-1 : 1 : 0 : 0), (-1 : 1 : 0 : 1), (-1 : 1 : 1 : 0),
|
|
119
|
+
(-1 : 1 : 1 : 1), (0 : -1 : -1 : 1), (0 : -1 : 0 : 1), (0 : -1 : 1 : 0),
|
|
120
|
+
(0 : -1 : 1 : 1), (0 : 0 : -1 : 1), (0 : 0 : 0 : 1), (0 : 0 : 1 : 0),
|
|
121
|
+
(0 : 0 : 1 : 1), (0 : 1 : -1 : 1), (0 : 1 : 0 : 0), (0 : 1 : 0 : 1),
|
|
122
|
+
(0 : 1 : 1 : 0), (0 : 1 : 1 : 1), (1 : -1 : -1 : 1), (1 : -1 : 0 : 1),
|
|
123
|
+
(1 : -1 : 1 : 0), (1 : -1 : 1 : 1), (1 : 0 : -1 : 1), (1 : 0 : 0 : 0),
|
|
124
|
+
(1 : 0 : 0 : 1), (1 : 0 : 1 : 0), (1 : 0 : 1 : 1), (1 : 1 : -1 : 1),
|
|
125
|
+
(1 : 1 : 0 : 0), (1 : 1 : 0 : 1), (1 : 1 : 1 : 0), (1 : 1 : 1 : 1)]
|
|
126
|
+
|
|
127
|
+
ALGORITHM:
|
|
128
|
+
|
|
129
|
+
We just check all possible projective points in correct dimension
|
|
130
|
+
of projective space to see if they lie on ``X``.
|
|
131
|
+
|
|
132
|
+
AUTHORS:
|
|
133
|
+
|
|
134
|
+
- John Cremona and Charlie Turner (06-2010)
|
|
135
|
+
"""
|
|
136
|
+
from sage.schemes.projective.projective_space import ProjectiveSpace_ring
|
|
137
|
+
if isinstance(X, Scheme):
|
|
138
|
+
if not isinstance(X.ambient_space(), ProjectiveSpace_ring):
|
|
139
|
+
raise TypeError("ambient space must be projective space over the rational field")
|
|
140
|
+
X = X(X.base_ring())
|
|
141
|
+
elif not isinstance(X.codomain().ambient_space(), ProjectiveSpace_ring):
|
|
142
|
+
raise TypeError("codomain must be projective space over the rational field")
|
|
143
|
+
|
|
144
|
+
n = X.codomain().ambient_space().ngens()
|
|
145
|
+
zero = (0,) * n
|
|
146
|
+
pts = []
|
|
147
|
+
for c in product(*[srange(-B, B + 1) for _ in range(n)]):
|
|
148
|
+
if gcd(c) == 1 and c > zero:
|
|
149
|
+
try:
|
|
150
|
+
pts.append(X(c))
|
|
151
|
+
except TypeError:
|
|
152
|
+
pass
|
|
153
|
+
pts.sort()
|
|
154
|
+
return pts
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def enum_projective_number_field(X, **kwds):
|
|
158
|
+
"""
|
|
159
|
+
Enumerates projective points on scheme ``X`` defined over a number field.
|
|
160
|
+
|
|
161
|
+
Simply checks all of the points of absolute height of at most ``B``
|
|
162
|
+
and adds those that are on the scheme to the list.
|
|
163
|
+
|
|
164
|
+
This algorithm computes 2 lists: L containing elements x in `K` such that
|
|
165
|
+
H_k(x) <= B, and a list L' containing elements x in `K` that, due to
|
|
166
|
+
floating point issues,
|
|
167
|
+
may be slightly larger then the bound. This can be controlled
|
|
168
|
+
by lowering the tolerance.
|
|
169
|
+
|
|
170
|
+
ALGORITHM:
|
|
171
|
+
|
|
172
|
+
This is an implementation of the revised algorithm (Algorithm 4) in
|
|
173
|
+
[DK2013]_. Algorithm 5 is used for imaginary quadratic fields.
|
|
174
|
+
|
|
175
|
+
INPUT: keyword arguments:
|
|
176
|
+
|
|
177
|
+
- ``bound`` -- a real number
|
|
178
|
+
|
|
179
|
+
- ``tolerance`` -- a rational number in (0,1] used in Doyle-Krumm
|
|
180
|
+
algorithm-4
|
|
181
|
+
|
|
182
|
+
- ``precision`` -- the precision to use for computing the elements of
|
|
183
|
+
bounded height of number fields
|
|
184
|
+
|
|
185
|
+
OUTPUT: a sorted list containing the projective points of ``X`` of absolute
|
|
186
|
+
height up to ``B``
|
|
187
|
+
|
|
188
|
+
EXAMPLES::
|
|
189
|
+
|
|
190
|
+
sage: # needs sage.rings.number_field
|
|
191
|
+
sage: from sage.schemes.projective.projective_rational_point import enum_projective_number_field
|
|
192
|
+
sage: u = QQ['u'].0
|
|
193
|
+
sage: K = NumberField(u^3 - 5, 'v')
|
|
194
|
+
sage: P.<x,y,z> = ProjectiveSpace(K, 2)
|
|
195
|
+
sage: X = P.subscheme([x - y])
|
|
196
|
+
sage: enum_projective_number_field(X(K), bound=RR(5^(1/3)), prec=2^10) # needs sage.geometry.polyhedron sage.symbolic
|
|
197
|
+
[(0 : 0 : 1), (1 : 1 : 0), (-1 : -1 : 1), (1 : 1 : 1)]
|
|
198
|
+
|
|
199
|
+
::
|
|
200
|
+
|
|
201
|
+
sage: # needs sage.rings.number_field
|
|
202
|
+
sage: u = QQ['u'].0
|
|
203
|
+
sage: K = NumberField(u^2 + 3, 'v')
|
|
204
|
+
sage: A.<x,y> = ProjectiveSpace(K, 1)
|
|
205
|
+
sage: X = A.subscheme(x - y)
|
|
206
|
+
sage: enum_projective_number_field(X, bound=2)
|
|
207
|
+
[(1 : 1)]
|
|
208
|
+
"""
|
|
209
|
+
B = kwds.pop('bound')
|
|
210
|
+
tol = kwds.pop('tolerance', 1e-2)
|
|
211
|
+
prec = kwds.pop('precision', 53)
|
|
212
|
+
from sage.schemes.projective.projective_space import ProjectiveSpace_ring
|
|
213
|
+
if isinstance(X, Scheme):
|
|
214
|
+
if not isinstance(X.ambient_space(), ProjectiveSpace_ring):
|
|
215
|
+
raise TypeError("ambient space must be projective space over a number field")
|
|
216
|
+
X = X(X.base_ring())
|
|
217
|
+
else:
|
|
218
|
+
if not isinstance(X.codomain().ambient_space(), ProjectiveSpace_ring):
|
|
219
|
+
raise TypeError("codomain must be projective space over a number field")
|
|
220
|
+
|
|
221
|
+
R = X.codomain().ambient_space()
|
|
222
|
+
|
|
223
|
+
pts = []
|
|
224
|
+
|
|
225
|
+
for P in R.points_of_bounded_height(bound=B, tolerance=tol, precision=prec):
|
|
226
|
+
try:
|
|
227
|
+
pts.append(X(P))
|
|
228
|
+
except TypeError:
|
|
229
|
+
pass
|
|
230
|
+
pts.sort()
|
|
231
|
+
return pts
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def enum_projective_finite_field(X):
|
|
235
|
+
"""
|
|
236
|
+
Enumerates projective points on scheme ``X`` defined over a finite field.
|
|
237
|
+
|
|
238
|
+
INPUT:
|
|
239
|
+
|
|
240
|
+
- ``X`` -- a scheme defined over a finite field or a set of abstract
|
|
241
|
+
rational points of such a scheme
|
|
242
|
+
|
|
243
|
+
OUTPUT:
|
|
244
|
+
|
|
245
|
+
A list containing the projective points of ``X`` over the finite field,
|
|
246
|
+
sorted.
|
|
247
|
+
|
|
248
|
+
EXAMPLES::
|
|
249
|
+
|
|
250
|
+
sage: from sage.schemes.projective.projective_rational_point import enum_projective_finite_field
|
|
251
|
+
sage: F = GF(53)
|
|
252
|
+
sage: P.<X,Y,Z> = ProjectiveSpace(2, F)
|
|
253
|
+
sage: len(enum_projective_finite_field(P(F)))
|
|
254
|
+
2863
|
|
255
|
+
sage: 53^2 + 53 + 1
|
|
256
|
+
2863
|
|
257
|
+
|
|
258
|
+
::
|
|
259
|
+
|
|
260
|
+
sage: # needs sage.rings.finite_rings
|
|
261
|
+
sage: F = GF(9, 'a')
|
|
262
|
+
sage: P.<X,Y,Z> = ProjectiveSpace(2,F)
|
|
263
|
+
sage: C = Curve(X^3 - Y^3 + Z^2*Y) # needs sage.schemes
|
|
264
|
+
sage: enum_projective_finite_field(C(F)) # needs sage.schemes
|
|
265
|
+
[(0 : 0 : 1), (0 : 1 : 1), (0 : 2 : 1), (1 : 1 : 0), (a + 1 : 2*a : 1),
|
|
266
|
+
(a + 1 : 2*a + 1 : 1), (a + 1 : 2*a + 2 : 1), (2*a + 2 : a : 1),
|
|
267
|
+
(2*a + 2 : a + 1 : 1), (2*a + 2 : a + 2 : 1)]
|
|
268
|
+
|
|
269
|
+
::
|
|
270
|
+
|
|
271
|
+
sage: F = GF(5)
|
|
272
|
+
sage: P2F.<X,Y,Z> = ProjectiveSpace(2, F)
|
|
273
|
+
sage: enum_projective_finite_field(P2F)
|
|
274
|
+
[(0 : 0 : 1), (0 : 1 : 0), (0 : 1 : 1), (0 : 2 : 1), (0 : 3 : 1), (0 : 4 : 1),
|
|
275
|
+
(1 : 0 : 0), (1 : 0 : 1), (1 : 1 : 0), (1 : 1 : 1), (1 : 2 : 1), (1 : 3 : 1),
|
|
276
|
+
(1 : 4 : 1), (2 : 0 : 1), (2 : 1 : 0), (2 : 1 : 1), (2 : 2 : 1), (2 : 3 : 1),
|
|
277
|
+
(2 : 4 : 1), (3 : 0 : 1), (3 : 1 : 0), (3 : 1 : 1), (3 : 2 : 1), (3 : 3 : 1),
|
|
278
|
+
(3 : 4 : 1), (4 : 0 : 1), (4 : 1 : 0), (4 : 1 : 1), (4 : 2 : 1), (4 : 3 : 1),
|
|
279
|
+
(4 : 4 : 1)]
|
|
280
|
+
|
|
281
|
+
ALGORITHM:
|
|
282
|
+
|
|
283
|
+
Checks all points in projective space to see if they lie on ``X``.
|
|
284
|
+
|
|
285
|
+
.. WARNING::
|
|
286
|
+
|
|
287
|
+
If ``X`` is defined over an infinite field, this code will not finish!
|
|
288
|
+
|
|
289
|
+
AUTHORS:
|
|
290
|
+
|
|
291
|
+
- John Cremona and Charlie Turner (06-2010).
|
|
292
|
+
"""
|
|
293
|
+
from sage.schemes.projective.projective_space import ProjectiveSpace_ring
|
|
294
|
+
if isinstance(X, Scheme):
|
|
295
|
+
if not isinstance(X.ambient_space(), ProjectiveSpace_ring):
|
|
296
|
+
raise TypeError("ambient space must be projective space over a finite")
|
|
297
|
+
X = X(X.base_ring())
|
|
298
|
+
elif not isinstance(X.codomain().ambient_space(), ProjectiveSpace_ring):
|
|
299
|
+
raise TypeError("codomain must be projective space over a finite field")
|
|
300
|
+
|
|
301
|
+
n = X.codomain().ambient_space().ngens() - 1
|
|
302
|
+
F = X.value_ring()
|
|
303
|
+
pts = []
|
|
304
|
+
for k in range(n + 1):
|
|
305
|
+
for c in product(*[F for _ in range(k)]):
|
|
306
|
+
try:
|
|
307
|
+
pts.append(X(list(c) + [1] + [0] * (n - k)))
|
|
308
|
+
except TypeError:
|
|
309
|
+
pass
|
|
310
|
+
pts.sort()
|
|
311
|
+
return pts
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
def sieve(X, bound):
|
|
315
|
+
r"""
|
|
316
|
+
Return the list of all projective, rational points on scheme ``X`` of
|
|
317
|
+
height up to ``bound``.
|
|
318
|
+
|
|
319
|
+
Height of a projective point `X = (x_1, x_2,\dots, x_n)` is given by
|
|
320
|
+
`H_X = \max(y_1, y_2,\dots, y_n)`, where the values `y_i`
|
|
321
|
+
are the normalized coordinates such that all `y_i` are integers and
|
|
322
|
+
`\gcd(y_1, y_2,\dots, y_n) = 1`.
|
|
323
|
+
|
|
324
|
+
ALGORITHM:
|
|
325
|
+
|
|
326
|
+
Main idea behind the algorithm is to find points modulo primes
|
|
327
|
+
and then reconstruct them using chinese remainder theorem.
|
|
328
|
+
We find modulo primes parallelly and then lift them and apply
|
|
329
|
+
LLL in parallel.
|
|
330
|
+
|
|
331
|
+
For the algorithm to work correctly, sufficient primes need
|
|
332
|
+
to be present, these are calculated using the bound given in
|
|
333
|
+
this([Hutz2015]_) paper.
|
|
334
|
+
|
|
335
|
+
INPUT:
|
|
336
|
+
|
|
337
|
+
- ``X`` -- a scheme with ambient space defined over projective space
|
|
338
|
+
|
|
339
|
+
- ``bound`` -- positive integer bound
|
|
340
|
+
|
|
341
|
+
OUTPUT:
|
|
342
|
+
|
|
343
|
+
A list containing the projective rational points of ``X`` of height
|
|
344
|
+
up to ``bound``, sorted
|
|
345
|
+
|
|
346
|
+
EXAMPLES::
|
|
347
|
+
|
|
348
|
+
sage: from sage.schemes.projective.projective_rational_point import sieve
|
|
349
|
+
sage: P.<x,y,z,q> = ProjectiveSpace(QQ, 3)
|
|
350
|
+
sage: Y = P.subscheme([x^2 - 3^2*y^2 + z*q, x + z + 4*q])
|
|
351
|
+
sage: sorted(sieve(Y, 12)) # long time # needs sage.libs.singular
|
|
352
|
+
[(-4 : -4/3 : 0 : 1), (-4 : 4/3 : 0 : 1),
|
|
353
|
+
(-1 : -1/3 : 1 : 0), (-1 : 1/3 : 1 : 0)]
|
|
354
|
+
|
|
355
|
+
::
|
|
356
|
+
|
|
357
|
+
sage: # needs database_cremona_mini_ellcurve sage.schemes
|
|
358
|
+
sage: from sage.schemes.projective.projective_rational_point import sieve
|
|
359
|
+
sage: E = EllipticCurve('37a')
|
|
360
|
+
sage: sorted(sieve(E, 14)) # long time # needs sage.libs.singular
|
|
361
|
+
[(0 : 1 : 0),
|
|
362
|
+
(-1 : -1 : 1),
|
|
363
|
+
(-1 : 0 : 1),
|
|
364
|
+
(0 : -1 : 1),
|
|
365
|
+
(0 : 0 : 1),
|
|
366
|
+
(1/4 : -5/8 : 1),
|
|
367
|
+
(1/4 : -3/8 : 1),
|
|
368
|
+
(1 : -1 : 1),
|
|
369
|
+
(1 : 0 : 1),
|
|
370
|
+
(2 : -3 : 1),
|
|
371
|
+
(2 : 2 : 1),
|
|
372
|
+
(6 : 14 : 1)]
|
|
373
|
+
|
|
374
|
+
TESTS:
|
|
375
|
+
|
|
376
|
+
Algorithm works even if coefficients are fraction::
|
|
377
|
+
|
|
378
|
+
sage: from sage.schemes.projective.projective_rational_point import sieve
|
|
379
|
+
sage: P.<x,y,z> = ProjectiveSpace(2, QQ)
|
|
380
|
+
sage: X = P.subscheme(3*x - 3/2*y)
|
|
381
|
+
sage: sieve(X, 3) # needs sage.libs.singular sage.symbolic
|
|
382
|
+
[(-1 : -2 : 1), (-1/2 : -1 : 1), (-1/3 : -2/3 : 1), (0 : 0 : 1),
|
|
383
|
+
(1/3 : 2/3 : 1), (1/2 : 1 : 0), (1/2 : 1 : 1), (1 : 2 : 1)]
|
|
384
|
+
"""
|
|
385
|
+
if bound < 1: # no projective rational point with height less than 1
|
|
386
|
+
return []
|
|
387
|
+
|
|
388
|
+
modulo_points = [] # list to store point modulo primes
|
|
389
|
+
len_modulo_points = [] # stores number of points with respect to each prime
|
|
390
|
+
primes_list = [] # list of good primes
|
|
391
|
+
|
|
392
|
+
X.normalize_defining_polynomials()
|
|
393
|
+
|
|
394
|
+
P = X.ambient_space()
|
|
395
|
+
N = P.dimension()
|
|
396
|
+
dim_scheme = X.dimension()
|
|
397
|
+
|
|
398
|
+
# bound as per preposition - 4, in preperiodic points paper
|
|
399
|
+
B = RR(2**(N/4+1)*bound**2*(N+1).sqrt())
|
|
400
|
+
|
|
401
|
+
m = [0 for _ in range(N + 1)]
|
|
402
|
+
|
|
403
|
+
def sufficient_primes(x):
|
|
404
|
+
r"""
|
|
405
|
+
Return a list of primes whose product is > `x`.
|
|
406
|
+
"""
|
|
407
|
+
small_primes = [2,3]
|
|
408
|
+
prod_primes = 6
|
|
409
|
+
|
|
410
|
+
while prod_primes < x:
|
|
411
|
+
p = next_prime(small_primes[-1])
|
|
412
|
+
small_primes.append(p)
|
|
413
|
+
prod_primes *= p
|
|
414
|
+
return small_primes
|
|
415
|
+
|
|
416
|
+
def good_primes(B):
|
|
417
|
+
r"""
|
|
418
|
+
Given the bound returns the prime whose product is greater than ``B``
|
|
419
|
+
and which would take least amount of time to run main sieve algorithm
|
|
420
|
+
|
|
421
|
+
Complexity of finding points modulo primes is assumed to be N^2 * P_max^{N}.
|
|
422
|
+
Complexity of lifting points and LLL() function is assumed to
|
|
423
|
+
be close to N^5 * (alpha^dim_scheme / P_max).
|
|
424
|
+
where alpha is product of all primes, and P_max is largest prime in list.
|
|
425
|
+
"""
|
|
426
|
+
|
|
427
|
+
M = {} # stores optimal list of primes, corresponding to list size
|
|
428
|
+
small_primes = sufficient_primes(B)
|
|
429
|
+
max_length = len(small_primes)
|
|
430
|
+
M[max_length] = small_primes
|
|
431
|
+
current_count = max_length - 1
|
|
432
|
+
|
|
433
|
+
while current_count > 1:
|
|
434
|
+
current_list = [] # stores prime which are bigger than least
|
|
435
|
+
updated_list = []
|
|
436
|
+
best_list = []
|
|
437
|
+
|
|
438
|
+
least = (RR(B)**(1.00/current_count)).floor()
|
|
439
|
+
for i in range(current_count):
|
|
440
|
+
current_list.append(next_prime(least))
|
|
441
|
+
least = current_list[-1]
|
|
442
|
+
# improving list of primes by taking prime less than least
|
|
443
|
+
# this part of algorithm is used to centralize primes around `least`
|
|
444
|
+
prod_prime = prod(current_list)
|
|
445
|
+
least = current_list[0]
|
|
446
|
+
while least != 2 and prod_prime > B and len(updated_list) < current_count:
|
|
447
|
+
best_list = updated_list + current_list[:current_count - len(updated_list)]
|
|
448
|
+
updated_list.append(previous_prime(least))
|
|
449
|
+
least = updated_list[-1]
|
|
450
|
+
|
|
451
|
+
removed_prime = current_list[current_count - len(updated_list)]
|
|
452
|
+
prod_prime = (prod_prime * least) / removed_prime
|
|
453
|
+
|
|
454
|
+
M[current_count] = sorted(best_list)
|
|
455
|
+
current_count = current_count - 1
|
|
456
|
+
|
|
457
|
+
best_size = 2
|
|
458
|
+
best_time = (N**2)*M[2][-1]**(N) + (N**5 * RR(prod(M[2])**dim_scheme / M[2][-1]) )
|
|
459
|
+
for i in range(2, max_length + 1):
|
|
460
|
+
current_time = (N**2)*M[i][-1]**(N) + (N**5 * RR(prod(M[i])**dim_scheme / M[i][-1]) )
|
|
461
|
+
if current_time < best_time:
|
|
462
|
+
best_size = i
|
|
463
|
+
best_time = current_time
|
|
464
|
+
|
|
465
|
+
return M[best_size]
|
|
466
|
+
|
|
467
|
+
def parallel_function(X, p):
|
|
468
|
+
r"""
|
|
469
|
+
Function used in parallel computation, computes a list of
|
|
470
|
+
all rational points in modulo ring.
|
|
471
|
+
"""
|
|
472
|
+
Xp = X.change_ring(GF(p))
|
|
473
|
+
L = Xp.rational_points()
|
|
474
|
+
|
|
475
|
+
return [list(_) for _ in L]
|
|
476
|
+
|
|
477
|
+
def points_modulo_primes(X, primes):
|
|
478
|
+
r"""
|
|
479
|
+
Return a list of rational points modulo all `p` in primes,
|
|
480
|
+
computed parallelly.
|
|
481
|
+
"""
|
|
482
|
+
normalized_input = []
|
|
483
|
+
for p in primes_list:
|
|
484
|
+
normalized_input.append(((X, p, ), {}))
|
|
485
|
+
p_iter = p_iter_fork(ncpus())
|
|
486
|
+
|
|
487
|
+
points_pair = list(p_iter(parallel_function, normalized_input))
|
|
488
|
+
points_pair.sort()
|
|
489
|
+
return [pair[1] for pair in points_pair]
|
|
490
|
+
|
|
491
|
+
def parallel_function_combination(point_p_max):
|
|
492
|
+
r"""
|
|
493
|
+
Function used in parallel computation, computes rational
|
|
494
|
+
points lifted.
|
|
495
|
+
"""
|
|
496
|
+
rat_points = set()
|
|
497
|
+
for tupl in xmrange(len_modulo_points):
|
|
498
|
+
point = []
|
|
499
|
+
for k in range(N + 1):
|
|
500
|
+
# lift all coordinates of given point using chinese remainder theorem
|
|
501
|
+
L = [modulo_points[j][tupl[j]][k].lift() for j in range(len_primes - 1)]
|
|
502
|
+
L.append(point_p_max[k].lift())
|
|
503
|
+
point.append( crt(L, primes_list) )
|
|
504
|
+
|
|
505
|
+
for i in range(N+1):
|
|
506
|
+
m[i] = point[i]
|
|
507
|
+
|
|
508
|
+
M = matrix(ZZ, N+2, N+1, m)
|
|
509
|
+
A = M.LLL()
|
|
510
|
+
point = list(A[1])
|
|
511
|
+
|
|
512
|
+
# check if all coordinates of this point satisfy height bound
|
|
513
|
+
bound_satisfied = True
|
|
514
|
+
for coordinate in point:
|
|
515
|
+
if coordinate.abs() > bound:
|
|
516
|
+
bound_satisfied = False
|
|
517
|
+
break
|
|
518
|
+
if not bound_satisfied:
|
|
519
|
+
continue
|
|
520
|
+
|
|
521
|
+
try:
|
|
522
|
+
pt = X(list(A[1]))
|
|
523
|
+
except TypeError:
|
|
524
|
+
pass
|
|
525
|
+
else:
|
|
526
|
+
rat_points.add(pt)
|
|
527
|
+
|
|
528
|
+
return [list(_) for _ in rat_points]
|
|
529
|
+
|
|
530
|
+
def lift_all_points():
|
|
531
|
+
r"""
|
|
532
|
+
Return list of all rational points lifted parallelly.
|
|
533
|
+
"""
|
|
534
|
+
normalized_input = []
|
|
535
|
+
points = modulo_points.pop() # remove the list of points corresponding to largest prime
|
|
536
|
+
len_modulo_points.pop()
|
|
537
|
+
|
|
538
|
+
for point in points:
|
|
539
|
+
normalized_input.append(( (point, ), {}))
|
|
540
|
+
p_iter = p_iter_fork(ncpus())
|
|
541
|
+
points_satisfying = list(p_iter(parallel_function_combination, normalized_input))
|
|
542
|
+
|
|
543
|
+
lifted_points = set()
|
|
544
|
+
for pair in points_satisfying:
|
|
545
|
+
L = pair[1]
|
|
546
|
+
for point in L:
|
|
547
|
+
lifted_points.add(X(tuple(point)))
|
|
548
|
+
|
|
549
|
+
return list(lifted_points)
|
|
550
|
+
|
|
551
|
+
# start of main algorithm
|
|
552
|
+
|
|
553
|
+
primes_list = good_primes(B.ceil())
|
|
554
|
+
|
|
555
|
+
modulo_points = points_modulo_primes(X, primes_list)
|
|
556
|
+
len_modulo_points = [len(pt) for pt in modulo_points]
|
|
557
|
+
len_primes = len(primes_list)
|
|
558
|
+
prod_primes = prod(primes_list)
|
|
559
|
+
|
|
560
|
+
# stores final result
|
|
561
|
+
|
|
562
|
+
for i in range(N + 1):
|
|
563
|
+
w = [0 for _ in range(N + 1)]
|
|
564
|
+
w[i] = prod_primes
|
|
565
|
+
m.extend(w)
|
|
566
|
+
|
|
567
|
+
rat_points = lift_all_points()
|
|
568
|
+
|
|
569
|
+
return sorted(rat_points)
|