U
    L?hÊ  ã                   @   sP   d Z ddlmZmZ dd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )zCImplementation of matrix FGLM Groebner basis conversion algorithm. é    )Úmonomial_mulÚmonomial_divc                    s  |j ‰|j}|jˆd}t| |ƒ}t|| |ƒ}|jg‰ˆjgˆjgt|ƒd   g}g ‰ dd„ t	|ƒD ƒ}|j
‡‡fdd„dd | ¡ }	tt|ƒˆƒ}
tˆƒ‰t||	d	  ||	d  ƒ}t|
|ƒ‰t‡‡fd
d„t	ˆt|ƒƒD ƒƒrF| tˆ|	d  |	d	 ƒˆj¡}| ‡‡fdd„t	ˆƒD ƒ¡}||  |¡}|r¸ˆ  |¡ nrtˆˆ|
ƒ}
ˆ tˆ|	d  |	d	 ƒ¡ | |¡ | ‡fdd„t	|ƒD ƒ¡ tt|ƒƒ}|j
‡‡fdd„dd ‡ ‡fdd„|D ƒ}|södd„ ˆ D ƒ‰ tˆ ‡fdd„ddS | ¡ }	q˜dS )aZ  
    Converts the reduced Groebner basis ``F`` of a zero-dimensional
    ideal w.r.t. ``O_from`` to a reduced Groebner basis
    w.r.t. ``O_to``.

    References
    ==========

    .. [1] J.C. Faugere, P. Gianni, D. Lazard, T. Mora (1994). Efficient
           Computation of Zero-dimensional Groebner Bases by Change of
           Ordering
    )Úorderé   c                 S   s   g | ]}|d f‘qS )r   © ©Ú.0Úir   r   úG/var/www/html/venv/lib/python3.8/site-packages/sympy/polys/fglmtools.pyÚ
<listcomp>    s     zmatrix_fglm.<locals>.<listcomp>c                    s   ˆ t ˆ| d  | d ƒƒS ©Nr   r   ©Ú_incr_k©Zk_l©ÚO_toÚSr   r
   Ú<lambda>!   ó    zmatrix_fglm.<locals>.<lambda>T©ÚkeyÚreverser   c                 3   s   | ]}ˆ | ˆj kV  qd S ©N©Úzeror   )Ú_lambdaÚdomainr   r
   Ú	<genexpr>+   s     zmatrix_fglm.<locals>.<genexpr>c                    s   i | ]}ˆ | ˆ| “qS r   r   r   )r   r   r   r
   Ú
<dictcomp>.   s      zmatrix_fglm.<locals>.<dictcomp>c                    s   g | ]}|ˆ f‘qS r   r   r   )Úsr   r
   r   9   s     c                    s   ˆ t ˆ| d  | d ƒƒS r   r   r   r   r   r
   r   ;   r   c                    s2   g | ]*\‰ ‰t ‡‡ ‡fd d„ˆD ƒƒrˆ ˆf‘qS )c                 3   s(   | ] }t tˆ ˆ ˆƒ|jƒd kV  qd S r   )r   r   ÚLM©r   Úg)r   ÚkÚlr   r
   r   =   s     z)matrix_fglm.<locals>.<listcomp>.<genexpr>)Úall©r   )ÚGr   )r#   r$   r
   r   =   s      c                 S   s   g | ]}|  ¡ ‘qS r   )Zmonicr!   r   r   r
   r   @   s     c                    s
   ˆ | j ƒS r   ©r    )r"   )r   r   r
   r   A   r   N)r   ÚngensÚcloneÚ_basisÚ_representing_matricesÚ
zero_monomÚoner   ÚlenÚrangeÚsortÚpopÚ_identity_matrixÚ_matrix_mulr%   Úterm_newr   Ú	from_dictZset_ringÚappendÚ_updateÚextendÚlistÚsetÚsorted)ÚFÚringr   r)   Zring_toZ	old_basisÚMÚVÚLÚtÚPÚvÚltÚrestr"   r   )r'   r   r   r   r   r   r
   Úmatrix_fglm   s@    

