# isBirationalOntoImage -- Checks if a map between projective varieties is birational onto its image.

## Synopsis

• Usage:
val = isBirationalOntoImage(a,b,f)
val = isBirationalOntoImage(R,S,f)
val = isBirationalOntoImage(Pi)
• Inputs:
• a, an ideal, defining equations for X
• b, an ideal, defining equations for Y
• f, , A list of where to send the variables in the ring of b, to in the ring of a.
• R, a ring, the homogeneous coordinate ring of X
• S, a ring, the homogeneous coordinate ring of Y
• Pi, , A ring map S to R corresponding to X mapping to Y
• Optional inputs:
• AssumeDominant => ..., default value false, If true, certain functions assume that the map from X to Y is dominant.
• HybridLimit => ..., default value 15, An option to control HybridStrategy
• MinorsCount => ..., default value null, An option controlling the behavior of isBirational and inverseOfMap (and other functions which call those).
• QuickRank => ..., default value true, An option for computing how rank is computed
• Strategy => ..., default value HybridStrategy, Determines the desired Strategy in each function.
• Verbose => ..., default value true, generate informative output
• Outputs:
• val, , true if the map is birational onto its image, false if otherwise

## Description

This checks whether $f : X \to Y$ is birational onto its image. We do this by computing the image and then calling isBirationalOntoImage. The option AssumeDominant being true will cause the function to assume that the kernel of the associated ring map is zero (default value is false). The source must be a variety, in particular its defining ideals must be prime. In the following example, the map is not birational, but it is birational onto its image.

 i1 : R=QQ[x,y]; i2 : S=QQ[a,b,c,d]; i3 : Pi = map(R, S, {x^3, x^2*y, x*y^2, y^3}); o3 : RingMap R <--- S i4 : isBirationalOntoImage(Pi, Verbose=>false) o4 = true i5 : isBirationalMap(Pi, Verbose=>false) o5 = false

Sub-Hankel matrices have homaloidal determinants.

 i6 : A = QQ[z_0..z_6]; i7 : H=map(A^4,4,(i,j)->A_(i+j)); 4 4 o7 : Matrix A <--- A i8 : SH=sub(H,{z_5=>0,z_6=>0}) o8 = | z_0 z_1 z_2 z_3 | | z_1 z_2 z_3 z_4 | | z_2 z_3 z_4 0 | | z_3 z_4 0 0 | 4 4 o8 : Matrix A <--- A i9 : sh=map(A, A, transpose jacobian ideal det SH ); o9 : RingMap A <--- A i10 : isBirationalOntoImage(sh, Verbose=>false) o10 = false i11 : B=QQ[t_0..t_4]; i12 : li=map(B,A,matrix{{t_0..t_4,0,0}}); o12 : RingMap B <--- A i13 : phi=li*sh; o13 : RingMap B <--- A i14 : isBirationalOntoImage(phi, HybridLimit=>2) Starting isBirationalOntoImage Starting inverseOfMapOntoImageSimis(SimisStrategy or HybridStrategy) isBirationalOntoImageSimis: About to find the image of the map. If you know the image, you may want to use the AssumeDominant option if this is slow. isBirationalOntoImageSimis: Found the image of the map. isBirationalOntoImageSimis: About to compute partial Groebner basis of rees ideal up to degree {1, 1}. isBirationalOntoImageSimis: Found Jacobian dual matrix (or a weak form of it), it has 5 columns and about 6 rows. isBirationalOntoImageSimis: is computing the rank of the Jacobian Dual Matrix- barJD isRankAtLeast: Going to single threaded version. getSubmatrixOfRank: Trying to find a submatrix of rank at least: 4 with attempts = 3. DetStrategy=>Rank internalChooseMinor: Choosing GRevLexSmallest internalChooseMinor: Choosing GRevLexSmallest internalChooseMinor: Choosing GRevLexSmallest getSubmatrixOfRank: found one, in 3 attempts o14 = true