See lines #7-8 of the "Minimal example" :
Le mercredi 2 février 2022 à 11:57:41 UTC+1, [email protected] a
écrit :
>
> What is v0? When I run the above it isn't defined.
> On Monday, January 31, 2022 at 11:19:49 PM UTC Emmanuel Charpentier wrote:
>
>> As advertised, an atempt at a minimal (non-)working example :
>>
>> # Reproducible minimal example
>> with seed(0): M = matrix(AA, 3, 3, lambda u,v: AA.random_element())
>> # Working ring
>> WR = M.base_ring().algebraic_closure()
>> # A variable to carry the eigenvalues
>> l = SR.var("l")
>>
>>
Here is the definition you seek :
>
>> # Vector of unknowns for the eigenvectors
>> V =vector(list(var("v", n=2))+[SR(1)])
>>
>>
Is that clearer ?
>
>> # M.eigenvalues does not return. Get them by hand
>> # Equation determining the eigenspace
>> ESE = M-l*identity_matrix(WR, 3)
>> # Eigenvalues
>> EVa = ESE.det().roots(ring=WR)
>> # M.eigenvectors_left() doesn't return.
>> # Set up a system of equations whose roots define the eigenvectors.
>> Sys = ESE*V
>> # Solve for each eigenvalue
>> # solve([u.subs(l==EVa[0][0]) for u in Sys],list(V[:2])) fails.
>> # Try to solve manually by substitution
>> # First equation, first variable.
>> # solve(Sys[0].subs(l==EVa[0][0]), v0) fails.
>> # Try to solve by explicit algebraic manipulation
>> E00 = Sys[0].subs(l==EVa[0][0])
>> # Isolate v0
>> V00=E0/E00.coefficient(v0) # fast
>>
>> At this point, tryoing to proint V00‘s value “never returns”. However, a
>> forst interruption (C-C) prints :
>>
>> sage: V00
>> 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: 'AlgebraicNumber' object has no attribute
>> '_minimal_polynomial'
>>
>> During handling of the above exception, another exception occurred:
>>
>> KeyboardInterrupt Traceback (most recent call last)
>> /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.__richcmp__
>> (build/cythonized/sage/structure/element.c:10418)()
>> 1110 return (<Element>self)._richcmp_(other, op)
>> 1111 else:
>> -> 1112 return coercion_model.richcmp(self, other, op)
>> 1113
>> 1114 cpdef _richcmp_(left, right, int op):
>>
>> /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/structure/coerce.pyx
>> in sage.structure.coerce.CoercionModel.richcmp
>> (build/cythonized/sage/structure/coerce.c:20625)()
>> 1979 assert not (isinstance(x, Element) and
>> 1980
>> (<Element>x)._parent.get_flag(Parent_richcmp_element_without_coercion))
>> -> 1981 return PyObject_RichCompare(x, y, op)
>> 1982
>> 1983 # Comparing with coercion didn't work, try something else.
>>
>> /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.__richcmp__
>> (build/cythonized/sage/structure/element.c:10394)()
>> 1108 # an instance of Element. The explicit casts below make
>> 1109 # Cython generate optimized code for this call.
>> -> 1110 return (<Element>self)._richcmp_(other, op)
>> 1111 else:
>> 1112 return coercion_model.richcmp(self, other, op)
>>
>> /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._richcmp_
>> (build/cythonized/sage/structure/element.c:10500)()
>> 1112 return coercion_model.richcmp(self, other, op)
>> 1113
>> -> 1114 cpdef _richcmp_(left, right, int op):
>> 1115 r"""
>> 1116 Basic default implementation of rich comparisons for
>> elements with
>>
>> /usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py
>> in _richcmp_(self, other, op)
>> 4897 ci1 = self._value.imag().abs()
>> 4898 ci2 = other._value.imag().abs()
>> -> 4899 if ci1.overlaps(ci2) and self.minpoly() == other.minpoly():
>> 4900 c = cmp_elements_with_same_minpoly(self, other,
>> self.minpoly())
>> 4901 if c is not None:
>>
>> /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)
>> 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)
>> 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()
>>
>> and a *second* interrupt prints :
>>
>> KeyboardInterrupt:
>> Exception ignored in: 'sage.symbolic.expression.py_is_integer'
>> Traceback (most recent call last):
>> File "sage/structure/parent.pyx", line 1163, in
>> sage.structure.parent.Parent.__contains__
>> (build/cythonized/sage/structure/parent.c:10408)
>> File "sage/structure/parent.pyx", line 898, in
>> sage.structure.parent.Parent.__call__
>> (build/cythonized/sage/structure/parent.c:9388)
>> File "sage/structure/coerce_maps.pyx", line 287, in
>> sage.structure.coerce_maps.NamedConvertMap._call_
>> (build/cythonized/sage/structure/coerce_maps.c:6085)
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 5011, in _integer_
>> return AA(self)._integer_(ZZ)
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 5485, in _integer_
>> self.exactify()
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 4365, in exactify
>> self._set_descr(self._descr.exactify())
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 8182, in exactify
>> arg.exactify()
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 4365, in exactify
>> self._set_descr(self._descr.exactify())
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 8431, in exactify
>> left.exactify()
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 4365, in exactify
>> self._set_descr(self._descr.exactify())
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 8431, in exactify
>> left.exactify()
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 4365, in exactify
>> self._set_descr(self._descr.exactify())
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 8433, in exactify
>> gen = left._exact_field().union(right._exact_field())
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 3232, in union
>> pari_nf = self.pari_field()
>> File
>> "/usr/local/sage-9/local/var/lib/sage/venv-python3.9/lib/python3.9/site-packages/sage/rings/qqbar.py",
>> line 3136, in pari_field
>> self._pari_field = pari_pol.nfinit(1)
>> File "cypari2/auto_gen.pxi", line 23641, in cypari2.gen.Gen_base.nfinit
>> KeyboardInterrupt:
>> 1.000000000000000?*v0 - 35.57125011095806?*v1 - 492.8896998473554?
>>
>> Similarly, V00.coefficient(v0).is_one() “never returns”.
>> The current aritmetic on algebraics is therefore problematic for this
>> kind of problems.
>> Suggestions ?
>>
>> Le lundi 31 janvier 2022 à 17:59:34 UTC+1, Emmanuel Charpentier a écrit :
>>
>>> Thank you, Nils !
>>> Trying to pinpoint things by running a manual solution step by step, it
>>> seems that the stumbling oint is the division on two algebraics. I'll try
>>> to make a clear minimal example and report it.
>>> Le lundi 31 janvier 2022 à 00:49:22 UTC+1, Nils Bruin a écrit :
>>>
>>>> On Saturday, 29 January 2022 at 13:51:14 UTC-8 Emmanuel Charpentier
>>>> wrote:
>>>>
>>>>> /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:
>>>>>>
>>>>>>
>>>>>> nf_init is a perfectly respectable place to hang. After interruption,
>>>> can you "%debug" and see what the value of pari_pol is? I'd expect that
>>>> nfinit determines the ring of integers, which means factoring the
>>>> discriminant. [QQbar shouldn't need the ring of integers of element
>>>> arithmetic, but this has been stumbled on before: QQbar often tries to
>>>> find
>>>> an "optimized" form of the number field, which for small examples is often
>>>> quite doable and, if you end up doing a LOT of arithmetic in the same
>>>> field, is often worth the investment. However, because of factoring of the
>>>> discriminant, it's fully subexponential in complexity, whereas all the
>>>> things QQbar needs to do are polynomial time. So we already know that
>>>> QQbar
>>>> will do things with the wrong theoretical asymptotic complexity. That can
>>>> come back and bite you, when reality and asymptotics start behaving
>>>> similarly (which happens eventually ... asymptotically speakinh)
>>>>
>>>
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sage-support/80ccf92e-1e2d-4567-852d-981293599544n%40googlegroups.com.