o
    *ήc=+                     @   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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'd?ddZ*e'dd Z+e'edfddZ,e'd@ddZ-dd Z.dd Z/d d! Z0d"d# Z1d$d% Z2d&d' Z3dd(l4m5Z5 d)d* Z6d+d, Z7d-d. Z8d/d0 Z9d1d2 Z:d3d4 Z;d5d6 Z<d7d8 Z=d9d: Z>d;d< Z?d=d> Z@dS )AzIFunctions for generating interesting polynomials, e.g. for benchmarking.     )AddMulSymbolsympifyDummysymbols)Tuple)S)	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kr
t d|  |durt| ntd}| dkrLddlm} ddlm} d	}|d	g}td	| d D ]}t|}|	|| q5|t
| ||d
S | dkrW|d	 d	 }n-| d	krh|d d|d	   d }n| dkr|d d|d   d|d   d|d	   d }|rt||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.
    r   z6Cannot generate Swinnerton-Dyer polynomial of order %sNx   )sqrt   )minimal_polynomial   )polys   
      (      i`  i  i@  )
ValueErrorr   r   (sympy.functions.elementary.miscellaneousr    numberfieldsr"   ranger
   appendr   r   )	nr   r$   r    r"   paiex r4   ?/tmp/pip-target-vg8gfxp4/lib/python/sympy/polys/specialpolys.pyswinnerton_dyer_poly   s.   

0r6   c                 C   s^   | dkr
t d|  ttt| tt}|durt||}nt|td}|r+|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$   polyr4   r4   r5   cyclotomic_polyA   s   r;   c                 O   sx   t |}| dk s| t|ks|std| |f | stj}ntdd t|t| D  }|dds4|S t	|g|R  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 r4   )r   ).0sr4   r4   r5   
<listcomp>k       z"symmetric_poly.<locals>.<listcomp>r$   F)
r   lenr*   r	   Oner   r   r7   getr   )r/   gensargsr:   r4   r4   r5   symmetric_poly\   s   rE   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   r9   )r   r/   infsuprF   r$   r:   r4   r4   r5   random_polys   s   rI   r   yc           	         s   t dd}t trtd | f  n|r|t  j@ rd}t|tr-td|| f }n|r8|t| j@ r8d}|s@ttdg }t fddt	| D  }t	| D ]|    }t fddt	| D  }|
||  qTt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 r4   r4   r<   r2   )Xr   r4   r5   r>          z&interpolating_poly.<locals>.<listcomp>c                    s$   g | ]}|kr   |  qS r4   r4   )r<   j)rM   r2   r4   r5   r>      s   $ c                 S   s   g | ]\}}|| qS r4   r4   )r<   coeffrJ   r4   r4   r5   r>      rN   )getattr
isinstancestrr   r   rK   r*   r   r   r-   r.   r   zip)	r/   r   rM   Yokcoeffsnumertnumerdenomr4   )rM   r2   r   r5   interpolating_poly   s$   

r[   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g|R  }|||fS )
%Fateman's GCD benchmark: trivial GCD c                 S      g | ]
}t d t| qS y_r   rS   rL   r4   r4   r5   r>          z$fateman_poly_F_1.<locals>.<listcomp>r!   r   c                 S      g | ]}|qS r4   r4   r<   rJ   r4   r4   r5   r>          Nr#   c                 S   s   g | ]}|d  qS )r#   r4   rc   r4   r4   r5   r>      r?   )r-   r   as_polyr   )	r/   rU   y_0y_1uvFGHr4   r4   r5   fateman_poly_F_1   s   "*
rn   c                 C   s&  |d|dg}t | D ]	}t|||g}q|d|d|dg}t d| D ]}t||t||g}q&| 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 )r\   r!   r   r#   r   )r-   r   r   r   r   r   r   )r/   Kri   r2   rj   mUVfWrU   rk   rl   rm   r4   r4   r5   dmp_fateman_poly_F_1   s    ,

ru   c                 C   s   dd t | d D }|d }tdd |dd D  }t|| d d g|R  }t|| d d g|R  }t|| d d g|R  }|| || |fS )7Fateman's GCD benchmark: linearly dense quartic inputs c                 S   r]   r^   r`   rL   r4   r4   r5   r>      ra   z$fateman_poly_F_2.<locals>.<listcomp>r!   r   c                 S   rb   r4   r4   rc   r4   r4   r5   r>      rd   Nr#   r-   r   r   r/   rU   rg   ri   rm   rk   rl   r4   r4   r5   fateman_poly_F_2   s   ry   c           	      C   s   |d|dg}t | d D ]	}t|||g}q| d }t|t|d|d d| |}tt||t|||g| |}tt|||g| |}t|t|d |d| |}tt|||g| |}t||| |t||| ||fS )rv   r!   r   r#   )r-   r   r   r   r   r   r   )	r/   ro   ri   r2   rp   rj   rs   ghr4   r4   r5   dmp_fateman_poly_F_2   s   r|   c                    s   dd t  d D }|d }t fdd|dd D  }t| d  | d d g|R  }t| d  | d d g|R  }t| d  | d d g|R  }|| || |fS )8Fateman's GCD benchmark: sparse inputs (deg f ~ vars f) c                 S   r]   r^   r`   rL   r4   r4   r5   r>     ra   z$fateman_poly_F_3.<locals>.<listcomp>r!   r   c                    s   g | ]}| d   qS )r!   r4   rc   r/   r4   r5   r>   
  rN   Nr#   rw   rx   r4   r~   r5   fateman_poly_F_3  s   $$$r   c                 C   s&  t | d |ji|}td| d D ]}t|gt||| d |d |}q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 )r}   r!   r   r#   )	r   oner-   r   r   r   r   r   r   )r/   ro   ri   r2   rj   rs   rz   r{   r4   r4   r5   dmp_fateman_poly_F_3  s   ".((r   )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 )Nx,y,zr#   r   r%      r)   r!   r   r   Rr   rJ   zr4   r4   r5   _f_0+  s   r   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 )Nr   r   r#         r&   ib     i,  i@     iX  ip  r   r   r4   r4   r5   _f_1/  s   b 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 S )Nr   r   r   r#   Z      i  r   r   r4   r4   r5   _f_23  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   S )Nr   r   r#   r%   r      r   r   r4   r4   r5   _f_37  s   r   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 )Nr   	   r'   r   r   r      r#   r)   r%   r      r   r   r4   r4   r5   _f_4;  s
     H r   c                  C   s   t dt\} }}}|d  d|d  |  d|d  |  d| |d   d| | |  d| |d   |d  d|d  |  d| |d   |d  S )Nr   r   r#   r)   r   r   r4   r4   r5   _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  /      ^   r   r)   r   )r   r   rJ   r   tr4   r4   r5   _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 )
Nr   r%   r)   r#   r   r   r   r'   r   r   r   r4   r4   r5   _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#   r   r   H      r)   r%   r   i$  r   )r   r   rJ   r4   r4   r5   _w_2K  s   j r   c                   C   s    t  t t t t t t fS N)r   r   r   r   r   r   r   r4   r4   r4   r5   f_polysO  s    r   c                   C   s   t  t fS r   )r   r   r4   r4   r4   r5   w_polysR  s   r   )NF)r   rJ   )A__doc__
sympy.corer   r   r   r   r   r   sympy.core.containersr   sympy.core.singletonr	   sympy.ntheoryr
   sympy.polys.densearithr   r   r   r   sympy.polys.densebasicr   r   r   r   r   r   sympy.polys.domainsr   sympy.polys.factortoolsr   sympy.polys.polyclassesr   sympy.polys.polytoolsr   r   sympy.polys.polyutilsr   sympy.utilitiesr   r   r   r6   r;   rE   rI   r[   rn   ru   ry   r|   r   r   sympy.polys.ringsr   r   r   r   r   r   r   r   r   r   r   r   r4   r4   r4   r5   <module>   sR      )
!