Ticket #5508: sage-5508.2.patch
File sage-5508.2.patch, 64.1 KB (added by , 14 years ago) |
---|
-
doc/en/bordeaux_2008/nf_orders.rst
# HG changeset patch # User Francis Clarke <F.Clarke@Swansea.ac.uk> # Date 1236943296 0 # Node ID ed260fded06c7139ad01edca65fa64d77960563b # Parent 09a04286d37cf94dab260a3a3e3ea7b678312c41 Improved relative number fields diff -r 09a04286d37c -r ed260fded06c doc/en/bordeaux_2008/nf_orders.rst
a b 135 135 Sage, we do this by typing ``R.<X> = K[]``. Here ``R.<X>`` means 136 136 "create the object :math:`R` with generator :math:`X`" and ``K[]`` 137 137 means a "polynomial ring over :math:`K`", where the generator is named 138 based on the af formentioned :math:`X` (to create a polynomial ring in138 based on the aformentioned :math:`X` (to create a polynomial ring in 139 139 two variables :math:`X,Y` simply replace ``R.<X>`` by ``R.<X,Y>``). 140 140 141 141 .. link … … 180 180 ----------------------------------- 181 181 182 182 The relative number field :math:`L` also has numerous functions, many 183 of which are by default relative. For example the ``degree`` function 184 on :math:`L` returns the relative degree of :math:`L` over :math:`K`; 185 for the degree of :math:`L` over :math:`\mathbb{Q}` use the 186 ``absolute_degree`` function. 183 of which have both relative and absolute version. For example the 184 ``relative_degree`` function on :math:`L` returns the relative degree 185 of :math:`L` over :math:`K`; the degree of :math:`L` over 186 :math:`\mathbb{Q}` is given by the ``absolute_degree`` function. To 187 avoid possible ambiguity ``degree`` is not implemented for relative 188 number fields. 187 189 188 190 .. link 189 191 190 192 :: 191 193 192 sage: L. degree()194 sage: L.relative_degree() 193 195 3 194 196 sage: L.absolute_degree() 195 197 6 … … 260 262 defining polynomial, and in some cases this can be very slow (much 261 263 slower than Magma). Perhaps this could be fixed by using Singular's 262 264 multivariate polynomials modulo an appropriate ideal, since 263 Singular polynomial arithmetic is extremely f last. Also, Sage has265 Singular polynomial arithmetic is extremely fast. Also, Sage has 264 266 very little direct support for constructive class field theory, 265 267 which is a major motivation for explicit computation with relative 266 268 orders; it would be good to expose more of Pari's functionality in -
sage/rings/number_field/all.py
diff -r 09a04286d37c -r ed260fded06c sage/rings/number_field/all.py
a b 1 1 from number_field_base import is_NumberField 2 2 3 from number_field import (NumberField, CyclotomicField, QuadraticField,3 from number_field import (NumberField, NumberFieldTower, CyclotomicField, QuadraticField, 4 4 is_CyclotomicField, is_QuadraticField, 5 5 is_AbsoluteNumberField, 6 6 is_fundamental_discriminant) -
sage/rings/number_field/class_group.py
diff -r 09a04286d37c -r ed260fded06c sage/rings/number_field/class_group.py
a b 301 301 Return generators for a representative ideal in this 302 302 ideal class. 303 303 304 EXAMPLE :304 EXAMPLES: 305 305 sage: K.<w>=QuadraticField(-23) 306 306 sage: OK=K.ring_of_integers() 307 307 sage: C=OK.class_group() -
sage/rings/number_field/maps.py
diff -r 09a04286d37c -r ed260fded06c sage/rings/number_field/maps.py
a b 45 45 46 46 class NumberFieldIsomorphism(Map): 47 47 r""" 48 A base class for various isomorphisms betwee en number fields and48 A base class for various isomorphisms between number fields and 49 49 vector spaces. 50 50 """ 51 51 def _repr_type(self): … … 145 145 sage: L.<b> = NumberField(x^4 + 3*x^2 + 1) 146 146 sage: K = L.relativize(L.subfields(2)[0][1], 'a'); K 147 147 Number Field in a0 with defining polynomial x^2 - b0*x + 1 over its base field 148 sage: V, fr, to = K. vector_space()148 sage: V, fr, to = K.relative_vector_space() 149 149 sage: V 150 150 Vector space of dimension 2 over Number Field in b0 with defining polynomial x^2 + 1 151 151 sage: fr … … 206 206 self.__K = K 207 207 self.__rnf = K.pari_rnf() 208 208 self.__zero = QQ(0) 209 self.__n = K. degree()209 self.__n = K.relative_degree() 210 210 self.__x = pari('x') 211 211 self.__y = pari('y') 212 212 self.__B = K.absolute_base_field() … … 218 218 alpha = self.__K(alpha) 219 219 f = alpha.polynomial('x') 220 220 # f is the absolute polynomial that defines this number field element 221 if self.__K. degree() == 1:221 if self.__K.relative_degree() == 1: 222 222 # Pari doesn't return a valid relative polynomial from an 223 223 # absolute one in the case of relative degree one. (Bug 224 224 # submitted to Pari, fixed in svn unstable as of 1/22/08 -
sage/rings/number_field/number_field.py
diff -r 09a04286d37c -r ed260fded06c sage/rings/number_field/number_field.py
a b 943 943 elif isinstance(x, (tuple, list)) or \ 944 944 (isinstance(x, sage.modules.free_module_element.FreeModuleElement) and 945 945 self.base_ring().has_coerce_map_from(x.parent().base_ring())): 946 if len(x) != self. degree():946 if len(x) != self.relative_degree(): 947 947 raise ValueError, "Length must be equal to the degree of this number field" 948 return sum([ x[i]*self.gen(0)**i for i in range(self. degree()) ])948 return sum([ x[i]*self.gen(0)**i for i in range(self.relative_degree()) ]) 949 949 return self._coerce_non_number_field_element_in(x) 950 950 951 952 951 def _coerce_from_str(self, x): 953 952 """ 954 953 Coerce a string representation of an element of this … … 1212 1211 sage: to_K(L.0) 1213 1212 2*i0 - 6 1214 1213 1215 Note that he image is indeed a square root of -1.1214 Note that the image is indeed a square root of -1. 1216 1215 1217 1216 :: 1218 1217 … … 1876 1875 OUTPUT: A list of prime ideals of self lying over x. If degree is 1877 1876 specified and no such ideal exists, returns the empty list. 1878 1877 1879 .. warning::1880 1881 At this time we factor the ideal x, which may not be1882 supported for relative number fields.1883 1884 1878 EXAMPLES:: 1885 1879 1886 1880 sage: x = ZZ['x'].gen() … … 1933 1927 [Fractional ideal (t^2 - 2*t - 1)] 1934 1928 sage: P5_2 = P5_2s[0]; P5_2.residue_class_degree() 1935 1929 2 1930 1931 Works in relative extensions too:: 1932 1933 sage: PQ.<X> = QQ[] 1934 sage: F.<a, b> = NumberField([X^2 - 2, X^2 - 3]) 1935 sage: PF.<Y> = F[] 1936 sage: K.<c> = F.extension(Y^2 - (1 + a)*(a + b)*a*b) 1937 sage: I = F.ideal(a + 2*b) 1938 sage: K.primes_above(I) 1939 [Fractional ideal (2, ((-13*b - 45/2)*a - 37/2*b - 63/2)*c + 1), 1940 Fractional ideal (5, (5/2*b + 7/2)*a + 2*b + 10)] 1941 sage: K.primes_above(I, degree=1) 1942 [Fractional ideal (2, ((-13*b - 45/2)*a - 37/2*b - 63/2)*c + 1)] 1943 sage: K.primes_above(I, degree=4) 1944 [Fractional ideal (5, (5/2*b + 7/2)*a + 2*b + 10)] 1936 1945 1937 1946 TESTS: 1938 1947 … … 1943 1952 ... 1944 1953 AttributeError: 'NumberFieldIdeal' object has no attribute 'factor' 1945 1954 1946 Sage can't factor ideals over extension fields yet::1947 1948 sage: G = F.extension(x^2 - 11, 'b')1949 sage: G.primes_above(13)1950 Traceback (most recent call last):1951 ...1952 NotImplementedError1953 1955 """ 1954 1956 if degree is not None: 1955 1957 degree = ZZ(degree) … … 2040 2042 sage: P5_2.residue_class_degree() 2041 2043 2 2042 2044 2045 Relative number fields are ok:: 2046 2047 sage: G = F.extension(x^2 - 11, 'b') 2048 sage: G.prime_above(7) 2049 Fractional ideal (7, (3*t^2 + 2*t + 9)*b - t^2 - 31*t - 10) 2050 2043 2051 TESTS: 2044 2052 2045 2053 It doesn't make sense to factor the ideal (0):: … … 2049 2057 ... 2050 2058 AttributeError: 'NumberFieldIdeal' object has no attribute 'factor' 2051 2059 2052 Sage can't factor ideals over extension fields yet::2053 2054 sage: G = F.extension(x^2 - 11, 'b')2055 sage: G.prime_above(13)2056 Traceback (most recent call last):2057 ...2058 NotImplementedError2059 2060 """ 2060 2061 ids = self.primes_above(x, degree) 2061 2062 if not ids: … … 2242 2243 ... 2243 2244 TypeError: Unable to coerce number field defined by non-integral polynomial to PARI. 2244 2245 """ 2245 if self. defining_polynomial().denominator() != 1:2246 if self.absolute_polynomial().denominator() != 1: 2246 2247 raise TypeError, "Unable to coerce number field defined by non-integral polynomial to PARI." 2247 2248 try: 2248 2249 return self.__pari_nf … … 2738 2739 r""" 2739 2740 Compute the different fractional ideal of this number field. 2740 2741 2741 The different is the set of all `x` in `K` such 2742 that the trace of `xy` is an integer for all 2743 `y \in O_K`. 2742 The codifferent is the fractional ideal of all `x` in `K` 2743 such that the the trace of `xy` is an integer for 2744 all `y \in O_K`. 2745 2746 The different is the integral ideal which is the inverse of 2747 the codifferent. 2744 2748 2745 2749 EXAMPLES:: 2746 2750 … … 3148 3152 [1, zeta15, zeta15^2, zeta15^3, zeta15^4, zeta15^5, zeta15^6, zeta15^7] 3149 3153 """ 3150 3154 g = self.gen() 3151 return [ g**i for i in range(self. degree()) ]3155 return [ g**i for i in range(self.relative_degree()) ] 3152 3156 3153 3157 def integral_basis(self, v=None): 3154 3158 """ … … 3670 3674 sage: M.polynomial_ring() 3671 3675 Univariate Polynomial Ring in y over Number Field in a1 with defining polynomial y^2 + 1 3672 3676 """ 3673 return self. polynomial().parent()3677 return self.relative_polynomial().parent() 3674 3678 3675 3679 def polynomial_quotient_ring(self): 3676 3680 """ … … 3683 3687 sage: K.polynomial_quotient_ring() 3684 3688 Univariate Quotient Polynomial Ring in alpha over Rational Field with modulus x^3 + 2*x - 5 3685 3689 """ 3686 return self.polynomial_ring().quotient(self. polynomial(), self.variable_name())3690 return self.polynomial_ring().quotient(self.relative_polynomial(), self.variable_name()) 3687 3691 3688 3692 def regulator(self, proof=None): 3689 3693 """ … … 5339 5343 5340 5344 assert False, "bug in relativize" 5341 5345 5346 # Synonyms so that terminology appropriate to relative number fields 5347 # can be applied to an absolute number field: 5348 5349 def absolute_degree(self): 5350 """ 5351 A synonym for degree. 5352 5353 EXAMPLES:: 5354 5355 sage: K.<i> = NumberField(x^2 + 1) 5356 sage: K.absolute_degree() 5357 2 5358 """ 5359 return self.degree() 5360 5361 def relative_degree(self): 5362 """ 5363 A synonym for degree. 5364 5365 EXAMPLES:: 5366 5367 sage: K.<i> = NumberField(x^2 + 1) 5368 sage: K.relative_degree() 5369 2 5370 """ 5371 return self.degree() 5372 5373 def absolute_polynomial(self): 5374 """ 5375 A synonym for polynomial. 5376 5377 EXAMPLES:: 5378 5379 sage: K.<i> = NumberField(x^2 + 1) 5380 sage: K.absolute_polynomial() 5381 x^2 + 1 5382 """ 5383 return self.polynomial() 5384 5385 def relative_polynomial(self): 5386 """ 5387 A synonym for polynomial. 5388 5389 EXAMPLES:: 5390 5391 sage: K.<i> = NumberField(x^2 + 1) 5392 sage: K.relative_polynomial() 5393 x^2 + 1 5394 """ 5395 return self.polynomial() 5396 5397 def absolute_vector_space(self): 5398 """ 5399 A synonym for vector_space. 5400 5401 EXAMPLES:: 5402 5403 sage: K.<i> = NumberField(x^2 + 1) 5404 sage: K.absolute_vector_space() 5405 (Vector space of dimension 2 over Rational Field, 5406 Isomorphism map: 5407 From: Vector space of dimension 2 over Rational Field 5408 To: Number Field in i with defining polynomial x^2 + 1, 5409 Isomorphism map: 5410 From: Number Field in i with defining polynomial x^2 + 1 5411 To: Vector space of dimension 2 over Rational Field) 5412 """ 5413 return self.vector_space() 5414 5415 def relative_vector_space(self): 5416 """ 5417 A synonym for vector_space. 5418 5419 EXAMPLES:: 5420 5421 sage: K.<i> = NumberField(x^2 + 1) 5422 sage: K.relative_vector_space() 5423 (Vector space of dimension 2 over Rational Field, 5424 Isomorphism map: 5425 From: Vector space of dimension 2 over Rational Field 5426 To: Number Field in i with defining polynomial x^2 + 1, 5427 Isomorphism map: 5428 From: Number Field in i with defining polynomial x^2 + 1 5429 To: Vector space of dimension 2 over Rational Field) 5430 """ 5431 return self.vector_space() 5432 5433 def absolute_discriminant(self): 5434 """ 5435 A synonym for discriminant. 5436 5437 EXAMPLES:: 5438 5439 sage: K.<i> = NumberField(x^2 + 1) 5440 sage: K.absolute_discriminant() 5441 -4 5442 """ 5443 return self.discriminant() 5444 5445 def relative_discriminant(self): 5446 """ 5447 A synonym for discriminant. 5448 5449 EXAMPLES:: 5450 5451 sage: K.<i> = NumberField(x^2 + 1) 5452 sage: K.relative_discriminant() 5453 -4 5454 """ 5455 return self.discriminant() 5456 5457 def absolute_different(self): 5458 """ 5459 A synonym for different. 5460 5461 EXAMPLES:: 5462 5463 sage: K.<i> = NumberField(x^2 + 1) 5464 sage: K.absolute_different() 5465 Fractional ideal (2) 5466 """ 5467 return self.different() 5468 5469 def relative_different(self): 5470 """ 5471 A synonym for different. 5472 5473 EXAMPLES:: 5474 5475 sage: K.<i> = NumberField(x^2 + 1) 5476 sage: K.relative_different() 5477 Fractional ideal (2) 5478 """ 5479 return self.different() 5480 5481 5342 5482 class NumberField_cyclotomic(NumberField_absolute): 5343 5483 """ 5344 5484 Create a cyclotomic extension of the rational field. … … 6049 6189 else: 6050 6190 return (ZZ(0), ZZ(m/2)) 6051 6191 6192 def different(self): 6193 """ 6194 Returns the different ideal of the cyclotomic field self. 6195 6196 EXAMPLES:: 6197 6198 sage: C20 = CyclotomicField(20) 6199 sage: C20.different() 6200 Fractional ideal (-4*zeta20^7 + 8*zeta20^5 - 12*zeta20^3 + 6*zeta20) 6201 sage: C18 = CyclotomicField(18) 6202 sage: D = C18.different().norm() 6203 sage: D == C18.discriminant().abs() 6204 True 6205 """ 6206 try: 6207 return self.__different 6208 6209 except AttributeError: 6210 6211 z = self.gen() 6212 n = self._n() 6213 D = self.ideal(1) 6214 factors = n.factor() 6215 for f in factors: 6216 p = f[0] 6217 r = f[1] 6218 e = (r*p - r - 1)*p**(r-1) 6219 D *= self.ideal(z**(n/p**r) - 1)**e 6220 self.__different = D 6221 return self.__different 6222 6052 6223 def discriminant(self, v=None): 6053 6224 """ 6054 6225 Returns the discriminant of the ring of integers of the cyclotomic … … 6324 6495 if n%2: 6325 6496 v += [-x for x in v] 6326 6497 return v 6327 6498 6499 6328 6500 class NumberField_quadratic(NumberField_absolute): 6329 6501 """ 6330 6502 Create a quadratic extension of the rational field. -
sage/rings/number_field/number_field_element.pyx
diff -r 09a04286d37c -r ed260fded06c sage/rings/number_field/number_field_element.pyx
a b 567 567 ... 568 568 IndexError: index must be between 0 and degree minus 1. 569 569 570 The list method implicitly calls __getitem__::570 The list method implicitly calls ``__getitem__``:: 571 571 572 572 sage: list(c) 573 573 [8/27, -16/15, 32/25, -64/125] … … 1791 1791 sage: (O.2).vector() 1792 1792 (1, -b) 1793 1793 """ 1794 return self.number_field(). vector_space()[2](self)1794 return self.number_field().relative_vector_space()[2](self) 1795 1795 1796 1796 def charpoly(self, var='x'): 1797 1797 raise NotImplementedError, "Subclasses of NumberFieldElement must override charpoly()" … … 1951 1951 v = [] 1952 1952 x = K.gen() 1953 1953 a = K(1) 1954 d = K. degree()1954 d = K.relative_degree() 1955 1955 for n in range(d): 1956 1956 v += (a*self).list() 1957 1957 a *= x … … 2410 2410 def __init__(self, parent, f): 2411 2411 NumberFieldElement.__init__(self, parent, f) 2412 2412 2413 def __getitem__(self, n): 2414 """ 2415 Return the n-th coefficient of this relative number field element, written 2416 as a polynomial in the generator. 2417 2418 Note that `n` must be between 0 and `d-1`, where 2419 `d` is the relative degree of the number field. 2420 2421 EXAMPLES:: 2422 2423 sage: K.<a, b> = NumberField([x^3 - 5, x^2 + 3]) 2424 sage: c = (a + b)^3; c 2425 3*b*a^2 - 9*a - 3*b + 5 2426 sage: c[0] 2427 -3*b + 5 2428 2429 We illustrate bounds checking:: 2430 2431 sage: c[-1] 2432 Traceback (most recent call last): 2433 ... 2434 IndexError: index must be between 0 and the relative degree minus 1. 2435 sage: c[4] 2436 Traceback (most recent call last): 2437 ... 2438 IndexError: index must be between 0 and the relative degree minus 1. 2439 2440 The list method implicitly calls ``__getitem__``:: 2441 2442 sage: list(c) 2443 [-3*b + 5, -9, 3*b] 2444 sage: K(list(c)) == c 2445 True 2446 """ 2447 if n < 0 or n >= self.parent().relative_degree(): 2448 raise IndexError, "index must be between 0 and the relative degree minus 1." 2449 return self.vector()[n] 2450 2413 2451 def list(self): 2414 2452 """ 2415 2453 Return the list of coefficients of self written in terms of a power -
sage/rings/number_field/number_field_ideal.py
diff -r 09a04286d37c -r ed260fded06c sage/rings/number_field/number_field_ideal.py
a b 224 224 sage: I # random sign in output 225 225 Fractional ideal (-2*a^2 - 1) 226 226 """ 227 # The first method does not work for ideals in relative extensions 228 try: 229 return self.coordinates(self.number_field()(x)).denominator() == 1 230 except NotImplementedError: 231 x_ideal = self.number_field().ideal(x) 232 return self + x_ideal == self 227 return self.coordinates(self.number_field()(x)).denominator() == 1 233 228 234 229 def __elements_from_hnf(self, hnf): 235 230 """ … … 508 503 uses \code{bnfisprincipal}, so set \code{proof=True} if you 509 504 want to prove correctness (which \emph{is} the default). 510 505 511 EXAMPLE :506 EXAMPLES: 512 507 sage: R.<x> = PolynomialRing(QQ) 513 508 sage: K.<i> = NumberField(x^2+1, 'i') 514 509 sage: J = K.ideal([i+1, 2]) … … 561 556 r""" 562 557 Return a list of generators for this ideal as a $\mathbb{Z}$-module. 563 558 564 EXAMPLE :559 EXAMPLES: 565 560 sage: R.<x> = PolynomialRing(QQ) 566 561 sage: K.<i> = NumberField(x^2 + 1) 567 562 sage: J = K.ideal(i+1) … … 576 571 Return a tuple (I, d), where I is an integral ideal, and d is the 577 572 smallest positive integer such that this ideal is equal to I/d. 578 573 579 EXAMPLE :574 EXAMPLES: 580 575 sage: R.<x> = PolynomialRing(QQ) 581 576 sage: K.<a> = NumberField(x^2-5) 582 577 sage: I = K.ideal(2/(5+a)) … … 747 742 self._norm = QQ(self.number_field().pari_nf().idealnorm(self.pari_hnf())) 748 743 return self._norm 749 744 745 # synonyms (using terminology of relative number fields) 746 747 def absolute_norm(self): 748 """ 749 A synonym for norm. 750 751 EXAMPLES: 752 sage: K.<i> = NumberField(x^2 + 1) 753 sage: K.ideal(1 + 2*i).absolute_norm() 754 5 755 """ 756 return self.norm() 757 758 def relative_norm(self): 759 """ 760 A synonym for norm. 761 762 EXAMPLES: 763 sage: K.<i> = NumberField(x^2 + 1) 764 sage: K.ideal(1 + 2*i).relative_norm() 765 5 766 """ 767 return self.norm() 768 769 def absolute_ramification_index(self): 770 """ 771 A synonym for ramification_index. 772 773 EXAMPLES: 774 sage: K.<i> = NumberField(x^2 + 1) 775 sage: K.ideal(1 + i).absolute_ramification_index() 776 2 777 """ 778 return self.ramification_index() 779 780 def relative_ramification_index(self): 781 """ 782 A synonym for ramification_index. 783 784 EXAMPLES: 785 sage: K.<i> = NumberField(x^2 + 1) 786 sage: K.ideal(1 + i).relative_ramification_index() 787 2 788 """ 789 return self.ramification_index() 790 750 791 def number_field(self): 751 792 """ 752 793 Return the number field that this is a fractional ideal in. … … 763 804 764 805 def smallest_integer(self): 765 806 r""" 766 Return the smallest non negative integer in $I \cap \mathbb{Z}$,807 Return the smallest non-negative integer in $I \cap \mathbb{Z}$, 767 808 where $I$ is this ideal. If $I = 0$, returns $0$. 768 809 769 EXAMPLE :810 EXAMPLES: 770 811 sage: R.<x> = PolynomialRing(QQ) 771 812 sage: K.<a> = NumberField(x^2+6) 772 813 sage: I = K.ideal([4,a])/7 … … 1110 1151 assuming it is prime. Otherwise, raise a ValueError. 1111 1152 1112 1153 The ramification index is the power of this prime appearing in 1113 the factorization of the prime in $\ZZ$ that this prime slies1154 the factorization of the prime in $\ZZ$ that this prime lies 1114 1155 over. 1115 1156 1116 1157 EXAMPLES: … … 1317 1358 False 1318 1359 sage: (j/k).is_coprime(j/k) 1319 1360 False 1361 1362 sage: F.<a, b> = NumberField([x^2 - 2, x^2 - 3]) 1363 sage: F.ideal(3 - a*b).is_coprime(F.ideal(3)) 1364 False 1320 1365 """ 1321 1366 # Catch invalid inputs by making sure that we can make an ideal out of other. 1322 1367 K = self.number_field() 1323 1368 one = K.unit_ideal() 1324 1369 other = K.ideal(other) 1325 1370 if self.is_integral() and other.is_integral(): 1326 if arith.gcd(ZZ(self. norm()), ZZ(other.norm())) == 1:1371 if arith.gcd(ZZ(self.absolute_norm()), ZZ(other.absolute_norm())) == 1: 1327 1372 return True 1328 1373 else: 1329 1374 return self+other == one 1330 1375 # This special case is necessary since the zero ideal is not a 1331 1376 # fractional ideal! 1332 if other. norm() == 0:1377 if other.absolute_norm() == 0: 1333 1378 return self == one 1334 1379 D1 = self.denominator() 1335 1380 N1 = self.numerator() … … 1404 1449 M_self = MatrixSpace(ZZ,n)([R.coordinates(y) for y in self_b]) 1405 1450 M_other = MatrixSpace(ZZ,n)([R.coordinates(y) for y in other_b]) 1406 1451 except TypeError: 1407 1452 raise TypeError, "element_1_mod only defined for integral ideals" 1408 1453 1409 1454 #hnf for matrix representing C = self+other: 1410 1455 C = M_self.stack(M_other) … … 1448 1493 True 1449 1494 sage: I.euler_phi()*J.euler_phi() == (I*J).euler_phi() 1450 1495 True 1496 sage: L.<b> = K.extension(x^2 - 7) 1497 sage: L.ideal(3).euler_phi() 1498 64 1451 1499 """ 1452 1500 if not self.is_integral(): 1453 1501 raise ValueError, "euler_phi only defined for integral ideals" 1454 1502 return prod([(np-1)*np**(e-1) \ 1455 for np,e in [(p. norm(),e) \1503 for np,e in [(p.absolute_norm(),e) \ 1456 1504 for p,e in self.factor()]]) 1505 1457 1506 def prime_to_idealM_part(self, M): 1458 1507 """ 1459 1508 Version for integral ideals of the prime_to_m_part function over ZZ. -
sage/rings/number_field/number_field_ideal_rel.py
diff -r 09a04286d37c -r ed260fded06c sage/rings/number_field/number_field_ideal_rel.py
a b 6 6 -- William Stein (2007-09-06) 7 7 -- Nick Alexander (2009-01) 8 8 9 EXAMPLE ES:9 EXAMPLES: 10 10 sage: K.<a,b> = NumberField([x^2 + 1, x^2 + 2]) 11 11 sage: A = K.absolute_field('z') 12 12 sage: I = A.factor(3)[0][0] … … 15 15 [3, (-2*b - 1)*a + b - 1] 16 16 sage: K.fractional_ideal(G) 17 17 Fractional ideal ((-b + 1)*a - b - 2) 18 sage: K.fractional_ideal(G).absolute_ ideal().norm().factor()18 sage: K.fractional_ideal(G).absolute_norm().factor() 19 19 3^2 20 20 """ 21 21 … … 35 35 #***************************************************************************** 36 36 37 37 from number_field_ideal import NumberFieldFractionalIdeal, convert_from_zk_basis 38 from sage.structure.factorization import Factorization 38 39 39 40 import sage.rings.rational_field as rational_field 41 import sage.rings.integer_ring as integer_ring 40 42 QQ = rational_field.RationalField() 43 ZZ = integer_ring.IntegerRing() 41 44 42 45 class NumberFieldFractionalIdeal_rel(NumberFieldFractionalIdeal): 43 46 """ … … 61 64 sage: ((a0 + 1) / g).is_integral() 62 65 True 63 66 """ 67 def __cmp__(self, other): 68 """ 69 Compare an ideal of a relative number field to something else. 70 71 EXAMPLES: 72 sage: K.<a, b> = NumberField([x^2 + 23, x^2 - 7]) 73 sage: I = K.ideal(2, (a + 2*b + 3)/2) 74 sage: J = K.ideal(2, a - b) 75 sage: I == J 76 False 77 """ 78 if not isinstance(other, NumberFieldFractionalIdeal): 79 return cmp(type(self), type(other)) 80 return cmp(self.pari_rhnf(), other.pari_rhnf()) 81 82 def _contains_(self, x): 83 """ 84 Return True if x is an element of this ideal. 85 86 This function is called (indirectly) when the \code{in} 87 operator is used. 88 89 EXAMPLES: 90 sage: K.<a, b> = NumberField([x^2 + 23, x^2 - 7]) 91 sage: I = K.ideal(2, (a + 2*b + 3)/2) 92 sage: [z in I for z in [a, b, 2, a + b]] 93 [False, False, True, True] 94 """ 95 abs_ideal = self.absolute_ideal() 96 to_abs = abs_ideal.number_field().structure()[1] 97 return to_abs(x) in abs_ideal 98 64 99 def pari_rhnf(self): 65 100 """ 66 101 Return PARI's representation of this relative ideal in Hermite … … 104 139 Fractional ideal (b) 105 140 sage: J.absolute_ideal() 106 141 Fractional ideal (a^2) 107 sage: J. norm()142 sage: J.relative_norm() 108 143 Fractional ideal (2) 109 sage: J. norm().norm()144 sage: J.absolute_norm() 110 145 4 111 146 sage: J.absolute_ideal().norm() 112 147 4 … … 117 152 Fractional ideal (c) 118 153 sage: J.absolute_ideal() 119 154 Fractional ideal (a) 120 sage: J.absolute_ ideal().norm()155 sage: J.absolute_norm() 121 156 2 122 157 sage: J.ideal_below() 123 158 Fractional ideal (b) … … 148 183 Fractional ideal (22584817, a - b - 120132) 149 184 sage: (2*a + b) in J 150 185 True 151 sage: (- b - 120132).minpoly() 152 x + b + 120132 153 sage: J.norm().norm() 186 sage: J.absolute_norm() 154 187 22584817 155 188 sage: J.absolute_ideal() 156 189 Fractional ideal (188/812911*a^5 - 1/812911*a^4 + 45120/812911*a^3 - 56/73901*a^2 + 3881638/812911*a + 50041/812911) … … 162 195 """ 163 196 L = self.number_field() 164 197 K = L.absolute_field('a') 165 K_to_L, L_to_K = K.structure() 166 rnf = L.pari_rnf() 167 nf_zk = id.number_field().pari_nf().getattr('zk') 168 gens_in_K = [ QQ['x'](x) for x in nf_zk * id.pari_hnf()] 169 # each gen is now a polynomial giving an element of the absolute number field 170 gens_in_L = [ L(K(x)) for x in gens_in_K ] 171 return L.ideal( gens_in_L ) 198 to_L = K.structure()[0] 199 return L.ideal([to_L(g) for g in id.gens()]) 172 200 173 201 def free_module(self): 174 202 return self.absolute_ideal().free_module() … … 179 207 except AttributeError: 180 208 L = self.number_field() 181 209 K = L.base_field() 182 R = L. polynomial().parent()210 R = L.relative_polynomial().parent() 183 211 S = L['x'] 184 212 gens = L.pari_rnf().rnfidealtwoelt(self.pari_rhnf()) 185 213 gens = [ L(R(x.lift().lift())) for x in gens ] … … 215 243 zero = self.number_field().pari_rnf().rnfidealhnf(0) 216 244 return self.pari_rhnf() == zero 217 245 218 def norm(self):246 def absolute_norm(self): 219 247 """ 220 Compute the relative norm of this extension L/K as an ideal of K. 248 Compute the absolute norm of this fractional ideal in a relative number 249 field, returning a positive integer. 221 250 222 EXAMPLE: 251 EXAMPLES: 252 sage: L.<a, b, c> = QQ.extension([x^2 - 23, x^2 - 5, x^2 - 7]) 253 sage: I = L.ideal(a + b) 254 sage: I.absolute_norm() 255 104976 256 sage: I.relative_norm().relative_norm().relative_norm() 257 104976 258 """ 259 return self.absolute_ideal().norm() 260 261 def relative_norm(self): 262 """ 263 Compute the relative norm of this fractional ideal in a relative number 264 field, returning an ideal in the base field. 265 266 EXAMPLES: 223 267 sage: R.<x> = QQ[] 224 268 sage: K.<a> = NumberField(x^2+6) 225 269 sage: L.<b> = K.extension(K['x'].gen()^4 + a) 226 sage: N = L.ideal(b). norm(); N270 sage: N = L.ideal(b).relative_norm(); N 227 271 Fractional ideal (-a) 228 272 sage: N.parent() 229 273 Monoid of ideals of Number Field in a with defining polynomial x^2 + 6 230 274 sage: N.ring() 231 275 Number Field in a with defining polynomial x^2 + 6 276 sage: PQ.<X> = QQ[] 277 sage: F.<a, b> = NumberField([X^2 - 2, X^2 - 3]) 278 sage: PF.<Y> = F[] 279 sage: K.<c> = F.extension(Y^2 - (1 + a)*(a + b)*a*b) 280 sage: K.ideal(1).relative_norm() 281 Fractional ideal (1) 282 sage: K.ideal(13).relative_norm().relative_norm() 283 Fractional ideal (28561) 284 sage: K.ideal(13).relative_norm().relative_norm().relative_norm() 285 815730721 286 sage: K.ideal(13).absolute_norm() 287 815730721 232 288 """ 233 289 L = self.number_field() 234 290 K = L.base_field() 235 R = K.polynomial().parent() 291 K_abs = K.absolute_field('a') 292 to_K = K_abs.structure()[0] 293 R = K_abs.polynomial().parent() 236 294 hnf = L.pari_rnf().rnfidealnormrel(self.pari_rhnf()) 237 return K.ideal([ K(R(x)) for x in convert_from_zk_basis(K, hnf) ]) 295 return K.ideal([ to_K(K_abs(R(x))) for x in convert_from_zk_basis(K, hnf) ]) 296 297 def norm(self): 298 """ 299 The norm of a fractional ideal in a relative number field is deliberately 300 unimplemented, so that a user cannot mistake the absolute norm 301 for the relative norm, or vice versa. 302 """ 303 raise NotImplementedError, "For a fractional ideal in a relative number field you must use relative_norm or absolute_norm as appropriate" 238 304 239 305 def ideal_below(self): 240 306 """ 241 307 Compute the ideal of K below this ideal of L. 242 308 243 EXAMPLE :309 EXAMPLES: 244 310 sage: R.<x> = QQ[] 245 311 sage: K.<a> = NumberField(x^2+6) 246 312 sage: L.<b> = K.extension(K['x'].gen()^4 + a) … … 307 373 True 308 374 sage: K0.ideal([-a0 + 1]) == K0.ideal([-a0 + 5]) 309 375 False 376 377 It works when the base_field is itself a relative number field 378 sage: PQ.<X> = QQ[] 379 sage: F.<a, b> = NumberFieldTower([X^2 - 2, X^2 - 3]) 380 sage: PF.<Y> = F[] 381 sage: K.<c> = F.extension(Y^2 - (1 + a)*(a + b)*a*b) 382 sage: I = K.ideal(3, c) 383 sage: J = I.ideal_below(); J 384 Fractional ideal (-b*a + 3) 385 sage: J.number_field() == F 386 True 310 387 """ 311 388 L = self.number_field() 312 389 K = L.base_field() 313 R = K.polynomial().parent() 390 K_abs = K.absolute_field('a') 391 to_K = K_abs.structure()[0] 392 R = K_abs.polynomial().parent() 314 393 hnf = L.pari_rnf().rnfidealdown(self.pari_rhnf()) 315 return K.ideal([ K(R(x)) for x in convert_from_zk_basis(K, hnf) ])394 return K.ideal([ to_K(K_abs(R(x))) for x in convert_from_zk_basis(K, hnf) ]) 316 395 317 396 def factor(self): 318 raise NotImplementedError 397 """ 398 Factor the ideal by factoring the corresponding ideal 399 in the absolute number field. 400 401 EXAMPLES: 402 sage: K.<a, b> = QQ.extension([x^2 + 11, x^2 - 5]) 403 sage: K.factor(5) 404 (Fractional ideal (5, 1/2*a - 1/2*b - 1))^2 * (Fractional ideal (5, 1/2*a - 1/2*b + 1))^2 405 sage: K.ideal(5).factor() 406 (Fractional ideal (5, 1/2*a - 1/2*b - 1))^2 * (Fractional ideal (5, 1/2*a - 1/2*b + 1))^2 407 sage: K.ideal(5).prime_factors() 408 [Fractional ideal (5, 1/2*a - 1/2*b - 1), 409 Fractional ideal (5, 1/2*a - 1/2*b + 1)] 410 411 sage: PQ.<X> = QQ[] 412 sage: F.<a, b> = NumberFieldTower([X^2 - 2, X^2 - 3]) 413 sage: PF.<Y> = F[] 414 sage: K.<c> = F.extension(Y^2 - (1 + a)*(a + b)*a*b) 415 sage: K.ideal(c) 416 Fractional ideal (6, -2*c + (171/2*b + 291/2)*a + 117*b + 216) 417 sage: K.ideal(c).factor() 418 (Fractional ideal (2, ((-13*b - 45/2)*a - 37/2*b - 63/2)*c + 1))^2 * (Fractional ideal (3, c)) 419 """ 420 F = self.number_field() 421 abs_ideal = self.absolute_ideal() 422 to_F = abs_ideal.number_field().structure()[0] 423 factor_list = [(F.ideal([to_F(g) for g in p.gens()]), e) for p, e in abs_ideal.factor()] 424 # sorting and simplification will already have been done 425 return Factorization(factor_list, sort=False, simplify=False) 426 319 427 def integral_basis(self): 320 428 raise NotImplementedError 429 321 430 def integral_split(self): 322 raise NotImplementedError 323 def is_maximal(self): 324 raise NotImplementedError 431 """ 432 Return a tuple (I, d), where I is an integral ideal, and d is the 433 smallest positive integer such that this ideal is equal to I/d. 434 435 EXAMPLES: 436 sage: K.<a, b> = NumberFieldTower([x^2 - 23, x^2 + 1]) 437 sage: I = K.ideal([a + b/3]) 438 sage: J, d = I.integral_split() 439 sage: J.is_integral() 440 True 441 sage: J == d*I 442 True 443 444 """ 445 d = self.absolute_ideal().integral_split()[1] 446 return (d*self, d) 447 325 448 def is_prime(self): 326 raise NotImplementedError 327 def ramification(self): 328 raise NotImplementedError 449 """ 450 Return True if this ideal of a relative number field is prime. 451 452 EXAMPLES: 453 sage: K.<a, b> = NumberField([x^2 - 17, x^3 - 2]) 454 sage: K.ideal(a + b).is_prime() 455 True 456 sage: K.ideal(13).is_prime() 457 False 458 """ 459 return self.absolute_ideal().is_prime() 460 461 def is_integral(self): 462 """ 463 Return True if this ideal is integral. 464 465 EXAMPLES: 466 sage: K.<a, b> = QQ.extension([x^2 + 11, x^2 - 5]) 467 sage: I = K.ideal(7).prime_factors()[0] 468 sage: I.is_integral() 469 True 470 sage: (I/2).is_integral() 471 False 472 """ 473 return self.absolute_ideal().is_integral() 474 475 def absolute_ramification_index(self): 476 """ 477 Return the absolute ramification index of this fractional ideal, 478 assuming it is prime. Otherwise, raise a ValueError. 479 480 The absolute ramification index is the power of this prime 481 appearing in the factorization of the rational prime that 482 this prime lies over. 483 484 Use relative_ramification_index to obtain the power of this 485 prime occurring in the factorization of the prime ideal 486 of the base field that this prime lies over. 487 488 EXAMPLES: 489 sage: PQ.<X> = QQ[] 490 sage: F.<a, b> = NumberFieldTower([X^2 - 2, X^2 - 3]) 491 sage: PF.<Y> = F[] 492 sage: K.<c> = F.extension(Y^2 - (1 + a)*(a + b)*a*b) 493 sage: I = K.ideal(3, c) 494 sage: I.absolute_ramification_index() 495 4 496 sage: I.smallest_integer() 497 3 498 sage: K.ideal(3) == I^4 499 True 500 """ 501 if self.is_prime(): 502 return self.absolute_ideal().ramification_index() 503 raise ValueError, "the fractional ideal (= %s) is not prime"%self 504 505 def relative_ramification_index(self): 506 """ 507 Return the relative ramification index of this fractional ideal, 508 assuming it is prime. Otherwise, raise a ValueError. 509 510 The relative ramification index is the power of this prime 511 appearing in the factorization of the prime ideal of the 512 base field that this prime lies over. 513 514 Use absolute_ramification_index to obtain the power of this 515 prime occurring in the factorization of the rational prime 516 that this prime lies over. 517 518 EXAMPLES: 519 sage: PQ.<X> = QQ[] 520 sage: F.<a, b> = NumberFieldTower([X^2 - 2, X^2 - 3]) 521 sage: PF.<Y> = F[] 522 sage: K.<c> = F.extension(Y^2 - (1 + a)*(a + b)*a*b) 523 sage: I = K.ideal(3, c) 524 sage: I.relative_ramification_index() 525 2 526 sage: I.ideal_below() 527 Fractional ideal (-b*a + 3) 528 sage: K.ideal(-b*a + 3) == I^2 529 True 530 """ 531 if self.is_prime(): 532 abs_index = self.absolute_ramification_index() 533 base_ideal = self.ideal_below() 534 return ZZ(abs_index/base_ideal.absolute_ramification_index()) 535 raise ValueError, "the fractional ideal (= %s) is not prime"%self 536 537 def ramification_index(self): 538 """ 539 For ideals in relative number fields ramification_index is 540 deliberately not implemented in order to avoid ambiguity. Either 541 relative_ramification_index or absolute_ramification_index should 542 be used instead. 543 """ 544 raise NotImplementedError, "For an ideal in a relative number field you must use relative_ramification_index or absolute_ramification_index as appropriate" 545 329 546 def residue_class_degree(self): 330 raise NotImplementedError 547 """ 548 EXAMPLES: 549 sage: PQ.<X> = QQ[] 550 sage: F.<a, b> = NumberFieldTower([X^2 - 2, X^2 - 3]) 551 sage: PF.<Y> = F[] 552 sage: K.<c> = F.extension(Y^2 - (1 + a)*(a + b)*a*b) 553 sage: [I.residue_class_degree() for I in K.ideal(c).prime_factors()] 554 [1, 2] 555 """ 556 if self.is_prime(): 557 return self.absolute_ideal().residue_class_degree() 558 raise ValueError, "the ideal (= %s) is not prime"%self 559 560 def residues(self): 561 """ 562 Returns a iterator through a complete list of residues modulo this integral ideal. 563 564 An error is raised if this fractional ideal is not integral. 565 566 EXAMPLES: 567 sage: K.<a, w> = NumberFieldTower([x^2 - 3, x^2 + x + 1]) 568 sage: I = K.ideal(6, -w*a - w + 4) 569 sage: list(I.residues())[:5] 570 [(-10/3*w - 8/3)*a, 571 (-10/3*w - 8/3)*a + 1, 572 (-10/3*w - 8/3)*a + 2, 573 (-10/3*w - 8/3)*a + 3, 574 (-10/3*w - 8/3)*a + 4] 575 """ 576 abs_ideal = self.absolute_ideal() 577 from_abs = abs_ideal.number_field().structure()[0] 578 from sage.misc.mrange import xmrange_iter 579 abs_residues = abs_ideal.residues() 580 return xmrange_iter(abs_residues.iter_list, lambda c: from_abs(abs_residues.typ(c))) 581 582 def element_1_mod(self, other): 583 """ 584 Returns an element r in this ideal such that 1-r is in other. 585 586 An error is raised if either ideal is not integral of if they 587 are not coprime. 588 589 INPUT: 590 other -- another ideal of the same field, or generators of an ideal. 591 OUTPUT: 592 r -- an element of the ideal self such that 1-r is in the ideal other. 593 594 EXAMPLES: 595 sage: K.<a, b> = NumberFieldTower([x^2 - 23, x^2 + 1]) 596 sage: I = Ideal(2, (a - 3*b + 2)/2) 597 sage: J = K.ideal(a) 598 sage: z = I.element_1_mod(J); z 599 -21/2*b*a - 21/2 600 sage: z in I 601 True 602 sage: 1 - z in J 603 True 604 """ 605 # Catch invalid inputs by making sure that we can make an ideal out of other. 606 K = self.number_field() 607 if not self.is_integral(): 608 raise TypeError, "%s is not an integral ideal"%self 609 610 other = K.ideal(other) 611 if not other.is_integral(): 612 raise TypeError, "%s is not an integral ideal"%other 613 614 if not self.is_coprime(other): 615 raise TypeError, "%s and %s are not coprime ideals"%(self, other) 616 617 to_K = K.absolute_field('a').structure()[0] 618 return to_K(self.absolute_ideal().element_1_mod(other.absolute_ideal())) 619 331 620 def smallest_integer(self): 332 raise NotImplementedError 333 def valuation(self): 334 raise NotImplementedError 621 r""" 622 Return the smallest non-negative integer in $I \cap \mathbb{Z}$, 623 where $I$ is this ideal. If $I = 0$, returns $0$. 624 625 EXAMPLES: 626 sage: K.<a, b> = NumberFieldTower([x^2 - 23, x^2 + 1]) 627 sage: I = K.ideal([a + b]) 628 sage: I.smallest_integer() 629 12 630 sage: [m for m in range(13) if m in I] 631 [0, 12] 632 """ 633 return self.absolute_ideal().smallest_integer() 634 635 def valuation(self, p): 636 r""" 637 Return the valuation of this fractional ideal at the prime 638 $\mathfrak{p}$. If $\mathfrak{p}$ is not prime, raise a 639 ValueError. 640 641 INPUT: 642 p -- a prime ideal of this relative number field. 643 644 OUTPUT: 645 integer 646 647 EXAMPLES: 648 sage: K.<a, b> = NumberField([x^2 - 17, x^3 - 2]) 649 sage: A = K.ideal(a + b) 650 sage: A.is_prime() 651 True 652 sage: (A*K.ideal(3)).valuation(A) 653 1 654 sage: K.ideal(25).valuation(5) 655 Traceback (most recent call last): 656 ... 657 ValueError: p (= Fractional ideal (5)) must be a prime 658 """ 659 if p == 0: 660 raise ValueError, "p (= %s) must be nonzero"%p 661 if not isinstance(p, NumberFieldFractionalIdeal): 662 p = self.number_field().ideal(p) 663 if not p.is_prime(): 664 raise ValueError, "p (= %s) must be a prime"%p 665 if p.ring() != self.number_field(): 666 raise ValueError, "p (= %s) must be an ideal in %s"%self.number_field() 667 return self.absolute_ideal().valuation(p.absolute_ideal()) 335 668 336 669 def is_NumberFieldFractionalIdeal_rel(x): 337 670 """ … … 356 689 Fractional ideal (b) 357 690 sage: is_NumberFieldFractionalIdeal_rel(I) 358 691 True 359 sage: N = I. norm(); N692 sage: N = I.relative_norm(); N 360 693 Fractional ideal (-a) 361 694 sage: is_NumberFieldFractionalIdeal_rel(N) 362 695 False -
sage/rings/number_field/number_field_rel.py
diff -r 09a04286d37c -r ed260fded06c sage/rings/number_field/number_field_rel.py
a b 119 119 import sage.rings.integer as integer 120 120 import sage.rings.polynomial.polynomial_ring as polynomial_ring 121 121 import sage.rings.polynomial.polynomial_element as polynomial_element 122 from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing 122 123 import sage.rings.ideal as ideal 123 124 import sage.rings.complex_field 124 125 import sage.groups.abelian_gps.abelian_group … … 329 330 Number Field in n with defining polynomial x^2 + x + 1 over its base field 330 331 sage: L.base_field().base_field() 331 332 Number Field in r with defining polynomial x^3 - 2 333 334 And a more complicated example: 335 sage: PQ.<X> = QQ[] 336 sage: F.<a, b> = NumberField([X^2 - 2, X^2 - 3]) 337 sage: PF.<Y> = F[] 338 sage: K.<c> = F.extension(Y^2 - (1 + a)*(a + b)*a*b) 339 sage: L.<m, n, r> = K.change_names(); L 340 Number Field in m with defining polynomial x^2 + (-2*r - 3)*n - 2*r - 6 over its base field 341 sage: L.structure() 342 (Isomorphism given by variable name change map: 343 From: Number Field in m with defining polynomial x^2 + (-2*r - 3)*n - 2*r - 6 over its base field 344 To: Number Field in c with defining polynomial Y^2 + (-2*b - 3)*a - 2*b - 6 over its base field, 345 Isomorphism given by variable name change map: 346 From: Number Field in c with defining polynomial Y^2 + (-2*b - 3)*a - 2*b - 6 over its base field 347 To: Number Field in m with defining polynomial x^2 + (-2*r - 3)*n - 2*r - 6 over its base field) 332 348 """ 333 349 if len(names) == 0: 334 350 names = self.variable_names() 335 351 elif isinstance(names, str): 336 352 names = names.split(',') 337 353 K = self.base_field().change_names(tuple(names[1:])) 338 L = K.extension(self.defining_polynomial(), names=names[0]) 354 to_K = K.structure()[1] 355 old_poly = self.relative_polynomial() 356 new_poly = PolynomialRing(K, 'x')([to_K(c) for c in old_poly]) 357 L = K.extension(new_poly, names=names[0]) 358 L._set_structure(maps.NameChangeMap(L, self), maps.NameChangeMap(self, L)) 339 359 return L 340 360 341 361 def is_absolute(self): … … 407 427 408 428 def absolute_degree(self): 409 429 """ 430 The degree of this relative number field over the rational field. 431 410 432 EXAMPLES: 411 sage: K.<a> = NumberField ([x^2 + 3, x^2 +2])433 sage: K.<a> = NumberFieldTower([x^2 - 17, x^3 - 2]) 412 434 sage: K.absolute_degree() 413 4 414 sage: K.degree() 435 6 436 """ 437 return self.absolute_polynomial().degree() 438 439 def relative_degree(self): 440 """ 441 442 EXAMPLES: 443 sage: K.<a> = NumberFieldTower([x^2 - 17, x^3 - 2]) 444 sage: K.relative_degree() 415 445 2 416 446 """ 417 return self.absolute_polynomial().degree() 447 return self.relative_polynomial().degree() 448 449 def degree(self): 450 """ 451 The degree, unqualified, of a relative number field is deliberately 452 not implemented, so that a user cannot mistake the absolute degree 453 for the relative degree, or vice versa. 454 """ 455 raise NotImplementedError, "For a relative number field you must use relative_degree or absolute_degree as appropriate" 418 456 419 457 def maximal_order(self): 420 458 """ … … 458 496 sage: print L == K 459 497 True 460 498 """ 461 return NumberField_relative_v1, (self.__base_field, self. polynomial(), self.variable_name(),499 return NumberField_relative_v1, (self.__base_field, self.relative_polynomial(), self.variable_name(), 462 500 self.latex_variable_name(), self.gen_embedding()) 463 501 464 502 def _repr_(self): … … 476 514 Number Field in b with defining polynomial x^7 + 3 477 515 """ 478 516 479 return "Number Field in %s with defining polynomial %s over its base field"%(self.variable_name(), self. polynomial())517 return "Number Field in %s with defining polynomial %s over its base field"%(self.variable_name(), self.relative_polynomial()) 480 518 481 519 #return "Extension by %s of the Number Field in %s with defining polynomial %s"%( 482 520 #self.polynomial(), self.base_field().variable_name(), … … 504 542 r""" 505 543 Return a \LaTeX representation of the extension. 506 544 507 EXAMPLE :545 EXAMPLES: 508 546 sage: x = QQ['x'].0 509 547 sage: K.<a> = NumberField(x^3 - 2) 510 548 sage: t = K['x'].gen() … … 512 550 '( \\mathbf{Q}[a]/(a^{3} - 2) )[b]/(b^{2} + b + a)' 513 551 """ 514 552 return "( %s )[%s]/(%s)"%(latex(self.base_field()), self.latex_variable_name(), 515 self. polynomial()._latex_(self.latex_variable_name()))553 self.relative_polynomial()._latex_(self.latex_variable_name())) 516 554 517 555 def _coerce_from_other_number_field(self, x): 518 556 """ … … 938 976 """ 939 977 return self.absolute_field('a').is_galois() 940 978 941 def vector_space(self):979 def relative_vector_space(self): 942 980 """ 943 981 Return vector space over the base field of self and isomorphisms 944 982 from the vector space to self and in the other direction. … … 946 984 EXAMPLES: 947 985 sage: K.<a,b,c> = NumberField([x^2 + 2, x^3 + 2, x^3 + 3]); K 948 986 Number Field in a with defining polynomial x^2 + 2 over its base field 949 sage: V, from_V, to_V = K. vector_space()987 sage: V, from_V, to_V = K.relative_vector_space() 950 988 sage: from_V(V.0) 951 989 1 952 990 sage: to_V(K.0) … … 959 997 (0, 1) 960 998 961 999 The underlying vector space and maps is cached: 962 sage: W, from_V, to_V = K. vector_space()1000 sage: W, from_V, to_V = K.relative_vector_space() 963 1001 sage: V is W 964 1002 True 965 1003 """ 966 1004 try: 967 return self.__ vector_space1005 return self.__relative_vector_space 968 1006 except AttributeError: 969 1007 pass 970 V = self.base_field()**self. degree()1008 V = self.base_field()**self.relative_degree() 971 1009 from_V = maps.MapRelativeVectorSpaceToRelativeNumberField(V, self) 972 1010 to_V = maps.MapRelativeNumberFieldToRelativeVectorSpace(self, V) 973 self.__ vector_space = (V, from_V, to_V)974 return self.__ vector_space1011 self.__relative_vector_space = (V, from_V, to_V) 1012 return self.__relative_vector_space 975 1013 976 1014 def absolute_vector_space(self): 977 1015 """ … … 1009 1047 ans = (V, fr, to) 1010 1048 self.__absolute_vector_space = ans 1011 1049 return ans 1050 1051 def vector_space(self): 1052 """ 1053 For a relative number field \code{L}, \code{L.vector_space()} is deliberately 1054 not implemented, so that a user cannot confuse \code{L.relative_vector_space()} 1055 with \code{L.absolute_vector_space()}. 1056 """ 1057 raise NotImplementedError, "For a relative number field L you must use either L.relative_vector_space() or L.absolute_vector_space() as appropriate" 1012 1058 1013 1059 def absolute_base_field(self): 1014 1060 """ … … 1089 1135 sage: k.<a, c> = NumberField([x^2 + 3, x^2 + 1]) 1090 1136 sage: k.pari_polynomial() 1091 1137 x^4 + 8*x^2 + 4 1092 sage: k. defining_polynomial ()1138 sage: k.relative_polynomial () 1093 1139 x^2 + 3 1094 1140 """ 1095 1141 try: … … 1165 1211 """ 1166 1212 abs_base, _, _ = self.absolute_base_field() 1167 1213 g = QQ['y'](abs_base.polynomial()) 1168 vals = [ QQ['y'](f.polynomial())._pari_().Mod(g) for f in self. polynomial().list() ]1214 vals = [ QQ['y'](f.polynomial())._pari_().Mod(g) for f in self.relative_polynomial().list() ] 1169 1215 f = pari(vals).Polrev() 1170 1216 return f 1171 1217 … … 1215 1261 self.__abs_gen = self._element_class(self, QQ['x'].gen()) 1216 1262 return self.__abs_gen 1217 1263 1218 1219 1264 def absolute_field(self, names): 1220 1265 r""" 1221 1266 Return an absolute number field K that is isomorphic to this … … 1307 1352 """ 1308 1353 return QQ['x'](self._pari_rnfequation()[0]) 1309 1354 1355 def relative_polynomial(self): 1356 """ 1357 Return the defining polynomial of this relative number field over its base field. 1358 1359 EXAMPLES: 1360 sage: K.<a> = NumberFieldTower([x^2 + x + 1, x^3 + x + 1]) 1361 sage: K.relative_polynomial() 1362 x^2 + x + 1 1363 1364 Use absolute polynomial for a polynomial that defines the 1365 absolute extension. 1366 1367 sage: K.absolute_polynomial() 1368 x^6 + 3*x^5 + 8*x^4 + 9*x^3 + 7*x^2 + 6*x + 3 1369 """ 1370 return self.__relative_polynomial 1371 1372 def defining_polynomial(self): 1373 """ 1374 Return the defining polynomial of this relative number field. 1375 1376 This is exactly the same as \code{self.relative_polynomal()}. 1377 1378 EXAMPLES: 1379 sage: C.<z> = CyclotomicField(5) 1380 sage: PC.<X> = C[] 1381 sage: K.<a> = C.extension(X^2 + X + z); K 1382 Number Field in a with defining polynomial X^2 + X + z over its base field 1383 sage: K.defining_polynomial() 1384 X^2 + X + z 1385 """ 1386 return self.relative_polynomial() 1387 1388 def polynomial(self): 1389 """ 1390 For a relative number field \code{L}, \code{L.polynomial()} is deliberately 1391 not implemented. Either \code{L.relative_polynomial()} 1392 or \code{L.absolute_polynomial()} must be used. 1393 """ 1394 raise NotImplementedError, "For a relative number field L you must use either L.relative_polynomial() or L.absolute_polynomial() as appropriate" 1395 1310 1396 def base_field(self): 1311 1397 """ 1312 1398 Return the base field of this relative number field. … … 1393 1479 self.__embeddings[K] = Sequence(v, cr=v!=[], immutable=True, check=False, universe=self.Hom(K)) 1394 1480 return self.__embeddings[K] 1395 1481 1482 def absolute_different(self): 1483 r""" 1484 Return the absolute different of this relative number field as 1485 an ideal of $L$. To get the relative different of $L/K$, 1486 use \code{L.relative_different()}. 1487 1488 EXAMPLES: 1489 sage: K.<i> = NumberField(x^2 + 1) 1490 sage: t = K['t'].gen() 1491 sage: L.<b> = K.extension(t^4 - i) 1492 sage: L.absolute_different() 1493 Fractional ideal (8) 1494 """ 1495 abs = self.absolute_field('a') 1496 from_abs = abs.structure()[0] 1497 return self.ideal([from_abs(g) for g in abs.different().gens()]) 1498 1499 def relative_different(self): 1500 r""" 1501 Return the relative different of this extension $L/K$ as 1502 an ideal of $L$. If you want the absolute different of 1503 $L/Q$, use \code{L.different()}. 1504 1505 EXAMPLES: 1506 sage: K.<i> = NumberField(x^2 + 1) 1507 sage: PK.<t> = K[] 1508 sage: L.<a> = K.extension(t^4 - i) 1509 sage: L.relative_different() 1510 Fractional ideal (4) 1511 """ 1512 I = self.absolute_different() 1513 J = self.ideal(self.base_field().absolute_different().gens()) 1514 return I/J 1515 1516 def different(self): 1517 """ 1518 The different, unqualified, of a relative number field is deliberately 1519 not implemented, so that a user cannot mistake the absolute different 1520 for the relative different, or vice versa. 1521 """ 1522 raise NotImplementedError, "For a relative number field you must use relative_different or absolute_different as appropriate" 1523 1524 def absolute_discriminant(self, v=None): 1525 r""" 1526 Return the absolute discriminant of this relative number field 1527 or if v is specified, the determinant of the trace pairing 1528 on the elements of the list v. 1529 1530 INPUT: 1531 v (optional) -- list of element of this relative number field. 1532 OUTPUT: 1533 Integer if v is omitted, and Rational otherwise. 1534 1535 EXAMPLES: 1536 sage: K.<i> = NumberField(x^2 + 1) 1537 sage: t = K['t'].gen() 1538 sage: L.<b> = K.extension(t^4 - i) 1539 sage: L.absolute_discriminant() 1540 16777216 1541 sage: L.absolute_discriminant([(b + i)^j for j in range(8)]) 1542 61911970349056 1543 """ 1544 abs = self.absolute_field('a') 1545 if v != None: 1546 to_abs = abs.structure()[1] 1547 v = [to_abs(x) for x in v] 1548 return abs.discriminant(v=v) 1549 1396 1550 def relative_discriminant(self, proof=None): 1397 1551 r""" 1398 1552 Return the relative discriminant of this extension $L/K$ as … … 1408 1562 INPUT: 1409 1563 proof -- (default: False) 1410 1564 1411 EXAMPLE :1565 EXAMPLES: 1412 1566 sage: K.<i> = NumberField(x^2 + 1) 1413 1567 sage: t = K['t'].gen() 1414 1568 sage: L.<b> = K.extension(t^4 - i) 1415 1569 sage: L.relative_discriminant() 1416 1570 Fractional ideal (256) 1417 sage: factor(L.discriminant()) 1418 2^24 1419 sage: factor( L.relative_discriminant().norm() ) 1420 2^16 1421 """ 1571 """ 1422 1572 proof = proof_flag(proof) 1423 1573 1424 1574 bnf = self._pari_base_bnf(proof) … … 1427 1577 D, d = bnf.rnfdisc(self.pari_relative_polynomial()) 1428 1578 return K.ideal([ K(R(x)) for x in convert_from_zk_basis(K, D) ]) 1429 1579 1580 def discriminant(self): 1581 """ 1582 The discriminant, unqualified, of a relative number field is deliberately 1583 not implemented, so that a user cannot mistake the absolute discriminant 1584 for the relative discriminant, or vice versa. 1585 """ 1586 raise NotImplementedError, "For a relative number field you must use relative_discriminant or absolute_discriminant as appropriate" 1587 1588 def disc(self): 1589 """ 1590 The discriminant, unqualified, of a relative number field is deliberately 1591 not implemented, so that a user cannot mistake the absolute discriminant 1592 for the relative discriminant, or vice versa. 1593 """ 1594 raise NotImplementedError, "For a relative number field you must use relative_discriminant or absolute_discriminant as appropriate" 1595 1430 1596 def order(self, *gens, **kwds): 1431 1597 """ 1432 1598 Return the order with given ring generators in the maximal … … 1472 1638 gens = [self(x) for x in gens] 1473 1639 return order.relative_order_from_ring_generators(gens, **kwds) 1474 1640 1475 1476 1641 def galois_group(self, pari_group = True, algorithm='pari'): 1477 1642 r""" 1478 1643 Return the Galois group of the Galois closure of this number … … 1490 1655 typing \code{K.polynomial().galois_group?}, where $K$ 1491 1656 is a number field. 1492 1657 1493 EXAMPLE :1658 EXAMPLES: 1494 1659 sage: x = QQ['x'].0 1495 1660 sage: K.<a> = NumberField(x^2 + 1) 1496 1661 sage: R.<t> = PolynomialRing(K) … … 1511 1676 self.__galois_group[pari_group, algorithm] = H 1512 1677 return H 1513 1678 1514 1515 1679 def is_free(self, proof=None): 1516 1680 r""" 1517 1681 Determine whether or not $L/K$ is free (i.e. if $\mathcal{O}_L$ is … … 1561 1725 f = QQ['y'](str_poly) 1562 1726 return self.base_field()(f.list()) 1563 1727 1564 def polynomial(self):1565 """1566 Return the defining polynomial of this number field.1567 1568 EXAMPLES:1569 sage: y = polygen(QQ,'y')1570 sage: k.<a> = NumberField([y^2 + y + 1, x^3 + x + 1])1571 sage: k.polynomial()1572 y^2 + y + 11573 1574 This is the same as defining_polynomial:1575 sage: k.defining_polynomial()1576 y^2 + y + 11577 1578 Use absolute polynomial for a polynomial that defines the1579 absolute extension.1580 sage: k.absolute_polynomial()1581 x^6 + 3*x^5 + 8*x^4 + 9*x^3 + 7*x^2 + 6*x + 31582 """1583 return self.__relative_polynomial1584 1585 1728 def relativize(self, alpha, names): 1586 1729 r""" 1587 1730 Given an element in self or an embedding of a subfield into self, -
sage/rings/number_field/order.py
diff -r 09a04286d37c -r ed260fded06c sage/rings/number_field/order.py
a b 255 255 256 256 """ 257 257 if self._is_maximal is None: 258 self._is_maximal = (self.absolute_discriminant() == self._K. discriminant())258 self._is_maximal = (self.absolute_discriminant() == self._K.absolute_discriminant()) 259 259 return self._is_maximal 260 260 261 261 def is_field(self): … … 1188 1188 def __call__(self, x): 1189 1189 """ 1190 1190 Coerce an element into this relative order. 1191 1192 EXAMPLES:: 1193 1194 sage: K.<a, b> = NumberField([x^2 + 2, x^2 + 1000*x + 1]) 1195 sage: OK = K.ring_of_integers() 1196 sage: OK(a) 1197 a 1198 sage: OK([3, 4]) 1199 4*a + 3 1200 1201 The following used to fail; see trac #5276:: 1202 1203 sage: S.<y> = OK[]; S 1204 Univariate Polynomial Ring in y over Relative Order in Number Field in a with defining polynomial x^2 + 2 over its base field 1205 1191 1206 """ 1192 if x.parent() is not self._K: 1193 x = self._K(x) 1194 x = self._absolute_order(x) # will test membership 1207 1208 x = self._K(x) 1209 abs_order = self._absolute_order 1210 to_abs = abs_order._K.structure()[1] 1211 x = abs_order(to_abs(x)) # will test membership 1195 1212 return OrderElement_relative(self, x) 1196 1213 1197 1214 def _repr_(self): -
sage/rings/number_field/small_primes_of_degree_one.py
diff -r 09a04286d37c -r ed260fded06c sage/rings/number_field/small_primes_of_degree_one.py
a b 48 48 sage: all(P.residue_class_degree() == 1 for P in Ps) 49 49 True 50 50 51 In the next two examples, relative residue class degrees are not yet 52 implemented, but we can check that the absolute norms are in fact prime. 51 The next two examples are for relative number fields. 53 52 54 53 sage: L.<b> = F.extension(x^3 - a, 'b') 55 54 sage: Ps = L.primes_of_degree_one_list(3) 56 55 sage: Ps # random 57 56 [Fractional ideal (17, b - 5), Fractional ideal (23, b - 4), Fractional ideal (31, b - 2)] 58 sage: [ P. norm().norm() for P in Ps ] # random57 sage: [ P.absolute_norm() for P in Ps ] # random 59 58 [17, 23, 31] 60 sage: all(ZZ(P. norm().norm()).is_prime() for P in Ps)59 sage: all(ZZ(P.absolute_norm()).is_prime() for P in Ps) 61 60 True 62 61 sage: all(P.residue_class_degree() == 1 for P in Ps) 63 Traceback (most recent call last): 64 ... 65 NotImplementedError... 66 62 True 67 63 sage: M.<c> = NumberField(x^2 - x*b^2 + b, 'c') 68 64 sage: Ps = M.primes_of_degree_one_list(3) 69 65 sage: Ps # random 70 66 [Fractional ideal (17, c - 2), Fractional ideal (c - 1), Fractional ideal (41, c + 15)] 71 sage: [ P. norm().norm().norm() for P in Ps ] # random67 sage: [ P.absolute_norm() for P in Ps ] # random 72 68 [17, 31, 41] 73 sage: all(ZZ(P. norm().norm().norm()).is_prime() for P in Ps)69 sage: all(ZZ(P.absolute_norm()).is_prime() for P in Ps) 74 70 True 75 71 sage: all(P.residue_class_degree() == 1 for P in Ps) 76 Traceback (most recent call last): 77 ... 78 NotImplementedError... 72 True 79 73 80 74 AUTHOR: 81 75 -- Nick Alexander -
sage/rings/number_field/totallyreal_rel.py
diff -r 09a04286d37c -r ed260fded06c sage/rings/number_field/totallyreal_rel.py
a b 750 750 K = F.extension(Fx([-1,1,1]), 'tK') 751 751 Kabs = K.absolute_field('tKabs') 752 752 Kabs_pari = pari(Kabs.defining_polynomial()) 753 d = K. disc()753 d = K.absolute_discriminant() 754 754 if abs(d) <= B: 755 755 ng = Kabs_pari.polredabs() 756 756 ind = bisect.bisect_left(S, [d,ng]) … … 762 762 K = F.extension(f, 'tK') 763 763 Kabs = K.absolute_field('tKabs') 764 764 Kabs_pari = pari(Kabs.defining_polynomial()) 765 d = K. disc()765 d = K.absolute_discriminant() 766 766 if abs(d) <= B: 767 767 ng = Kabs_pari.polredabs() 768 768 ind = bisect.bisect_left(S, [d,ng])