Description
The main ingredient behind this method is the interpolation of multivariate polynomials. We illustrate this feature with some examples.
i1 : f = a -> {-a_1^3*max(sin(a_2),1)+a_0*a_1*a_2*ceiling((log(1 + abs a_0))^0),-a_1^2*a_2+a_0*a_1*a_3,-a_1*a_2^2+a_1^2*a_3,-a_1^2*a_3+a_0*a_1*a_4,-a_1*a_2*a_3+a_1^2*a_4,-a_1*a_3^2+a_1*a_2*a_4}
o1 = f
o1 : FunctionClosure
|
i2 : P4 := QQ[t_0..t_4]
o2 = QQ[t ..t ]
0 4
o2 : PolynomialRing
|
i3 : P5 := QQ[u_0..u_5]
o3 = QQ[u ..u ]
0 5
o3 : PolynomialRing
|
i4 : time psi = abstractRationalMap(P4,P5,f)
-- used 0.000456533s (cpu); 0.000259266s (thread); 0s (gc)
o4 = -- rational map --
source: Proj(QQ[t , t , t , t , t ])
0 1 2 3 4
target: Proj(QQ[u , u , u , u , u , u ])
0 1 2 3 4 5
defining forms: given by a function
o4 : AbstractRationalMap (rational map from PP^4 to PP^5)
|
Now we compute first the degree of the forms defining the abstract map psi and then the corresponding concrete rational map.
i5 : time projectiveDegrees(psi,3)
-- used 0.223181s (cpu); 0.139894s (thread); 0s (gc)
o5 = 2
|
i6 : time rationalMap psi
-- used 0.324588s (cpu); 0.283032s (thread); 0s (gc)
o6 = -- rational map --
source: Proj(QQ[t , t , t , t , t ])
0 1 2 3 4
target: Proj(QQ[u , u , u , u , u , u ])
0 1 2 3 4 5
defining forms: {
2
t - t t ,
1 0 2
t t - t t ,
1 2 0 3
2
t - t t ,
2 1 3
t t - t t ,
1 3 0 4
t t - t t ,
2 3 1 4
2
t - t t
3 2 4
}
o6 : RationalMap (quadratic rational map from PP^4 to PP^5)
|
As a second example, we apply the method to compute the inverse of a Cremona transformation.
i7 : phi = rationalMap map specialCremonaTransformation(3,ZZ/10000019);
o7 : RationalMap (Cremona transformation of PP^4 of type (3,2))
|
i8 : phi' = abstractRationalMap phi
o8 = -- rational map --
ZZ
source: Proj(--------[x , x , x , x , x ])
10000019 0 1 2 3 4
ZZ
target: Proj(--------[x , x , x , x , x ])
10000019 0 1 2 3 4
defining forms: given by a function (degree = 3)
o8 : AbstractRationalMap (rational map from PP^4 to PP^4)
|
i9 : psi' = inverseMap phi'
o9 = -- rational map --
ZZ
source: Proj(--------[x , x , x , x , x ])
10000019 0 1 2 3 4
ZZ
target: Proj(--------[x , x , x , x , x ])
10000019 0 1 2 3 4
defining forms: given by a function
o9 : AbstractRationalMap (rational map from PP^4 to PP^4)
|
i10 : psi = rationalMap psi';
o10 : RationalMap (quadratic rational map from PP^4 to PP^4)
|
i11 : assert(isInverseMap(phi,psi))
|
We now consider a more interesting application. Recall that a closed subvariety $X\subset\mathbb{P}^n$ is called a subvariety with one apparent double point if a general point in $\mathbb{P}^n$ lies on a unique secant of $X$. A subvariety $X\subset\mathbb{P}^n$ with an apparent double point defines a Cremona involution of $\mathbb{P}^n$: for a general point $x\in\mathbb{P}^n$ we find a unique secant of $X$ intersecting $X$ at two points $(a,b)$, and then define the unique $T(x)$ such that the pair $\{x,T(x)\}$ is harmonically conjugate to $\{a,b\}$. For more details, see Lecture 4 in Lectures on Cremona transformations, by I. Dolgachev. This abstract construction is implemented in the package: if I is the ideal of one apparent double point variety $X\subset\mathbb{P}^n$, then the command abstractRationalMap(I,"OADP") returns the abstract rational map above defined. For instance, we can take $X$ to be the twisted cubic curve in $\mathbb{P}^3$.
i12 : ZZ/65521[x_0..x_3]; I = minors(2,matrix{{x_0,x_1,x_2},{x_1,x_2,x_3}})
2 2
o13 = ideal (- x + x x , - x x + x x , - x + x x )
1 0 2 1 2 0 3 2 1 3
ZZ
o13 : Ideal of -----[x ..x ]
65521 0 3
|
i14 : time T = abstractRationalMap(I,"OADP")
-- used 0.100658s (cpu); 0.0583058s (thread); 0s (gc)
o14 = -- rational map --
ZZ
source: Proj(-----[x , x , x , x ])
65521 0 1 2 3
ZZ
target: Proj(-----[x , x , x , x ])
65521 0 1 2 3
defining forms: given by a function
o14 : AbstractRationalMap (rational map from PP^3 to PP^3)
|
The degree of the forms defining the abstract map T can be obtained by the following command:
i15 : time projectiveDegrees(T,2)
-- used 2.25827s (cpu); 1.50836s (thread); 0s (gc)
o15 = 3
|
We verify that the composition of T with itself is defined by linear forms:
i16 : time T2 = T * T
-- used 0.000135552s (cpu); 1.7705e-05s (thread); 0s (gc)
o16 = -- rational map --
ZZ
source: Proj(-----[x , x , x , x ])
65521 0 1 2 3
ZZ
target: Proj(-----[x , x , x , x ])
65521 0 1 2 3
defining forms: given by a function
o16 : AbstractRationalMap (rational map from PP^3 to PP^3)
|
i17 : time projectiveDegrees(T2,2)
-- used 3.74575s (cpu); 2.48708s (thread); 0s (gc)
o17 = 1
|
We verify that the composition of T with itself leaves a random point fixed:
i18 : p = apply(3,i->random(ZZ/65521))|{1}
o18 = {28963, 31975, -30172, 1}
o18 : List
|
i19 : q = T p
o19 = {31943, 16346, -1598, 1}
o19 : List
|
i20 : T q
o20 = {28963, 31975, -30172, 1}
o20 : List
|
We now compute the concrete rational map corresponding to T:
i21 : time f = rationalMap T
-- used 3.10942s (cpu); 2.1312s (thread); 0s (gc)
o21 = -- rational map --
ZZ
source: Proj(-----[x , x , x , x ])
65521 0 1 2 3
ZZ
target: Proj(-----[x , x , x , x ])
65521 0 1 2 3
defining forms: {
3 2
- x - 32759x x x + 32760x x ,
1 0 1 2 0 3
2 2
32760x x + x x + 32760x x x ,
1 2 0 2 0 1 3
2 2
- 32760x x - x x - 32760x x x ,
1 2 1 3 0 2 3
3 2
x + 32759x x x - 32760x x
2 1 2 3 0 3
}
o21 : RationalMap (cubic rational map from PP^3 to PP^3)
|
i22 : describe f!
o22 = rational map defined by forms of degree 3
source variety: PP^3
target variety: PP^3
dominance: true
birationality: true (the inverse map is already calculated)
projective degrees: {1, 3, 3, 1}
number of minimal representatives: 1
dimension base locus: 1
degree base locus: 6
coefficient ring: ZZ/65521
|