Elliptic Fibrations on Vinberg’s Most Algebraic K3 Surface

Authors: Simon Brandhorst and Matthias Zach

This page contains the code samples from the corresponding chapter in the OSCAR book. You can access the full chapter here.

The interested reader can find more information in this article.

julia> Qt, t = polynomial_ring(QQ, :t)
(Univariate polynomial ring in t over QQ, t)

julia> Qtf = fraction_field(Qt)
Fraction field
  of univariate polynomial ring in t over QQ

julia> E = elliptic_curve(Qtf, [0,0,0,0,t^5*(t-1)^2])
Elliptic curve with equation
y^2 = x^3 + t^7 - 2*t^6 + t^5

julia> j_invariant(E)
0

julia> discriminant(E)
-432*t^14 + 1728*t^13 - 2592*t^12 + 1728*t^11 - 432*t^10

julia> factor(Qt, discriminant(E))
-432 * (t - 1)^4 * t^10

julia> R = rescale(root_lattice([(:E, 8), (:E, 8), (:A, 2)]), -1);

julia> U = integer_lattice(gram=ZZ[0 1; 1 -2]);

julia> NS, _ = direct_sum([U, R]);

julia> e = matrix(ZZ,1,20,ones(Int,20));e[1,1]=51;

julia> ample = e*inv(gram_matrix(NS));

julia> minimum(rescale(orthogonal_submodule(NS, ample),-1))
4

julia> Xaut, Xchambers, Xrational_curves =  K3_surface_automorphism_group(NS, ample);

julia> length(Xrational_curves)
2

julia> length(Xchambers)
1

julia> C = Xchambers[1]
Chamber in dimension 20 with 36 walls

julia> Xelliptic_classes = [f for f in rays(C) if 0 == f*gram_matrix(NS)*transpose(f)];

julia> Xelliptic_classes_orb = orbits(gset(matrix_group(aut(C)),(x,g)->x*matrix(g), Xelliptic_classes));

julia> length(Xelliptic_classes_orb)
6

julia> f1 = identity_matrix(ZZ, 20)[1:1,:];

julia> f1_2neighbors = [f for f in Xelliptic_classes if 2 == (f1*gram_matrix(NS)*transpose(f))[1,1]];

julia> f2, f3, _ = f1_2neighbors;

julia> f2_2neighbors = [f for f in Xelliptic_classes if 2 == (f2*gram_matrix(NS)*transpose(f))[1,1]];

julia> fibers = [f1,f2,f3];

julia> todo = [o for o in Xelliptic_classes_orb if !any(f in o for f in fibers)];

julia> while length(todo) > 0
         o = popfirst!(todo)
         f = findfirst(x-> x in o, f2_2neighbors)
         push!(fibers, f2_2neighbors[f])
       end

julia> fibers = [vec(collect(i*basis_matrix(NS))) for i in fibers]
6-element Vector{Vector{QQFieldElem}}:
 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 [4, 2, -4, -7, -10, -8, -6, -4, -2, -5, -2, -4, -6, -5, -4, -3, -2, -3, -1, -1]
 [4, 2, -4, -7, -10, -8, -6, -4, -2, -5, -4, -7, -10, -8, -6, -4, -2, -5, 0, 0]
 [6, 3, -5, -10, -15, -12, -9, -6, -3, -8, -5, -10, -15, -12, -9, -6, -3, -8, -1, -1]
 [10, 5, -8, -16, -24, -20, -15, -10, -5, -12, -7, -14, -21, -17, -13, -9, -5, -11, -3, -2]
 [6, 3, -4, -8, -12, -10, -8, -6, -3, -6, -4, -8, -12, -10, -8, -6, -3, -6, -2, -1]

julia> [fibration_type(NS, f) for f in fibers]
6-element Vector{Tuple{Int64, FinGenAbGroup, Vector{Tuple{Symbol, Int64}}}}:
 (0, Z/1, [(:A, 2), (:E, 8), (:E, 8)])
 (1, Z/2, [(:D, 10), (:E, 7)])
 (0, Z/2, [(:A, 2), (:D, 16)])
 (1, Z/3, [(:A, 17)])
 (0, Z/4, [(:A, 11), (:D, 7)])
 (0, Z/3, [(:E, 6), (:E, 6), (:E, 6)])

