Base Change for Schemes#

Let \(A\) be some ambient space in Magma. For example, think of \(A\) as being the affine plane. Let \(k\) be its base ring and \(R_A\) its coordinate ring. If \(m\colon k\rightarrow L\) is a map of rings (a coercion map, for instance) then there is a new ambient space denoted \(A_L\) and called the base change of \(A\) to \(L\) which has coordinate ring \(R_{A_L}\) with coefficient ring \(L\) instead of \(k\). (Mathematically, one simply tensors \(R_A\) with \(L\) over \(k\). In Magma the equivalent function at the level of polynomial rings is ChangeRing.) There is a base change function described below which takes \(A\) and \(L\) (or the map \(k\rightarrow L\)) as arguments and creates this new space \(A_L\). Note that there is a map from the coordinate ring of \(A\) to that of \(A_L\) determined by the map \(m\).

This operation is called base extension since one often thinks of the map \(m\) as being an extension of fields. Of course, the map \(m\) could be many other things. One key example where the name extension is a little unusual would be when \(m\) is the map from the integers to some finite field.

Now let \(X\) be a scheme in Magma. Thus \(X\) is defined by some polynomials \(f_1,\dots, f_r\) on some ambient space \(A\). Given a ring map \(k\rightarrow L\) there is a base change operation for \(X\) which returns the base change of \(X\) to \(L\), denoted \(X_L\). This is done by first making the base change of \(A\) to \(L\) and then using the map from the coordinate ring of \(A\) to that of \(A_L\) to translate the polynomials \(f_i\) into polynomials defined on \(A_L\). These polynomials can then be used to define a scheme in \(A_L\). It is this resulting scheme which is the base change of \(X\) to \(L\).

If one has a number of schemes in the same ambient space and wants to base change them all at the same time, a little care is required. The function which takes a scheme and a map of rings as argument will create a new ambient space each time so is unsuitable. Better would be to base change the ambient space and then use the base change function which takes the scheme and the desired new ambient space as argument. (This latter base change function appears to be different from the other ones. In fact it is not. We described base change above as a function of maps of rings. Of course, there is a natural extension to maps of schemes. With that extension, this final base change intrinsic really is base change with respect to map of ambient spaces.)

BaseChange(A, K): Sch, Rng -> Sch#
BaseExtend(A, K): Sch, Rng -> Sch#

If \(A\) is a scheme defined over a field \(k\) and \(K\) is an extension into which elements of \(k\) can be automatically coerced then this returns a new scheme \(A_K\) defined over \(K\). No cached data about \(A\) will be transferred to \(A_K\) and coordinate names will have to be defined again on \(A_K\) if needed.

BaseChange(A, m): Sch, Map -> Sch#
BaseExtend(A, m): Sch, Map -> Sch#

If \(m\) is a map of rings whose domain is the base ring of the scheme \(A\), this returns the base change of \(A\) to the codomain of \(m\). The equations of \(A\), if any, are mapped to the new ambient coordinate ring using \(m\).

BaseChange(F, K): SeqEnum, Rng -> SeqEnum#
BaseExtend(F, K): SeqEnum, Rng -> SeqEnum#
BaseChange(F, m): SeqEnum, Rng -> SeqEnum#
BaseExtend(F, m): SeqEnum, Rng -> SeqEnum#

If \(F\) is a sequence of schemes lying in a common ambient space whose base ring admits automatic coercion to \(K\) or is the domain of a ring map \(m\) then this returns the base change of the elements of \(F\) as a new sequence.

BaseChange(X, A): Sch, Sch -> Sch#
BaseExtend(X, A): Sch, Sch -> Sch#
BaseChange(X, A, m): Sch, Sch, Map -> Sch#
BaseExtend(X, A, m): Sch, Sch, Map -> Sch#

If \(X\) is any scheme whose ambient space \(B\) is of the same type (affine or projective) and dimension as the ambient space \(A\) but either has a base ring which admits coercion to that of \(A\) or the map \(m\) is a ring map from the base ring of \(B\) to that of \(A\) then this returns a scheme with the equations of \(X\) as a subscheme of \(A\). The equations are transferred to \(A\) using coercion or the map \(m\).

BaseChange(X, n): Sch, RngIntElt -> Sch#
BaseExtend(X, n): Sch, RngIntElt -> Sch#

The base change of the scheme \(X\), where the base ring of \(X\) is a finite field to the finite field which is a degree \(n\) extension of the base field of \(X\).

Example: Base Change Schemes (ex-bc94d7)#

Here are two curves whose intersection points are not defined over the rationals and one of which only splits after a field extension. The basic function to calculate intersection points only searches for them over the current field of definition so misses them at first. But with an extra argument it is able to search over an extension of the base without actually changing base of the schemes. This contrasts with finding higher dimensional components of schemes which always requires the base change.

> A<x,y> := AffineSpace(Rationals(),2);
> C := Curve(A,x^2 + y^2);
> IsIrreducible(C);
true
> D := Curve(A,x - 1);
> IntersectionPoints(C,D);
{}
> Qi<i> := QuadraticField(-1);
> IntersectionPoints(C,D,Qi);
{ (0, i), (0, -i) }

Run in calculator

So we have found the intersection points (although we haven’t explained how we chose the right field extension). Now we do the same calculation again but by making the base change of all schemes to the field \(Qi\). Over this field the intersection points are immediately visible, but also the curve \(C\) splits into two components.

> B<u,v> := BaseChange(A,Qi);
> C1 := BaseChange(C,B);
> D1 := BaseChange(D,B);
> IsIrreducible(C1);
false
> IntersectionPoints(C1,D1);
{ (0, i), (0, -i) }
> PrimeComponents(C1);
[
    Scheme over Qi defined by u + i*v,
    Scheme over Qi defined by u - i*v
]

Run in calculator