Changeset 7609:e38650e27e86


Ignore:
Timestamp:
11/28/07 10:28:15 (5 years ago)
Author:
Robert Bradshaw <robertwb@…>
Branch:
default
Message:

Use long longs instead of Integers for small order calculations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sage/groups/perm_gps/permgroup_element.pyx

    r7607 r7609  
    6969from sage.rings.integer import Integer 
    7070 
     71from sage.ext.arith cimport arith_llong 
     72cdef arith_llong arith = arith_llong() 
     73cdef extern from *: 
     74    long long LONG_LONG_MAX 
     75 
    7176#import permgroup_named 
    7277 
     
    530535            sage: s.order() 
    531536            6 
    532         """ 
    533         order = Integer(1) 
     537             
     538        TESTS:  
     539            sage: prod(primes(150)) 
     540            1492182350939279320058875736615841068547583863326864530410 
     541            sage: L = [tuple(range(sum(primes(p))+1, sum(primes(p))+1+p)) for p in primes(150)] 
     542            sage: PermutationGroupElement(L).order() 
     543            1492182350939279320058875736615841068547583863326864530410 
     544        """ 
     545        order = None 
     546        cdef long long order_c = 1 
    534547        cdef int cycle_len 
    535548        cdef int i, k 
     
    545558                k = self.perm[k] 
    546559                cycle_len += 1 
    547             order = order.lcm(cycle_len) 
     560            if order is not None: 
     561                order = order.lcm(cycle_len) 
     562            else: 
     563                order_c = (order_c * cycle_len) / arith.c_gcd_longlong(order_c, cycle_len) 
     564                if order_c > LONG_LONG_MAX / (self.n - i): 
     565                    order = Integer(order_c) 
    548566        sage_free(seen) 
    549         return order 
     567        return int(order_c) if order is None else order 
    550568         
    551569    def sign(self): 
Note: See TracChangeset for help on using the changeset viewer.