julia> F = transpose(matrix((reduce(hcat, fibers)))); F * gram_matrix(NS) * transpose(F)
[0   2   2   3   5   3]
[2   0   2   2   2   2]
[2   2   0   2   5   4]
[3   2   2   0   2   3]
[5   2   5   2   0   2]
[3   2   4   3   2   0]
julia> K = QQ;

julia> Kt, t = polynomial_ring(K, :t);

julia> Ktf = fraction_field(Kt);

julia> E = elliptic_curve(Ktf, [0,0,0,0,t^5*(t-1)^2]);

julia> R = rescale(root_lattice([(:E, 8), (:E, 8), (:A, 2)]), -1);

julia> U = integer_lattice(gram=ZZ[0 1; 1 -2]);

julia> NS, _ = direct_sum([U, R]);

julia> e = matrix(ZZ,1,20,ones(Int,20));e[1,1]=51;

julia> ample = e*inv(gram_matrix(NS));

julia> fibers = [vec(collect(i)) for i in [
        QQ[1   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;],
        QQ[4   2   -4   -7   -10 -8   -6   -4   -2   -5   -2   -4   -6   -5   -4   -3   -2   -3   -1   -1;],
        QQ[4   2   -4   -7   -10 -8   -6   -4   -2   -5   -4   -7   -10 -8   -6   -4   -2   -5   0 0;],
        QQ[6   3   -5   -10 -15   -12   -9   -6   -3   -8   -5   -10 -15   -12   -9   -6   -3   -8   -1   -1;],
        QQ[10 5   -8   -16   -24   -20 -15   -10 -5   -12   -7   -14   -21   -17   -13   -9   -5   -11   -3   -2;],
        QQ[6   3   -4   -8   -12   -10 -8   -6   -3   -6   -4   -8   -12   -10 -8   -6   -3   -6   -2   -1;]]];

julia> Y1 = elliptic_surface(E, 2)
Elliptic surface
  over rational field
with generic fiber
  -x^3 + y^2 - t^7 + 2*t^6 - t^5

julia> S = weierstrass_model(Y1)[1]
Scheme
  over rational field
