U
    me                     @   s    d dl mZ dd Zdd ZdS )    wrapsc                    s   |   fdd}|S )z}
    Memo decorator for sequences defined by recurrence

    See usage examples e.g. in the specfun/combinatorial module
    c                    s   t   fdd}|S )Nc                    sH   t  }| |d kr |  S t|| d D ]} |  q* d S )N   lenrangeappend)nLi)cachef ?/tmp/pip-unpacked-wheel-rdz2gdd2/sympy/utilities/memoization.pyg   s    z-recurrence_memo.<locals>.decorator.<locals>.gr   r   r   r   r   r   	decorator   s    z"recurrence_memo.<locals>.decoratorr   )initialr   r   r   r   recurrence_memo   s    
r   c                    s   g  fdd}|S )z
    Memo decorator for associated sequences defined by recurrence starting from base

    base_seq(n) -- callable to get base sequence elements

    XXX works only for Pn0 = base_seq(0) cases
    XXX works only for m <= n cases
    c                    s   t   fdd}|S )Nc                    s~   t }| |k r|  | S t|| d D ]F} |}|g}| td|d D ]}||}|| qTq*|  | S )Nr   r   )r
   mr   r   ZF_i0Z	F_i_cachejZF_ij)base_seqr   r   r   r   r   &   s    
z3assoc_recurrence_memo.<locals>.decorator.<locals>.gr   r   r   r   r   r   r   %   s    z(assoc_recurrence_memo.<locals>.decoratorr   )r   r   r   r   r   assoc_recurrence_memo   s    
r   N)	functoolsr   r   r   r   r   r   r   <module>   s   