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,286 @@
|
|
|
1
|
+
from ..sage_helper import _within_sage, sage_method, SageNotAvailable
|
|
2
|
+
|
|
3
|
+
__all__ = ['field_containing_real_and_imaginary_part_of_number_field']
|
|
4
|
+
|
|
5
|
+
if _within_sage:
|
|
6
|
+
from sage.rings.rational_field import RationalField
|
|
7
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
8
|
+
from sage.rings.number_field.number_field import NumberField
|
|
9
|
+
from sage.rings.complex_interval_field import ComplexIntervalField
|
|
10
|
+
from sage.rings.real_mpfi import RealIntervalField
|
|
11
|
+
from sage.symbolic.ring import var
|
|
12
|
+
from sage.functions.other import binomial
|
|
13
|
+
from ..sage_helper import ComplexField
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class _IsolateFactorError(RuntimeError):
|
|
17
|
+
"""
|
|
18
|
+
Exception raised by _find_unique_good_factor.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _find_unique_good_factor(polynomial, eval_method):
|
|
23
|
+
"""
|
|
24
|
+
Given a Sage polynomial, factor it. Return the unique factor for which the
|
|
25
|
+
given eval_method returns an interval containing zero. If no or more than
|
|
26
|
+
one factor have this property, raise an exception.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
# Factor polynomial. Call eval_method on each factor which is supposed to
|
|
30
|
+
# return an interval. Get those factors for which the resulting interval
|
|
31
|
+
# contains 0.
|
|
32
|
+
good_factors = [ factor
|
|
33
|
+
for factor, multiplicity in polynomial.factor()
|
|
34
|
+
if 0 in eval_method(factor)]
|
|
35
|
+
|
|
36
|
+
# No unique factor, bail with an exception.
|
|
37
|
+
if not len(good_factors) == 1:
|
|
38
|
+
raise _IsolateFactorError()
|
|
39
|
+
|
|
40
|
+
return good_factors[0]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _solve_two_equations(eqn1, eqn2, x_val, y_val):
|
|
44
|
+
"""
|
|
45
|
+
Given two polynomial equations with rational coefficients in 'x' and 'y'
|
|
46
|
+
and real intervals for x and y to isolate a solution to the system of
|
|
47
|
+
equations, return the number field generated by x and the value of y in
|
|
48
|
+
that number field. If y is not contained in the number field generated
|
|
49
|
+
by x, return None.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
# Ring we work in Q[x][y]
|
|
53
|
+
Rx = PolynomialRing(RationalField(), 'x')
|
|
54
|
+
R = PolynomialRing(Rx, 'y')
|
|
55
|
+
Reqn1 = R(eqn1)
|
|
56
|
+
|
|
57
|
+
# Compute the resultant in Q[x]
|
|
58
|
+
resultant = Reqn1.resultant(R(eqn2))
|
|
59
|
+
|
|
60
|
+
# Factorize the resultant. Find the unique factor that has the given value
|
|
61
|
+
# for x as a root.
|
|
62
|
+
def eval_factor_res(p):
|
|
63
|
+
"""
|
|
64
|
+
Evaluation method for the factors of the resultant. Apply polynomial
|
|
65
|
+
to the given interval for x.
|
|
66
|
+
"""
|
|
67
|
+
return p(x_val)
|
|
68
|
+
resultant_factor = _find_unique_good_factor(resultant, eval_factor_res)
|
|
69
|
+
|
|
70
|
+
resultant_factor = Rx(resultant_factor)
|
|
71
|
+
|
|
72
|
+
# The number field generated by x.
|
|
73
|
+
#
|
|
74
|
+
# (The embedding passed to the NumberField is a real number, so sage
|
|
75
|
+
# will raise an exception if the resultant_factor has no real roots.
|
|
76
|
+
# However, such a factor should not make it through
|
|
77
|
+
# _find_unique_good_factor)
|
|
78
|
+
|
|
79
|
+
result_number_field = NumberField(resultant_factor, 'x',
|
|
80
|
+
embedding=x_val.center())
|
|
81
|
+
|
|
82
|
+
# Get one of the equations and think of it as an element in NumberField[y]
|
|
83
|
+
yEqn = Reqn1.change_ring(result_number_field)
|
|
84
|
+
|
|
85
|
+
# Factorize that equation over the NumberField. Find the unique factor
|
|
86
|
+
# such that the given value y is a root when setting x to the given value
|
|
87
|
+
# for x.
|
|
88
|
+
def eval_factor_yEqn(p):
|
|
89
|
+
"""
|
|
90
|
+
Evaluation method for the factors of the equation factored over the
|
|
91
|
+
number field. We take the factor and turn it into a polynomial in
|
|
92
|
+
Q[x][y]. We then put in the given intervals for x and y.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
lift = p.map_coefficients(lambda c:c.lift('x'), Rx)
|
|
96
|
+
return lift.substitute(x=x_val, y=y_val)
|
|
97
|
+
|
|
98
|
+
yEqn_factor = _find_unique_good_factor(yEqn, eval_factor_yEqn)
|
|
99
|
+
|
|
100
|
+
# If the equation for y in x is not of degree 1, then y is in a field
|
|
101
|
+
# extension of the number field generated by x.
|
|
102
|
+
# Bail if this happens.
|
|
103
|
+
if not yEqn_factor.degree() == 1:
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
# The equation of y is of the form
|
|
107
|
+
# linear_term * y + constant_term = 0
|
|
108
|
+
constant_term, linear_term = yEqn_factor.coefficients(sparse=False)
|
|
109
|
+
|
|
110
|
+
# Thus, y is given by - constant_term / linear_term
|
|
111
|
+
return result_number_field, - constant_term / linear_term
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _real_or_imaginary_part_of_power_of_complex_number(n, start):
|
|
115
|
+
"""
|
|
116
|
+
Let z = x + y * I.
|
|
117
|
+
If start = 0, return Re(z^n). If start = 1, return Im(z^n).
|
|
118
|
+
The result is a sage symbolic expression in x and y with rational
|
|
119
|
+
coefficients.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
# By binomial theorem, we have
|
|
123
|
+
#
|
|
124
|
+
# n n n n n-i i
|
|
125
|
+
# (x + y * I) = sum ( ) * I * x * y
|
|
126
|
+
# i = 0 i
|
|
127
|
+
#
|
|
128
|
+
# The real/imaginary part consists of all even/odd terms in the sum:
|
|
129
|
+
return sum([
|
|
130
|
+
binomial(n, i) * (-1) ** (i//2) * var('x') ** (n - i) * var('y') ** i
|
|
131
|
+
for i in range(start, n + 1, 2)])
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _real_or_imaginary_part_for_polynomial_in_complex_variable(polynomial,
|
|
135
|
+
start):
|
|
136
|
+
"""
|
|
137
|
+
Given a polynomial p with rational coefficients, return the
|
|
138
|
+
real (start = 0) / imaginary (start = 1) part of p(x + y * I).
|
|
139
|
+
|
|
140
|
+
The result is a sage symbolic expression in x and y with rational
|
|
141
|
+
coefficients.
|
|
142
|
+
"""
|
|
143
|
+
# Get the real/imaginary part of (x + y * I)^i and multiply by
|
|
144
|
+
# the corresponding coefficient of the polynomial. Sum it all up.
|
|
145
|
+
|
|
146
|
+
return sum([
|
|
147
|
+
coeff * _real_or_imaginary_part_of_power_of_complex_number(i, start)
|
|
148
|
+
for i, coeff in enumerate(polynomial.coefficients(sparse=False))])
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@sage_method
|
|
152
|
+
def field_containing_real_and_imaginary_part_of_number_field(number_field):
|
|
153
|
+
"""
|
|
154
|
+
Given a Sage number field number_field with a complex embedding z, return
|
|
155
|
+
(real_number_field, real_part, imag_part).
|
|
156
|
+
|
|
157
|
+
The number field real_number_field is the smallest number field containing
|
|
158
|
+
the real part and imaginary part of every element in number_field.
|
|
159
|
+
|
|
160
|
+
real_part and imag_part are elements in real_number_field which comes with
|
|
161
|
+
a real embedding such that under this embedding, we have
|
|
162
|
+
``z = real_part + imag_part * I``. ::
|
|
163
|
+
|
|
164
|
+
sage: CF = ComplexField()
|
|
165
|
+
sage: x = var('x')
|
|
166
|
+
sage: nf = NumberField(x**2 + 1, 'x', embedding = CF(1.0j))
|
|
167
|
+
sage: field_containing_real_and_imaginary_part_of_number_field(nf)
|
|
168
|
+
(Number Field in x with defining polynomial x with x = 0, 0, 1)
|
|
169
|
+
|
|
170
|
+
sage: nf = NumberField(x**2 + 7, 'x', embedding = CF(2.64575j))
|
|
171
|
+
sage: field_containing_real_and_imaginary_part_of_number_field(nf)
|
|
172
|
+
(Number Field in x with defining polynomial x^2 - 7 with x = 2.645751311064591?, 0, x)
|
|
173
|
+
|
|
174
|
+
sage: nf = NumberField(x**3 + x**2 + 23, 'x', embedding = CF(1.1096 + 2.4317j))
|
|
175
|
+
sage: field_containing_real_and_imaginary_part_of_number_field(nf)
|
|
176
|
+
(Number Field in x with defining polynomial x^6 + 2*x^5 + 2*x^4 - 113/2*x^3 - 229/4*x^2 - 115/4*x - 575/8 with x = 3.541338405550421?, -20/14377*x^5 + 382/14377*x^4 + 526/14377*x^3 + 1533/14377*x^2 - 18262/14377*x - 10902/14377, 20/14377*x^5 - 382/14377*x^4 - 526/14377*x^3 - 1533/14377*x^2 + 32639/14377*x + 10902/14377)
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
# Let p be the defining polynomial of the given number field.
|
|
180
|
+
# Given the one complex equation p(z) = 0, translate it into two
|
|
181
|
+
# real equations Re(p(x+y*I)) = 0, Im(p(x+y*I)) = 0.
|
|
182
|
+
# equations are sage symbolic expressions in x and y.
|
|
183
|
+
equations = [
|
|
184
|
+
_real_or_imaginary_part_for_polynomial_in_complex_variable(
|
|
185
|
+
number_field.defining_polynomial(), start)
|
|
186
|
+
for start in [0, 1]]
|
|
187
|
+
|
|
188
|
+
# In _solve_two_equations, we implemented a method that can solve
|
|
189
|
+
# a system of two polynomial equations in two variables x and y
|
|
190
|
+
# provided that y is in the number field generated by x.
|
|
191
|
+
# If we are lucky, this is the case.
|
|
192
|
+
# If we are unlucky, the number field containing x and y is generated
|
|
193
|
+
# by x' = x + k * y where k is some small natural number.
|
|
194
|
+
|
|
195
|
+
# The k mentioned above. We start with 0 and increase until we
|
|
196
|
+
# succeed.
|
|
197
|
+
k = 0
|
|
198
|
+
|
|
199
|
+
# The amount of extra precision beyond double precision we are working
|
|
200
|
+
# with. We increase it if one of the above methods fails to find the right
|
|
201
|
+
# factor of the above polynomials.
|
|
202
|
+
extra_prec = 0
|
|
203
|
+
|
|
204
|
+
# Initialize the intervals for x and y with double prescision intervals
|
|
205
|
+
CIF = ComplexIntervalField()
|
|
206
|
+
z_val = CIF(number_field.gen_embedding())
|
|
207
|
+
x_val = z_val.real()
|
|
208
|
+
y_val = z_val.imag()
|
|
209
|
+
|
|
210
|
+
# Keep trying to find a k or increase precision until we succeed
|
|
211
|
+
# Give up if k reaches 100 or we are at precision 16 times greater than
|
|
212
|
+
# that of a double
|
|
213
|
+
while k < 100 and extra_prec < 5:
|
|
214
|
+
|
|
215
|
+
# Compute the interval for x'
|
|
216
|
+
xprime_val = x_val + k * y_val
|
|
217
|
+
|
|
218
|
+
# From the equations for x and y, get the equations for x' and y
|
|
219
|
+
# where x' = x + k * y as abover
|
|
220
|
+
equations_for_xprime = [ eqn.substitute(x=var('x') - k * var('y'))
|
|
221
|
+
for eqn in equations ]
|
|
222
|
+
|
|
223
|
+
try:
|
|
224
|
+
# Try to find a solution to the two equations
|
|
225
|
+
solution = _solve_two_equations(equations_for_xprime[0],
|
|
226
|
+
equations_for_xprime[1],
|
|
227
|
+
xprime_val, y_val)
|
|
228
|
+
|
|
229
|
+
if solution:
|
|
230
|
+
# We succeeded. We have a solution for the equations in
|
|
231
|
+
# x' and y, thus, we need to do x = x' - k * y
|
|
232
|
+
real_number_field, y_expression = solution
|
|
233
|
+
x_expression = real_number_field.gen() - k * y_expression
|
|
234
|
+
return real_number_field, x_expression, y_expression
|
|
235
|
+
else:
|
|
236
|
+
# No solution found. This means that y is not in the
|
|
237
|
+
# number field generated by x'. Try a higher k in the
|
|
238
|
+
# next iteration
|
|
239
|
+
k += 1
|
|
240
|
+
|
|
241
|
+
except _IsolateFactorError:
|
|
242
|
+
# We did not use enough precision. The given intervals for
|
|
243
|
+
# x and y that are supposed to isolate a solution to the
|
|
244
|
+
# system of two equations did not have enough precision to
|
|
245
|
+
# succeed and give a unique answer.
|
|
246
|
+
|
|
247
|
+
# Double the precision we will use from now on
|
|
248
|
+
extra_prec += 1
|
|
249
|
+
|
|
250
|
+
# Recompute the intervals for x and y with the new precision.
|
|
251
|
+
CIF = ComplexIntervalField(53 * 2 ** extra_prec)
|
|
252
|
+
z_val = CIF(number_field.gen_embedding())
|
|
253
|
+
x_val = z_val.real()
|
|
254
|
+
y_val = z_val.imag()
|
|
255
|
+
|
|
256
|
+
# Give up
|
|
257
|
+
return None
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def _test_result(number_field, prec=53, epsilon=1e-10):
|
|
261
|
+
"""
|
|
262
|
+
sage: CF = ComplexField()
|
|
263
|
+
sage: x = var('x')
|
|
264
|
+
sage: nf = NumberField(x**2 + 1, 'x', embedding = CF(1.0j))
|
|
265
|
+
sage: _test_result(nf)
|
|
266
|
+
sage: nf = NumberField(x**2 + 7, 'x', embedding = CF(2.64575j))
|
|
267
|
+
sage: _test_result(nf)
|
|
268
|
+
sage: nf = NumberField(x**8 + 6 * x ** 4 + x + 23, 'x', embedding = CF(0.7747 + 1.25937j))
|
|
269
|
+
sage: _test_result(nf, 212, epsilon = 1e-30)
|
|
270
|
+
"""
|
|
271
|
+
|
|
272
|
+
CIF = ComplexIntervalField(prec)
|
|
273
|
+
RIF = RealIntervalField(prec)
|
|
274
|
+
epsilon = RIF(epsilon)
|
|
275
|
+
|
|
276
|
+
real_number_field, x_expression, y_expression = (
|
|
277
|
+
field_containing_real_and_imaginary_part_of_number_field(number_field))
|
|
278
|
+
|
|
279
|
+
x_val = x_expression.lift()(RIF(real_number_field.gen_embedding()))
|
|
280
|
+
y_val = y_expression.lift()(RIF(real_number_field.gen_embedding()))
|
|
281
|
+
z_val = CIF(x_val, y_val)
|
|
282
|
+
|
|
283
|
+
diff = z_val - CIF(number_field.gen_embedding())
|
|
284
|
+
|
|
285
|
+
if not abs(diff) < epsilon:
|
|
286
|
+
raise Exception("Test failed")
|
snappy/verify/shapes.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from . import hyperbolicity
|
|
2
|
+
|
|
3
|
+
__all__ = ['compute_hyperbolic_shapes']
|
|
4
|
+
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
def compute_hyperbolic_shapes(manifold,
|
|
8
|
+
verified : bool, bits_prec : Optional[int] = None):
|
|
9
|
+
|
|
10
|
+
# Get shapes, as intervals if requested
|
|
11
|
+
shapes = manifold.tetrahedra_shapes('rect', intervals=verified,
|
|
12
|
+
bits_prec=bits_prec)
|
|
13
|
+
|
|
14
|
+
# Check it is a valid hyperbolic structure
|
|
15
|
+
if verified:
|
|
16
|
+
hyperbolicity.check_logarithmic_gluing_equations_and_positively_oriented_tets(
|
|
17
|
+
manifold, shapes)
|
|
18
|
+
else:
|
|
19
|
+
# If not verified, just ask SnapPea kernel for solution type
|
|
20
|
+
sol_type = manifold.solution_type()
|
|
21
|
+
if not sol_type == 'all tetrahedra positively oriented':
|
|
22
|
+
raise RuntimeError(
|
|
23
|
+
"Manifold has non-geometric solution type '%s'." % sol_type)
|
|
24
|
+
|
|
25
|
+
return shapes
|