passagemath-schemes 10.5.48__cp312-cp312-musllinux_1_2_aarch64.whl → 10.6.47__cp312-cp312-musllinux_1_2_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.

Potentially problematic release.


This version of passagemath-schemes might be problematic. Click here for more details.

Files changed (165) hide show
  1. passagemath_schemes/__init__.py +3 -0
  2. {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.dist-info}/METADATA +42 -42
  3. {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.dist-info}/METADATA.bak +43 -43
  4. {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.dist-info}/RECORD +159 -140
  5. passagemath_schemes-10.6.47.dist-info/top_level.txt +3 -0
  6. passagemath_schemes.libs/{libflint-7dd7ad94.so.19.0.0 → libflint-edf7fb90.so.22.0.0} +0 -0
  7. passagemath_schemes.libs/{libgcc_s-69c45f16.so.1 → libgcc_s-2d945d6c.so.1} +0 -0
  8. passagemath_schemes.libs/{libgmp-8e78bd9b.so.10.5.0 → libgmp-28992bcb.so.10.5.0} +0 -0
  9. passagemath_schemes.libs/{libgmpxx-e6de26f1.so.4.7.0 → libgmpxx-fecb01a9.so.4.7.0} +0 -0
  10. passagemath_schemes.libs/{libmpfr-5ff10580.so.6.2.1 → libmpfr-1fc8ea36.so.6.2.2} +0 -0
  11. passagemath_schemes.libs/{libstdc++-1f1a71be.so.6.0.33 → libstdc++-85f2cd6d.so.6.0.33} +0 -0
  12. sage/all__sagemath_schemes.py +3 -2
  13. sage/databases/all__sagemath_schemes.py +0 -10
  14. sage/dynamics/arithmetic_dynamics/berkovich_ds.py +4 -4
  15. sage/dynamics/arithmetic_dynamics/generic_ds.py +3 -3
  16. sage/dynamics/arithmetic_dynamics/projective_ds.py +6 -6
  17. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-312-aarch64-linux-musl.so +0 -0
  18. sage/dynamics/arithmetic_dynamics/wehlerK3.py +18 -18
  19. sage/lfunctions/zero_sums.cpython-312-aarch64-linux-musl.so +0 -0
  20. sage/modular/abvar/abvar.py +12 -11
  21. sage/modular/abvar/constructor.py +3 -3
  22. sage/modular/abvar/cuspidal_subgroup.py +5 -6
  23. sage/modular/abvar/finite_subgroup.py +20 -18
  24. sage/modular/abvar/homology.py +1 -2
  25. sage/modular/abvar/homspace.py +1 -1
  26. sage/modular/abvar/lseries.py +3 -3
  27. sage/modular/abvar/morphism.py +1 -1
  28. sage/modular/abvar/torsion_point.py +1 -1
  29. sage/modular/abvar/torsion_subgroup.py +1 -1
  30. sage/modular/arithgroup/arithgroup_element.cpython-312-aarch64-linux-musl.so +0 -0
  31. sage/modular/arithgroup/arithgroup_perm.py +16 -16
  32. sage/modular/arithgroup/congroup.cpython-312-aarch64-linux-musl.so +0 -0
  33. sage/modular/arithgroup/congroup_gamma0.py +2 -2
  34. sage/modular/arithgroup/congroup_gamma1.py +4 -4
  35. sage/modular/arithgroup/congroup_gammaH.py +2 -2
  36. sage/modular/arithgroup/congroup_generic.py +2 -3
  37. sage/modular/arithgroup/congroup_sl2z.py +3 -3
  38. sage/modular/arithgroup/farey_symbol.cpython-312-aarch64-linux-musl.so +0 -0
  39. sage/modular/arithgroup/farey_symbol.pyx +1 -2
  40. sage/modular/btquotients/btquotient.py +4 -5
  41. sage/modular/btquotients/pautomorphicform.py +2 -2
  42. sage/modular/cusps.py +6 -4
  43. sage/modular/cusps_nf.py +7 -8
  44. sage/modular/dirichlet.py +34 -43
  45. sage/modular/drinfeld_modform/element.py +4 -4
  46. sage/modular/drinfeld_modform/ring.py +12 -12
  47. sage/modular/drinfeld_modform/tutorial.py +1 -1
  48. sage/modular/hecke/algebra.py +7 -5
  49. sage/modular/hecke/ambient_module.py +2 -2
  50. sage/modular/hecke/element.py +7 -2
  51. sage/modular/hecke/module.py +9 -9
  52. sage/modular/hecke/submodule.py +6 -8
  53. sage/modular/hypergeometric_misc.cpython-312-aarch64-linux-musl.so +0 -0
  54. sage/modular/hypergeometric_misc.pyx +3 -2
  55. sage/modular/hypergeometric_motive.py +2 -2
  56. sage/modular/local_comp/local_comp.py +19 -11
  57. sage/modular/local_comp/type_space.py +10 -8
  58. sage/modular/modform/ambient.py +4 -3
  59. sage/modular/modform/cuspidal_submodule.py +2 -2
  60. sage/modular/modform/element.py +72 -72
  61. sage/modular/modform/half_integral.py +1 -1
  62. sage/modular/modform/l_series_gross_zagier.py +3 -0
  63. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-312-aarch64-linux-musl.so +0 -0
  64. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +5 -2
  65. sage/modular/modform/ring.py +10 -12
  66. sage/modular/modform/space.py +18 -21
  67. sage/modular/modform/weight1.py +1 -2
  68. sage/modular/modform_hecketriangle/abstract_ring.py +7 -14
  69. sage/modular/modform_hecketriangle/abstract_space.py +63 -66
  70. sage/modular/modform_hecketriangle/graded_ring_element.py +11 -12
  71. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +82 -84
  72. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +2 -2
  73. sage/modular/modform_hecketriangle/readme.py +9 -11
  74. sage/modular/modform_hecketriangle/series_constructor.py +10 -18
  75. sage/modular/modform_hecketriangle/space.py +29 -30
  76. sage/modular/modform_hecketriangle/subspace.py +9 -7
  77. sage/modular/modsym/all.py +2 -2
  78. sage/modular/modsym/ambient.py +13 -20
  79. sage/modular/modsym/boundary.py +2 -2
  80. sage/modular/modsym/manin_symbol.cpython-312-aarch64-linux-musl.so +0 -0
  81. sage/modular/modsym/manin_symbol_list.py +3 -7
  82. sage/modular/modsym/relation_matrix_pyx.cpython-312-aarch64-linux-musl.so +0 -0
  83. sage/modular/modsym/space.py +10 -22
  84. sage/modular/modsym/subspace.py +5 -7
  85. sage/modular/multiple_zeta.py +11 -13
  86. sage/modular/multiple_zeta_F_algebra.py +4 -6
  87. sage/modular/overconvergent/genus0.py +5 -4
  88. sage/modular/overconvergent/hecke_series.py +2 -2
  89. sage/modular/pollack_stevens/distributions.py +2 -2
  90. sage/modular/pollack_stevens/fund_domain.py +26 -29
  91. sage/modular/pollack_stevens/manin_map.py +15 -10
  92. sage/modular/pollack_stevens/modsym.py +18 -18
  93. sage/modular/quasimodform/element.py +10 -10
  94. sage/modular/quasimodform/ring.py +22 -22
  95. sage/modular/ssmod/ssmod.py +5 -12
  96. sage/rings/polynomial/binary_form_reduce.py +1 -1
  97. sage/schemes/curves/affine_curve.py +4 -4
  98. sage/schemes/curves/plane_curve_arrangement.py +28 -24
  99. sage/schemes/elliptic_curves/BSD.py +1 -1
  100. sage/schemes/elliptic_curves/addition_formulas_ring.py +4 -0
  101. sage/schemes/elliptic_curves/cm.py +1 -1
  102. sage/schemes/elliptic_curves/constructor.py +3 -3
  103. sage/schemes/elliptic_curves/ell_egros.py +1 -1
  104. sage/schemes/elliptic_curves/ell_field.py +57 -46
  105. sage/schemes/elliptic_curves/ell_finite_field.py +138 -26
  106. sage/schemes/elliptic_curves/ell_local_data.py +9 -9
  107. sage/schemes/elliptic_curves/ell_number_field.py +25 -24
  108. sage/schemes/elliptic_curves/ell_point.py +21 -22
  109. sage/schemes/elliptic_curves/ell_rational_field.py +38 -28
  110. sage/schemes/elliptic_curves/formal_group.py +1 -1
  111. sage/schemes/elliptic_curves/heegner.py +11 -8
  112. sage/schemes/elliptic_curves/height.py +26 -23
  113. sage/schemes/elliptic_curves/hom.py +2 -1
  114. sage/schemes/elliptic_curves/hom_composite.py +11 -11
  115. sage/schemes/elliptic_curves/hom_frobenius.py +8 -8
  116. sage/schemes/elliptic_curves/hom_sum.py +7 -1
  117. sage/schemes/elliptic_curves/hom_velusqrt.py +13 -7
  118. sage/schemes/elliptic_curves/homset.py +2 -2
  119. sage/schemes/elliptic_curves/isogeny_small_degree.py +1 -1
  120. sage/schemes/elliptic_curves/mod_poly.py +12 -5
  121. sage/schemes/elliptic_curves/mod_sym_num.cpython-312-aarch64-linux-musl.so +0 -0
  122. sage/schemes/elliptic_curves/padic_lseries.py +25 -13
  123. sage/schemes/elliptic_curves/padics.py +71 -62
  124. sage/schemes/elliptic_curves/period_lattice.py +78 -27
  125. sage/schemes/elliptic_curves/period_lattice_region.cpython-312-aarch64-linux-musl.so +0 -0
  126. sage/schemes/elliptic_curves/sha_tate.py +1 -1
  127. sage/schemes/elliptic_curves/weierstrass_morphism.py +2 -2
  128. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +1 -1
  129. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +1 -1
  130. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +10 -20
  131. sage/schemes/jacobians/abstract_jacobian.py +1 -1
  132. sage/schemes/plane_conics/con_field.py +42 -42
  133. sage/schemes/plane_conics/con_rational_field.py +1 -1
  134. sage/schemes/riemann_surfaces/riemann_surface.py +8 -8
  135. sage_wheels/share/cremona/cremona_mini.db +0 -0
  136. sage_wheels/share/ellcurves/rank0 +30427 -0
  137. sage_wheels/share/ellcurves/rank1 +31871 -0
  138. sage_wheels/share/ellcurves/rank10 +6 -0
  139. sage_wheels/share/ellcurves/rank11 +6 -0
  140. sage_wheels/share/ellcurves/rank12 +1 -0
  141. sage_wheels/share/ellcurves/rank14 +1 -0
  142. sage_wheels/share/ellcurves/rank15 +1 -0
  143. sage_wheels/share/ellcurves/rank17 +1 -0
  144. sage_wheels/share/ellcurves/rank19 +1 -0
  145. sage_wheels/share/ellcurves/rank2 +2388 -0
  146. sage_wheels/share/ellcurves/rank20 +1 -0
  147. sage_wheels/share/ellcurves/rank21 +1 -0
  148. sage_wheels/share/ellcurves/rank22 +1 -0
  149. sage_wheels/share/ellcurves/rank23 +1 -0
  150. sage_wheels/share/ellcurves/rank24 +1 -0
  151. sage_wheels/share/ellcurves/rank28 +1 -0
  152. sage_wheels/share/ellcurves/rank3 +836 -0
  153. sage_wheels/share/ellcurves/rank4 +10 -0
  154. sage_wheels/share/ellcurves/rank5 +5 -0
  155. sage_wheels/share/ellcurves/rank6 +5 -0
  156. sage_wheels/share/ellcurves/rank7 +5 -0
  157. sage_wheels/share/ellcurves/rank8 +6 -0
  158. sage_wheels/share/ellcurves/rank9 +7 -0
  159. passagemath_schemes-10.5.48.dist-info/top_level.txt +0 -2
  160. sage/databases/db_modular_polynomials.py +0 -250
  161. sage/databases/stein_watkins.py +0 -363
  162. sage/modular/modsym/p1list.cpython-312-aarch64-linux-musl.so +0 -0
  163. sage/modular/modsym/p1list.pxd +0 -29
  164. sage/modular/modsym/p1list.pyx +0 -1372
  165. {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.dist-info}/WHEEL +0 -0
