B
    dd1+                 @   s  d Z ddlmZmZmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZmZmZmZ ddlmZmZmZmZmZmZ dd	lmZ dd
lmZ ddl m!Z! ddl"m#Z#m$Z$ ddl%m&Z& ddl'm(Z(m)Z)m*Z* e)d@ddZ+e)dAddZ,e)dd Z-e)edfddZ.e)dBddZ/dd Z0dd  Z1d!d" Z2d#d$ Z3d%d& Z4d'd( Z5dd)l6m7Z7 d*d+ Z8d,d- Z9d.d/ Z:d0d1 Z;d2d3 Z<d4d5 Z=d6d7 Z>d8d9 Z?d:d; Z@d<d= ZAd>d? ZBdS )CzIFunctions for generating interesting polynomials, e.g. for benchmarking.     )AddMulSymbolsympifyDummysymbols)Tuple)S)sqrt)	nextprime)dmp_add_termdmp_negdmp_muldmp_sqr)dmp_zerodmp_one
dmp_grounddup_from_raw_dict	dmp_raise
dup_random)ZZ)dup_zz_cyclotomic_poly)DMP)PolyPurePoly)_analyze_gens)subsetspublic
filldedentNFc             C   s  ddl m} | dkr td|  |dk	r2t| ntd}| dkrd}tdg}x,td| d D ]}t|}|t| q`W |t	| ||d	S | dkr|d d }n\| dkr|d
 d|d   d }n:| dkr|d d|d   d|d
   d|d   d }|rt
||S |S )a  Generates n-th Swinnerton-Dyer polynomial in `x`.

    Parameters
    ----------
    n : int
        `n` decides the order of polynomial
    x : optional
    polys : bool, optional
        ``polys=True`` returns an expression, otherwise
        (default) returns an expression.
       )minimal_polynomialr   z6Cannot generate Swinnerton-Dyer polynomial of order %sNx      )polys   
      (      i`  i  i@  )Znumberfieldsr    
ValueErrorr   r   r
   ranger   appendr   r   )nr!   r$   r    paiex r2   e/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sympy/polys/specialpolys.pyswinnerton_dyer_poly   s*    



0r4   c             C   s^   | dkrt d|  ttt| tt}|dk	r>t||}nt|td}|rV|S |	 S )a  Generates cyclotomic polynomial of order `n` in `x`.

    Parameters
    ----------
    n : int
        `n` decides the order of polynomial
    x : optional
    polys : bool, optional
        ``polys=True`` returns an expression, otherwise
        (default) returns an expression.
    r   z1Cannot generate cyclotomic polynomial of order %sNr!   )
r*   r   r   intr   r   newr   r   as_expr)r-   r!   r$   polyr2   r2   r3   cyclotomic_polyA   s    
r9   c             O   s|   t |}| dk s | t|ks |s2td| |f n(| s>tj}ntdd t|t| D  }|ddsj|S t	|f| S dS )zGenerates symmetric polynomial of order `n`.

    Returns a Poly object when ``polys=True``, otherwise
    (default) returns an expression.
    r   z7Cannot generate symmetric polynomial of order %s for %sc             S   s   g | ]}t | qS r2   )r   ).0sr2   r2   r3   
<listcomp>k   s    z"symmetric_poly.<locals>.<listcomp>r$   FN)
r   lenr*   r	   ZOner   r   r5   getr   )r-   Zgensargsr8   r2   r2   r3   symmetric_poly\   s    r@   c             C   s(   t t||||| |d}|r |S | S )a\  Generates a polynomial of degree ``n`` with coefficients in
    ``[inf, sup]``.

    Parameters
    ----------
    x
        `x` is the independent term of polynomial
    n : int
        `n` decides the order of polynomial
    inf
        Lower limit of range in which coefficients lie
    sup
        Upper limit of range in which coefficients lie
    domain : optional
         Decides what ring the coefficients are supposed
         to belong. Default is set to Integers.
    polys : bool, optional
        ``polys=True`` returns an expression, otherwise
        (default) returns an expression.
    )domain)r   r   r7   )r!   r-   infsuprA   r$   r8   r2   r2   r3   random_polys   s    rD   r!   yc       	         s  t dd}t tr(td | f  n|r>|t  j@ r>d}t|trZtd|| f }n|rp|t| j@ rpd}|sttdg }t fddt	| D  }xJt	| D ]>|    }t fddt	| D  }|
||  qW td	d t||D  S )
zConstruct Lagrange interpolating polynomial for ``n``
    data points. If a sequence of values are given for ``X`` and ``Y``
    then the first ``n`` values will be used.
    free_symbolsNz%s:%sFz~
            Expecting symbol for x that does not appear in X or Y.
            Use `interpolate(list(zip(X, Y)), x)` instead.c                s   g | ]} |  qS r2   r2   )r:   r0   )Xr!   r2   r3   r<      s    z&interpolating_poly.<locals>.<listcomp>c                s$   g | ]}|kr   |  qS r2   r2   )r:   j)rG   r0   r2   r3   r<      s    c             S   s   g | ]\}}|| qS r2   r2   )r:   ZcoeffrE   r2   r2   r3   r<      s    )getattr
