Affine schemes - HechtiDerLachs/Oscar.jl GitHub Wiki

In theory, an affine scheme of finite type can be modeled as Spec(A) where A = k[x]/I is a quotient of a polynomial ring k[x] = k[x_1,...,x_n] over a Noetherian base ring k modulo an ideal I.

In practice, an affine scheme often occurs in the form of a principal open subset of another affine scheme, which then does not automatically provide the encoding of the form of a quotient of a polynomial ring. This has the form of the localization of a ring A (as above) at a polynomial f.

Therefore, an affine scheme is modeled by a polynomial algebra as above and an additional field denom which contains a list of polynomials at whose product the ring is assumed to be localized.

There are various ways to implement models for such localizations, for instance via Rabinowitsch's method by adding a new variable, say u, for the inverse of f via 1-fu, or by saturation by f. Depending on the purpose, different approaches and algorithms can and need to be used. Within the AffineScheme structure, we therefore only store the data necessary for deriving any of these implementations and in addition further fields for caching any such intermediate result such as the explicit ring A[u]/(1-fu), or the saturated ideal I'.

Whenever implementing new algorithms requiring the computations of expensive intermediate results, make sure you add the respective field for caching!

Here is a try:

Scheme -> { AffineScheme -> PrincipalOpenAffineSubScheme, CoveredScheme}

AffineScheme k a base ring, usually a field R an "ambient" polynomial ring I an ideal of R the defining ideal

PrincipalOpenAffineSubScheme parent::Union{AffineScheme,PrincipalOpenAffineSubscheme} denom::an element of a polynomial ring in the root AffineScheme. S:: the coordinate ring, usually left uninitialized. It is for caching.

We model the spectrum of a ring, seen as a ringed space as a tree structure with an "Ambient" affine Scheme as the root of the tree and each principal open subset as a node of the tree. For example let X=Spec S be the "ambient AffineScheme it is the root of the tree X > {D(f1) > D(f1 f2) > {D(f1 f2 f3), D(f1 f2 h3)}, D(g1) > D(g2)}
Now D(f1) saves X and f1 in S D(f1 f2) has a pointer to D(f1) and stores f2 in S D(f1 f2 h3) has a pointer to D(f1 f2) and stores h3
etc. coordinate_ring(D(f1, f2 f3)) ALWAYS returns S[u1,u2,u3]/(u1f1-1,u2f2-1,u3f3-1) and caches that If you want to localize only at a single variable call coordinate_ring(D(f1f2*f3)) [Programming problem: allow to delete leaves (and keep the data structure consistent) so maybe an extra field isleaf or something. I am not an expert on trees.]

The scheme structure is implicit in the tree and should be computed at request but not at creation of a new node. For instance some function to check if D(f1,...,fn) is subset or equal to D(g1, ... gk) and if yes return the corresponding inclusion/isomorphism