o
    Xzja  ã                   @   s"   d Z ddlmZ G dd„ dƒZdS )z/
This module holds a fast Factorization class.
é    )Úrandintc                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚFactorizationzB
    Simple module to factorize large numbers really quickly.
    c                 C   sx  |d dkrd|d fS t d|d ƒt d|d ƒt d|d ƒ}}}d } }}d }}	|dkrŠ|}t|ƒD ]}
t|d|ƒ| | }q7d}||k r‚|dkr‚|}	tt||| ƒƒD ]}
t|d|ƒ| | }|t|| ƒ | }qY|  ||¡}||7 }||k r‚|dksN|d9 }|dks1||kr©	 t|	d|ƒ| | }	|  t||	 ƒ|¡}|dkr¨nq�||| }}||k r¸||fS ||fS )a  
        Factorizes the given large integer.

        Implementation from https://comeoncodeon.wordpress.com/2010/09/18/pollard-rho-brent-integer-factorization/.

        :param pq: the prime pair pq.
        :return: a tuple containing the two factors p and q.
        é   r   é   )r   ÚrangeÚpowÚminÚabsÚgcd)ÚclsÚpqÚyÚcÚmÚgÚrÚqÚxÚysÚiÚkÚp© r   úX/var/www/kodo/tsheker/venv/lib/python3.10/site-packages/telethon/crypto/factorization.pyÚ	factorize   s:   
.ù	ñüzFactorization.factorizec                 C   s   |r|| | } }|s| S )zž
        Calculates the Greatest Common Divisor.

        :param a: the first number.
        :param b: the second number.
        :return: GCD(a, b)
        r   )ÚaÚbr   r   r   r
   7   s   	ÿzFactorization.gcdN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úclassmethodr   Ústaticmethodr
   r   r   r   r   r      s    
+r   N)r    Úrandomr   r   r   r   r   r   Ú<module>   s    