Ticket #2534: 2534.2.patch

File 2534.2.patch, 12.1 KB (added by Mike Hansen, 15 years ago)
  • sage/combinat/sf/classical.py

    # HG changeset patch
    # User Mike Hansen <mhansen@gmail.com>
    # Date 1205641065 25200
    # Node ID 04df5cf9e5aeca5e0e6e8022bfbc931b93fcd14b
    # Parent  974e95d05b94be9c72402b1ade70db042efd0b6a
    [mq]: symmetrica.patch
    
    diff -r 974e95d05b94 -r 04df5cf9e5ae sage/combinat/sf/classical.py
    a b class SymmetricFunctionAlgebra_classical 
    163163            except AttributeError:
    164164                raise TypeError, "do not know how to convert from %s to %s"%(xP.basis_name(), self.basis_name())
    165165
    166             z_elt = {}
    167            
    168             for part in xm:
    169                 if xm[part] == R(0):
    170                     continue
    171                 xmprime = t( {part:Integer(1)} ).monomial_coefficients()
    172                 for part2 in xmprime:
    173                     z_elt[part2] = z_elt.get(part2, R(0)) + xmprime[part2]*R(xm[part])
    174             return self._from_dict(z_elt)
     166            f = lambda part: self._from_dict(t( {part:Integer(1)} )._monomial_coefficients)
     167            return self._apply_module_endomorphism(x, f)
    175168
    176169       
    177170        ###############################
  • sage/combinat/sf/sfa.py

    diff -r 974e95d05b94 -r 04df5cf9e5ae sage/combinat/sf/sfa.py
    a b class SymmetricFunctionAlgebraElement_ge 
    11601160            sage: c = s([3,2,1])
    11611161            sage: c.itensor(c)
    11621162            s[1, 1, 1, 1, 1, 1] + 2*s[2, 1, 1, 1, 1] + 3*s[2, 2, 1, 1] + 2*s[2, 2, 2] + 4*s[3, 1, 1, 1] + 5*s[3, 2, 1] + 2*s[3, 3] + 4*s[4, 1, 1] + 3*s[4, 2] + 2*s[5, 1] + s[6]
    1163            
     1163
     1164
     1165        TESTS:
     1166            sage: s = SFASchur(QQ)
     1167            sage: a = s([8,8])
     1168            sage: a.itensor(a) #long
     1169            s[4, 4, 4, 4] + s[5, 5, 3, 3] + s[5, 5, 5, 1] + s[6, 4, 4, 2] + s[6, 6, 2, 2] + s[6, 6, 4] + s[7, 3, 3, 3] + s[7, 5, 3, 1] + s[7, 7, 1, 1] + s[8, 4, 2, 2] + s[8, 4, 4] + s[8, 6, 2] + s[8, 8] + s[9, 3, 3, 1] + s[9, 5, 1, 1] + s[10, 2, 2, 2] + s[10, 4, 2] + s[10, 6] + s[11, 3, 1, 1] + s[12, 2, 2] + s[12, 4] + s[13, 1, 1, 1] + s[14, 2] + s[16]
     1170
    11641171        """
    11651172        #Convert both self and x to the p basis
    11661173        p = SFAPower(self.parent().base_ring())
  • sage/libs/symmetrica/sab.pxi

    diff -r 974e95d05b94 -r 04df5cf9e5ae sage/libs/symmetrica/sab.pxi
    a b def dimension_symmetrization_symmetrica( 
    2525    _op_integer(n, cn)
    2626
    2727    dimension_symmetrization(cn, cpart, cres)
    28     res = _py_integer(cres)
     28    res = _py(cres)
    2929
    3030    freeall(cn)
    3131    freeall(cpart)
  • sage/libs/symmetrica/symmetrica.pxi

    diff -r 974e95d05b94 -r 04df5cf9e5ae sage/libs/symmetrica/symmetrica.pxi
    a b cdef extern from 'symmetrica/def.h': 
    55    ctypedef int INT
    66    ctypedef INT OBJECTKIND
    77
    8     ctypedef struct vector:
     8    cdef struct vector:
    99        pass
    10     ctypedef struct bruch:
     10    cdef struct bruch:
    1111        pass
    12     ctypedef struct graph:
     12    cdef struct graph:
    1313        pass
    14     ctypedef struct list:
     14    cdef struct list:
    1515        pass
    16     ctypedef struct longint:
     16    cdef struct matrix:
    1717        pass
    18     ctypedef struct matrix:
     18    cdef struct monom:
    1919        pass
    20     ctypedef struct monom:
     20    cdef struct number:
    2121        pass
    22     ctypedef struct number:
     22    cdef struct partition:
    2323        pass
    24     ctypedef struct partition:
     24    cdef struct permutation:
    2525        pass
    26     ctypedef struct permutation:
     26    cdef struct reihe:
    2727        pass
    28     ctypedef struct reihe:
     28    cdef struct skewpartition:
    2929        pass
    30     ctypedef struct skewpartition:
     30    cdef struct symchar:
    3131        pass
    32     ctypedef struct symchar:
     32    cdef struct tableaux:
    3333        pass
    34     ctypedef struct tableaux:
    35         pass
    36    
    37     ctypedef union OBJECTSELF:
    38         INT ob_INT
    39         INT *ob_INTpointer
    40         char *ob_charpointer
    41         bruch *ob_bruch
    42         graph *ob_graph
    43         list *ob_list
    44         longint *ob_longint
    45         matrix *ob_matrix
    46         monom *ob_monom
    47         number *ob_number
    48         partition *ob_partition
    49         permutation *ob_permutation
    50         reihe *ob_reihe
    51         skewpartition *ob_skewpartition
    52         symchar *ob_symchar
    53         tableaux *ob_tableaux
    54         vector *ob_vector
    55      
    56    
     34
    5735    cdef enum:
    5836        INFREELIST = -1
    5937        EMPTY = 0
    cdef extern from 'symmetrica/def.h': 
    126104        INTEGER_FRACTION =220998
    127105        HASHTABLE  =120199
    128106
    129        
    130107 
    131     ctypedef struct loc:
     108    cdef struct loc:
    132109        INT w2, w1, w0
    133110        loc *nloc
    134111
    135     ctypedef struct longint:
     112    cdef struct longint:
    136113        loc *floc
    137114        signed char signum #-1,0,+1
    138115        INT laenge
    139116
    140    
     117    ctypedef union OBJECTSELF:
     118        INT ob_INT
     119        INT *ob_INTpointer
     120        char *ob_charpointer
     121        bruch *ob_bruch
     122        graph *ob_graph
     123        list *ob_list
     124        longint *ob_longint
     125        matrix *ob_matrix
     126        monom *ob_monom
     127        number *ob_number
     128        partition *ob_partition
     129        permutation *ob_permutation
     130        reihe *ob_reihe
     131        skewpartition *ob_skewpartition
     132        symchar *ob_symchar
     133        tableaux *ob_tableaux
     134        vector *ob_vector
    141135
    142     ctypedef struct ganzdaten:
     136    cdef struct obj:
     137        OBJECTKIND ob_kind
     138        OBJECTSELF ob_self
     139
     140    cdef struct ganzdaten:
    143141        INT basis, basislaenge, auspos, auslaenge, auszz
    144142
    145     ctypedef struct zahldaten:
     143    cdef struct zahldaten:
    146144        char ziffer[13]
    147145        INT mehr
    148146        INT ziffernzhal
    149147        loc *fdez
    150    
    151 
    152     ctypedef struct obj:
    153         OBJECTKIND ob_kind
    154         OBJECTSELF ob_self
    155148       
    156149    ctypedef obj *OP
    157150
    158     ctypedef struct vector:
     151    cdef struct vector:
    159152        OP v_length
    160153        OP v_self
    161154
    162     ctypedef struct REIHE_variablen:
     155    cdef struct REIHE_variablen:
    163156        INT index
    164157        INT potenz
    165158        REIHE_variablen *weiter
    166159
    167     ctypedef struct REIHE_mon:
     160    cdef struct REIHE_mon:
    168161        OP coeff
    169162        REIHE_variablen *zeiger
    170163        REIHE_mon *ref
    171164
    172     ctypedef struct REIHE_poly:
     165    cdef struct REIHE_poly:
    173166        INT grad
    174167        REIHE_mon *uten
    175168        REIHE_poly *rechts
    176169
    177     ctypedef struct reihe:
     170    cdef struct reihe:
    178171        INT exist
    179172        INT reihenart
    180173        INT z
    cdef extern from 'symmetrica/def.h': 
    186179
    187180    ctypedef reihe* REIHE_ZEIGER
    188181
    189     ctypedef struct list:
     182    cdef struct list:
    190183        OP l_self
    191184        OP l_next
    192185
    193     ctypedef struct partition:
     186    cdef struct partition:
    194187        OBJECTKIND pa_kind
    195188        OP pa_self
    196189
    197     ctypedef struct permutation:
     190    cdef struct permutation:
    198191        OBJECTKIND p_kind
    199192        OP p_self
    200193
    201     ctypedef struct monom:
     194    cdef struct monom:
    202195        OP mo_self
    203196        OP mo_koeff
    204197
    205     ctypedef struct bruch:
     198    cdef struct bruch:
    206199        OP b_oben
    207200        OP b_uten
    208201        INT b_info
    209202
    210     ctypedef struct matrix:
     203    cdef struct matrix:
    211204        OP m_length
    212205        OP m_height
    213206        OP m_self
    214207
    215     ctypedef struct skewpartition:
     208    cdef struct skewpartition:
    216209        OP spa_gross
    217210        OP spa_klein
    218211
    219     ctypedef struct tableaux:
     212    cdef struct tableaux:
    220213        OP t_umriss
    221214        OP t_self
    222215
    223     ctypedef struct symchar:
     216    cdef struct symchar:
    224217        OP sy_werte
    225218        OP sy_parlist
    226219        OP sy_dimension
    227220
    228     ctypedef struct graph:
     221    cdef struct graph:
    229222        OBJECTKIND gr_kind
    230223        OP gr_self
    231224
    232     ctypedef struct CYCLO_DATA:
     225    cdef struct CYCLO_DATA:
    233226        OP index, deg, poly, autos
    234227
    235     ctypedef struct FIELD_DATA:
     228    cdef struct FIELD_DATA:
    236229        OP index, deg, poly
    237230
    238231    ctypedef union data:
    cdef extern from 'symmetrica/def.h': 
    240233        FIELD_DATA *f_data
    241234        OP o_data
    242235
    243     ctypedef struct number:
     236    cdef struct number:
    244237        OP n_self
    245238        data n_data
    246239
    247240
     241       
    248242    #MACROS
    249243    #S_PA_I(OP a, INT i)
    250244    OBJECTKIND s_o_k(OP a)
    251245    void* c_o_k(OP a, OBJECTKIND k)
     246    OBJECTSELF S_O_S(OP a)
     247
     248    void* add(OP a, OP b, OP c)
     249    void* mult(OP a, OP b, OP c)
     250    void* sub(OP a, OP b, OP c)
    252251
    253252
    254253    #Integers
    255254    void* m_i_i(INT n, OP a)
    256255    void* M_I_I(INT n, OP a)
    257256    INT S_I_I(OP a)
     257    t_int_longint(OP a, OP b)
     258    void* m_i_longint(INT n, OP a)
    258259
     260   
    259261    #Fractions
    260262    OP S_B_O(OP a)
    261263    OP S_B_U(OP a)
    cdef object SymmetricFunctionAlgebra 
    377379cdef object SymmetricFunctionAlgebra
    378380cdef object PolynomialRing
    379381cdef object SchubertPolynomialRing
     382cdef object two, fifteen, thirty, zero, sage_maxint
     383
     384cdef int maxint = 2147483647
    380385
    381386cdef void late_import():
    382387    global matrix_constructor, \
    cdef void late_import(): 
    399404           sqrt, \
    400405           builtinlist, \
    401406           MPolynomialRing_generic, \
    402            SchubertPolynomialRing
     407           SchubertPolynomialRing, \
     408           two, fifteen, thirty, zero, sage_maxint
    403409
    404410    if matrix_constructor is not None:
    405411        return
    cdef void late_import(): 
    456462    import sage.combinat.schubert_polynomial
    457463    SchubertPolynomialRing = sage.combinat.schubert_polynomial.SchubertPolynomialRing
    458464
     465    two = Integer(2)
     466    fifteen = Integer(15)
     467    thirty = Integer(30)
     468    zero = Integer(0)
     469    sage_maxint = Integer(maxint)
     470
    459471##########################################
    460472cdef object _py(OP a):
    461473    cdef OBJECTKIND objk
    462474    objk = s_o_k(a)
    463475    #print objk
    464     if objk == INTEGER or objk == LONGINT:
    465         return _py_integer(a)
     476    if objk == INTEGER:
     477        return _py_int(a)
     478    elif objk == LONGINT:
     479        return _py_longint(a)
    466480    elif objk == PARTITION:
    467481        return _py_partition(a)
    468482    elif objk == PERMUTATION:
    cdef object _py(OP a): 
    501515        #println(a)
    502516        raise NotImplementedError, str(objk)
    503517
    504 cdef void* _op(object a, OP result):
     518cdef int _op(object a, OP result) except -1:
    505519    late_import()
    506520    if PyObject_TypeCheck(a, Integer):
    507521        _op_integer(a, result)
    cdef void* _op(object a, OP result): 
    512526    else:
    513527        raise TypeError, "cannot convert a (= %s) to OP"%a
    514528
     529def test(object x):
     530    cdef OP a = callocobject()
     531    _op_longint(x, a)
     532    return None
     533
    515534##########
    516535#Integers#
    517536##########
    518 cdef void* _op_integer(object x, OP a):
    519     #a.ob_kind = INTEGER
    520     #a.ob_self = <OBJECTSELF>x
     537
     538cdef int _op_integer(object x, OP a) except -1:
     539    try:
     540        _op_int(x, a)
     541    except OverflowError:
     542        _op_longint(x, a)
     543    return 0
     544
     545
     546cdef int _op_int(object x, OP a) except -1:
    521547    M_I_I(x, a)
     548    return 0
    522549
    523 cdef object _py_integer(OP a):
     550cdef object _py_int(OP a):
    524551    late_import()
     552    return Integer(S_I_I(a))
     553
     554
     555cdef int _op_longint(object x, OP a) except -1:
     556    late_import()
     557    cdef OP op_maxint_long = callocobject(),
     558    cdef OP quo_long = callocobject()
     559    cdef OP rem_long = callocobject()
    525560   
    526     return Integer(S_I_I(a))
     561    qr = x.quo_rem(sage_maxint)
     562
     563    m_i_longint(maxint, op_maxint_long)
     564    _op_integer(qr[0], a)
     565    _op_integer(qr[1], rem_long)
     566   
     567    #Multiply a by op_maxint_long
     568    mult(op_maxint_long, a, a)
     569
     570    #Add rem to a
     571    add(a, rem_long, a)
     572
     573    freeall(rem_long)
     574    freeall(quo_long)
     575    freeall(op_maxint_long)
     576    return 0
     577
     578cdef object _py_longint(OP a):
     579    late_import()
     580    cdef longint *x = S_O_S(a).ob_longint
     581    cdef loc *l = x.floc
     582    res = zero
     583    n = zero
     584    while l != NULL:
     585        res += Integer( l.w0 ) * two**n
     586        res += Integer( l.w1 ) * two**(n+fifteen)
     587        res += Integer( l.w2 ) * two**(n+thirty)
     588        n += thirty + fifteen
     589        l = l.nloc
     590
     591    return res
     592
    527593
    528594
    529595###########
    530596#Fractions#
    531597###########
    532598cdef object _py_fraction(OP a):
    533     return _py_integer(S_B_O(a))/_py_integer(S_B_U(a))
     599    return _py(S_B_O(a))/_py(S_B_U(a))
    534600
    535 cdef void* _op_fraction(object f, OP a):
     601cdef int _op_fraction(object f, OP a) except -1:
    536602    cdef OP o = callocobject(), u = callocobject()
    537603    _op_integer(f.numerator(), o)
    538604    _op_integer(f.denominator(), u)