The promlem seems tolie wit (my use of) polynomial rings to compute the eigenvectors. Manually, after executing
dims = M.dimensions() if dims[0] != dims[1]: raise DomainError("Not a square matrix !") dim = dims[0] BR = M.base_ring() try: WR = BR.algebraic_closure() except AttributeError: WR = BR WPR = WR["t"] t = WPR.gens()[0] # CP = WPR(M.charpoly(var="t")) # Eigenvalues CP = M.charpoly(var="t") lambdas = CP.roots(ring=WR) # Eigenvectors Id = identity_matrix(WR,dim) WM = M.apply_map(lambda u:WR(u)) PR = PolynomialRing(WR,list(("v%d"%u for u in range(dim)))) J=PR.ideal(*(WM-Id*lambdas[0][0])*vector(PR.gens())) neither J.dimension() nor J.variety() returns ; the interruption gives : sage: J.dimension() C-c C-c--------------------------------------------------------------------------- KeyboardInterrupt Traceback (most recent call last) <ipython-input-684-2e62bddf16b7> in <module> ----> 1 J.dimension() /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/polynomial/multi_polynomial_ideal.py in __call__(self, *args, **kwds) 295 if not R.base_ring().is_field(): 296 raise ValueError("Coefficient ring must be a field for function '%s'."%(self.f.__name__)) --> 297 return self.f(self._instance, *args, **kwds) 298 299 require_field = RequireField /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar_decorators.py in wrapper(*args, **kwds) 111 # same_field=True might trigger an exception otherwise. 112 --> 113 numfield, new_elems, morphism = number_field_elements_from_algebraics(orig_elems, same_field=True, minimal=True) 114 115 elem_dict = dict(zip(orig_elems, new_elems)) /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py in number_field_elements_from_algebraics(numbers, minimal, same_field, embedded, prec) 2759 real_numbers = [] 2760 for v in numbers: -> 2761 if v._exact_field().is_complex() and real_case: 2762 # the number comes from a complex algebraic number field 2763 embedded_rt = v.interval_fast(RealIntervalField(prec)) /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py in _exact_field(self) 4428 if isinstance(sd, (ANRational, ANExtensionElement)): 4429 return sd.generator() -> 4430 self.exactify() 4431 return self._exact_field() 4432 /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py in exactify(self) 4363 if isinstance(od, (ANRational, ANExtensionElement)): 4364 return -> 4365 self._set_descr(self._descr.exactify()) 4366 4367 def _set_descr(self, new_descr): /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py in exactify(self) 8180 8181 if op == 'real': -> 8182 arg.exactify() 8183 rv = (arg + arg.conjugate()) / 2 8184 rv.exactify() /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py in exactify(self) 4363 if isinstance(od, (ANRational, ANExtensionElement)): 4364 return -> 4365 self._set_descr(self._descr.exactify()) 4366 4367 def _set_descr(self, new_descr): /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py in exactify(self) 8429 left = self._left 8430 right = self._right -> 8431 left.exactify() 8432 right.exactify() 8433 gen = left._exact_field().union(right._exact_field()) /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py in exactify(self) 4363 if isinstance(od, (ANRational, ANExtensionElement)): 4364 return -> 4365 self._set_descr(self._descr.exactify()) 4366 4367 def _set_descr(self, new_descr): /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py in exactify(self) 8431 left.exactify() 8432 right.exactify() -> 8433 gen = left._exact_field().union(right._exact_field()) 8434 left_value = gen(left._exact_value()) 8435 right_value = gen(right._exact_value()) /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py in union(self, other) 3230 op = QQx(op) 3231 # pari_nf = self._field.pari_nf() -> 3232 pari_nf = self.pari_field() 3233 factors = list(pari_nf.nffactor(op).lift())[0] 3234 x, y = QQxy.gens() /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py in pari_field(self) 3134 if self._pari_field is None: 3135 pari_pol = self._field.pari_polynomial("y") -> 3136 self._pari_field = pari_pol.nfinit(1) 3137 return self._pari_field 3138 cypari2/auto_gen.pxi in cypari2.gen.Gen_base.nfinit() KeyboardInterrupt: Suggestions ? Le samedi 29 janvier 2022 à 15:34:05 UTC+1, Emmanuel Charpentier a écrit : > Setup : Sage 9.5.rc1 running in Debian testing on core i7 + 16 GB RAM. > > def test(Size=2, Ring=QQ): > from time import time as stime > with seed(0): > M = matrix(Ring, Size, Size, lambda u, v:Ring.random_element()) > t0 = stime() > SL = M.eigenspaces_left(algebraic_multiplicity=True) > t1 = stime() > VL = M.eigenvectors_left() > t2 = stime() > return t1-t0, SL, t2-t1, VL > > test() runs as expected, as well as test(Size=5) and test(Ring=AA), with > very reasonable runtimes (under a second, IIRC). But test(Size=3, Ring=AA) > “never returns” (meaning that it hadn’t returned when I interrupted it > after tens of minutes). Further exploration showec that neither > M.eigenspaces_left(algebraic_multiplicity=True) nor M.eigenvectors_left() > return. > > Is that an expected behaviour ? > > FWIW, stack trace at interruption : > > sage: AA3=test(Size=3, Ring=AA) > AA3=test(Size=3, Ring=AA) C-c > C-c--------------------------------------------------------------------------- > AttributeError Traceback (most recent call last) > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in minpoly(self) > 4492 try: > -> 4493 return self._minimal_polynomial > 4494 except AttributeError: > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/structure/element.pyx > in sage.structure.element.Element.__getattr__ > (build/cythonized/sage/structure/element.c:4754)() > 493 """ > --> 494 return self.getattr_from_category(name) > 495 > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/structure/element.pyx > in sage.structure.element.Element.getattr_from_category > (build/cythonized/sage/structure/element.c:4866)() > 506 cls = P._abstract_element_class > --> 507 return getattr_from_other_class(self, cls, name) > 508 > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/cpython/getattr.pyx > in sage.cpython.getattr.getattr_from_other_class > (build/cythonized/sage/cpython/getattr.c:2633)() > 360 dummy_error_message.name = name > --> 361 raise AttributeError(dummy_error_message) > 362 attribute = <object>attr > > AttributeError: 'sage.rings.real_mpfi.RealIntervalFieldElement' object has no > attribute '_evaluate_polynomial' > > During handling of the above exception, another exception occurred: > > KeyboardInterrupt Traceback (most recent call last) > <ipython-input-344-ff7c46010ad2> in <module> > ----> 1 AA3=test(Size=Integer(3), Ring=AA) > > <string> in test(Size, Ring) > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/matrix/matrix2.pyx > in sage.matrix.matrix2.Matrix.eigenspaces_left > (build/cythonized/sage/matrix/matrix2.c:43588)() > 6270 self = self.change_ring(F) > 6271 A = self - alpha > -> 6272 W = A.kernel() > 6273 V.append((alpha, > W.ambient_module().span_of_basis(W.basis()), e)) > 6274 else: > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/matrix/matrix2.pyx > in sage.matrix.matrix2.Matrix.left_kernel > (build/cythonized/sage/matrix/matrix2.c:32440)() > 4947 > 4948 tm = verbose("computing left kernel for %sx%s matrix" % > (self.nrows(), self.ncols()),level=1) > -> 4949 K = self.transpose().right_kernel(*args, **kwds) > 4950 self.cache('left_kernel', K) > 4951 verbose("done computing left kernel for %sx%s matrix" % > (self.nrows(), self.ncols()),level=1,t=tm) > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/matrix/matrix2.pyx > in sage.matrix.matrix2.Matrix.right_kernel > (build/cythonized/sage/matrix/matrix2.c:31909)() > 4785 > 4786 # Go get the kernel matrix, this is where it all happens > -> 4787 M = self.right_kernel_matrix(*args, **kwds) > 4788 > 4789 ambient = R**self.ncols() > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/matrix/matrix2.pyx > in sage.matrix.matrix2.Matrix.right_kernel_matrix > (build/cythonized/sage/matrix/matrix2.c:30829)() > 4394 > 4395 if M is None and R in _Fields: > -> 4396 format, M = self._right_kernel_matrix_over_field() > 4397 > 4398 if M is None and R.is_integral_domain(): > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/matrix/matrix2.pyx > in sage.matrix.matrix2.Matrix._right_kernel_matrix_over_field > (build/cythonized/sage/matrix/matrix2.c:27969)() > 3686 from sage.matrix.matrix_space import MatrixSpace > 3687 tm = verbose("computing right kernel matrix over an arbitrary > field for %sx%s matrix" % (self.nrows(), self.ncols()),level=1) > -> 3688 E = self.echelon_form(*args, **kwds) > 3689 pivots = E.pivots() > 3690 pivots_set = set(pivots) > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/matrix/matrix2.pyx > in sage.matrix.matrix2.Matrix.echelon_form > (build/cythonized/sage/matrix/matrix2.c:52440)() > 7686 E = self.__copy__() > 7687 if algorithm == 'default': > -> 7688 v = E.echelonize(cutoff=cutoff, **kwds) > 7689 else: > 7690 v = E.echelonize(algorithm = algorithm, cutoff=cutoff, > **kwds) > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/matrix/matrix2.pyx > in sage.matrix.matrix2.Matrix.echelonize > (build/cythonized/sage/matrix/matrix2.c:51817)() > 7583 if self.base_ring() in _Fields: > 7584 if algorithm in ['classical', 'partial_pivoting', > 'scaled_partial_pivoting', 'scaled_partial_pivoting_valuation']: > -> 7585 self._echelon_in_place(algorithm) > 7586 elif algorithm == 'strassen': > 7587 self._echelon_strassen(cutoff) > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/matrix/matrix2.pyx > in sage.matrix.matrix2.Matrix._echelon_in_place > (build/cythonized/sage/matrix/matrix2.c:53308)() > 7848 sig_check() > 7849 for r in range(start_row, nr): > -> 7850 if A.get_unsafe(r, c): > 7851 pivots.append(c) > 7852 a_inverse = ~A.get_unsafe(r, c) > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in __bool__(self) > 4043 right = sd._right if op is operator.sub else -sd._right > 4044 > -> 4045 lp = left.minpoly() > 4046 rp = right.minpoly() > 4047 if lp != rp: > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in minpoly(self) > 4493 return self._minimal_polynomial > 4494 except AttributeError: > -> 4495 self.exactify() > 4496 self._minimal_polynomial = self._descr.minpoly() > 4497 return self._minimal_polynomial > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in exactify(self) > 4363 if isinstance(od, (ANRational, ANExtensionElement)): > 4364 return > -> 4365 self._set_descr(self._descr.exactify()) > 4366 > 4367 def _set_descr(self, new_descr): > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in exactify(self) > 8430 right = self._right > 8431 left.exactify() > -> 8432 right.exactify() > 8433 gen = left._exact_field().union(right._exact_field()) > 8434 left_value = gen(left._exact_value()) > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in exactify(self) > 4363 if isinstance(od, (ANRational, ANExtensionElement)): > 4364 return > -> 4365 self._set_descr(self._descr.exactify()) > 4366 > 4367 def _set_descr(self, new_descr): > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in exactify(self) > 8430 right = self._right > 8431 left.exactify() > -> 8432 right.exactify() > 8433 gen = left._exact_field().union(right._exact_field()) > 8434 left_value = gen(left._exact_value()) > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in exactify(self) > 4363 if isinstance(od, (ANRational, ANExtensionElement)): > 4364 return > -> 4365 self._set_descr(self._descr.exactify()) > 4366 > 4367 def _set_descr(self, new_descr): > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in exactify(self) > 8430 right = self._right > 8431 left.exactify() > -> 8432 right.exactify() > 8433 gen = left._exact_field().union(right._exact_field()) > 8434 left_value = gen(left._exact_value()) > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in exactify(self) > 4363 if isinstance(od, (ANRational, ANExtensionElement)): > 4364 return > -> 4365 self._set_descr(self._descr.exactify()) > 4366 > 4367 def _set_descr(self, new_descr): > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in exactify(self) > 8176 > 8177 if op == '~': > -> 8178 arg.exactify() > 8179 return arg._descr.invert(None) > 8180 > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in exactify(self) > 4363 if isinstance(od, (ANRational, ANExtensionElement)): > 4364 return > -> 4365 self._set_descr(self._descr.exactify()) > 4366 > 4367 def _set_descr(self, new_descr): > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in exactify(self) > 8431 left.exactify() > 8432 right.exactify() > -> 8433 gen = left._exact_field().union(right._exact_field()) > 8434 left_value = gen(left._exact_value()) > 8435 right_value = gen(right._exact_value()) > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in union(self, other) > 3230 op = QQx(op) > 3231 # pari_nf = self._field.pari_nf() > -> 3232 pari_nf = self.pari_field() > 3233 factors = list(pari_nf.nffactor(op).lift())[0] > 3234 x, y = QQxy.gens() > > /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py > in pari_field(self) > 3134 if self._pari_field is None: > 3135 pari_pol = self._field.pari_polynomial("y") > -> 3136 self._pari_field = pari_pol.nfinit(1) > 3137 return self._pari_field > 3138 > > cypari2/auto_gen.pxi in cypari2.gen.Gen_base.nfinit() > KeyboardInterrupt: > > Any hint appreciated… > > -- 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/c17079fa-1d14-40ec-9cdd-49271cabd7ean%40googlegroups.com.