Example #1
0
    def change_basis(iqf_lst, involution='identity'):
        '''
        This method allows us to change coordinates of the 
        ideal generated by "iqf_lst" so that 
        the antiholomorphic involution defined by "involution"
        becomes complex conjugation.
                        
        Parameters
        ----------
        iqf_lst: list<MARing>     
            A list of elements in the subring NF[x0,...,x8] 
            of "MARing.R" where NF denotes the Gaussian 
            rationals QQ(I) with I^2=-1.
                               
        involution: str  
            Either one of the following strings:
            'identity', 'leftright', 'rotate', 'diagonal'.

        Returns
        -------
            We consider the input "iqf_lst" as a map. 
            We compose this map composed with the map corresponding to 
            <identity>, <leftright>, <rotate> or <diagonal>.
            We return a list of elements in NF[x0,...,x8] that
            represents the composition.
            
        Notes
        ----- 
        A double Segre surface in projective 8-space P^8 is represented 
        by a toric parametrization whose completion to P^1xP^1 is provided 
        by "get_pmz_lst": 
            
            (s,u) |-->
            (1:s:s^{-1}:u:u^{-1}:s*u:s^{-1}*u^{-1}:s*u^{-1}:s^{-1}*u)
            =
            (x0:x1:x2:x3:x4:x5:x6:x7:x8)
            
        We can put the exponents of the monomials in a lattice
        where x0 corresponds to coordinate (0,0), x6 to (-1,-1)
        x5 to (1,1) and x8 to (-1,1): 
                    
            x8 x3 x5
            x2 x0 x1
            x6 x4 x7
                  
        An antiholomorphic involution, that preserves the toric structure,
        acts on the above lattice as a unimodular involution:
                  
            identity_*:    ( a, b ) |--> ( a, b)
            leftright_*:   ( a, b ) |--> (-a, b)
            rotate_*:      ( a, b ) |--> (-a,-b)  
            diagonal_*:    ( a, b ) |--> ( b, a)
        
        These unimodular lattice involutions induce an involution on P^8.
        
        We compose the toric parametrization of the double Segre surface 
        with the one of the following maps in order to make the antiholomorphic
        involution that acts on P^8, equal to complex conjugation.  

            identity: (x0:...:x8) |--> (x0:...:x8) 

            leftright:  x3 |--> x3,
                        x0 |--> x0,  
                        x4 |--> x4,                     
                        x1 |--> x1 + I*x2, 
                        x2 |--> x1 - I*x2, 
                        x5 |--> x5 + I*x8, 
                        x8 |--> x5 - I*x8,                                
                        x7 |--> x7 + I*x6,
                        x6 |--> x7 - I*x6 
                                 
            rotate: x0 |--> x0,
                    x1 |--> x1 + I*x2, x2 |--> x1 - I*x2, 
                    x3 |--> x3 + I*x4, x4 |--> x3 - I*x4, 
                    x5 |--> x5 + I*x6, x6 |--> x5 - I*x6, 
                    x7 |--> x7 + I*x8, x8 |--> x7 - I*x8      
                            
            diagonal:   x5 |--> x5,
                        x0 |--> x0, 
                        x6 |--> x6, 
                        x3 |--> x3 + I*x1,  
                        x1 |--> x3 - I*x1,
                        x8 |--> x8 + I*x7,  
                        x7 |--> x8 - I*x7,
                        x2 |--> x2 + I*x4,  
                        x4 |--> x2 - I*x4  
        '''

        I = ring('I')
        x = x0, x1, x2, x3, x4, x5, x6, x7, x8 = MARing.x()
        z = z0, z1, z2, z3, z4, z5, z6, z7, z8 = MARing.z()

        dct = {}

        dct['identity'] = {x[i]: z[i] for i in range(9)}

        dct['rotate'] = {
            x0: z0,
            x1: z1 + I * z2,
            x2: z1 - I * z2,
            x3: z3 + I * z4,
            x4: z3 - I * z4,
            x5: z5 + I * z6,
            x6: z5 - I * z6,
            x7: z7 + I * z8,
            x8: z7 - I * z8
        }

        dct['leftright'] = {
            x0: z0,
            x3: z3,
            x4: z4,
            x5: z5 + I * z8,
            x8: z5 - I * z8,
            x1: z1 + I * z2,
            x2: z1 - I * z2,
            x7: z7 + I * z6,
            x6: z7 - I * z6
        }

        dct['diagonal'] = {
            x0: z0,
            x6: z6,
            x5: z5,
            x3: z3 + I * z1,
            x1: z3 - I * z1,
            x8: z8 + I * z7,
            x7: z8 - I * z7,
            x2: z2 + I * z4,
            x4: z2 - I * z4
        }

        zx_dct = {z[i]: x[i] for i in range(9)}

        new_lst = [iqf.subs(dct[involution]).subs(zx_dct) for iqf in iqf_lst]

        return new_lst
    def change_basis(iqf_lst):
        '''
        Parameters
        ----------
        iqf_lst : list     
            A list of elements in the subring NF[x0,...,x5] 
            of "MARing.R" where NF denotes the Gaussian 
            rationals QQ(I) with I^2=-1.
                                                                       
        Returns
        -------
        list 
            The input "iqf_lst" where we make the following substitution            
            for each polynomial  
                x0 |--> x0,
                x1 |--> x1, 
                x2 |--> x2 + I*x3, 
                x3 |--> x2 - I*x3,  
                x4 |--> x4 + I*x5,
                x5 |--> x4 - I*x5.               
                                     
        Notes
        -----
        We consider a toric parametrization of the Veronese surface:
        
        (s,t)
        |-->
        (1  : s*t : s  : t  : s^2 : t^2 )
        =
        (x0 : x1  : x2 : x3 : x4  : x5  )
                            
        We can put the exponents of the monomials in a lattice
        where x0 corresponds to coordinate (0,0), x4 to (2,0)
        and x5 to (0,2):  
                
              x5 x7 x8      
              x3 x1 x6
              x0 x2 x4  
        
        The monomial parametrization of the Veronese corresponds to the 
        following lattice polygon:
        
              *
              * *
              * * * 
              
        An antiholomorphic involution acts on the above lattice polygon 
        as a unimodular involution:
              
                ( a, b ) |--> ( b, a)
        
        This unimodular lattice involutions induce an involution on P^5: 

                x0 |--> x0,
                x1 |--> x1, 
                x2 |--> x2 + I*x3, 
                x3 |--> x2 - I*x3,  
                x4 |--> x4 + I*x5,
                x5 |--> x4 - I*x5,                                  
        '''

        I = ring('I')
        x = x0, x1, x2, x3, x4, x5 = MARing.x()[:6]
        z = z0, z1, z2, z3, z4, z5 = MARing.z()[:6]

        dct = {
            x0: z0,
            x1: z1,
            x2: z2 + I * z3,
            x3: z2 - I * z3,
            x4: z4 + I * z5,
            x5: z4 - I * z5
        }

        zx_dct = {z[i]: x[i] for i in range(6)}
        new_lst = [iqf.subs(dct).subs(zx_dct) for iqf in iqf_lst]

        return new_lst