o
    à8VaI  ã                   @   sT   d dl mZmZmZmZ d dlmZ d dlmZm	Z	 d dl
mZ dd„ Zdd„ Zd	S )
é    )ÚFunctionÚPowÚsympifyÚExpr)Ú
Relational)ÚPolyÚ	decompose)Ú	func_namec           	         s@  t | ƒ} t| tƒrt| tƒrtdt| ƒ ƒ‚ˆ | jvr| gS g }t| ttfƒrVddl	m
} | jr:| j|jkr:| j}n| jd }|ˆ krF| gS ||  |ˆ ¡gt|ˆ ƒ 7 }|S t| ƒ}tt‡ fdd„|jƒƒ}t|ƒdkrŠ|d ˆ krŠ|  |d ˆ ¡}|d }||gt|ˆ ƒ 7 }|S z	|t| ƒ7 }|W S  tyŸ   | g Y S w )ae  
    Computes General functional decomposition of ``f``.
    Given an expression ``f``, returns a list ``[f_1, f_2, ..., f_n]``,
    where::
              f = f_1 o f_2 o ... f_n = f_1(f_2(... f_n))

    Note: This is a General decomposition function. It also decomposes
    Polynomials. For only Polynomial decomposition see ``decompose`` in polys.

    Examples
    ========

    >>> from sympy.solvers.decompogen import decompogen
    >>> from sympy.abc import x
    >>> from sympy import sqrt, sin, cos
    >>> decompogen(sin(cos(x)), x)
    [sin(x), cos(x)]
    >>> decompogen(sin(x)**2 + sin(x) + 1, x)
    [x**2 + x + 1, sin(x)]
    >>> decompogen(sqrt(6*x**2 - 5), x)
    [sqrt(x), 6*x**2 - 5]
    >>> decompogen(sin(sqrt(cos(x**2 + 1))), x)
    [sin(x), sqrt(x), cos(x), x**2 + 1]
    >>> decompogen(x**4 + 2*x**3 - x - 1, x)
    [x**2 - x - 1, x**2 + x]

    zexpecting Expr but got: `%s`r   )ÚSc                    s
   ˆ | j v S )N)Úfree_symbols)Úx©Úsymbol© ú:/usr/lib/python3/dist-packages/sympy/solvers/decompogen.pyÚ<lambda>9   s   
 zdecompogen.<locals>.<lambda>é   )r   Ú
isinstancer   r   Ú	TypeErrorr	   r   r   r   Zsympyr
   Zis_PowÚbaseZExp1ZexpÚargsÚsubsÚ
decompogenr   ÚlistÚfilterÚgensÚlenr   Ú
ValueError)	Úfr   Úresultr
   ÚargÚfpr   Úf1Úf2r   r   r   r      s8   


ÿr   c                 C   sP   t | ƒdkr
| d S | d  || d ¡}t | ƒdkr|S t|g| dd…  |ƒS )a0  
    Returns the composition of functions.
    Given a list of functions ``g_s``, returns their composition ``f``,
    where:
        f = g_1 o g_2 o .. o g_n

    Note: This is a General composition function. It also composes Polynomials.
    For only Polynomial composition see ``compose`` in polys.

    Examples
    ========

    >>> from sympy.solvers.decompogen import compogen
    >>> from sympy.abc import x
    >>> from sympy import sqrt, sin, cos
    >>> compogen([sin(x), cos(x)], x)
    sin(cos(x))
    >>> compogen([x**2 + x + 1, sin(x)], x)
    sin(x)**2 + sin(x) + 1
    >>> compogen([sqrt(x), 6*x**2 - 5], x)
    sqrt(6*x**2 - 5)
    >>> compogen([sin(x), sqrt(x), cos(x), x**2 + 1], x)
    sin(sqrt(cos(x**2 + 1)))
    >>> compogen([x**2 - x - 1, x**2 + x], x)
    -x**2 - x + (x**2 + x)**2 - 1
    r   r   é   N)r   r   Úcompogen)Zg_sr   Zfoor   r   r   r%   I   s   r%   N)Z
sympy.corer   r   r   r   Zsympy.core.relationalr   Zsympy.polysr   r   Zsympy.utilities.miscr	   r   r%   r   r   r   r   Ú<module>   s    B