o
    ª3Ih7  ã                   @   sh   d dl mZ d dlmZ d dlm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S )é    ©ÚPermutation)Úsymbols©ÚMatrix)Ú
variationsÚrotate_leftc                 c   s$    dd„ t t| ƒ| ƒD ƒE dH  dS )zß
    Generates the symmetric group of order n, Sn.

    Examples
    ========

    >>> from sympy.combinatorics.generators import symmetric
    >>> list(symmetric(3))
    [(2), (1 2), (2)(0 1), (0 1 2), (0 2 1), (0 2)]
    c                 s   s    | ]}t |ƒV  qd S ©Nr   )Ú.0Úperm© r   ú^/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/sympy/combinatorics/generators.pyÚ	<genexpr>   s   € zsymmetric.<locals>.<genexpr>N)r   Úrange)Únr   r   r   Ú	symmetric   s   €"r   c                 c   s4    t t| ƒƒ}t| ƒD ]}t|ƒV  t|dƒ}qdS )a  
    Generates the cyclic group of order n, Cn.

    Examples
    ========

    >>> from sympy.combinatorics.generators import cyclic
    >>> list(cyclic(5))
    [(4), (0 1 2 3 4), (0 2 4 1 3),
     (0 3 1 4 2), (0 4 3 2 1)]

    See Also
    ========

    dihedral
    é   N)Úlistr   r   r   ©r   ÚgenÚir   r   r   Úcyclic   s   €
þr   c                 c   s.    t t| ƒ| ƒD ]}t|ƒ}|jr|V  qdS )zÍ
    Generates the alternating group of order n, An.

    Examples
    ========

    >>> from sympy.combinatorics.generators import alternating
    >>> list(alternating(3))
    [(2), (0 1 2), (0 2 1)]
    N)r   r   r   Úis_even)r   r   Úpr   r   r   Úalternating,   s   €€ýr   c                 c   s´    | dkrt ddgƒV  t ddgƒV  dS | dkr7t g d¢ƒV  t g d¢ƒV  t g d¢ƒV  t g d¢ƒV  dS tt| ƒƒ}t| ƒD ]}t |ƒV  t |ddd	… ƒV  t|dƒ}qAdS )
aÔ  
    Generates the dihedral group of order 2n, Dn.

    The result is given as a subgroup of Sn, except for the special cases n=1
    (the group S2) and n=2 (the Klein 4-group) where that's not possible
    and embeddings in S2 and S4 respectively are given.

    Examples
    ========

    >>> from sympy.combinatorics.generators import dihedral
    >>> list(dihedral(3))
    [(2), (0 2), (0 1 2), (1 2), (0 2 1), (2)(0 1)]

    See Also
    ========

    cyclic
    r   r   é   )r   r   r   é   )r   r   r   r   )r   r   r   r   )r   r   r   r   Néÿÿÿÿ)r   r   r   r   r   r   r   r   Údihedral=   s   €
ýr   c                  C   s6   g d¢g d¢g d¢g d¢g d¢g d¢g} dd„ | D ƒS )	zpReturn the permutations of the 3x3 Rubik's cube, see
    https://www.gap-system.org/Doc/Examples/rubik.html
    ))r   r   é   é   )r   é   é   é   )é	   é!   é   é   )é
   é"   é   é   )é   é#   é   é   ))r$   r,   é   é   )r(   é   é   é   )r   r'   é)   é(   )r#   é   é,   é%   )r    é   é.   r-   ))r'   r/   é   r:   )r+   é   é   r7   )r    r&   é+   r0   )r"   é   é*   r2   )r   é   r5   r,   ))r&   r.   é    rB   )r*   é   é   r@   )r   é&   r?   r/   )r!   é$   é-   r=   )r   r%   é0   r<   ))r%   r-   r6   rF   )r)   r9   é'   rG   )r   r$   r;   rC   )r   r4   é/   rD   )r   r1   rI   r.   ))r5   r?   rI   r;   )rA   rH   rK   r8   )r1   r:   rB   rF   )r3   r>   rE   rJ   )r0   r<   rC   r6   c                 S   s"   g | ]}t d d„ |D ƒdd‘qS )c                 S   s   g | ]	}d d„ |D ƒ‘qS )c                 S   s   g | ]}|d  ‘qS ©r   r   )r
   r   r   r   r   Ú
<listcomp>s   s    z?rubik_cube_generators.<locals>.<listcomp>.<listcomp>.<listcomp>r   )r
   Úxir   r   r   rM   s   s    z4rubik_cube_generators.<locals>.<listcomp>.<listcomp>rI   )Úsizer   )r
   Úxr   r   r   rM   s   s   " z)rubik_cube_generators.<locals>.<listcomp>r   )Úar   r   r   Úrubik_cube_generatorsa   s   õrR   c                    sÆ  ˆdk rt dƒ‚‡
