U
    ;qLe9  ã                   @   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"   t t| ƒ| ƒD ]}t|ƒV  q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)]
    N)r   Úranger   )ÚnÚperm© r   úu/home/p21-0144/sympy/latex2sympy2solve-back-end/sympyEq/lib/python3.8/site-packages/sympy/combinatorics/generators.pyÚ	symmetric   s    r   c                 c   s2   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  n”| dkrxt ddddgƒV  t ddddgƒV  t ddddgƒV  t ddddgƒV  nBtt| ƒƒ}t| ƒD ],}t |ƒV  t |ddd… ƒV  t|dƒ}qŒd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   é   é   Néÿÿÿÿ)r   r   r	   r   r   r   r   r   Údihedral>   s    
r   c               
   C   sZ   dddddgdddd	d
gdddddgdddddgdddddgdddddg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,   é   r7   )r(   é   é   r4   )r   r#   é+   r-   )r   é   é*   r/   )r   é   r2   r)   )r#   r+   é    r?   )r'   é   é   r=   )r   é&   r<   r,   )r   é$   é-   r:   )r   r"   é0   r9   )r"   r*   r3   rC   )r&   r6   é'   rD   )r   r!   r8   r@   )r   r1   é/   rA   )r   r.   rF   r+   )r2   r<   rF   r8   )r>   rE   rH   r5   )r.   r7   r?   rC   )r0   r;   rB   rG   )r-   r9   r@   r3   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   )Ú.0r   r   r   r   Ú
<listcomp>t   s     z?rubik_cube_generators.<locals>.<listcomp>.<listcomp>.<listcomp>r   )rI   Úxir   r   r   rJ   t   s     z4rubik_cube_generators.<locals>.<listcomp>.<listcomp>rF   )Úsizer   )rI   Úxr   r   r   rJ   t   s     z)rubik_cube_generators.<locals>.<listcomp>r   )Úar   r   r   Úrubik_cube_generatorsb   s*    ÿÿÿÿÿ ÿõrO   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 ]D}g }tˆd ƒD ]}| |¡ |d7 }q\tˆˆ|ƒˆ
ˆ| < qHd-‡
‡‡fd'd(„	}g ‰ttd&ˆd  ƒƒ}	tˆd ƒD ]}
ˆ|
ƒ |ƒ  ||
ƒ qÄ|dƒ|	ksôt‚ˆƒ  tˆd ƒD ](}
ˆ|
ƒ |ƒ  |ƒ  ˆƒ  ||
ƒ q|ƒ  |dƒ|	ksHt‚ˆƒ  |ƒ  |ƒ  tˆd ƒD ]@}
ˆ|
ƒ ˆƒ  ˆƒ  |ƒ  |ƒ  ˆƒ  |ƒ  |ƒ  ||
ƒ qfˆƒ  ˆƒ  |ƒ  |dƒ|	ksÌt‚ˆ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   ˆ |    ˆ| ¡S ©N©Úcol©Úfr   ©Úfacesr
   r   r   Úgetr„   s    zrubik.<locals>.getrc                    s   ˆ |    |d ¡S ©Nr   rQ   rS   ©rV   r   r   Úgetl‡   s    zrubik.<locals>.getlc                    s   ˆ |    |d ¡S rX   ©ÚrowrS   rY   r   r   ÚgetuŠ   s    zrubik.<locals>.getuc                    s   ˆ |    ˆ| ¡S rP   r[   rS   rU   r   r   Úgetd   s    zrubik.<locals>.getdc                    s$   t ˆd|ƒˆ |  d d …ˆ| f< d S rX   r   ©rT   r   ÚsrU   r   r   Úsetr   s    zrubik.<locals>.setrc                    s$   t ˆd|ƒˆ |  d d …|d f< d S rX   r   r_   rU   r   r   Úsetl“   s    zrubik.<locals>.setlc                    s$   t dˆ|ƒˆ |  |d d d …f< d S rX   r   r_   rU   r   r   Úsetu–   s    zrubik.<locals>.setuc                    s$   t dˆ|ƒˆ |  ˆ| d d …f< d S rX   r   r_   rU   r   r   Úsetd™   s    zrubik.<locals>.setdr   c                    sd   t |ƒD ]V}ˆ |  }g }t ˆƒD ],}t ˆd ddƒD ]}| |||f ¡ q4q tˆˆ|ƒˆ | < qd S )Nr   r   )r	   Úappendr   )ÚFÚrÚ_ZfaceÚrvÚcrU   r   r   Úcw   s    zrubik.<locals>.cwc                    s   ˆ | dƒ d S ©Nr   r   )rf   )rk   r   r   Úccw¦   s    zrubik.<locals>.ccwc              	      s–   t |ƒD ]ˆ}| dkrˆˆƒ | d7 } ˆˆ| ƒ}ˆˆ| tˆ	ˆ | ƒƒƒ ˆˆ | ttˆˆ| ƒƒƒƒ ˆˆ| tˆˆ| ƒƒƒ ˆ
ˆ| tt|ƒƒƒ | d8 } qd S )Nr   r   )r	   r   Úreversed)r   rg   rh   Útemp)ÚDrf   ÚLÚRÚUrk   r^   rZ   rW   r]   rd   rb   ra   rc   r   r   Úfcw¬   s    
zrubik.<locals>.fcwc                    s   ˆ | dƒ d S rl   r   )r   )rt   r   r   Úfccw¸   s    zrubik.<locals>.fccwc                    sv   t | ƒD ]h}ˆˆƒ ˆˆ ƒ ˆˆƒ ˆˆ }ˆˆƒ ˆˆ ˆˆ< ˆˆƒ ˆˆ ˆˆ< ˆˆƒ ˆˆ ˆˆ< |ˆˆ< qd S rP   ©r	   ©rg   rh   Út©	ÚBrp   rf   rq   rr   rs   rm   rk   rV   r   r   ÚFCW¼   s    zrubik.<locals>.FCWc                      s   ˆ dƒ d S rl   r   r   )r{   r   r   ÚFCCWÊ   s    zrubik.<locals>.FCCWc                    sV   t | ƒD ]H}ˆˆƒ ˆˆƒ ˆˆ }ˆˆ ˆˆ< ˆˆ  ˆˆ< ˆˆ ˆˆ < |ˆˆ< qd S rP   rv   rw   ry   r   r   ÚUCWÎ   s    zrubik.<locals>.UCWc                      s   ˆ dƒ d S rl   r   r   )r}   r   r   ÚUCCWØ   s    zrubik.<locals>.UCCWzU, F, R, B, L, Dr   r   c                    s6   g }ˆD ]}|  ˆ | ¡ q| r$|S ˆ t|ƒ¡ d S rP   )Úextendre   r   )Úshowr   rT   )rV   ÚgÚnamesr   r   r   ë   s    zrubik.<locals>.perm)r   )r   )r   )r   )r   )Ú
ValueErrorr   r	   re   r   r   ÚAssertionError)r
   ru   r|   r~   ÚcountÚfirT   rN   r   ÚIr   r   )rz   rp   rf   r{   rq   rr   rs   r}   rm   rk   rV   rt   r   r^   rZ   rW   r]   r
   r‚   rd   rb   ra   rc   r   Úrubikw   s|    		(

	rˆ   N)Ú sympy.combinatorics.permutationsr   Úsympy.core.symbolr   Úsympy.matricesr   Úsympy.utilities.iterablesr   r   r   r   r   r   rO   rˆ   r   r   r   r   Ú<module>   s   $