@@ -2121,9 +2121,9 @@ class DynamicalSystem_projective(SchemeMorphism_polynomial_projective_space,
2121
2121
  h = max([R(emb(c).abs()) for c in poly.coefficients()])
2122
2122
  else: #non-archimedean
2123
2123
  if BR == QQ:
2124
- h = max([R(v)**(-R(c.valuation(v))) for c in poly.coefficients()])
2124
+ h = max(R(v)**(-R(c.valuation(v))) for c in poly.coefficients())
2125
2125
  else:
2126
- h = max([R(c.abs_non_arch(v, prec=prec)) for c in poly.coefficients()])
2126
+ h = max(R(c.abs_non_arch(v, prec=prec)) for c in poly.coefficients())
2127
2127
  maxh = max(h, maxh)
2128
2128
  if maxh == 0:
2129
2129
  maxh = 1 #avoid division by 0
@@ -5001,7 +5001,7 @@ class DynamicalSystem_projective(SchemeMorphism_polynomial_projective_space,
5001
5001
  r"""
5002
5002
  Compute the ``n`` multiplier spectra of this dynamical system.
5003
5003
 
5004
- This is the set of multipliers of all peroidic points of
5004
+ This is the set of multipliers of all periodic points of
5005
5005
  period ``n`` included with the appropriate multiplicity.
5006
5006
  User can also specify to compute the formal ``n`` multiplier spectra
5007
5007
  instead which includes the multipliers of all formal periodic points
@@ -5417,7 +5417,7 @@ class DynamicalSystem_projective(SchemeMorphism_polynomial_projective_space,
5417
5417
 
5418
5418
  \prod_{P \text{ period n}} ( w - c(P,t)),
5419
5419
 
5420
- where `c(P,t)` is the charateristic polynomial (variable `t`) of the
5420
+ where `c(P,t)` is the characteristic polynomial (variable `t`) of the
5421
5421
  multiplier at `P`. Note that in dimension 1, only the coefficients
5422
5422
  of the constant term is returned.
5423
5423
 
@@ -6847,14 +6847,14 @@ class DynamicalSystem_projective(SchemeMorphism_polynomial_projective_space,
6847
6847
  def Lattes_to_curve(self, return_conjugation=False, check_lattes=False):
6848
6848
  r"""
6849
6849
  Finds a Short Weierstrass Model Elliptic curve of self
6850
- self assumed to be Lattes map and not in charateristic 2 or 3
6850
+ self assumed to be Lattes map and not in characteristic 2 or 3
6851
6851
 
6852
6852
  INPUT:
6853
6853
 
6854
6854
  ``return_conjugation`` -- (default: ``False``) if ``True``, then
6855
6855
  return the conjugation that moves self to a map that comes from a
6856
6856
  Short Weierstrass Model Elliptic curve
6857
- ``check_lattes``.-.(default:.``False``) if ``True``, then will ValueError if not Lattes
6857
+ ``check_lattes`` -- (default: ``False``) if ``True``, then will ValueError if not Lattes
6858
6858
 
6859
6859
  OUTPUT: a Short Weierstrass Model Elliptic curve which is isogenous to
6860
6860
  the Elliptic curve of 'self',
@@ -1141,20 +1141,20 @@ class WehlerK3Surface_ring(AlgebraicScheme_subscheme_product_projective):
1141
1141
  raise TypeError("%s fails to convert into the map's domain %s, but a `pushforward` method is not properly implemented" % (P, self))
1142
1142
  pt = list(P[0]) + [0, 0, 0]
1143
1143
  if P[1][0] != 0:
1144
- [a,b,c] = [P[1][0]*self.Gpoly(1, 0)(*pt),
1144
+ a, b, c = [P[1][0]*self.Gpoly(1, 0)(*pt),
1145
1145
  -1*P[1][0]*self.Hpoly(1, 0, 1)(*pt) - P[1][1]*self.Gpoly(1, 0)(*pt),
1146
1146
  -P[1][0]*self.Hpoly(1, 0, 2)(*pt) - P[1][2]*self.Gpoly(1, 0)(*pt)]
1147
1147
  elif P[1][1] != 0:
1148
- [a,b,c] = [-1*P[1][1]*self.Hpoly(1, 0, 1)(*pt)-P[1][0]*self.Gpoly(1, 1)(*pt),
1148
+ a, b, c = [-1*P[1][1]*self.Hpoly(1, 0, 1)(*pt)-P[1][0]*self.Gpoly(1, 1)(*pt),
1149
1149
  P[1][1]*self.Gpoly(1, 1)(*pt),
1150
1150
  -P[1][1]*self.Hpoly(1, 1, 2)(*pt)-P[1][2]*self.Gpoly(1, 1)(*pt)]
1151
1151
  else:
1152
- [a,b,c] = [-1*P[1][2]*self.Hpoly(1, 0, 2)(*pt) - P[1][0]*self.Gpoly(1, 2)(*pt),
1152
+ a, b, c = [-1*P[1][2]*self.Hpoly(1, 0, 2)(*pt) - P[1][0]*self.Gpoly(1, 2)(*pt),
1153
1153
  -P[1][2]*self.Hpoly(1, 1, 2)(*pt) - P[1][1]*self.Gpoly(1, 2)(*pt),
1154
1154
  P[1][2]*self.Gpoly(1, 2)(*pt)]
1155
1155
  Point = [P[0][0], P[0][1], P[0][2], a, b, c]
1156
1156
 
1157
- if [a,b,c] != [0,0,0]:
1157
+ if any([a, b, c]):
1158
1158
  if normalize:
1159
1159
  Point = self.point(Point,False)
1160
1160
  Point.normalize_coordinates()
@@ -1238,7 +1238,7 @@ class WehlerK3Surface_ring(AlgebraicScheme_subscheme_product_projective):
1238
1238
  if len(V) == 2:
1239
1239
  for D in V:
1240
1240
  if D[s] != 0:
1241
- [a,b,c] = [D[z0], D[z1], D[z2]]
1241
+ a, b, c = [D[z0], D[z1], D[z2]]
1242
1242
  else:
1243
1243
  newT = [phi(tee) for tee in T]
1244
1244
  for i in range(2):
@@ -1279,9 +1279,9 @@ class WehlerK3Surface_ring(AlgebraicScheme_subscheme_product_projective):
1279
1279
  raise ValueError("cannot distinguish points in the degenerate fiber")
1280
1280
 
1281
1281
  if len(V) == 1:
1282
- [a, b, c] = [V[0][z0], V[0][z1], V[0][z2]]
1282
+ a, b, c = [V[0][z0], V[0][z1], V[0][z2]]
1283
1283
 
1284
- if len(V) == 0 or [a,b,c] == [0, 0, 0]:
1284
+ if len(V) == 0 or not any([a, b, c]):
1285
1285
  SS = PolynomialRing(BR, 3, 'z0, z1, z2', order='lex')
1286
1286
  z0,z1,z2 = SS.gens()
1287
1287
  phi = RR.hom([1, 0, z0, z1, z2], SS)
@@ -1291,7 +1291,7 @@ class WehlerK3Surface_ring(AlgebraicScheme_subscheme_product_projective):
1291
1291
  V = phi(I).variety()
1292
1292
  if len(V) > 1:
1293
1293
  raise ValueError( "cannot distinguish points in the degenerate fiber")
1294
- [a,b,c] = [V[0][z0], V[0][z1], V[0][z2]]
1294
+ a, b, c = [V[0][z0], V[0][z1], V[0][z2]]
1295
1295
 
1296
1296
  Point = [P[0][0], P[0][1], P[0][2], a, b, c]
1297
1297
  if normalize:
@@ -1385,19 +1385,19 @@ class WehlerK3Surface_ring(AlgebraicScheme_subscheme_product_projective):
1385
1385
  raise TypeError("%s fails to convert into the map's domain %s, but a `pushforward` method is not properly implemented" % (P, self))
1386
1386
  pt = [0, 0, 0] + list(P[1])
1387
1387
  if P[0][0] != 0:
1388
- [a, b, c] = [P[0][0]*self.Gpoly(0, 0)(*pt),
1388
+ a, b, c = [P[0][0]*self.Gpoly(0, 0)(*pt),
1389
1389
  -1*P[0][0]*self.Hpoly(0, 0, 1)(*pt) - P[0][1]*self.Gpoly(0, 0)(*pt),
1390
1390
  -P[0][0]*self.Hpoly(0, 0, 2)(*pt) - P[0][2]*self.Gpoly(0, 0)(*pt)]
1391
1391
  elif P[0][1] != 0:
1392
- [a, b, c] = [-1*P[0][1]*self.Hpoly(0, 0, 1)(*pt) - P[0][0]*self.Gpoly(0, 1)(*pt),
1392
+ a, b, c = [-1*P[0][1]*self.Hpoly(0, 0, 1)(*pt) - P[0][0]*self.Gpoly(0, 1)(*pt),
1393
1393
  P[0][1]*self.Gpoly(0, 1)(*pt),
1394
1394
  -P[0][1]*self.Hpoly(0, 1, 2)(*pt) - P[0][2]*self.Gpoly(0, 1)(*pt)]
1395
1395
  else:
1396
- [a, b, c] = [-1*P[0][2]*self.Hpoly(0, 0, 2)(*pt) - P[0][0]*self.Gpoly(0, 2)(*pt),
1396
+ a, b, c = [-1*P[0][2]*self.Hpoly(0, 0, 2)(*pt) - P[0][0]*self.Gpoly(0, 2)(*pt),
1397
1397
  - P[0][2]*self.Hpoly(0, 1, 2)(*pt) - P[0][1]*self.Gpoly(0, 2)(*pt),
1398
1398
  P[0][2]*self.Gpoly(0, 2)(*pt)]
1399
1399
  Point = [a, b, c, P[1][0], P[1][1], P[1][2]]
1400
- if [a, b, c] != [0, 0, 0]:
1400
+ if any([a, b, c]):
1401
1401
  if normalize:
1402
1402
  Point = self.point(Point, False)
1403
1403
  Point.normalize_coordinates()
@@ -1521,10 +1521,10 @@ class WehlerK3Surface_ring(AlgebraicScheme_subscheme_product_projective):
1521
1521
  if len(V) > 1:
1522
1522
  raise ValueError("cannot distinguish points in the degenerate fiber")
1523
1523
  if len(V) == 1:
1524
- [a, b, c] = [V[0][z0], V[0][z1], V[0][z2]]
1525
- if len(V) == 0 or [a,b,c] == [0, 0, 0]:
1524
+ a, b, c = [V[0][z0], V[0][z1], V[0][z2]]
1525
+ if len(V) == 0 or not any([a, b, c]):
1526
1526
  SS = PolynomialRing(BR, 3, 'z0, z1, z2', order='lex')
1527
- z0,z1,z2 = SS.gens()
1527
+ z0, z1, z2 = SS.gens()
1528
1528
  phi = RR.hom([1, 0, z0, z1, z2], SS)
1529
1529
  J = phi(I)
1530
1530
  if J.dimension() > 0:
@@ -1532,7 +1532,7 @@ class WehlerK3Surface_ring(AlgebraicScheme_subscheme_product_projective):
1532
1532
  V = phi(I).variety()
1533
1533
  if len(V) > 1:
1534
1534
  raise ValueError("cannot distinguish points in the degenerate fiber")
1535
- [a,b,c] = [V[0][z0], V[0][z1], V[0][z2]]
1535
+ a, b, c = [V[0][z0], V[0][z1], V[0][z2]]
1536
1536
 
1537
1537
  Point = [a, b, c, P[1][0], P[1][1], P[1][2]]
1538
1538
  if normalize:
@@ -2067,8 +2067,8 @@ class WehlerK3Surface_ring(AlgebraicScheme_subscheme_product_projective):
2067
2067
  Points = []
2068
2068
 
2069
2069
  if (self.Gpoly(component,0)(P0) != 0):
2070
- #We are using the quadratic formula, we need this check to ensure that the points
2071
- #will be rational
2070
+ # We are using the quadratic formula, we need this check
2071
+ # to ensure that the points will be rational
2072
2072
  T0 = (self.Hpoly(component, 0, 1)(P0)**2 - 4*self.Gpoly(component, 0)(P0)*self.Gpoly(component, 1)(P0))
2073
2073
  T1 = (self.Hpoly(component, 0, 2)(P0)**2 - 4*self.Gpoly(component, 0)(P0)*self.Gpoly(component, 2)(P0))
2074
2074
  if (T0.is_square() and T1.is_square()):
@@ -1610,7 +1610,7 @@ class ModularAbelianVariety_abstract(Parent):
1610
1610
 
1611
1611
  return H(Morphism(H, mat))
1612
1612
 
1613
- def is_subvariety_of_ambient_jacobian(self):
1613
+ def is_subvariety_of_ambient_jacobian(self) -> bool:
1614
1614
  """
1615
1615
  Return ``True`` if ``self`` is (presented as) a subvariety of the ambient
1616
1616
  product Jacobian.
@@ -2769,7 +2769,7 @@ class ModularAbelianVariety_abstract(Parent):
2769
2769
  sage: t.order()
2770
2770
  4
2771
2771
  sage: t.gens()
2772
- [[(1/2, 0, 0, -1/2, 0, 0)], [(0, 0, 1/2, 0, 1/2, -1/2)]]
2772
+ ([(1/2, 0, 0, -1/2, 0, 0)], [(0, 0, 1/2, 0, 1/2, -1/2)])
2773
2773
  """
2774
2774
  try:
2775
2775
  return self.__rational_torsion_subgroup
@@ -2788,7 +2788,7 @@ class ModularAbelianVariety_abstract(Parent):
2788
2788
  sage: J = J0(54)
2789
2789
  sage: C = J.cuspidal_subgroup()
2790
2790
  sage: C.gens()
2791
- [[(1/3, 0, 0, 0, 0, 1/3, 0, 2/3)], [(0, 1/3, 0, 0, 0, 2/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 1/9, 1/9, 1/9, 2/9)], [(0, 0, 0, 1/3, 0, 1/3, 0, 0)], [(0, 0, 0, 0, 1/3, 1/3, 0, 1/3)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)]]
2791
+ ([(1/3, 0, 0, 0, 0, 1/3, 0, 2/3)], [(0, 1/3, 0, 0, 0, 2/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 1/9, 1/9, 1/9, 2/9)], [(0, 0, 0, 1/3, 0, 1/3, 0, 0)], [(0, 0, 0, 0, 1/3, 1/3, 0, 1/3)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)])
2792
2792
  sage: C.invariants()
2793
2793
  [3, 3, 3, 3, 3, 9]
2794
2794
  sage: J1(13).cuspidal_subgroup()
@@ -2900,7 +2900,7 @@ class ModularAbelianVariety_abstract(Parent):
2900
2900
  sage: CQ = J.rational_cusp_subgroup(); CQ
2901
2901
  Finite subgroup with invariants [3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
2902
2902
  sage: CQ.gens()
2903
- [[(1/3, 0, 0, 1/3, 2/3, 1/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 7/9, 7/9, 1/9, 8/9)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)]]
2903
+ ([(1/3, 0, 0, 1/3, 2/3, 1/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 7/9, 7/9, 1/9, 8/9)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)])
2904
2904
  sage: factor(CQ.order())
2905
2905
  3^4
2906
2906
  sage: CQ.invariants()
@@ -2961,7 +2961,7 @@ class ModularAbelianVariety_abstract(Parent):
2961
2961
  sage: CQ = J.rational_cuspidal_subgroup(); CQ
2962
2962
  Finite subgroup with invariants [3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
2963
2963
  sage: CQ.gens()
2964
- [[(1/3, 0, 0, 1/3, 2/3, 1/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 7/9, 7/9, 1/9, 8/9)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)]]
2964
+ ([(1/3, 0, 0, 1/3, 2/3, 1/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 7/9, 7/9, 1/9, 8/9)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)])
2965
2965
  sage: factor(CQ.order())
2966
2966
  3^4
2967
2967
  sage: CQ.invariants()
@@ -3109,7 +3109,7 @@ class ModularAbelianVariety_abstract(Parent):
3109
3109
  sage: G.order()
3110
3110
  625
3111
3111
  sage: G.gens()
3112
- [[(1/5, 0, 0, 0)], [(0, 1/5, 0, 0)], [(0, 0, 1/5, 0)], [(0, 0, 0, 1/5)]]
3112
+ ([(1/5, 0, 0, 0)], [(0, 1/5, 0, 0)], [(0, 0, 1/5, 0)], [(0, 0, 0, 1/5)])
3113
3113
  sage: A = J0(23)
3114
3114
  sage: A.torsion_subgroup(2).order()
3115
3115
  16
@@ -3232,10 +3232,11 @@ class ModularAbelianVariety_abstract(Parent):
3232
3232
  else:
3233
3233
  raise ValueError("self must be simple")
3234
3234
 
3235
- def is_simple(self, none_if_not_known=False):
3235
+ def is_simple(self, none_if_not_known=False) -> bool:
3236
3236
  """
3237
- Return whether or not this modular abelian variety is simple, i.e.,
3238
- has no proper nonzero abelian subvarieties.
3237
+ Return whether or not this modular abelian variety is simple.
3238
+
3239
+ This means that it has no proper nonzero abelian subvarieties.
3239
3240
 
3240
3241
  INPUT:
3241
3242
 
@@ -4243,7 +4244,7 @@ class ModularAbelianVariety_modsym_abstract(ModularAbelianVariety_abstract):
4243
4244
  """
4244
4245
  return self.modular_symbols().group()
4245
4246
 
4246
- def is_subvariety(self, other):
4247
+ def is_subvariety(self, other) -> bool:
4247
4248
  """
4248
4249
  Return ``True`` if ``self`` is a subvariety of ``other``.
4249
4250
 
@@ -4296,7 +4297,7 @@ class ModularAbelianVariety_modsym_abstract(ModularAbelianVariety_abstract):
4296
4297
  return ModularAbelianVariety_abstract.is_subvariety(self, other)
4297
4298
  return self.modular_symbols().is_submodule(other.modular_symbols())
4298
4299
 
4299
- def is_ambient(self):
4300
+ def is_ambient(self) -> bool:
4300
4301
  """
4301
4302
  Return ``True`` if this abelian variety attached to a modular symbols
4302
4303
  space is attached to the cuspidal subspace of the ambient
@@ -6,11 +6,11 @@ AUTHORS:
6
6
 
7
7
  - William Stein (2007-03)
8
8
  """
9
- ###########################################################################
9
+ # #########################################################################
10
10
  # Copyright (C) 2007 William Stein <wstein@gmail.com> #
11
11
  # Distributed under the terms of the GNU General Public License (GPL) #
12
- # http://www.gnu.org/licenses/ #
13
- ###########################################################################
12
+ # https://www.gnu.org/licenses/ #
13
+ # #########################################################################
14
14
 
15
15
  import weakref
16
16
 
@@ -12,7 +12,7 @@ EXAMPLES: We compute the cuspidal subgroup of `J_1(13)`::
12
12
  sage: C = A.cuspidal_subgroup(); C
13
13
  Finite subgroup with invariants [19, 19] over QQ of Abelian variety J1(13) of dimension 2
14
14
  sage: C.gens()
15
- [[(1/19, 0, 9/19, 9/19)], [(0, 1/19, 0, 9/19)]]
15
+ ([(1/19, 0, 9/19, 9/19)], [(0, 1/19, 0, 9/19)])
16
16
  sage: C.order()
17
17
  361
18
18
  sage: C.invariants()
@@ -24,7 +24,7 @@ We compute the cuspidal subgroup of `J_0(54)`::
24
24
  sage: C = A.cuspidal_subgroup(); C
25
25
  Finite subgroup with invariants [3, 3, 3, 3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
26
26
  sage: C.gens()
27
- [[(1/3, 0, 0, 0, 0, 1/3, 0, 2/3)], [(0, 1/3, 0, 0, 0, 2/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 1/9, 1/9, 1/9, 2/9)], [(0, 0, 0, 1/3, 0, 1/3, 0, 0)], [(0, 0, 0, 0, 1/3, 1/3, 0, 1/3)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)]]
27
+ ([(1/3, 0, 0, 0, 0, 1/3, 0, 2/3)], [(0, 1/3, 0, 0, 0, 2/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 1/9, 1/9, 1/9, 2/9)], [(0, 0, 0, 1/3, 0, 1/3, 0, 0)], [(0, 0, 0, 0, 1/3, 1/3, 0, 1/3)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)])
28
28
  sage: C.order()
29
29
  2187
30
30
  sage: C.invariants()
@@ -38,7 +38,7 @@ rational cusps.
38
38
  sage: C = J0(54).rational_cusp_subgroup(); C
39
39
  Finite subgroup with invariants [3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
40
40
  sage: C.gens()
41
- [[(1/3, 0, 0, 1/3, 2/3, 1/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 7/9, 7/9, 1/9, 8/9)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)]]
41
+ ([(1/3, 0, 0, 1/3, 2/3, 1/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 7/9, 7/9, 1/9, 8/9)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)])
42
42
  sage: C.order()
43
43
  81
44
44
  sage: C.invariants()
@@ -181,8 +181,7 @@ class CuspidalSubgroup_generic(FiniteSubgroup):
181
181
  B = Cusp.free_module().basis_matrix().stack(Eis.free_module().basis_matrix())
182
182
  X = B.solve_left(cusp_matrix)
183
183
  X = X.matrix_from_columns(range(Cusp.dimension()))
184
- lattice = X.row_module(ZZ) + A.lattice()
185
- return lattice
184
+ return X.row_module(ZZ) + A.lattice()
186
185
 
187
186
 
188
187
  class CuspidalSubgroup(CuspidalSubgroup_generic):
@@ -338,7 +337,7 @@ class RationalCuspidalSubgroup(CuspidalSubgroup_generic):
338
337
  return lattice
339
338
 
340
339
 
341
- def is_rational_cusp_gamma0(c, N, data):
340
+ def is_rational_cusp_gamma0(c, N, data) -> bool:
342
341
  """
343
342
  Return ``True`` if the rational number c is a rational cusp of level N.
344
343
 
@@ -28,7 +28,7 @@ EXAMPLES::
28
28
  sage: C.order()
29
29
  100
30
30
  sage: C.gens()
31
- [[(1/10, 0, 1/10, 1/10, 1/10, 3/10)], [(0, 1/5, 1/10, 0, 1/10, 9/10)], [(0, 0, 1/2, 0, 1/2, 1/2)]]
31
+ ([(1/10, 0, 1/10, 1/10, 1/10, 3/10)], [(0, 1/5, 1/10, 0, 1/10, 9/10)], [(0, 0, 1/2, 0, 1/2, 1/2)])
32
32
  sage: C.0 + C.1
33
33
  [(1/10, 1/5, 1/5, 1/10, 1/5, 6/5)]
34
34
  sage: 10*(C.0 + C.1)
@@ -36,7 +36,7 @@ EXAMPLES::
36
36
  sage: G = C.subgroup([C.0 + C.1]); G
37
37
  Finite subgroup with invariants [10] over QQbar of Abelian variety J0(33) of dimension 3
38
38
  sage: G.gens()
39
- [[(1/10, 1/5, 1/5, 1/10, 1/5, 1/5)]]
39
+ ([(1/10, 1/5, 1/5, 1/10, 1/5, 1/5)],)
40
40
  sage: G.order()
41
41
  10
42
42
  sage: G <= C
@@ -264,10 +264,10 @@ class FiniteSubgroup(Module):
264
264
  # order gets reversed in passing to lattices.
265
265
  return lx._echelon_matrix_richcmp(rx, op)
266
266
 
267
- def is_subgroup(self, other):
267
+ def is_subgroup(self, other) -> bool:
268
268
  """
269
- Return ``True`` exactly if ``self`` is a subgroup of ``other``, and both are
270
- defined as subgroups of the same ambient abelian variety.
269
+ Return ``True`` exactly if ``self`` is a subgroup of ``other``,
270
+ and both are defined as subgroups of the same ambient abelian variety.
271
271
 
272
272
  EXAMPLES::
273
273
 
@@ -299,7 +299,7 @@ class FiniteSubgroup(Module):
299
299
 
300
300
  sage: C = J0(22).cuspidal_subgroup()
301
301
  sage: C.gens()
302
- [[(1/5, 1/5, 4/5, 0)], [(0, 0, 0, 1/5)]]
302
+ ([(1/5, 1/5, 4/5, 0)], [(0, 0, 0, 1/5)])
303
303
  sage: A = C.subgroup([C.0]); B = C.subgroup([C.1])
304
304
  sage: A + B == C
305
305
  True
@@ -580,22 +580,24 @@ class FiniteSubgroup(Module):
580
580
  self.__order = o
581
581
  return o
582
582
 
583
- def gens(self):
583
+ def gens(self) -> tuple:
584
584
  """
585
- Return generators for this finite subgroup.
585
+ Return a tuple of the generators for this finite subgroup.
586
586
 
587
- EXAMPLES: We list generators for several cuspidal subgroups::
587
+ EXAMPLES:
588
+
589
+ We list generators for several cuspidal subgroups::
588
590
 
589
591
  sage: J0(11).cuspidal_subgroup().gens()
590
- [[(0, 1/5)]]
592
+ ([(0, 1/5)],)
591
593
  sage: J0(37).cuspidal_subgroup().gens()
592
- [[(0, 0, 0, 1/3)]]
594
+ ([(0, 0, 0, 1/3)],)
593
595
  sage: J0(43).cuspidal_subgroup().gens()
594
- [[(0, 1/7, 0, 6/7, 0, 5/7)]]
596
+ ([(0, 1/7, 0, 6/7, 0, 5/7)],)
595
597
  sage: J1(13).cuspidal_subgroup().gens()
596
- [[(1/19, 0, 9/19, 9/19)], [(0, 1/19, 0, 9/19)]]
598
+ ([(1/19, 0, 9/19, 9/19)], [(0, 1/19, 0, 9/19)])
597
599
  sage: J0(22).torsion_subgroup(6).gens()
598
- [[(1/6, 0, 0, 0)], [(0, 1/6, 0, 0)], [(0, 0, 1/6, 0)], [(0, 0, 0, 1/6)]]
600
+ ([(1/6, 0, 0, 0)], [(0, 1/6, 0, 0)], [(0, 0, 1/6, 0)], [(0, 0, 0, 1/6)])
599
601
  """
600
602
  try:
601
603
  return self.__gens
@@ -603,7 +605,7 @@ class FiniteSubgroup(Module):
603
605
  pass
604
606
 
605
607
  B = [self.element_class(self, v) for v in self.lattice().basis() if v.denominator() > 1]
606
- self.__gens = Sequence(B, immutable=True)
608
+ self.__gens = tuple(B)
607
609
  return self.__gens
608
610
 
609
611
  def gen(self, n):
@@ -615,7 +617,7 @@ class FiniteSubgroup(Module):
615
617
  sage: J = J0(23)
616
618
  sage: C = J.torsion_subgroup(3)
617
619
  sage: C.gens()
618
- [[(1/3, 0, 0, 0)], [(0, 1/3, 0, 0)], [(0, 0, 1/3, 0)], [(0, 0, 0, 1/3)]]
620
+ ([(1/3, 0, 0, 0)], [(0, 1/3, 0, 0)], [(0, 0, 1/3, 0)], [(0, 0, 0, 1/3)])
619
621
  sage: C.gen(0)
620
622
  [(1/3, 0, 0, 0)]
621
623
  sage: C.gen(3)
@@ -623,7 +625,7 @@ class FiniteSubgroup(Module):
623
625
  sage: C.gen(4)
624
626
  Traceback (most recent call last):
625
627
  ...
626
- IndexError: list index out of range
628
+ IndexError: tuple index out of range
627
629
 
628
630
  Negative indices wrap around::
629
631
 
@@ -707,7 +709,7 @@ class FiniteSubgroup(Module):
707
709
  sage: G2 = J0(27).cuspidal_subgroup(); G2
708
710
  Finite subgroup with invariants [3, 3] over QQ of Abelian variety J0(27) of dimension 1
709
711
  sage: G2.gens()
710
- [[(1/3, 0)], [(0, 1/3)]]
712
+ ([(1/3, 0)], [(0, 1/3)])
711
713
 
712
714
  Now we check whether various elements are in `G_1` and `G_2`::
713
715
 
@@ -404,8 +404,7 @@ class IntegralHomology(Homology_abvar):
404
404
  """
405
405
  n = Integer(n)
406
406
  M = self.abelian_variety().modular_symbols(sign=1)
407
- f = (M.hecke_polynomial(n, var)**2).change_ring(ZZ)
408
- return f
407
+ return (M.hecke_polynomial(n, var)**2).change_ring(ZZ)
409
408
 
410
409
 
411
410
  class RationalHomology(Homology_abvar):
@@ -509,7 +509,7 @@ class Homspace(HomsetWithBase):
509
509
  self.calculate_generators()
510
510
  return len(self._gens)
511
511
 
512
- def gens(self):
512
+ def gens(self) -> tuple:
513
513
  """
514
514
  Return tuple of generators for this endomorphism ring.
515
515
 
@@ -17,11 +17,11 @@ TESTS::
17
17
  True
18
18
  """
19
19
 
20
- ###########################################################################
20
+ # #########################################################################
21
21
  # Copyright (C) 2007 William Stein <wstein@gmail.com> #
22
22
  # Distributed under the terms of the GNU General Public License (GPL) #
23
- # http://www.gnu.org/licenses/ #
24
- ###########################################################################
23
+ # https://www.gnu.org/licenses/ #
24
+ # #########################################################################
25
25
 
26
26
  from sage.structure.sage_object import SageObject
27
27
  from sage.rings.integer_ring import ZZ
@@ -118,7 +118,7 @@ class Morphism_abstract(sage.modules.matrix_morphism.MatrixMorphism_abstract):
118
118
  iM, denom = iM._clear_denom()
119
119
  return Morphism(self.parent().reversed(), iM)
120
120
 
121
- def is_isogeny(self):
121
+ def is_isogeny(self) -> bool:
122
122
  """
123
123
  Return ``True`` if this morphism is an isogeny of abelian varieties.
124
124
 
@@ -16,7 +16,7 @@ AUTHORS:
16
16
  # Distributed under the terms of the GNU General Public License (GPL)
17
17
  # as published by the Free Software Foundation; either version 2 of
18
18
  # the License, or (at your option) any later version.
19
- # http://www.gnu.org/licenses/
19
+ # https://www.gnu.org/licenses/
20
20
  # ****************************************************************************
21
21
 
22
22
  from sage.structure.element import ModuleElement
@@ -27,7 +27,7 @@ works out nicely::
27
27
  sage: T.divisor_of_order()
28
28
  15
29
29
  sage: T.gens()
30
- [[(1/15, 3/5, 2/5, 14/15)]]
30
+ ([(1/15, 3/5, 2/5, 14/15)],)
31
31
  sage: T.invariants()
32
32
  [15]
33
33
  sage: d = J.decomposition(); d
@@ -1117,7 +1117,7 @@ class ArithmeticSubgroup_Permutation_class(ArithmeticSubgroup):
1117
1117
  # Group stuff
1118
1118
  #
1119
1119
 
1120
- def is_normal(self):
1120
+ def is_normal(self) -> bool:
1121
1121
  r"""
1122
1122
  Test whether the group is normal.
1123
1123
 
@@ -1135,9 +1135,9 @@ class ArithmeticSubgroup_Permutation_class(ArithmeticSubgroup):
1135
1135
  G = self.relabel(inplace=False)
1136
1136
  s2 = G._S2
1137
1137
  s3 = G._S3
1138
- ss2 = [None]*N
1139
- ss3 = [None]*N
1140
- for j in [s2[0],s3[0]]:
1138
+ ss2 = [None] * N
1139
+ ss3 = [None] * N
1140
+ for j in [s2[0], s3[0]]:
1141
1141
  m = G._canonical_rooted_labels(j)
1142
1142
  for i in range(N):
1143
1143
  ss2[m[i]] = m[s2[i]]
@@ -1333,7 +1333,7 @@ class ArithmeticSubgroup_Permutation_class(ArithmeticSubgroup):
1333
1333
  from .congroup_generic import CongruenceSubgroup_constructor as CS
1334
1334
  return CS(N, [x.matrix() for x in self.gens()])
1335
1335
 
1336
- def is_congruence(self):
1336
+ def is_congruence(self) -> bool:
1337
1337
  r"""
1338
1338
  Return ``True`` if this is a congruence subgroup, and ``False``
1339
1339
  otherwise.
@@ -1434,14 +1434,14 @@ class ArithmeticSubgroup_Permutation_class(ArithmeticSubgroup):
1434
1434
  True
1435
1435
  """
1436
1436
  from sage.misc.verbose import verbose
1437
- if self.index() == 1: # the group is SL2Z (trivial case)
1437
+ if self.index() == 1: # the group is SL2Z (trivial case)
1438
1438
  return True
1439
1439
 
1440
- L = self.L() # action of L
1441
- R = self.R() # action of R
1440
+ L = self.L() # action of L
1441
+ R = self.R() # action of R
1442
1442
 
1443
1443
  if self.is_even():
1444
- N = L.order() # generalised level of the group
1444
+ N = L.order() # generalised level of the group
1445
1445
  else:
1446
1446
  N = 2 * L.order()
1447
1447
 
@@ -1452,13 +1452,13 @@ class ArithmeticSubgroup_Permutation_class(ArithmeticSubgroup):
1452
1452
  if e == 1:
1453
1453
  # N is odd
1454
1454
  # this only gets called if self is even
1455
- onehalf = ZZ(2).inverse_mod(N) # i.e. 2^(-1) mod N
1455
+ onehalf = ZZ(2).inverse_mod(N) # i.e. 2^(-1) mod N
1456
1456
  rel = (R*R*L**(-onehalf))**3
1457
1457
  return rel.is_one()
1458
1458
 
1459
1459
  elif m == 1:
1460
1460
  # N is a power of 2
1461
- onefifth = ZZ(5).inverse_mod(N) # i.e. 5^(-1) mod N
1461
+ onefifth = ZZ(5).inverse_mod(N) # i.e. 5^(-1) mod N
1462
1462
  S = L**20*R**onefifth*L**(-4)*~R
1463
1463
 
1464
1464
  # congruence if the three below permutations are trivial
@@ -1631,7 +1631,7 @@ class OddArithmeticSubgroup_Permutation(ArithmeticSubgroup_Permutation_class):
1631
1631
  return (OddArithmeticSubgroup_Permutation,
1632
1632
  (self._S2,self._S3,self._L,self._R,canonical_labels))
1633
1633
 
1634
- def is_odd(self):
1634
+ def is_odd(self) -> bool:
1635
1635
  r"""
1636
1636
  Test whether the group is odd.
1637
1637
 
@@ -1643,7 +1643,7 @@ class OddArithmeticSubgroup_Permutation(ArithmeticSubgroup_Permutation_class):
1643
1643
  """
1644
1644
  return True
1645
1645
 
1646
- def is_even(self):
1646
+ def is_even(self) -> bool:
1647
1647
  r"""
1648
1648
  Test whether the group is even.
1649
1649
 
@@ -1948,7 +1948,7 @@ class EvenArithmeticSubgroup_Permutation(ArithmeticSubgroup_Permutation_class):
1948
1948
  return (EvenArithmeticSubgroup_Permutation,
1949
1949
  (self._S2, self._S3, self._L, self._R, canonical_labels))
1950
1950
 
1951
- def is_odd(self):
1951
+ def is_odd(self) -> bool:
1952
1952
  r"""
1953
1953
  Return ``True`` if this subgroup does not contain the matrix `-Id`.
1954
1954
 
@@ -1960,7 +1960,7 @@ class EvenArithmeticSubgroup_Permutation(ArithmeticSubgroup_Permutation_class):
1960
1960
  """
1961
1961
  return False
1962
1962
 
1963
- def is_even(self):
1963
+ def is_even(self) -> bool:
1964
1964
  r"""
1965
1965
  Return ``True`` if this subgroup contains the matrix `-Id`.
1966
1966
 
@@ -2489,7 +2489,7 @@ class EvenArithmeticSubgroup_Permutation(ArithmeticSubgroup_Permutation_class):
2489
2489
  sage: Go == G
2490
2490
  True
2491
2491
 
2492
- Strating from `\Gamma(6)` we get a different group::
2492
+ Starting from `\Gamma(6)` we get a different group::
2493
2493
 
2494
2494
  sage: G = Gamma(6).as_permutation_group()
2495
2495
  sage: G.is_odd(), G.index()
@@ -245,7 +245,7 @@ class Gamma0_class(GammaH_class):
245
245
  """
246
246
  return [Gamma0_constructor(M) for M in self.level().divisors()]
247
247
 
248
- def is_even(self):
248
+ def is_even(self) -> bool:
249
249
  r"""
250
250
  Return ``True`` precisely if this subgroup contains the matrix -1.
251
251
 
@@ -261,7 +261,7 @@ class Gamma0_class(GammaH_class):
261
261
  """
262
262
  return True
263
263
 
264
- def is_subgroup(self, right):
264
+ def is_subgroup(self, right) -> bool:
265
265
  """
266
266
  Return ``True`` if ``self`` is a subgroup of ``right``.
267
267
 
@@ -137,7 +137,7 @@ class Gamma1_class(GammaH_class):
137
137
  """
138
138
  return Gamma1_constructor, (self.level(),)
139
139
 
140
- def _latex_(self):
140
+ def _latex_(self) -> str:
141
141
  r"""
142
142
  Return the \LaTeX representation of ``self``.
143
143
 
@@ -150,7 +150,7 @@ class Gamma1_class(GammaH_class):
150
150
  """
151
151
  return "\\Gamma_1(%s)" % self.level()
152
152
 
153
- def is_even(self):
153
+ def is_even(self) -> bool:
154
154
  """
155
155
  Return ``True`` precisely if this subgroup contains the matrix -1.
156
156
 
@@ -163,9 +163,9 @@ class Gamma1_class(GammaH_class):
163
163
  sage: Gamma1(15).is_even()
164
164
  False
165
165
  """
166
- return self.level() in [1,2]
166
+ return self.level() in [1, 2]
167
167
 
168
- def is_subgroup(self, right):
168
+ def is_subgroup(self, right) -> bool:
169
169
  """
170
170
  Return ``True`` if ``self`` is a subgroup of ``right``.
171
171