isinstancestrr   r   rF   r*   r   r   r+   r,   r   zip)	r-   r!   rG   YokZcoeffsZnumertZnumerdenomr2   )rG   r0   r!   r3   interpolating_poly   s&    

rP   c       	      C   s   dd t | d D }|d |d  }}|tdd |dd D   }|d tdd |dd D   }|d |d  j| }|d d	| |d  |d  d  j| }td
| }|||fS )z%Fateman's GCD benchmark: trivial GCD c             S   s   g | ]}t d t| qS )y_)r   rK   )r:   r0   r2   r2   r3   r<      s    z$fateman_poly_F_1.<locals>.<listcomp>r   r   c             S   s   g | ]}|qS r2   r2   )r:   rE   r2   r2   r3   r<      s    Nr#   c             S   s   g | ]}|d  qS )r#   r2   )r:   rE   r2   r2   r3   r<      s    )r   )r+   r   Zas_polyr   )	r-   rM   y_0Zy_1uvFGHr2   r2   r3   fateman_poly_F_1   s    "*rY   c             C   s.  |d|dg}xt | D ]}t|||g}qW |d|d|dg}x&t d| D ]}t||t||g}qRW | d }t|t|d|d| |}t|t|d|d| |}|d |dgg |d|d|d gg}t|t|d|d| |}	t||d|}
t||| |}t|	|
| |}t| |}|||fS )z%Fateman's GCD benchmark: trivial GCD r   r   r#   r"   )r+   r   r   r   r   r   r   )r-   KrT   r0   rU   mUVfWrM   rV   rW   rX   r2   r2   r3   dmp_fateman_poly_F_1   s     ,
r`   c             C   s   dd t | d D }|d }tdd |dd D  }t|| d d f| }t|| d d f| }t|| d d f| }|| || |fS )z7Fateman's GCD benchmark: linearly dense quartic inputs c             S   s   g | ]}t d t| qS )rQ   )r   rK   )r:   r0   r2   r2   r3   r<      s    z$fateman_poly_F_2.<locals>.<listcomp>r   r   c             S   s   g | ]}|qS r2   r2   )r:   rE   r2   r2   r3   r<      s    Nr#   )r+   r   r   )r-   rM   rS   rT   rX   rV   rW   r2   r2   r3   fateman_poly_F_2   s    ra   c       	      C   s   |d|dg}x"t | d D ]}t|||g}qW | d }t|t|d|d d| |}tt||t|||g| |}tt|||g| |}t|t|d |d| |}tt|||g| |}t||| |t||| ||fS )z7Fateman's GCD benchmark: linearly dense quartic inputs r   r   r#   )r+   r   r   r   r   r   r   )	r-   rZ   rT   r0   r[   rU   r^   ghr2   r2   r3   dmp_fateman_poly_F_2   s    rd   c                s   dd t  d D }|d }t fdd|dd D  }t| d  | d d f| }t| d  | d d f| }t| d  | d d f| }|| || |fS )z8Fateman's GCD benchmark: sparse inputs (deg f ~ vars f) c             S   s   g | ]}t d t| qS )rQ   )r   rK   )r:   r0   r2   r2   r3   r<     s    z$fateman_poly_F_3.<locals>.<listcomp>r   r   c                s   g | ]}| d   qS )r   r2   )r:   rE   )r-   r2   r3   r<   
  s    Nr#   )r+   r   r   )r-   rM   rS   rT   rX   rV   rW   r2   )r-   r3   fateman_poly_F_3  s    """re   c             C   s*  t | d |ji|}x6td| d D ]$}t|gt||| d |d |}q$W t|t|d| d d| |}ttt|| d |gt| d || d | || |}tt|gt| d || d | || |}t|t| d |d| d |}tt|gt| d || d | || |}t||| |t||| ||fS )z8Fateman's GCD benchmark: sparse inputs (deg f ~ vars f) r   r   r#   )	r   oner+   r   r   r   r   r   r   )r-   rZ   rT   r0   rU   r^   rb   rc   r2   r2   r3   dmp_fateman_poly_F_3  s    $2((rg   )ringc              C   s   t dt\} }}}|d | |d  d|d  | |  d|d  |  d|d   d|  d|d  |d   d|d  |  d|d   ||d   d| |  | d S )Nzx,y,zr#   r"   r%      r)   r   )rh   r   )Rr!   rE   zr2   r2   r3   _f_0+  s    rl   c              C   sr  t dt\} }}}|d | | |d |d  |d   |d |d   d|d  | |  d|d  |  |d |d   d|d  |  ||d  |  d| |d  |  d| |d   || |d   d| | |d   || |  d| |  d| |d   d| |  d	|  |d |d   d|d  |  d| |d   d
| |  d|  d|  d S )Nzx,y,zr"   r#         r&   ib     i,  i@     iX  ip  )rh   r   )rj   r!   rE   rk   r2   r2   r3   _f_1/  s    rq   c              C   s  t dt\} }}}|d |d  |d |d  |  |d | |d   |d |d   |d |d   |d | |  d|d  |  d|d  |  |d |d  |  d|d  |d   |d |d   d|d  |d   ||  d|  d|  d S )Nzx,y,zri   r"   r#   Z      i  )rh   r   )rj   r!   rE   rk   r2   r2   r3   _f_23  s    rt   c              C   s  t dt\} }}}|d |d  |d |d   |d  |d |d  |  |d |  |d |d   |d |d  |d   |d | |d   |d | |  ||d  |d   ||d   || |d   || |d   || |d   |d |  ||d   S )Nzx,y,zri   r#   r%   r"      )rh   r   )rj   r!   rE   rk   r2   r2   r3   _f_37  s    rv   c              C   sT  t dt\} }}}|d  |d  | |d |d  |d   |d |d  |d   d|d  |d   |d	 |d  |d
   |d	 |d  |d   d|d	  |d  |  d|d	  |d  |d   |d	 |d
  |d   |d |d
  |d   d|d  |d
  |d   |d | |d   |d
 |d  |d
   d|d
  |d  |d   |d
 |d  |d
   d|d
  |d  |d   d|d
  |d   d|d
  |d
  |d   |d |d  |d	   d|d  |d  |d
   |d |d  |d	   d|d  |d
  |d
   d|d  |d
  |d   |d |d  |d   d|d  |d  |d   d|d  | |d
   |d |d   d|d  |d   ||d  |d	   d| |d  |d
   d| |d  |d
   d| |d  |d   |d
 |d   d|d
  |d	   d|d	   d|d
   S )Nzx,y,z	   r'   ri   r"   ru      r#   r)   r%   rs      )rh   r   )rj   r!   rE   rk   r2   r2   r3   _f_4;  s    rz   c              C   s   t dt\} }}}|d  d|d  |  d|d  |  d| |d   d| | |  d| |d   |d  d|d  |  d| |d   |d  S )Nzx,y,zr"   r#   r)   )rh   r   )rj   r!   rE   rk   r2   r2   r3   _f_5?  s    r{   c              C   s@  t dt\} }}}}d|d  | d|d  |d  |d   d|d  |d   d| |d   d| |d   d	| | |d   d
| | | |  d|d  |d  |d   d|d  |d   |d |d  |d   |d |d   d|d  |d   d|d  |d   d|d  |d   d| |d   S )Nzx,y,z,tiC  r%   -   r"   r#   i  /      ^   rw   r)   )rh   r   )rj   r!   rE   rk   tr2   r2   r3   _f_6C  s    r   c              C   s  t dt\} }}}d|d  |d  |d  d|d  |d  |d   d|d  |d  |d   d|d  | |d   |d |d  |d   d|d  |d  |  |d |d  |d   d|d  |d  |d   d|d  | |d   d|d  |d   d|d  |d   d|d  |d  |d   d|d  |d  |  d|d  |d  |d   d|d  |d  |d   d|d  |d  |d   d|d  | |d   d|d  | |d   d|d  | |d   d|d  |d  |  |d |d  |d   |d |d  |d   d|d  |d  |d   d	|d  |d  |  d|d  | |d   d|d  | |d   d|d  |d   d|d  |d   d|d  |d   d|d  |d  |d   d|d  |d  |  d|d  | |d   d|d  | |d   d|d  | |d   d| |d  |  d| |d  |d   d| | |  d| |d   d|d   d| |d   S )
Nzx,y,zr%   r)   r#   r"   ri   rx   r'   rw   )rh   r   )rj   r!   rE   rk   r2   r2   r3   _w_1G  s    r   c              C   sx  t dt\} }}d|d  |d  d|d  |d   d|d  |d   d	|d  |d   d
|d  |d   d|d  |d   d|d  |  d|d   |d |d   |d |d   d|d   |d |d   |d |d   d|d  |d   d|d  |d   |d |d   d|d  |d   |d |d   d|d  |d   d|d   d|d   S )Nzx,y   r'   r"   0   r#   ru   ri   H      r)   r%   rx   i$  )rh   r   )rj   r!   rE   r2   r2   r3   _w_2K  s    r   c               C   s    t  t t t t t t fS )N)rl   rq   rt   rv   rz   r{   r   r2   r2   r2   r3   f_polysO  s    r   c               C   s   t  t fS )N)r   r   r2   r2   r2   r3   w_polysR  s    r   )NF)NF)r!   rE   )C__doc__Z
sympy.corer   r   r   r   r   r   Zsympy.core.containersr   Zsympy.core.singletonr	   Z(sympy.functions.elementary.miscellaneousr
   Zsympy.ntheoryr   Zsympy.polys.densearithr   r   r   r   Zsympy.polys.densebasicr   r   r   r   r   r   Zsympy.polys.domainsr   Zsympy.polys.factortoolsr   Zsympy.polys.polyclassesr   Zsympy.polys.polytoolsr   r   Zsympy.polys.polyutilsr   Zsympy.utilitiesr   r   r   r4   r9   r@   rD   rP   rY   r`   ra   rd   re   rg   Zsympy.polys.ringsrh   rl   rq   rt   rv   rz   r{   r   r   r   r   r   r2   r2   r2   r3   <module>   sP     (!