
    ¿igl                        d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	 ddl
mZ dZe j        dk    r ed           ed	e          Zd	ed
Z eed          r ed           G d de          Z e            Zed         dk    r*d dlmZmZmZmZ  G d de          Zd Zeej        _        n	d dlmZ d Zd ej        d          z  Z  G d de          Z!dS )    N)is_native_int)backendload_libc_ulongc_size_tc_uint8_ptr   )IntegerBasea  typedef unsigned long UNIX_ULONG;
        typedef struct { int a; int b; void *c; } MPZ;
        typedef MPZ mpz_t[1];
        typedef UNIX_ULONG mp_bitcnt_t;

        void __gmpz_init (mpz_t x);
        void __gmpz_init_set (mpz_t rop, const mpz_t op);
        void __gmpz_init_set_ui (mpz_t rop, UNIX_ULONG op);

        UNIX_ULONG __gmpz_get_ui (const mpz_t op);
        void __gmpz_set (mpz_t rop, const mpz_t op);
        void __gmpz_set_ui (mpz_t rop, UNIX_ULONG op);
        void __gmpz_add (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_add_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2);
        void __gmpz_sub_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2);
        void __gmpz_addmul (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_addmul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2);
        void __gmpz_submul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2);
        void __gmpz_import (mpz_t rop, size_t count, int order, size_t size,
                            int endian, size_t nails, const void *op);
        void * __gmpz_export (void *rop, size_t *countp, int order,
                              size_t size,
                              int endian, size_t nails, const mpz_t op);
        size_t __gmpz_sizeinbase (const mpz_t op, int base);
        void __gmpz_sub (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_mul (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_mul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2);
        int __gmpz_cmp (const mpz_t op1, const mpz_t op2);
        void __gmpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const
                          mpz_t mod);
        void __gmpz_powm_ui (mpz_t rop, const mpz_t base, UNIX_ULONG exp,
                             const mpz_t mod);
        void __gmpz_pow_ui (mpz_t rop, const mpz_t base, UNIX_ULONG exp);
        void __gmpz_sqrt(mpz_t rop, const mpz_t op);
        void __gmpz_mod (mpz_t r, const mpz_t n, const mpz_t d);
        void __gmpz_neg (mpz_t rop, const mpz_t op);
        void __gmpz_abs (mpz_t rop, const mpz_t op);
        void __gmpz_and (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_ior (mpz_t rop, const mpz_t op1, const mpz_t op2);
        void __gmpz_clear (mpz_t x);
        void __gmpz_tdiv_q_2exp (mpz_t q, const mpz_t n, mp_bitcnt_t b);
        void __gmpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d);
        void __gmpz_mul_2exp (mpz_t rop, const mpz_t op1, mp_bitcnt_t op2);
        int __gmpz_tstbit (const mpz_t op, mp_bitcnt_t bit_index);
        int __gmpz_perfect_square_p (const mpz_t op);
        int __gmpz_jacobi (const mpz_t a, const mpz_t b);
        void __gmpz_gcd (mpz_t rop, const mpz_t op1, const mpz_t op2);
        UNIX_ULONG __gmpz_gcd_ui (mpz_t rop, const mpz_t op1,
                                     UNIX_ULONG op2);
        void __gmpz_lcm (mpz_t rop, const mpz_t op1, const mpz_t op2);
        int __gmpz_invert (mpz_t rop, const mpz_t op1, const mpz_t op2);
        int __gmpz_divisible_p (const mpz_t n, const mpz_t d);
        int __gmpz_divisible_ui_p (const mpz_t n, UNIX_ULONG d);

        size_t __gmpz_size (const mpz_t op);
        UNIX_ULONG __gmpz_getlimbn (const mpz_t op, size_t n);
        win32zNot using GMP on Windowsgmp)libraryapi__mpir_versionzMPIR library detectedc                       e Zd Zd ZdS )_GMPc                    |                     d          rd|dd          z   }n5|                     d          rd|dd          z   }nt          d|z            t          t          |          }t	          | ||           |S )Nmpz___gmpz_   gmp___gmp_zAttribute %s is invalid)
