passagemath-schemes 10.6.38__cp314-cp314t-macosx_13_0_arm64.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.
- passagemath_schemes/.dylibs/libflint.21.0.dylib +0 -0
- passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
- passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
- passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
- passagemath_schemes/__init__.py +3 -0
- passagemath_schemes-10.6.38.dist-info/METADATA +204 -0
- passagemath_schemes-10.6.38.dist-info/METADATA.bak +205 -0
- passagemath_schemes-10.6.38.dist-info/RECORD +314 -0
- passagemath_schemes-10.6.38.dist-info/WHEEL +6 -0
- passagemath_schemes-10.6.38.dist-info/top_level.txt +3 -0
- sage/all__sagemath_schemes.py +23 -0
- sage/databases/all__sagemath_schemes.py +7 -0
- sage/databases/cremona.py +1723 -0
- sage/dynamics/all__sagemath_schemes.py +2 -0
- sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
- sage/dynamics/arithmetic_dynamics/all.py +14 -0
- sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
- sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
- sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
- sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
- sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
- sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
- sage/dynamics/arithmetic_dynamics/projective_ds.py +9558 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314t-darwin.so +0 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
- sage/lfunctions/all.py +18 -0
- sage/lfunctions/dokchitser.py +745 -0
- sage/lfunctions/pari.py +818 -0
- sage/lfunctions/zero_sums.cpython-314t-darwin.so +0 -0
- sage/lfunctions/zero_sums.pyx +1847 -0
- sage/modular/abvar/abvar.py +5135 -0
- sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
- sage/modular/abvar/abvar_newform.py +244 -0
- sage/modular/abvar/all.py +8 -0
- sage/modular/abvar/constructor.py +186 -0
- sage/modular/abvar/cuspidal_subgroup.py +371 -0
- sage/modular/abvar/finite_subgroup.py +896 -0
- sage/modular/abvar/homology.py +720 -0
- sage/modular/abvar/homspace.py +998 -0
- sage/modular/abvar/lseries.py +415 -0
- sage/modular/abvar/morphism.py +935 -0
- sage/modular/abvar/torsion_point.py +274 -0
- sage/modular/abvar/torsion_subgroup.py +740 -0
- sage/modular/all.py +43 -0
- sage/modular/arithgroup/all.py +20 -0
- sage/modular/arithgroup/arithgroup_element.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/arithgroup_element.pyx +474 -0
- sage/modular/arithgroup/arithgroup_generic.py +1402 -0
- sage/modular/arithgroup/arithgroup_perm.py +2692 -0
- sage/modular/arithgroup/congroup.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/congroup.pyx +334 -0
- sage/modular/arithgroup/congroup_gamma.py +363 -0
- sage/modular/arithgroup/congroup_gamma0.py +692 -0
- sage/modular/arithgroup/congroup_gamma1.py +653 -0
- sage/modular/arithgroup/congroup_gammaH.py +1469 -0
- sage/modular/arithgroup/congroup_generic.py +628 -0
- sage/modular/arithgroup/congroup_sl2z.py +267 -0
- sage/modular/arithgroup/farey_symbol.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1066 -0
- sage/modular/arithgroup/tests.py +418 -0
- sage/modular/btquotients/all.py +4 -0
- sage/modular/btquotients/btquotient.py +3753 -0
- sage/modular/btquotients/pautomorphicform.py +2570 -0
- sage/modular/buzzard.py +100 -0
- sage/modular/congroup.py +29 -0
- sage/modular/congroup_element.py +13 -0
- sage/modular/cusps.py +1109 -0
- sage/modular/cusps_nf.py +1270 -0
- sage/modular/dims.py +569 -0
- sage/modular/dirichlet.py +3310 -0
- sage/modular/drinfeld_modform/all.py +2 -0
- sage/modular/drinfeld_modform/element.py +446 -0
- sage/modular/drinfeld_modform/ring.py +773 -0
- sage/modular/drinfeld_modform/tutorial.py +236 -0
- sage/modular/etaproducts.py +1065 -0
- sage/modular/hecke/algebra.py +746 -0
- sage/modular/hecke/all.py +20 -0
- sage/modular/hecke/ambient_module.py +1019 -0
- sage/modular/hecke/degenmap.py +119 -0
- sage/modular/hecke/element.py +325 -0
- sage/modular/hecke/hecke_operator.py +780 -0
- sage/modular/hecke/homspace.py +206 -0
- sage/modular/hecke/module.py +1767 -0
- sage/modular/hecke/morphism.py +174 -0
- sage/modular/hecke/submodule.py +989 -0
- sage/modular/hypergeometric_misc.cpython-314t-darwin.so +0 -0
- sage/modular/hypergeometric_misc.pxd +4 -0
- sage/modular/hypergeometric_misc.pyx +166 -0
- sage/modular/hypergeometric_motive.py +2017 -0
- sage/modular/local_comp/all.py +2 -0
- sage/modular/local_comp/liftings.py +292 -0
- sage/modular/local_comp/local_comp.py +1071 -0
- sage/modular/local_comp/smoothchar.py +1825 -0
- sage/modular/local_comp/type_space.py +748 -0
- sage/modular/modform/all.py +30 -0
- sage/modular/modform/ambient.py +815 -0
- sage/modular/modform/ambient_R.py +177 -0
- sage/modular/modform/ambient_eps.py +306 -0
- sage/modular/modform/ambient_g0.py +124 -0
- sage/modular/modform/ambient_g1.py +204 -0
- sage/modular/modform/constructor.py +545 -0
- sage/modular/modform/cuspidal_submodule.py +708 -0
- sage/modular/modform/defaults.py +14 -0
- sage/modular/modform/eis_series.py +505 -0
- sage/modular/modform/eisenstein_submodule.py +663 -0
- sage/modular/modform/element.py +4131 -0
- sage/modular/modform/find_generators.py +59 -0
- sage/modular/modform/half_integral.py +154 -0
- sage/modular/modform/hecke_operator_on_qexp.py +247 -0
- sage/modular/modform/j_invariant.py +47 -0
- sage/modular/modform/l_series_gross_zagier.py +133 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314t-darwin.so +0 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
- sage/modular/modform/notes.py +45 -0
- sage/modular/modform/numerical.py +514 -0
- sage/modular/modform/periods.py +14 -0
- sage/modular/modform/ring.py +1257 -0
- sage/modular/modform/space.py +1860 -0
- sage/modular/modform/submodule.py +118 -0
- sage/modular/modform/tests.py +64 -0
- sage/modular/modform/theta.py +110 -0
- sage/modular/modform/vm_basis.py +381 -0
- sage/modular/modform/weight1.py +220 -0
- sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
- sage/modular/modform_hecketriangle/abstract_space.py +2528 -0
- sage/modular/modform_hecketriangle/all.py +30 -0
- sage/modular/modform_hecketriangle/analytic_type.py +590 -0
- sage/modular/modform_hecketriangle/constructor.py +416 -0
- sage/modular/modform_hecketriangle/element.py +351 -0
- sage/modular/modform_hecketriangle/functors.py +752 -0
- sage/modular/modform_hecketriangle/graded_ring.py +541 -0
- sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
- sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3352 -0
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -0
- sage/modular/modform_hecketriangle/readme.py +1214 -0
- sage/modular/modform_hecketriangle/series_constructor.py +580 -0
- sage/modular/modform_hecketriangle/space.py +1037 -0
- sage/modular/modform_hecketriangle/subspace.py +423 -0
- sage/modular/modsym/all.py +17 -0
- sage/modular/modsym/ambient.py +3846 -0
- sage/modular/modsym/boundary.py +1420 -0
- sage/modular/modsym/element.py +336 -0
- sage/modular/modsym/g1list.py +178 -0
- sage/modular/modsym/ghlist.py +182 -0
- sage/modular/modsym/hecke_operator.py +73 -0
- sage/modular/modsym/manin_symbol.cpython-314t-darwin.so +0 -0
- sage/modular/modsym/manin_symbol.pxd +5 -0
- sage/modular/modsym/manin_symbol.pyx +497 -0
- sage/modular/modsym/manin_symbol_list.py +1295 -0
- sage/modular/modsym/modsym.py +400 -0
- sage/modular/modsym/modular_symbols.py +384 -0
- sage/modular/modsym/p1list.cpython-314t-darwin.so +0 -0
- sage/modular/modsym/p1list.pxd +29 -0
- sage/modular/modsym/p1list.pyx +1372 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-314t-darwin.so +0 -0
- sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
- sage/modular/modsym/space.py +2468 -0
- sage/modular/modsym/subspace.py +455 -0
- sage/modular/modsym/tests.py +375 -0
- sage/modular/multiple_zeta.py +2632 -0
- sage/modular/multiple_zeta_F_algebra.py +786 -0
- sage/modular/overconvergent/all.py +6 -0
- sage/modular/overconvergent/genus0.py +1878 -0
- sage/modular/overconvergent/hecke_series.py +1187 -0
- sage/modular/overconvergent/weightspace.py +778 -0
- sage/modular/pollack_stevens/all.py +4 -0
- sage/modular/pollack_stevens/distributions.py +874 -0
- sage/modular/pollack_stevens/fund_domain.py +1572 -0
- sage/modular/pollack_stevens/manin_map.py +859 -0
- sage/modular/pollack_stevens/modsym.py +1593 -0
- sage/modular/pollack_stevens/padic_lseries.py +417 -0
- sage/modular/pollack_stevens/sigma0.py +534 -0
- sage/modular/pollack_stevens/space.py +1076 -0
- sage/modular/quasimodform/all.py +3 -0
- sage/modular/quasimodform/element.py +845 -0
- sage/modular/quasimodform/ring.py +828 -0
- sage/modular/quatalg/all.py +3 -0
- sage/modular/quatalg/brandt.py +1642 -0
- sage/modular/ssmod/all.py +8 -0
- sage/modular/ssmod/ssmod.py +827 -0
- sage/rings/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/binary_form_reduce.py +585 -0
- sage/schemes/all.py +41 -0
- sage/schemes/berkovich/all.py +6 -0
- sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
- sage/schemes/berkovich/berkovich_space.py +748 -0
- sage/schemes/curves/affine_curve.py +2928 -0
- sage/schemes/curves/all.py +33 -0
- sage/schemes/curves/closed_point.py +434 -0
- sage/schemes/curves/constructor.py +381 -0
- sage/schemes/curves/curve.py +542 -0
- sage/schemes/curves/plane_curve_arrangement.py +1283 -0
- sage/schemes/curves/point.py +463 -0
- sage/schemes/curves/projective_curve.py +3026 -0
- sage/schemes/curves/zariski_vankampen.py +1932 -0
- sage/schemes/cyclic_covers/all.py +2 -0
- sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
- sage/schemes/cyclic_covers/constructor.py +137 -0
- sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
- sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
- sage/schemes/elliptic_curves/BSD.py +1036 -0
- sage/schemes/elliptic_curves/Qcurves.py +592 -0
- sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
- sage/schemes/elliptic_curves/all.py +49 -0
- sage/schemes/elliptic_curves/cardinality.py +609 -0
- sage/schemes/elliptic_curves/cm.py +1102 -0
- sage/schemes/elliptic_curves/constructor.py +1552 -0
- sage/schemes/elliptic_curves/ec_database.py +175 -0
- sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
- sage/schemes/elliptic_curves/ell_egros.py +459 -0
- sage/schemes/elliptic_curves/ell_field.py +2836 -0
- sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
- sage/schemes/elliptic_curves/ell_generic.py +3760 -0
- sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
- sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
- sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
- sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
- sage/schemes/elliptic_curves/ell_point.py +4787 -0
- sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
- sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
- sage/schemes/elliptic_curves/ell_torsion.py +436 -0
- sage/schemes/elliptic_curves/ell_wp.py +352 -0
- sage/schemes/elliptic_curves/formal_group.py +760 -0
- sage/schemes/elliptic_curves/gal_reps.py +1459 -0
- sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
- sage/schemes/elliptic_curves/gp_simon.py +152 -0
- sage/schemes/elliptic_curves/heegner.py +7335 -0
- sage/schemes/elliptic_curves/height.py +2109 -0
- sage/schemes/elliptic_curves/hom.py +1406 -0
- sage/schemes/elliptic_curves/hom_composite.py +934 -0
- sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
- sage/schemes/elliptic_curves/hom_scalar.py +531 -0
- sage/schemes/elliptic_curves/hom_sum.py +682 -0
- sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
- sage/schemes/elliptic_curves/homset.py +271 -0
- sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
- sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
- sage/schemes/elliptic_curves/jacobian.py +237 -0
- sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
- sage/schemes/elliptic_curves/kraus.py +1014 -0
- sage/schemes/elliptic_curves/lseries_ell.py +943 -0
- sage/schemes/elliptic_curves/mod5family.py +105 -0
- sage/schemes/elliptic_curves/mod_poly.py +197 -0
- sage/schemes/elliptic_curves/mod_sym_num.cpython-314t-darwin.so +0 -0
- sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
- sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
- sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
- sage/schemes/elliptic_curves/padics.py +1816 -0
- sage/schemes/elliptic_curves/period_lattice.py +2234 -0
- sage/schemes/elliptic_curves/period_lattice_region.cpython-314t-darwin.so +0 -0
- sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
- sage/schemes/elliptic_curves/saturation.py +715 -0
- sage/schemes/elliptic_curves/sha_tate.py +1158 -0
- sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
- sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
- sage/schemes/hyperelliptic_curves/all.py +6 -0
- sage/schemes/hyperelliptic_curves/constructor.py +291 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
- sage/schemes/hyperelliptic_curves/invariants.py +410 -0
- sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
- sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
- sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
- sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
- sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
- sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
- sage/schemes/hyperelliptic_curves/mestre.py +302 -0
- sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
- sage/schemes/jacobians/abstract_jacobian.py +277 -0
- sage/schemes/jacobians/all.py +2 -0
- sage/schemes/overview.py +161 -0
- sage/schemes/plane_conics/all.py +22 -0
- sage/schemes/plane_conics/con_field.py +1296 -0
- sage/schemes/plane_conics/con_finite_field.py +158 -0
- sage/schemes/plane_conics/con_number_field.py +456 -0
- sage/schemes/plane_conics/con_rational_field.py +406 -0
- sage/schemes/plane_conics/con_rational_function_field.py +580 -0
- sage/schemes/plane_conics/constructor.py +249 -0
- sage/schemes/plane_quartics/all.py +2 -0
- sage/schemes/plane_quartics/quartic_constructor.py +71 -0
- sage/schemes/plane_quartics/quartic_generic.py +73 -0
- sage/schemes/riemann_surfaces/all.py +1 -0
- sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
- sage_wheels/share/cremona/cremona_mini.db +0 -0
- sage_wheels/share/ellcurves/rank0 +30427 -0
- sage_wheels/share/ellcurves/rank1 +31871 -0
- sage_wheels/share/ellcurves/rank10 +6 -0
- sage_wheels/share/ellcurves/rank11 +6 -0
- sage_wheels/share/ellcurves/rank12 +1 -0
- sage_wheels/share/ellcurves/rank14 +1 -0
- sage_wheels/share/ellcurves/rank15 +1 -0
- sage_wheels/share/ellcurves/rank17 +1 -0
- sage_wheels/share/ellcurves/rank19 +1 -0
- sage_wheels/share/ellcurves/rank2 +2388 -0
- sage_wheels/share/ellcurves/rank20 +1 -0
- sage_wheels/share/ellcurves/rank21 +1 -0
- sage_wheels/share/ellcurves/rank22 +1 -0
- sage_wheels/share/ellcurves/rank23 +1 -0
- sage_wheels/share/ellcurves/rank24 +1 -0
- sage_wheels/share/ellcurves/rank28 +1 -0
- sage_wheels/share/ellcurves/rank3 +836 -0
- sage_wheels/share/ellcurves/rank4 +10 -0
- sage_wheels/share/ellcurves/rank5 +5 -0
- sage_wheels/share/ellcurves/rank6 +5 -0
- sage_wheels/share/ellcurves/rank7 +5 -0
- sage_wheels/share/ellcurves/rank8 +6 -0
- sage_wheels/share/ellcurves/rank9 +7 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
"""
|
|
3
|
+
Constructors for certain modular abelian varieties
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- William Stein (2007-03)
|
|
8
|
+
"""
|
|
9
|
+
# #########################################################################
|
|
10
|
+
# Copyright (C) 2007 William Stein <wstein@gmail.com> #
|
|
11
|
+
# Distributed under the terms of the GNU General Public License (GPL) #
|
|
12
|
+
# https://www.gnu.org/licenses/ #
|
|
13
|
+
# #########################################################################
|
|
14
|
+
|
|
15
|
+
import weakref
|
|
16
|
+
|
|
17
|
+
from sage.rings.integer import Integer
|
|
18
|
+
|
|
19
|
+
from sage.modular.arithgroup.all import CongruenceSubgroupBase, Gamma0
|
|
20
|
+
from sage.modular.modsym.space import ModularSymbolsSpace
|
|
21
|
+
from .abvar_newform import ModularAbelianVariety_newform
|
|
22
|
+
import sage.modular.modform.element
|
|
23
|
+
from sage.modular.abvar import abvar
|
|
24
|
+
|
|
25
|
+
_cache = {}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _get(key):
|
|
29
|
+
"""
|
|
30
|
+
Return the cached abelian variety with given key. This is used
|
|
31
|
+
internally by the abelian varieties constructor.
|
|
32
|
+
|
|
33
|
+
INPUT:
|
|
34
|
+
|
|
35
|
+
- ``key`` -- hashable
|
|
36
|
+
|
|
37
|
+
EXAMPLES::
|
|
38
|
+
|
|
39
|
+
sage: sage.modular.abvar.constructor._saved('a', J0(37))
|
|
40
|
+
Abelian variety J0(37) of dimension 2
|
|
41
|
+
sage: sage.modular.abvar.constructor._get('a')
|
|
42
|
+
Abelian variety J0(37) of dimension 2
|
|
43
|
+
sage: sage.modular.abvar.constructor._get('b')
|
|
44
|
+
Traceback (most recent call last):
|
|
45
|
+
...
|
|
46
|
+
ValueError: element not in cache
|
|
47
|
+
"""
|
|
48
|
+
if key in _cache:
|
|
49
|
+
z = _cache[key]()
|
|
50
|
+
if z is not None:
|
|
51
|
+
return z
|
|
52
|
+
raise ValueError("element not in cache")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _saved(key, J):
|
|
56
|
+
"""
|
|
57
|
+
Return the cached abelian variety with given key. This is used
|
|
58
|
+
internally by the abelian varieties constructor.
|
|
59
|
+
|
|
60
|
+
INPUT:
|
|
61
|
+
|
|
62
|
+
- ``key`` -- hashable
|
|
63
|
+
|
|
64
|
+
- ``J`` -- modular abelian variety
|
|
65
|
+
|
|
66
|
+
OUTPUT: ``J`` -- returns the modabvar, to make code that uses
|
|
67
|
+
this simpler
|
|
68
|
+
|
|
69
|
+
EXAMPLES::
|
|
70
|
+
|
|
71
|
+
sage: sage.modular.abvar.constructor._saved('37', J0(37))
|
|
72
|
+
Abelian variety J0(37) of dimension 2
|
|
73
|
+
"""
|
|
74
|
+
_cache[key] = weakref.ref(J)
|
|
75
|
+
return J
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def J0(N):
|
|
79
|
+
"""
|
|
80
|
+
Return the Jacobian `J_0(N)` of the modular curve
|
|
81
|
+
`X_0(N)`.
|
|
82
|
+
|
|
83
|
+
EXAMPLES::
|
|
84
|
+
|
|
85
|
+
sage: J0(389)
|
|
86
|
+
Abelian variety J0(389) of dimension 32
|
|
87
|
+
|
|
88
|
+
The result is cached::
|
|
89
|
+
|
|
90
|
+
sage: J0(33) is J0(33)
|
|
91
|
+
True
|
|
92
|
+
"""
|
|
93
|
+
key = 'J0(%s)' % N
|
|
94
|
+
try:
|
|
95
|
+
return _get(key)
|
|
96
|
+
except ValueError:
|
|
97
|
+
from sage.modular.arithgroup.all import Gamma0
|
|
98
|
+
J = Gamma0(N).modular_abelian_variety()
|
|
99
|
+
return _saved(key, J)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def J1(N):
|
|
103
|
+
"""
|
|
104
|
+
Return the Jacobian `J_1(N)` of the modular curve
|
|
105
|
+
`X_1(N)`.
|
|
106
|
+
|
|
107
|
+
EXAMPLES::
|
|
108
|
+
|
|
109
|
+
sage: J1(389)
|
|
110
|
+
Abelian variety J1(389) of dimension 6112
|
|
111
|
+
"""
|
|
112
|
+
key = 'J1(%s)' % N
|
|
113
|
+
try:
|
|
114
|
+
return _get(key)
|
|
115
|
+
except ValueError:
|
|
116
|
+
from sage.modular.arithgroup.all import Gamma1
|
|
117
|
+
return _saved(key, Gamma1(N).modular_abelian_variety())
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def JH(N, H):
|
|
121
|
+
"""
|
|
122
|
+
Return the Jacobian `J_H(N)` of the modular curve
|
|
123
|
+
`X_H(N)`.
|
|
124
|
+
|
|
125
|
+
EXAMPLES::
|
|
126
|
+
|
|
127
|
+
sage: JH(389,[16])
|
|
128
|
+
Abelian variety JH(389,[16]) of dimension 64
|
|
129
|
+
"""
|
|
130
|
+
key = 'JH(%s,%s)' % (N,H)
|
|
131
|
+
try:
|
|
132
|
+
return _get(key)
|
|
133
|
+
except ValueError:
|
|
134
|
+
from sage.modular.arithgroup.all import GammaH
|
|
135
|
+
return _saved(key, GammaH(N, H).modular_abelian_variety())
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def AbelianVariety(X):
|
|
139
|
+
"""
|
|
140
|
+
Create the abelian variety corresponding to the given defining
|
|
141
|
+
data.
|
|
142
|
+
|
|
143
|
+
INPUT:
|
|
144
|
+
|
|
145
|
+
- ``X`` -- integer, string, newform, modsym space,
|
|
146
|
+
congruence subgroup or tuple of congruence subgroups
|
|
147
|
+
|
|
148
|
+
OUTPUT: a modular abelian variety
|
|
149
|
+
|
|
150
|
+
EXAMPLES::
|
|
151
|
+
|
|
152
|
+
sage: AbelianVariety(Gamma0(37))
|
|
153
|
+
Abelian variety J0(37) of dimension 2
|
|
154
|
+
sage: AbelianVariety('37a')
|
|
155
|
+
Newform abelian subvariety 37a of dimension 1 of J0(37)
|
|
156
|
+
sage: AbelianVariety(Newform('37a'))
|
|
157
|
+
Newform abelian subvariety 37a of dimension 1 of J0(37)
|
|
158
|
+
sage: AbelianVariety(ModularSymbols(37).cuspidal_submodule())
|
|
159
|
+
Abelian variety J0(37) of dimension 2
|
|
160
|
+
sage: AbelianVariety((Gamma0(37), Gamma0(11)))
|
|
161
|
+
Abelian variety J0(37) x J0(11) of dimension 3
|
|
162
|
+
sage: AbelianVariety(37)
|
|
163
|
+
Abelian variety J0(37) of dimension 2
|
|
164
|
+
sage: AbelianVariety([1,2,3])
|
|
165
|
+
Traceback (most recent call last):
|
|
166
|
+
...
|
|
167
|
+
TypeError: X must be an integer, string, newform, modsym space, congruence subgroup or tuple of congruence subgroups
|
|
168
|
+
"""
|
|
169
|
+
if isinstance(X, (int, Integer)):
|
|
170
|
+
X = Gamma0(X)
|
|
171
|
+
if isinstance(X, CongruenceSubgroupBase):
|
|
172
|
+
X = X.modular_symbols().cuspidal_submodule()
|
|
173
|
+
elif isinstance(X, str):
|
|
174
|
+
from sage.modular.modform.constructor import Newform
|
|
175
|
+
f = Newform(X, names='a')
|
|
176
|
+
return ModularAbelianVariety_newform(f, internal_name=True)
|
|
177
|
+
elif isinstance(X, sage.modular.modform.element.Newform):
|
|
178
|
+
return ModularAbelianVariety_newform(X)
|
|
179
|
+
|
|
180
|
+
if isinstance(X, ModularSymbolsSpace):
|
|
181
|
+
return abvar.ModularAbelianVariety_modsym(X)
|
|
182
|
+
|
|
183
|
+
if isinstance(X, (tuple,list)) and all(isinstance(G, CongruenceSubgroupBase) for G in X):
|
|
184
|
+
return abvar.ModularAbelianVariety(X)
|
|
185
|
+
|
|
186
|
+
raise TypeError("X must be an integer, string, newform, modsym space, congruence subgroup or tuple of congruence subgroups")
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
"""
|
|
3
|
+
Cuspidal subgroups of modular abelian varieties
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- William Stein (2007-03, 2008-02)
|
|
8
|
+
|
|
9
|
+
EXAMPLES: We compute the cuspidal subgroup of `J_1(13)`::
|
|
10
|
+
|
|
11
|
+
sage: A = J1(13)
|
|
12
|
+
sage: C = A.cuspidal_subgroup(); C
|
|
13
|
+
Finite subgroup with invariants [19, 19] over QQ of Abelian variety J1(13) of dimension 2
|
|
14
|
+
sage: C.gens()
|
|
15
|
+
([(1/19, 0, 9/19, 9/19)], [(0, 1/19, 0, 9/19)])
|
|
16
|
+
sage: C.order()
|
|
17
|
+
361
|
|
18
|
+
sage: C.invariants()
|
|
19
|
+
[19, 19]
|
|
20
|
+
|
|
21
|
+
We compute the cuspidal subgroup of `J_0(54)`::
|
|
22
|
+
|
|
23
|
+
sage: A = J0(54)
|
|
24
|
+
sage: C = A.cuspidal_subgroup(); C
|
|
25
|
+
Finite subgroup with invariants [3, 3, 3, 3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
|
|
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)])
|
|
28
|
+
sage: C.order()
|
|
29
|
+
2187
|
|
30
|
+
sage: C.invariants()
|
|
31
|
+
[3, 3, 3, 3, 3, 9]
|
|
32
|
+
|
|
33
|
+
We compute the subgroup of the cuspidal subgroup generated by
|
|
34
|
+
rational cusps.
|
|
35
|
+
|
|
36
|
+
::
|
|
37
|
+
|
|
38
|
+
sage: C = J0(54).rational_cusp_subgroup(); C
|
|
39
|
+
Finite subgroup with invariants [3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
|
|
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)])
|
|
42
|
+
sage: C.order()
|
|
43
|
+
81
|
|
44
|
+
sage: C.invariants()
|
|
45
|
+
[3, 3, 9]
|
|
46
|
+
|
|
47
|
+
This might not give us the exact rational torsion subgroup, since
|
|
48
|
+
it might be bigger than order `81`::
|
|
49
|
+
|
|
50
|
+
sage: J0(54).rational_torsion_subgroup().multiple_of_order()
|
|
51
|
+
243
|
|
52
|
+
|
|
53
|
+
TESTS::
|
|
54
|
+
|
|
55
|
+
sage: C = J0(54).cuspidal_subgroup()
|
|
56
|
+
sage: loads(dumps(C)) == C
|
|
57
|
+
True
|
|
58
|
+
sage: D = J0(54).rational_cusp_subgroup()
|
|
59
|
+
sage: loads(dumps(D)) == D
|
|
60
|
+
True
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
# *****************************************************************************
|
|
64
|
+
# Copyright (C) 2007 William Stein <wstein@gmail.com>
|
|
65
|
+
#
|
|
66
|
+
# This program is free software: you can redistribute it and/or modify
|
|
67
|
+
# it under the terms of the GNU General Public License as published by
|
|
68
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
69
|
+
# (at your option) any later version.
|
|
70
|
+
# https://www.gnu.org/licenses/
|
|
71
|
+
# *****************************************************************************
|
|
72
|
+
|
|
73
|
+
from sage.matrix.constructor import matrix
|
|
74
|
+
from sage.modular.arithgroup.all import Gamma0_class
|
|
75
|
+
from sage.modular.cusps import Cusp
|
|
76
|
+
from sage.rings.infinity import infinity
|
|
77
|
+
from sage.rings.integer_ring import ZZ
|
|
78
|
+
from sage.rings.rational_field import QQ
|
|
79
|
+
|
|
80
|
+
from .finite_subgroup import FiniteSubgroup
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class CuspidalSubgroup_generic(FiniteSubgroup):
|
|
84
|
+
def _compute_lattice(self, rational_only=False, rational_subgroup=False):
|
|
85
|
+
r"""
|
|
86
|
+
Return a list of vectors that define elements of the rational
|
|
87
|
+
homology that generate this finite subgroup.
|
|
88
|
+
|
|
89
|
+
INPUT:
|
|
90
|
+
|
|
91
|
+
- ``rational_only`` -- boolean (default: ``False``); if
|
|
92
|
+
``True``, only use rational cusps
|
|
93
|
+
|
|
94
|
+
OUTPUT: list of vectors
|
|
95
|
+
|
|
96
|
+
EXAMPLES::
|
|
97
|
+
|
|
98
|
+
sage: J = J0(37)
|
|
99
|
+
sage: C = sage.modular.abvar.cuspidal_subgroup.CuspidalSubgroup(J)
|
|
100
|
+
sage: C._compute_lattice()
|
|
101
|
+
Free module of degree 4 and rank 4 over Integer Ring
|
|
102
|
+
Echelon basis matrix:
|
|
103
|
+
[ 1 0 0 0]
|
|
104
|
+
[ 0 1 0 0]
|
|
105
|
+
[ 0 0 1 0]
|
|
106
|
+
[ 0 0 0 1/3]
|
|
107
|
+
sage: J = J0(43)
|
|
108
|
+
sage: C = sage.modular.abvar.cuspidal_subgroup.CuspidalSubgroup(J)
|
|
109
|
+
sage: C._compute_lattice()
|
|
110
|
+
Free module of degree 6 and rank 6 over Integer Ring
|
|
111
|
+
Echelon basis matrix:
|
|
112
|
+
[ 1 0 0 0 0 0]
|
|
113
|
+
[ 0 1/7 0 6/7 0 5/7]
|
|
114
|
+
[ 0 0 1 0 0 0]
|
|
115
|
+
[ 0 0 0 1 0 0]
|
|
116
|
+
[ 0 0 0 0 1 0]
|
|
117
|
+
[ 0 0 0 0 0 1]
|
|
118
|
+
sage: J = J0(22)
|
|
119
|
+
sage: C = sage.modular.abvar.cuspidal_subgroup.CuspidalSubgroup(J)
|
|
120
|
+
sage: C._compute_lattice()
|
|
121
|
+
Free module of degree 4 and rank 4 over Integer Ring
|
|
122
|
+
Echelon basis matrix:
|
|
123
|
+
[1/5 1/5 4/5 0]
|
|
124
|
+
[ 0 1 0 0]
|
|
125
|
+
[ 0 0 1 0]
|
|
126
|
+
[ 0 0 0 1/5]
|
|
127
|
+
sage: J = J1(13)
|
|
128
|
+
sage: C = sage.modular.abvar.cuspidal_subgroup.CuspidalSubgroup(J)
|
|
129
|
+
sage: C._compute_lattice()
|
|
130
|
+
Free module of degree 4 and rank 4 over Integer Ring
|
|
131
|
+
Echelon basis matrix:
|
|
132
|
+
[1/19 0 9/19 9/19]
|
|
133
|
+
[ 0 1/19 0 9/19]
|
|
134
|
+
[ 0 0 1 0]
|
|
135
|
+
[ 0 0 0 1]
|
|
136
|
+
|
|
137
|
+
We compute with and without the optional
|
|
138
|
+
``rational_only`` option.
|
|
139
|
+
|
|
140
|
+
::
|
|
141
|
+
|
|
142
|
+
sage: J = J0(27); G = sage.modular.abvar.cuspidal_subgroup.CuspidalSubgroup(J)
|
|
143
|
+
sage: G._compute_lattice()
|
|
144
|
+
Free module of degree 2 and rank 2 over Integer Ring
|
|
145
|
+
Echelon basis matrix:
|
|
146
|
+
[1/3 0]
|
|
147
|
+
[ 0 1/3]
|
|
148
|
+
sage: G._compute_lattice(rational_only=True)
|
|
149
|
+
Free module of degree 2 and rank 2 over Integer Ring
|
|
150
|
+
Echelon basis matrix:
|
|
151
|
+
[1/3 0]
|
|
152
|
+
[ 0 1]
|
|
153
|
+
"""
|
|
154
|
+
A = self.abelian_variety()
|
|
155
|
+
Cusp = A.modular_symbols()
|
|
156
|
+
Amb = Cusp.ambient_module()
|
|
157
|
+
Eis = Amb.eisenstein_submodule()
|
|
158
|
+
|
|
159
|
+
C = Amb.cusps()
|
|
160
|
+
N = Amb.level()
|
|
161
|
+
|
|
162
|
+
if rational_subgroup:
|
|
163
|
+
# QQ-rational subgroup of cuspidal subgroup
|
|
164
|
+
assert A.is_ambient()
|
|
165
|
+
Q = Cusp.abvarquo_rational_cuspidal_subgroup()
|
|
166
|
+
return Q.V()
|
|
167
|
+
|
|
168
|
+
if rational_only:
|
|
169
|
+
# subgroup generated by differences of rational cusps
|
|
170
|
+
if not isinstance(A.group(), Gamma0_class):
|
|
171
|
+
raise NotImplementedError('computation of rational cusps only implemented in Gamma0 case.')
|
|
172
|
+
if not N.is_squarefree():
|
|
173
|
+
data = [n for n in N.coprime_integers(N) if n >= 2]
|
|
174
|
+
C = [c for c in C if is_rational_cusp_gamma0(c, N, data)]
|
|
175
|
+
|
|
176
|
+
v = [Amb([infinity, alpha]).element() for alpha in C]
|
|
177
|
+
cusp_matrix = matrix(QQ, len(v), Amb.dimension(), v)
|
|
178
|
+
|
|
179
|
+
# TODO -- refactor something out here
|
|
180
|
+
# Now we project onto the cuspidal part.
|
|
181
|
+
B = Cusp.free_module().basis_matrix().stack(Eis.free_module().basis_matrix())
|
|
182
|
+
X = B.solve_left(cusp_matrix)
|
|
183
|
+
X = X.matrix_from_columns(range(Cusp.dimension()))
|
|
184
|
+
return X.row_module(ZZ) + A.lattice()
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class CuspidalSubgroup(CuspidalSubgroup_generic):
|
|
188
|
+
"""
|
|
189
|
+
EXAMPLES::
|
|
190
|
+
|
|
191
|
+
sage: a = J0(65)[2]
|
|
192
|
+
sage: t = a.cuspidal_subgroup()
|
|
193
|
+
sage: t.order()
|
|
194
|
+
6
|
|
195
|
+
"""
|
|
196
|
+
def _repr_(self):
|
|
197
|
+
"""
|
|
198
|
+
String representation of the cuspidal subgroup.
|
|
199
|
+
|
|
200
|
+
EXAMPLES::
|
|
201
|
+
|
|
202
|
+
sage: G = J0(27).cuspidal_subgroup()
|
|
203
|
+
sage: G._repr_()
|
|
204
|
+
'Finite subgroup with invariants [3, 3] over QQ of Abelian variety J0(27) of dimension 1'
|
|
205
|
+
"""
|
|
206
|
+
return "Cuspidal subgroup %sover QQ of %s" % (self._invariants_repr(), self.abelian_variety())
|
|
207
|
+
|
|
208
|
+
def lattice(self):
|
|
209
|
+
"""
|
|
210
|
+
Returned cached tuple of vectors that define elements of the
|
|
211
|
+
rational homology that generate this finite subgroup.
|
|
212
|
+
|
|
213
|
+
OUTPUT: tuple (cached)
|
|
214
|
+
|
|
215
|
+
EXAMPLES::
|
|
216
|
+
|
|
217
|
+
sage: J = J0(27)
|
|
218
|
+
sage: G = J.cuspidal_subgroup()
|
|
219
|
+
sage: G.lattice()
|
|
220
|
+
Free module of degree 2 and rank 2 over Integer Ring
|
|
221
|
+
Echelon basis matrix:
|
|
222
|
+
[1/3 0]
|
|
223
|
+
[ 0 1/3]
|
|
224
|
+
|
|
225
|
+
Test that the result is cached::
|
|
226
|
+
|
|
227
|
+
sage: G.lattice() is G.lattice()
|
|
228
|
+
True
|
|
229
|
+
"""
|
|
230
|
+
try:
|
|
231
|
+
return self.__lattice
|
|
232
|
+
except AttributeError:
|
|
233
|
+
lattice = self._compute_lattice(rational_only=False)
|
|
234
|
+
self.__lattice = lattice
|
|
235
|
+
return lattice
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
class RationalCuspSubgroup(CuspidalSubgroup_generic):
|
|
239
|
+
"""
|
|
240
|
+
EXAMPLES::
|
|
241
|
+
|
|
242
|
+
sage: a = J0(65)[2]
|
|
243
|
+
sage: t = a.rational_cusp_subgroup()
|
|
244
|
+
sage: t.order()
|
|
245
|
+
6
|
|
246
|
+
"""
|
|
247
|
+
def _repr_(self):
|
|
248
|
+
"""
|
|
249
|
+
String representation of the cuspidal subgroup.
|
|
250
|
+
|
|
251
|
+
EXAMPLES::
|
|
252
|
+
|
|
253
|
+
sage: G = J0(27).rational_cusp_subgroup()
|
|
254
|
+
sage: G._repr_()
|
|
255
|
+
'Finite subgroup with invariants [3] over QQ of Abelian variety J0(27) of dimension 1'
|
|
256
|
+
"""
|
|
257
|
+
return "Subgroup generated by differences of rational cusps %sover QQ of %s" % (self._invariants_repr(), self.abelian_variety())
|
|
258
|
+
|
|
259
|
+
def lattice(self):
|
|
260
|
+
"""
|
|
261
|
+
Return lattice that defines this group.
|
|
262
|
+
|
|
263
|
+
OUTPUT: lattice
|
|
264
|
+
|
|
265
|
+
EXAMPLES::
|
|
266
|
+
|
|
267
|
+
sage: G = J0(27).rational_cusp_subgroup()
|
|
268
|
+
sage: G.lattice()
|
|
269
|
+
Free module of degree 2 and rank 2 over Integer Ring
|
|
270
|
+
Echelon basis matrix:
|
|
271
|
+
[1/3 0]
|
|
272
|
+
[ 0 1]
|
|
273
|
+
|
|
274
|
+
Test that the result is cached.
|
|
275
|
+
|
|
276
|
+
::
|
|
277
|
+
|
|
278
|
+
sage: G.lattice() is G.lattice()
|
|
279
|
+
True
|
|
280
|
+
"""
|
|
281
|
+
try:
|
|
282
|
+
return self.__lattice
|
|
283
|
+
except AttributeError:
|
|
284
|
+
lattice = self._compute_lattice(rational_only=True)
|
|
285
|
+
self.__lattice = lattice
|
|
286
|
+
return lattice
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
class RationalCuspidalSubgroup(CuspidalSubgroup_generic):
|
|
290
|
+
"""
|
|
291
|
+
EXAMPLES::
|
|
292
|
+
|
|
293
|
+
sage: a = J0(65)[2]
|
|
294
|
+
sage: t = a.rational_cuspidal_subgroup()
|
|
295
|
+
sage: t.order()
|
|
296
|
+
6
|
|
297
|
+
"""
|
|
298
|
+
def _repr_(self):
|
|
299
|
+
"""
|
|
300
|
+
String representation of the cuspidal subgroup.
|
|
301
|
+
|
|
302
|
+
EXAMPLES::
|
|
303
|
+
|
|
304
|
+
sage: G = J0(27).rational_cuspidal_subgroup()
|
|
305
|
+
sage: G._repr_()
|
|
306
|
+
'Finite subgroup with invariants [3] over QQ of Abelian variety J0(27) of dimension 1'
|
|
307
|
+
"""
|
|
308
|
+
return "Rational cuspidal subgroup %sover QQ of %s" % (self._invariants_repr(), self.abelian_variety())
|
|
309
|
+
|
|
310
|
+
def lattice(self):
|
|
311
|
+
"""
|
|
312
|
+
Return lattice that defines this group.
|
|
313
|
+
|
|
314
|
+
OUTPUT: lattice
|
|
315
|
+
|
|
316
|
+
EXAMPLES::
|
|
317
|
+
|
|
318
|
+
sage: G = J0(27).rational_cuspidal_subgroup()
|
|
319
|
+
sage: G.lattice()
|
|
320
|
+
Free module of degree 2 and rank 2 over Integer Ring
|
|
321
|
+
Echelon basis matrix:
|
|
322
|
+
[1/3 0]
|
|
323
|
+
[ 0 1]
|
|
324
|
+
|
|
325
|
+
Test that the result is cached.
|
|
326
|
+
|
|
327
|
+
::
|
|
328
|
+
|
|
329
|
+
sage: G.lattice() is G.lattice()
|
|
330
|
+
True
|
|
331
|
+
"""
|
|
332
|
+
try:
|
|
333
|
+
return self.__lattice
|
|
334
|
+
except AttributeError:
|
|
335
|
+
lattice = self._compute_lattice(rational_subgroup=True)
|
|
336
|
+
self.__lattice = lattice
|
|
337
|
+
return lattice
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def is_rational_cusp_gamma0(c, N, data) -> bool:
|
|
341
|
+
"""
|
|
342
|
+
Return ``True`` if the rational number c is a rational cusp of level N.
|
|
343
|
+
|
|
344
|
+
This uses remarks in Glenn Steven's Ph.D. thesis.
|
|
345
|
+
|
|
346
|
+
INPUT:
|
|
347
|
+
|
|
348
|
+
- ``c`` -- a cusp
|
|
349
|
+
|
|
350
|
+
- ``N`` -- positive integer
|
|
351
|
+
|
|
352
|
+
- ``data`` -- the list [n for n in range(2,N) if gcd(n,N) == 1], which is
|
|
353
|
+
passed in as a parameter purely for efficiency reasons.
|
|
354
|
+
|
|
355
|
+
EXAMPLES::
|
|
356
|
+
|
|
357
|
+
sage: from sage.modular.abvar.cuspidal_subgroup import is_rational_cusp_gamma0
|
|
358
|
+
sage: N = 27
|
|
359
|
+
sage: data = [n for n in range(2,N) if gcd(n,N) == 1]
|
|
360
|
+
sage: is_rational_cusp_gamma0(Cusp(1/3), N, data)
|
|
361
|
+
False
|
|
362
|
+
sage: is_rational_cusp_gamma0(Cusp(1), N, data)
|
|
363
|
+
True
|
|
364
|
+
sage: is_rational_cusp_gamma0(Cusp(oo), N, data)
|
|
365
|
+
True
|
|
366
|
+
sage: is_rational_cusp_gamma0(Cusp(2/9), N, data)
|
|
367
|
+
False
|
|
368
|
+
"""
|
|
369
|
+
num = c.numerator()
|
|
370
|
+
den = c.denominator()
|
|
371
|
+
return all(c.is_gamma0_equiv(Cusp(num, d * den), N) for d in data)
|