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
snappy/ptolemy/rur.py ADDED
@@ -0,0 +1,545 @@
1
+ # Dependency on pari for:
2
+ # * from_pari_fraction_and_number_field
3
+ # * evaluate_at_root
4
+ # * number_field
5
+ # * to_PUR
6
+ # * to_pari_fraction
7
+
8
+ from ..sage_helper import _within_sage
9
+ from ..pari import Gen, pari
10
+ from ..math_basics import prod
11
+ if _within_sage:
12
+ from sage.rings.integer import Integer
13
+
14
+
15
+ class RUR():
16
+
17
+ """
18
+ A Rational Univariate Representation of an algebraic number.
19
+
20
+ A Rational Univariate Representation is a fraction a/b where a and b are
21
+ polynomials in a root of another polynomial c.
22
+
23
+ An object of this class is a list of pairs (polymod, exponent) where
24
+ polymod is a pari POLMOD object such as Mod(x, x^2+1) or just a python
25
+ integer and exponent is an integer. It represents the product of all
26
+ polymod^exponent.
27
+ The numerator can be thought of as the product of all terms with positive
28
+ exponent and the denominator as the inverse of the product of all terms
29
+ with negative exponent.
30
+
31
+ All polynomials are assumed to be in the variable x.
32
+
33
+ Constructing RUR from an int
34
+ >>> a = RUR.from_int(4)
35
+ >>> a
36
+ ( 4 )
37
+
38
+ Constructing a rational number
39
+ >>> b = RUR.from_int(4) / RUR.from_int(5)
40
+ >>> b
41
+ ( 4 ) / ( 5 )
42
+
43
+ >>> c = RUR.from_int(7) / RUR.from_int(10)
44
+ >>> c
45
+ ( 7 ) / ( 10 )
46
+
47
+ Addition
48
+ >>> a + b
49
+ ( 24 ) / ( 5 )
50
+
51
+ Multiplication remembers the terms in the numerator and denominator.
52
+ The multiplication of the numerator and denominator terms is delayed
53
+ until later.
54
+ In particular, when a RUR is numerically evaluated at a given root, each
55
+ factor is evaluated first before multiplication (increases numerical
56
+ precision and prevents polynomial coefficients from blowing up).
57
+ However, addition and subtraction trigger multiplication.
58
+
59
+ >>> a * b
60
+ ( 4^2 ) / ( 5 )
61
+
62
+ >>> a * b * b
63
+ ( 4^3 ) / ( 5^-2 )
64
+
65
+ >>> a * (b ** 5)
66
+ ( 4^6 ) / ( 5^-5 )
67
+
68
+ The representation will be reduced when terms match.
69
+
70
+ >>> 5 * (b ** 3)
71
+ ( 4^3 ) / ( 5^-2 )
72
+
73
+ But not reduced even though some terms in the numerator and denominator
74
+ have common factors.
75
+
76
+ >>> 2 * c
77
+ ( 7 * 2 ) / ( 10 )
78
+
79
+ A division example
80
+
81
+ >>> a / b
82
+ ( 5 )
83
+
84
+ Addition triggers multiplication of numerator terms
85
+
86
+ >>> b ** 3 + a
87
+ ( 564 ) / ( 5^-3 )
88
+
89
+ A subtraction example
90
+
91
+ >>> a - b
92
+ ( 16 ) / ( 5 )
93
+
94
+ Tests for the equality operator
95
+
96
+ >>> a / b == 1
97
+ False
98
+
99
+ >>> a / a == 1
100
+ True
101
+
102
+ >>> a / a - 1 == 0
103
+ True
104
+
105
+ >>> a / b - 1 == 0
106
+ False
107
+
108
+ >>> (a - b) ** 3 - a ** 3 + 3 * a ** 2 * b - 3 * a * b ** 2 + b ** 3 == 0
109
+ True
110
+
111
+ The number field used in these examples
112
+ >>> nf = pari("x^97+x^3+x+32121")
113
+
114
+ Some polynomials used in this example
115
+ >>> a = pari("43*x^3 + 1")
116
+ >>> b = pari("x^2 + 3")
117
+ >>> c = pari("x^3 + 3 * x + 7")
118
+
119
+ >>> r1 = RUR.from_pari_fraction_and_number_field(b / a, nf)
120
+ >>> r2 = RUR.from_pari_fraction_and_number_field(c / a, nf)
121
+ >>> r3 = RUR.from_pari_fraction_and_number_field(b / (a+c), nf)
122
+
123
+ >>> r1 == r2
124
+ False
125
+
126
+ >>> r1 == r3
127
+ False
128
+
129
+ >>> r2 == r3
130
+ False
131
+
132
+ >>> r1 / r2
133
+ ( Mod(x^2 + 3, x^97 + x^3 + x + 32121) ) / ( Mod(x^3 + 3*x + 7, x^97 + x^3 + x + 32121) )
134
+
135
+ >>> r1 / r2 == RUR.from_pari_fraction_and_number_field(b/c, nf)
136
+ True
137
+
138
+ >>> r1 + r2
139
+ ( Mod(x^3 + x^2 + 3*x + 10, x^97 + x^3 + x + 32121) ) / ( Mod(43*x^3 + 1, x^97 + x^3 + x + 32121) )
140
+
141
+ >>> r1 + r2 == r1
142
+ False
143
+
144
+ >>> (r2 + r1 + r3) / r3 + (r1 + r2) ** 2 / r1 == 1 + r1 + 2 * r2 + (r1 * (r1 + r2) + r2 ** 2 * r3) / (r1 * r3)
145
+ True
146
+
147
+ >>> r1 - r1 == 0
148
+ True
149
+
150
+ >>> r1 - r1 == r2 - r2
151
+ True
152
+
153
+ >>> r1 - r2 == 0
154
+ False
155
+
156
+ >>> r1 + r2 == 0
157
+ False
158
+
159
+ >>> r1 + r2 - r2 + r3/r3 - 1 - r1 == 0
160
+ True
161
+
162
+ """
163
+
164
+ @staticmethod
165
+ def from_int(value):
166
+ return RUR( [ (value, 1) ] )
167
+
168
+ @staticmethod
169
+ def from_pari_fraction_and_number_field(fraction, poly):
170
+ if poly:
171
+ return RUR( [ ( fraction.numerator().Mod(poly), 1),
172
+ (fraction.denominator().Mod(poly), -1)] )
173
+ else:
174
+ return RUR( [ ( fraction.numerator(), 1),
175
+ (fraction.denominator(), -1)] )
176
+
177
+ def __init__(self, polymod_exponent_pairs):
178
+
179
+ reduced_polymod_exponent_pairs = []
180
+
181
+ def add_to_list_of_pairs(polymod, exponent):
182
+ # Disregard 1
183
+ if polymod - 1 == 0:
184
+ return
185
+
186
+ # Turn -1 of polmod type to -1 int
187
+ if polymod + 1 == 0:
188
+ polymod = -1
189
+
190
+ for i, (p, e) in enumerate(reduced_polymod_exponent_pairs):
191
+ if p - polymod == 0:
192
+ reduced_polymod_exponent_pairs[i] = (p, e + exponent)
193
+ return
194
+
195
+ reduced_polymod_exponent_pairs.append((polymod, exponent))
196
+
197
+ def detect_zero(polymod, exponent):
198
+ if polymod == 0:
199
+ if exponent < 0:
200
+ raise Exception("RUR division by 0")
201
+ return exponent > 0
202
+ return False
203
+
204
+ for polymod, exponent in polymod_exponent_pairs:
205
+ if detect_zero(polymod, exponent):
206
+ self._polymod_exponent_pairs = [ (0, 1) ]
207
+ return
208
+ add_to_list_of_pairs(polymod, exponent)
209
+
210
+ reduced_polymod_exponent_pairs = [
211
+ (p, e % 2) if p + 1 == 0 else (p, e)
212
+ for (p, e) in reduced_polymod_exponent_pairs ]
213
+
214
+ self._polymod_exponent_pairs = [
215
+ (p, e)
216
+ for (p, e) in reduced_polymod_exponent_pairs
217
+ if not e == 0 ]
218
+
219
+ def __repr__(self):
220
+ if self._polymod_exponent_pairs == []:
221
+ return '1'
222
+ if self._is_zero():
223
+ return '0'
224
+
225
+ def process_pair(polymodExponent):
226
+ polymod, exponent = polymodExponent
227
+ if abs(exponent) == 1:
228
+ return '%s' % polymod
229
+ else:
230
+ return '%s^%d' % (polymod, exponent)
231
+
232
+ numerator = ' * '.join(
233
+ process_pair(pair) for pair in self._numerator_terms())
234
+ denominator = ' * '.join(
235
+ process_pair(pair) for pair in self._denominator_terms())
236
+
237
+ if not numerator:
238
+ numerator = 1
239
+ else:
240
+ numerator = '( %s )' % numerator
241
+
242
+ if not denominator:
243
+ return numerator
244
+
245
+ return '%s / ( %s )' % (numerator, denominator)
246
+
247
+ def number_field(self):
248
+ """
249
+ Returns the polynomial c such that evaluating the fraction
250
+ at one of the roots yields the algebraic number this RUR is
251
+ supposed to represent.
252
+ """
253
+
254
+ for p, e in self._polymod_exponent_pairs:
255
+ if type(p) == Gen and p.type() == 't_POLMOD':
256
+ return p.mod()
257
+ return None
258
+
259
+ def evaluate_at_root(self, root):
260
+ """
261
+ Given a numerical value for a root of the polynomial returned
262
+ by number_field, evaluates all polynomials at that root and
263
+ computes the value of the fraction.
264
+
265
+ >>> nf = pari('x^2+x+1')
266
+ >>> a = pari('x+2')
267
+ >>> b = pari('3*x + 1/5')
268
+
269
+ >>> root = pari('-0.5 + 0.8660254')
270
+
271
+ >>> prev = pari.set_real_precision(15)
272
+
273
+ >>> r = RUR.from_pari_fraction_and_number_field(a/b, nf)
274
+ >>> r
275
+ ( Mod(5*x + 10, x^2 + x + 1) ) / ( Mod(15*x + 1, x^2 + x + 1) )
276
+
277
+ >>> r.evaluate_at_root(root)
278
+ 1.82271687902451
279
+
280
+ >>> dummy = pari.set_real_precision(prev)
281
+
282
+ """
283
+
284
+ def evaluate_poly(p):
285
+
286
+ if type(p) == Gen and p.type() == 't_POLMOD':
287
+ return p.lift().substpol('x', root)
288
+
289
+ return pari(p)
290
+
291
+ return prod(
292
+ [ evaluate_poly(p) ** e for p, e in self._polymod_exponent_pairs ])
293
+
294
+ def multiply_terms(self):
295
+ """
296
+ Multiplies all the terms that make up the numerator and denominator
297
+ so that there is at most one term in each.
298
+
299
+ >>> nf = pari("x^97+x^3+x+32121")
300
+ >>> a = pari("43*x^3 + 1")
301
+ >>> b = pari("x^2 + 3")
302
+ >>> c = pari("x^2 + 4")
303
+
304
+ >>> r1 = RUR.from_pari_fraction_and_number_field(a / b, nf)
305
+ >>> r2 = RUR.from_pari_fraction_and_number_field(c, nf)
306
+ >>> r = r1 * r2
307
+
308
+ >>> r
309
+ ( Mod(43*x^3 + 1, x^97 + x^3 + x + 32121) * Mod(x^2 + 4, x^97 + x^3 + x + 32121) ) / ( Mod(x^2 + 3, x^97 + x^3 + x + 32121) )
310
+
311
+ >>> r.multiply_terms()
312
+ ( Mod(43*x^5 + 172*x^3 + x^2 + 4, x^97 + x^3 + x + 32121) ) / ( Mod(x^2 + 3, x^97 + x^3 + x + 32121) )
313
+
314
+ """
315
+
316
+ return RUR( [ (self._numerator(), 1), (self._denominator(), -1) ] )
317
+
318
+ def multiply_and_simplify_terms(self):
319
+ """
320
+ Multiplies all terms that make up the numerator and denominator
321
+ and also reduce them. Reducing requires comupting the gcd.
322
+
323
+ >>> nf = pari("x^97+x^3+x+32121")
324
+ >>> a = pari("43*x^3 + 1")
325
+ >>> b = pari("43*x^3 + 2")
326
+ >>> c = pari("43*x^3 + 3")
327
+ >>> d = pari("43*x^3 + 4")
328
+
329
+ >>> r1 = RUR.from_pari_fraction_and_number_field(a * b / c, nf)
330
+ >>> r2 = RUR.from_pari_fraction_and_number_field(c / a, nf)
331
+ >>> r3 = RUR.from_pari_fraction_and_number_field(d, nf)
332
+ >>> r = r1 * r2 * r3
333
+
334
+ The c's cancel when multiplying.
335
+
336
+ >>> r
337
+ ( Mod(1849*x^6 + 129*x^3 + 2, x^97 + x^3 + x + 32121) * Mod(43*x^3 + 4, x^97 + x^3 + x + 32121) ) / ( Mod(43*x^3 + 1, x^97 + x^3 + x + 32121) )
338
+
339
+ The terms in a * b and d in numerator get multiplied.
340
+
341
+ >>> r.multiply_terms()
342
+ ( Mod(79507*x^9 + 12943*x^6 + 602*x^3 + 8, x^97 + x^3 + x + 32121) ) / ( Mod(43*x^3 + 1, x^97 + x^3 + x + 32121) )
343
+
344
+ Now the c's cancel as well.
345
+
346
+ >>> r.multiply_and_simplify_terms()
347
+ ( Mod(1849*x^6 + 258*x^3 + 8, x^97 + x^3 + x + 32121) )
348
+
349
+ """
350
+
351
+ return RUR.from_pari_fraction_and_number_field(
352
+ self.to_pari_fraction(), self.number_field())
353
+
354
+ def to_PUR(self):
355
+ """
356
+ Converts it into a Polynomial Univariate Representation that is
357
+ either a pari POLMOD object or a pari rational number.
358
+
359
+ >>> nf = pari("x^9+x^3+x+32121")
360
+ >>> a = pari("43*x^3 + 1")
361
+ >>> b = pari("x^2 + 3")
362
+
363
+ >>> r = RUR.from_pari_fraction_and_number_field(a / b, nf)
364
+ >>> r
365
+ ( Mod(43*x^3 + 1, x^9 + x^3 + x + 32121) ) / ( Mod(x^2 + 3, x^9 + x^3 + x + 32121) )
366
+
367
+ Polynomial Univariate Representation has larger coefficients:
368
+
369
+ >>> r.to_PUR()
370
+ Mod(1035922/257944341*x^8 - 129/85981447*x^7 - 1035922/85981447*x^6 + 387/85981447*x^5 + 3107766/85981447*x^4 - 1161/85981447*x^3 - 26933972/257944341*x^2 + 3697205575/85981447*x + 81837838/257944341, x^9 + x^3 + x + 32121)
371
+
372
+
373
+ """
374
+
375
+ return pari(self._numerator()) / pari(self._denominator())
376
+
377
+ def to_pari_fraction(self):
378
+ """
379
+ Returns it as pari quotient of two polynomials. The value
380
+ represented by this RUR is obtained by evaluating the quotient
381
+ at a root of the polynomial returned by number_field.
382
+
383
+ >>> nf = pari("x^97+x^3+x+32121")
384
+ >>> a = pari("43*x^3 + 1")
385
+ >>> b = pari("x^2 + 3")
386
+
387
+ >>> r = 2 * RUR.from_pari_fraction_and_number_field(a / b, nf)
388
+ >>> r
389
+ ( Mod(43*x^3 + 1, x^97 + x^3 + x + 32121) * 2 ) / ( Mod(x^2 + 3, x^97 + x^3 + x + 32121) )
390
+
391
+ >>> r.multiply_terms()
392
+ ( Mod(86*x^3 + 2, x^97 + x^3 + x + 32121) ) / ( Mod(x^2 + 3, x^97 + x^3 + x + 32121) )
393
+
394
+ >>> r.to_pari_fraction()
395
+ (86*x^3 + 2)/(x^2 + 3)
396
+
397
+ """
398
+
399
+ return (pari(self._numerator()).lift() /
400
+ pari(self._denominator()).lift())
401
+
402
+ def _filtered_terms(self, sgn):
403
+ return [ (p, e) for p, e in self._polymod_exponent_pairs
404
+ if sgn * e >= 0 ]
405
+
406
+ def _numerator_terms(self):
407
+ return self._filtered_terms( +1)
408
+
409
+ def _denominator_terms(self):
410
+ return self._filtered_terms( -1)
411
+
412
+ def _multiply_terms(self, sgn):
413
+ return prod([ p ** abs(e) for p, e in self._filtered_terms(sgn) ])
414
+
415
+ def _numerator(self):
416
+ return self._multiply_terms( +1)
417
+
418
+ def _denominator(self):
419
+ return self._multiply_terms( -1)
420
+
421
+ def __add__(self, other):
422
+
423
+ if isinstance(other, int):
424
+ return self + RUR.from_int(other)
425
+
426
+ new_denominator_terms = []
427
+
428
+ def add_to_new_denominator_terms(polymod, exponent):
429
+ for i, (p, e) in enumerate(new_denominator_terms):
430
+ if p - polymod == 0:
431
+ new_denominator_terms[i] = (p, min(e, exponent))
432
+ return
433
+ new_denominator_terms.append( (polymod, exponent) )
434
+
435
+ for rur in self, other:
436
+ for polymod, exponent in rur._denominator_terms():
437
+ add_to_new_denominator_terms(polymod, exponent)
438
+
439
+ def subtract_denominator_from_list(polymod, exponent, l):
440
+ for i, (p, e) in enumerate(l):
441
+ if p - polymod == 0:
442
+ l[i] = (p, e - exponent)
443
+ return
444
+
445
+ def term_to_expand_fraction_by(old_terms):
446
+ result = list(new_denominator_terms)
447
+ for p, e in old_terms:
448
+ if e < 0:
449
+ subtract_denominator_from_list(p, e, result)
450
+
451
+ for p, e in result:
452
+ assert e <= 0
453
+
454
+ return prod([ p ** -e for p, e in result if e < 0 ])
455
+
456
+ self_expand = term_to_expand_fraction_by( self._denominator_terms())
457
+ other_expand = term_to_expand_fraction_by(other._denominator_terms())
458
+
459
+ new_numerator = ( self._numerator() * self_expand +
460
+ other._numerator() * other_expand)
461
+
462
+ return RUR([(new_numerator, 1)] + new_denominator_terms)
463
+
464
+ def __radd__(self, other):
465
+ if isinstance(other, int):
466
+ return self + RUR.from_int(other)
467
+
468
+ raise Exception("Addition of types not supported")
469
+
470
+ def __sub__(self, other):
471
+ return self + (-other)
472
+
473
+ def __neg__(self):
474
+ return RUR.from_int(-1) * self
475
+
476
+ def __mul__(self, other):
477
+ if isinstance(other, int):
478
+ return self * RUR.from_int(other)
479
+
480
+ return RUR(
481
+ self._polymod_exponent_pairs + other._polymod_exponent_pairs)
482
+
483
+ def __rmul__(self, other):
484
+ if isinstance(other, int):
485
+ return self * RUR.from_int(other)
486
+
487
+ raise Exception("Multiplication of types not supported")
488
+
489
+ def _inverse(self):
490
+ return RUR( [ (p, -e) for (p, e) in self._polymod_exponent_pairs ] )
491
+
492
+ def __div__(self, other):
493
+ if isinstance(other, int):
494
+ return self / RUR.from_int(other)
495
+
496
+ return self * other._inverse()
497
+
498
+ __truediv__ = __div__
499
+
500
+ def __rdiv__(self, other):
501
+ if isinstance(other, int):
502
+ return RUR.from_int(other) / self
503
+
504
+ raise Exception("Division of types not supported")
505
+
506
+ __rtruediv__ = __rdiv__
507
+
508
+ def __pow__(self, other):
509
+ if _within_sage:
510
+ if isinstance(other, Integer):
511
+ other = int(other)
512
+
513
+ if isinstance(other, float) and other - int(other) == 0:
514
+ other = int(other)
515
+
516
+ assert isinstance(other, int)
517
+
518
+ if other < 0:
519
+ return self._inverse() ** (-other)
520
+
521
+ if other == 0:
522
+ return RUR.from_int(1)
523
+ if other == 1:
524
+ return self
525
+ if other % 2:
526
+ return self * (self ** (other - 1))
527
+ return (self * self) ** (other // 2)
528
+
529
+ def _is_zero(self):
530
+ return any(p == 0 and e > 0
531
+ for p, e in self._polymod_exponent_pairs)
532
+
533
+ def _is_one(self):
534
+ return self._numerator() - self._denominator() == 0
535
+
536
+ def __eq__(self, other):
537
+ if isinstance(other, int):
538
+ return self == RUR.from_int(other)
539
+
540
+ if self._is_zero():
541
+ return other._is_zero()
542
+ if other._is_zero():
543
+ return self._is_zero()
544
+
545
+ return (self / other)._is_one()