Magma can compute the intersection pairing H1(X0(N), Q) x H1(X0(N), Q) -> Q on the homology of the modular curve X0(N). The algorithm that we implemented is essentially the one given in [Mer93]. (Warning: There is a typo in Proposition 4 of [Mer93]; Wi should be replaced by Wiεi.)
The intersection pairing of the homology classes corresponding to the weight-2 cuspidal modular symbols x and y. The symbols x and y must have the same parent, which must have trivial character and not be a +1 or -1 quotient.
> M37 := ModularSymbols(37,2); > H37 := CuspidalSubspace(M37); > Z := IntegralBasis(H37); Z; [ {-1/29, 0}, {-1/22, 0}, {-1/12, 0}, {-1/18, 0} ]Now we compute some intersection numbers.
> IntersectionPairing(Z[1],Z[2]); -1 > IntersectionPairing(Z[3],Z[4]); 0
The intersection pairing is perfect and skew-symmetric, so the matrix that defines it is skew-symmetric and has determinant ∓ 1 (in fact, it has determinant +1).
> A := MatrixAlgebra(RationalField(),4); > I := A![IntersectionPairing(x,y) : x in Z, y in Z]; I; [ 0 1 0 1] [-1 0 1 1] [ 0 -1 0 0] [-1 -1 0 0] > I + Transpose(I) eq 0; true > Determinant(I); 1The Hecke operators are compatible with the intersection pairing in the sense that (Tn x, y) = (x, Tn y).
> T2 := HeckeOperator(M37,2); > IntersectionPairing(Z[1]*T2,Z[2]); 1 > IntersectionPairing(Z[1],Z[2]*T2); 1It is note the case (Tn x, Tn y) = (x, y) for all n, x, and y.
> IntersectionPairing(Z[1]*T2,Z[2]*T2); -2
The existence of the intersection pairing implies that H1(X0(N), Z) is isomorphic, as a module over the Hecke algebra, to its linear dual Hom(H1(X0(N), Z), Z).