Cancellation of terms will cause that routine trouble.
On Friday, March 18, 2022 at 8:46:25 AM UTC-5 Chris Smith wrote:

> > why do you need an alternative to factoring
>
> I want to separate variables in an expression. It is not important the 
> factors be factored since each factor will be solved for some variable 
> (and, if polynomial, Poly will prefer the unfactored form). So I want the 
> quickest method of finding those unfactored-but-separated-factors of an 
> expression. My tests have shown that if an expression *can* be factored 
> then the separation routine I am using (below) is, on average, about the 
> same as factoring. When the expression cannot be separated the routine is 
> about 3X faster. Times vary a lot, though, ranging from 2X to 20X faster.
>
> def ift(e):
>     """return a separation of variables without resorting to use
>     of `factor`.
>     Examples
>     ========
>     >>> from sympy.solvers.solvers import ift
>     >>> from sympy.abc import a,b,c,d,e,f,g,x,y,z
>     >>> ift(a*b*e + b**2*c*d*f/(-c*d + c*g) + b**2*c*f*g/(c*d - c*g))
>     b*(a*e - b*f)
>     >>> ift((z*(x + y)**2*(2*y + 4)**3).expand())
>     8*z*(x**2 + 2*x*y + y**2)*(y**3 + 6*y**2 + 12*y + 8)
>     """
>     try:from sympy.simplify import bottom_up
>     except:from sympy.core.traversal import bottom_up
>     from sympy.simplify.simplify import signsimp
>     def do(e):
>         free = e.free_symbols
>         if not free or not e.args:
>             return e
>         e = collect(e, free.pop())
>         if e.is_Mul:
>             return e.func(*[do(i) for i in e.args])
>         if not e.is_Add:
>             return e
>         i, d = e.as_independent(Add)
>         if not d:
>             return e
>         return factor_terms(i) + d
>     n, d = [factor_terms(bottom_up(i, do)) for i in e.as_numer_denom()]
>     return factor_terms(signsimp(n/d))
>
> On Wednesday, March 16, 2022 at 5:35:16 PM UTC-5 Oscar wrote:
>
>> On Fri, 11 Mar 2022 at 23:13, Chris Smith <smi...@gmail.com> wrote: 
>> > 
>> > Given two expressions, `p` and `q` 
>> > 
>> > p = x*y + x + y*z 
>> > q = p + z 
>> > 
>> > it is easy to show that `q = (x + z)*(y + 1)`. But I'm wanting to avoid 
>> factoring but would like to know whether a solution for `x` from `p = 0` or 
>> `q = 0` is a factor or not. For `q`, the root `x = -z` represent a simple 
>> factor whereas the root of x = `-yz/(y + 1)` is different. 
>> > 
>> > I'm lacking the vocabulary to differentiate `-z` from `-yz/(y + 1)`. Is 
>> it that the latter has a denominator while the former does not? (And since 
>> the original expression had no denominator then the `-z` represents a 
>> "whole" factor while the other root does not?) 
>>
>> The vocabulary I would use is to say that x + z is a polynomial factor 
>> within the polynomial ring Z[x,y,z] (or Q[x,y,z]) whereas x-yz/(y+1) 
>> is a polynomial factor in the polynomial ring Q(y, z)[x] which is the 
>> ring of polynomials in x whose coefficients are rational functions of 
>> y and z. 
>>
>> > As an alternative to factoring, 
>>
>> Why do you need an alternative to factoring? 
>>
>> It is possible to check if one polynomial is a factor of another 
>> without computing a full factorisation. You can just polynomial 
>> division: 
>>
>> In [18]: p = x*y + x + y*z 
>>
>> In [19]: q = p + z 
>>
>> In [20]: sx = solve(q, x)[0] 
>>
>> In [21]: sx 
>> Out[21]: -z 
>>
>> In [22]: div(q, x - sx) 
>> Out[22]: (y + 1, 0) 
>>
>> In [24]: rem(q, x - sx) 
>> Out[24]: 0 
>>
>> Note the remainder 0. 
>>
>> -- 
>> Oscar 
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sympy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/9626a437-ec34-472e-b862-f46dbfb8efe9n%40googlegroups.com.

Reply via email to