‡fdd„‰‡
fdd„‰‡
fdd„‰‡
‡fd	d
„‰‡
‡fdd„‰‡
‡fdd„‰‡
‡fdd„‰‡
‡fdd„‰d*‡
‡fdd„	‰	‡	fdd„‰d*‡‡‡‡‡‡	‡‡‡‡‡‡‡‡fdd„	‰‡fdd„}d*‡ ‡‡‡‡‡‡‡	‡
f	dd„	‰‡fdd„}d*‡ ‡‡‡‡‡‡‡	‡
f	d d!„	‰‡fd"d#„}td$ƒ \‰‰‰‰ ‰‰‰i ‰
d%}td&ƒD ] }g }tˆd ƒD ]}| |¡ |d7 }q®tˆˆ|ƒˆ
ˆ| < q¤d+‡
‡‡fd'd(„	}g ‰ttd&ˆd  ƒƒ}	tˆd ƒD ]}
ˆ|
ƒ |ƒ  ||
ƒ qà|dƒ|	ksöJ ‚ˆƒ  tˆd ƒD ]}
ˆ|
ƒ |ƒ  |ƒ  ˆƒ  ||
ƒ qÿ|ƒ  |dƒ|	ksJ ‚ˆƒ  |ƒ  |ƒ  tˆd ƒD ] }
ˆ|
ƒ ˆƒ  ˆƒ  |ƒ  |ƒ  ˆƒ  |ƒ  |ƒ  ||
ƒ q.ˆƒ  ˆƒ  |ƒ  |dƒ|	ksaJ ‚ˆS ),a)  Return permutations for an nxn Rubik's cube.

    Permutations returned are for rotation of each of the slice
    from the face up to the last face for each of the 3 sides (in this order):
    front, right and bottom. Hence, the first n - 1 permutations are for the
    slices from the front.
    r   zdimension of cube must be > 1c                    ó   ˆ |    ˆ| ¡S r	   ©Úcol©Úfr   ©Úfacesr   r   r   Úgetrƒ   ó   zrubik.<locals>.getrc                    ó   ˆ |    |d ¡S ©Nr   rT   rV   ©rY   r   r   Úgetl†   r[   zrubik.<locals>.getlc                    r\   r]   ©ÚrowrV   r^   r   r   Úgetu‰   r[   zrubik.<locals>.getuc                    rS   r	   r`   rV   rX   r   r   ÚgetdŒ   r[   zrubik.<locals>.getdc                    s$   t ˆd|ƒˆ |  d d …ˆ| f< d S r]   r   ©rW   r   ÚsrX   r   r   Úsetr   ó   $zrubik.<locals>.setrc                    s$   t ˆd|ƒˆ |  d d …|d f< d S r]   r   rd   rX   r   r   Úsetl’   rg   zrubik.<locals>.setlc                    s$   t dˆ|ƒˆ |  |d d d …f< d S r]   r   rd   rX   r   r   Úsetu•   rg   zrubik.<locals>.setuc                    s$   t dˆ|ƒˆ |  ˆ| d d …f< d S r]   r   rd   rX   r   r   Úsetd˜   rg   zrubik.<locals>.setdr   c                    sd   t |ƒD ]+}ˆ |  }g }t ˆƒD ]}t ˆd ddƒD ]}| |||f ¡ qqtˆˆ|ƒˆ | < qd S )Nr   r   )r   Úappendr   )ÚFÚrÚ_ÚfaceÚrvÚcrX   r   r   Úcwœ   s   ÿúzrubik.<locals>.cwc                    ó   ˆ | dƒ d S ©Nr   r   )rl   )rr   r   r   Úccw¥   ó   zrubik.<locals>.ccwc              	      s–   t |ƒD ]D}| dkrˆˆƒ | d7 } ˆˆ| ƒ}ˆˆ| tˆ	ˆ | ƒƒƒ ˆˆ | ttˆˆ| ƒƒƒƒ ˆˆ| tˆˆ| ƒƒƒ ˆ
ˆ| tt|ƒƒƒ | d8 } qd S )Nr   r   )r   r   Úreversed)r   rm   rn   Útemp)ÚDrl   ÚLÚRÚUrr   rc   r_   rZ   rb   rj   rh   rf   ri   r   r   Úfcw«   s   

÷zrubik.<locals>.fcwc                    rs   rt   r   )r   )r}   r   r   Úfccw·   rv   zrubik.<locals>.fccwc                    sv   t | ƒD ]4}ˆˆƒ ˆˆ ƒ ˆˆƒ ˆˆ }ˆˆƒ ˆˆ ˆˆ< ˆˆƒ ˆˆ ˆˆ< ˆˆƒ ˆˆ ˆˆ< |ˆˆ< qd S r	   ©r   ©rm   rn   Út©	ÚBry   rl   rz   r{   r|   ru   rr   rY   r   r   ÚFCW»   s   
õzrubik.<locals>.FCWc                      ó   ˆ dƒ d S rt   r   r   )r„   r   r   ÚFCCWÉ   ó   zrubik.<locals>.FCCWc                    sV   t | ƒD ]$}ˆˆƒ ˆˆƒ ˆˆ }ˆˆ ˆˆ< ˆˆ  ˆˆ< ˆˆ ˆˆ < |ˆˆ< qd S r	   r   r€   r‚   r   r   ÚUCWÍ   s   
ùzrubik.<locals>.UCWc                      r…   rt   r   r   )rˆ   r   r   ÚUCCW×   r‡   zrubik.<locals>.UCCWzU, F, R, B, L, Dr   r    c                    s6   g }ˆD ]	}|  ˆ | ¡ q| r|S ˆ t|ƒ¡ d S r	   )Úextendrk   r   )Úshowr   rW   )rY   ÚgÚnamesr   r   r   ê   s   zrubik.<locals>.permNrL   )r   )Ú
ValueErrorr   r   rk   r   r   )r   r~   r†   r‰   ÚcountÚfirW   rQ   r   ÚIr   r   )rƒ   ry   rl   r„   rz   r{   r|   rˆ   ru   rr   rY   r}   rŒ   rc   r_   rZ   rb   r   r   rj   rh   rf   ri   r   Úrubikv   s|   		(


	

r’   N)Ú sympy.combinatorics.permutationsr   Úsympy.core.symbolr   Úsympy.matricesr   Úsympy.utilities.iterablesr   r   r   r   r   r   rR   r’   r   r   r   r   Ú<module>   s    $