Ticket #11544: trac_11544-avoid-hash-of-matrix-entries-v2.patch

File trac_11544-avoid-hash-of-matrix-entries-v2.patch, 14.6 KB (added by rbeezer, 10 years ago)
  • sage/matrix/matrix0.pyx

    # HG changeset patch
    # User Rob Beezer <beezer@ups.edu>
    # Date 1310425410 25200
    # Node ID f95b36fd6088224f861a3915818ffb4bb83e2d88
    # Parent  8532a2ad1e558cbc91ddaaa6b7cc79956dd1e8ba
    11544: avoid hashing matrix entries when generating string representation
    
    diff --git a/sage/matrix/matrix0.pyx b/sage/matrix/matrix0.pyx
    a b  
    16191619          elements of the base ring and values the desired string
    16201620          representation.  Values sent in via the other keyword
    16211621          arguments will override values in the dictionary.
     1622          Use of a dictionary can potentially take a very long time
     1623          due to the need to hash entries of the matrix.  Matrices
     1624          with entries from ``QQbar`` are one example.
    16221625
    16231626          If ``rep_mapping`` is callable then it will be called with
    16241627          elements of the matrix and must return a string.  Simply
     
    16631666            '[+ .]\n[+ -]'
    16641667            sage: M.str(repr)
    16651668            '[ 1  0]\n[ 2 -1]'
     1669
     1670        TESTS:
     1671
     1672        Prior to Trac #11544 this could take a full minute to run (2011). ::
     1673
     1674            sage: A = matrix(QQ, 4, 4, [1, 2, -2, 2, 1, 0, -1, -1, 0, -1, 1, 1, -1, 2, 1/2, 0])
     1675            sage: e = A.eigenvalues()[3]
     1676            sage: K = (A-e).kernel()
     1677            sage: P = K.basis_matrix()
     1678            sage: P.str()
     1679            '[             1.000000000000000? + 0.?e-17*I -2.116651487479748? + 0.0255565807096352?*I -0.2585224251020429? + 0.288602340904754?*I -0.4847545623533090? - 1.871890760086142?*I]'
    16661680        """
    16671681        #x = self.fetch('repr')  # too confusing!!
    16681682        #if not x is None: return x
     
    16921706            # Override the usual representations with those specified
    16931707            if callable(rep_mapping):
    16941708                rep = rep_mapping(x)
    1695             elif rep_mapping.has_key(x):
     1709            # avoid hashing entries, especially algebraic numbers
     1710            elif rep_mapping and rep_mapping.has_key(x):
    16961711                rep = rep_mapping.get(x)
    16971712            else:
    16981713                rep = repr(x)
  • sage/matrix/matrix2.pyx

    diff --git a/sage/matrix/matrix2.pyx b/sage/matrix/matrix2.pyx
    a b  
    71417141            ...                      [-1, 1, -6, -6, 5]])
    71427142            sage: Q, R = A.QR()
    71437143            sage: Q
    7144             [ -0.4588314677411235?  -0.1260506983326509?   0.3812120831224489?  -0.3945737113384181?  -0.6874400625963308?]
    7145             [ -0.4588314677411235?   0.4726901187474409? -0.05198346588033394?   0.7172941251646595?  -0.2209628772631064?]
    7146             [  0.2294157338705618?   0.6617661662464172?   0.6619227988762521?  -0.1808720937375480?   0.1964114464560946?]
    7147             [  0.6882472016116853?   0.1890760474989764?  -0.2044682991293135?   0.0966302966543065?  -0.6628886317893191?]
    7148             [ -0.2294157338705618?   0.5357154679137663?  -0.6099393329959182?  -0.5364220314271115?  0.02455143080701182?]
     7144            [ -0.4588314677411235?  -0.1260506983326509?   0.3812120831224489?   -0.394573711338418?      -0.687440062597?]
     7145            [ -0.4588314677411235?   0.4726901187474409? -0.05198346588033394?    0.717294125164660?      -0.220962877263?]
     7146            [  0.2294157338705618?   0.6617661662464172?   0.6619227988762521?   -0.180872093737548?      0.1964114464561?]
     7147            [  0.6882472016116853?   0.1890760474989764?  -0.2044682991293135?    0.096630296654307?      -0.662888631790?]
     7148            [ -0.2294157338705618?   0.5357154679137663?   -0.609939332995919?   -0.536422031427112?      0.0245514308070?]
    71497149            sage: R
    71507150            [  4.358898943540674? -0.4588314677411235?   13.07669683062202?   6.194224814505168?   2.982404540317303?]
    71517151            [                   0   1.670171752907625?  0.5987408170800917?  -1.292019657909672?   6.207996892883057?]
    7152             [                   0                    0   5.444401659866974?   5.468660610611130? -0.6827161852283857?]
    7153             [                   0                    0                    0   1.027626039419836?  -3.619300149686620?]
    7154             [                   0                    0                    0                    0 0.02455143080701182?]
     7152            [                   0                    0   5.444401659866974?   5.468660610611130?  -0.682716185228386?]
     7153            [                   0                    0                    0   1.027626039419836?   -3.61930014968662?]
     7154            [                   0                    0                    0                    0    0.02455143080702?]
    71557155            sage: Q.conjugate_transpose()*Q
    7156             [1.000000000000000?            0.?e-37            0.?e-36            0.?e-34            0.?e-31]
    7157             [           0.?e-37 1.000000000000000?            0.?e-36            0.?e-34            0.?e-31]
    7158             [           0.?e-36            0.?e-36 1.000000000000000?            0.?e-34            0.?e-31]
    7159             [           0.?e-34            0.?e-34            0.?e-34 1.000000000000000?            0.?e-31]
    7160             [           0.?e-31            0.?e-31            0.?e-31            0.?e-31 1.000000000000000?]
     7156            [1.000000000000000?            0.?e-18            0.?e-17            0.?e-15            0.?e-12]
     7157            [           0.?e-18 1.000000000000000?            0.?e-16            0.?e-15            0.?e-12]
     7158            [           0.?e-17            0.?e-16 1.000000000000000?            0.?e-15            0.?e-12]
     7159            [           0.?e-15            0.?e-15            0.?e-15 1.000000000000000?            0.?e-12]
     7160            [           0.?e-12            0.?e-12            0.?e-12            0.?e-12    1.000000000000?]
    71617161            sage: Q*R == A
    71627162            True
    71637163
     
    71717171            ...                      [I + 2, 0, I + 12, -1]])
    71727172            sage: Q, R = A.QR()
    71737173            sage: Q
    7174             [                          -0.7302967433402215?    0.2070566455055649? + 0.5383472783144687?*I    0.2463049809998642? - 0.0764456358723292?*I   0.2381617683194332? - 0.10365960327796942?*I]
    7175             [                           0.0912870929175277?   -0.2070566455055649? - 0.3778783780476559?*I    0.3786559533863033? - 0.1952221495524667?*I    0.7012444502144683? - 0.3643711650986595?*I]
    7176             [   0.6390096504226938? + 0.0912870929175277?*I    0.1708217325420910? + 0.6677576817554466?*I -0.03411475806452072? + 0.04090198741767143?*I    0.3140171085506764? - 0.0825191718705412?*I]
    7177             [   0.1825741858350554? + 0.0912870929175277?*I  -0.03623491296347385? + 0.0724698259269477?*I   0.8632284069415110? + 0.06322839976356195?*I  -0.4499694867611521? - 0.01161191812089175?*I]
     7174            [                          -0.7302967433402215?    0.2070566455055649? + 0.5383472783144687?*I    0.2463049809998642? - 0.0764456358723292?*I    0.2381617683194332? - 0.1036596032779695?*I]
     7175            [                           0.0912870929175277?   -0.2070566455055649? - 0.3778783780476559?*I    0.3786559533863032? - 0.1952221495524667?*I      0.701244450214469? - 0.364371165098660?*I]
     7176            [   0.6390096504226938? + 0.0912870929175277?*I    0.1708217325420910? + 0.6677576817554466?*I -0.03411475806452072? + 0.04090198741767143?*I    0.3140171085506763? - 0.0825191718705412?*I]
     7177            [   0.1825741858350554? + 0.0912870929175277?*I  -0.03623491296347385? + 0.0724698259269477?*I   0.8632284069415110? + 0.06322839976356195?*I   -0.4499694867611521? - 0.0116119181208918?*I]
    71787178            sage: R
    7179             [                          10.95445115010333?               0.?e-37 - 1.917028951268082?*I    5.385938482134133? - 2.190890230020665?*I  -0.2738612787525831? - 2.190890230020665?*I]
    7180             [                                           0                           4.829596256417300?   -0.869637911123373? - 5.864879483945125?*I   0.993871898426712? - 0.3054085521207082?*I]
    7181             [                                           0                                            0                           12.00160760935814? -0.2709533402297274? + 0.4420629644486323?*I]
    7182             [                                           0                                            0                                            0               1.942963944258992? + 0.?e-33*I]
     7179            [                          10.95445115010333?               0.?e-18 - 1.917028951268082?*I    5.385938482134133? - 2.190890230020665?*I  -0.2738612787525831? - 2.190890230020665?*I]
     7180            [                                           0               4.829596256417300? + 0.?e-17*I   -0.869637911123373? - 5.864879483945125?*I   0.993871898426712? - 0.3054085521207082?*I]
     7181            [                                           0                                            0               12.00160760935814? + 0.?e-16*I -0.2709533402297273? + 0.4420629644486323?*I]
     7182            [                                           0                                            0                                            0               1.942963944258992? + 0.?e-16*I]
    71837183            sage: Q.conjugate_transpose()*Q
    7184             [1.000000000000000? + 0.?e-37*I            0.?e-36 + 0.?e-36*I            0.?e-33 + 0.?e-33*I            0.?e-33 + 0.?e-33*I]
    7185             [           0.?e-36 + 0.?e-36*I 1.000000000000000? + 0.?e-36*I            0.?e-33 + 0.?e-33*I            0.?e-33 + 0.?e-33*I]
    7186             [           0.?e-33 + 0.?e-33*I            0.?e-33 + 0.?e-33*I 1.000000000000000? + 0.?e-34*I            0.?e-33 + 0.?e-33*I]
    7187             [           0.?e-33 + 0.?e-33*I            0.?e-33 + 0.?e-33*I            0.?e-33 + 0.?e-33*I 1.000000000000000? + 0.?e-33*I]
     7184            [1.000000000000000? + 0.?e-19*I            0.?e-18 + 0.?e-17*I            0.?e-17 + 0.?e-17*I            0.?e-16 + 0.?e-16*I]
     7185            [           0.?e-18 + 0.?e-17*I 1.000000000000000? + 0.?e-17*I            0.?e-17 + 0.?e-17*I            0.?e-16 + 0.?e-16*I]
     7186            [           0.?e-17 + 0.?e-17*I            0.?e-17 + 0.?e-17*I 1.000000000000000? + 0.?e-16*I            0.?e-16 + 0.?e-16*I]
     7187            [           0.?e-16 + 0.?e-16*I            0.?e-16 + 0.?e-16*I            0.?e-16 + 0.?e-16*I 1.000000000000000? + 0.?e-15*I]
    71887188            sage: Q*R - A
    7189             [                  0 0.?e-36 + 0.?e-36*I 0.?e-32 + 0.?e-32*I 0.?e-33 + 0.?e-33*I]
    7190             [                  0 0.?e-36 + 0.?e-36*I 0.?e-35 + 0.?e-35*I 0.?e-33 + 0.?e-33*I]
    7191             [0.?e-36 + 0.?e-36*I 0.?e-36 + 0.?e-36*I 0.?e-35 + 0.?e-35*I 0.?e-33 + 0.?e-33*I]
    7192             [0.?e-37 + 0.?e-37*I 0.?e-37 + 0.?e-37*I 0.?e-36 + 0.?e-36*I 0.?e-33 + 0.?e-33*I]
     7189            [            0.?e-17 0.?e-17 + 0.?e-17*I 0.?e-16 + 0.?e-16*I 0.?e-16 + 0.?e-16*I]
     7190            [            0.?e-18 0.?e-17 + 0.?e-17*I 0.?e-16 + 0.?e-16*I 0.?e-15 + 0.?e-15*I]
     7191            [0.?e-17 + 0.?e-18*I 0.?e-17 + 0.?e-17*I 0.?e-16 + 0.?e-16*I 0.?e-16 + 0.?e-16*I]
     7192            [0.?e-18 + 0.?e-18*I 0.?e-18 + 0.?e-17*I 0.?e-16 + 0.?e-16*I 0.?e-15 + 0.?e-16*I]
    71937193
    71947194        A rank-deficient rectangular matrix, with both values of the ``full`` keyword.  ::
    71957195
     
    72097209            [                  0                   0                   0]
    72107210            [                  0                   0                   0]
    72117211            sage: Q.conjugate_transpose()*Q
    7212             [                 1            0.?e-37            0.?e-37            0.?e-38]
    7213             [           0.?e-37                  1            0.?e-37            0.?e-38]
    7214             [           0.?e-37            0.?e-37                  1            0.?e-38]
    7215             [           0.?e-38            0.?e-37            0.?e-38 1.000000000000000?]
     7212            [                 1            0.?e-18            0.?e-18            0.?e-18]
     7213            [           0.?e-18                  1            0.?e-18            0.?e-18]
     7214            [           0.?e-18            0.?e-18 1.000000000000000?            0.?e-18]
     7215            [           0.?e-18            0.?e-18            0.?e-18 1.000000000000000?]
    72167216
    72177217            sage: Q, R = A.QR(full=False)
    72187218            sage: Q
     
    72247224            [ 5.567764362830022? -2.694079530401624?  2.694079530401624?]
    72257225            [                  0  3.569584777515583? -3.569584777515583?]
    72267226            sage: Q.conjugate_transpose()*Q
    7227             [      1 0.?e-37]
    7228             [0.?e-37       1]
     7227            [      1 0.?e-18]
     7228            [0.?e-18       1]
    72297229
    72307230        Another rank-deficient rectangular matrix, with complex entries,
    72317231        as a reduced decomposition. ::
     
    72427242            [                        7.211102550927979?  3.328201177351375? - 5.269651864139676?*I   7.904477796209515? + 8.45917799243475?*I  4.021576422632911? - 2.634825932069838?*I]
    72437243            [                                         0                         1.074172311059150?  -1.611258466588724? - 9.13046464400277?*I 1.611258466588724? + 0.5370861555295747?*I]
    72447244            sage: Q.conjugate_transpose()*Q
    7245             [1.000000000000000? + 0.?e-37*I            0.?e-36 + 0.?e-36*I]
    7246             [           0.?e-36 + 0.?e-36*I 1.000000000000000? + 0.?e-36*I]
     7245            [1.000000000000000? + 0.?e-18*I            0.?e-18 + 0.?e-18*I]
     7246            [           0.?e-17 + 0.?e-17*I 1.000000000000000? + 0.?e-17*I]
    72477247            sage: Q*R-A
    7248             [0.?e-37 + 0.?e-37*I 0.?e-36 + 0.?e-36*I 0.?e-35 + 0.?e-35*I 0.?e-35 + 0.?e-35*I]
    7249             [0.?e-37 + 0.?e-37*I 0.?e-36 + 0.?e-36*I 0.?e-35 + 0.?e-34*I 0.?e-35 + 0.?e-35*I]
    7250             [0.?e-37 + 0.?e-37*I 0.?e-36 + 0.?e-36*I 0.?e-35 + 0.?e-35*I 0.?e-35 + 0.?e-36*I]
     7248            [0.?e-18 + 0.?e-18*I 0.?e-18 + 0.?e-18*I 0.?e-17 + 0.?e-17*I 0.?e-18 + 0.?e-18*I]
     7249            [0.?e-18 + 0.?e-18*I 0.?e-18 + 0.?e-18*I 0.?e-18 + 0.?e-17*I 0.?e-18 + 0.?e-18*I]
     7250            [0.?e-18 + 0.?e-18*I 0.?e-17 + 0.?e-18*I 0.?e-17 + 0.?e-17*I 0.?e-18 + 0.?e-18*I]
    72517251
    72527252        Results of full decompositions are cached and thus returned
    72537253        immutable.  ::
     
    80498049            True
    80508050            sage: _, T = A.is_similar(B, transformation=True)
    80518051            sage: T
    8052             [  1.000000000000000? + 0.?e-32*I              0.?e-33 + 0.?e-33*I              0.?e-32 + 0.?e-32*I]
    8053             [-0.6666666666666667? + 0.?e-33*I  0.1666666666666667? + 0.?e-33*I -0.8333333333333333? + 0.?e-32*I]
    8054             [ 0.6666666666666667? + 0.?e-32*I              0.?e-33 + 0.?e-33*I -0.3333333333333334? + 0.?e-32*I]
     8052            [ 1.0000000000000? + 0.?e-13*I           0.?e-13 + 0.?e-13*I           0.?e-13 + 0.?e-13*I]
     8053            [-0.6666666666667? + 0.?e-13*I 0.16666666666667? + 0.?e-14*I -0.8333333333334? + 0.?e-13*I]
     8054            [ 0.6666666666667? + 0.?e-13*I           0.?e-13 + 0.?e-13*I  -0.333333333334? + 0.?e-13*I]
    80558055            sage: T.change_ring(QQ)
    80568056            [   1    0    0]
    80578057            [-2/3  1/6 -5/6]