startswithAttributeErrorgetattrlibsetattr)selfname	func_namefuncs       W/var/www/html/afkarena/venv/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.py__getattr__z_GMP.__getattr__p   s    ??6"" 	C!DH,II__V$$ 	C 48+II !:T!ABBBsI&&dD!!!    N)__name__
__module____qualname__r"    r#   r!   r   r   n   s#        	 	 	 	 	r#   r   r   ctypes)	Structurec_intc_void_pbyrefc                   $    e Zd ZdefdefdefgZdS )_MPZ	_mp_alloc_mp_size_mp_dN)r$   r%   r&   r*   r+   _fields_r'   r#   r!   r.   r.      s-         %('h')r#   r.   c                  8    t          t                                S N)r,   r.   r'   r#   r!   new_mpzr5      s    TVV}}r#   )ffic                  *    t          j        d          S )NzMPZ*)r6   newr'   r#   r!   r5   r5      s    wvr#      Pc                      e Zd ZdZ e            Ze                    e ed                     d Z	d Z
d Zd Zd Zd Zd9d
Zed:d            Zd Zd Zd Zd Zd Zd Zd Zd ZeZd Zd Zd Zd Zd Zd Z d;dZ!d;dZ"d Z#d;dZ$d Z%d  Z&d! Z'd" Z(d# Z)d$ Z*d% Z+d& Z,d' Z-d( Z.d) Z/d* Z0d+ Z1d, Z2d- Z3d. Z4d/ Z5d0 Z6d1 Z7d2 Z8d3 Z9d4 Z:d5 Z;ed6             Z<ed7             Z=d8 Z>dS )<
IntegerGMPz#A fast, arbitrary precision integerr   c           	      6   t                      | _        d| _        t          |t                    rt          d          t          |          rt                              | j                   d| _        |dk    rdS t                      }t                              |           	 |dk    }t          |          }|
                                dz
  dz  dz   }|dk    r|dz
  }t                              |t          d||dz  z	  z                       t                              ||t          |dz                       t                              | j        | j        |           |dk    t                              |           n# t                              |           w xY w|s't                              | j        | j                   dS dS t          |t"                    r.t                              | j        |j                   d| _        dS t&          )	z*Initialize the integer to the given value.Fz-A floating point type is not a natural numberTr   Nr	           )r5   _mpz_p_initialized
