Re: [sympy] Re: Real-Root Isolation

2024-05-22 Thread Chris Smith
You might try def distinct_intervals(p): P=Poly(p) iv = P.intervals() print(iv) for i in range(len(iv)-1): (lo,hi),n=iv[i] (LO,HI),N=iv[i+1] while hi==LO: if lo!=hi: (lo,hi),n=iv[i]=P.refine_root(lo,hi,(hi-lo)/2),n else: assert LO!=HI (LO,HI),N=iv[i+1]=P.refine_root(LO,HI,(HI-LO)/2),N return i

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Oscar Benjamin
On Wed, 22 May 2024 at 01:10, Ani J wrote: > > Thank you for the quick response. > > Yes, it looks like refine_root() does the job more efficiently. Thank you for > the note. > > I am facing issues in getting _find_poly_sign_univariate function to work. > When I run from sympy import find_poly_si

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Ani J
Thank you for the quick response. Yes, it looks like refine_root() does the job more efficiently. Thank you for the note. I am facing issues in getting _find_poly_sign_univariate function to work. When I run from sympy import find_poly_sign, I get the following error: ImportError: cannot imp

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Oscar Benjamin
On Wed, 22 May 2024 at 00:23, Ani J wrote: > > The polynomial 4x^2 - 9 has rational roots, whereas the output of the print > statement is: [((-2, -1), 1), ((1, 2), 1)] > All intervals here are of length more than 0. > It would be great if in general it is possible that the endpoints of > differe

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Aaron Meurer
Ah, I was afraid of that. Looking at the code, I'm not sure if the algorithm provides a better way than continually refining with smaller epsilon until you get a separation, but I don't know the details of the algorithm so that could be wrong. I will note that you can use refine_root() once you hav

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Ani J
On Tuesday, May 21, 2024 at 3:49:12 PM UTC-7 Oscar wrote: On Tue, 21 May 2024 at 22:02, Aaron Meurer wrote: > > IMO, we should just fix the function to not return intersecting > endpoints in the first place. The intervals aren't really isolating if > they intersect. For rational roots the

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Oscar Benjamin
On Tue, 21 May 2024 at 22:02, Aaron Meurer wrote: > > IMO, we should just fix the function to not return intersecting > endpoints in the first place. The intervals aren't really isolating if > they intersect. For rational roots the intervals are of length 0. For irrational roots the root lies in

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Ani J
It doesn't look like just taking the minimum length works. Consider the following program: - from sympy import Poly - from sympy.abc import x - from sympy import div, ZZ, QQ, RR - p = Poly(x**6 + 19/5*x**5 + 131/50*x**4 - x**2 - 19/5*x - 131/50, x, domain='QQ') - print(p.interv

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Aaron Meurer
I'm not sure if it's enough to just take the minimum length of the intervals that overlap and set eps to something smaller than that. Someone more familiar with the inner workings of the algorithm would have to verify whether that would work or if it could still leave intersecting endpoints. IMO,

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Ani J
Yes, this seems like a good option, so keep reducing eps in a while loop until the endpoints of all intervals are different, right? On Tuesday, May 21, 2024 at 1:55:54 PM UTC-7 asme...@gmail.com wrote: > I don't know if there's an existing option to do this. It seems like > it would be useful. Y

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Aaron Meurer
I don't know if there's an existing option to do this. It seems like it would be useful. You can always lower the eps to make the intervals smaller: >>> Poly(x**6 + 19/5*x**5 + 131/50*x**4 - x**2 - 19/5*x - 131/50, x, >>> domain='QQ').intervals(eps=0.1) [((-29/10, -26/9), 1), ((-1, -1), 1), ((-10

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Ani J
Oh! I see, but i believe that the intervals overlap on the endpoints, is it possible to make the intervals completely disjoint?? For example consider the following program: - from sympy import Poly - from sympy.abc import x - from sympy import div, QQ - p = Poly(x**6 + 19/5*x**5 + 1

Re: [sympy] Re: Real-Root Isolation

2024-05-21 Thread Aaron Meurer
Yes, this is the case. The documentation for this method could perhaps be improved, but the key word is "isolating", meaning each interval contains exactly one root. You can also read more about the algorithm that is referenced in the docstring https://en.wikipedia.org/wiki/Vincent%27s_theorem Aar

[sympy] Re: Real-Root Isolation

2024-05-21 Thread Chris Smith
I strongly suspect that the roots returned by `Poly.intervals` have only one root in them (by definition). If you use `refine_root(lo,hi,eps)` to refine the root bounds to arbitrary width and give it an interval in which there is more than one root, it will raise an error. /c On Tuesday, May 2