U
    ZÊ¹j+  ã                   @   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'dAdd„ƒZ*e'ddœdd„ƒZ+e'edfdd„ƒZ,e'dBd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/„ Z8d0d1„ Z9d2d3„ Z:d4d5„ Z;d6d7„ Z<d8d9„ Z=d:d;„ Z>d<d=„ Z?d>d?„ Z@dS )CzIFunctions 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k	r&t|ƒ ntdƒ}| dkr˜ddlm} ddlm} d	}|d	ƒg}td	| d ƒD ]}t|ƒ}| 	||ƒ¡ qj|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.
    r   z6Cannot generate Swinnerton-Dyer polynomial of order %sNÚxé   )Úsqrté   )Úminimal_polynomialé   ©Úpolysé   é
   é   é(   é   i`  iÀ  i@  )Ú
ValueErrorr   r   Z(sympy.functions.elementary.miscellaneousr    Znumberfieldsr"   Úranger
   Úappendr   r   )	Únr   r%   r    r"   ÚpÚaÚiÚex© r3   úW/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/polys/specialpolys.pyÚswinnerton_dyer_poly   s.    ÿ


0r5   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%   Úpolyr3   r3   r4   Úcyclotomic_polyA   s    ÿr:   r$   c                G   sp   t |ƒ}| dk s | t|ƒks |s2td| |f ƒ‚n(| s>tj}ntdd„ t|t| ƒƒD ƒŽ }|rlt|f|žŽ S |S )zç
    Generates symmetric polynomial of order `n`.

    Parameters
    ==========

    polys: bool, optional (default: False)
        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 r3   )r   )Ú.0Úsr3   r3   r4   Ú
<listcomp>o   s     z"symmetric_poly.<locals>.<listcomp>)	r   Úlenr+   r	   ZOner   r   r6   r   )r.   r%   Zgensr9   r3   r3   r4   Ú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   r8   )r   r.   ÚinfÚsupr@   r%   r9   r3   r3   r4   Úrandom_polyt   s    rC   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}|s€ttdƒƒ‚g }t‡ ‡fdd„t	| ƒD ƒŽ }t	| ƒD ]>‰|ˆˆ ˆ   }t‡ ‡fdd„t	| ƒD ƒŽ }| 
|| ¡ q¨td	d„ t||ƒD ƒŽ S )
z¯Construct 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 r3   r3   ©r;   r1   )ÚXr   r3   r4   r=   §   s     z&interpolating_poly.<locals>.<listcomp>c                    s$   g | ]}ˆ|krˆ ˆ ˆ |  ‘qS r3   r3   )r;   Új)rG   r1   r3   r4   r=   «   s      c                 S   s   g | ]\}}|| ‘qS r3   r3   )r;   ZcoeffrD   r3   r3   r4   r=   ®   s     )ÚgetattrÚ
isinstanceÚstrr   r   rE   r+   r   r   r,   r-   r   Úzip)	r.   r   rG   ÚYÚokZcoeffsZnumertZnumerÚdenomr3   )rG   r1   r   r4   Úinterpolating_poly�   s$    

rP   c           	      C   s´   dd„ t | d ƒD ƒ}|d |d  }}|t|dd… Ž  }|d tdd„ |dd… D ƒŽ  }|d |d  j|Ž }|d d| |d  |d  d  j|Ž }td	|žŽ }|||fS )
ú%Fateman's GCD benchmark: trivial GCD c                 S   s   g | ]}t d t|ƒ ƒ‘qS ©Zy_©r   rK   rF   r3   r3   r4   r=   ³   s     z$fateman_poly_F_1.<locals>.<listcomp>r!   r   Nr#   c                 S   s   g | ]}|d  ‘qS )r#   r3   ©r;   rD   r3   r3   r4   r=   ¸   s     éýÿÿÿ)r!   )r,   r   Zas_polyr   )	r.   rM   Úy_0Zy_1ÚuÚvÚFÚGÚHr3   r3   r4   Úfateman_poly_F_1±   s    "*r\   c                 C   s&  |dƒ|dƒg}t | ƒD ]}t||ƒ|g}q|dƒ|dƒ|dƒg}t d| ƒD ]}t||ƒt|ƒ|g}qL| 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 )rQ   r!   r   r#   r   )r,   r   r   r   r   r   r   )r.   ÚKrW   r1   rX   ÚmÚUÚVÚfÚWrM   rY   rZ   r[   r3   r3   r4   Údmp_fateman_poly_F_1Â   s     ,
rc   c                 C   sŽ   dd„ t | d ƒD ƒ}|d }t|dd… Ž }t|| d d f|žŽ }t|| d d f|žŽ }t|| d d f|žŽ }|| || |fS )ú7Fateman's GCD benchmark: linearly dense quartic inputs c                 S   s   g | ]}t d t|ƒ ƒ‘qS rR   rS   rF   r3   r3   r4   r=   â   s     z$fateman_poly_F_2.<locals>.<listcomp>r!   r   Nr#   ©r,   r   r   ©r.   rM   rV   rW   r[   rY   rZ   r3   r3   r4   Úfateman_poly_F_2à   s    rg   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 )rd   r!   r   r#   )r,   r   r   r   r   r   r   )	r.   r]   rW   r1   r^   rX   ra   ÚgÚhr3   r3   r4   Údmp_fateman_poly_F_2ð   s    rj   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 )ú8Fateman's GCD benchmark: sparse inputs (deg f ~ vars f) c                 S   s   g | ]}t d t|ƒ ƒ‘qS rR   rS   rF   r3   r3   r4   r=     s     z$fateman_poly_F_3.<locals>.<listcomp>r!   r   c                    s   g | ]}|ˆ d   ‘qS )r!   r3   rT   ©r.   r3   r4   r=     s     Nr#   re   rf   r3   rl   r4   Úfateman_poly_F_3  s    """rm   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 )rk   r!   r   r#   )	r   Úoner,   r   r   r   r   r   r   )r.   r]   rW   r1   rX   ra   rh   ri   r3   r3   r4   Údmp_fateman_poly_F_3  s    "*  ÿ((ro   )Ú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!   ©rp   r   ©ÚRr   rD   Úzr3   r3   r4   Ú_f_0,  s    rw   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 )Nrq   r   r#   é   é   r'   ib  éæ   i,  i@  éÈ   iX  ip  rs   rt   r3   r3   r4   Ú_f_10  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 S )Nrq   rr   r   r#   éZ   é   iÞ  rs   rt   r3   r3   r4   Ú_f_24  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 )Nrq   rr   r#   r&   r   é   rs   rt   r3   r3   r4   Ú_f_38  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 )Nrq   é	   r(   rr   r   r€   é   r#   r*   r&   r~   é   rs   rt   r3   r3   r4   Ú_f_4<  s    r…   c                  C   sœ   t dtƒ\} }}}|d  d|d  |  d|d  |  d| |d   d| | |  d| |d   |d  d|d  |  d| |d   |d  S )Nrq   r   r#   r*   rs   rt   r3   r3   r4   Ú_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*   rs   )ru   r   rD   rv   Útr3   r3   r4   Ú_f_6D  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 )
Nrq   r&   r*   r#   r   rr   rƒ   r(   r‚   rs   rt   r3   r3   r4   Ú_w_1H  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€   rr   éH   é   r*   r&   rƒ   i$  rs   )ru   r   rD   r3   r3   r4   Ú_w_2L  s    r’   c                   C   s    t ƒ tƒ tƒ tƒ tƒ tƒ tƒ fS ©N)rw   r|   r   r�   r…   r†   rŒ   r3   r3   r3   r4   Úf_polysP  s    r”   c                   C   s   t ƒ tƒ fS r“   )r�   r’   r3   r3   r3   r4   Úw_polysS  s    r•   )NF)NF)r   rD   )AÚ__doc__Z
sympy.corer   r   r   r   r   r   Zsympy.core.containersr   Zsympy.core.singletonr	   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   r5   r:   r?   rC   rP   r\   rc   rg   rj   rm   ro   Zsympy.polys.ringsrp   rw   r|   r   r�   r…   r†   rŒ   r�   r’   r”   r•   r3   r3   r3   r4   Ú<module>   sP     )!