isinstancefloat
ValueErrorr   _gmpmpz_initabs
bit_length
mpz_set_uir   mpz_mul_2expmpz_add	mpz_clearmpz_negr<   mpz_init_setNotImplementedError)r   valuetmppositivereduceslotss         r!   __init__zIntegerGMP.__init__   s    ii!eU## 	NLMMM 	&MM$+&&& $Dzz))CMM#$ A:U**,,q0R7!;aii!AIEOOC$+J&URZ:P,Q$R$RT T T%%c3
0C0CDDDLLdk3??? aii s####s#### 7T[$+666667 7 z** 	&dk5<888 $D%%s   &CF F#c                 H   t                      }t                              || j                   	 d}d}t                              || j                  dk    rzt                              |          dz  }|||dz  z  z  }t                              ||t          d                     |dz   }t                              || j                  dk    zt          	                    |           n# t          	                    |           w xY w| dk     r| }t          |          S )Nr   r?   r>   r	   )r5   rE   rN   r@   mpz_cmp_zero_mpz_p
mpz_get_uimpz_tdiv_q_2expr   rL   int)r   rQ   rP   slotlsbs        r!   __int__zIntegerGMP.__int__   s   ii#t{+++		 ED,,sD$455::ooc**Z7++$$S#wr{{;;;ax	 ,,sD$455:: NN3DNN3!88FE5zzs   B"C- -D	c                 :    t          t          |                     S r4   )strr[   r   s    r!   __str__zIntegerGMP.__str__       3t99~~r#   c                 &    dt          |           z  S )NzInteger(%s))r`   ra   s    r!   __repr__zIntegerGMP.__repr__   s    s4yy((r#   c                 :    t          t          |                     S r4   )hexr[   ra   s    r!   __hex__zIntegerGMP.__hex__   rc   r#   c                      t          |           S r4   )r[   ra   s    r!   	__index__zIntegerGMP.__index__   s    4yyr#   bigc                      dk     rt          d          t                               j                  t          dk    rd}t          d|dz   dz            n4t          dk    rd	}t          d|d
z   dz            nt          d           fdt                    D             }t          j        d|z  z   g|R  }t          |          |z
  }|dk    r|
                    d          }n@|dk    r+|d|         d|z  k    rt          d          ||d         }n|dk     r	d| z  |z   }|dk    r|ddd         }n|dk    rnt          d          t          |          dk    rd}|S )a  Convert the number into a byte string.

        This method encodes the number in network order and prepends
        as many zero bytes as required. It only works for non-negative
        values.

        :Parameters:
          block_size : integer
            The exact size the output byte string must have.
            If zero, the string has the minimal length.
          byteorder : string
            'big' for big-endian integers (default), 'little' for litte-endian.
        :Returns:
          A byte string.
        :Raise ValueError:
          If the value is negative or if ``block_size`` is
          provided and the length of the byte string would exceed it.
        r   .Conversion only valid for non-negative numbersr>   Lr	      r   @   Q   r9   zUnknown limb sizec                 \    g | ](}t                               j        |z
  d z
            )S )r	   )rE   mpz_getlimbnr@   ).0i	num_limbsr   s     r!   
