OK. That was not an error of mine (nor my Sage installation), but a a genuine problem. So no indication to file a ticket.
Note : Numerics with"standard" are not a problem : sage: %time matrix([[CDF(u) for u in v] for v in pM]).eigenvectors_right() CPU times: user 1.95 ms, sys: 15 µs, total: 1.96 ms Wall time: 1.85 ms [(-1.5855741097050124 - 1.9835895314317984*I, [(0.9524479486112228, -0.2837102376875301 - 0.11002559239003057*I, 0.011400252227268036 - 0.010761481586469179*I)], 1), (0.10840730449357763 + 1.6730496133213792*I, [(0.8835538411020463, 0.2631022513327894 - 0.3627905504445216*I, 0.05890961187635257 + 0.12256626515553348*I)], 1), (0.4060235736555931 + 2.708455679766778*I, [(0.8864942697472706, 0.26813150779882816 - 0.24992379361655742*I, -0.24416421274380526 - 0.14196949964794017*I)], 1)] But if you need extended precision, there's a snag : ``` sage: C= ComplexField(200) sage: %time foo = matrix([[C(u) for u in v] for v in pM]).eigenvectors_right() <timed exec>:1: UserWarning: Using generic algorithm for an inexact ring, which may result in garbage from numerical precision issues. --------------------------------------------------------------------------- NotImplementedError Traceback (most recent call last) <timed exec> in <module> /usr/local/sage-9/local/lib/python3.9/site-packages/sage/matrix/matrix2.pyx in sage.matrix.matrix2.Matrix.eigenvectors_right (build/cythonized/sage/matrix/matrix2.c:47695)() 6709 implemented for RDF and CDF, but not for Rational Field 6710 """ -> 6711 return self.transpose().eigenvectors_left(other=other, extend=extend) 6712 6713 right_eigenvectors = eigenvectors_right /usr/local/sage-9/local/lib/python3.9/site-packages/sage/matrix/matrix2.pyx in sage.matrix.matrix2.Matrix.eigenvectors_left (build/cythonized/sage/matrix/matrix2.c:46717)() 6623 from sage.rings.qqbar import QQbar 6624 from sage.categories.homset import hom -> 6625 eigenspaces = self.eigenspaces_left(format='galois', algebraic_multiplicity=True) 6626 evec_list=[] 6627 n = self._nrows /usr/local/sage-9/local/lib/python3.9/site-packages/sage/matrix/matrix2.pyx in sage.matrix.matrix2.Matrix.eigenspaces_left (build/cythonized/sage/matrix/matrix2.c:42000)() 6127 msg = ("eigenspaces cannot be computed reliably for inexact rings such as {0},\n", 6128 "consult numerical or symbolic matrix classes for other options") -> 6129 raise NotImplementedError(''.join(msg).format(self.base_ring())) 6130 6131 format = self._eigenspace_format(format) NotImplementedError: eigenspaces cannot be computed reliably for inexact rings such as Complex Field with 200 bits of precision, consult numerical or symbolic matrix classes for other options ``` so you're back to "manual" computation of eigenvalues, then eigenvectors, and maintaining precision sin't obvious... Thank you very much. Le vendredi 11 juin 2021 à 15:18:39 UTC+2, Fredrik Johansson a écrit : > What is reasonable depends on what you expect to be able to do with the > solutions. Numerical evaluation should be easy, but if you want canonical > forms (minimal polynomials) or the ability to check equalities, that's > going to be far more costly. > > It looks like the eigenvalues of this matrix will have degree 192 and > height several hundred digits. Computing their minimal polynomials > explicitly should be doable, but could take minutes, hours or years > depending on the algorithm. > > The SR solutions just look like the result of expanding the cubic formula; > there's not much real computation involved. > > The QQbar solutions are huge: > > sage: len(str(sage_input(pM.charpoly().roots()[0][0]))) > 63295 > > Even so, they are still partially lazy (involving nested field > extensions), and reducing them to absolute representations (e.g. with > .exactify()) where you can meaningfully test equality is presumably going > to take a long time. > > How does Calcium fare here? Doing this with arithmetic on minimal > polynomials (qqbar_t) is going to take forever. With Calcium fields, > representing the solutions lazily is easy. There's no code for representing > roots of polynomials implicitly yet, but we can use the cubic formula for a > 3x3 matrix. Quick computation with CalciumField in Nemo: > > julia> function cubic(C,a,b,c,d) > a = C(a) > b = C(b) > c = C(c) > d = C(d) > d0 = b^2 - 3*a*c > d1 = b*(2*b^2-9*a*c) + 27*a^2*d > E = ((d1 + sqrt(d1^2 - 4*d0^3))//2) ^ (C(1) // 3) > D = d0 // E > w = C(root_of_unity(QQBar, 3)) > w2 = w^2 > x1 = (b + E + D) // (-3*a) > x2 = (b + w*E + D//w) // (-3*a) > x3 = (b + w2*E + D//w2) // (-3*a) > return x1, x2, x3 > end; > > julia> function eigproblem() > C = CalciumField() > I = C(1im) > M = C[-sqrt(C(2)) - 1 C(1)//4*I*sqrt(C(759)) - C(1)//4 > -2*sqrt(C(3)); > C(1)//2*I*sqrt(C(3)) + C(1)//2 C(1)//8*sqrt(C(33)) + > C(1)//8 -C(1)//5*sqrt(C(29)) + C(3)//5; > C(0) C(1)//4 C(1)//2*I*sqrt(C(23)) + C(1)//2] > CP = charpoly(PolynomialRing(C, "x")[1], M) > return CP, cubic(C, coeff(CP, 3), coeff(CP, 2), coeff(CP, 1), > coeff(CP, 0)); > end; > > julia> @time CP, (x1, x2, x3) = eigproblem(); > 0.215785 seconds (135.20 k allocations: 11.313 MiB, 46.95% gc time) > > julia> x1 > 0.108407 + 1.67305*I > {(-160*a^2+20*a*d+80*a*f*i-160*a*h-60*a+60*d*f*g-50*d*f*i-20*d*h-15*d+24*e-80*f*h*i-150*f*i+60*g*i-420*h+213)/(480*a) > > where a = 3.36525 - 3.03539*I [Pow(-54.9070 - 75.1596*I > {(6*b+90*d*e-1800*d*f*g*h-3375*d*f*g+3000*d*f*h*i+4950*d*f*i-41175*d*g*i+2250*d*h-42045*d+360*e*f*i+1440*e*h+1890*e+9225*f*g+3600*f*h*i+5270*f*i-1800*g*h*i-3375*g*i+10800*g+40930*h+32400*i+71955)/3200}, > > 0.333333 {1/3})], b = 13494.0 - 27535.7*I [Sqrt(-5.76129e+8 - 7.43136e+8*I > {-711000*d*e*f*g*h+385050*d*e*f*g+1026000*d*e*f*h*i+241200*d*e*f*i-5247000*d*e*g*h*i-7971750*d*e*g*i+54000*d*e*g-5202300*d*e*h+162000*d*e*i-7560900*d*e-1440000*d*f*g*h*i-13943250*d*f*g*h-3105000*d*f*g*i-23751150*d*f*g+22459500*d*f*h*i-8640000*d*f*h-113185725*d*f*i-14985000*d*f-38975250*d*g*h*i+1350000*d*g*h-107574750*d*g*i+48888000*d*g+4050000*d*h*i-197409600*d*h-149796000*d*i-341006175*d+129000*e*f*g*h+216000*e*f*g*i+272250*e*f*g+2902800*e*f*h*i+3985200*e*f*i-648000*e*f-711000*e*g*h*i+864000*e*g*h-25834950*e*g*i+1134000*e*g+2592000*e*h*i+5213700*e*h+3402000*e*i+34315260*e+2160000*f*g*h*i+297276750*f*g*h+19767000*f*g*i+524963250*f*g+119813100*f*h*i-6480000*f*h+238612275*f*i+7119000*f-475643250*g*h*i+27798000*g*h+2049398850*g*i+49248000*g+70434000*h*i-343497600*h+123444000*i-1837827855})], > > c = 27.5500 [c^2-759=0], d = 5.74456 [d^2-33=0], e = 5.38516 [e^2-29=0], f > = 4.79583 [f^2-23=0], g = 1.73205 [g^2-3=0], h = 1.41421 [h^2-2=0], i = I > [i^2+1=0]} > > julia> CP(x1) > 0e-21 - 0e-21*I > {(-1024000*a^6+57600*a^3*d*e-1152000*a^3*d*f*g*h-2160000*a^3*d*f*g+1920000*a^3*d*f*h*i+3168000*a^3*d*f*i-26352000*a^3*d*g*i+1440000*a^3*d*h-26908800*a^3*d+230400*a^3*e*f*i+921600*a^3*e*h+1209600*a^3*e+5904000*a^3*f*g+2304000*a^3*f*h*i+3372800*a^3*f*i-1152000*a^3*g*h*i-2160000*a^3*g*i+6912000*a^3*g+26195200*a^3*h+20736000*a^3*i+46051200*a^3-907200*d*e*f*g*h+568080*d*e*f*g+907200*d*e*f*h*i+201600*d*e*f*i-4017600*d*e*g*h*i-7484400*d*e*g*i-3238560*d*e*h-5720220*d*e-34268400*d*f*g*h+21208410*d*f*g+17771400*d*f*h*i-269751300*d*f*i+155350800*d*g*h*i+109899450*d*g*i+28690380*d*h+72015435*d-1252800*e*f*g*h-745200*e*f*g+2842560*e*f*h*i+2160000*e*f*i-907200*e*g*h*i-81511920*e*g*i-12800160*e*h+106462116*e-274287600*f*g*h-477318150*f*g-365157880*f*h*i-728050500*f*i+1689411600*g*h*i-88231590*g*i-1638440820*h+2202115707)/(27648000*a^3) > > where a = 3.36525 - 3.03539*I [Pow(-54.9070 - 75.1596*I > {(6*b+90*d*e-1800*d*f*g*h-3375*d*f*g+3000*d*f*h*i+4950*d*f*i-41175*d*g*i+2250*d*h-42045*d+360*e*f*i+1440*e*h+1890*e+9225*f*g+3600*f*h*i+5270*f*i-1800*g*h*i-3375*g*i+10800*g+40930*h+32400*i+71955)/3200}, > > 0.333333 {1/3})], b = 13494.0 - 27535.7*I [Sqrt(-5.76129e+8 - 7.43136e+8*I > {-711000*d*e*f*g*h+385050*d*e*f*g+1026000*d*e*f*h*i+241200*d*e*f*i-5247000*d*e*g*h*i-7971750*d*e*g*i+54000*d*e*g-5202300*d*e*h+162000*d*e*i-7560900*d*e-1440000*d*f*g*h*i-13943250*d*f*g*h-3105000*d*f*g*i-23751150*d*f*g+22459500*d*f*h*i-8640000*d*f*h-113185725*d*f*i-14985000*d*f-38975250*d*g*h*i+1350000*d*g*h-107574750*d*g*i+48888000*d*g+4050000*d*h*i-197409600*d*h-149796000*d*i-341006175*d+129000*e*f*g*h+216000*e*f*g*i+272250*e*f*g+2902800*e*f*h*i+3985200*e*f*i-648000*e*f-711000*e*g*h*i+864000*e*g*h-25834950*e*g*i+1134000*e*g+2592000*e*h*i+5213700*e*h+3402000*e*i+34315260*e+2160000*f*g*h*i+297276750*f*g*h+19767000*f*g*i+524963250*f*g+119813100*f*h*i-6480000*f*h+238612275*f*i+7119000*f-475643250*g*h*i+27798000*g*h+2049398850*g*i+49248000*g+70434000*h*i-343497600*h+123444000*i-1837827855})], > > c = 27.5500 [c^2-759=0], d = 5.74456 [d^2-33=0], e = 5.38516 [e^2-29=0], f > = 4.79583 [f^2-23=0], g = 1.73205 [g^2-3=0], h = 1.41421 [h^2-2=0], i = I > [i^2+1=0]} > > These representations are pretty similar to the SR solutions, just > displayed more compactly. You can use them for numerics: > > julia> AcbField(1000)(CP(x1)) > [+/- 4.69e-648] + [+/- 4.25e-648]*im > > julia> AcbField(10000)(CP(x1)) > [+/- 7.21e-6336] + [+/- 7.18e-6336]*im > > > The following exact test fails because the absolute representations of the > algebraic numbers are too large: > > julia> CP(x1) == 0 > ERROR: Unable to perform operation (failed deciding truth of a predicate): > isequal > > > It's an interesting problem to make this work (in reasonable time). > > Fredrik > > On Friday, June 11, 2021 at 9:51:46 AM UTC+2 Emmanuel Charpentier wrote: > >> As the first part of a demonstration on eigensystems, I was surprised to >> see that computing QQbar polynomial roots was way slower that computing >> the roots of the same polynomial expressed as a symbolic expression, or >> solveing it : >> >> # Relative timings of QQbar.roots and solve >> from time import time as stime >> BR = QQbar >> Dim = 3 >> set_random_seed(0) >> pM = MatrixSpace(BR, Dim).random_element() >> sM = matrix([[SR(u.radical_expression()) for u in v] for v in pM]) >> sl = var("sl") >> slI = sl*diagonal_matrix([1]*Dim) >> sCM = sM - slI >> sCP = sCM.det() >> t0 = stime() >> SS = solve(sCP, sl) >> t1 = stime() >> SR = sCP.roots() >> t2 = stime() >> R1.<pl> = BR[] >> plI = pl*diagonal_matrix([1]*Dim) >> pCM = pM - plI >> pCP = pCM.det() >> t3 = stime() >> SP = pCP.roots() >> t4 = stime() >> print("solve : %7.2f, roots(symbolic) : %7.2f, roots(QQbar) : %7.2f"%\ >> (t1 -t0, t2 - t1, t4 - t3)) >> >> gives : >> >> solve : 2.36, roots(symbolic) : 2.04, roots(QQbar) : 600.07 >> >> a quick check on Cocalc <https://cocalc.com> showed the same behavior in >> 9.1 ; so if it is a problem, it is not a recent one… >> >> Is this the expected behavior ? >> >> > -- You received this message because you are subscribed to the Google Groups "sage-support" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-support+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-support/5b389532-91fb-4e33-b8f4-b7ad8e21e419n%40googlegroups.com.