snappy 3.3__cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_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.
- snappy/CyOpenGL.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.ico +0 -0
- snappy/SnapPy.png +0 -0
- snappy/SnapPyHP.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/__init__.py +534 -0
- snappy/app.py +604 -0
- snappy/app_menus.py +372 -0
- snappy/browser.py +998 -0
- snappy/cache.py +25 -0
- snappy/canonical.py +249 -0
- snappy/cusps/__init__.py +280 -0
- snappy/cusps/cusp_area_matrix.py +98 -0
- snappy/cusps/cusp_areas_from_matrix.py +96 -0
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/short_slopes_for_cusp.py +217 -0
- snappy/cusps/test.py +22 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +454 -0
- snappy/db_utilities.py +79 -0
- snappy/decorated_isosig.py +717 -0
- snappy/dev/__init__.py +0 -0
- snappy/dev/extended_ptolemy/__init__.py +8 -0
- snappy/dev/extended_ptolemy/closed.py +106 -0
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
- snappy/dev/extended_ptolemy/direct.py +42 -0
- snappy/dev/extended_ptolemy/extended.py +406 -0
- snappy/dev/extended_ptolemy/giac_helper.py +43 -0
- snappy/dev/extended_ptolemy/giac_rur.py +129 -0
- snappy/dev/extended_ptolemy/gluing.py +46 -0
- snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
- snappy/dev/extended_ptolemy/printMatrices.py +70 -0
- snappy/dev/vericlosed/__init__.py +1 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
- snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
- snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
- snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
- snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
- snappy/dev/vericlosed/orb/__init__.py +1 -0
- snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
- snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
- snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
- snappy/dev/vericlosed/test.py +54 -0
- snappy/dev/vericlosed/truncatedComplex.py +176 -0
- snappy/dev/vericlosed/verificationError.py +58 -0
- snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
- snappy/doc/_images/SnapPy-196.png +0 -0
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +0 -0
- snappy/doc/_images/mac.png +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
- snappy/doc/_images/plink-action.png +0 -0
- snappy/doc/_images/ubuntu.png +0 -0
- snappy/doc/_images/win7.png +0 -0
- snappy/doc/_sources/additional_classes.rst.txt +40 -0
- snappy/doc/_sources/bugs.rst.txt +14 -0
- snappy/doc/_sources/censuses.rst.txt +52 -0
- snappy/doc/_sources/credits.rst.txt +81 -0
- snappy/doc/_sources/development.rst.txt +261 -0
- snappy/doc/_sources/index.rst.txt +215 -0
- snappy/doc/_sources/installing.rst.txt +249 -0
- snappy/doc/_sources/manifold.rst.txt +6 -0
- snappy/doc/_sources/manifoldhp.rst.txt +46 -0
- snappy/doc/_sources/news.rst.txt +425 -0
- snappy/doc/_sources/other.rst.txt +25 -0
- snappy/doc/_sources/platonic_census.rst.txt +20 -0
- snappy/doc/_sources/plink.rst.txt +102 -0
- snappy/doc/_sources/ptolemy.rst.txt +66 -0
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -0
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -0
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -0
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -0
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -0
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -0
- snappy/doc/_sources/screenshots.rst.txt +21 -0
- snappy/doc/_sources/snap.rst.txt +87 -0
- snappy/doc/_sources/snappy.rst.txt +28 -0
- snappy/doc/_sources/spherogram.rst.txt +103 -0
- snappy/doc/_sources/todo.rst.txt +47 -0
- snappy/doc/_sources/triangulation.rst.txt +11 -0
- snappy/doc/_sources/tutorial.rst.txt +49 -0
- snappy/doc/_sources/verify.rst.txt +210 -0
- snappy/doc/_sources/verify_internals.rst.txt +79 -0
- snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
- snappy/doc/_static/SnapPy.ico +0 -0
- snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- snappy/doc/_static/basic.css +906 -0
- snappy/doc/_static/css/badge_only.css +1 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
- snappy/doc/_static/css/theme.css +4 -0
- snappy/doc/_static/doctools.js +149 -0
- snappy/doc/_static/documentation_options.js +13 -0
- snappy/doc/_static/file.png +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- snappy/doc/_static/jquery.js +2 -0
- snappy/doc/_static/js/badge_only.js +1 -0
- snappy/doc/_static/js/theme.js +1 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +192 -0
- snappy/doc/_static/minus.png +0 -0
- snappy/doc/_static/plus.png +0 -0
- snappy/doc/_static/pygments.css +75 -0
- snappy/doc/_static/searchtools.js +635 -0
- snappy/doc/_static/snappy_furo.css +33 -0
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
- snappy/doc/_static/sphinx_highlight.js +154 -0
- snappy/doc/additional_classes.html +1500 -0
- snappy/doc/bugs.html +132 -0
- snappy/doc/censuses.html +453 -0
- snappy/doc/credits.html +184 -0
- snappy/doc/development.html +385 -0
- snappy/doc/doc-latest/additional_classes.html +1500 -0
- snappy/doc/doc-latest/bugs.html +132 -0
- snappy/doc/doc-latest/censuses.html +453 -0
- snappy/doc/doc-latest/credits.html +184 -0
- snappy/doc/doc-latest/development.html +385 -0
- snappy/doc/doc-latest/genindex.html +1349 -0
- snappy/doc/doc-latest/index.html +287 -0
- snappy/doc/doc-latest/installing.html +346 -0
- snappy/doc/doc-latest/manifold.html +3632 -0
- snappy/doc/doc-latest/manifoldhp.html +180 -0
- snappy/doc/doc-latest/news.html +438 -0
- snappy/doc/doc-latest/objects.inv +0 -0
- snappy/doc/doc-latest/other.html +160 -0
- snappy/doc/doc-latest/platonic_census.html +376 -0
- snappy/doc/doc-latest/plink.html +210 -0
- snappy/doc/doc-latest/ptolemy.html +253 -0
- snappy/doc/doc-latest/ptolemy_classes.html +1144 -0
- snappy/doc/doc-latest/ptolemy_examples1.html +409 -0
- snappy/doc/doc-latest/ptolemy_examples2.html +471 -0
- snappy/doc/doc-latest/ptolemy_examples3.html +414 -0
- snappy/doc/doc-latest/ptolemy_examples4.html +195 -0
- snappy/doc/doc-latest/ptolemy_prelim.html +248 -0
- snappy/doc/doc-latest/py-modindex.html +165 -0
- snappy/doc/doc-latest/screenshots.html +141 -0
- snappy/doc/doc-latest/search.html +135 -0
- snappy/doc/doc-latest/searchindex.js +1 -0
- snappy/doc/doc-latest/snap.html +202 -0
- snappy/doc/doc-latest/snappy.html +181 -0
- snappy/doc/doc-latest/spherogram.html +1346 -0
- snappy/doc/doc-latest/todo.html +166 -0
- snappy/doc/doc-latest/triangulation.html +1676 -0
- snappy/doc/doc-latest/tutorial.html +159 -0
- snappy/doc/doc-latest/verify.html +330 -0
- snappy/doc/doc-latest/verify_internals.html +1235 -0
- snappy/doc/genindex.html +1349 -0
- snappy/doc/index.html +287 -0
- snappy/doc/installing.html +346 -0
- snappy/doc/manifold.html +3632 -0
- snappy/doc/manifoldhp.html +180 -0
- snappy/doc/news.html +438 -0
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -0
- snappy/doc/platonic_census.html +376 -0
- snappy/doc/plink.html +210 -0
- snappy/doc/ptolemy.html +253 -0
- snappy/doc/ptolemy_classes.html +1144 -0
- snappy/doc/ptolemy_examples1.html +409 -0
- snappy/doc/ptolemy_examples2.html +471 -0
- snappy/doc/ptolemy_examples3.html +414 -0
- snappy/doc/ptolemy_examples4.html +195 -0
- snappy/doc/ptolemy_prelim.html +248 -0
- snappy/doc/py-modindex.html +165 -0
- snappy/doc/screenshots.html +141 -0
- snappy/doc/search.html +135 -0
- snappy/doc/searchindex.js +1 -0
- snappy/doc/snap.html +202 -0
- snappy/doc/snappy.html +181 -0
- snappy/doc/spherogram.html +1346 -0
- snappy/doc/todo.html +166 -0
- snappy/doc/triangulation.html +1676 -0
- snappy/doc/tutorial.html +159 -0
- snappy/doc/verify.html +330 -0
- snappy/doc/verify_internals.html +1235 -0
- snappy/drilling/__init__.py +456 -0
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +5 -0
- snappy/drilling/crush.py +270 -0
- snappy/drilling/cusps.py +125 -0
- snappy/drilling/debug.py +242 -0
- snappy/drilling/epsilons.py +6 -0
- snappy/drilling/exceptions.py +55 -0
- snappy/drilling/moves.py +620 -0
- snappy/drilling/peripheral_curves.py +210 -0
- snappy/drilling/perturb.py +188 -0
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +274 -0
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +132 -0
- snappy/drilling/tracing.py +351 -0
- snappy/exceptions.py +26 -0
- snappy/export_stl.py +120 -0
- snappy/exterior_to_link/__init__.py +2 -0
- snappy/exterior_to_link/barycentric_geometry.py +463 -0
- snappy/exterior_to_link/exceptions.py +6 -0
- snappy/exterior_to_link/geodesic_map.json +14408 -0
- snappy/exterior_to_link/hyp_utils.py +112 -0
- snappy/exterior_to_link/link_projection.py +323 -0
- snappy/exterior_to_link/main.py +198 -0
- snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
- snappy/exterior_to_link/mcomplex_with_link.py +687 -0
- snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
- snappy/exterior_to_link/pl_utils.py +491 -0
- snappy/exterior_to_link/put_in_S3.py +156 -0
- snappy/exterior_to_link/rational_linear_algebra.py +130 -0
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
- snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
- snappy/exterior_to_link/stored_moves.py +475 -0
- snappy/exterior_to_link/test.py +31 -0
- snappy/filedialog.py +28 -0
- snappy/geometric_structure/__init__.py +212 -0
- snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
- snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +691 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +480 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +41 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +294 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +156 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +35 -0
- snappy/geometric_structure/geodesic/__init__.py +0 -0
- snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
- snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
- snappy/geometric_structure/geodesic/canonical_representatives.py +52 -0
- snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
- snappy/geometric_structure/geodesic/constants.py +6 -0
- snappy/geometric_structure/geodesic/exceptions.py +22 -0
- snappy/geometric_structure/geodesic/fixed_points.py +106 -0
- snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
- snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
- snappy/geometric_structure/geodesic/line.py +30 -0
- snappy/geometric_structure/geodesic/multiplicity.py +127 -0
- snappy/geometric_structure/geodesic/tiles_for_geodesic.py +128 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +121 -0
- snappy/horoviewer.py +443 -0
- snappy/hyperboloid/__init__.py +212 -0
- snappy/hyperboloid/distances.py +259 -0
- snappy/hyperboloid/horoball.py +19 -0
- snappy/hyperboloid/line.py +35 -0
- snappy/hyperboloid/point.py +9 -0
- snappy/hyperboloid/triangle.py +29 -0
- snappy/info_icon.gif +0 -0
- snappy/infowindow.py +65 -0
- snappy/isometry_signature.py +389 -0
- snappy/len_spec/__init__.py +609 -0
- snappy/len_spec/geodesic_info.py +129 -0
- snappy/len_spec/geodesic_key_info_dict.py +116 -0
- snappy/len_spec/geodesic_piece.py +146 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +136 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +185 -0
- snappy/len_spec/spine.py +128 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +276 -0
- snappy/len_spec/word.py +86 -0
- snappy/manifolds/HTWKnots/alternating.gz +0 -0
- snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
- snappy/manifolds/__init__.py +3 -0
- snappy/margulis/__init__.py +332 -0
- snappy/margulis/cusp_neighborhood_neighborhood.py +66 -0
- snappy/margulis/geodesic_neighborhood.py +152 -0
- snappy/margulis/margulis_info.py +21 -0
- snappy/margulis/mu_from_neighborhood_pair.py +175 -0
- snappy/margulis/neighborhood.py +29 -0
- snappy/margulis/test.py +22 -0
- snappy/math_basics.py +187 -0
- snappy/matrix.py +525 -0
- snappy/number.py +657 -0
- snappy/numeric_output_checker.py +345 -0
- snappy/pari.py +41 -0
- snappy/phone_home.py +57 -0
- snappy/polyviewer.py +259 -0
- snappy/ptolemy/__init__.py +17 -0
- snappy/ptolemy/component.py +103 -0
- snappy/ptolemy/coordinates.py +2290 -0
- snappy/ptolemy/fieldExtensions.py +153 -0
- snappy/ptolemy/findLoops.py +473 -0
- snappy/ptolemy/geometricRep.py +59 -0
- snappy/ptolemy/homology.py +165 -0
- snappy/ptolemy/magma/default.magma_template +229 -0
- snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
- snappy/ptolemy/manifoldMethods.py +395 -0
- snappy/ptolemy/matrix.py +350 -0
- snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
- snappy/ptolemy/polynomial.py +856 -0
- snappy/ptolemy/processComponents.py +173 -0
- snappy/ptolemy/processFileBase.py +247 -0
- snappy/ptolemy/processFileDispatch.py +46 -0
- snappy/ptolemy/processMagmaFile.py +392 -0
- snappy/ptolemy/processRurFile.py +150 -0
- snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
- snappy/ptolemy/ptolemyObstructionClass.py +64 -0
- snappy/ptolemy/ptolemyVariety.py +995 -0
- snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
- snappy/ptolemy/reginaWrapper.py +698 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/rur.py +545 -0
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
- snappy/ptolemy/test.py +1126 -0
- snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
- snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
- snappy/ptolemy/utilities.py +236 -0
- snappy/raytracing/__init__.py +64 -0
- snappy/raytracing/additional_horospheres.py +64 -0
- snappy/raytracing/additional_len_spec_choices.py +63 -0
- snappy/raytracing/cohomology_fractal.py +197 -0
- snappy/raytracing/eyeball.py +124 -0
- snappy/raytracing/finite_raytracing_data.py +237 -0
- snappy/raytracing/finite_viewer.py +590 -0
- snappy/raytracing/geodesic_tube_info.py +174 -0
- snappy/raytracing/geodesics.py +246 -0
- snappy/raytracing/geodesics_window.py +258 -0
- snappy/raytracing/gui_utilities.py +293 -0
- snappy/raytracing/hyperboloid_navigation.py +556 -0
- snappy/raytracing/hyperboloid_utilities.py +234 -0
- snappy/raytracing/ideal_raytracing_data.py +592 -0
- snappy/raytracing/inside_viewer.py +974 -0
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +126 -0
- snappy/raytracing/raytracing_view.py +454 -0
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +101 -0
- snappy/raytracing/shaders/fragment.glsl +1744 -0
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +98 -0
- snappy/raytracing/view_scale_controller.py +98 -0
- snappy/raytracing/zoom_slider/__init__.py +263 -0
- snappy/raytracing/zoom_slider/inward.png +0 -0
- snappy/raytracing/zoom_slider/inward18.png +0 -0
- snappy/raytracing/zoom_slider/outward.png +0 -0
- snappy/raytracing/zoom_slider/outward18.png +0 -0
- snappy/raytracing/zoom_slider/test.py +20 -0
- snappy/sage_helper.py +119 -0
- snappy/settings.py +407 -0
- snappy/shell.py +53 -0
- snappy/snap/__init__.py +117 -0
- snappy/snap/character_varieties.py +375 -0
- snappy/snap/find_field.py +372 -0
- snappy/snap/fox_milnor.py +271 -0
- snappy/snap/fundamental_polyhedron.py +569 -0
- snappy/snap/generators.py +39 -0
- snappy/snap/interval_reps.py +81 -0
- snappy/snap/kernel_structures.py +128 -0
- snappy/snap/mcomplex_base.py +18 -0
- snappy/snap/nsagetools.py +716 -0
- snappy/snap/peripheral/__init__.py +1 -0
- snappy/snap/peripheral/dual_cellulation.py +219 -0
- snappy/snap/peripheral/link.py +127 -0
- snappy/snap/peripheral/peripheral.py +159 -0
- snappy/snap/peripheral/surface.py +522 -0
- snappy/snap/peripheral/test.py +35 -0
- snappy/snap/polished_reps.py +335 -0
- snappy/snap/shapes.py +152 -0
- snappy/snap/slice_obs_HKL/__init__.py +194 -0
- snappy/snap/slice_obs_HKL/basics.py +236 -0
- snappy/snap/slice_obs_HKL/direct.py +217 -0
- snappy/snap/slice_obs_HKL/poly_norm.py +212 -0
- snappy/snap/slice_obs_HKL/rep_theory.py +424 -0
- snappy/snap/t3mlite/__init__.py +2 -0
- snappy/snap/t3mlite/arrow.py +243 -0
- snappy/snap/t3mlite/corner.py +22 -0
- snappy/snap/t3mlite/edge.py +172 -0
- snappy/snap/t3mlite/face.py +37 -0
- snappy/snap/t3mlite/files.py +211 -0
- snappy/snap/t3mlite/homology.py +53 -0
- snappy/snap/t3mlite/linalg.py +419 -0
- snappy/snap/t3mlite/mcomplex.py +1499 -0
- snappy/snap/t3mlite/perm4.py +320 -0
- snappy/snap/t3mlite/setup.py +12 -0
- snappy/snap/t3mlite/simplex.py +199 -0
- snappy/snap/t3mlite/spun.py +297 -0
- snappy/snap/t3mlite/surface.py +519 -0
- snappy/snap/t3mlite/test.py +20 -0
- snappy/snap/t3mlite/test_vs_regina.py +86 -0
- snappy/snap/t3mlite/tetrahedron.py +109 -0
- snappy/snap/t3mlite/vertex.py +42 -0
- snappy/snap/test.py +139 -0
- snappy/snap/utilities.py +288 -0
- snappy/test.py +213 -0
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/dict_based_set.py +79 -0
- snappy/tiling/floor.py +49 -0
- snappy/tiling/hyperboloid_dict.py +54 -0
- snappy/tiling/iter_utils.py +78 -0
- snappy/tiling/lifted_tetrahedron.py +22 -0
- snappy/tiling/lifted_tetrahedron_set.py +54 -0
- snappy/tiling/quotient_dict.py +70 -0
- snappy/tiling/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +224 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +920 -0
- snappy/twister/__init__.py +20 -0
- snappy/twister/main.py +646 -0
- snappy/twister/surfaces/S_0_1 +3 -0
- snappy/twister/surfaces/S_0_2 +3 -0
- snappy/twister/surfaces/S_0_4 +7 -0
- snappy/twister/surfaces/S_0_4_Lantern +8 -0
- snappy/twister/surfaces/S_1 +3 -0
- snappy/twister/surfaces/S_1_1 +4 -0
- snappy/twister/surfaces/S_1_2 +5 -0
- snappy/twister/surfaces/S_1_2_5 +6 -0
- snappy/twister/surfaces/S_2 +6 -0
- snappy/twister/surfaces/S_2_1 +8 -0
- snappy/twister/surfaces/S_2_heeg +10 -0
- snappy/twister/surfaces/S_3 +8 -0
- snappy/twister/surfaces/S_3_1 +10 -0
- snappy/twister/surfaces/S_4_1 +12 -0
- snappy/twister/surfaces/S_5_1 +14 -0
- snappy/twister/surfaces/heeg_fig8 +9 -0
- snappy/twister/twister_core.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/upper_halfspace/__init__.py +146 -0
- snappy/upper_halfspace/ideal_point.py +29 -0
- snappy/verify/__init__.py +13 -0
- snappy/verify/canonical.py +542 -0
- snappy/verify/complex_volume/__init__.py +18 -0
- snappy/verify/complex_volume/adjust_torsion.py +86 -0
- snappy/verify/complex_volume/closed.py +168 -0
- snappy/verify/complex_volume/compute_ptolemys.py +90 -0
- snappy/verify/complex_volume/cusped.py +56 -0
- snappy/verify/complex_volume/extended_bloch.py +201 -0
- snappy/verify/cusp_translations.py +85 -0
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +254 -0
- snappy/verify/hyperbolicity.py +224 -0
- snappy/verify/interval_newton_shapes_engine.py +523 -0
- snappy/verify/interval_tree.py +400 -0
- snappy/verify/krawczyk_shapes_engine.py +518 -0
- snappy/verify/real_algebra.py +286 -0
- snappy/verify/shapes.py +25 -0
- snappy/verify/square_extensions.py +1005 -0
- snappy/verify/test.py +72 -0
- snappy/verify/volume.py +128 -0
- snappy/version.py +2 -0
- snappy-3.3.dist-info/METADATA +58 -0
- snappy-3.3.dist-info/RECORD +541 -0
- snappy-3.3.dist-info/WHEEL +6 -0
- snappy-3.3.dist-info/entry_points.txt +2 -0
- snappy-3.3.dist-info/top_level.txt +28 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
from . import matrix
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def _gcd(s, t):
|
|
5
|
+
if t == 0:
|
|
6
|
+
return s
|
|
7
|
+
return _gcd(t, s % t)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def homology_basis_representatives_with_orders(d1, d2, N):
|
|
11
|
+
"""
|
|
12
|
+
Given two matrices d1 and d2 such that d1 * d2 = 0, computes the
|
|
13
|
+
homology H_1 = ker(d1) / im(d2) when using Z (when N = 0)
|
|
14
|
+
or Z/N coefficients. The result is a list of pairs (vector, order)
|
|
15
|
+
forming a basis of H_1 as Abelian group.
|
|
16
|
+
A pair (vector, order) consists of a vector c_1 in ker(d1) representing a
|
|
17
|
+
homology class [c_1] in H_1 with the integer order being the order of [c_1]
|
|
18
|
+
if it is finite otherwise 0.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
# two consecutive maps in a chain complex should give zero
|
|
22
|
+
assert matrix.is_matrix_zero(
|
|
23
|
+
matrix.matrix_mult(d1, d2))
|
|
24
|
+
|
|
25
|
+
# Change the basis of the chain groups C_0, C_1, C_2 by the matrices
|
|
26
|
+
# basechangeN
|
|
27
|
+
# transformed_d1 and transformed_d2 are the boundary maps d1 and d2 but
|
|
28
|
+
# with respect to the new basis. In this new basis, the boundary maps will
|
|
29
|
+
# have at most one non-zero entry per row, respectively, per column so that
|
|
30
|
+
# we can directly read of whether a basis vector is in ker(d1) and im(d2).
|
|
31
|
+
basechange0, basechange1, basechange2, transformed_d1, transformed_d2 = (
|
|
32
|
+
matrix.simultaneous_smith_normal_form(d1, d2))
|
|
33
|
+
|
|
34
|
+
# Perform consistency checks
|
|
35
|
+
matrix.test_simultaneous_smith_normal_form(
|
|
36
|
+
d1, d2,
|
|
37
|
+
basechange0, basechange1, basechange2,
|
|
38
|
+
transformed_d1, transformed_d2)
|
|
39
|
+
|
|
40
|
+
# Perform consistency check
|
|
41
|
+
assert matrix.is_matrix_zero(
|
|
42
|
+
matrix.matrix_mult(transformed_d1, transformed_d2))
|
|
43
|
+
|
|
44
|
+
# Will hold the result
|
|
45
|
+
homology_basis = []
|
|
46
|
+
|
|
47
|
+
# A list of all the basis vectors
|
|
48
|
+
basis_vectors = matrix.matrix_transpose(basechange1)
|
|
49
|
+
|
|
50
|
+
# Iterate through the basis vectors
|
|
51
|
+
for i, basis_vector in enumerate(basis_vectors):
|
|
52
|
+
|
|
53
|
+
# Get the absolute value of the one non-zero entry in
|
|
54
|
+
# the i-th column of d1 with respect to the new basis
|
|
55
|
+
d1_entry = matrix.max_abs_of_col(transformed_d1, i)
|
|
56
|
+
|
|
57
|
+
# i-th row of d2
|
|
58
|
+
d2_entry = matrix.max_abs_of_row(transformed_d2, i)
|
|
59
|
+
|
|
60
|
+
# Note that d1 * d2 = 0, so at most one of d1_entry and d2_entry
|
|
61
|
+
# can be non-zero.
|
|
62
|
+
|
|
63
|
+
# If using Z/N coefficients, apply gcd and modulo N to entries.
|
|
64
|
+
if not N == 0:
|
|
65
|
+
# We do this because we want to compute the image and the kernel
|
|
66
|
+
# of maps m: Z/N -> Z/N, x |-> e*x.
|
|
67
|
+
# For this consider the quantity gcd(e,N) % N.
|
|
68
|
+
# The image of m consists of multiplies of gcd(e,N) % N.
|
|
69
|
+
# If gcd(e, N) % N is 0, the kernel is Z/N. If 1, the kernel is 0.
|
|
70
|
+
# Otherwise, N / (gcd(e, N) % N) is generating the kernel and the
|
|
71
|
+
# kernel has size gcd(e, N) % N).
|
|
72
|
+
|
|
73
|
+
# Example: Z/6 -> Z/6, x |-> 5 * x has full image Z/6 because
|
|
74
|
+
# gcd(5, 6) = 1. The kernel is 0.
|
|
75
|
+
|
|
76
|
+
# Z/6 -> Z/6, x |-> 4 * x has image all even elements in Z/6
|
|
77
|
+
# because gcd(4, 6) = 2. Its kernel also consists of 2 elements,
|
|
78
|
+
# namely 0 and 3 = 6 / 2 = 6 / gcd(4, 6).
|
|
79
|
+
|
|
80
|
+
d1_entry = _gcd(d1_entry, N) % N
|
|
81
|
+
d2_entry = _gcd(d2_entry, N) % N
|
|
82
|
+
|
|
83
|
+
if d1_entry == 0:
|
|
84
|
+
# The image of the basis vector is 0, hence the basis vector
|
|
85
|
+
# is in the kernel of d1.
|
|
86
|
+
|
|
87
|
+
# However, it might be entirely killed by the image of d2.
|
|
88
|
+
# It is not entirely killed if and only if d2 entry is not 1.
|
|
89
|
+
if not d2_entry == 1:
|
|
90
|
+
# The basis vector times the d2 entry is in the image of d2
|
|
91
|
+
# and thus zero in the homology.
|
|
92
|
+
# Thus the d2 entry determines the order of the homology class
|
|
93
|
+
# this basis vector represents.
|
|
94
|
+
if N == 0:
|
|
95
|
+
# In the Z-coefficient case, the order is just given by the
|
|
96
|
+
# d2 entry. This is even when d2 entry is zero as infinite
|
|
97
|
+
# order is encoded by 0.
|
|
98
|
+
homology_basis.append( (basis_vector, d2_entry) )
|
|
99
|
+
else:
|
|
100
|
+
if d2_entry == 0:
|
|
101
|
+
# If the d2 entry is 0, no multiple of the basis vector
|
|
102
|
+
# is killed by the image. But we have Z/N-coefficients,
|
|
103
|
+
# so the order is N.
|
|
104
|
+
homology_basis.append( (basis_vector, N) )
|
|
105
|
+
else:
|
|
106
|
+
# Order is just d2 entry.
|
|
107
|
+
homology_basis.append( (basis_vector, d2_entry) )
|
|
108
|
+
|
|
109
|
+
elif not d1_entry == 1:
|
|
110
|
+
# d1 entry is neither 0 or 1. In Z-coefficients this means
|
|
111
|
+
# that no multiple of basis vector can be in the kernel.
|
|
112
|
+
if not N == 0:
|
|
113
|
+
# But in Z/N-coefficients, multiplying by N/d1_entry
|
|
114
|
+
# gives a generator of the kernel that has order d1_entry
|
|
115
|
+
# in the homology.
|
|
116
|
+
kernel_vector = [ ( b * N / d1_entry ) % N
|
|
117
|
+
for b in basis_vector ]
|
|
118
|
+
homology_basis.append( (kernel_vector, d1_entry) )
|
|
119
|
+
|
|
120
|
+
# d1 entry is 1, so the basis vector or any multiple of it
|
|
121
|
+
# is in the kernel. Do not add it
|
|
122
|
+
|
|
123
|
+
return homology_basis
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def homology_representatives(d1, d2, N):
|
|
127
|
+
"""
|
|
128
|
+
Given two matrices d1 and d2 such that d1 * d2 = 0, computes the
|
|
129
|
+
homology H_1 = ker(d1) / im(d2) when using Z/N coefficients.
|
|
130
|
+
|
|
131
|
+
The result is a list of vectors c_1 for each homology class [c_1].
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
assert N > 1
|
|
135
|
+
|
|
136
|
+
# Compute a basis of the homology group
|
|
137
|
+
homology_basis = homology_basis_representatives_with_orders(d1, d2, N)
|
|
138
|
+
|
|
139
|
+
# Enumerate all linear combinations of the basis elements
|
|
140
|
+
return _enumerate_from_basis(homology_basis, matrix.num_cols(d1), N)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _enumerate_from_basis(basis, l, N):
|
|
144
|
+
"""
|
|
145
|
+
Given a list of pairs `(v_i, o_i)` where each `v_i` is a vector of length l
|
|
146
|
+
and an integer N > 2, iterate through all linear combinations
|
|
147
|
+
`k_0 v_0 + k_1 v_1 + ... + k_m v_m` (modulo N) where `k_i = 0, ..., o_i`.
|
|
148
|
+
|
|
149
|
+
If basis is empty, just return zero vector of length l.
|
|
150
|
+
"""
|
|
151
|
+
|
|
152
|
+
if len(basis) == 0:
|
|
153
|
+
# Base case, return zero vector of length l
|
|
154
|
+
yield l * [ 0 ]
|
|
155
|
+
else:
|
|
156
|
+
# Take first pair (vector, order) from given list
|
|
157
|
+
basis_vector, order = basis[0]
|
|
158
|
+
# Iterate up until order
|
|
159
|
+
for i in range(order):
|
|
160
|
+
# Iterate through all linear combinations of remaining basis
|
|
161
|
+
# elements
|
|
162
|
+
for vector in _enumerate_from_basis(basis[1:], l, N):
|
|
163
|
+
# Return the linear combination of the multiple of this basis
|
|
164
|
+
# vector and the linear combination of the other basis vectors
|
|
165
|
+
yield [ (i * b + v) % N for b, v in zip(basis_vector, vector) ]
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
// Setting up the Polynomial ring and ideal
|
|
2
|
+
|
|
3
|
+
R<$VARIABLES> := PolynomialRing(RationalField(), $VARIABLE_NUMBER, "grevlex");
|
|
4
|
+
MyIdeal := ideal<R |
|
|
5
|
+
$EQUATIONS>;
|
|
6
|
+
|
|
7
|
+
// Variable names, unfortunately "Names(R)" does not work for old magma versions
|
|
8
|
+
varNames := [ $VARIABLES_QUOTED ];
|
|
9
|
+
|
|
10
|
+
// Term order in which the decomposition will be reported
|
|
11
|
+
termOrder := "lex";
|
|
12
|
+
|
|
13
|
+
// Whether to compute witnesses for 1-dim ideals
|
|
14
|
+
computeWitnesses := true;
|
|
15
|
+
|
|
16
|
+
// Whether to compute the genus for 1-dim ideals
|
|
17
|
+
computeGenuses := true;
|
|
18
|
+
|
|
19
|
+
// Data necessary to recover all Ptolemy coordinates and the triangulation
|
|
20
|
+
print $QUOTED_PREAMBLE;
|
|
21
|
+
|
|
22
|
+
// Various helper functions
|
|
23
|
+
function SaturateIdeal(baseRing, theIdeal)
|
|
24
|
+
|
|
25
|
+
print "Status: Computing Groebner basis...";
|
|
26
|
+
time Groebner(theIdeal);
|
|
27
|
+
|
|
28
|
+
for i := 1 to Rank(baseRing) do
|
|
29
|
+
saturatedIdeal := -1;
|
|
30
|
+
print "Status: Saturating ideal (", i, "/", Rank(baseRing), ")...";
|
|
31
|
+
time saturatedIdeal := Saturation(theIdeal, baseRing.i);
|
|
32
|
+
print "Status: Recomputing Groebner basis...";
|
|
33
|
+
time Groebner(saturatedIdeal);
|
|
34
|
+
theIdeal := saturatedIdeal;
|
|
35
|
+
end for;
|
|
36
|
+
|
|
37
|
+
print "Status: Dimension of ideal: ", Dimension(saturatedIdeal);
|
|
38
|
+
|
|
39
|
+
return saturatedIdeal;
|
|
40
|
+
end function;
|
|
41
|
+
|
|
42
|
+
function ZeroDimensionalIdealChangeOrder(theIdeal, order)
|
|
43
|
+
if Dimension(theIdeal) le 0 then
|
|
44
|
+
print "Status: Changing to term order ", order, "...";
|
|
45
|
+
time result := ChangeOrder(theIdeal, order);
|
|
46
|
+
print "Status: Recomputing Groebner basis...";
|
|
47
|
+
time Groebner(result);
|
|
48
|
+
print "Status: Confirming is prime...";
|
|
49
|
+
time isPrime := IsPrime(result);
|
|
50
|
+
if not isPrime then
|
|
51
|
+
print "Not prime!";
|
|
52
|
+
exit;
|
|
53
|
+
end if;
|
|
54
|
+
return result;
|
|
55
|
+
else
|
|
56
|
+
return theIdeal;
|
|
57
|
+
end if;
|
|
58
|
+
end function;
|
|
59
|
+
|
|
60
|
+
function ZeroDimensionalIdealsChangeOrder(theIdeals, order)
|
|
61
|
+
return [ ZeroDimensionalIdealChangeOrder(theIdeal, order) :
|
|
62
|
+
theIdeal in theIdeals ];
|
|
63
|
+
end function;
|
|
64
|
+
|
|
65
|
+
function FreeVariablesOfIdeal(varNames, theIdeal)
|
|
66
|
+
D, vars := Dimension(theIdeal);
|
|
67
|
+
return [ "\"" cat varNames[var] cat "\"" : var in vars];
|
|
68
|
+
end function;
|
|
69
|
+
|
|
70
|
+
function FreeVariablesOfIdeals(varNames, theIdeals)
|
|
71
|
+
return [ FreeVariablesOfIdeal(varNames, theIdeal) : theIdeal in theIdeals];
|
|
72
|
+
end function;
|
|
73
|
+
|
|
74
|
+
function IsSuitableWitness(theIdeals, theIndex, witnessIdeal)
|
|
75
|
+
if not Dimension(witnessIdeal) eq 0 then
|
|
76
|
+
return false;
|
|
77
|
+
end if;
|
|
78
|
+
for index := 1 to #theIdeals do
|
|
79
|
+
if not index eq theIndex then
|
|
80
|
+
if Dimension(theIdeals[index]) gt 0 then
|
|
81
|
+
if not Dimension(theIdeals[index] + witnessIdeal) eq -1 then
|
|
82
|
+
return false;
|
|
83
|
+
end if;
|
|
84
|
+
end if;
|
|
85
|
+
end if;
|
|
86
|
+
end for;
|
|
87
|
+
return true;
|
|
88
|
+
end function;
|
|
89
|
+
|
|
90
|
+
function IncrementList(theList)
|
|
91
|
+
for index := #theList to 1 by -1 do
|
|
92
|
+
if index eq 1 then
|
|
93
|
+
theList[1] := theList[1] + 1;
|
|
94
|
+
return theList;
|
|
95
|
+
else
|
|
96
|
+
if theList[index] lt theList[1] then
|
|
97
|
+
theList[index] := theList[index] + 1;
|
|
98
|
+
return theList;
|
|
99
|
+
else
|
|
100
|
+
theList[index] := 1;
|
|
101
|
+
end if;
|
|
102
|
+
end if;
|
|
103
|
+
end for;
|
|
104
|
+
end function;
|
|
105
|
+
|
|
106
|
+
function GenerateWitnessIdeal(baseRing, theIdeal, coordinates)
|
|
107
|
+
|
|
108
|
+
D, vars := Dimension(theIdeal);
|
|
109
|
+
|
|
110
|
+
witnessIdeal := theIdeal;
|
|
111
|
+
|
|
112
|
+
for index := 1 to #coordinates do
|
|
113
|
+
var := vars[index];
|
|
114
|
+
val := coordinates[index];
|
|
115
|
+
witnessIdeal := witnessIdeal + ideal<baseRing | baseRing.var - val>;
|
|
116
|
+
end for;
|
|
117
|
+
|
|
118
|
+
return SaturateIdeal(baseRing, witnessIdeal);
|
|
119
|
+
end function;
|
|
120
|
+
|
|
121
|
+
function FindWitness(baseRing, theIdeals, index)
|
|
122
|
+
theIdeal := theIdeals[index];
|
|
123
|
+
D, vars := Dimension(theIdeal);
|
|
124
|
+
|
|
125
|
+
if D le 0 then
|
|
126
|
+
return ideal<baseRing | >;
|
|
127
|
+
end if;
|
|
128
|
+
|
|
129
|
+
coordinates := [1: var in vars];
|
|
130
|
+
|
|
131
|
+
while true do
|
|
132
|
+
|
|
133
|
+
witnessIdeal := GenerateWitnessIdeal(baseRing, theIdeal, coordinates);
|
|
134
|
+
print "Status: Testing witness ", coordinates, "...";
|
|
135
|
+
|
|
136
|
+
time isSuitable := IsSuitableWitness(theIdeals, index, witnessIdeal);
|
|
137
|
+
if isSuitable then
|
|
138
|
+
return RadicalDecomposition(witnessIdeal)[1];
|
|
139
|
+
end if;
|
|
140
|
+
|
|
141
|
+
coordinates := IncrementList(coordinates);
|
|
142
|
+
end while;
|
|
143
|
+
end function;
|
|
144
|
+
|
|
145
|
+
function FindWitnesses(baseRing, theIdeals)
|
|
146
|
+
print "Status: Finding witnesses for non-zero dimensional ideals...";
|
|
147
|
+
return [ FindWitness(baseRing, theIdeals, index) : index in [1..#theIdeals]];
|
|
148
|
+
end function;
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
// Computations begin here
|
|
156
|
+
saturatedIdeal := SaturateIdeal(R, MyIdeal);
|
|
157
|
+
|
|
158
|
+
// Compute radical decomposition
|
|
159
|
+
print "Status: Computing RadicalDecomposition";
|
|
160
|
+
time P := RadicalDecomposition(saturatedIdeal);
|
|
161
|
+
|
|
162
|
+
print "Status: Number of components: ", #P;
|
|
163
|
+
|
|
164
|
+
print "DECOMPOSITION=TYPE: RadicalDecomposition";
|
|
165
|
+
|
|
166
|
+
// Initialize Porder to -1 so that we can check later whether an error or user
|
|
167
|
+
// interrupt happened.
|
|
168
|
+
Porder := -1;
|
|
169
|
+
|
|
170
|
+
// change 0-dim components to desired term order
|
|
171
|
+
POrder := ZeroDimensionalIdealsChangeOrder(P, termOrder);
|
|
172
|
+
|
|
173
|
+
print "IDEAL=DECOMPOSITION" cat "=TIME: ", Cputime();
|
|
174
|
+
|
|
175
|
+
if Type(POrder) eq RngIntElt then
|
|
176
|
+
// An error or user interrupt occurred, bail
|
|
177
|
+
print "IDEAL=DECOMPOSITION" cat "=FAILED";
|
|
178
|
+
exit;
|
|
179
|
+
end if;
|
|
180
|
+
|
|
181
|
+
print "IDEAL=DECOMPOSITION" cat "=BEGINS=HERE";
|
|
182
|
+
POrder;
|
|
183
|
+
print "IDEAL=DECOMPOSITION" cat "=ENDS=HERE";
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
print "FREE=VARIABLES=IN=COMPONENTS" cat "=BEGINS=HERE";
|
|
187
|
+
FreeVariablesOfIdeals(varNames, POrder);
|
|
188
|
+
print "FREE=VARIABLES=IN=COMPONENTS" cat "=ENDS=HERE";
|
|
189
|
+
|
|
190
|
+
if computeWitnesses then
|
|
191
|
+
witnesses := FindWitnesses(R, POrder);
|
|
192
|
+
|
|
193
|
+
witnessesOrder := -1;
|
|
194
|
+
witnessesOrder := ZeroDimensionalIdealsChangeOrder(witnesses, termOrder);
|
|
195
|
+
|
|
196
|
+
if Type(witnessesOrder) eq RngIntElt then
|
|
197
|
+
print "WITNESSES=FOR=COMPONENTS" cat "=FAILED";
|
|
198
|
+
exit;
|
|
199
|
+
end if;
|
|
200
|
+
|
|
201
|
+
print "==WITNESSES=FOR=COMPONENTS" cat "=BEGINS==";
|
|
202
|
+
|
|
203
|
+
for witness in witnessesOrder do
|
|
204
|
+
print "==WITNESSES=BEGINS==";
|
|
205
|
+
if not IsZero(witness) then
|
|
206
|
+
print "==WITNESS=BEGINS==";
|
|
207
|
+
witness;
|
|
208
|
+
print "==WITNESS=ENDS==";
|
|
209
|
+
end if;
|
|
210
|
+
print "==WITNESSES=ENDS==";
|
|
211
|
+
end for;
|
|
212
|
+
|
|
213
|
+
print "==WITNESSES=FOR=COMPONENTS" cat "=ENDS==";
|
|
214
|
+
end if;
|
|
215
|
+
|
|
216
|
+
if computeGenuses then
|
|
217
|
+
print "==GENUSES=FOR=COMPONENTS" cat "=BEGINS==";
|
|
218
|
+
|
|
219
|
+
for comp in POrder do
|
|
220
|
+
print "==GENUS=FOR=COMPONENT=BEGINS==";
|
|
221
|
+
D, vars := Dimension(comp);
|
|
222
|
+
if D eq 1 then
|
|
223
|
+
print Genus(Curve(AffineSpace(R), comp));
|
|
224
|
+
end if;
|
|
225
|
+
print "==GENUS=FOR=COMPONENT=ENDS==";
|
|
226
|
+
end for;
|
|
227
|
+
|
|
228
|
+
print "==GENUSES=FOR=COMPONENTS" cat "=ENDS==";
|
|
229
|
+
end if;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
|
|
2
|
+
// Setting up the Polynomial ring and ideal
|
|
3
|
+
|
|
4
|
+
R<$VARIABLES_WITH_NON_ZERO_CONDITION> := PolynomialRing(RationalField(), $VARIABLE_WITH_NON_ZERO_CONDITION_NUMBER);
|
|
5
|
+
MyIdeal := ideal<R |
|
|
6
|
+
$EQUATIONS_WITH_NON_ZERO_CONDITION>;
|
|
7
|
+
|
|
8
|
+
// N := Names(R); // unfortunately does not work for old magma versions
|
|
9
|
+
N := [ $VARIABLES_WITH_NON_ZERO_CONDITION_QUOTED ];
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
print $QUOTED_PREAMBLE;
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
// Initialize Q to -1 so that we can check whether an error happened
|
|
18
|
+
// by checking that Q is still of type integer.
|
|
19
|
+
Q := -1;
|
|
20
|
+
|
|
21
|
+
// Remember start time to calculate computation time
|
|
22
|
+
primTime := Cputime();
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
print "DECOMPOSITION=TYPE: Radicals of Primary Decomposition";
|
|
28
|
+
|
|
29
|
+
P, Q := PrimaryDecomposition(MyIdeal);
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
print "IDEAL=DECOMPOSITION" cat "=TIME: ", Cputime(primTime);
|
|
34
|
+
|
|
35
|
+
if Type(Q) eq RngIntElt then
|
|
36
|
+
// Some error occurred
|
|
37
|
+
print "IDEAL=DECOMPOSITION" cat "=FAILED";
|
|
38
|
+
exit;
|
|
39
|
+
else
|
|
40
|
+
// Success
|
|
41
|
+
print "IDEAL=DECOMPOSITION" cat "=BEGINS=HERE";
|
|
42
|
+
Q;
|
|
43
|
+
print "IDEAL=DECOMPOSITION" cat "=ENDS=HERE";
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
print "FREE=VARIABLES=IN=COMPONENTS" cat "=BEGINS=HERE";
|
|
47
|
+
isFirstComp := true;
|
|
48
|
+
freeVarStr := "[";
|
|
49
|
+
for Comp in Q do
|
|
50
|
+
|
|
51
|
+
if isFirstComp then
|
|
52
|
+
isFirstComp := false;
|
|
53
|
+
else
|
|
54
|
+
freeVarStr := freeVarStr cat ",";
|
|
55
|
+
end if;
|
|
56
|
+
freeVarStr := freeVarStr cat "\n [ ";
|
|
57
|
+
|
|
58
|
+
D, Vars := Dimension(Comp);
|
|
59
|
+
|
|
60
|
+
isFirstVar := true;
|
|
61
|
+
for Var in Vars do
|
|
62
|
+
if isFirstVar then
|
|
63
|
+
isFirstVar := false;
|
|
64
|
+
else
|
|
65
|
+
freeVarStr := freeVarStr cat ", ";
|
|
66
|
+
end if;
|
|
67
|
+
|
|
68
|
+
freeVarStr := freeVarStr cat "\"" cat N[Var] cat "\"";
|
|
69
|
+
end for;
|
|
70
|
+
|
|
71
|
+
freeVarStr := freeVarStr cat " ]";
|
|
72
|
+
end for;
|
|
73
|
+
freeVarStr := freeVarStr cat "\n]";
|
|
74
|
+
print freeVarStr;
|
|
75
|
+
print "FREE=VARIABLES=IN=COMPONENTS" cat "=ENDS=HERE";
|
|
76
|
+
end if;
|
|
77
|
+
|
|
78
|
+
print "CPUTIME: ", Cputime(primTime);
|
|
79
|
+
|