Skip to content

Commit e1aec2a

Browse files
Attempt for first round of fixes.
1 parent cbf60fa commit e1aec2a

File tree

3 files changed

+82
-38
lines changed

3 files changed

+82
-38
lines changed

Diff for: src/AlgebraicGeometry/Schemes/AffineSchemes/Morphisms/Methods.jl

+36-9
Original file line numberDiff line numberDiff line change
@@ -478,9 +478,36 @@ The optional arguments `domain_map` and `codomain_map` can be used
478478
to specify the morphisms `b₁` and `b₂`, respectively.
479479
"""
480480
function base_change(phi::Any, f::AbsAffineSchemeMor;
481-
domain_map::AbsAffineSchemeMor=base_change(phi, domain(f))[2],
482-
codomain_map::AbsAffineSchemeMor=base_change(phi, codomain(f))[2]
481+
domain_map::Union{AbsAffineSchemeMor, Nothing} = nothing,
482+
codomain_map::Union{AbsAffineSchemeMor, Nothing} = nothing
483483
)
484+
# We need to cater for the case where `phi` is a natural inclusion.
485+
# In that case, we have the same `ambient_coordinate_ring` for domain and codomain
486+
# and we need to make sure, its base change is performed only once.
487+
if domain_map === nothing
488+
ambient_coordinate_map = nothing # initialize the variable
489+
if codomain_map !== nothing && ambient_coordinate_ring(domain(f)) === ambient_coordinate_ring(codomain(f))
490+
# The `ambient_coordinate_ring` is already determined by the map on the codomain
491+
R = ambient_coordinate_ring(domain(f))
492+
R_red = ambient_coordinate_ring(domain(codomain_map))
493+
ambient_ring_map_domain = hom(R, R_red, phi, gens(R_red))
494+
else
495+
_, ambient_ring_map_domain = _change_base_ring(phi, ambient_coordinate_ring(domain(f)))
496+
end
497+
_, domain_map = base_change(phi, domain(f); ambient_ring_map=ambient_ring_map_domain)
498+
end
499+
if codomain_map === nothing
500+
ambient_ring_map_codomain = nothing # initialize the variable
501+
if ambient_coordinate_ring(domain(f)) === ambient_coordinate_ring(codomain(f))
502+
# The `ambient_ring` is already determined by the map on the domain
503+
R = ambient_coordinate_ring(domain(f))
504+
R_red = ambient_coordinate_ring(domain(domain_map))
505+
ambient_ring_map_codomain = hom(R, R_red, phi, gens(R_red))
506+
else
507+
ambient_ring_map_codomain = _change_base_ring(phi, ambient_coordinate_ring(codomain(f)))
508+
end
509+
_, codomain_map = base_change(phi, codomain(f); ambient_ring_map=ambient_ring_map_codomain)
510+
end
484511
X = domain(f)
485512
Y = codomain(f)
486513
XX = domain(domain_map)
@@ -503,20 +530,20 @@ function base_change(phi::Any, f::AbsAffineSchemeMor;
503530
end
504531

505532
function base_change(phi::Any, f::ClosedEmbedding;
506-
domain_map::AbsAffineSchemeMor=base_change(phi, domain(f))[2],
507-
codomain_map::AbsAffineSchemeMor=base_change(phi, codomain(f))[2]
533+
domain_map::Union{AbsAffineSchemeMor, Nothing} = nothing,
534+
codomain_map::Union{AbsAffineSchemeMor, Nothing} = nothing
508535
)
509-
@assert codomain(codomain_map) === codomain(f)
510-
@assert codomain(domain_map) === domain(f)
536+
codomain_map !== nothing && @req codomain(codomain_map) === codomain(f) "incompatible map"
537+
domain_map !== nothing && @req codomain(domain_map) === domain(f) "incompatible map"
511538
g = underlying_morphism(f)
512-
_, bc_g, _ = base_change(phi, g; domain_map, codomain_map)
539+
domain_map, bc_g, codomain_map = base_change(phi, g; domain_map, codomain_map)
513540
I = image_ideal(f)
514541
@assert base_ring(I) === OO(codomain(f))
515542
@assert base_ring(I) === OO(codomain(f))
516543
#bc_I = ideal(OO(codomain(bc_g)), pullback(codomain_map).(gens(I)))
517544
bc_I = pullback(codomain_map)(I)
518-
@assert domain(bc_g) === domain(domain_map)
519-
@assert codomain(bc_g) === domain(codomain_map)
545+
domain_map !== nothing && @req domain(bc_g) === domain(domain_map) "incompatible map"
546+
codomain_map !== nothing && @req codomain(bc_g) === domain(codomain_map) "incompatible map"
520547
return domain_map, ClosedEmbedding(bc_g, bc_I; check=false), codomain_map
521548
end
522549

Diff for: src/AlgebraicGeometry/Schemes/AffineSchemes/Objects/Methods.jl

+33-24
Original file line numberDiff line numberDiff line change
@@ -412,45 +412,54 @@ For an affine scheme `X` over a `base_ring` ``𝕜`` and a morphism
412412
``φ : 𝕜 → 𝕂`` this computes ``Y = X × Spec(𝕂)`` and returns a pair
413413
`(Y, psi)` where `psi` is the canonical map ``Y → X``.
414414
"""
415-
function base_change(phi::Any, X::AbsAffineScheme)
416-
kk = base_ring(X)
417-
kk_red = parent(phi(zero(kk)))
415+
function base_change(
416+
phi::Any, X::AbsAffineScheme;
417+
ambient_ring_map::Map=_change_base_ring(phi, ambient_coordinate_ring(X))[2]
418+
)
418419
R = OO(X)
419-
R_red, Phi = _change_base_ring(phi, R)
420+
R_red, Phi = _change_base_ring(phi, R; ambient_ring_map)
420421
Y = spec(R_red)
421422
return Y, morphism(Y, X, Phi; check=false)
422423
end
423424