with default covering
  described by patches
    1: scheme(-(x//z)^3 + (y//z)^2 - t^7 + 2*t^6 - t^5)
    2: scheme((z//x)^3*t^7 - 2*(z//x)^3*t^6 + (z//x)^3*t^5 - (z//x)*(y//x)^2 + 1)
    3: scheme((z//y)^3*t^7 - 2*(z//y)^3*t^6 + (z//y)^3*t^5 - (z//y) + (x//y)^3)
    4: scheme((x//z)^3 - (y//z)^2 + s^7 - 2*s^6 + s^5)
    5: scheme((z//x)^3*s^7 - 2*(z//x)^3*s^6 + (z//x)^3*s^5 - (z//x)*(y//x)^2 + 1)
    6: scheme((z//y)^3*s^7 - 2*(z//y)^3*s^6 + (z//y)^3*s^5 - (z//y) + (x//y)^3)
  in the coordinate(s)
    1: [(x//z), (y//z), t]
    2: [(z//x), (y//x), t]
    3: [(z//y), (x//y), t]
    4: [(x//z), (y//z), s]
    5: [(z//x), (y//x), s]
    6: [(z//y), (x//y), s]

julia> piS = weierstrass_contraction(Y1)
Composite morphism of
  Hom: elliptic surface with generic fiber -x^3 + y^2 - t^7 + 2*t^6 - t^5 -> scheme over QQ covered with 44 patches
  Hom: scheme over QQ covered with 44 patches -> scheme over QQ covered with 40 patches
  Hom: scheme over QQ covered with 40 patches -> scheme over QQ covered with 38 patches
  Hom: scheme over QQ covered with 38 patches -> scheme over QQ covered with 36 patches
  Hom: scheme over QQ covered with 36 patches -> scheme over QQ covered with 32 patches
  Hom: scheme over QQ covered with 32 patches -> scheme over QQ covered with 30 patches
  Hom: scheme over QQ covered with 30 patches -> scheme over QQ covered with 28 patches
  Hom: scheme over QQ covered with 28 patches -> scheme over QQ covered with 26 patches
  Hom: scheme over QQ covered with 26 patches -> scheme over QQ covered with 24 patches
  Hom: scheme over QQ covered with 24 patches -> scheme over QQ covered with 22 patches
  Hom: scheme over QQ covered with 22 patches -> scheme over QQ covered with 20 patches
  Hom: scheme over QQ covered with 20 patches -> scheme over QQ covered with 18 patches
  Hom: scheme over QQ covered with 18 patches -> scheme over QQ covered with 16 patches
  Hom: scheme over QQ covered with 16 patches -> scheme over QQ covered with 14 patches
  Hom: scheme over QQ covered with 14 patches -> scheme over QQ covered with 12 patches
  Hom: scheme over QQ covered with 12 patches -> scheme over QQ covered with 10 patches
  Hom: scheme over QQ covered with 10 patches -> scheme over QQ covered with 6 patches



julia> basisNSY1, gramTriv = trivial_lattice(Y1);

julia> [(i[1],i[2]) for i in reducible_fibers(Y1)]
3-element Vector{Tuple{Vector{QQFieldElem}, Tuple{Symbol, Int64}}}:
 ([0, 1], (:E, 8))
 ([1, 1], (:A, 2))
 ([1, 0], (:E, 8))

julia> basisNSY1, _, NSY1 = algebraic_lattice(Y1);

julia> basisNSY1
20-element Vector{Any}:
 Fiber over (2, 1)
 section: (0 : 1 : 0)
 component E8_1 of fiber over (0, 1)
 component E8_2 of fiber over (0, 1)
 component E8_3 of fiber over (0, 1)
 component E8_4 of fiber over (0, 1)
 component E8_5 of fiber over (0, 1)
 component E8_6 of fiber over (0, 1)
 component E8_7 of fiber over (0, 1)
 component E8_8 of fiber over (0, 1)
 component A2_1 of fiber over (1, 1)
 component A2_2 of fiber over (1, 1)
 component E8_1 of fiber over (1, 0)
 component E8_2 of fiber over (1, 0)
 component E8_3 of fiber over (1, 0)
 component E8_4 of fiber over (1, 0)
 component E8_5 of fiber over (1, 0)
 component E8_6 of fiber over (1, 0)
 component E8_7 of fiber over (1, 0)
 component E8_8 of fiber over (1, 0)

julia> basisNSY1[1]
Effective weil divisor Fiber over (2, 1)
  on elliptic surface with generic fiber -x^3 + y^2 - t^7 + 2*t^6 - t^5
with coefficients in integer ring
given as the formal sum of
  1 * sheaf of ideals

julia> b, I = Oscar._is_equal_up_to_permutation_with_permutation(gram_matrix(NS), gram_matrix(NSY1))
(true, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 20, 11, 12, 13, 14, 15, 16, 17, 18])

julia> @assert gram_matrix(NSY1) == gram_matrix(NS)[I,I]

julia> Oscar.horizontal_decomposition(Y1, fibers[2][I])[2];

julia> representative(elliptic_parameter(Y1, fibers[2][I]))
(x//z)//(t^3 - t^2)

julia> g, phi1 = two_neighbor_step(Y1, fibers[2][I]); g
-t^3*x^3 + t^3*x^2 - x + y^2

julia> kt2 = base_ring(parent(g)); P = kt2.([0,0]);

julia> Y2, phi2 = elliptic_surface(g, P; minimize=false); Y2
Elliptic surface
  over rational field
with generic fiber
  -x^3 + t^3*x^2 - t^3*x + y^2

julia> E2 = generic_fiber(Y2); tt = gen(kt2);

julia> P2 = E2([tt^3, tt^3]); set_mordell_weil_basis!(Y2, [P2]);

julia> U2 = weierstrass_chart_on_minimal_model(Y2); U1 = weierstrass_chart_on_minimal_model(Y1);

julia> imgs = phi2.(phi1.(ambient_coordinates(U1))) # k(Y1) -> k(Y2)
3-element Vector{AbstractAlgebra.Generic.FracFieldElem{QQMPolyRingElem}}:
 (-(x//z)*t + t)//(x//z)^3
 ((x//z)*(y//z) - (y//z))//(x//z)^5
 1//(x//z)

julia> phi_rat = morphism_from_rational_functions(Y2, Y1, U2, U1, imgs);

julia> set_attribute!(phi_rat, :is_isomorphism=>true);

julia> pullbackDivY1 = [pullback(phi_rat, D) for D in basisNSY1];

julia> B = [basis_representation(Y2, D) for D in pullbackDivY1];

julia> B = matrix(QQ, 20, 20, reduce(vcat, B)); NSY2 = algebraic_lattice(Y2)[3];

julia> NSY1inY2 = lattice(ambient_space(NSY2),B);

julia> @assert NSY1inY2 == NSY2 && gram_matrix(NSY1inY2) == gram_matrix(NSY1)

julia> fibers_in_Y2 = [f[I]*B for f in fibers];

julia> f3 = fibers[3][I]; representative(elliptic_parameter(Y1, f3))
(x//z)//t^2

julia> g3a, phi3a = two_neighbor_step(Y1, f3); g3a
-x^3 + (-t^3 + 2)*x^2 - x + y^2

julia> @assert all(inner_product(ambient_space(NSY2), i,i) == 0 for i in fibers_in_Y2)

julia> [representative(elliptic_parameter(Y2, f)) for f in fibers_in_Y2[4:6]]
3-element Vector{AbstractAlgebra.Generic.FracFieldElem{QQMPolyRingElem}}:
 (y//z)//((x//z)*t)
 ((y//z) + t^3)//((x//z)*t - t^4)
 ((y//z) + t^3)//((x//z) - t^3)

julia> g,_ = two_neighbor_step(Y2, fibers_in_Y2[4]);g
-1//4*x^4 - 1//2*t^2*x^3 - 1//4*t^4*x^2 + x + y^2

julia> R = parent(g); K_t = base_ring(R);

julia> (x,y) = gens(R); P = K_t.([0,0]); # rational point

julia> g, _ = transform_to_weierstrass(g, x, y, P);

julia> E4 = elliptic_curve(g, x, y)
Elliptic curve with equation
y^2 = x^3 + 1//4*t^4*x^2 - 1//2*t^2*x + 1//4

julia> g,_ = two_neighbor_step(Y2, fibers_in_Y2[5]);g
t^2*x^3 + (-1//4*t^4 + 2*t)*x^2 + x + y^2

julia> R = parent(g); K_t = base_ring(R);

julia> (x,y) = gens(R); P = K_t.([0,0]); # rational point

julia> g, _ = transform_to_weierstrass(g, x, y, P);

julia> E5 = elliptic_curve(g, x, y)
Elliptic curve with equation
y^2 = x^3 + (1//4*t^4 - 2*t)*x^2 + t^2*x

julia> g,_ = two_neighbor_step(Y2, fibers_in_Y2[6]);g
(t^2 + 2*t + 1)*x^3 + y^2 - 1//4*t^4

julia> R = parent(g); K_t = base_ring(R); t = gen(K_t);

julia> (x,y) = gens(R); P = K_t.([0,1//2*t^2]); # rational point

julia> g, _ = transform_to_weierstrass(g, x, y, P);

julia> E6 = elliptic_curve(g, x, y)
Elliptic curve with equation
y^2 + (-t^2 - 2*t - 1)//t^4*y = x^3
Edit this page Contact Imprint Privacy policy © 2018-2025 The OSCAR Team