<listcomp>z'IntegerGMP.to_bytes.<locals>.<listcomp>  s4    ]]]q""4;	A0ABB]]]r#   >    Nz@Number is too big to convert to byte string of prescribed lengthlittlerk   Incorrect byteorder)rD   rE   mpz_sizer@   	_sys_bitsmaxrangestructpacklenlstrip)r   
block_size	byteorderspcharlimbsresult
cutoff_lenrw   s   `      @r!   to_byteszIntegerGMP.to_bytes   s   ( !88MNNNMM$+..	??FAy:>a*?@@II"__FAy:>a*?@@II0111 ^]]]]ER[L\L\]]]S6I#55>>>>[[:-
??]]7++FF!^^kzk"g&<<<  "D E E EJKK(FF!^^,v5F  DDbD\FF%2333v;;!Fr#   c                 p   t          d          }|dk    rn9|dk    r$t          |           } |                                  nt          d          t                              |j        t          t          |                     dt          d          dt          d          t          |                      |S )a  Convert a byte string into a number.

        :Parameters:
          byte_string : byte string
            The input number, encoded in network order.
            It can only be non-negative.
          byteorder : string
            'big' for big-endian integers (default), 'little' for litte-endian.

        :Return:
          The ``Integer`` object carrying the same value as the input.
        r   rk   r{   r}   r	   )
r<   	bytearrayreverserD   rE   
mpz_importr@   r   r   r   )byte_stringr   r   s      r!   
from_byteszIntegerGMP.from_bytes(  s     A(""#K00K!!!!2333 [!1!122  #K00	2 	2 	2 r#   c                 v    t          |t                    st          |          } || j        |j                  S r4   )rB   r<   r@   )r   r    terms      r!   _apply_and_returnzIntegerGMP._apply_and_returnI  s7    $
++ 	$d##DtDK---r#   c                     t          |t                    st          |          sdS |                     t          j        |          dk    S )NFr   rB   r<   r   r   rE   rW   r   r   s     r!   __eq__zIntegerGMP.__eq__N  sE    4,, 	d0C0C 	5%%dlD99Q>>r#   c                     t          |t                    st          |          sdS |                     t          j        |          dk    S )NTr   r   r   s     r!   __ne__zIntegerGMP.__ne__S  sE    4,, 	d0C0C 	4%%dlD99Q>>r#   c                 J    |                      t          j        |          dk     S Nr   r   rE   rW   r   s     r!   __lt__zIntegerGMP.__lt__X      %%dlD99A==r#   c                 J    |                      t          j        |          dk    S r   r   r   s     r!   __le__zIntegerGMP.__le__[      %%dlD99Q>>r#   c                 J    |                      t          j        |          dk    S r   r   r   s     r!   __gt__zIntegerGMP.__gt__^  r   r#   c                 J    |                      t          j        |          dk    S r   r   r   s     r!   __ge__zIntegerGMP.__ge__a  r   r#   c                 T    t                               | j        | j                  dk    S r   rE   rW   r@   rX   ra   s    r!   __nonzero__zIntegerGMP.__nonzero__d  s     ||DK)9::a??r#   c                 T    t                               | j        | j                  dk     S r   r   ra   s    r!   is_negativezIntegerGMP.is_negativeh  s     ||DK)9::Q>>r#   c                     t          d          }t          |t                     s(	 t          |          }n# t          $ r
 t          cY S w xY wt                              |j        | j        |j                   |S r   )r<   rB   rO   NotImplementedrE   rK   r@   r   r   r   s      r!   __add__zIntegerGMP.__add__l      A$
++ 	&&!$''& & & &%%%%&V][[	" 	" 	"    6 A
	A
c                     t          d          }t          |t                     s(	 t          |          }n# t          $ r
 t          cY S w xY wt                              |j        | j        |j                   |S r   )r<   rB   rO   r   rE   mpz_subr@   r   s      r!   __sub__zIntegerGMP.__sub__x  r   r   c                     t          d          }t          |t                     s(	 t          |          }n# t          $ r
 t          cY S w xY wt                              |j        | j        |j                   |S r   )r<   rB   rO   r   rE   mpz_mulr@   r   s      r!   __mul__zIntegerGMP.__mul__  r   r   c                 2   t          |t                    st          |          }t                              |j        | j                  dk    rt          d          t          d          }t                              |j        | j        |j                   |S )Nr   Division by zero)rB   r<   rE   rW   r@   rX   ZeroDivisionError
mpz_fdiv_q)r   divisorr   s      r!   __floordiv__zIntegerGMP.__floordiv__  s    ':.. 	* ))G<<(* *-./ /#$6777A	( 	( 	( r#   c                 `   t          |t                    st          |          }t                              |j        | j                  }|dk    rt          d          |dk     rt          d          t          d          }t                              |j        | j        |j                   |S Nr   r   Modulus must be positive	rB   r<   rE   rW   r@   rX   r   rD   mpz_mod)r   r   compr   s       r!   __mod__zIntegerGMP.__mod__  s    ':.. 	* ))G||GN ,. .199#$6777!887888AV][^	% 	% 	% r#   Nc           	      $   |l|dk     rt          d          |dk    rt          d          t                              | j        | j        t	          t          |                               n!t          |t                    st          |          }|st          d          |	                                rt          d          t          |          rf|dk     rt          d          |dk     r;t                              | j        | j        t	          |          |j                   | S t          |          }n#|	                                rt          d          t                              | j        | j        |j        |j                   | S )Nr   zExponent must not be negative   zExponent is too bigr   r      )rD   rE   
mpz_pow_uir@   r   r[   rB   r<   r   r   r   mpz_powm_uimpz_powm)r   exponentmoduluss      r!   inplace_powzIntegerGMP.inplace_pow  s   ?!|| !@AAA #~~ !6777OODK K#CMM22    gz22 .$W-- <'(:;;;""$$ = !;<<<X&& Ba<<$%DEEEe##$$T[%)[%,X%6%6%,^5 5 5  K%h//%%'' B !@AAAMM$++"/!.* * * r#   c                 L    t          |           }|                    ||          S r4   )r<   r   )r   r   r   r   s       r!   __pow__zIntegerGMP.__pow__  s%    D!!!!(G444r#   c                 n    t          d          }t                              |j        | j                   |S r   )r<   rE   mpz_absr@   )r   r   s     r!   __abs__zIntegerGMP.__abs__  s*    AV]DK000r#   c                 L   |J| dk     rt          d          t          d          }t                              |j        | j                   nW|dk    rt          d          t          |          }t          |                     t          |           |z  |                    }|S )zGReturn the largest Integer that does not
        exceed the square rootNr   zSquare root of negative valuer   )rD   r<   rE   mpz_sqrtr@   r[   _tonelli_shanksr   r   r   s      r!   sqrtzIntegerGMP.sqrt  s     ?axx !@AAA]]FMM&-+' ' ' ' !|| !;<<<'llG 4 4SYY5H' R RSSFr#   c                    t          |          rd|cxk    rdk     r8n n5t                              | j        | j        t	          |                     | S d|cxk     rdk     r9n n6t                              | j        | j        t	          |                      | S t          |          }t                              | j        | j        |j                   | S Nr   r    )r   rE   
