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