Ticket #2534: 2534.patch

File 2534.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 1205638079 25200
    # Node ID 55102f4cdd5291a05d2a8f9e68e5acc74226e7ea
    # Parent  dc145ad930d41df60f53033707025ca88ad95c8c
    [mq]: symmetrica.patch
    
    diff -r dc145ad930d4 -r 55102f4cdd52 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 dc145ad930d4 -r 55102f4cdd52 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 dc145ad930d4 -r 55102f4cdd52 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 dc145ad930d4 -r 55102f4cdd52 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(): 
    396401           sqrt, \
    397402           builtinlist, \
    398403           MPolynomialRing_generic, \
    399            SchubertPolynomialRing
     404           SchubertPolynomialRing, \
     405           two, fifteen, thirty, zero, sage_maxint
    400406
    401407    if matrix_constructor is not None:
    402408        return
    cdef void late_import(): 
    448454    import sage.combinat.schubert_polynomial
    449455    SchubertPolynomialRing = sage.combinat.schubert_polynomial.SchubertPolynomialRing
    450456
     457    two = Integer(2)
     458    fifteen = Integer(15)
     459    thirty = Integer(30)
     460    zero = Integer(0)
     461    sage_maxint = Integer(maxint)
     462
    451463##########################################
    452464cdef object _py(OP a):
    453465    cdef OBJECTKIND objk
    454466    objk = s_o_k(a)
    455467    #print objk
    456     if objk == INTEGER or objk == LONGINT:
    457         return _py_integer(a)
     468    if objk == INTEGER:
     469        return _py_int(a)
     470    elif objk == LONGINT:
     471        return _py_longint(a)
    458472    elif objk == PARTITION:
    459473        return _py_partition(a)
    460474    elif objk == PERMUTATION:
    cdef object _py(OP a): 
    493507        #println(a)
    494508        raise NotImplementedError, str(objk)
    495509
    496 cdef void* _op(object a, OP result):
     510cdef int _op(object a, OP result) except -1:
    497511    late_import()
    498512    if PyObject_TypeCheck(a, Integer):
    499513        _op_integer(a, result)
    cdef void* _op(object a, OP result): 
    504518    else:
    505519        raise TypeError, "cannot convert a (= %s) to OP"%a
    506520
     521def test(object x):
     522    cdef OP a = callocobject()
     523    _op_longint(x, a)
     524    return None
     525
    507526##########
    508527#Integers#
    509528##########
    510 cdef void* _op_integer(object x, OP a):
    511     #a.ob_kind = INTEGER
    512     #a.ob_self = <OBJECTSELF>x
     529
     530cdef int _op_integer(object x, OP a) except -1:
     531    try:
     532        _op_int(x, a)
     533    except OverflowError:
     534        _op_longint(x, a)
     535    return 0
     536
     537
     538cdef int _op_int(object x, OP a) except -1:
    513539    M_I_I(x, a)
     540    return 0
    514541
    515 cdef object _py_integer(OP a):
     542cdef object _py_int(OP a):
    516543    late_import()
     544    return Integer(S_I_I(a))
     545
     546
     547cdef int _op_longint(object x, OP a) except -1:
     548    late_import()
     549    cdef OP op_maxint_long = callocobject(),
     550    cdef OP quo_long = callocobject()
     551    cdef OP rem_long = callocobject()
    517552   
    518     return Integer(S_I_I(a))
     553    qr = x.quo_rem(sage_maxint)
     554
     555    m_i_longint(maxint, op_maxint_long)
     556    _op_integer(qr[0], a)
     557    _op_integer(qr[1], rem_long)
     558   
     559    #Multiply a by op_maxint_long
     560    mult(op_maxint_long, a, a)
     561
     562    #Add rem to a
     563    add(a, rem_long, a)
     564
     565    freeall(rem_long)
     566    freeall(quo_long)
     567    freeall(op_maxint_long)
     568    return 0
     569
     570cdef object _py_longint(OP a):
     571    late_import()
     572    cdef longint *x = S_O_S(a).ob_longint
     573    cdef loc *l = x.floc
     574    res = zero
     575    n = zero
     576    while l != NULL:
     577        res += Integer( l.w0 ) * two**n
     578        res += Integer( l.w1 ) * two**(n+fifteen)
     579        res += Integer( l.w2 ) * two**(n+thirty)
     580        n += thirty + fifteen
     581        l = l.nloc
     582
     583    return res
     584
    519585
    520586
    521587###########
    522588#Fractions#
    523589###########
    524590cdef object _py_fraction(OP a):
    525     return _py_integer(S_B_O(a))/_py_integer(S_B_U(a))
     591    return _py(S_B_O(a))/_py(S_B_U(a))
    526592
    527 cdef void* _op_fraction(object f, OP a):
     593cdef int _op_fraction(object f, OP a) except -1:
    528594    cdef OP o = callocobject(), u = callocobject()
    529595    _op_integer(f.numerator(), o)
    530596    _op_integer(f.denominator(), u)