mpz_add_uir@   r   
mpz_sub_uir<   rK   r   s     r!   __iadd__zIntegerGMP.__iadd__       	$D    5      $ '/ / /     q      $ '0 0 0 d##DT[[[	" 	" 	" r#   c                    t          |          rd|cxk    rdk     r8n n5t                              | j        | j        t	          |                     | S d|cxk     rdk     r9n n6t                              | j        | j        t	          |                      | S t          |          }t                              | j        | j        |j                   | S r   )r   rE   r   r@   r   r   r<   r   r   s     r!   __isub__zIntegerGMP.__isub__  r   r#   c                    t          |          rd|cxk    rdk     r8n n5t                              | j        | j        t	          |                     | S d|cxk     rdk     r^n n[t                              | j        | j        t	          |                      t                              | j        | j                   | S t          |          }t                              | j        | j        |j                   | S r   )r   rE   
mpz_mul_uir@   r   rM   r<   r   r   s     r!   __imul__zIntegerGMP.__imul__  s    	$D    5      $ '/ / /     q      $ '0 0 0 T[$+666d##DT[[[	" 	" 	" r#   c                 B   t          |t                    st          |          }t                              |j        |j                  }|dk    rt          d          |dk     rt          d          t                              | j        | j        |j                   | S r   r   )r   r   r   s      r!   __imod__zIntegerGMP.__imod__$  s    ':.. 	* ))G||GN#/1 1199#$6777!887888T[[^	% 	% 	% r#   c                     t          d          }t          |t                     st          |          }t                              |j        | j        |j                   |S r   )r<   rB   rE   mpz_andr@   r   s      r!   __and__zIntegerGMP.__and__3  W    A$
++ 	$d##DV][[	" 	" 	" r#   c                     t          d          }t          |t                     st          |          }t                              |j        | j        |j                   |S r   )r<   rB   rE   mpz_iorr@   r   s      r!   __or__zIntegerGMP.__or__<  r   r#   c           	          t          d          }|dk     rt          d          |dk    r
| dk     rdS dS t                              |j        | j        t          t          |                               |S Nr   znegative shift countr   r|   )r<   rD   rE   rZ   r@   r   r[   r   posr   s      r!   
__rshift__zIntegerGMP.__rshift__E  sz    A773444;;axxrqV]![$SXX..	0 	0 	0 r#   c           	          |dk     rt          d          |dk    r
| dk     rdS dS t                              | j        | j        t	          t          |                               | S r   )rD   rE   rZ   r@   r   r[   r   r   s     r!   __irshift__zIntegerGMP.__irshift__S  so    773444;;axxrqT[![$SXX..	0 	0 	0 r#   c           	          t          d          }d|cxk    rdk     sn t          d          t                              |j        | j        t          t          |                               |S Nr   r   zIncorrect shift count)r<   rD   rE   rJ   r@   r   r[   r   s      r!   
__lshift__zIntegerGMP.__lshift__`  st    AC%4555&-+!#c((++	- 	- 	- r#   c           	          d|cxk    rdk     sn t          d          t                              | j        | j        t	          t          |                               | S r   )rD   rE   rJ   r@   r   r[   r   s     r!   __ilshift__zIntegerGMP.__ilshift__i  si    C%4555$++!#c((++	- 	- 	- r#   c           
          | dk     rt          d          |dk     rt          d          |dk    rdS t          t                              | j        t          t          |                                        S )zPReturn True if the n-th bit is set to 1.
        Bit 0 is the least significant.r   z)no bit representation for negative valuesznegative bit countr   )rD   boolrE   
mpz_tstbitr@   r   r[   )r   ns     r!   get_bitzIntegerGMP.get_bitq  sw     !88HIIIq551222u991DOODK$+CFFOO5 5 6 6 	6r#   c                 J    t                               | j        d          dk    S )Nr   r	   rE   r   r@   ra   s    r!   is_oddzIntegerGMP.is_odd      t{A..!33r#   c                 J    t                               | j        d          dk    S r   r  ra   s    r!   is_evenzIntegerGMP.is_even  r  r#   c                 l    | dk     rt          d          t                              | j        d          S )z=Return the minimum number of bits that can encode the number.r   rm      )rD   rE   mpz_sizeinbaser@   ra   s    r!   size_in_bitszIntegerGMP.size_in_bits  s4     !88MNNN""4;222r#   c                 <    |                                  dz
  dz  dz   S )z>Return the minimum number of bytes that can encode the number.r	   r9   )r	  ra   s    r!   size_in_byteszIntegerGMP.size_in_bytes  s#    !!##a'A-11r#   c                 H    t                               | j                  dk    S r   )rE   mpz_perfect_square_pr@   ra   s    r!   is_perfect_squarezIntegerGMP.is_perfect_square  s    ((55::r#   c                 F   t          |          r]d|cxk     rdk     rAn n>t                              | j        t	          |                    rt          d          dS t          |          }t                              | j        |j                  rt          d          dS )z3Raise an exception if the small prime is a divisor.r   r   zThe value is compositeN)r   rE   mpz_divisible_ui_pr@   r   rD   r<   mpz_divisible_p)r   small_primes     r!   fail_if_divisible_byzIntegerGMP.fail_if_divisible_by  s     %% 	2;&&&&&&&&&**4;+2;+?+?A A ?$%=>>>$[11K + 24 4 	75666	7 	7r#   c                    t          |t                    st          |          }t          |          rd|cxk     rdk     r8n n5t                              | j        |j        t          |                     | S d|cxk     rdk     r9n n6t                              | j        |j        t          |                      | S t          |          }t                              | j        |j        |j                   | S )z/Increment the number by the product of a and b.r   r   r   )	rB   r<   r   rE   mpz_addmul_uir@   r   mpz_submul_ui
mpz_addmul)r   abs      r!   multiply_accumulatezIntegerGMP.multiply_accumulate  s     !Z(( 	1A 	1}}}}u}}}}}""4;#$8#*1::/ / / ~~~~A~~~~~""4;#$8#*A2;;0 0 0 1A	" 	" 	" r#   c                     t          |t                    st          |          }t                              | j        |j                   | S )z'Set the Integer to have the given value)rB   r<   rE   mpz_setr@   )r   sources     r!   setzIntegerGMP.set  sG     &*-- 	(''FT[]	$ 	$ 	$r#   c                 d   t          |t                    st          |          }t                              |j        | j                  }|dk    rt          d          |dk     rt          d          t                              | j        | j        |j                  }|st          d          | S )zCompute the inverse of this number in the ring of
        modulo integers.

        Raise an exception if no inverse exists.
        r   Modulus cannot be zeror   z No inverse value can be computed)	rB   r<   rE   rW   r@   rX   r   rD   
mpz_invert)r   r   r   r   s       r!   inplace_inversezIntegerGMP.inplace_inverse  s     ':.. 	* ))G||GN ,. .199#$<===!887888!%!(1 1  	A?@@@r#   c                 N    t          |           }|                    |           |S r4   )r<   r"  r   s      r!   inversezIntegerGMP.inverse  s(    D!!w'''r#   c                 @   t          d          }t          |          rTd|cxk     rdk     r8n n5t                              |j        | j        t          |                     |S t          |          }t                              |j        | j        |j                   |S )zUCompute the greatest common denominator between this
        number and another term.r   i  )r<   r   rE   
mpz_gcd_uir@   r   mpz_gcdr   s      r!   gcdzIntegerGMP.gcd  s     A 	$4% $ '/ / / d##DV]DK===r#   c                     t          d          }t          |t                     st          |          }t                              |j        | j        |j                   |S )zQCompute the least common multiplier between this
        number and another term.r   )r<   rB   rE   mpz_lcmr@   r   s      r!   lcmzIntegerGMP.lcm  sO     A$
++ 	$d##DV]DK===r#   c                 .   t          | t                    st          |           } t          |t                    st          |          }|dk    s|                                rt          d          t                              | j        |j                  S )zCompute the Jacobi symbolr   z,n must be positive odd for the Jacobi symbol)rB   r<   r  rD   rE   
mpz_jacobir@   )r  r   s     r!   jacobi_symbolzIntegerGMP.jacobi_symbol  sz     !Z(( 	1A!Z(( 	1A66QYY[[6KLLLqx222r#   c                    t          | t                    st          |           } t          |t                    st          |          }t          |t                    st          |          }|dk     rt          d          |dk    rt          d          |dz  dk    rt          d          | |z  |z  }|                    |                                          S )Nr   r   r   r	   zOdd modulus is required)rB   r<   rD   r   r   r  )term1term2r   products       r!   _mult_modulo_byteszIntegerGMP._mult_modulo_bytes  s    %,, 	&u%%E%,, 	&u%%E':.. 	* ))GQ;;7888a<<#$<===aKA67775=G+ 5 5 7 7888r#   c                     	 | j         &| j        rt                              | j                    d | _         d S # t          $ r Y d S w xY wr4   )r@   rA   rE   rL   r   ra   s    r!   __del__zIntegerGMP.__del__  s[    	{&$ 0NN4;///DKKK 	 	 	DD	s   48 
AA)r   rk   )rk   r4   )?r$   r%   r&   __doc__r5   rX   rE   mpz_init_set_uir   rU   r^   rb   re   rh   rj   r   staticmethodr   r   r   r   r   r   r   r   r   __bool__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r  r  r  r  r"  r$  r(  r+  r.  r3  r5  r'   r#   r!   r<   r<      s       --'))Kggajj111'& '& '&T  &  ) ) )    : : : :x    \@. . .
? ? ?
? ? ?
> > >? ? ?> > >? ? ?@ @ @H? ? ?
 
 

 
 

 
 

 
 
  % % % %N5 5 5 5  
   $  $  $  &              6 6 64 4 44 4 43 3 32 2 2; ; ;7 7 7  ,    0  
     	3 	3 \	3 9 9 \9&	 	 	 	 	r#   r<   )"sysr   Cryptodome.Util.py3compatr   Cryptodome.Util._raw_apir   r   r   r   r   _IntegerBaser
   gmp_defsplatformImportErrorr   implementationhasattrobjectr   rE   r(   r)   r*   r+   r,   r.   r5   rt   restyper6   calcsizer   r<   r'   r#   r!   <module>rF     s.  > 


  3 3 3 3 3 3B B B B B B B B B B B B B B & % % % % %8t <7
+0
1
11huh"733
73 !! /
+-
.
..    6    tvv %H$$888888888888) ) ) ) )y ) ) )
   !(D -,,,,,  
 $$$	D
 D
 D
 D
 D
 D
 D
 D
 D
 D
r#   