Ticket #11456: trac_11456_sage.patch

File trac_11456_sage.patch, 12.5 KB (added by mstreng, 23 months ago)

patch for sage source code that provides documentation for the extcode patch (and converts relative number fields to Magma)

  • sage/interfaces/magma.py

    # HG changeset patch
    # User Marco Streng <marco.streng@gmail.com>
    # Date 1309529068 -3600
    # Node ID 38e36b9b4fb3479a85b452cd6ee3d452f06996e0
    # Parent  4ad86990d7215498658440de04560aa028dcdeeb
    Trac 11456: convert magma number fields to sage
    
    diff -r 4ad86990d721 -r 38e36b9b4fb3 sage/interfaces/magma.py
    a b  
    18661866        """ 
    18671867        Return Sage version of this object. Use self.sage() to get the Sage 
    18681868        version. 
     1869 
     1870        Edit extcode/magma/sage.m to add functionality. 
    18691871         
    18701872        EXAMPLES: Enumerated Sets:: 
    18711873         
     
    19151917            sage: m.sage()                           # optional - magma 
    19161918            [1 2 3] 
    19171919            [4 5 6] 
     1920 
     1921        Number fields and their elements:: 
     1922 
     1923            sage: L.<alpha> = NumberField(x^3+2*x+2) 
     1924            sage: K = magma(L)                       # optional - magma 
     1925            sage: K.sage()                           # optional - magma 
     1926            Number Field in alpha with defining polynomial x^3 + 2*x + 2 
     1927            sage: K.sage() is L                      # optional - magma 
     1928            True 
     1929            sage: magma(alpha).sage()                # optional - magma 
     1930            alpha 
     1931 
     1932        Relative number field elements can be converted from Magma 
     1933        to Sage, but the other direction has not yet been implemented.:: 
     1934 
     1935            sage: P.<y> = L[] 
     1936            sage: N.<b> = NumberField(y^2-alpha) 
     1937            sage: M = magma(N)                   # optional - magma 
     1938            sage: M.1.sage()                     # optional - magma 
     1939            b 
     1940            sage: _^2                            # optional - magma 
     1941            alpha 
     1942            sage: magma(b)                       # optional - magma 
     1943            Traceback (most recent call last):    
     1944            ...         
     1945            TypeError: Error evaluating Magma code. 
     1946            ... 
     1947 
     1948        Sage does not have absolute number fields defined by 
     1949        two polynomials, like Magma does. They are converted 
     1950        to relative number fields. Conversion of their elements 
     1951        has not yet been implemented.:: 
     1952 
     1953            sage: magma.eval('P<x> := PolynomialRing(Rationals());') # optional - magma 
     1954            '' 
     1955            sage: K = magma('NumberField([x^2-2,x^2-3]:Abs);')        # optional - magma 
     1956            sage: L = K.sage(); L                                     # optional - magma 
     1957            Number Field in K1 with defining polynomial x^2 - 2 over its base field 
     1958            sage: L.base_field()                                      # optional - magma 
     1959            Number Field in K2 with defining polynomial x^2 - 3 
     1960            sage: K.GeneratorsSequence()[1].sage()                    # optional - magma 
     1961            Traceback (most recent call last):    
     1962            ...         
     1963            NameError: name 'K' is not defined 
     1964 
    19181965        """ 
    19191966        z, preparse = self.Sage(nvals = 2) 
    19201967        s = str(z) 
  • sage/rings/number_field/number_field.py

    diff -r 4ad86990d721 -r 38e36b9b4fb3 sage/rings/number_field/number_field.py
    a b  
    10311031        self._integral_basis_dict = {} 
    10321032        embedding = number_field_morphisms.create_embedding_from_approx(self, embedding) 
    10331033        self._populate_coercion_lists_(embedding=embedding) 
     1034                                                                                                                    
     1035    @cached_method                                                                                                           
     1036    def _magma_polynomial_(self, magma):                                                                                     
     1037        """                                                                                                                  
     1038        Return Magma version of the defining polynomial of this number field.                                                
     1039                                                                                                                             
     1040        EXAMPLES::                                                                                                           
     1041                                                                                                                             
     1042            sage: R.<x> = QQ[]                                                   # optional - magma 
     1043            sage: K.<a> = NumberField(x^3+2)                                     # optional - magma 
     1044            sage: K._magma_polynomial_(magma)                                    # optional - magma 
     1045            x^3 + 2                                                                                                          
     1046            sage: magma2=Magma()                                                 # optional - magma 
     1047            sage: K._magma_polynomial_(magma2)                                   # optional - magma 
     1048            x^3 + 2                                                                                                          
     1049            sage: K._magma_polynomial_(magma) is K._magma_polynomial_(magma)     # optional - magma 
     1050            True                                                                                                             
     1051            sage: K._magma_polynomial_(magma) is K._magma_polynomial_(magma2)    # optional - magma 
     1052            False                                                                                                            
     1053        """                                                                                                                  
     1054        # NB f must not be garbage-collected, otherwise the 
     1055        # return value of this function is invalid                                                                           
     1056        return magma(self.defining_polynomial())                                                                             
     1057 
     1058    def _magma_init_(self, magma): 
     1059        """ 
     1060        Return a Magma version of this number field. 
     1061         
     1062        EXAMPLES:: 
     1063         
     1064            sage: R.<t> = QQ[] 
     1065            sage: K.<a> = NumberField(t^2 + 1) 
     1066            sage: K._magma_init_(magma)                            # optional - magma 
     1067            'SageCreateWithNames(NumberField(_sage_[...]),["a"])' 
     1068            sage: L = magma(K)    # optional - magma 
     1069            sage: L               # optional - magma 
     1070            Number Field with defining polynomial t^2 + 1 over the Rational Field 
     1071            sage: L.sage()        # optional - magma 
     1072            Number Field in a with defining polynomial t^2 + 1 
     1073            sage: L.sage() is K   # optional - magma 
     1074            True 
     1075            sage: L.1             # optional - magma 
     1076            a 
     1077            sage: L.1^2           # optional - magma 
     1078            -1 
     1079            sage: m = magma(a+1/2); m    # optional - magma 
     1080            1/2*(2*a + 1) 
     1081            sage: m.sage()        # optional - magma 
     1082            a + 1/2 
     1083 
     1084        A relative number field:: 
     1085 
     1086            sage: S.<u> = K[] 
     1087            sage: M.<b> = NumberField(u^3+u+a) 
     1088            sage: L = magma(M)    # optional - magma 
     1089            sage: L               # optional - magma 
     1090            Number Field with defining polynomial u^3 + u + a over its ground field 
     1091            sage: L.sage() is M   # optional - magma 
     1092            True              
     1093        """ 
     1094        # Get magma version of defining polynomial of this number field 
     1095        f = self._magma_polynomial_(magma) 
     1096        s = 'NumberField(%s)'%f.name() 
     1097        return magma._with_names(s, self.variable_names()) 
    10341098 
    10351099    def construction(self): 
    10361100        r""" 
     
    52055269                    # the forgetful coercion. But this yields to non-commuting 
    52065270                    # coercions, as was pointed out at ticket #8800 
    52075271                    return None 
    5208                                                                                                                             
    5209     @cached_method                                                                                                           
    5210     def _magma_polynomial_(self, magma):                                                                                     
    5211         """                                                                                                                  
    5212         Return Magma version of the defining polynomial of this number field.                                                
    5213                                                                                                                              
    5214         EXAMPLES::                                                                                                           
    5215                                                                                                                              
    5216             sage: R.<x> = QQ[]                                                   # optional - magma 
    5217             sage: K.<a> = NumberField(x^3+2)                                     # optional - magma 
    5218             sage: K._magma_polynomial_(magma)                                    # optional - magma 
    5219             x^3 + 2                                                                                                          
    5220             sage: magma2=Magma()                                                 # optional - magma 
    5221             sage: K._magma_polynomial_(magma2)                                   # optional - magma 
    5222             x^3 + 2                                                                                                          
    5223             sage: K._magma_polynomial_(magma) is K._magma_polynomial_(magma)     # optional - magma 
    5224             True                                                                                                             
    5225             sage: K._magma_polynomial_(magma) is K._magma_polynomial_(magma2)    # optional - magma 
    5226             False                                                                                                            
    5227         """                                                                                                                  
    5228         # NB f must not be garbage-collected, otherwise the 
    5229         # return value of this function is invalid                                                                           
    5230         return magma(self.defining_polynomial())                                                                             
    5231  
    5232  
    5233     def _magma_init_(self, magma): 
    5234         """ 
    5235         Return Magma version of this number field. 
    5236          
    5237         EXAMPLES:: 
    5238          
    5239             sage: R.<t> = QQ[] 
    5240             sage: K.<a> = NumberField(t^2 + 1) 
    5241             sage: K._magma_init_(magma)                            # optional - magma 
    5242             'SageCreateWithNames(NumberField(_sage_[...]),["a"])' 
    5243             sage: L = magma(K)    # optional - magma 
    5244             sage: L               # optional - magma 
    5245             Number Field with defining polynomial t^2 + 1 over the Rational Field 
    5246             sage: L.1             # optional - magma 
    5247             a 
    5248             sage: L.1^2           # optional - magma 
    5249             -1 
    5250         """ 
    5251         # Get magma version of defining polynomial of this number field 
    5252         f = self._magma_polynomial_(magma) 
    5253         s = 'NumberField(%s)'%f.name() 
    5254         return magma._with_names(s, self.variable_names()) 
    52555272 
    52565273    def base_field(self): 
    52575274        """ 
  • sage/rings/number_field/number_field_element.pyx

    diff -r 4ad86990d721 -r 38e36b9b4fb3 sage/rings/number_field/number_field_element.pyx
    a b  
    32533253            sage: K.<a> = NumberField(x^3 + 2) 
    32543254            sage: a._magma_init_(magma)            # optional - magma 
    32553255            '(_sage_[...]![0, 1, 0])'             
    3256             sage: magma((2/3)*a^2 - 17/3)          # optional - magma 
     3256            sage: m = magma((2/3)*a^2 - 17/3); m   # optional - magma 
    32573257            1/3*(2*a^2 - 17) 
     3258            sage: m.sage()                         # optional - magma 
     3259            2/3*a^2 - 17/3 
    32583260         
    32593261        An element of a cyclotomic field. 
    32603262         
     
    32673269            '(_sage_[...]![0, 1, 0, 0, 0, 0])' 
    32683270            sage: magma(K.gen())                  # optional - magma 
    32693271            zeta9 
     3272            sage: _.sage()                        # optional - magma 
     3273            zeta9 
    32703274        """ 
    32713275        K = magma(self.parent()) 
    32723276        return '(%s!%s)'%(K.name(), self.list())