
    wg                     B    d Z ddlmZmZ d Zd Zd Zd Zd Zd Z	d	 Z
y
)zCImplementation of matrix FGLM Groebner basis conversion algorithm.     )monomial_mulmonomial_divc           	         |j                   |j                  }|j                        }t        | |      }t	        || |      }|j
                  gj                  gj                  gt        |      dz
  z  z   g}g }t        |      D 	cg c]  }	|	df }
}	|
j                  fdd       |
j                         }t        t        |            }	 t              }t        ||d      ||d            }t        ||      t        fdt        |t        |            D              r|j                  t!        |d      |d         j                        }|j#                  t        |      D 	ci c]  }	|	   |	    c}	      }||z
  j%                  |      }|r|j'                  |       nt)        ||      }j'                  t!        |d      |d                |j'                  |       |
j+                  t        |      D 	cg c]  }	|	|f c}	       t-        t/        |
            }
|
j                  fdd       |
D cg c]   \  t        fd	|D              sf" }
}}|
s.|D cg c]  }|j1                          }}t3        |fd
d      S |
j                         }c c}	w c c}	w c c}	w c c}}w c c}w )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   r   c                 :     t        | d      | d               S Nr   r   _incr_kk_lO_toSs    Z/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/polys/fglmtools.py<lambda>zmatrix_fglm.<locals>.<lambda>!   s    4#a&	3q6 :;     Tkeyreversec              3   B   K   | ]  }|   j                   k(    y wN)zero).0i_lambdadomains     r   	<genexpr>zmatrix_fglm.<locals>.<genexpr>+   s     KQwqzV[[(Ks   c                 :     t        | d      | d               S r	   r
   r   s    r   r   zmatrix_fglm.<locals>.<lambda>;   s    4#a&	3q6(B#C r   c              3   h   K   | ])  }t        t                 |j                        d u  + y wr   )r   r   LM)r   gr   kls     r   r   zmatrix_fglm.<locals>.<genexpr>=   s.     *c\]<!a8H!$$+OSW+W*cs   /2c                 (     | j                         S r   )r    )r!   r   s    r   r   zmatrix_fglm.<locals>.<lambda>A   s    4: r   )r   ngensclone_basis_representing_matrices
zero_monomoner   lenrangesortpop_identity_matrix_matrix_mulallterm_newr   	from_dictset_ringappend_updateextendlistsetmonicsorted)Fringr   r%   ring_to	old_basisMVGr   LtPsvltrestr!   r"   r#   r   r   r   s     `               ``@@@r   matrix_fglmrJ      s{    [[FJJEjjtj$Gq$Iy!T2A 
A
**Y!);<	<=A
Au&A!Q&A&FF;TFJ	AY0A
F!A$1Q4)a#K%3y>2JKKwq1w!5vzzBB>>U1X"F1Q4#3"FGDd$$W-A 7A&AHHWQqtWad+,HHQKHHeEl3q!f34SVAFFCTFR"#ddAs*cab*c'caVdd%&(!'')(A(!!5tDDEEG;  	' #G 4 e )s$   K 9KK
K5KKc                 h    t        t        | d |       | |   dz   gz   t        | |dz   d        z         S )Nr   )tupler8   )mr"   s     r   r   r   F   s9    ae!qz)D1q56O;<<r   c                     t        |       D cg c]  }|j                  g| z   }}t        |       D ]  }|j                  ||   |<    |S c c}w r   )r,   r   r*   )nr   _r@   r   s        r   r/   r/   J   sS    "'(+Q&++q+A+1X **!Q H 	,s   Ac                 |    | D cg c])  t        fdt        t                    D              + c}S c c}w )Nc              3   4   K   | ]  }|   |   z    y wr    )r   r   rowrG   s     r   r   z_matrix_mul.<locals>.<genexpr>T   s     5!A15s   )sumr,   r+   )r@   rG   rT   s    ``r   r0   r0   S   s*    ABC#C5uSV}55CCCs   .9c           	         t        fdt        | t                    D              }t        t                    D ]K  }||k7  s	t        t        ||               D cg c]  }||   |   ||   |   |   z  |   z  z
  ! c}||<   M t        t        ||               D cg c]  }||   |   |   z   c}||<   ||    ||   c||<   || <   |S c c}w c c}w )zE
    Update ``P`` such that for the updated `P'` `P' v = e_{s}`.
    c              3   4   K   | ]  }|   d k7  s|  yw)r   NrS   )r   jr   s     r   r   z_update.<locals>.<genexpr>[   s     A!qAAs   )minr,   r+   )rF   r   rE   r"   rrX   s    `    r   r6   r6   W   s     	AuQG-AAA3w<  ]6KPQTUVWXUYQZK[\aAaDGqtAw3wqzAA\AaD] +0AaD	*:;QAaDGgaj ;AaD1qtJAaD!A$H ];s   $C$Cc                      j                   j                  dz
  fd} fd}t        dz         D cg c]  } | ||             c}S c c}w )zn
    Compute the matrices corresponding to the linear maps `m \mapsto
    x_i m` for all variables `x_i`.
    r   c                 >    t        dg| z  dgz   dg| z
  z  z         S )Nr   r   )rL   )r   us    r   varz#_representing_matrices.<locals>.varo   s)    aS1Ws]aSAE]233r   c                 t   t        t        
            D cg c]  }j                  gt        
      z   }}t        
      D ]k  \  }}j	                  t        | |      j                        j                  	      }|j                         D ]  \  }}
j                  |      }|||   |<     m |S c c}w r   )
r,   r+   r   	enumerater2   r   r*   remtermsindex)rM   rP   r@   r   rG   rZ   monomcoeffrX   rB   basisr   r=   s            r   representing_matrixz3_representing_matrices.<locals>.representing_matrixr   s    16s5z1BCAfkk]SZ'CCe$ 	 DAql1a0&**=AA!DA !	  uKK&!Q 	   Ds    B5)r   r%   r,   )rf   rB   r=   r^   rg   r   r   r]   s   ```   @@r   r(   r(   g   sM    
 [[F

1A4
 27q1u>AA'>>>s   Ac                   	 |j                   }| D cg c]  }|j                   }}|j                  g}g }|r|j                         	|j	                  	       t        |j                        D cg c]#  t        	fd|D              rt        	      % }}|j                  |       |j                  |d       |rt        t        |            }t        ||      S c c}w c c}w )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              3   N   K   | ]  }t        t              |      d u   y wr   )r   r   )r   lmgr"   rD   s     r   r   z_basis.<locals>.<genexpr>   s+      *  1s3t; *s   "%Tr   )r   )r   r    r)   r.   r5   r,   r%   r1   r   r7   r-   r8   r9   r;   )
rB   r=   r   r!   leading_monomials
candidatesrf   r"   new_candidatesrD   s
          ` @r   r'   r'      s     JJE'()!))//"JE
NNQ16tzz1B +A *(* * "!Q- + + 	.)E40  UE%U##! *+s   C$2(C)N)__doc__sympy.polys.monomialsr   r   rJ   r   r/   r0   r6   r(   r'   rS   r   r   <module>rp      s2    I ==@=D ?4$r   