
    Ed                     D    d Z ddlmZmZ d Zd Zd Zd Zd Zd Z	d	 Z
d
S )zCImplementation of matrix FGLM Groebner basis conversion algorithm.     )monomial_mulmonomial_divc           	         |j         |j        }|                              }t          | |          }t	          || |          }|j        gj        gj        gt          |          dz
  z  z   g}g d t          |          D             }|
                    fdd           |                                }	t          t          |                    }
	 t                    t          ||	d                  ||	d                            }t          |
|          t          fdt          t          |                    D                       r|                    t!          |	d                  |	d                   j                  }|                    fd	t                    D                       }||z
                      |          }|r                    |           nt)          |
          }
                    t!          |	d                  |	d                              |                    |           |                    fd
t          |          D                        t-          t/          |                    }|
                    fdd           fd|D             }|s!d D             t1          fd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                     g | ]}|d fS r    ).0is     5lib/python3.11/site-packages/sympy/polys/fglmtools.py
<listcomp>zmatrix_fglm.<locals>.<listcomp>    s    &&&A!Q&&&    c                 Z     t          | d                  | d                             S Nr   r   _incr_kk_lO_toSs    r   <lambda>zmatrix_fglm.<locals>.<lambda>!   s'    44#a&	3q6 : :;; r   Tkeyreverser   c              3   :   K   | ]}|         j         k    V  d S Nzero)r   r   _lambdadomains     r   	<genexpr>zmatrix_fglm.<locals>.<genexpr>+   s.      KKQwqzV[(KKKKKKr   c                 .    i | ]}|         |         S r
   r
   )r   r   r   r    s     r   
<dictcomp>zmatrix_fglm.<locals>.<dictcomp>.   s#    "F"F"F1Q4"F"F"Fr   c                     g | ]}|fS r
   r
   )r   r   ss     r   r   zmatrix_fglm.<locals>.<listcomp>9   s    333q!f333r   c                 Z     t          | d                  | d                             S r   r   r   s    r   r   zmatrix_fglm.<locals>.<lambda>;   s'    44#a&	3q6(B(B#C#C r   c                 \    g | ]&\  t          fd D                       "f'S )c              3   n   K   | ]/}t          t                             |j                  d u V  0d S r   )r   r   LM)r   gr   kls     r   r"   z)matrix_fglm.<locals>.<listcomp>.<genexpr>=   sD      *c*c\]<!a8H8H!$+O+OSW+W*c*c*c*c*c*cr   )all)r   r,   r-   Gr   s    @@r   r   zmatrix_fglm.<locals>.<listcomp>=   sL    dddAs*c*c*c*c*c*cab*c*c*c'c'cdaVdddr   c                 6    g | ]}|                                 S r
   )monicr   r+   s     r   r   zmatrix_fglm.<locals>.<listcomp>@   s     (((!''))(((r   c                 $     | j                   S r   r*   )r+   r   s    r   r   zmatrix_fglm.<locals>.<lambda>A   s    44:: r   )r!   ngensclone_basis_representing_matrices
zero_monomoner   lenrangesortpop_identity_matrix_matrix_mulr.   term_newr   	from_dictset_ringappend_updateextendlistsetsorted)Fringr   r5   ring_to	old_basisMVLtPvltrestr+   r/   r   r    r!   r&   s     `            @@@@@r   matrix_fglmrV      s    [FJEjjtj$$Gq$Iy!T22A 
A
*Y!);<	<=A
A&&u&&&AFF;;;;;TFJJJ	AY00AFF!A$1Q4))a##KKKKK%3y>>2J2JKKKKK 	Swq1w!55vzBBB>>"F"F"F"F"FU1XX"F"F"FGGDd$$W--A  7A&&AHHWQqtWad++,,,HHQKKKHH3333eEll333444SVVAFFCCCCCTFRRRddddd!ddd 	E((Q(((A!!5!5!5!5tDDDDEEGG;r   c                     t          t          | d |                   | |         dz   gz   t          | |dz   d                    z             S )Nr   )tuplerG   )mr,   s     r   r   r   F   sD    ae!qz)D1q566OO;<<<r   c                       fdt                     D             }t                     D ]}j        ||         |<   |S )Nc                 &    g | ]}j         gz  S r
   r   )r   _r!   ns     r   r   z$_identity_matrix.<locals>.<listcomp>K   s!    +++Q&+q+++r   )r<   r:   )r]   r!   rN   r   s   ``  r   r?   r?   J   sQ    +++++%((+++A1XX  *!QHr   c                      fd| D             S )Nc           
      ~    g | ]8t          fd t          t                              D                       9S )c                 2    g | ]}|         |         z  S r
   r
   )r   r   rowrS   s     r   r   z*_matrix_mul.<locals>.<listcomp>.<listcomp>T   s%    6661Q!A$666r   )sumr<   r;   )r   ra   rS   s    @r   r   z_matrix_mul.<locals>.<listcomp>T   sF    EEECC66666c!ff66677EEEr   r
   )rN   rS   s    `r   r@   r@   S   s    EEEE1EEEEr   c           	         t          fdt          | t                              D                       t          t                              D ]<k    r4fdt          t                                       D             <   =fdt          t                                       D             <   |                   c<   | <   S )zE
    Update ``P`` such that for the updated `P'` `P' v = e_{s}`.
    c                 ,    g | ]}|         d k    |S r	   r
   )r   jr    s     r   r   z_update.<locals>.<listcomp>[   s&    BBB1'!*/BQBBBr   c                 n    g | ]1}         |                  |                  z           z  z
  2S r
   r
   )r   re   rR   r    r,   rs     r   r   z_update.<locals>.<listcomp>_   s@    \\\aAaDGqtAw3wqzAA\\\r   c                 >    g | ]}         |                  z  S r
   r
   )r   re   rR   r    r,   s     r   r   z_update.<locals>.<listcomp>a   s*    ;;;QAaDGgaj ;;;r   )minr<   r;   )r&   r    rR   r,   rg   s    ``@@r   rE   rE   W   s     	BBBBaW..BBBCCA3w<<   ] ]6 	]\\\\\\\5QTUVWXUYQZQZK[K[\\\AaD;;;;;;%AaD		*:*:;;;AaD1qtJAaD!A$Hr   c                      j         j        dz
  fd fdfdt          dz             D             S )zn
    Compute the matrices corresponding to the linear maps `m \mapsto
    x_i m` for all variables `x_i`.
    r   c                 F    t          dg| z  dgz   dg| z
  z  z             S )Nr   r   )rX   )r   us    r   varz#_representing_matrices.<locals>.varo   s,    aS1Ws]aSAE]2333r   c                 p   	
