Changeset 8376:fe09ee4c519e


Ignore:
Timestamp:
11/18/07 13:26:19 (6 years ago)
Author:
jvoight@…
Branch:
default
Message:

Many bug fixes to totallyreal.

Location:
sage/rings/number_field
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • sage/rings/number_field/all.py

    r8354 r8376  
    1414from totallyreal_data import hermite_constant 
    1515from totallyreal_dsage import totallyreal_dsage 
     16from totallyreal_rel import enumerate_totallyreal_fields_imprim, enumerate_totallyreal_fields_rel 
     17from hot import my_matrix 
  • sage/rings/number_field/totallyreal.py

    r8375 r8376  
    225225        d = nf.poldisc() 
    226226        counts[0] += 1 
    227         if d > 0 and nf.polsturm_full() == n: 
     227        if d > 0: 
    228228            da = int_has_small_square_divisor(Integer(d)) 
    229229            if d > dB or d <= B*da: 
  • sage/rings/number_field/totallyreal_data.pyx

    r8371 r8376  
    630630                        print "" 
    631631 
    632                     # Check for double roots 
    633632                    for i from 0 <= i < n-k-1: 
    634633                        if abs(self.beta[k*np1+i]  
    635                                  - self.beta[k*np1+(i+1)]) < 2*eps_global: 
     634                                 - self.beta[k*np1+(i+1)]) < 10*eps_global: 
    636635                            # This happens reasonably infrequently, so calling 
    637636                            # the Python routine should be sufficiently fast... 
    638637                            f = ZZx([self.gnk[(k+1)*n+i] for i in range(n-(k+1)+1)]) 
    639                             df = ZZx([self.gnk[(k+2)*n+i] for i in range(n-(k+2)+1)]) 
     638                            # Could just take self.gnk(k+2)*n+i, but this may not be initialized... 
     639                            df = ZZx([i*self.gnk[(k+1)*n+i] for i in range(1,n-(k+1)+1)]) 
    640640                            if gcd(f,df) <> 1: 
    641641                                if verbose: 
  • sage/rings/number_field/totallyreal_dsage.py

    r8369 r8376  
    316316        while True: 
    317317            time.sleep(self.timeout) 
    318             self.split_timed_out_jobs() 
    319318            self.compile_fields() 
     319            self.split_all_jobs() 
    320320 
    321321    def num_jobs(self): 
  • sage/rings/number_field/totallyreal_rel.py

    r8375 r8376  
    2222#*********************************************************************************************** 
    2323 
    24 from sage.rings.arith import binomial, gcd 
    25 from sage.rings.number_field.totallyreal_data import ZZx, lagrange_degree_3, int_has_small_square_divisor 
     24from sage.rings.arith import binomial, gcd, divisors 
     25from sage.rings.integer import Integer 
     26from sage.rings.integer_ring import IntegerRing 
     27from sage.rings.number_field.totallyreal_data import ZZx, lagrange_degree_3, int_has_small_square_divisor, hermite_constant 
    2628from sage.rings.number_field.number_field import NumberField 
    27  
    28 from sage.rings.number_field.totallyreal import weed_fields, odlyzko_bound_totallyreal 
    29  
    30 import math, numpy, bisect 
     29from sage.rings.polynomial.polynomial_ring import PolynomialRing 
     30from sage.rings.number_field.totallyreal import weed_fields, odlyzko_bound_totallyreal, enumerate_totallyreal_fields 
     31from sage.libs.pari.gen import pari 
     32 
     33import math, numpy, bisect, sys 
     34from numpy.linalg import inv 
    3135 
    3236#*********************************************************************************************** 
     
    4246    B = Z_F.reduced_basis 
    4347 
    44     L = matrix([ [v(b) for b in B] for v in Foo]) 
    45     Linv = L.inverse() 
     48    L = numpy.array([ [v(b) for b in B] for v in Foo]) 
     49    Linv = numpy.linalg.inv(L) 
    4650    Vi = [[C[0][0]],[C[0][1]]] 
    4751    for i in range(1,d): 
    4852        Vi = sum([ [v + [C[i][0]], v + [C[i][1]]] for v in Vi], []) 
    49     V = Linv*(matrix(Vi).transpose()) 
     53    V = numpy.matrix(Linv)*(numpy.matrix(Vi).transpose()) 
    5054    j = 0 
    5155    while j < 2**d: 
    5256        for i in range(d): 
    5357            if V[i,j] < V[i,j+1]: 
    54                 V[i,j] = floor(V[i,j]) 
    55                 V[i,j+1] = ceil(V[i,j+1]) 
     58                V[i,j] = math.floor(V[i,j]) 
     59                V[i,j+1] = math.ceil(V[i,j+1]) 
    5660            else: 
    57                 V[i,j] = ceil(V[i,j]) 
    58                 V[i,j+1] = floor(V[i,j+1]) 
     61                V[i,j] = math.ceil(V[i,j]) 
     62                V[i,j+1] = math.floor(V[i,j+1]) 
    5963        j += 2 
    60     W0 = Linv*matrix([Vi[0]]*d).transpose() 
    61     W = Linv*matrix([Vi[2**i] for i in range(d)]).transpose() 
     64    W0 = (Linv*numpy.array([Vi[0]]*d)).transpose() 
     65    W = (Linv*numpy.array([Vi[2**i] for i in range(d)])).transpose() 
    6266    for j in range(d): 
    6367        for i in range(d): 
    6468            if W[i,j] < W0[i,j]: 
    65                 W[i,j] = floor(W[i,j]) 
    66                 W0[i,j] = ceil(W0[i,j]) 
     69                W[i,j] = math.floor(W[i,j]) 
     70                W0[i,j] = math.ceil(W0[i,j]) 
    6771            else: 
    68                 W[i,j] = ceil(W[i,j]) 
    69                 W0[i,j] = floor(W0[i,j]) 
    70     M = matrix(ZZ,d,2**d,[floor(v) for v in V.list()]).columns() 
    71     M += matrix(ZZ,d,d,[floor(w) for w in W0.list()]).columns() 
    72     M += matrix(ZZ,d,d,[floor(w) for w in W.list()]).columns() 
     72                W[i,j] = math.ceil(W[i,j]) 
     73                W0[i,j] = math.floor(W0[i,j]) 
     74    M = [[int(V[i,j]) for i in range(V.shape[0])] for j in range(V.shape[1])] 
     75    M += [[int(W0[i,j]) for j in range(W0.shape[0])] for i in range(W0.shape[0])] 
     76    M += [[int(W[i,j]) for j in range(W.shape[1])] for i in range(W.shape[0])] 
     77 
     78    from sage.matrix.constructor import matrix 
     79    M = (matrix(IntegerRing(),len(M),len(M[0]), M).transpose()).columns() 
     80 
    7381    i = 0 
    7482    while i < len(M): 
     
    8189        i += 1 
    8290 
     91    from sage.geometry.lattice_polytope import LatticePolytope 
    8392    P = LatticePolytope(matrix(M).transpose()) 
    8493    S = [] 
     
    91100    for p in pts: 
    92101        theta = sum([ p.list()[i]*B[i] for i in range(d)]) 
    93         if prod([Foo[i](theta) >= C[i][0] and Foo[i](theta) <= C[i][1] for i in range(d)]): 
     102        inbounds = True 
     103        for i in range(d): 
     104            inbounds = inbounds and Foo[i](theta) >= C[i][0] and Foo[i](theta) <= C[i][1] 
     105        if inbounds: 
    94106            S.append(theta) 
    95107    return S 
     
    98110    r""" 
    99111    """ 
     112    Z_F = F.maximal_order() 
     113    B = Z_F.reduced_basis 
     114    T = Z_F.T 
     115    P = T.qfminim((C[1]**2)*(1./2), 10**6)[2] 
     116 
     117    S = [] 
     118    for p in P: 
     119        theta = sum([ p.list()[i]*B[i] for i in range(F.degree())]) 
     120        if theta.trace() >= C[0] and theta.trace() <= C[1]: 
     121            inbounds = True 
     122            for v in F.real_embeddings(): 
     123                inbounds = inbounds and v(theta) > 0 
     124            if inbounds: 
     125                S.append(F(theta)) 
     126    return S 
     127 
     128r""" 
     129def integral_elements_with_trace(F, C): 
    100130    if C[0] == C[1]: 
    101131        C = [C[0]-0.5, C[1]+0.5] 
     132 
     133    print F, C 
    102134 
    103135    d = F.degree() 
     
    106138    B = Z_F.reduced_basis 
    107139 
    108     L = matrix([ [v(b) for b in B] for v in Foo]) 
    109     Linv = L.inverse() 
     140    L = numpy.array([ [v(b) for b in B] for v in Foo]) 
     141    Linv = numpy.linalg.inv(L) 
    110142    V = [ [[0]*i + [C[0]] + [0]*(d-1-i), [0]*i + [C[1]] + [0]*(d-1-i) ] for i in range(d) ] 
    111143    V = sum(V, []) 
    112     V = Linv*(matrix(V).transpose()) 
     144    V = numpy.matrix(Linv)*(numpy.matrix(V).transpose()) 
    113145    j = 0 
    114146    while j < 2*d: 
    115147        for i in range(d): 
    116148            if V[i,j] < V[i,j+1]: 
    117                 V[i,j] = floor(V[i,j]) 
    118                 V[i,j+1] = ceil(V[i,j+1]) 
     149                V[i,j] = math.floor(V[i,j]) 
     150                V[i,j+1] = math.ceil(V[i,j+1]) 
    119151            else: 
    120                 V[i,j] = ceil(V[i,j]) 
    121                 V[i,j+1] = floor(V[i,j+1]) 
     152                V[i,j] = math.ceil(V[i,j]) 
     153                V[i,j+1] = math.floor(V[i,j+1]) 
    122154        j += 2 
    123     M = matrix(ZZ,d,2*d,[floor(v) for v in V.list()]).columns() 
     155    M = [[int(V[i,j]) for j in range(V.shape[1])] for i in range(V.shape[0])] 
     156 
     157    M = (matrix(IntegerRing(),d,2*d, M).transpose()).columns() 
    124158    i = 0 
    125159    while i < len(M): 
     
    139173            S.append(theta) 
    140174    return S 
     175""" 
    141176 
    142177#*********************************************************************************************** 
     
    181216        # Initialize constants. 
    182217        self.m = m 
    183         self.d = F.degree() 
    184         self.n = m*self.d 
     218        d = F.degree() 
     219        self.d = d 
     220        self.n = m*d 
    185221        self.B = B 
    186222        self.gamma = hermite_constant(self.n-self.d) 
     
    198234 
    199235        Z_Fbasis = self.Z_F.basis() 
    200         T = pari(matrix([[(x*y).trace() for x in Z_Fbasis] for y in Z_Fbasis])).qflllgram() 
     236        from sage.matrix.constructor import matrix 
     237        M = matrix(IntegerRing(),self.d,self.d, [[(x*y).trace() for x in Z_Fbasis] for y in Z_Fbasis]) 
     238        T = pari(M).qflllgram() 
    201239        self.Z_F.reduced_basis = [sum([T[i][j].__int__()*Z_Fbasis[j] for j in range(self.d)]) for i in range(self.d)] 
     240        self.Z_F.T = pari(matrix(IntegerRing(),self.d,self.d, [[(x*y).trace() for x in self.Z_F.reduced_basis] for y in self.Z_F.reduced_basis])) 
    202241 
    203242        # Initialize variables. 
     
    215254            for i in range(len(anm1s)): 
    216255                Q = [ [ v(m*x) for v in self.Foo] + [0] for x in self.Z_F.basis()] + [[v(anm1s[i]) for v in self.Foo] + [10**6]] 
    217                 adj = pari(matrix(Q).transpose()).qflll()[self.d] 
     256                Q = str(numpy.array(Q).transpose()) 
     257                Q = Q.replace(']\n [',';').replace('\n ', '').replace(' ', ',') 
     258                Q = Q[1:len(Q)-1] 
     259                adj = pari(Q).qflll()[self.d] 
    218260                anm1s[i] += sum([m*self.Z_F.basis()[i]*adj[i].__int__()//adj[self.d].__int__() for i in range(self.d)]) 
    219261                 
     
    221263            self.a[m-1] = self.amaxvals[m-1].pop() 
    222264            self.k = m-2 
     265 
     266            bl = math.ceil(1.7719*self.n) 
     267            br = max([1./m*(am1**2).trace() + \ 
     268                            self.gamma*(1./(m**d)*self.B/self.dF)**(1./(self.n-d)) for am1 in anm1s]) 
     269            br = math.floor(br) 
     270            T2s = integral_elements_with_trace(self.F, [bl,br]) 
     271            self.trace_elts.append([bl,br,T2s]) 
    223272 
    224273        elif len(a) <= m+1: 
     
    241290            # Bounds come from an application of Lagrange multipliers in degrees 2,3. 
    242291            self.b_lower = [-1./m*(v(self.a[m-1]) +   
    243                               (m-1.)*sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
     292                              (m-1.)*math.sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
    244293            self.b_upper = [-1./m*(v(self.a[m-1]) -   
    245                               (m-1.)*sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
     294                              (m-1.)*math.sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
    246295            if k < m-2: 
    247296                bminmax = [lagrange_degree_3(n,v(self.a[m-1]),v(self.a[m-2]),v(self.a[m-3])) for v in self.Foo] 
     
    332381 
    333382                if k == m-2: 
    334                     # We only know the value of a[n-1], the trace.  Need to apply 
    335                     # basic bounds from Hunter's theorem and Siegel's theorem, with 
    336                     # improvements due to Smyth, to get bounds on T_2. 
     383                    # We only know the value of a[n-1], the trace.   
    337384                    bl = max(math.ceil(1.7719*self.n), ((self.a[m-1]**2).trace()*1./m)) 
    338                     br = 1./m*(self.a[m-1].trace())**2 + \ 
     385                    br = 1./m*(self.a[m-1]**2).trace() + \ 
    339386                           self.gamma*(1./(m**d)*self.B/self.dF)**(1./(self.n-d)) 
    340387                    br = math.floor(br) 
     
    371418                    for t2 in T2s: 
    372419                        am2 = (self.a[m-1]**2-t2)/2 
    373                         if am2.is_integral() and prod([v((m-1)*self.a[m-1]**2-2*m*am2) > 0 for v in self.Foo]): 
    374                             am2s.append(am2) 
     420                        if am2.is_integral(): 
     421                            ispositive = True 
     422                            for v in self.Foo: 
     423                                ispositive = ispositive and v((m-1)*self.a[m-1]**2-2*m*am2) > 0 
     424                            if ispositive: 
     425                                am2s.append(am2) 
    375426 
    376427                    if verbose >= 2: 
     
    389440                    # Initialize the second derivative. 
    390441                    self.b_lower = [-1./m*(v(self.a[m-1]) +   
    391                                       (m-1.)*sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
     442                                      (m-1.)*math.sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
    392443                    self.b_upper = [-1./m*(v(self.a[m-1]) -   
    393                                       (m-1.)*sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
     444                                      (m-1.)*math.sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
    394445                    self.beta[k] = [[self.b_lower[i], -self.Foo[i](self.a[m-1])/m, self.b_upper[i]] for i in range(d)] 
    395446                    self.gnk[k] = [0, (m-1)*self.a[m-1], m*(m-1)/2] 
     
    429480                    if k == m-3: 
    430481                        self.b_lower = [-1./m*(v(self.a[m-1]) +   
    431                                           (m-1.)*sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
     482                                          (m-1.)*math.sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
    432483                        self.b_upper = [-1./m*(v(self.a[m-1]) -   
    433                                           (m-1.)*sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
     484                                          (m-1.)*math.sqrt(v(self.a[m-1])**2 - 2.*(1+1./(m-1))*v(self.a[m-2]))) for v in self.Foo] 
    434485                    elif k == m-4: 
    435486                        # New bounds from Lagrange multiplier in degree 3. 
     
    768819                S.insert(ind, [d,ng]) 
    769820                Srel.insert(ind, Fx([-1,1,1])) 
    770         else: 
     821        elif d == 2: 
    771822            for ff in [[1,-7,13,-7,1],[1,-8,14,-7,1]]: 
    772823                f = Fx(ff).factor()[0][0] 
     
    823874    for d in divisors(n): 
    824875        if d > 1 and d < n: 
    825             Sds = enumerate_totallyreal_fields(d, floor((1.*B)**(1.*d/n)), verbose=verbose) 
     876            Sds = enumerate_totallyreal_fields(d, int(math.floor((1.*B)**(1.*d/n))), verbose=verbose) 
    826877            for i in range(len(Sds)): 
    827878                if verbose: 
     
    837888                    S += [[t[0],t[1]] for t in T] 
    838889                j = i+1 
    839                 for E in enumerate_totallyreal_fields(n/d, floor((1.*B)**(1./d)/(1.*Sds[i][0])**(n*1./d**2))): 
     890                for E in enumerate_totallyreal_fields(n/d, int(math.floor((1.*B)**(1./d)/(1.*Sds[i][0])**(n*1./d**2)))): 
    840891                    for EF in F.composite_fields(NumberField(ZZx(E[1]), 'u')): 
    841                         if EF.degree() == n: 
     892                        if EF.degree() == n and EF.disc() <= B: 
    842893                            S.append([EF.disc(), pari(EF.absolute_polynomial())]) 
    843894    S.sort() 
Note: See TracChangeset for help on using the changeset viewer.