snappy 3.2__cp310-cp310-macosx_10_12_x86_64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (503) hide show
  1. snappy/CyOpenGL.cpython-310-darwin.so +0 -0
  2. snappy/SnapPy.cpython-310-darwin.so +0 -0
  3. snappy/SnapPy.ico +0 -0
  4. snappy/SnapPy.png +0 -0
  5. snappy/SnapPyHP.cpython-310-darwin.so +0 -0
  6. snappy/__init__.py +760 -0
  7. snappy/app.py +605 -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 +38 -0
  13. snappy/cusps/cusp_area_matrix.py +101 -0
  14. snappy/cusps/cusp_areas_from_matrix.py +173 -0
  15. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  16. snappy/cusps/test.py +21 -0
  17. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  18. snappy/database.py +454 -0
  19. snappy/db_utilities.py +79 -0
  20. snappy/decorated_isosig.py +710 -0
  21. snappy/dev/__init__.py +0 -0
  22. snappy/dev/extended_ptolemy/__init__.py +8 -0
  23. snappy/dev/extended_ptolemy/closed.py +106 -0
  24. snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
  25. snappy/dev/extended_ptolemy/direct.py +42 -0
  26. snappy/dev/extended_ptolemy/extended.py +406 -0
  27. snappy/dev/extended_ptolemy/giac_helper.py +43 -0
  28. snappy/dev/extended_ptolemy/giac_rur.py +129 -0
  29. snappy/dev/extended_ptolemy/gluing.py +46 -0
  30. snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
  31. snappy/dev/extended_ptolemy/printMatrices.py +70 -0
  32. snappy/dev/vericlosed/__init__.py +1 -0
  33. snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
  34. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
  35. snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
  36. snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
  37. snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
  38. snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
  39. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
  40. snappy/dev/vericlosed/orb/__init__.py +1 -0
  41. snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
  42. snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
  43. snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
  44. snappy/dev/vericlosed/test.py +54 -0
  45. snappy/dev/vericlosed/truncatedComplex.py +176 -0
  46. snappy/dev/vericlosed/verificationError.py +58 -0
  47. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
  48. snappy/doc/_images/SnapPy-196.png +0 -0
  49. snappy/doc/_images/geodesics.jpg +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 +51 -0
  61. snappy/doc/_sources/credits.rst.txt +75 -0
  62. snappy/doc/_sources/development.rst.txt +259 -0
  63. snappy/doc/_sources/index.rst.txt +182 -0
  64. snappy/doc/_sources/installing.rst.txt +247 -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 +355 -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 +925 -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 +156 -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 +199 -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 +620 -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 +427 -0
  152. snappy/doc/credits.html +181 -0
  153. snappy/doc/development.html +384 -0
  154. snappy/doc/genindex.html +1331 -0
  155. snappy/doc/index.html +262 -0
  156. snappy/doc/installing.html +346 -0
  157. snappy/doc/manifold.html +3452 -0
  158. snappy/doc/manifoldhp.html +180 -0
  159. snappy/doc/news.html +388 -0
  160. snappy/doc/objects.inv +0 -0
  161. snappy/doc/other.html +161 -0
  162. snappy/doc/platonic_census.html +375 -0
  163. snappy/doc/plink.html +210 -0
  164. snappy/doc/ptolemy.html +254 -0
  165. snappy/doc/ptolemy_classes.html +1144 -0
  166. snappy/doc/ptolemy_examples1.html +409 -0
  167. snappy/doc/ptolemy_examples2.html +471 -0
  168. snappy/doc/ptolemy_examples3.html +414 -0
  169. snappy/doc/ptolemy_examples4.html +195 -0
  170. snappy/doc/ptolemy_prelim.html +248 -0
  171. snappy/doc/py-modindex.html +165 -0
  172. snappy/doc/screenshots.html +141 -0
  173. snappy/doc/search.html +135 -0
  174. snappy/doc/searchindex.js +1 -0
  175. snappy/doc/snap.html +202 -0
  176. snappy/doc/snappy.html +181 -0
  177. snappy/doc/spherogram.html +1211 -0
  178. snappy/doc/todo.html +166 -0
  179. snappy/doc/triangulation.html +1584 -0
  180. snappy/doc/tutorial.html +159 -0
  181. snappy/doc/verify.html +330 -0
  182. snappy/doc/verify_internals.html +1235 -0
  183. snappy/drilling/__init__.py +456 -0
  184. snappy/drilling/barycentric.py +103 -0
  185. snappy/drilling/constants.py +5 -0
  186. snappy/drilling/crush.py +270 -0
  187. snappy/drilling/cusps.py +125 -0
  188. snappy/drilling/debug.py +242 -0
  189. snappy/drilling/epsilons.py +6 -0
  190. snappy/drilling/exceptions.py +55 -0
  191. snappy/drilling/moves.py +620 -0
  192. snappy/drilling/peripheral_curves.py +210 -0
  193. snappy/drilling/perturb.py +188 -0
  194. snappy/drilling/shorten.py +36 -0
  195. snappy/drilling/subdivide.py +274 -0
  196. snappy/drilling/test.py +23 -0
  197. snappy/drilling/test_cases.py +126 -0
  198. snappy/drilling/tracing.py +351 -0
  199. snappy/exceptions.py +26 -0
  200. snappy/export_stl.py +120 -0
  201. snappy/exterior_to_link/__init__.py +2 -0
  202. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  203. snappy/exterior_to_link/exceptions.py +6 -0
  204. snappy/exterior_to_link/geodesic_map.json +14408 -0
  205. snappy/exterior_to_link/hyp_utils.py +112 -0
  206. snappy/exterior_to_link/link_projection.py +323 -0
  207. snappy/exterior_to_link/main.py +197 -0
  208. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  209. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  210. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  211. snappy/exterior_to_link/pl_utils.py +491 -0
  212. snappy/exterior_to_link/put_in_S3.py +156 -0
  213. snappy/exterior_to_link/rational_linear_algebra.py +123 -0
  214. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  215. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  216. snappy/exterior_to_link/stored_moves.py +475 -0
  217. snappy/exterior_to_link/test.py +31 -0
  218. snappy/filedialog.py +28 -0
  219. snappy/geometric_structure/__init__.py +212 -0
  220. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  221. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  222. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  223. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  224. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  225. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  226. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  227. snappy/geometric_structure/geodesic/__init__.py +0 -0
  228. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  229. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  230. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  231. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  232. snappy/geometric_structure/geodesic/constants.py +6 -0
  233. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  234. snappy/geometric_structure/geodesic/fixed_points.py +93 -0
  235. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  236. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  237. snappy/geometric_structure/geodesic/line.py +30 -0
  238. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  239. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  240. snappy/geometric_structure/test.py +22 -0
  241. snappy/gui.py +121 -0
  242. snappy/horoviewer.py +443 -0
  243. snappy/hyperboloid/__init__.py +212 -0
  244. snappy/hyperboloid/distances.py +245 -0
  245. snappy/hyperboloid/horoball.py +19 -0
  246. snappy/hyperboloid/line.py +35 -0
  247. snappy/hyperboloid/point.py +9 -0
  248. snappy/hyperboloid/triangle.py +29 -0
  249. snappy/info_icon.gif +0 -0
  250. snappy/infowindow.py +65 -0
  251. snappy/isometry_signature.py +382 -0
  252. snappy/len_spec/__init__.py +596 -0
  253. snappy/len_spec/geodesic_info.py +110 -0
  254. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  255. snappy/len_spec/geodesic_piece.py +143 -0
  256. snappy/len_spec/geometric_structure.py +182 -0
  257. snappy/len_spec/geometry.py +80 -0
  258. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  259. snappy/len_spec/spine.py +206 -0
  260. snappy/len_spec/test.py +24 -0
  261. snappy/len_spec/test_cases.py +69 -0
  262. snappy/len_spec/tile.py +275 -0
  263. snappy/len_spec/word.py +86 -0
  264. snappy/manifolds/HTWKnots/alternating.gz +0 -0
  265. snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
  266. snappy/manifolds/__init__.py +3 -0
  267. snappy/math_basics.py +176 -0
  268. snappy/matrix.py +525 -0
  269. snappy/number.py +657 -0
  270. snappy/numeric_output_checker.py +345 -0
  271. snappy/pari.py +41 -0
  272. snappy/phone_home.py +57 -0
  273. snappy/polyviewer.py +259 -0
  274. snappy/ptolemy/__init__.py +17 -0
  275. snappy/ptolemy/component.py +103 -0
  276. snappy/ptolemy/coordinates.py +2290 -0
  277. snappy/ptolemy/fieldExtensions.py +153 -0
  278. snappy/ptolemy/findLoops.py +473 -0
  279. snappy/ptolemy/geometricRep.py +59 -0
  280. snappy/ptolemy/homology.py +165 -0
  281. snappy/ptolemy/magma/default.magma_template +229 -0
  282. snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
  283. snappy/ptolemy/manifoldMethods.py +395 -0
  284. snappy/ptolemy/matrix.py +350 -0
  285. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
  286. snappy/ptolemy/polynomial.py +857 -0
  287. snappy/ptolemy/processComponents.py +173 -0
  288. snappy/ptolemy/processFileBase.py +247 -0
  289. snappy/ptolemy/processFileDispatch.py +46 -0
  290. snappy/ptolemy/processMagmaFile.py +392 -0
  291. snappy/ptolemy/processRurFile.py +150 -0
  292. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
  293. snappy/ptolemy/ptolemyObstructionClass.py +64 -0
  294. snappy/ptolemy/ptolemyVariety.py +1029 -0
  295. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
  296. snappy/ptolemy/reginaWrapper.py +698 -0
  297. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  298. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  299. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  300. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  301. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  302. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  303. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  304. snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  305. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  306. snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  307. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
  308. snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  309. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  310. snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
  311. snappy/ptolemy/rur.py +545 -0
  312. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
  313. snappy/ptolemy/test.py +1126 -0
  314. snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
  315. snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
  316. snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
  317. snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
  318. snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
  319. snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
  320. snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
  321. snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
  322. snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
  323. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
  324. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
  325. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
  326. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
  327. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
  328. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
  329. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
  330. snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
  331. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
  332. snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
  333. snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
  334. snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
  335. snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
  336. snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
  337. snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
  338. snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
  339. snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
  340. snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
  341. snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
  342. snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
  343. snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
  344. snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
  345. snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
  346. snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
  347. snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
  348. snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
  349. snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
  350. snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
  351. snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
  352. snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
  353. snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
  354. snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
  355. snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
  356. snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
  357. snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
  358. snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
  359. snappy/ptolemy/utilities.py +236 -0
  360. snappy/raytracing/__init__.py +64 -0
  361. snappy/raytracing/additional_horospheres.py +64 -0
  362. snappy/raytracing/additional_len_spec_choices.py +63 -0
  363. snappy/raytracing/cohomology_fractal.py +197 -0
  364. snappy/raytracing/eyeball.py +123 -0
  365. snappy/raytracing/finite_raytracing_data.py +237 -0
  366. snappy/raytracing/finite_viewer.py +590 -0
  367. snappy/raytracing/geodesic_tube_info.py +174 -0
  368. snappy/raytracing/geodesics.py +246 -0
  369. snappy/raytracing/geodesics_window.py +258 -0
  370. snappy/raytracing/gui_utilities.py +293 -0
  371. snappy/raytracing/hyperboloid_navigation.py +556 -0
  372. snappy/raytracing/hyperboloid_utilities.py +234 -0
  373. snappy/raytracing/ideal_raytracing_data.py +592 -0
  374. snappy/raytracing/inside_viewer.py +974 -0
  375. snappy/raytracing/pack.py +22 -0
  376. snappy/raytracing/raytracing_data.py +126 -0
  377. snappy/raytracing/raytracing_view.py +454 -0
  378. snappy/raytracing/shaders/Eye.png +0 -0
  379. snappy/raytracing/shaders/NonGeometric.png +0 -0
  380. snappy/raytracing/shaders/__init__.py +101 -0
  381. snappy/raytracing/shaders/fragment.glsl +1744 -0
  382. snappy/raytracing/test.py +29 -0
  383. snappy/raytracing/tooltip.py +146 -0
  384. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  385. snappy/raytracing/view_scale_controller.py +98 -0
  386. snappy/raytracing/zoom_slider/__init__.py +263 -0
  387. snappy/raytracing/zoom_slider/inward.png +0 -0
  388. snappy/raytracing/zoom_slider/inward18.png +0 -0
  389. snappy/raytracing/zoom_slider/outward.png +0 -0
  390. snappy/raytracing/zoom_slider/outward18.png +0 -0
  391. snappy/raytracing/zoom_slider/test.py +20 -0
  392. snappy/sage_helper.py +117 -0
  393. snappy/settings.py +409 -0
  394. snappy/shell.py +53 -0
  395. snappy/snap/__init__.py +114 -0
  396. snappy/snap/character_varieties.py +375 -0
  397. snappy/snap/find_field.py +372 -0
  398. snappy/snap/fundamental_polyhedron.py +569 -0
  399. snappy/snap/generators.py +39 -0
  400. snappy/snap/interval_reps.py +81 -0
  401. snappy/snap/kernel_structures.py +128 -0
  402. snappy/snap/mcomplex_base.py +18 -0
  403. snappy/snap/nsagetools.py +702 -0
  404. snappy/snap/peripheral/__init__.py +1 -0
  405. snappy/snap/peripheral/dual_cellulation.py +219 -0
  406. snappy/snap/peripheral/link.py +127 -0
  407. snappy/snap/peripheral/peripheral.py +159 -0
  408. snappy/snap/peripheral/surface.py +522 -0
  409. snappy/snap/peripheral/test.py +35 -0
  410. snappy/snap/polished_reps.py +335 -0
  411. snappy/snap/shapes.py +152 -0
  412. snappy/snap/slice_obs_HKL.py +668 -0
  413. snappy/snap/t3mlite/__init__.py +2 -0
  414. snappy/snap/t3mlite/arrow.py +243 -0
  415. snappy/snap/t3mlite/corner.py +22 -0
  416. snappy/snap/t3mlite/edge.py +172 -0
  417. snappy/snap/t3mlite/face.py +37 -0
  418. snappy/snap/t3mlite/files.py +211 -0
  419. snappy/snap/t3mlite/homology.py +53 -0
  420. snappy/snap/t3mlite/linalg.py +419 -0
  421. snappy/snap/t3mlite/mcomplex.py +1499 -0
  422. snappy/snap/t3mlite/perm4.py +320 -0
  423. snappy/snap/t3mlite/setup.py +12 -0
  424. snappy/snap/t3mlite/simplex.py +199 -0
  425. snappy/snap/t3mlite/spun.py +297 -0
  426. snappy/snap/t3mlite/surface.py +519 -0
  427. snappy/snap/t3mlite/test.py +20 -0
  428. snappy/snap/t3mlite/test_vs_regina.py +86 -0
  429. snappy/snap/t3mlite/tetrahedron.py +109 -0
  430. snappy/snap/t3mlite/vertex.py +42 -0
  431. snappy/snap/test.py +134 -0
  432. snappy/snap/utilities.py +288 -0
  433. snappy/test.py +209 -0
  434. snappy/test_cases.py +263 -0
  435. snappy/testing.py +131 -0
  436. snappy/tiling/__init__.py +2 -0
  437. snappy/tiling/canonical_key_dict.py +59 -0
  438. snappy/tiling/dict_based_set.py +79 -0
  439. snappy/tiling/floor.py +49 -0
  440. snappy/tiling/hyperboloid_dict.py +54 -0
  441. snappy/tiling/iter_utils.py +78 -0
  442. snappy/tiling/lifted_tetrahedron.py +22 -0
  443. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  444. snappy/tiling/real_hash_dict.py +164 -0
  445. snappy/tiling/test.py +23 -0
  446. snappy/tiling/tile.py +215 -0
  447. snappy/tiling/triangle.py +33 -0
  448. snappy/tkterminal.py +920 -0
  449. snappy/twister/__init__.py +20 -0
  450. snappy/twister/main.py +646 -0
  451. snappy/twister/surfaces/S_0_1 +3 -0
  452. snappy/twister/surfaces/S_0_2 +3 -0
  453. snappy/twister/surfaces/S_0_4 +7 -0
  454. snappy/twister/surfaces/S_0_4_Lantern +8 -0
  455. snappy/twister/surfaces/S_1 +3 -0
  456. snappy/twister/surfaces/S_1_1 +4 -0
  457. snappy/twister/surfaces/S_1_2 +5 -0
  458. snappy/twister/surfaces/S_1_2_5 +6 -0
  459. snappy/twister/surfaces/S_2 +6 -0
  460. snappy/twister/surfaces/S_2_1 +8 -0
  461. snappy/twister/surfaces/S_2_heeg +10 -0
  462. snappy/twister/surfaces/S_3 +8 -0
  463. snappy/twister/surfaces/S_3_1 +10 -0
  464. snappy/twister/surfaces/S_4_1 +12 -0
  465. snappy/twister/surfaces/S_5_1 +14 -0
  466. snappy/twister/surfaces/heeg_fig8 +9 -0
  467. snappy/twister/twister_core.cpython-310-darwin.so +0 -0
  468. snappy/upper_halfspace/__init__.py +146 -0
  469. snappy/upper_halfspace/ideal_point.py +26 -0
  470. snappy/verify/__init__.py +13 -0
  471. snappy/verify/canonical.py +542 -0
  472. snappy/verify/complex_volume/__init__.py +18 -0
  473. snappy/verify/complex_volume/adjust_torsion.py +86 -0
  474. snappy/verify/complex_volume/closed.py +168 -0
  475. snappy/verify/complex_volume/compute_ptolemys.py +90 -0
  476. snappy/verify/complex_volume/cusped.py +56 -0
  477. snappy/verify/complex_volume/extended_bloch.py +201 -0
  478. snappy/verify/cusp_translations.py +85 -0
  479. snappy/verify/edge_equations.py +80 -0
  480. snappy/verify/exceptions.py +254 -0
  481. snappy/verify/hyperbolicity.py +224 -0
  482. snappy/verify/interval_newton_shapes_engine.py +523 -0
  483. snappy/verify/interval_tree.py +400 -0
  484. snappy/verify/krawczyk_shapes_engine.py +518 -0
  485. snappy/verify/maximal_cusp_area_matrix/__init__.py +46 -0
  486. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +419 -0
  487. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +153 -0
  488. snappy/verify/real_algebra.py +286 -0
  489. snappy/verify/shapes.py +25 -0
  490. snappy/verify/short_slopes.py +200 -0
  491. snappy/verify/square_extensions.py +1005 -0
  492. snappy/verify/test.py +78 -0
  493. snappy/verify/upper_halfspace/__init__.py +9 -0
  494. snappy/verify/upper_halfspace/extended_matrix.py +100 -0
  495. snappy/verify/upper_halfspace/finite_point.py +283 -0
  496. snappy/verify/upper_halfspace/ideal_point.py +426 -0
  497. snappy/verify/volume.py +128 -0
  498. snappy/version.py +2 -0
  499. snappy-3.2.dist-info/METADATA +58 -0
  500. snappy-3.2.dist-info/RECORD +503 -0
  501. snappy-3.2.dist-info/WHEEL +5 -0
  502. snappy-3.2.dist-info/entry_points.txt +2 -0
  503. snappy-3.2.dist-info/top_level.txt +28 -0
