Ticket #11456: trac_11456_sage.patch
| File trac_11456_sage.patch, 12.5 KB (added by mstreng, 23 months ago) |
|---|
-
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 1866 1866 """ 1867 1867 Return Sage version of this object. Use self.sage() to get the Sage 1868 1868 version. 1869 1870 Edit extcode/magma/sage.m to add functionality. 1869 1871 1870 1872 EXAMPLES: Enumerated Sets:: 1871 1873 … … 1915 1917 sage: m.sage() # optional - magma 1916 1918 [1 2 3] 1917 1919 [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 1918 1965 """ 1919 1966 z, preparse = self.Sage(nvals = 2) 1920 1967 s = str(z) -
sage/rings/number_field/number_field.py
diff -r 4ad86990d721 -r 38e36b9b4fb3 sage/rings/number_field/number_field.py
a b 1031 1031 self._integral_basis_dict = {} 1032 1032 embedding = number_field_morphisms.create_embedding_from_approx(self, embedding) 1033 1033 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()) 1034 1098 1035 1099 def construction(self): 1036 1100 r""" … … 5205 5269 # the forgetful coercion. But this yields to non-commuting 5206 5270 # coercions, as was pointed out at ticket #8800 5207 5271 return None 5208 5209 @cached_method5210 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 - magma5217 sage: K.<a> = NumberField(x^3+2) # optional - magma5218 sage: K._magma_polynomial_(magma) # optional - magma5219 x^3 + 25220 sage: magma2=Magma() # optional - magma5221 sage: K._magma_polynomial_(magma2) # optional - magma5222 x^3 + 25223 sage: K._magma_polynomial_(magma) is K._magma_polynomial_(magma) # optional - magma5224 True5225 sage: K._magma_polynomial_(magma) is K._magma_polynomial_(magma2) # optional - magma5226 False5227 """5228 # NB f must not be garbage-collected, otherwise the5229 # return value of this function is invalid5230 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 - magma5242 'SageCreateWithNames(NumberField(_sage_[...]),["a"])'5243 sage: L = magma(K) # optional - magma5244 sage: L # optional - magma5245 Number Field with defining polynomial t^2 + 1 over the Rational Field5246 sage: L.1 # optional - magma5247 a5248 sage: L.1^2 # optional - magma5249 -15250 """5251 # Get magma version of defining polynomial of this number field5252 f = self._magma_polynomial_(magma)5253 s = 'NumberField(%s)'%f.name()5254 return magma._with_names(s, self.variable_names())5255 5272 5256 5273 def base_field(self): 5257 5274 """ -
sage/rings/number_field/number_field_element.pyx
diff -r 4ad86990d721 -r 38e36b9b4fb3 sage/rings/number_field/number_field_element.pyx
a b 3253 3253 sage: K.<a> = NumberField(x^3 + 2) 3254 3254 sage: a._magma_init_(magma) # optional - magma 3255 3255 '(_sage_[...]![0, 1, 0])' 3256 sage: m agma((2/3)*a^2 - 17/3)# optional - magma3256 sage: m = magma((2/3)*a^2 - 17/3); m # optional - magma 3257 3257 1/3*(2*a^2 - 17) 3258 sage: m.sage() # optional - magma 3259 2/3*a^2 - 17/3 3258 3260 3259 3261 An element of a cyclotomic field. 3260 3262 … … 3267 3269 '(_sage_[...]![0, 1, 0, 0, 0, 0])' 3268 3270 sage: magma(K.gen()) # optional - magma 3269 3271 zeta9 3272 sage: _.sage() # optional - magma 3273 zeta9 3270 3274 """ 3271 3275 K = magma(self.parent()) 3272 3276 return '(%s!%s)'%(K.name(), self.list())