424425
### Some helper functions
425-
function _change_base_ring(phi::Any, R::MPolyRing)
426-
K = coefficient_ring(R)
427-
kk = parent(phi(zero(K)))
428-
P, _ = polynomial_ring(kk, symbols(R); cached=false)
429-
Phi = hom(R, P, phi, gens(P); check=false)
430-
return P, Phi
426+
function _change_base_ring(
427+
phi::Any, R::MPolyRing;
428+
ambient_ring_map::Map=begin
429+
K = coefficient_ring(R)
430+
kk = parent(phi(zero(K)))
431+
P, _ = polynomial_ring(kk, symbols(R); cached=false)
432+
Phi = hom(R, P, phi, gens(P); check=false)
433+
Phi
434+
end
435+
)
436+
return codomain(ambient_ring_map), ambient_ring_map
431437
end
432438

433-
function _change_base_ring(phi::Any, A::MPolyQuoRing)
434-
R = base_ring(A)
439+
function _change_base_ring(
440+
phi::Any, A::MPolyQuoRing;
441+
ambient_ring_map::Map=_change_base_ring(phi, base_ring(A))[2]
442+
)
435443
I = modulus(A)
436-
P, Phi = _change_base_ring(phi, R)
437-
I_red = ideal(P, Phi.(gens(I)))
444+
P = codomain(ambient_ring_map)
445+
I_red = ideal(P, ambient_ring_map.(gens(I)))
438446
Q, pr = quo(P, I_red)
439447
Phi_bar = hom(A, Q, phi, gens(Q), check=false)
440448
return Q, Phi_bar
441449
end
442450

443-
function _change_base_ring(phi::Any,
451+
function _change_base_ring(
452+
phi::Any,
444453
W::MPolyLocRing{<:Any, <:Any, <:Any, <:Any,
445-
<:MPolyPowersOfElement}
454+
<:MPolyPowersOfElement};
455+
ambient_ring_map::Map=_change_base_ring(phi, base_ring(W))[2]
446456
)
447-
R = base_ring(W)
448-
P, Phi = _change_base_ring(phi, R)
449-
@assert _has_coefficient_map(Phi)
457+
P = codomain(ambient_ring_map)
458+
@assert _has_coefficient_map(ambient_ring_map)
450459
U = inverted_set(W)
451-
U_red = MPolyPowersOfElement(P, Phi.(denominators(U)))
460+
U_red = MPolyPowersOfElement(P, ambient_ring_map.(denominators(U)))
452461
W_red, loc_map = localization(P, U_red)
453-
comp = hom(R, W_red, phi, gens(W_red); check=false)
462+
comp = hom(base_ring(W), W_red, phi, gens(W_red); check=false)
454463
@assert _has_coefficient_map(comp)
455464
res_map = hom(W, W_red, comp, check=false)
456465
@assert _has_coefficient_map(res_map)
@@ -459,11 +468,11 @@ end
459468

460469
function _change_base_ring(phi::Any,
461470
L::MPolyQuoLocRing{<:Any, <:Any, <:Any, <:Any,
462-
<:MPolyPowersOfElement}
471+
<:MPolyPowersOfElement};
472+
ambient_ring_map::Map=_change_base_ring(phi, base_ring(L))[2]
463473
)
464-
R = base_ring(L)
465474
W = localized_ring(L)
466-
W_red, Phi_W = _change_base_ring(phi, W)
475+
W_red, Phi_W = _change_base_ring(phi, W; ambient_ring_map)
467476
I = modulus(L)
468477
I_red = ideal(W_red, Phi_W.(gens(I)))
469478
L_red, pr = quo(W_red, I_red)

Diff for: test/AlgebraicGeometry/Schemes/AffineSchemes.jl

+13-5
Original file line numberDiff line numberDiff line change
@@ -267,20 +267,28 @@ end
267267
P = OO(IA2)
268268
x, y = gens(P)
269269

270-
X = subscheme(IA2, x^2 + y^2)
270+
X, inc_X = sub(IA2, x^2 + y^2)
271271

272272
U = hypersurface_complement(IA2, x)
273+
inc_U = inclusion_morphism(U, IA2)
273274

274275
V = hypersurface_complement(X, x)
276+
inc_V = inclusion_morphism(V, X)
275277

276278
kk, pr = quo(ZZ, 5)
277279
IA2_red, phi1 = base_change(pr, IA2)
278-
X_red, phi2 = base_change(pr, X)
279-
U_red, phi3 = base_change(pr, U)
280-
V_red, phi4 = base_change(pr, V)
280+
red_X, phi2, _ = base_change(pr, inc_X; codomain_map=phi1)
281+
X_red = domain(red_X)
282+
@test ambient_coordinate_ring(IA2_red) === ambient_coordinate_ring(X_red)
283+
red_U, phi3, _ = base_change(pr, inc_U; codomain_map=phi1)
284+
U_red = domain(red_U)
285+
@test ambient_coordinate_ring(IA2_red) === ambient_coordinate_ring(U_red)
286+
red_V, phi4, _ = base_change(pr, inc_V; codomain_map=red_X)
287+
V_red = domain(red_V)
288+
@test ambient_coordinate_ring(IA2_red) === ambient_coordinate_ring(V_red)
281289

282290
m1 = compose(inclusion_morphism(V_red, IA2_red), phi1);
283-
m2 = compose(phi4, inclusion_morphism(V, IA2));
291+
m2 = compose(red_V, inclusion_morphism(V, IA2));
284292
@test m1 == m2
285293

286294
# Testing morphisms

0 commit comments

Comments
 (0)