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,165 @@
1
+ from . import matrix
2
+
3
+
4
+ def _gcd(s, t):
5
+ if t == 0:
6
+ return s
7
+ return _gcd(t, s % t)
8
+
9
+
10
+ def homology_basis_representatives_with_orders(d1, d2, N):
11
+ """
12
+ Given two matrices d1 and d2 such that d1 * d2 = 0, computes the
13
+ homology H_1 = ker(d1) / im(d2) when using Z (when N = 0)
14
+ or Z/N coefficients. The result is a list of pairs (vector, order)
15
+ forming a basis of H_1 as Abelian group.
16
+ A pair (vector, order) consists of a vector c_1 in ker(d1) representing a
17
+ homology class [c_1] in H_1 with the integer order being the order of [c_1]
18
+ if it is finite otherwise 0.
19
+ """
20
+
21
+ # two consecutive maps in a chain complex should give zero
22
+ assert matrix.is_matrix_zero(
23
+ matrix.matrix_mult(d1, d2))
24
+
25
+ # Change the basis of the chain groups C_0, C_1, C_2 by the matrices
26
+ # basechangeN
27
+ # transformed_d1 and transformed_d2 are the boundary maps d1 and d2 but
28
+ # with respect to the new basis. In this new basis, the boundary maps will
29
+ # have at most one non-zero entry per row, respectively, per column so that
30
+ # we can directly read of whether a basis vector is in ker(d1) and im(d2).
31
+ basechange0, basechange1, basechange2, transformed_d1, transformed_d2 = (
32
+ matrix.simultaneous_smith_normal_form(d1, d2))
33
+
34
+ # Perform consistency checks
35
+ matrix.test_simultaneous_smith_normal_form(
36
+ d1, d2,
37
+ basechange0, basechange1, basechange2,
38
+ transformed_d1, transformed_d2)
39
+
40
+ # Perform consistency check
41
+ assert matrix.is_matrix_zero(
42
+ matrix.matrix_mult(transformed_d1, transformed_d2))
43
+
44
+ # Will hold the result
45
+ homology_basis = []
46
+
47
+ # A list of all the basis vectors
48
+ basis_vectors = matrix.matrix_transpose(basechange1)
49
+
50
+ # Iterate through the basis vectors
51
+ for i, basis_vector in enumerate(basis_vectors):
52
+
53
+ # Get the absolute value of the one non-zero entry in
54
+ # the i-th column of d1 with respect to the new basis
55
+ d1_entry = matrix.max_abs_of_col(transformed_d1, i)
56
+
57
+ # i-th row of d2
58
+ d2_entry = matrix.max_abs_of_row(transformed_d2, i)
59
+
60
+ # Note that d1 * d2 = 0, so at most one of d1_entry and d2_entry
61
+ # can be non-zero.
62
+
63
+ # If using Z/N coefficients, apply gcd and modulo N to entries.
64
+ if not N == 0:
65
+ # We do this because we want to compute the image and the kernel
66
+ # of maps m: Z/N -> Z/N, x |-> e*x.
67
+ # For this consider the quantity gcd(e,N) % N.
68
+ # The image of m consists of multiplies of gcd(e,N) % N.
69
+ # If gcd(e, N) % N is 0, the kernel is Z/N. If 1, the kernel is 0.
70
+ # Otherwise, N / (gcd(e, N) % N) is generating the kernel and the
71
+ # kernel has size gcd(e, N) % N).
72
+
73
+ # Example: Z/6 -> Z/6, x |-> 5 * x has full image Z/6 because
74
+ # gcd(5, 6) = 1. The kernel is 0.
75
+
76
+ # Z/6 -> Z/6, x |-> 4 * x has image all even elements in Z/6
77
+ # because gcd(4, 6) = 2. Its kernel also consists of 2 elements,
78
+ # namely 0 and 3 = 6 / 2 = 6 / gcd(4, 6).
79
+
80
+ d1_entry = _gcd(d1_entry, N) % N
81
+ d2_entry = _gcd(d2_entry, N) % N
82
+
83
+ if d1_entry == 0:
84
+ # The image of the basis vector is 0, hence the basis vector
85
+ # is in the kernel of d1.
86
+
87
+ # However, it might be entirely killed by the image of d2.
88
+ # It is not entirely killed if and only if d2 entry is not 1.
89
+ if not d2_entry == 1:
90
+ # The basis vector times the d2 entry is in the image of d2
91
+ # and thus zero in the homology.
92
+ # Thus the d2 entry determines the order of the homology class
93
+ # this basis vector represents.
94
+ if N == 0:
95
+ # In the Z-coefficient case, the order is just given by the
96
+ # d2 entry. This is even when d2 entry is zero as infinite
97
+ # order is encoded by 0.
98
+ homology_basis.append( (basis_vector, d2_entry) )
99
+ else:
100
+ if d2_entry == 0:
101
+ # If the d2 entry is 0, no multiple of the basis vector
102
+ # is killed by the image. But we have Z/N-coefficients,
103
+ # so the order is N.
104
+ homology_basis.append( (basis_vector, N) )
105
+ else:
106
+ # Order is just d2 entry.
107
+ homology_basis.append( (basis_vector, d2_entry) )
108
+
109
+ elif not d1_entry == 1:
110
+ # d1 entry is neither 0 or 1. In Z-coefficients this means
111
+ # that no multiple of basis vector can be in the kernel.
112
+ if not N == 0:
113
+ # But in Z/N-coefficients, multiplying by N/d1_entry
114
+ # gives a generator of the kernel that has order d1_entry
115
+ # in the homology.
116
+ kernel_vector = [ ( b * N / d1_entry ) % N
117
+ for b in basis_vector ]
118
+ homology_basis.append( (kernel_vector, d1_entry) )
119
+
120
+ # d1 entry is 1, so the basis vector or any multiple of it
121
+ # is in the kernel. Do not add it
122
+
123
+ return homology_basis
124
+
125
+
126
+ def homology_representatives(d1, d2, N):
127
+ """
128
+ Given two matrices d1 and d2 such that d1 * d2 = 0, computes the
129
+ homology H_1 = ker(d1) / im(d2) when using Z/N coefficients.
130
+
131
+ The result is a list of vectors c_1 for each homology class [c_1].
132
+ """
133
+
134
+ assert N > 1
135
+
136
+ # Compute a basis of the homology group
137
+ homology_basis = homology_basis_representatives_with_orders(d1, d2, N)
138
+
139
+ # Enumerate all linear combinations of the basis elements
140
+ return _enumerate_from_basis(homology_basis, matrix.num_cols(d1), N)
141
+
142
+
143
+ def _enumerate_from_basis(basis, l, N):
144
+ """
145
+ Given a list of pairs `(v_i, o_i)` where each `v_i` is a vector of length l
146
+ and an integer N > 2, iterate through all linear combinations
147
+ `k_0 v_0 + k_1 v_1 + ... + k_m v_m` (modulo N) where `k_i = 0, ..., o_i`.
148
+
149
+ If basis is empty, just return zero vector of length l.
150
+ """
151
+
152
+ if len(basis) == 0:
153
+ # Base case, return zero vector of length l
154
+ yield l * [ 0 ]
155
+ else:
156
+ # Take first pair (vector, order) from given list
157
+ basis_vector, order = basis[0]
158
+ # Iterate up until order
159
+ for i in range(order):
160
+ # Iterate through all linear combinations of remaining basis
161
+ # elements
162
+ for vector in _enumerate_from_basis(basis[1:], l, N):
163
+ # Return the linear combination of the multiple of this basis
164
+ # vector and the linear combination of the other basis vectors
165
+ yield [ (i * b + v) % N for b, v in zip(basis_vector, vector) ]
@@ -0,0 +1,229 @@
1
+ // Setting up the Polynomial ring and ideal
2
+
3
+ R<$VARIABLES> := PolynomialRing(RationalField(), $VARIABLE_NUMBER, "grevlex");
4
+ MyIdeal := ideal<R |
5
+ $EQUATIONS>;
6
+
7
+ // Variable names, unfortunately "Names(R)" does not work for old magma versions
8
+ varNames := [ $VARIABLES_QUOTED ];
9
+
10
+ // Term order in which the decomposition will be reported
11
+ termOrder := "lex";
12
+
13
+ // Whether to compute witnesses for 1-dim ideals
14
+ computeWitnesses := true;
15
+
16
+ // Whether to compute the genus for 1-dim ideals
17
+ computeGenuses := true;
18
+
19
+ // Data necessary to recover all Ptolemy coordinates and the triangulation
20
+ print $QUOTED_PREAMBLE;
21
+
22
+ // Various helper functions
23
+ function SaturateIdeal(baseRing, theIdeal)
24
+
25
+ print "Status: Computing Groebner basis...";
26
+ time Groebner(theIdeal);
27
+
28
+ for i := 1 to Rank(baseRing) do
29
+ saturatedIdeal := -1;
30
+ print "Status: Saturating ideal (", i, "/", Rank(baseRing), ")...";
31
+ time saturatedIdeal := Saturation(theIdeal, baseRing.i);
32
+ print "Status: Recomputing Groebner basis...";
33
+ time Groebner(saturatedIdeal);
34
+ theIdeal := saturatedIdeal;
35
+ end for;
36
+
37
+ print "Status: Dimension of ideal: ", Dimension(saturatedIdeal);
38
+
39
+ return saturatedIdeal;
40
+ end function;
41
+
42
+ function ZeroDimensionalIdealChangeOrder(theIdeal, order)
43
+ if Dimension(theIdeal) le 0 then
44
+ print "Status: Changing to term order ", order, "...";
45
+ time result := ChangeOrder(theIdeal, order);
46
+ print "Status: Recomputing Groebner basis...";
47
+ time Groebner(result);
48
+ print "Status: Confirming is prime...";
49
+ time isPrime := IsPrime(result);
50
+ if not isPrime then
51
+ print "Not prime!";
52
+ exit;
53
+ end if;
54
+ return result;
55
+ else
56
+ return theIdeal;
57
+ end if;
58
+ end function;
59
+
60
+ function ZeroDimensionalIdealsChangeOrder(theIdeals, order)
61
+ return [ ZeroDimensionalIdealChangeOrder(theIdeal, order) :
62
+ theIdeal in theIdeals ];
63
+ end function;
64
+
65
+ function FreeVariablesOfIdeal(varNames, theIdeal)
66
+ D, vars := Dimension(theIdeal);
67
+ return [ "\"" cat varNames[var] cat "\"" : var in vars];
68
+ end function;
69
+
70
+ function FreeVariablesOfIdeals(varNames, theIdeals)
71
+ return [ FreeVariablesOfIdeal(varNames, theIdeal) : theIdeal in theIdeals];
72
+ end function;
73
+
74
+ function IsSuitableWitness(theIdeals, theIndex, witnessIdeal)
75
+ if not Dimension(witnessIdeal) eq 0 then
76
+ return false;
77
+ end if;
78
+ for index := 1 to #theIdeals do
79
+ if not index eq theIndex then
80
+ if Dimension(theIdeals[index]) gt 0 then
81
+ if not Dimension(theIdeals[index] + witnessIdeal) eq -1 then
82
+ return false;
83
+ end if;
84
+ end if;
85
+ end if;
86
+ end for;
87
+ return true;
88
+ end function;
89
+
90
+ function IncrementList(theList)
91
+ for index := #theList to 1 by -1 do
92
+ if index eq 1 then
93
+ theList[1] := theList[1] + 1;
94
+ return theList;
95
+ else
96
+ if theList[index] lt theList[1] then
97
+ theList[index] := theList[index] + 1;
98
+ return theList;
99
+ else
100
+ theList[index] := 1;
101
+ end if;
102
+ end if;
103
+ end for;
104
+ end function;
105
+
106
+ function GenerateWitnessIdeal(baseRing, theIdeal, coordinates)
107
+
108
+ D, vars := Dimension(theIdeal);
109
+
110
+ witnessIdeal := theIdeal;
111
+
112
+ for index := 1 to #coordinates do
113
+ var := vars[index];
114
+ val := coordinates[index];
115
+ witnessIdeal := witnessIdeal + ideal<baseRing | baseRing.var - val>;
116
+ end for;
117
+
118
+ return SaturateIdeal(baseRing, witnessIdeal);
119
+ end function;
120
+
121
+ function FindWitness(baseRing, theIdeals, index)
122
+ theIdeal := theIdeals[index];
123
+ D, vars := Dimension(theIdeal);
124
+
125
+ if D le 0 then
126
+ return ideal<baseRing | >;
127
+ end if;
128
+
129
+ coordinates := [1: var in vars];
130
+
131
+ while true do
132
+
133
+ witnessIdeal := GenerateWitnessIdeal(baseRing, theIdeal, coordinates);
134
+ print "Status: Testing witness ", coordinates, "...";
135
+
136
+ time isSuitable := IsSuitableWitness(theIdeals, index, witnessIdeal);
137
+ if isSuitable then
138
+ return RadicalDecomposition(witnessIdeal)[1];
139
+ end if;
140
+
141
+ coordinates := IncrementList(coordinates);
142
+ end while;
143
+ end function;
144
+
145
+ function FindWitnesses(baseRing, theIdeals)
146
+ print "Status: Finding witnesses for non-zero dimensional ideals...";
147
+ return [ FindWitness(baseRing, theIdeals, index) : index in [1..#theIdeals]];
148
+ end function;
149
+
150
+
151
+
152
+
153
+
154
+
155
+ // Computations begin here
156
+ saturatedIdeal := SaturateIdeal(R, MyIdeal);
157
+
158
+ // Compute radical decomposition
159
+ print "Status: Computing RadicalDecomposition";
160
+ time P := RadicalDecomposition(saturatedIdeal);
161
+
162
+ print "Status: Number of components: ", #P;
163
+
164
+ print "DECOMPOSITION=TYPE: RadicalDecomposition";
165
+
166
+ // Initialize Porder to -1 so that we can check later whether an error or user
167
+ // interrupt happened.
168
+ Porder := -1;
169
+
170
+ // change 0-dim components to desired term order
171
+ POrder := ZeroDimensionalIdealsChangeOrder(P, termOrder);
172
+
173
+ print "IDEAL=DECOMPOSITION" cat "=TIME: ", Cputime();
174
+
175
+ if Type(POrder) eq RngIntElt then
176
+ // An error or user interrupt occurred, bail
177
+ print "IDEAL=DECOMPOSITION" cat "=FAILED";
178
+ exit;
179
+ end if;
180
+
181
+ print "IDEAL=DECOMPOSITION" cat "=BEGINS=HERE";
182
+ POrder;
183
+ print "IDEAL=DECOMPOSITION" cat "=ENDS=HERE";
184
+
185
+
186
+ print "FREE=VARIABLES=IN=COMPONENTS" cat "=BEGINS=HERE";
187
+ FreeVariablesOfIdeals(varNames, POrder);
188
+ print "FREE=VARIABLES=IN=COMPONENTS" cat "=ENDS=HERE";
189
+
190
+ if computeWitnesses then
191
+ witnesses := FindWitnesses(R, POrder);
192
+
193
+ witnessesOrder := -1;
194
+ witnessesOrder := ZeroDimensionalIdealsChangeOrder(witnesses, termOrder);
195
+
196
+ if Type(witnessesOrder) eq RngIntElt then
197
+ print "WITNESSES=FOR=COMPONENTS" cat "=FAILED";
198
+ exit;
199
+ end if;
200
+
201
+ print "==WITNESSES=FOR=COMPONENTS" cat "=BEGINS==";
202
+
203
+ for witness in witnessesOrder do
204
+ print "==WITNESSES=BEGINS==";
205
+ if not IsZero(witness) then
206
+ print "==WITNESS=BEGINS==";
207
+ witness;
208
+ print "==WITNESS=ENDS==";
209
+ end if;
210
+ print "==WITNESSES=ENDS==";
211
+ end for;
212
+
213
+ print "==WITNESSES=FOR=COMPONENTS" cat "=ENDS==";
214
+ end if;
215
+
216
+ if computeGenuses then
217
+ print "==GENUSES=FOR=COMPONENTS" cat "=BEGINS==";
218
+
219
+ for comp in POrder do
220
+ print "==GENUS=FOR=COMPONENT=BEGINS==";
221
+ D, vars := Dimension(comp);
222
+ if D eq 1 then
223
+ print Genus(Curve(AffineSpace(R), comp));
224
+ end if;
225
+ print "==GENUS=FOR=COMPONENT=ENDS==";
226
+ end for;
227
+
228
+ print "==GENUSES=FOR=COMPONENTS" cat "=ENDS==";
229
+ end if;
@@ -0,0 +1,79 @@
1
+
2
+ // Setting up the Polynomial ring and ideal
3
+
4
+ R<$VARIABLES_WITH_NON_ZERO_CONDITION> := PolynomialRing(RationalField(), $VARIABLE_WITH_NON_ZERO_CONDITION_NUMBER);
5
+ MyIdeal := ideal<R |
6
+ $EQUATIONS_WITH_NON_ZERO_CONDITION>;
7
+
8
+ // N := Names(R); // unfortunately does not work for old magma versions
9
+ N := [ $VARIABLES_WITH_NON_ZERO_CONDITION_QUOTED ];
10
+
11
+
12
+
13
+ print $QUOTED_PREAMBLE;
14
+
15
+
16
+
17
+ // Initialize Q to -1 so that we can check whether an error happened
18
+ // by checking that Q is still of type integer.
19
+ Q := -1;
20
+
21
+ // Remember start time to calculate computation time
22
+ primTime := Cputime();
23
+
24
+
25
+
26
+
27
+ print "DECOMPOSITION=TYPE: Radicals of Primary Decomposition";
28
+
29
+ P, Q := PrimaryDecomposition(MyIdeal);
30
+
31
+
32
+
33
+ print "IDEAL=DECOMPOSITION" cat "=TIME: ", Cputime(primTime);
34
+
35
+ if Type(Q) eq RngIntElt then
36
+ // Some error occurred
37
+ print "IDEAL=DECOMPOSITION" cat "=FAILED";
38
+ exit;
39
+ else
40
+ // Success
41
+ print "IDEAL=DECOMPOSITION" cat "=BEGINS=HERE";
42
+ Q;
43
+ print "IDEAL=DECOMPOSITION" cat "=ENDS=HERE";
44
+
45
+
46
+ print "FREE=VARIABLES=IN=COMPONENTS" cat "=BEGINS=HERE";
47
+ isFirstComp := true;
48
+ freeVarStr := "[";
49
+ for Comp in Q do
50
+
51
+ if isFirstComp then
52
+ isFirstComp := false;
53
+ else
54
+ freeVarStr := freeVarStr cat ",";
55
+ end if;
56
+ freeVarStr := freeVarStr cat "\n [ ";
57
+
58
+ D, Vars := Dimension(Comp);
59
+
60
+ isFirstVar := true;
61
+ for Var in Vars do
62
+ if isFirstVar then
63
+ isFirstVar := false;
64
+ else
65
+ freeVarStr := freeVarStr cat ", ";
66
+ end if;
67
+
68
+ freeVarStr := freeVarStr cat "\"" cat N[Var] cat "\"";
69
+ end for;
70
+
71
+ freeVarStr := freeVarStr cat " ]";
72
+ end for;
73
+ freeVarStr := freeVarStr cat "\n]";
74
+ print freeVarStr;
75
+ print "FREE=VARIABLES=IN=COMPONENTS" cat "=ENDS=HERE";
76
+ end if;
77
+
78
+ print "CPUTIME: ", Cputime(primTime);
79
+