@@ -0,0 +1,668 @@
1
+ """
2
+ Using metabelian representations to obstruct slicing
3
+ ====================================================
4
+
5
+ Based on::
6
+
7
+ Herald, Kirk, Livingston, Math Zeit., 2010
8
+ https://dx.doi.org/10.1007/s00209-009-0548-1
9
+ https://arxiv.org/abs/0804.1355
10
+
11
+ In general, the implementation follows their paper closely, with a few
12
+ minor changes:
13
+
14
+ 1. We use the default simplified presentation for pi_1(knot exterior)
15
+ that SnapPy provides, rather than a Wirtinger presentation, as the
16
+ former has many fewer generators (but of course much longer
17
+ relators).
18
+
19
+ 2. The construction of the metabelian representations in Section 7 of
20
+ [HKL] is done the language of twisted cohomology and specifically
21
+ twisted cocycles, whereas this viewpoint is not quite explicit
22
+ (though clearly implied) in [HKL].
23
+
24
+ 3. To match the conventions of the other twisted Alexander polynomials
25
+ computed by SnapPy, we insist on all actions are on the left,
26
+ rather than the mix of left and right actions used in [HKL].
27
+
28
+ 4. For the final check of whether the twisted polynomial is a norm, we
29
+ simply use that Sage can factor univariate polynomials over
30
+ cyclotomic fields into irreducibles, rather than the various
31
+ generalizations of Gauss's Lemma in [HKL].
32
+
33
+
34
+ Validation
35
+ ==========
36
+
37
+ This code was developed by Nathan Dunfield and Sherry Gong as part of
38
+ an exporation of the slice versus ribbon question. It was applied to
39
+ a sample of 65,000 knots with square determinant and at most 16
40
+ crossings, and it reported that almost 40,000 were not slice. As those
41
+ 40,000 knots were disjoint from the more than 24,000 ribbon knots in
42
+ this sample, this provides decent evidence that this implementation is
43
+ correct.
44
+ """
45
+
46
+ from ..sage_helper import _within_sage, sage_method
47
+ if _within_sage:
48
+ from ..sage_helper import ZZ, PolynomialRing, vector, matrix, identity_matrix, MatrixSpace, block_matrix, prime_range, is_prime
49
+ from ..sage_helper import LaurentPolynomialRing, GF, CyclotomicField, ChainComplex
50
+
51
+ from .nsagetools import (MapToFreeAbelianization, compute_torsion,
52
+ fox_derivative_with_involution,
53
+ fox_derivative,
54
+ fast_determinant_of_laurent_poly_matrix,
55
+ last_square_submatrix,
56
+ first_square_submatrix)
57
+
58
+ from .. import SnapPy
59
+
60
+
61
+ class MatrixRepresentation():
62
+ """
63
+ A representation from a finitely-presented group to GL(n, R),
64
+ where R is a ring::
65
+
66
+ sage: MatSp = MatrixSpace(ZZ, 2)
67
+ sage: S = MatSp([[0, -1], [1, 0]])
68
+ sage: T = MatSp([[1, 1], [0, 1]])
69
+ sage: rho = MatrixRepresentation(['s', 't'], [6*'st'], MatSp, [S, T])
70
+ sage: rho
71
+ <MatRep from G(st) to GL(2, Integer Ring)>
72
+ sage: rho(2*'s') == rho(3*'st') == -identity_matrix(2)
73
+ True
74
+ sage: rho('ttsTTTsTTsTTstss')
75
+ [17 29]
76
+ [ 7 12]
77
+ """
78
+ def __init__(self, generators, relators, image_ring, matrices):
79
+ if isinstance(matrices, dict):
80
+ images = matrices
81
+ all_gens = list(generators) + [g.swapcase() for g in generators]
82
+ assert set(matrices) == set(all_gens)
83
+ else:
84
+ assert len(generators) == len(matrices)
85
+ images = {}
86
+ for g, m in zip(generators, matrices):
87
+ images[g] = m
88
+ images[g.swapcase()] = image_ring(m.inverse())
89
+
90
+ self.images = images
91
+ self.image_ring = image_ring
92
+ self.base_ring = self.image_ring.base_ring()
93
+ self.dim = self.image_ring.ncols()
94
+ self.generators = generators
95
+ self.relators = relators
96
+ assert all(m.parent() == self.image_ring for m in images.values())
97
+ self._check_rep()
98
+
99
+ def _check_rep(self):
100
+ assert all(self(g + g.swapcase()) == 1 for g in self.generators)
101
+ assert all(self(rel) == 1 for rel in self.relators)
102
+
103
+ def range(self):
104
+ return self.image_ring
105
+
106
+ def __call__(self, word):
107
+ ans = self.image_ring(1)
108
+ for w in word:
109
+ ans = ans * self.images[w]
110
+ return ans
111
+
112
+ def __repr__(self):
113
+ gens = ''.join(self.generators)
114
+ return '<MatRep from G(' + gens + ') to GL(%s, %s)>' % (self.dim, self.base_ring)
115
+
116
+ def twisted_chain_complex(self):
117
+ """
118
+ Returns chain complex of the presentation CW complex of the
119
+ given group with coefficients twisted by self.
120
+ """
121
+ gens, rels, rho = self.generators, self.relators, self
122
+ d2 = [ [fox_derivative_with_involution(R, rho, g) for R in rels] for g in gens]
123
+ d2 = block_matrix(d2, nrows=len(gens), ncols=len(rels))
124
+ d1 = [rho(g.swapcase()) - 1 for g in gens]
125
+ d1 = block_matrix(d1, nrows=1, ncols=len(gens))
126
+ C = ChainComplex({1:d1, 2:d2}, degree_of_differential=-1, check=True)
127
+ return C
128
+
129
+ def twisted_cochain_complex(self):
130
+ """
131
+ Returns chain complex of the presentation CW complex of the
132
+ given group with coefficients twisted by self.
133
+ """
134
+ gens, rels, rho = self.generators, self.relators, self
135
+ d1 = [[fox_derivative(R, rho, g) for g in gens] for R in rels]
136
+ d1 = block_matrix(d1, nrows=len(rels), ncols=len(gens))
137
+ d0 = [rho(g) - 1 for g in gens]
138
+ d0 = block_matrix(d0, nrow=len(gens), ncols=1)
139
+ C = ChainComplex({0:d0, 1:d1}, check=True)
140
+ return C
141
+
142
+ def semidirect_rep_from_twisted_cocycle(self, cocycle):
143
+ """
144
+ Given a representation rho to GL(R, n) and a rho-twisted
145
+ 1-cocycle, construct the representation to GL(R, n + 1)
146
+ corresponding to the semidirect product.
147
+
148
+ Note: Since we prefer to stick to left-actions only, unlike [HLK]
149
+ this is the semidirect produce associated to the left action of
150
+ GL(R, n) on V = R^n. That is, pairs (v, A) with v in V and A in
151
+ GL(R, n) where (v, A) * (w, B) = (v + A*w, A*B)::
152
+
153
+ sage: G = Manifold('K12a169').fundamental_group()
154
+ sage: A = matrix(GF(5), [[0, 4], [1, 4]])
155
+ sage: rho = cyclic_rep(G, A)
156
+ sage: cocycle = vector(GF(5), (0, 0, 1, 0))
157
+ sage: rho_til = rho.semidirect_rep_from_twisted_cocycle(cocycle)
158
+ sage: rho_til('abAB')
159
+ [1 0 4]
160
+ [0 1 1]
161
+ [0 0 1]
162
+ """
163
+ gens, rels, rho = self.generators, self.relators, self
164
+ n = rho.dim
165
+ assert len(cocycle) == len(gens)*n
166
+ new_mats = []
167
+ for i, g in enumerate(gens):
168
+ v = matrix([cocycle[i*n:(i+1)*n]]).transpose()
169
+ zeros = matrix(n*[0])
170
+ one = matrix([[1]])
171
+ A = block_matrix([[rho(g), v], [zeros, one]])
172
+ new_mats.append(A)
173
+
174
+ target = MatrixSpace(rho.base_ring, n + 1)
175
+ return MatrixRepresentation(gens, rels, target, new_mats)
176
+
177
+ # ----- end class MatrixRepresentation --------------------------------
178
+
179
+
180
+ def poly_to_rep(f):
181
+ """
182
+ For a polynomial f in F[x], return the matrix corresponding to the
183
+ left action of x on F[x]/(f).
184
+ """
185
+ assert f.is_monic()
186
+ d = f.degree()
187
+ last_column = [-f[e] for e in range(d)]
188
+ I = identity_matrix(d)
189
+ M = matrix(I.rows()[1:] + [last_column])
190
+ assert M.charpoly() == f
191
+ return M.transpose()
192
+
193
+
194
+ def irreps(p, q):
195
+ """
196
+ Returns the irreducible representations of the cyclic group C_p
197
+ over the field F_q, where p and q are distinct primes.
198
+
199
+ Each representation is given by a matrix over F_q giving the
200
+ action of the preferred generator of C_p.
201
+
202
+ sage: [M.nrows() for M in irreps(3, 7)]
203
+ [1, 1, 1]
204
+ sage: [M.nrows() for M in irreps(7, 11)]
205
+ [1, 3, 3]
206
+ sage: sum(M.nrows() for M in irreps(157, 13))
207
+ 157
208
+ """
209
+ p, q = ZZ(p), ZZ(q)
210
+ assert p.is_prime() and q.is_prime() and p != q
211
+ R = PolynomialRing(GF(q), 'x')
212
+ x = R.gen()
213
+ polys = [f for f, e in (x**p - 1).factor()]
214
+ polys.sort(key=lambda f:(f.degree(), -f.constant_coefficient()))
215
+ reps = [poly_to_rep(f) for f in polys]
216
+ assert all(A**p == 1 for A in reps)
217
+ assert reps[0] == 1
218
+ return reps
219
+
220
+
221
+ def homology_of_cyclic_branched_cover(knot_exterior, p):
222
+ C = knot_exterior.covers(p, cover_type='cyclic')[0]
223
+ return [d for d in C.homology().elementary_divisors() if d != 0]
224
+
225
+
226
+ def primes_appearing(knot_exterior, p):
227
+ """
228
+ sage: M = Manifold('K12n731')
229
+ sage: primes_appearing(M, 3)
230
+ [2, 13]
231
+ """
232
+ C = knot_exterior.covers(p, cover_type='cyclic')[0]
233
+ divisors = C.homology().elementary_divisors()
234
+ primes = set()
235
+ for d in divisors:
236
+ if d != 0:
237
+ primes.update([p for p, e in ZZ(d).factor()])
238
+ return sorted(primes)
239
+
240
+
241
+ def nonzero_divisor_product(knot_exterior, p):
242
+ """
243
+ sage: M = Manifold('K12n731')
244
+ sage: nonzero_divisor_product(M, 3)
245
+ 2704
246
+ """
247
+ C = knot_exterior.covers(p, cover_type='cyclic')[0]
248
+ divisors = C.homology().elementary_divisors()
249
+ ans = 1
250
+ for d in divisors:
251
+ if d != 0:
252
+ ans *= d
253
+ return ans
254
+
255
+
256
+ def cyclic_rep(group, matrix_of_rep):
257
+ """
258
+ For a group G whose free abelianization is Z, returns the
259
+ representation of G factoring through Z where 1 in Z in turn goes
260
+ to the given matrix_of_rep.
261
+ """
262
+ A = matrix_of_rep
263
+ epsilon = MapToFreeAbelianization(group)
264
+ assert epsilon.range().rank() == 1
265
+ gens = group.generators()
266
+ rels = group.relators()
267
+ mats = [A**(epsilon(g)[0]) for g in gens]
268
+ rho = MatrixRepresentation(gens, rels, A.parent(), mats)
269
+ rho.epsilon = epsilon
270
+ rho.A = A
271
+ return rho
272
+
273
+
274
+ def dim_twisted_homology(group, matrix_of_C_p_rep):
275
+ """
276
+ sage: M = Manifold('K12n813')
277
+ sage: G = M.fundamental_group()
278
+ sage: reps = irreps(3, 7)
279
+ sage: [dim_twisted_homology(G, A) for A in reps]
280
+ [1, 1, 1]
281
+ sage: reps = irreps(3, 5)
282
+ sage: [dim_twisted_homology(G, A) for A in reps]
283
+ [1, 0]
284
+ """
285
+ rho = cyclic_rep(group, matrix_of_C_p_rep)
286
+ C = rho.twisted_chain_complex()
287
+ H = C.homology()
288
+ if matrix_of_C_p_rep != 1:
289
+ assert H[0].rank() == 0
290
+ else:
291
+ assert H[0].rank() == 1
292
+ return H[1].rank()
293
+
294
+
295
+ def reps_appearing(knot_exterior, p, q):
296
+ """
297
+ All irreducible C_p reps appearing in the F_q homology of the
298
+ cyclic branched cover B_p, together with their multiplicities.
299
+
300
+ sage: M = Manifold('K12a169')
301
+ sage: [(A.trace(), e) for A, e in reps_appearing(M, 3, 5)]
302
+ [(4, 1)]
303
+ """
304
+ M = knot_exterior
305
+ G = M.fundamental_group()
306
+ for A in irreps(p, q)[1:]:
307
+ d = dim_twisted_homology(G, A)
308
+ if d > 0:
309
+ n = A.nrows()
310
+ assert d % n == 0
311
+ yield (A, d//n)
312
+
313
+
314
+ def induced_rep_from_twisted_cocycle(p, rho, chi, cocycle):
315
+ """
316
+ The main metabelian representation from Section 7 of [HKL] for the
317
+ group of a knot complement, where p is the degree of the branched
318
+ cover, rho is an irreducible cyclic representation acting on the
319
+ F_q vector space V, chi is a homomorpism V -> F_q, and cocycle
320
+ describes the semidirect product extension.
321
+
322
+ We differ from [HKL] in that all actions are on the left, meaning
323
+ that this representation is defined in terms of the convention for the
324
+ semidirect product discussed in::
325
+
326
+ MatrixRepresentation.semidirect_rep_from_twisted_cocycle
327
+
328
+ Here is an example::
329
+
330
+ sage: G = Manifold('K12n132').fundamental_group()
331
+ sage: A = matrix(GF(5), [[0, 4], [1, 4]])
332
+ sage: rho = cyclic_rep(G, A)
333
+ sage: cocycle = (0, 0, 0, 1, 1, 2)
334
+ sage: chi = lambda v: v[0] + 4*v[1]
335
+ sage: rho_ind = induced_rep_from_twisted_cocycle(3, rho, chi, cocycle)
336
+ sage: rho_ind('c').list()
337
+ [0, 0, (-z^3 - z^2 - z - 1), z^2*t^-1, 0, 0, 0, (-z^3 - z^2 - z - 1)*t^-1, 0]
338
+ """
339
+ q = rho.base_ring.order()
340
+ n = rho.dim
341
+ K = CyclotomicField(q, 'z')
342
+ z = K.gen()
343
+ A = rho.A
344
+ R = LaurentPolynomialRing(K, 't')
345
+ t = R.gen()
346
+ MatSp = MatrixSpace(R, p)
347
+ gens = rho.generators
348
+ images = {}
349
+ for s, g in enumerate(gens):
350
+ v = vector(cocycle[s*n:(s+1)*n])
351
+ e = rho.epsilon(g)[0]
352
+ U = MatSp(0)
353
+ for j in range(0, p):
354
+ k, l = (e + j).quo_rem(p)
355
+ U[l, j] = t**k * z**chi(A**(-l) * v)
356
+ images[g] = U
357
+
358
+ e, v = -e, -A**(-e)*v
359
+ V = MatSp(0)
360
+ for j in range(0, p):
361
+ k, l = (e + j).quo_rem(p)
362
+ V[l, j] = t**k * z**chi(A**(-l) * v)
363
+ images[g.swapcase()] = V
364
+
365
+ alpha = MatrixRepresentation(gens, rho.relators, MatSp, images)
366
+ alpha.epsilon = rho.epsilon
367
+ return alpha
368
+
369
+
370
+ def normalize_polynomial(f):
371
+ """
372
+ Multiply by t^-n so that the constant term is nonzero.
373
+
374
+ sage: t = PolynomialRing(ZZ, 't').gen()
375
+ sage: normalize_polynomial(t**3 + 2*t**2)
376
+ t + 2
377
+ """
378
+ e = min(f.exponents())
379
+ t = f.parent().gen()
380
+ return f // t**e
381
+
382
+
383
+ def twisted_alexander_polynomial(alpha, reduced=False):
384
+ """
385
+ In HKL, alpha is epsilon x rho; in nsagetools, it would be called
386
+ phialpha with phi being epsilon. If reduced is True, the answer is
387
+ divided by (t - 1).
388
+
389
+ Here, we duplicate the calculation of Section 10.2 of [HKL].
390
+
391
+ sage: M = Manifold('K12a169')
392
+ sage: G = M.fundamental_group()
393
+ sage: A = matrix(GF(5), [[0, 4], [1, 4]])
394
+ sage: rho = cyclic_rep(G, A)
395
+ sage: chi = lambda v:3*v[0]
396
+ sage: alpha = induced_rep_from_twisted_cocycle(3, rho, chi, (0, 0, 1, 0))
397
+ sage: -twisted_alexander_polynomial(alpha, reduced=True)
398
+ 4*t^2 + (z^3 + z^2 + 5)*t + 4
399
+ """
400
+ F = alpha('a').base_ring().base_ring()
401
+ epsilon = alpha.epsilon
402
+ gens, rels = alpha.generators, alpha.relators
403
+ k = len(gens)
404
+
405
+ # Make sure this special algorithm applies.
406
+ assert len(rels) == len(gens) - 1 and epsilon.range().rank() == 1
407
+
408
+ # Want the first variable to be homologically nontrivial
409
+ i0 = next(i for i, g in enumerate(gens) if epsilon(g) != 0)
410
+ gens = gens[i0:] + gens[:i0]
411
+
412
+ # Boundary maps for chain complex
413
+
414
+ d2 = [ [fox_derivative_with_involution(R, alpha, g) for R in rels] for g in gens]
415
+ d2 = block_matrix(d2, nrows=k, ncols=k-1)
416
+ d1 = [alpha(g.swapcase()) - 1 for g in gens]
417
+ d1 = block_matrix(d1, nrows=1, ncols=k)
418
+ assert d1 * d2 == 0
419
+
420
+ T = last_square_submatrix(d2)
421
+ B = first_square_submatrix(d1)
422
+
423
+ T = normalize_polynomial(fast_determinant_of_laurent_poly_matrix(T))
424
+ B = normalize_polynomial(fast_determinant_of_laurent_poly_matrix(B))
425
+
426
+ q, r = T.quo_rem(B)
427
+ assert r == 0
428
+ ans = normalize_polynomial(q)
429
+ if reduced:
430
+ t = ans.parent().gen()
431
+ ans, r = ans.quo_rem(t - 1)
432
+ assert r == 0
433
+ return ans
434
+
435
+
436
+ def alex_poly_of_induced_rep(p, knot_exterior, A, chi):
437
+ """
438
+ When A is the matrix generating an irreducible representation V
439
+ that appears with multiplicity 1 in H_1(B_p, F_q) and chi: V -> F_q
440
+ is a homomorphism, computes the (reduced) twisted alexander
441
+ polynomial of Herald-Kirk-Livingston.
442
+
443
+ Here is the example from Section 10.3 of [HKL]. When comparing
444
+ with the original, note the polynomnial coeffs in Q(zeta_5) are
445
+ not in the usual Q-basis for this field 1, z, z^2, z^3 where z =
446
+ zeta_5::
447
+
448
+ sage: M = Manifold('K12n132')
449
+ sage: A = matrix(GF(5), [[0, 4], [1, 4]])
450
+ sage: chi = lambda v:v[0] + 3*v[1]
451
+ sage: alex = alex_poly_of_induced_rep(3, M, A, chi)
452
+ sage: t = alex.parent().gen()
453
+ sage: quo, rem = alex.quo_rem(t - 1)
454
+ sage: 5*quo/quo.leading_coefficient()
455
+ 5*t^3 + (10*z^3 + 14*z^2 + 14*z + 12)*t^2 + (-4*z^2 - 14*z - 2)*t + 5
456
+
457
+ Here is their example 10.6::
458
+
459
+ sage: M = Manifold('K12n224')
460
+ sage: A3, A5 = matrix(GF(7), [[4]]), matrix(GF(7), [[2]])
461
+ sage: A3.charpoly(), A5.charpoly()
462
+ (x + 3, x + 5)
463
+ sage: -alex_poly_of_induced_rep(3, M, A3, lambda v:3*v[0])
464
+ t^4 + (-4*z^4 - 4*z^2 - 4*z - 5)*t^3 + 6*t^2 + (4*z^4 + 4*z^2 + 4*z - 1)*t + 1
465
+ sage: -alex_poly_of_induced_rep(3, M, A5, lambda v:v[0])
466
+ t^4 + (4*z^4 + 4*z^2 + 4*z - 1)*t^3 + 6*t^2 + (-4*z^4 - 4*z^2 - 4*z - 5)*t + 1
467
+ """
468
+
469
+ G = knot_exterior.fundamental_group()
470
+ rho = cyclic_rep(G, A)
471
+ n = rho.dim
472
+
473
+ C = rho.twisted_cochain_complex()
474
+ if C.homology(1).dimension() != n:
475
+ raise ValueError('Multiplicity of V is not 1')
476
+ d0, d1 = C.differential(0), C.differential(1)
477
+ B1 = d0.column_space()
478
+ Z1 = d1.right_kernel()
479
+ cocycle = next(z for z in Z1.basis() if z not in B1)
480
+ alpha = induced_rep_from_twisted_cocycle(p, rho, chi, cocycle)
481
+ ans = twisted_alexander_polynomial(alpha, reduced=True)
482
+ assert poly_involution(ans) == ans
483
+ return ans
484
+
485
+
486
+ def poly_involution(f):
487
+ """
488
+ sage: K = CyclotomicField(3, 'z')
489
+ sage: R = PolynomialRing(K, 't')
490
+ sage: z, t = K.gen(), R.gen()
491
+ sage: poly_involution(z*t**2 + (1/z)*t + 1)
492
+ t^2 + z*t - z - 1
493
+ """
494
+ R = f.parent()
495
+ K = R.base_ring()
496
+ z, t = K.gen(), R.gen()
497
+ bar = K.hom([1/z])
498
+ ans = R(0)
499
+ d = f.degree()
500
+ for e in f.exponents():
501
+ ans += bar(f[e])*t**(d - e)
502
+ return ans
503
+
504
+
505
+ def poly_is_a_norm(g):
506
+ """
507
+ Return whether the polynomial g(t) over a CyclotomicField is equal to
508
+ (const) f(t) fbar(t) where fbar is poly_involution(f)::
509
+
510
+ sage: K = CyclotomicField(5, 'z')
511
+ sage: R = PolynomialRing(K, 't')
512
+ sage: z, t = K.gen(), R.gen()
513
+ sage: f = z*t**2 + (1/z)*t + 1
514
+ sage: fbar = poly_involution(f)
515
+ sage: poly_is_a_norm(z**2 * f * fbar * (t - 1)**2)
516
+ True
517
+ sage: poly_is_a_norm(f**2 * fbar)
518
+ False
519
+ sage: poly_is_a_norm(f * fbar * (t - 1))
520
+ False
521
+ sage: poly_is_a_norm(4*t**2 + (z**3 + z**2 + 5)*t + 4)
522
+ False
523
+ """
524
+ factors = dict(g.factor())
525
+ for h in factors:
526
+ assert h.is_monic()
527
+ hbar = poly_involution(h)
528
+ hbar = hbar/hbar.leading_coefficient()
529
+ if hbar == h and factors[h] % 2 != 0:
530
+ return False
531
+ elif factors[h] != factors[hbar]:
532
+ return False
533
+
534
+ return True
535
+
536
+
537
+ def slicing_is_obstructed(knot_exterior, p, q):
538
+ """
539
+ Applies the test of Section 8 of [HKL] to the F_q homology of the
540
+ branched cover B_p::
541
+
542
+ sage: M = Manifold('K12n813')
543
+ sage: slicing_is_obstructed(M, 2, 3)
544
+ False
545
+ sage: slicing_is_obstructed(M, 3, 7)
546
+ True
547
+ """
548
+ p, q = ZZ(p), ZZ(q)
549
+ assert is_prime(p) and is_prime(q) and q > 2
550
+ reps = list(reps_appearing(knot_exterior, p, q))
551
+ if len(reps) == 0:
552
+ return False
553
+ for A, e in reps:
554
+ # Can only handle case when all reps appear with mult one.
555
+ if e > 1:
556
+ return False
557
+ # We always use the default chi, could try others as well.
558
+ chi = lambda v:v[0]
559
+ f = alex_poly_of_induced_rep(p, knot_exterior, A, chi)
560
+ if poly_is_a_norm(f):
561
+ return False
562
+
563
+ return True
564
+
565
+
566
+ def expand_prime_spec(spec, min_prime=2):
567
+ if spec in ZZ:
568
+ a, b = 0, spec
569
+ else:
570
+ if len(spec) != 2:
571
+ raise ValueError(f'Spec {spec} does not specify a range')
572
+ a, b = spec
573
+ a = max(a, min_prime)
574
+ return prime_range(a, b + 1)
575
+
576
+
577
+ @sage_method
578
+ def slice_obstruction_HKL(self, primes_spec,
579
+ verbose=False, check_in_S3=True):
580
+ """
581
+ For the exterior of a knot in S^3, searches for a topological
582
+ slicing obstruction from:
583
+
584
+ Herald, Kirk, Livingston, Math Zeit., 2010
585
+ https://dx.doi.org/10.1007/s00209-009-0548-1
586
+ https://arxiv.org/abs/0804.1355
587
+
588
+ The test looks at the cyclic branched covers of the knot of prime
589
+ order p and the F_q homology thereof where q is an odd prime. The
590
+ range of such (p, q) pairs searched is given by primes_spec as a
591
+ list of (p_max, [q_min, q_max]). It returns the pair (p, q) of
592
+ the first nonzero obstruction found (in which case K is not
593
+ slice), and otherwise returns None::
594
+
595
+ sage: M = Manifold('K12n813')
596
+ sage: spec = [(10, [0, 20]), (20, [0, 10])]
597
+ sage: M.slice_obstruction_HKL(spec, verbose=True)
598
+ Looking at (2, 3) ...
599
+ Looking at (3, 7) ...
600
+ (3, 7)
601
+
602
+ You can also specify the p to examine by a range [p_min, p_max] or
603
+ the q by just q_max::
604
+
605
+ sage: spec = [([3, 10], 10)]
606
+ sage: M.slice_obstruction_HKL(spec, verbose=True)
607
+ Looking at (3, 7) ...
608
+ (3, 7)
609
+
610
+ If primes_spec is just a pair (p, q) then only that obstruction is
611
+ checked::
612
+
613
+ sage: M.slice_obstruction_HKL((2, 3))
614
+ sage: M.slice_obstruction_HKL((3, 7))
615
+ (3, 7)
616
+
617
+ Technical note: As implemented, can only get an obstruction when
618
+ the decomposition of H_1(cover; F_q) into irreducible Z/pZ-modules
619
+ has no repeat factors. The method of [HKL] can be used more
620
+ broadly, but other cases requires computing many more twisted
621
+ Alexander polynomials.
622
+ """
623
+
624
+ M = self
625
+
626
+ if M.cusp_info('is_complete') != [True]:
627
+ raise ValueError('Need exactly one cusp which should be unfilled')
628
+ if M.homology().elementary_divisors() != [0]:
629
+ raise ValueError('Not the exterior of knot in S^3 as H_1 != Z')
630
+ if check_in_S3:
631
+ T = SnapPy.Triangulation(M)
632
+ T.dehn_fill((1, 0))
633
+ if T.fundamental_group().num_generators() != 0:
634
+ raise ValueError('The (1, 0) filling is not obviously S^3')
635
+
636
+ # Special case of only one (p, q) to check
637
+ if len(primes_spec) == 2:
638
+ p, q = primes_spec
639
+ if p in ZZ and q in ZZ:
640
+ if q == 2:
641
+ raise ValueError('Must have q > 2 when looking at H_1(cover; F_q)')
642
+ if not (is_prime(p) and is_prime(q)):
643
+ raise ValueError('Both p and q must be prime')
644
+ if slicing_is_obstructed(M, p, q):
645
+ return (p, q)
646
+ else:
647
+ return None
648
+
649
+ # Main case
650
+ primes_spec = [(expand_prime_spec(a), expand_prime_spec(b, min_prime=3))
651
+ for a, b in primes_spec]
652
+ for ps, qs in primes_spec:
653
+ for p in ps:
654
+ d = nonzero_divisor_product(M, p)
655
+ for q in qs:
656
+ if d % q == 0:
657
+ if verbose:
658
+ print(' Looking at', (p, q), '...')
659
+ if slicing_is_obstructed(M, p, q):
660
+ return (p, q)
661
+
662
+
663
+ if __name__ == '__main__':
664
+ import doctest
665
+ import sys
666
+ results = doctest.testmod()
667
+ print(results)
668
+ sys.exit(results[0])
@@ -0,0 +1,2 @@
1
+ from .mcomplex import *
2
+ from .files import *