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
snappy/snap/__init__.py
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
from .shapes import polished_tetrahedra_shapes
|
|
2
|
+
from ..sage_helper import _within_sage, sage_method
|
|
3
|
+
from .polished_reps import polished_holonomy
|
|
4
|
+
from . import nsagetools, interval_reps, fox_milnor, slice_obs_HKL
|
|
5
|
+
from .character_varieties import character_variety, character_variety_ideal
|
|
6
|
+
|
|
7
|
+
if _within_sage:
|
|
8
|
+
from .find_field import ListOfApproximateAlgebraicNumbers
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@sage_method
|
|
12
|
+
def tetrahedra_field_gens(manifold):
|
|
13
|
+
"""
|
|
14
|
+
The shapes of the tetrahedra as ApproximateAlgebraicNumbers. Can be
|
|
15
|
+
used to compute the tetrahedra field, where the first two parameters
|
|
16
|
+
are bits of precision and maximum degree of the field::
|
|
17
|
+
|
|
18
|
+
sage: M = Manifold('m015')
|
|
19
|
+
sage: tets = M.tetrahedra_field_gens()
|
|
20
|
+
sage: tets.find_field(100, 10, optimize=True) # doctest: +NORMALIZE_WHITESPACE +NUMERIC9
|
|
21
|
+
(Number Field in z with defining polynomial x^3 - x - 1
|
|
22
|
+
with z = -0.6623589786223730? - 0.5622795120623013?*I,
|
|
23
|
+
<ApproxAN: -0.662358978622 - 0.562279512062*I>, [-z, -z, -z])
|
|
24
|
+
"""
|
|
25
|
+
if manifold.is_orientable():
|
|
26
|
+
def func(prec):
|
|
27
|
+
return polished_tetrahedra_shapes(manifold, bits_prec=prec)
|
|
28
|
+
else:
|
|
29
|
+
double_cover = manifold.orientation_cover()
|
|
30
|
+
|
|
31
|
+
def func(prec):
|
|
32
|
+
return polished_tetrahedra_shapes(double_cover, bits_prec=prec)[::2]
|
|
33
|
+
return ListOfApproximateAlgebraicNumbers(func)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@sage_method
|
|
37
|
+
def trace_field_gens(manifold, fundamental_group_args=[]):
|
|
38
|
+
"""
|
|
39
|
+
The generators of the trace field as ApproximateAlgebraicNumbers. Can be
|
|
40
|
+
used to compute the tetrahedra field, where the first two parameters
|
|
41
|
+
are bits of precision and maximum degree of the field::
|
|
42
|
+
|
|
43
|
+
sage: M = Manifold('m125')
|
|
44
|
+
sage: traces = M.trace_field_gens()
|
|
45
|
+
sage: traces.find_field(100, 10, optimize=True) # doctest: +NORMALIZE_WHITESPACE
|
|
46
|
+
(Number Field in z with defining polynomial x^2 + 1
|
|
47
|
+
with z = -1*I,
|
|
48
|
+
<ApproxAN: -1.0*I>, [z + 1, z, z + 1])
|
|
49
|
+
"""
|
|
50
|
+
def func(prec):
|
|
51
|
+
return polished_holonomy(manifold, prec,
|
|
52
|
+
fundamental_group_args).trace_field_generators()
|
|
53
|
+
return ListOfApproximateAlgebraicNumbers(func)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@sage_method
|
|
57
|
+
def invariant_trace_field_gens(manifold, fundamental_group_args=[]):
|
|
58
|
+
"""
|
|
59
|
+
The generators of the trace field as ApproximateAlgebraicNumbers. Can be
|
|
60
|
+
used to compute the tetrahedra field, where the first two parameters
|
|
61
|
+
are bits of precision and maximum degree of the field::
|
|
62
|
+
|
|
63
|
+
sage: M = Manifold('m007(3,1)')
|
|
64
|
+
sage: K = M.invariant_trace_field_gens().find_field(100, 10, optimize=True)[0]
|
|
65
|
+
sage: L = M.trace_field_gens().find_field(100, 10, optimize=True)[0]
|
|
66
|
+
sage: K.polynomial(), L.polynomial()
|
|
67
|
+
(x^2 - x + 1, x^4 - 2*x^3 + x^2 + 6*x + 3)
|
|
68
|
+
"""
|
|
69
|
+
def func(prec):
|
|
70
|
+
return polished_holonomy(manifold, prec,
|
|
71
|
+
fundamental_group_args).invariant_trace_field_generators()
|
|
72
|
+
return ListOfApproximateAlgebraicNumbers(func)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@sage_method
|
|
76
|
+
def holonomy_matrix_entries(manifold,
|
|
77
|
+
fundamental_group_args=[],
|
|
78
|
+
match_kernel=True):
|
|
79
|
+
"""
|
|
80
|
+
The entries of the matrices of the holonomy representation as list
|
|
81
|
+
of ApproximateAlgebraicNumbers (four consecutive numbers per
|
|
82
|
+
matrix). Setting match_kernel=False typically reduces the size of
|
|
83
|
+
the field, though it may still be larger than the trace field when
|
|
84
|
+
the manifold is closed.::
|
|
85
|
+
|
|
86
|
+
sage: M = Manifold("m004")
|
|
87
|
+
sage: mat_entries = M.holonomy_matrix_entries(match_kernel=False) # doctest: +NORMALIZE_WHITESPACE +NUMERIC9
|
|
88
|
+
sage: mat_entries
|
|
89
|
+
<SetOfAAN: [0.5 + 0.8660254037844386*I, 0.5 - 0.8660254037844386*I, 0.5 + 0.8660254037844386*I, 1.0 - 1.7320508075688772*I, 1.0 - 3.4641016151377544*I, -2.0 + 1.7320508075688772*I, -1.0 - 1.7320508075688772*I, 1.7320508075688772*I]>
|
|
90
|
+
sage: K = mat_entries.find_field(100, 10, optimize = True)[0]
|
|
91
|
+
sage: K.polynomial()
|
|
92
|
+
x^2 - x + 1
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
def func(prec):
|
|
96
|
+
G = polished_holonomy(manifold,
|
|
97
|
+
prec,
|
|
98
|
+
fundamental_group_args=fundamental_group_args,
|
|
99
|
+
match_kernel=match_kernel)
|
|
100
|
+
return sum( [G.SL2C(g).list() for g in G.generators()], [])
|
|
101
|
+
return ListOfApproximateAlgebraicNumbers(func)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def add_methods(mfld_class, hyperbolic=True):
|
|
105
|
+
mfld_class.alexander_polynomial = nsagetools.alexander_polynomial
|
|
106
|
+
mfld_class.homological_longitude = nsagetools.homological_longitude
|
|
107
|
+
mfld_class.slice_obstruction_HKL = slice_obs_HKL.slice_obstruction_HKL
|
|
108
|
+
mfld_class.fox_milnor_test = fox_milnor.fox_milnor_test
|
|
109
|
+
if hyperbolic:
|
|
110
|
+
mfld_class.polished_holonomy = polished_holonomy
|
|
111
|
+
mfld_class.tetrahedra_field_gens = tetrahedra_field_gens
|
|
112
|
+
mfld_class.trace_field_gens = trace_field_gens
|
|
113
|
+
mfld_class.invariant_trace_field_gens = invariant_trace_field_gens
|
|
114
|
+
mfld_class.holonomy_matrix_entries = holonomy_matrix_entries
|
|
115
|
+
mfld_class.hyperbolic_torsion = nsagetools.hyperbolic_torsion
|
|
116
|
+
mfld_class.hyperbolic_adjoint_torsion = nsagetools.hyperbolic_adjoint_torsion
|
|
117
|
+
mfld_class.hyperbolic_SLN_torsion = nsagetools.hyperbolic_SLN_torsion
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Computing the defining equations of the SL(2, C) character variety
|
|
3
|
+
in terms of the trace coordinates.
|
|
4
|
+
|
|
5
|
+
Code contributed by Jean-Philippe Burelle
|
|
6
|
+
|
|
7
|
+
based on: https://arxiv.org/abs/1703.08241
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from ..pari import pari
|
|
11
|
+
import string
|
|
12
|
+
from itertools import combinations, combinations_with_replacement, product
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def cycle_sort(l):
|
|
16
|
+
"""
|
|
17
|
+
Utility function which takes a list l and returns the minimum
|
|
18
|
+
for the alphabetical order among all cyclic permutations of the list.
|
|
19
|
+
"""
|
|
20
|
+
s = l
|
|
21
|
+
for i in range(0,len(l)):
|
|
22
|
+
temp = l[i:] + l[0:i]
|
|
23
|
+
if temp < s:
|
|
24
|
+
s = temp
|
|
25
|
+
return s
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def pari_poly_variable(variable_name):
|
|
29
|
+
"""
|
|
30
|
+
Ensures that PARI has the requested polynomial variable defined.
|
|
31
|
+
If "variable_name" is already defined in PARI as something else,
|
|
32
|
+
an exception is raised.
|
|
33
|
+
|
|
34
|
+
>>> val = 3*pari_poly_variable('silly')**2; val
|
|
35
|
+
3*silly^2
|
|
36
|
+
>>> ten = pari('silly = 10')
|
|
37
|
+
>>> pari_poly_variable('silly')
|
|
38
|
+
Traceback (most recent call last):
|
|
39
|
+
...
|
|
40
|
+
RuntimeError: In PARI, "silly" is already defined
|
|
41
|
+
"""
|
|
42
|
+
p = pari(variable_name)
|
|
43
|
+
success = p.type() == 't_POL' and p.variables() == [p]
|
|
44
|
+
if not success:
|
|
45
|
+
raise RuntimeError('In PARI, "%s" is already defined' % variable_name)
|
|
46
|
+
return p
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class TracePolynomialRing():
|
|
50
|
+
"""
|
|
51
|
+
>>> S = TracePolynomialRing('ab')
|
|
52
|
+
>>> S.var_names
|
|
53
|
+
['Ta', 'Tb', 'Tab']
|
|
54
|
+
>>> R = TracePolynomialRing('abc')
|
|
55
|
+
>>> R.var_names
|
|
56
|
+
['Ta', 'Tb', 'Tc', 'Tab', 'Tac', 'Tbc', 'Tabc']
|
|
57
|
+
>>> R('Ta*Tb')
|
|
58
|
+
Tb*Ta
|
|
59
|
+
"""
|
|
60
|
+
def __init__(self, gens):
|
|
61
|
+
self._set_var_names(gens)
|
|
62
|
+
self.vars = [pari_poly_variable(v) for v in self.var_names]
|
|
63
|
+
|
|
64
|
+
def _set_var_names(self, gens):
|
|
65
|
+
if (len(set(gens)) != len(gens) or
|
|
66
|
+
not set(gens).issubset(string.ascii_lowercase)):
|
|
67
|
+
raise ValueError('Generators are unsuitable')
|
|
68
|
+
poly_vars = list(gens) + list(combinations(gens, 2))
|
|
69
|
+
poly_vars += list(combinations(gens, 3))
|
|
70
|
+
self.var_names = ['T' + ''.join(v) for v in poly_vars]
|
|
71
|
+
|
|
72
|
+
def __call__(self, poly):
|
|
73
|
+
return pari(poly)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class Word():
|
|
77
|
+
"""
|
|
78
|
+
The Word class is used to make objects which represent words in a
|
|
79
|
+
free group. The words are represented by a string of letters, with
|
|
80
|
+
capital letters standing for inverses. ex: 'abAB'. The string is
|
|
81
|
+
contained in the 'letters' attribute of the class.
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
def __init__(self,letters):
|
|
85
|
+
"""Creates a Word from a string, automatically reduces"""
|
|
86
|
+
if isinstance(letters, Word):
|
|
87
|
+
s = letters.letters
|
|
88
|
+
else:
|
|
89
|
+
s = letters
|
|
90
|
+
# As long as the word is not reduced, delete all substrings xX or Xx
|
|
91
|
+
while not self.is_reduced(s):
|
|
92
|
+
for i,j in zip(s,s[1:]):
|
|
93
|
+
if i != j and (i == j.upper() or i == j.lower()):
|
|
94
|
+
s = s.replace(i + j,"")
|
|
95
|
+
self.letters = s
|
|
96
|
+
|
|
97
|
+
def __repr__(self):
|
|
98
|
+
return self.letters
|
|
99
|
+
|
|
100
|
+
def __mul__(self,other):
|
|
101
|
+
return Word(self.letters+other.letters)
|
|
102
|
+
|
|
103
|
+
def inverse(self):
|
|
104
|
+
return Word(self.letters.swapcase()[::-1])
|
|
105
|
+
|
|
106
|
+
def is_reduced(self,s):
|
|
107
|
+
"""Returns true if and only if the string s represents a reduced word"""
|
|
108
|
+
for i,j in zip(s,s[1:]):
|
|
109
|
+
if i != j and (i == j.upper() or i == j.lower()):
|
|
110
|
+
break
|
|
111
|
+
else:
|
|
112
|
+
return True
|
|
113
|
+
return False
|
|
114
|
+
|
|
115
|
+
def SL2_trace(self):
|
|
116
|
+
"""
|
|
117
|
+
Returns the simplified SL(2) trace of the Word represented by this
|
|
118
|
+
object. The format of the output is a Pari polynomial in the
|
|
119
|
+
variables Tw where w is a word of length 3 or less
|
|
120
|
+
|
|
121
|
+
Examples:
|
|
122
|
+
>>> Word("a").SL2_trace()
|
|
123
|
+
Ta
|
|
124
|
+
>>> Word("A").SL2_trace()
|
|
125
|
+
Ta
|
|
126
|
+
>>> Word("aa").SL2_trace()
|
|
127
|
+
Ta^2 - 2
|
|
128
|
+
>>> Word("abAB").SL2_trace()
|
|
129
|
+
Ta^2 - Tab*Tb*Ta + (Tb^2 + (Tab^2 - 2))
|
|
130
|
+
>>> Word("abca").SL2_trace()
|
|
131
|
+
Tabc*Ta - Tbc
|
|
132
|
+
"""
|
|
133
|
+
if self.letters == "":
|
|
134
|
+
return pari("2") # The SL(2,C) trace of the identity word is 2.
|
|
135
|
+
|
|
136
|
+
# Cyclically permute the letters until they are minimal for the
|
|
137
|
+
# lexicographic ordering.
|
|
138
|
+
s = cycle_sort(self.letters)
|
|
139
|
+
|
|
140
|
+
# Reduction of traces when there is a repeated letter
|
|
141
|
+
for L in sorted(set(s)):
|
|
142
|
+
i = s.find(L)
|
|
143
|
+
j = s.find(L, i + 1)
|
|
144
|
+
if j > i:
|
|
145
|
+
w1 = s[i:j]
|
|
146
|
+
w2 = s[j: ] + s[:i]
|
|
147
|
+
return tr(Word(w1))*tr(Word(w2)) - tr(Word(w1).inverse()*Word(w2))
|
|
148
|
+
|
|
149
|
+
# Reduction of traces with inverses
|
|
150
|
+
for i in s:
|
|
151
|
+
if i.isupper():
|
|
152
|
+
[w1,c,w2] = s.partition(i)
|
|
153
|
+
return (Word(i.lower()).SL2_trace()*Word(w2+w1).SL2_trace()
|
|
154
|
+
- Word(w1+i.lower()+w2).SL2_trace())
|
|
155
|
+
|
|
156
|
+
# Reductions of traces of length larger than 4
|
|
157
|
+
if len(s) >= 4:
|
|
158
|
+
[x,y,z,w] = [s[0],s[1],s[2],s[3:]]
|
|
159
|
+
return (pari("1/2")*(tr(Word(x))*tr(Word(y))*tr(Word(z))*tr(Word(w))
|
|
160
|
+
+ tr(Word(x))*tr(Word(y+z+w)) + tr(Word(y))*tr(Word(x+z+w))
|
|
161
|
+
+ tr(Word(z))*tr(Word(x+y+w)) + tr(Word(w))*tr(Word(x+y+z))
|
|
162
|
+
- tr(Word(x+z))*tr(Word(y+w)) + tr(Word(x+w))*tr(Word(y+z))
|
|
163
|
+
+ tr(Word(x+y))*tr(Word(z+w))
|
|
164
|
+
- tr(Word(x))*tr(Word(y))*tr(Word(z+w))
|
|
165
|
+
- tr(Word(x))*tr(Word(w))*tr(Word(y+z))
|
|
166
|
+
- tr(Word(y))*tr(Word(z))*tr(Word(x+w))
|
|
167
|
+
- tr(Word(z))*tr(Word(w))*tr(Word(x+y))))
|
|
168
|
+
|
|
169
|
+
# If the word is length 3 but not lexicographically sorted, we use a
|
|
170
|
+
# trace identity to express it in terms of lexicographically
|
|
171
|
+
# ordered words
|
|
172
|
+
if len(s) == 3 and s != ''.join(sorted(s)):
|
|
173
|
+
[x,y,z] = s
|
|
174
|
+
return (-Word(x+z+y).SL2_trace()
|
|
175
|
+
+ Word(x).SL2_trace()*Word(y+z).SL2_trace()
|
|
176
|
+
+ Word(y).SL2_trace()*Word(x+z).SL2_trace()
|
|
177
|
+
+ Word(z).SL2_trace()*Word(x+y).SL2_trace()
|
|
178
|
+
- Word(x).SL2_trace()*Word(y).SL2_trace()*Word(z).SL2_trace())
|
|
179
|
+
|
|
180
|
+
# Output the trace if is one of the generators (length 3 or less,
|
|
181
|
+
# alphabetical order)
|
|
182
|
+
if len(s) <= 3 and s.islower():
|
|
183
|
+
return pari("T"+s)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def tr(w):
|
|
187
|
+
"""Shortcut for the SL2_trace method of a word object"""
|
|
188
|
+
return w.SL2_trace()
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class Presentation():
|
|
192
|
+
"""
|
|
193
|
+
Class representing a presentation of a finitely presented group.
|
|
194
|
+
gens is a list of Word objects representing the generators
|
|
195
|
+
rels is a list of Word objects representing the relations.
|
|
196
|
+
"""
|
|
197
|
+
def __init__(self,G,R):
|
|
198
|
+
"""Creates a Presentation from G:generators and R:relations"""
|
|
199
|
+
self.gens = G
|
|
200
|
+
self.rels = R
|
|
201
|
+
|
|
202
|
+
def __repr__(self):
|
|
203
|
+
r = ''
|
|
204
|
+
for w in self.rels:
|
|
205
|
+
r += ('\n' + str(w))
|
|
206
|
+
return "Generators\n" + str(self.gens) + "\n"+"Relations" + r
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
############################
|
|
210
|
+
# Relations in the character variety
|
|
211
|
+
|
|
212
|
+
def mult_traceless(a1,a2,a3=None):
|
|
213
|
+
"""
|
|
214
|
+
Takes 2 or 3 words and returns the trace of their product after
|
|
215
|
+
making them traceless via M-> M-1/2tr(M)*I.
|
|
216
|
+
"""
|
|
217
|
+
if a3 is None:
|
|
218
|
+
return tr(a1*a2)-pari("1/2")*tr(a1)*tr(a2)
|
|
219
|
+
else:
|
|
220
|
+
return (pari("5/8")*tr(a1)*tr(a2)*tr(a3) - pari("1/2")*tr(a3)*tr(a1*a2)
|
|
221
|
+
- pari("1/2")*tr(a2)*tr(a1*a3) - pari("1/2")*tr(a1)*tr(a2*a3)
|
|
222
|
+
+ tr(a1*a2*a3))
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def s3(a1,a2,a3):
|
|
226
|
+
"""
|
|
227
|
+
Accessory function to sum (with sign) "mult_traceless" over all
|
|
228
|
+
permutations of three arguments. Used in defining rel1.
|
|
229
|
+
"""
|
|
230
|
+
return (mult_traceless(a1,a2,a3) + mult_traceless(a2,a3,a1)
|
|
231
|
+
+ mult_traceless(a3,a1,a2) - mult_traceless(a1,a3,a2)
|
|
232
|
+
- mult_traceless(a3,a2,a1) - mult_traceless(a2,a1,a3))
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def det(M):
|
|
236
|
+
"""Determinant of a 3x3 matrix"""
|
|
237
|
+
return (M[0][0]*M[1][1]*M[2][2] + M[0][1]*M[1][2]*M[2][0]
|
|
238
|
+
+ M[1][0]*M[2][1]*M[0][2] - M[0][2]*M[1][1]*M[2][0]
|
|
239
|
+
- M[0][1]*M[1][0]*M[2][2] - M[0][0]*M[1][2]*M[2][1])
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def rel1(i):
|
|
243
|
+
"""Generates type 1 relations for generators (words) i1,i2,i3 j1,j2,j3"""
|
|
244
|
+
[[i1,i2,i3],[j1,j2,j3]] = i
|
|
245
|
+
return (s3(i1,i2,i3)*s3(j1,j2,j3) + 18*det(
|
|
246
|
+
[[mult_traceless(i1,j1),mult_traceless(i1,j2),mult_traceless(i1,j3)],
|
|
247
|
+
[mult_traceless(i2,j1),mult_traceless(i2,j2),mult_traceless(i2,j3)],
|
|
248
|
+
[mult_traceless(i3,j1),mult_traceless(i3,j2),mult_traceless(i3,j3)]]))
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def rel2(j):
|
|
252
|
+
"""Generates type 2 relations for generators (words) i,p0,p1,p2,p3"""
|
|
253
|
+
[i,[p0,p1,p2,p3]] = j
|
|
254
|
+
return (mult_traceless(i,p0)*s3(p1,p2,p3)
|
|
255
|
+
- mult_traceless(i,p1)*s3(p0,p2,p3)
|
|
256
|
+
+ mult_traceless(i,p2)*s3(p0,p1,p3) - mult_traceless(i,p3)*s3(p0,p1,p2))
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def rels_from_rel(R, G):
|
|
260
|
+
"""
|
|
261
|
+
Returns the relations in the character variety coming from a relation
|
|
262
|
+
in the group presentation. The input is:
|
|
263
|
+
|
|
264
|
+
R - a word object, the relation in the group
|
|
265
|
+
G - a list of words, the set of generators of the group
|
|
266
|
+
"""
|
|
267
|
+
relations = [tr(R*g)-tr(g) for g in G]
|
|
268
|
+
relations = relations + [tr(R)-tr(Word(""))]
|
|
269
|
+
return [r for r in relations if r != 0]
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def character_variety(gens, rels=None):
|
|
273
|
+
"""
|
|
274
|
+
Takes a list of generators and relators, either as Words or as
|
|
275
|
+
plain strings, and returns a Presentation object containing
|
|
276
|
+
generators and relations for the SL(2, C) character variety of the
|
|
277
|
+
group generated by gens and with relations rels. You can also give
|
|
278
|
+
a SnapPy fundamental group as the sole argument.
|
|
279
|
+
|
|
280
|
+
Examples:
|
|
281
|
+
|
|
282
|
+
>>> character_variety([Word("a"),Word("b")],[Word("aba")])
|
|
283
|
+
Generators
|
|
284
|
+
[Ta, Tb, Tab]
|
|
285
|
+
Relations
|
|
286
|
+
Tab*Ta^2 + (-Tb - 1)*Ta - Tab
|
|
287
|
+
-Tb + (Tab^2 - 2)
|
|
288
|
+
Tab*Ta + (-Tb - 2)
|
|
289
|
+
>>> character_variety(["a","b"],["abAB"])
|
|
290
|
+
Generators
|
|
291
|
+
[Ta, Tb, Tab]
|
|
292
|
+
Relations
|
|
293
|
+
Ta^3 - Tab*Tb*Ta^2 + (Tb^2 + (Tab^2 - 4))*Ta
|
|
294
|
+
Ta^2 - Tab*Tb*Ta + (Tb^2 + (Tab^2 - 4))
|
|
295
|
+
>>> character_variety("abc",[])
|
|
296
|
+
Generators
|
|
297
|
+
[Ta, Tb, Tc, Tab, Tac, Tbc, Tabc]
|
|
298
|
+
Relations
|
|
299
|
+
36*Ta^2 + ((-36*Tab + 36*Tabc*Tc)*Tb + (-36*Tac*Tc - 36*Tabc*Tbc))*Ta + (36*Tb^2 + (-36*Tbc*Tc - 36*Tabc*Tac)*Tb + (36*Tab^2 + (-36*Tabc*Tc + 36*Tbc*Tac)*Tab + (36*Tc^2 + (36*Tac^2 + (36*Tbc^2 + (36*Tabc^2 - 144))))))
|
|
300
|
+
>>> len(character_variety("abcd",[]).rels)
|
|
301
|
+
14
|
|
302
|
+
|
|
303
|
+
>>> character_variety("xy",["xy"])
|
|
304
|
+
Generators
|
|
305
|
+
[Tx, Ty, Txy]
|
|
306
|
+
Relations
|
|
307
|
+
(Txy - 1)*Tx - Ty
|
|
308
|
+
-Tx + (Txy - 1)*Ty
|
|
309
|
+
Txy - 2
|
|
310
|
+
|
|
311
|
+
>>> H = Manifold('dLQacccbjkg') # Hopf link exterior.
|
|
312
|
+
>>> character_variety(H.fundamental_group()) # Answer copied from above.
|
|
313
|
+
Generators
|
|
314
|
+
[Ta, Tb, Tab]
|
|
315
|
+
Relations
|
|
316
|
+
Ta^3 - Tab*Tb*Ta^2 + (Tb^2 + (Tab^2 - 4))*Ta
|
|
317
|
+
Ta^2 - Tab*Tb*Ta + (Tb^2 + (Tab^2 - 4))
|
|
318
|
+
|
|
319
|
+
>>> G = Manifold('L6a5').fundamental_group()
|
|
320
|
+
>>> V = character_variety(G)
|
|
321
|
+
>>> len(V.gens), len(V.rels)
|
|
322
|
+
(7, 9)
|
|
323
|
+
|
|
324
|
+
"""
|
|
325
|
+
if rels is None: # SnapPy group
|
|
326
|
+
G = gens
|
|
327
|
+
gens, rels = G.generators(), G.relators()
|
|
328
|
+
gens = [Word(gen) for gen in gens]
|
|
329
|
+
rels = [Word(R) for R in rels]
|
|
330
|
+
ring = TracePolynomialRing([g.letters for g in gens])
|
|
331
|
+
|
|
332
|
+
# Type 1
|
|
333
|
+
triples = list(combinations(gens,3))
|
|
334
|
+
pairsoftriples = list(combinations_with_replacement(triples,2))
|
|
335
|
+
|
|
336
|
+
t1 = [rel1(i) for i in pairsoftriples]
|
|
337
|
+
|
|
338
|
+
# Type 2
|
|
339
|
+
fours = list(combinations(gens,4))
|
|
340
|
+
indices = product(gens,fours)
|
|
341
|
+
|
|
342
|
+
t2 = [rel2(j) for j in indices]
|
|
343
|
+
|
|
344
|
+
# Relations from relations
|
|
345
|
+
r = []
|
|
346
|
+
for R in rels:
|
|
347
|
+
r += rels_from_rel(R,gens)
|
|
348
|
+
|
|
349
|
+
return Presentation(ring.vars, t1+t2+r)
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def character_variety_ideal(gens, rels=None):
|
|
353
|
+
"""
|
|
354
|
+
sage: M = Manifold('m004')
|
|
355
|
+
sage: I = character_variety_ideal(M.fundamental_group())
|
|
356
|
+
sage: I.dimension()
|
|
357
|
+
1
|
|
358
|
+
sage: len(I.radical().primary_decomposition())
|
|
359
|
+
2
|
|
360
|
+
"""
|
|
361
|
+
presentation = character_variety(gens, rels)
|
|
362
|
+
from ..sage_helper import PolynomialRing, QQ
|
|
363
|
+
R = PolynomialRing(QQ, [repr(v) for v in presentation.gens])
|
|
364
|
+
return R.ideal([R(p) for p in presentation.rels])
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
def total_answer_length(I):
|
|
368
|
+
return sum([len(list(p)) for p in I.gens()])
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
if __name__ == "__main__":
|
|
372
|
+
from snappy.testing import doctest_modules
|
|
373
|
+
import sys
|
|
374
|
+
current_module = sys.modules[__name__]
|
|
375
|
+
doctest_modules([current_module])
|