Module: sage.modular.cusps
The set
of cusps
sage: Cusps Set P^1(QQ) of all cusps
sage: Cusp(oo) Infinity
Class: Cusp
A cusp is either a rational number or infinity, i.e., an element of the projective line over Q. A Cusp is stored as a pair (a,b), where gcd(a,b)=1 and a,b are of type Integer.
sage: a = Cusp(2/3); b = Cusp(oo) sage: a.parent() Set P^1(QQ) of all cusps sage: a.parent() is b.parent() True
| self, a, [b=None], [parent=None]) |
Create the cusp a/b in
, where if b=0 this is the
cusp at infinity.
When present, b must either be Infinity or coercible to an Integer.
sage: Cusp(2,3) 2/3 sage: Cusp(3,6) 1/2 sage: Cusp(1,0) Infinity sage: Cusp(infinity) Infinity sage: Cusp(5) 5 sage: Cusp(1/2) 1/2 sage: Cusp(1.5) 3/2 sage: Cusp(int(7)) 7
sage: I**2 -1 sage: Cusp(I) Traceback (most recent call last): ... TypeError: Unable to convert I to a Cusp
sage: a = Cusp(2,3) sage: loads(a.dumps()) == a True
sage: Cusp(1/3,0) Infinity sage: Cusp((1,0)) Infinity
TESTS:
sage: Cusp("1/3", 5)
1/15
sage: Cusp(Cusp(3/5), 7)
3/35
sage: Cusp(5/3, 0)
Infinity
sage: Cusp(3,oo)
0
sage: Cusp((7,3), 5)
7/15
sage: Cusp(int(5), 7)
5/7
sage: Cusp(0,0) Traceback (most recent call last): ... TypeError: Unable to convert (0, 0) to a Cusp
sage: Cusp(oo,oo) Traceback (most recent call last): ... TypeError: Unable to convert (+Infinity, +Infinity) to a Cusp
sage: Cusp(Cusp(oo),oo) Traceback (most recent call last): ... TypeError: Unable to convert (Infinity, +Infinity) to a Cusp
Functions: apply,
denominator,
is_gamma0_equiv,
is_gamma1_equiv,
is_gamma_h_equiv,
is_infinity,
numerator
| self, g) |
Return g(self), where g=[a,b,c,d] is a list of length 4, which we view as a linear fractional transformation.
Apply the identity matrix:
sage: Cusp(0).apply([1,0,0,1]) 0 sage: Cusp(0).apply([0,-1,1,0]) Infinity sage: Cusp(0).apply([1,-3,0,1]) -3
| self) |
Return the denominator of the cusp a/b.
sage: x=Cusp(6,9); x 2/3 sage: x.denominator() 3 sage: Cusp(oo).denominator() 0 sage: Cusp(-5/10).denominator() 2
| self, other, N, [transformation=False]) |
Return whether self and other are equivalent modulo the action
of
via linear fractional transformations.
Input:
sage: x = Cusp(2,3) sage: y = Cusp(4,5) sage: x.is_gamma0_equiv(y, 2) True sage: x.is_gamma0_equiv(y, 2, True) (True, 1) sage: x.is_gamma0_equiv(y, 3) False sage: x.is_gamma0_equiv(y, 3, True) (False, None) sage: Cusp(1,0) Infinity sage: z = Cusp(1,0) sage: x.is_gamma0_equiv(z, 3, True) (True, 2)
ALGORITHM: See Proposition 2.2.3 of Cremona's book "Algorithms for Modular Elliptic Curves", or Prop 2.27 of Stein's Ph.D. thesis.
| self, other, N) |
Return whether self and other are equivalent modulo the action of Gamma_1(N) via linear fractional transformations.
Input:
sage: x = Cusp(2,3) sage: y = Cusp(4,5) sage: x.is_gamma1_equiv(y,2) (True, 1) sage: x.is_gamma1_equiv(y,3) (False, 0) sage: z = Cusp(QQ(x) + 10) sage: x.is_gamma1_equiv(z,10) (True, 1) sage: z = Cusp(1,0) sage: x.is_gamma1_equiv(z, 3) (True, -1) sage: Cusp(0).is_gamma1_equiv(oo, 1) (True, 1) sage: Cusp(0).is_gamma1_equiv(oo, 3) (False, 0)
| self, other, G) |
Return a pair (b, t), where b is True or False as self and other are equivalent under the action of G, and t is 1 or -1, as described below.
Two cusps
and
are equivalent modulo Gamma_H(N)
if and only if
and
or
and
for some
. Then t is 1 or -1 as c and c' fall into
the first or second case, respectively.
Input:
sage: x = Cusp(2,3) sage: y = Cusp(4,5) sage: x.is_gamma_h_equiv(y,GammaH(13,[2])) (True, 1) sage: x.is_gamma_h_equiv(y,GammaH(13,[5])) (False, 0) sage: x.is_gamma_h_equiv(y,GammaH(5,[])) (False, 0) sage: x.is_gamma_h_equiv(y,GammaH(23,[4])) (True, -1)
Enumerating the cusps for a space of modular symbols uses this function.
sage: G = GammaH(25,[6]) ; M = G.modular_symbols() ; M Modular Symbols space of dimension 11 for Congruence Subgroup Gamma_H(25) with H generated by [6] of weight 2 with sign 0 and over Rational Field sage: M.cusps() [37/75, 1/2, 31/125, 1/4, -2/5, -3/5, -1/5, -9/10, -3/10, -14/15, 7/15, 9/20] sage: len(M.cusps()) 12
This is always one more than the associated space of Eisenstein series.
sage: sage.modular.dims.dimension_eis_H(G,2) 11 sage: M.cuspidal_subspace() Modular Symbols subspace of dimension 0 of Modular Symbols space of dimension 11 for Congruence Subgroup Gamma_H(25) with H generated by [6] of weight 2 with sign 0 and over Rational Field sage: sage.modular.dims.dimension_cusp_forms_H(G,2) 0
| self) |
Returns True if this is the cusp infinity.
sage: Cusp(3/5).is_infinity() False sage: Cusp(1,0).is_infinity() True sage: Cusp(0,1).is_infinity() False
| self) |
Return the numerator of the cusp a/b.
sage: x=Cusp(6,9); x 2/3 sage: x.numerator() 2 sage: Cusp(oo).numerator() 1 sage: Cusp(-5/10).numerator() -1
Special Functions: __cmp__,
__init__,
__neg__,
_integer_,
_latex_,
_rational_,
_repr_
| self, right) |
Compare the cusps self and right. Comparison is as for rational numbers, except with the cusp oo greater than everything but itself.
The ordering in comparison is only really meaningful for infinity or elements that coerce to the rationals.
sage: Cusp(2/3) == Cusp(oo) False
sage: Cusp(2/3) < Cusp(oo) True
sage: Cusp(2/3)> Cusp(oo) False
sage: Cusp(2/3) > Cusp(5/2) False
sage: Cusp(2/3) < Cusp(5/2) True
sage: Cusp(2/3) == Cusp(5/2) False
sage: Cusp(oo) == Cusp(oo) True
sage: 19/3 < Cusp(oo) True
sage: Cusp(oo) < 19/3 False
sage: Cusp(2/3) < Cusp(11/7) True
sage: Cusp(11/7) < Cusp(2/3) False
sage: 2 < Cusp(3) True
| self) |
The negative of this cusp.
sage: -Cusp(2/7) -2/7 sage: -Cusp(oo) Infinity
| self) |
Coerce to an integer.
sage: ZZ(Cusp(-19)) -19 sage: Cusp(4,2)._integer_() 2
sage: ZZ(Cusp(oo)) Traceback (most recent call last): ... TypeError: cusp Infinity is not an integer sage: ZZ(Cusp(-3,7)) Traceback (most recent call last): ... TypeError: cusp -3/7 is not an integer
| self) |
Latex representation of this cusp.
sage: latex(Cusp(-2/7))
\frac{-2}{7}
sage: latex(Cusp(oo))
\infty
sage: latex(Cusp(oo)) == Cusp(oo)._latex_()
True
| self) |
Coerce to a rational number.
sage: QQ(Cusp(oo)) Traceback (most recent call last): ... TypeError: cusp Infinity is not a rational number sage: QQ(Cusp(-3,7)) -3/7 sage: Cusp(11,2)._rational_() 11/2
| self) |
String representation of this cusp.
sage: a = Cusp(2/3); a
2/3
sage: a._repr_()
'2/3'
sage: a.rename('2/3(cusp)'); a
2/3(cusp)
Class: Cusps_class
sage: C = Cusps; C Set P^1(QQ) of all cusps sage: loads(C.dumps()) == C True
| self) |
The set of cusps, i.e.
.
sage: C = sage.modular.cusps.Cusps_class() ; C Set P^1(QQ) of all cusps sage: Cusps == C True
Special Functions: __call__,
__cmp__,
__init__,
_coerce_impl,
_latex_,
_repr_
| self, x) |
Coerce x into the set of cusps.
sage: a = Cusps(-4/5); a -4/5 sage: Cusps(a) is a False sage: Cusps(1.5) 3/2 sage: Cusps(oo) Infinity sage: Cusps(I) Traceback (most recent call last): ... TypeError: Unable to convert I to a Cusp
| self, right) |
Return equality only if right is the set of cusps.
sage: Cusps == Cusps True sage: Cusps == QQ False
| self, x) |
Canonical coercion of x into the set of cusps.
sage: Cusps._coerce_(7/13) 7/13 sage: Cusps._coerce_(GF(7)(3)) Traceback (most recent call last): ... TypeError: no canonical coercion of element into self sage: Cusps(GF(7)(3)) 3 sage: Cusps._coerce_impl(GF(7)(3)) Traceback (most recent call last): ... TypeError: no canonical coercion of element into self
| self) |
Return latex representation of self.
sage: latex(Cusps)
\mathbf{P}^1(\mathbf{Q})
sage: latex(Cusps) == Cusps._latex_()
True
| self) |
String representation of the set of cusps.
sage: Cusps
Set P^1(QQ) of all cusps
sage: Cusps._repr_()
'Set P^1(QQ) of all cusps'
sage: Cusps.rename('CUSPS'); Cusps
CUSPS
sage: Cusps.rename(); Cusps
Set P^1(QQ) of all cusps
sage: Cusps
Set P^1(QQ) of all cusps