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.
Files changed (541) hide show
  1. snappy/CyOpenGL.cpython-310-aarch64-linux-gnu.so +0 -0
  2. snappy/SnapPy.cpython-310-aarch64-linux-gnu.so +0 -0
  3. snappy/SnapPy.ico +0 -0
  4. snappy/SnapPy.png +0 -0
  5. snappy/SnapPyHP.cpython-310-aarch64-linux-gnu.so +0 -0
  6. snappy/__init__.py +534 -0
  7. snappy/app.py +604 -0
  8. snappy/app_menus.py +372 -0
  9. snappy/browser.py +998 -0
  10. snappy/cache.py +25 -0
  11. snappy/canonical.py +249 -0
  12. snappy/cusps/__init__.py +280 -0
  13. snappy/cusps/cusp_area_matrix.py +98 -0
  14. snappy/cusps/cusp_areas_from_matrix.py +96 -0
  15. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  16. snappy/cusps/short_slopes_for_cusp.py +217 -0
  17. snappy/cusps/test.py +22 -0
  18. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  19. snappy/database.py +454 -0
  20. snappy/db_utilities.py +79 -0
  21. snappy/decorated_isosig.py +717 -0
  22. snappy/dev/__init__.py +0 -0
  23. snappy/dev/extended_ptolemy/__init__.py +8 -0
  24. snappy/dev/extended_ptolemy/closed.py +106 -0
  25. snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
  26. snappy/dev/extended_ptolemy/direct.py +42 -0
  27. snappy/dev/extended_ptolemy/extended.py +406 -0
  28. snappy/dev/extended_ptolemy/giac_helper.py +43 -0
  29. snappy/dev/extended_ptolemy/giac_rur.py +129 -0
  30. snappy/dev/extended_ptolemy/gluing.py +46 -0
  31. snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
  32. snappy/dev/extended_ptolemy/printMatrices.py +70 -0
  33. snappy/dev/vericlosed/__init__.py +1 -0
  34. snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
  35. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
  36. snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
  37. snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
  38. snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
  39. snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
  40. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
  41. snappy/dev/vericlosed/orb/__init__.py +1 -0
  42. snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
  43. snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
  44. snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
  45. snappy/dev/vericlosed/test.py +54 -0
  46. snappy/dev/vericlosed/truncatedComplex.py +176 -0
  47. snappy/dev/vericlosed/verificationError.py +58 -0
  48. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
  49. snappy/doc/_images/SnapPy-196.png +0 -0
  50. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  51. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  52. snappy/doc/_images/mac.png +0 -0
  53. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  54. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  55. snappy/doc/_images/plink-action.png +0 -0
  56. snappy/doc/_images/ubuntu.png +0 -0
  57. snappy/doc/_images/win7.png +0 -0
  58. snappy/doc/_sources/additional_classes.rst.txt +40 -0
  59. snappy/doc/_sources/bugs.rst.txt +14 -0
  60. snappy/doc/_sources/censuses.rst.txt +52 -0
  61. snappy/doc/_sources/credits.rst.txt +81 -0
  62. snappy/doc/_sources/development.rst.txt +261 -0
  63. snappy/doc/_sources/index.rst.txt +215 -0
  64. snappy/doc/_sources/installing.rst.txt +249 -0
  65. snappy/doc/_sources/manifold.rst.txt +6 -0
  66. snappy/doc/_sources/manifoldhp.rst.txt +46 -0
  67. snappy/doc/_sources/news.rst.txt +425 -0
  68. snappy/doc/_sources/other.rst.txt +25 -0
  69. snappy/doc/_sources/platonic_census.rst.txt +20 -0
  70. snappy/doc/_sources/plink.rst.txt +102 -0
  71. snappy/doc/_sources/ptolemy.rst.txt +66 -0
  72. snappy/doc/_sources/ptolemy_classes.rst.txt +42 -0
  73. snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -0
  74. snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -0
  75. snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -0
  76. snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -0
  77. snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -0
  78. snappy/doc/_sources/screenshots.rst.txt +21 -0
  79. snappy/doc/_sources/snap.rst.txt +87 -0
  80. snappy/doc/_sources/snappy.rst.txt +28 -0
  81. snappy/doc/_sources/spherogram.rst.txt +103 -0
  82. snappy/doc/_sources/todo.rst.txt +47 -0
  83. snappy/doc/_sources/triangulation.rst.txt +11 -0
  84. snappy/doc/_sources/tutorial.rst.txt +49 -0
  85. snappy/doc/_sources/verify.rst.txt +210 -0
  86. snappy/doc/_sources/verify_internals.rst.txt +79 -0
  87. snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
  88. snappy/doc/_static/SnapPy.ico +0 -0
  89. snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  90. snappy/doc/_static/basic.css +906 -0
  91. snappy/doc/_static/css/badge_only.css +1 -0
  92. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  93. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  94. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  95. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  96. snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
  97. snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  98. snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  99. snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
  100. snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  101. snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
  102. snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  103. snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
  104. snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
  105. snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
  106. snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  107. snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
  108. snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
  109. snappy/doc/_static/css/theme.css +4 -0
  110. snappy/doc/_static/doctools.js +149 -0
  111. snappy/doc/_static/documentation_options.js +13 -0
  112. snappy/doc/_static/file.png +0 -0
  113. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  114. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  115. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  116. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  117. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  118. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  119. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  120. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  121. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  122. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  123. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  124. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  125. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  126. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  127. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  128. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  129. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  130. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  131. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  132. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  133. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  134. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  135. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  136. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  137. snappy/doc/_static/jquery.js +2 -0
  138. snappy/doc/_static/js/badge_only.js +1 -0
  139. snappy/doc/_static/js/theme.js +1 -0
  140. snappy/doc/_static/js/versions.js +228 -0
  141. snappy/doc/_static/language_data.js +192 -0
  142. snappy/doc/_static/minus.png +0 -0
  143. snappy/doc/_static/plus.png +0 -0
  144. snappy/doc/_static/pygments.css +75 -0
  145. snappy/doc/_static/searchtools.js +635 -0
  146. snappy/doc/_static/snappy_furo.css +33 -0
  147. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
  148. snappy/doc/_static/sphinx_highlight.js +154 -0
  149. snappy/doc/additional_classes.html +1500 -0
  150. snappy/doc/bugs.html +132 -0
  151. snappy/doc/censuses.html +453 -0
  152. snappy/doc/credits.html +184 -0
  153. snappy/doc/development.html +385 -0
  154. snappy/doc/doc-latest/additional_classes.html +1500 -0
  155. snappy/doc/doc-latest/bugs.html +132 -0
  156. snappy/doc/doc-latest/censuses.html +453 -0
  157. snappy/doc/doc-latest/credits.html +184 -0
  158. snappy/doc/doc-latest/development.html +385 -0
  159. snappy/doc/doc-latest/genindex.html +1349 -0
  160. snappy/doc/doc-latest/index.html +287 -0
  161. snappy/doc/doc-latest/installing.html +346 -0
  162. snappy/doc/doc-latest/manifold.html +3632 -0
  163. snappy/doc/doc-latest/manifoldhp.html +180 -0
  164. snappy/doc/doc-latest/news.html +438 -0
  165. snappy/doc/doc-latest/objects.inv +0 -0
  166. snappy/doc/doc-latest/other.html +160 -0
  167. snappy/doc/doc-latest/platonic_census.html +376 -0
  168. snappy/doc/doc-latest/plink.html +210 -0
  169. snappy/doc/doc-latest/ptolemy.html +253 -0
  170. snappy/doc/doc-latest/ptolemy_classes.html +1144 -0
  171. snappy/doc/doc-latest/ptolemy_examples1.html +409 -0
  172. snappy/doc/doc-latest/ptolemy_examples2.html +471 -0
  173. snappy/doc/doc-latest/ptolemy_examples3.html +414 -0
  174. snappy/doc/doc-latest/ptolemy_examples4.html +195 -0
  175. snappy/doc/doc-latest/ptolemy_prelim.html +248 -0
  176. snappy/doc/doc-latest/py-modindex.html +165 -0
  177. snappy/doc/doc-latest/screenshots.html +141 -0
  178. snappy/doc/doc-latest/search.html +135 -0
  179. snappy/doc/doc-latest/searchindex.js +1 -0
  180. snappy/doc/doc-latest/snap.html +202 -0
  181. snappy/doc/doc-latest/snappy.html +181 -0
  182. snappy/doc/doc-latest/spherogram.html +1346 -0
  183. snappy/doc/doc-latest/todo.html +166 -0
  184. snappy/doc/doc-latest/triangulation.html +1676 -0
  185. snappy/doc/doc-latest/tutorial.html +159 -0
  186. snappy/doc/doc-latest/verify.html +330 -0
  187. snappy/doc/doc-latest/verify_internals.html +1235 -0
  188. snappy/doc/genindex.html +1349 -0
  189. snappy/doc/index.html +287 -0
  190. snappy/doc/installing.html +346 -0
  191. snappy/doc/manifold.html +3632 -0
  192. snappy/doc/manifoldhp.html +180 -0
  193. snappy/doc/news.html +438 -0
  194. snappy/doc/objects.inv +0 -0
  195. snappy/doc/other.html +160 -0
  196. snappy/doc/platonic_census.html +376 -0
  197. snappy/doc/plink.html +210 -0
  198. snappy/doc/ptolemy.html +253 -0
  199. snappy/doc/ptolemy_classes.html +1144 -0
  200. snappy/doc/ptolemy_examples1.html +409 -0
  201. snappy/doc/ptolemy_examples2.html +471 -0
  202. snappy/doc/ptolemy_examples3.html +414 -0
  203. snappy/doc/ptolemy_examples4.html +195 -0
  204. snappy/doc/ptolemy_prelim.html +248 -0
  205. snappy/doc/py-modindex.html +165 -0
  206. snappy/doc/screenshots.html +141 -0
  207. snappy/doc/search.html +135 -0
  208. snappy/doc/searchindex.js +1 -0
  209. snappy/doc/snap.html +202 -0
  210. snappy/doc/snappy.html +181 -0
  211. snappy/doc/spherogram.html +1346 -0
  212. snappy/doc/todo.html +166 -0
  213. snappy/doc/triangulation.html +1676 -0
  214. snappy/doc/tutorial.html +159 -0
  215. snappy/doc/verify.html +330 -0
  216. snappy/doc/verify_internals.html +1235 -0
  217. snappy/drilling/__init__.py +456 -0
  218. snappy/drilling/barycentric.py +103 -0
  219. snappy/drilling/constants.py +5 -0
  220. snappy/drilling/crush.py +270 -0
  221. snappy/drilling/cusps.py +125 -0
  222. snappy/drilling/debug.py +242 -0
  223. snappy/drilling/epsilons.py +6 -0
  224. snappy/drilling/exceptions.py +55 -0
  225. snappy/drilling/moves.py +620 -0
  226. snappy/drilling/peripheral_curves.py +210 -0
  227. snappy/drilling/perturb.py +188 -0
  228. snappy/drilling/shorten.py +36 -0
  229. snappy/drilling/subdivide.py +274 -0
  230. snappy/drilling/test.py +23 -0
  231. snappy/drilling/test_cases.py +132 -0
  232. snappy/drilling/tracing.py +351 -0
  233. snappy/exceptions.py +26 -0
  234. snappy/export_stl.py +120 -0
  235. snappy/exterior_to_link/__init__.py +2 -0
  236. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  237. snappy/exterior_to_link/exceptions.py +6 -0
  238. snappy/exterior_to_link/geodesic_map.json +14408 -0
  239. snappy/exterior_to_link/hyp_utils.py +112 -0
  240. snappy/exterior_to_link/link_projection.py +323 -0
  241. snappy/exterior_to_link/main.py +198 -0
  242. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  243. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  244. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  245. snappy/exterior_to_link/pl_utils.py +491 -0
  246. snappy/exterior_to_link/put_in_S3.py +156 -0
  247. snappy/exterior_to_link/rational_linear_algebra.py +130 -0
  248. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  249. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  250. snappy/exterior_to_link/stored_moves.py +475 -0
  251. snappy/exterior_to_link/test.py +31 -0
  252. snappy/filedialog.py +28 -0
  253. snappy/geometric_structure/__init__.py +212 -0
  254. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  255. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +691 -0
  256. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +480 -0
  257. snappy/geometric_structure/cusp_neighborhood/exceptions.py +41 -0
  258. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +294 -0
  259. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +156 -0
  260. snappy/geometric_structure/cusp_neighborhood/vertices.py +35 -0
  261. snappy/geometric_structure/geodesic/__init__.py +0 -0
  262. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  263. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  264. snappy/geometric_structure/geodesic/canonical_representatives.py +52 -0
  265. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  266. snappy/geometric_structure/geodesic/constants.py +6 -0
  267. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  268. snappy/geometric_structure/geodesic/fixed_points.py +106 -0
  269. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  270. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  271. snappy/geometric_structure/geodesic/line.py +30 -0
  272. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  273. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +128 -0
  274. snappy/geometric_structure/test.py +22 -0
  275. snappy/gui.py +121 -0
  276. snappy/horoviewer.py +443 -0
  277. snappy/hyperboloid/__init__.py +212 -0
  278. snappy/hyperboloid/distances.py +259 -0
  279. snappy/hyperboloid/horoball.py +19 -0
  280. snappy/hyperboloid/line.py +35 -0
  281. snappy/hyperboloid/point.py +9 -0
  282. snappy/hyperboloid/triangle.py +29 -0
  283. snappy/info_icon.gif +0 -0
  284. snappy/infowindow.py +65 -0
  285. snappy/isometry_signature.py +389 -0
  286. snappy/len_spec/__init__.py +609 -0
  287. snappy/len_spec/geodesic_info.py +129 -0
  288. snappy/len_spec/geodesic_key_info_dict.py +116 -0
  289. snappy/len_spec/geodesic_piece.py +146 -0
  290. snappy/len_spec/geometric_structure.py +182 -0
  291. snappy/len_spec/geometry.py +136 -0
  292. snappy/len_spec/length_spectrum_geodesic_info.py +185 -0
  293. snappy/len_spec/spine.py +128 -0
  294. snappy/len_spec/test.py +24 -0
  295. snappy/len_spec/test_cases.py +69 -0
  296. snappy/len_spec/tile.py +276 -0
  297. snappy/len_spec/word.py +86 -0
  298. snappy/manifolds/HTWKnots/alternating.gz +0 -0
  299. snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
  300. snappy/manifolds/__init__.py +3 -0
  301. snappy/margulis/__init__.py +332 -0
  302. snappy/margulis/cusp_neighborhood_neighborhood.py +66 -0
  303. snappy/margulis/geodesic_neighborhood.py +152 -0
  304. snappy/margulis/margulis_info.py +21 -0
  305. snappy/margulis/mu_from_neighborhood_pair.py +175 -0
  306. snappy/margulis/neighborhood.py +29 -0
  307. snappy/margulis/test.py +22 -0
  308. snappy/math_basics.py +187 -0
  309. snappy/matrix.py +525 -0
  310. snappy/number.py +657 -0
  311. snappy/numeric_output_checker.py +345 -0
  312. snappy/pari.py +41 -0
  313. snappy/phone_home.py +57 -0
  314. snappy/polyviewer.py +259 -0
  315. snappy/ptolemy/__init__.py +17 -0
  316. snappy/ptolemy/component.py +103 -0
  317. snappy/ptolemy/coordinates.py +2290 -0
  318. snappy/ptolemy/fieldExtensions.py +153 -0
  319. snappy/ptolemy/findLoops.py +473 -0
  320. snappy/ptolemy/geometricRep.py +59 -0
  321. snappy/ptolemy/homology.py +165 -0
  322. snappy/ptolemy/magma/default.magma_template +229 -0
  323. snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
  324. snappy/ptolemy/manifoldMethods.py +395 -0
  325. snappy/ptolemy/matrix.py +350 -0
  326. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
  327. snappy/ptolemy/polynomial.py +856 -0
  328. snappy/ptolemy/processComponents.py +173 -0
  329. snappy/ptolemy/processFileBase.py +247 -0
  330. snappy/ptolemy/processFileDispatch.py +46 -0
  331. snappy/ptolemy/processMagmaFile.py +392 -0
  332. snappy/ptolemy/processRurFile.py +150 -0
  333. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
  334. snappy/ptolemy/ptolemyObstructionClass.py +64 -0
  335. snappy/ptolemy/ptolemyVariety.py +995 -0
  336. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
  337. snappy/ptolemy/reginaWrapper.py +698 -0
  338. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  339. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  340. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  341. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  342. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  343. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  344. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  345. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  346. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  347. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  348. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
  349. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  350. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  351. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
  352. snappy/ptolemy/rur.py +545 -0
  353. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
  354. snappy/ptolemy/test.py +1126 -0
  355. snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
  356. snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
  357. snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
  358. snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
  359. snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
  360. snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
  361. snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
  362. snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
  363. snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
  364. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  365. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  366. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  367. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  368. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  369. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  370. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  371. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  372. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
  373. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
  374. snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
  375. snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
  376. snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
  377. snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
  378. snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
  379. snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
  380. snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
  381. snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
  382. snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
  383. snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
  384. snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
  385. snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
  386. snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
  387. snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
  388. snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
  389. snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
  390. snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
  391. snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
  392. snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
  393. snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  394. snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  395. snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
  396. snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
  397. snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  398. snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  399. snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
  400. snappy/ptolemy/utilities.py +236 -0
  401. snappy/raytracing/__init__.py +64 -0
  402. snappy/raytracing/additional_horospheres.py +64 -0
  403. snappy/raytracing/additional_len_spec_choices.py +63 -0
  404. snappy/raytracing/cohomology_fractal.py +197 -0
  405. snappy/raytracing/eyeball.py +124 -0
  406. snappy/raytracing/finite_raytracing_data.py +237 -0
  407. snappy/raytracing/finite_viewer.py +590 -0
  408. snappy/raytracing/geodesic_tube_info.py +174 -0
  409. snappy/raytracing/geodesics.py +246 -0
  410. snappy/raytracing/geodesics_window.py +258 -0
  411. snappy/raytracing/gui_utilities.py +293 -0
  412. snappy/raytracing/hyperboloid_navigation.py +556 -0
  413. snappy/raytracing/hyperboloid_utilities.py +234 -0
  414. snappy/raytracing/ideal_raytracing_data.py +592 -0
  415. snappy/raytracing/inside_viewer.py +974 -0
  416. snappy/raytracing/pack.py +22 -0
  417. snappy/raytracing/raytracing_data.py +126 -0
  418. snappy/raytracing/raytracing_view.py +454 -0
  419. snappy/raytracing/shaders/Eye.png +0 -0
  420. snappy/raytracing/shaders/NonGeometric.png +0 -0
  421. snappy/raytracing/shaders/__init__.py +101 -0
  422. snappy/raytracing/shaders/fragment.glsl +1744 -0
  423. snappy/raytracing/test.py +29 -0
  424. snappy/raytracing/tooltip.py +146 -0
  425. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  426. snappy/raytracing/view_scale_controller.py +98 -0
  427. snappy/raytracing/zoom_slider/__init__.py +263 -0
  428. snappy/raytracing/zoom_slider/inward.png +0 -0
  429. snappy/raytracing/zoom_slider/inward18.png +0 -0
  430. snappy/raytracing/zoom_slider/outward.png +0 -0
  431. snappy/raytracing/zoom_slider/outward18.png +0 -0
  432. snappy/raytracing/zoom_slider/test.py +20 -0
  433. snappy/sage_helper.py +119 -0
  434. snappy/settings.py +407 -0
  435. snappy/shell.py +53 -0
  436. snappy/snap/__init__.py +117 -0
  437. snappy/snap/character_varieties.py +375 -0
  438. snappy/snap/find_field.py +372 -0
  439. snappy/snap/fox_milnor.py +271 -0
  440. snappy/snap/fundamental_polyhedron.py +569 -0
  441. snappy/snap/generators.py +39 -0
  442. snappy/snap/interval_reps.py +81 -0
  443. snappy/snap/kernel_structures.py +128 -0
  444. snappy/snap/mcomplex_base.py +18 -0
  445. snappy/snap/nsagetools.py +716 -0
  446. snappy/snap/peripheral/__init__.py +1 -0
  447. snappy/snap/peripheral/dual_cellulation.py +219 -0
  448. snappy/snap/peripheral/link.py +127 -0
  449. snappy/snap/peripheral/peripheral.py +159 -0
  450. snappy/snap/peripheral/surface.py +522 -0
  451. snappy/snap/peripheral/test.py +35 -0
  452. snappy/snap/polished_reps.py +335 -0
  453. snappy/snap/shapes.py +152 -0
  454. snappy/snap/slice_obs_HKL/__init__.py +194 -0
  455. snappy/snap/slice_obs_HKL/basics.py +236 -0
  456. snappy/snap/slice_obs_HKL/direct.py +217 -0
  457. snappy/snap/slice_obs_HKL/poly_norm.py +212 -0
  458. snappy/snap/slice_obs_HKL/rep_theory.py +424 -0
  459. snappy/snap/t3mlite/__init__.py +2 -0
  460. snappy/snap/t3mlite/arrow.py +243 -0
  461. snappy/snap/t3mlite/corner.py +22 -0
  462. snappy/snap/t3mlite/edge.py +172 -0
  463. snappy/snap/t3mlite/face.py +37 -0
  464. snappy/snap/t3mlite/files.py +211 -0
  465. snappy/snap/t3mlite/homology.py +53 -0
  466. snappy/snap/t3mlite/linalg.py +419 -0
  467. snappy/snap/t3mlite/mcomplex.py +1499 -0
  468. snappy/snap/t3mlite/perm4.py +320 -0
  469. snappy/snap/t3mlite/setup.py +12 -0
  470. snappy/snap/t3mlite/simplex.py +199 -0
  471. snappy/snap/t3mlite/spun.py +297 -0
  472. snappy/snap/t3mlite/surface.py +519 -0
  473. snappy/snap/t3mlite/test.py +20 -0
  474. snappy/snap/t3mlite/test_vs_regina.py +86 -0
  475. snappy/snap/t3mlite/tetrahedron.py +109 -0
  476. snappy/snap/t3mlite/vertex.py +42 -0
  477. snappy/snap/test.py +139 -0
  478. snappy/snap/utilities.py +288 -0
  479. snappy/test.py +213 -0
  480. snappy/test_cases.py +263 -0
  481. snappy/testing.py +131 -0
  482. snappy/tiling/__init__.py +2 -0
  483. snappy/tiling/dict_based_set.py +79 -0
  484. snappy/tiling/floor.py +49 -0
  485. snappy/tiling/hyperboloid_dict.py +54 -0
  486. snappy/tiling/iter_utils.py +78 -0
  487. snappy/tiling/lifted_tetrahedron.py +22 -0
  488. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  489. snappy/tiling/quotient_dict.py +70 -0
  490. snappy/tiling/real_hash_dict.py +164 -0
  491. snappy/tiling/test.py +23 -0
  492. snappy/tiling/tile.py +224 -0
  493. snappy/tiling/triangle.py +33 -0
  494. snappy/tkterminal.py +920 -0
  495. snappy/twister/__init__.py +20 -0
  496. snappy/twister/main.py +646 -0
  497. snappy/twister/surfaces/S_0_1 +3 -0
  498. snappy/twister/surfaces/S_0_2 +3 -0
  499. snappy/twister/surfaces/S_0_4 +7 -0
  500. snappy/twister/surfaces/S_0_4_Lantern +8 -0
  501. snappy/twister/surfaces/S_1 +3 -0
  502. snappy/twister/surfaces/S_1_1 +4 -0
  503. snappy/twister/surfaces/S_1_2 +5 -0
  504. snappy/twister/surfaces/S_1_2_5 +6 -0
  505. snappy/twister/surfaces/S_2 +6 -0
  506. snappy/twister/surfaces/S_2_1 +8 -0
  507. snappy/twister/surfaces/S_2_heeg +10 -0
  508. snappy/twister/surfaces/S_3 +8 -0
  509. snappy/twister/surfaces/S_3_1 +10 -0
  510. snappy/twister/surfaces/S_4_1 +12 -0
  511. snappy/twister/surfaces/S_5_1 +14 -0
  512. snappy/twister/surfaces/heeg_fig8 +9 -0
  513. snappy/twister/twister_core.cpython-310-aarch64-linux-gnu.so +0 -0
  514. snappy/upper_halfspace/__init__.py +146 -0
  515. snappy/upper_halfspace/ideal_point.py +29 -0
  516. snappy/verify/__init__.py +13 -0
  517. snappy/verify/canonical.py +542 -0
  518. snappy/verify/complex_volume/__init__.py +18 -0
  519. snappy/verify/complex_volume/adjust_torsion.py +86 -0
  520. snappy/verify/complex_volume/closed.py +168 -0
  521. snappy/verify/complex_volume/compute_ptolemys.py +90 -0
  522. snappy/verify/complex_volume/cusped.py +56 -0
  523. snappy/verify/complex_volume/extended_bloch.py +201 -0
  524. snappy/verify/cusp_translations.py +85 -0
  525. snappy/verify/edge_equations.py +80 -0
  526. snappy/verify/exceptions.py +254 -0
  527. snappy/verify/hyperbolicity.py +224 -0
  528. snappy/verify/interval_newton_shapes_engine.py +523 -0
  529. snappy/verify/interval_tree.py +400 -0
  530. snappy/verify/krawczyk_shapes_engine.py +518 -0
  531. snappy/verify/real_algebra.py +286 -0
  532. snappy/verify/shapes.py +25 -0
  533. snappy/verify/square_extensions.py +1005 -0
  534. snappy/verify/test.py +72 -0
  535. snappy/verify/volume.py +128 -0
  536. snappy/version.py +2 -0
  537. snappy-3.3.dist-info/METADATA +58 -0
  538. snappy-3.3.dist-info/RECORD +541 -0
  539. snappy-3.3.dist-info/WHEEL +6 -0
  540. snappy-3.3.dist-info/entry_points.txt +2 -0
  541. snappy-3.3.dist-info/top_level.txt +28 -0
@@ -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])