ó
Ąź\c           @  s   d  Z  d d l m Z m Z d d l m Z m Z d d l m Z d   Z	 d   Z
 d   Z d   Z d	   Z d
   Z d   Z d S(   sC   Implementation of matrix FGLM Groebner basis conversion algorithm. i˙˙˙˙(   t   print_functiont   division(   t   monomial_mult   monomial_div(   t   rangec           s  | j   | j } | j d    } t |  |  } t | |  |  } | j g   j g  j g t |  d g } g  } g  t	 |  D] }	 |	 d f ^ q }
 |
 j
 d    f d   d t  |
 j   } t t |    } x(t rt   } t | | d | | d  } t | |   t   f d   t	 | t |   D  rŐ| j t  | d | d   j  } | j   f d   t	 |  D  } | | j |  } | rv| j |  qvnĄ t |  |  }  j t  | d | d   | j |  |
 j g  t	 |  D] }	 |	 | f ^ q) t t |
   }
 |
 j
 d    f d	   d t  g  |
 D]: \   t    f d
   | D  r}  f ^ q}}
 |
 sg  | D] } | j   ^ qĘ} t | d   f d   d t S|
 j   } qé Wd S(   sZ  
    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
    t   orderi   i    t   keyc           s     t   |  d |  d   S(   Ni   i    (   t   _incr_k(   t   k_l(   t   O_tot   S(    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyt   <lambda>#   t    t   reversec         3  s"   |  ] }   |  j  k Vq d  S(   N(   t   zero(   t   .0t   i(   t   _lambdat   domain(    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pys	   <genexpr>-   s    c           s!   i  |  ] }  |   |  q S(    (    (   R   R   (   R
   R   (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pys
   <dictcomp>0   s   	 c           s     t   |  d |  d   S(   Ni   i    (   R   (   R   (   R	   R
   (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyR   =   R   c         3  s4   |  ]* } t  t      | j  d  k Vq d  S(   N(   R   R   t   LMt   None(   R   t   g(   R
   t   kt   l(    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pys	   <genexpr>?   s    c           s     |  j   S(   N(   R   (   R   (   R	   (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyR   C   R   N(   R   t   ngenst   clonet   _basist   _representing_matricest
   zero_monomt   oneR   t   lenR   t   sortt   Truet   popt   _identity_matrixt   _matrix_mult   allt   term_newR   t	   from_dictt   set_ringt   appendt   _updatet   extendt   listt   sett   monict   sorted(   t   Ft   ringR	   R   t   ring_tot	   old_basist   Mt   Vt   GR   t   Lt   tt   Pt   st   vt   ltt   restR   (    (   R	   R
   R   R   R   R   s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyt   matrix_fglm   sB    		'%"	.*(","Gc         C  s5   t  t |  |   |  | d g t |  | d   S(   Ni   (   t   tupleR+   (   t   mR   (    (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyR   H   s    c         C  sU   g  t  |   D] } | j g |  ^ q } x% t  |   D] } | j | | | <q6 W| S(   N(   R   R   R   (   t   nR   t   _R3   R   (    (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyR"   L   s    )c         C  sH   g  |  D]= } t  g  t t |   D] } | | | | ^ q#  ^ q S(   N(   t   sumR   R   (   R3   R:   t   rowR   (    (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyR#   U   s    c         C  s  t  g  t |  t |   D] } | | d k r | ^ q  } xz t t |   D]f } | | k rQ g  t t | |   D]0 } | | | | | | | | | | ^ qz | | <qQ qQ Wg  t t | |   D] } | | | | | ^ qŇ | | <| |  | | | | <| |  <| S(   sE   
    Update ``P`` such that for the updated `P'` `P' v = e_{s}`.
    i    (   t   minR   R   (   R9   R   R8   t   jR   t   r(    (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyR)   Y   s    >X=c           sj    j    j d   f d   }      f d   } g  t  d  D] } | | |   ^ qN S(   sn   
    Compute the matrices corresponding to the linear maps `m \mapsto
    x_i m` for all variables `x_i`.
    i   c           s'   t  d g |  d g d g   |   S(   Ni    i   (   R>   (   R   (   t   u(    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyt   varq   s    c   	        sˇ   g  t  t    D] }  j g t   ^ q } x{ t   D]m \ } }  j t |  |   j  j    } x7 | j   D]) \ } }  j	 |  } | | | | <q WqB W| S(   N(
   R   R   R   t	   enumerateR%   R   R   t   remt   termst   index(	   R?   RA   R3   R   R:   RF   t   monomt   coeffRE   (   R5   t   basisR   R0   (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyt   representing_matrixt   s    5'(   R   R   R   (   RO   R5   R0   RH   RP   R   (    (   R5   RO   R   R0   RG   s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyR   i   s
    	c           sţ   | j   g  |  D] } | j ^ q } | j g } g  } x | rŇ | j    | j   g  t | j  D]4   t    f d   | D  ri t     ^ qi } | j	 |  | j
 d  f d   d t  q: Wt t |   } t | d  f d   S(   s°   
    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  s-   |  ]# } t  t     |  d  k Vq d  S(   N(   R   R   R   (   R   t   lmg(   R   R7   (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pys	   <genexpr>   s   R   c           s
     |   S(   N(    (   R?   (   R   (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyR      R   R   c           s
     |   S(   N(    (   R?   (   R   (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyR      R   (   R   R   R   R!   R(   R   R   R$   R   R*   R   R    R+   R,   R.   (   R5   R0   R   t   leading_monomialst
   candidatesRO   t   new_candidates(    (   R   R   R7   s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyR      s    		"#N(   t   __doc__t
   __future__R    R   t   sympy.polys.monomialsR   R   t   sympy.core.compatibilityR   R=   R   R"   R#   R)   R   R   (    (    (    s4   lib/python2.7/site-packages/sympy/polys/fglmtools.pyt   <module>   s   	@						