fdt          t          	                    D             }t          	          D ]{\  }}                    t	          | |          
j                                                }|                                D ]%\  }}	                    |          }|||         |<   &||S )Nc                 @    g | ]}j         gt                    z  S r
   )r   r;   )r   r\   basisr!   s     r   r   zG_representing_matrices.<locals>.representing_matrix.<locals>.<listcomp>s   s(    CCCAfk]SZZ'CCCr   )	r<   r;   	enumeraterA   r   r:   remtermsindex)rY   rN   r   rS   rg   monomcoeffre   r/   rp   r!   rK   s           r   representing_matrixz3_representing_matrices.<locals>.representing_matrixr   s    CCCCCs5zz1B1BCCCe$$ 	  	 DAql1a00&*==AA!DDA !		    uKK&&!Q  r   c                 8    g | ]}  |                    S r
   r
   )r   r   rw   rm   s     r   r   z*_representing_matrices.<locals>.<listcomp>~   s-    >>>AA''>>>r   )r!   r5   r<   )rp   r/   rK   r!   rw   rl   rm   s   ```@@@@r   r8   r8   g   s    
 [F
1A4 4 4 4 4
 
 
 
 
 
 
 
 ?>>>>q1u>>>>r   c                    |j         }d | D             |j        g}g }|rx|                                |                               fdt	          |j                  D             }|                    |           |                    |d           |xt          t          |                    }t          ||          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                     g | ]	}|j         
S r
   r4   r2   s     r   r   z_basis.<locals>.<listcomp>   s    )))!)))r   c                 j    g | ].t          fd D                       t                    /S )c              3   X   K   | ]$}t          t                    |          d u V  %d S r   )r   r   )r   lmgr,   rQ   s     r   r"   z$_basis.<locals>.<listcomp>.<genexpr>   sN       * *  1s33t; * * * * * *r   )r.   r   )r   r,   leading_monomialsrQ   s    @r   r   z_basis.<locals>.<listcomp>   sk     + + +A * * * * *(* * * * *+'!Q-- + + +r   Tr   )r   )r   r9   r>   rD   r<   r5   rF   r=   rG   rH   rI   )r/   rK   r   
candidatesrp   new_candidatesr~   rQ   s         @@r   r7   r7      s     JE))q)))/"JE
 1NNQ+ + + + +tz1B1B + + + 	.)))E4000  1 UE%U####r   N)__doc__sympy.polys.monomialsr   r   rV   r   r?   r@   rE   r8   r7   r
   r   r   <module>r      s    I I = < < < < < < <= = =@= = =  F F F   ? ? ?4$ $ $ $ $r   