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