$ 
rG   c                 C   s6   t t| d |… ƒ| | d g t| |d d … ƒ ƒS )Nr   )Útupler:   )Úmr#   r   r   r
   r   F   s    r   c                    s8   ‡ ‡fdd„t ˆƒD ƒ}t ˆƒD ]}ˆ j|| |< q |S )Nc                    s   g | ]}ˆ j gˆ ‘qS r   r   ©r   Ú_©r   Únr   r
   r   K   s     z$_identity_matrix.<locals>.<listcomp>)r0   r.   )rM   r   r?   r	   r   rL   r
   r3   J   s    r3   c                    s   ‡ fdd„| D ƒS )Nc                    s,   g | ]$‰ t ‡ ‡fd d„ttˆƒƒD ƒƒ‘qS )c                 3   s   | ]}ˆ | ˆ|  V  qd S r   r   r   )ÚrowrD   r   r
   r   T   s     z)_matrix_mul.<locals>.<listcomp>.<genexpr>)Úsumr0   r/   r&   ©rD   )rN   r
   r   T   s     z_matrix_mul.<locals>.<listcomp>r   )r?   rD   r   rP   r
   r4   S   s    r4   c                    s¦   t ‡fdd„t| tˆƒƒD ƒƒ‰ttˆƒƒD ]4‰ˆˆkr,‡ ‡‡‡fdd„ttˆ ˆ ƒƒD ƒˆ ˆ< q,‡ ‡‡fdd„ttˆ ˆ ƒƒD ƒˆ ˆ< ˆ |  ˆ ˆ  ˆ ˆ< ˆ | < ˆ S )zE
    Update ``P`` such that for the updated `P'` `P' v = e_{s}`.
    c                 3   s   | ]}ˆ | d kr|V  qdS )r   Nr   ©r   Új)r   r   r
   r   [   s      z_update.<locals>.<genexpr>c                    s4   g | ],}ˆ ˆ | ˆ ˆ | ˆˆ  ˆˆ   ‘qS r   r   rQ   ©rC   r   r#   Úrr   r
   r   _   s     z_update.<locals>.<listcomp>c                    s    g | ]}ˆ ˆ | ˆˆ  ‘qS r   r   rQ   )rC   r   r#   r   r
   r   a   s     )Úminr0   r/   )r   r   rC   r   rS   r
   r8   W   s     *&r8   c                    sJ   ˆj ‰ˆjd ‰‡fdd„‰‡ ‡‡‡fdd„‰‡‡fdd„tˆd ƒD ƒS )zn
    Compute the matrices corresponding to the linear maps `m \mapsto
    x_i m` for all variables `x_i`.
    r   c                    s"   t dg|  dg dgˆ |    ƒS )Nr   r   )rH   )r	   )Úur   r
   Úvaro   s    z#_representing_matrices.<locals>.varc                    st   ‡‡fdd„t tˆƒƒD ƒ}tˆƒD ]J\}}ˆ t| |ƒˆj¡ ˆ ¡}| ¡ D ]\}}ˆ |¡}||| |< qNq$|S )Nc                    s   g | ]}ˆj gtˆ ƒ ‘qS r   )r   r/   rJ   )Úbasisr   r   r
   r   s   s     zG_representing_matrices.<locals>.representing_matrix.<locals>.<listcomp>)	r0   r/   Ú	enumerater5   r   r.   ÚremZtermsÚindex)rI   r?   r	   rD   rT   ZmonomZcoeffrR   )r'   rX   r   r>   r   r
   Úrepresenting_matrixr   s    
z3_representing_matrices.<locals>.representing_matrixc                    s   g | ]}ˆ ˆ|ƒƒ‘qS r   r   r   )r\   rW   r   r
   r   ~   s     z*_representing_matrices.<locals>.<listcomp>)r   r)   r0   )rX   r'   r>   r   )r'   rX   r   r\   r>   rV   rW   r
   r,   g   s
    
r,   c                    s‚   |j }dd„ | D ƒ‰ |jg}g }|rj| ¡ ‰| ˆ¡ ‡ ‡fdd„t|jƒD ƒ}| |¡ |j|dd q tt	|ƒƒ}t
||dS )z°
    Computes a list of monomials which are not divisible by the leading
    monomials wrt to ``O`` of ``G``. These monomials are a basis of
    `K[X_1, \ldots, X_n]/(G)`.
    c                 S   s   g | ]
}|j ‘qS r   r(   r!   r   r   r
   r   ‰   s     z_basis.<locals>.<listcomp>c                    s.   g | ]&‰ t ‡ ‡fd d„ˆD ƒƒrtˆˆ ƒ‘qS )c                 3   s"   | ]}t tˆˆ ƒ|ƒd kV  qd S r   )r   r   )r   Zlmg)r#   rB   r   r
   r   ’   s   ÿz$_basis.<locals>.<listcomp>.<genexpr>)r%   r   r&   ©Zleading_monomialsrB   )r#   r
   r   ‘   s
    ÿÿTr   )r   )r   r-   r2   r7   r0   r)   r9   r1   r:   r;   r<   )r'   r>   r   Ú
candidatesrX   Znew_candidatesr   r]   r
   r+      s    

r+   N)Ú__doc__Zsympy.polys.monomialsr   r   rG   r   r3   r4   r8   r,   r+   r   r   r   r
   Ú<module>   s   @	