
    Qi                          d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZmZmZmZ d d	lmZ  G d
 de          ZdS )   )Add	gcd_terms)DefinedFunction)
NumberKind)	fuzzy_and	fuzzy_not)Mul)equal_valued)is_leis_ltis_geis_gt)Sc                   R    e Zd ZdZeZed             Zd Zd Z	d Z
d Zd Zdd	Zd
S )Modai  Represents a modulo operation on symbolic expressions.

    Parameters
    ==========

    p : Expr
        Dividend.

    q : Expr
        Divisor.

    Notes
    =====

    The convention used is the same as Python's: the remainder always has the
    same sign as the divisor.

    Many objects can be evaluated modulo ``n`` much faster than they can be
    evaluated directly (or at all).  For this, ``evaluate=False`` is
    necessary to prevent eager evaluation:

    >>> from sympy import binomial, factorial, Mod, Pow
    >>> Mod(Pow(2, 10**16, evaluate=False), 97)
    61
    >>> Mod(factorial(10**9, evaluate=False), 10**9 + 9)
    712524808
    >>> Mod(binomial(10**18, 10**12, evaluate=False), (10**5 + 3)**2)
    3744312326

    Examples
    ========

    >>> from sympy.abc import x, y
    >>> x**2 % y
    Mod(x**2, y)
    >>> _.subs({x: 5, y: 6})
    1

    c                 
    d } ||          }||S t          |           r>|j        d         }|z  dk    r  |j        d                   S ||z
  z  j        r|S nt          |            rA| j        d         }|z  dk    r  | j        d                    S ||z   z  j        r|S n;t          |t                    rg g fx}\  }}|j        D ]+}	|t          |	                                        |	           ,|rDt          fd|D                       r)t	          | t	          d |D              z   }
  |
          S nt          |t                    rg g fx}\  }}|j        D ]+}	|t          |	                                        |	           ,|rt          fd|D                       rt          d |j        D                       rj        r fd|D             }g }g }|D ]H}t          |           r!|                    |j        d                    3|                    |           It          | }t          | }t          d	 |D              }||z  }
|  |
          z  S j	        rdt          j        urVt          d
 |j        D                       r8fd|j        D             }t          d |D                       rt          j        S t          ||z    }ddlm} ddlm} 	  ||          t%          d          sfd|fD             \  }n# |$ r t          j        Y nw xY w|}}|j        rg }|j        D ]e}  |          }|                               |                               k    r|                    |           P|                    |           f|t+          |j                  k    r	t	          | }n{|                                \  }}                                \  }d}|j        r|j        s1||z  }t%          |d          r|z  |t1          ||z            z  }d}|s
||z  }|z  |                                r'                                rd |fD             \  } ||          }||z  S j        r#t%          d          r|z  }  |d          S j        r^j        d         j        rLt%          j        d         d          r1j        d         |z  }t          j        j        dd                      ||f||fk              z  S )Nc                    |j         rt          d          | t          j        u s |t          j        u s| j        du s	|j        du rt          j        S | t          j        u s| || fv s| j        r|dk    rt          j        S |j        r8| j        r| |z  S |dk    r&| j        rt          j        S | j	        rt          j
        S t          | d          r t          | d          |          }||S | |z  }|j        rt          j        S 	 t          |          }t          |t                    r| ||z  z
  }||z  dk     dk    r||z  }|S n# t          $ r Y nw xY w|j        rt"          t$          }}n|j        rt(          t*          }}ndS d	|z  }| |z
  }t-          d
          D ])} |||           s dS  |||          r| |z
  c S ||z  }*dS )zmTry to return p % q if both are numbers or +/-p is known
            to be less than or equal q.
            zModulo by zeroFr      	_eval_ModN    T   )is_zeroZeroDivisionErrorr   NaN	is_finiteZero
is_integer	is_Numberis_evenis_oddOnehasattrgetattrint
isinstance	TypeErroris_positiver   r   is_negativer   r   range)	pqrvrdcomp1comp2ls_s	            f/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/sympy/core/mod.pynumber_evalzMod.eval.<locals>.number_eval9   s7   
 y :'(8999AEzzQ!%ZZ1;%+?+?1;RWCWCWuAF{{aAr7llq|lQv{ %; Q3J66y % v % uq+&& ,WQ,,Q//>I !A| v	FF a%% QqSB1qT))aI	     } $eu $euABAA1XX  uR|| FF5B<< "r6MMMa s   E 
EEr   r   c              3   :   K   | ]}|j         d          k    V  dS r   Nargs.0innerr-   s     r5   	<genexpr>zMod.eval.<locals>.<genexpr>   .      CCEUZ]a/CCCCCC    c                 (    g | ]}|j         d          S r   r9   r<   is     r5   
<listcomp>zMod.eval.<locals>.<listcomp>   s    -G-G-GAafQi-G-G-Gr@   c              3   :   K   | ]}|j         d          k    V  dS r8   r9   r;   s     r5   r>   zMod.eval.<locals>.<genexpr>   r?   r@   c              3   $   K   | ]}|j         V  d S Nr   r<   ts     r5   r>   zMod.eval.<locals>.<genexpr>   s%      KiKi]^ALKiKiKiKiKiKir@   c                 (    g | ]} |          S  rM   )r<   xclsr-   s     r5   rE   zMod.eval.<locals>.<listcomp>   s#    :::1SSAYY:::r@   c                 (    g | ]}|j         d          S rB   r9   rC   s     r5   rE   zMod.eval.<locals>.<listcomp>   s    !;!;!;!&)!;!;!;r@   c              3   $   K   | ]}|j         V  d S rH   rI   rJ   s     r5   r>   zMod.eval.<locals>.<genexpr>   s$      44q|444444r@   c                 ,    g | ]}|j         r|z  n|S rM   )
is_Integer)r<   rD   r-   s     r5   rE   zMod.eval.<locals>.<listcomp>   s(     N N N!!,!=QA N N Nr@   c              3   2   K   | ]}|t           j        u V  d S rH   )r   r   )r<   iqs     r5   r>   zMod.eval.<locals>.<genexpr>   s(      <<B2<<<<<<<r@   )PolynomialError)gcdc                 :    g | ]}t          |z  d d           S )F)clearfractionr   )r<   rD   Gs     r5   rE   zMod.eval.<locals>.<listcomp>   s<     ) ) ) "!A#UUCCC ) ) )r@   FTc                     g | ]}| S rM   rM   rC   s     r5   rE   zMod.eval.<locals>.<listcomp>   s    ---ar---r@   )evaluate)r'   r:   is_nonnegativeis_nonpositiver   appendallr
   r   rS   r   r#   anyr   sympy.polys.polyerrorsrV   sympy.polys.polytoolsrW   r   is_Addcountlistas_coeff_Mulis_Rationalr&   could_extract_minus_signis_Floatis_Mul
_from_args)rO   r,   r-   r6   r.   qinnerboth_l	non_mod_lmod_largnetmodnon_modjprod_modprod_non_mod	prod_mod1rV   rW   pwasqwasr:   rD   acpcqokr/   r[   s   ` `                         @r5   evalzMod.eval7   s   8	 8	 8	t [A>I a 4	*VAYFzQs16!9a(((!f*%5  C   -	*bYq\FzQsaRIaL=!,,,!f*%5  3 &	*(*B.F%Yv 9 9z#s++,33C8888 #CCCCUCCCCC #9o-G-G-G-G-G(HHs3{{"3 	*(*B.F%Yv 9 9z#s++,33C8888 0CCCCUCCCCC 0KiKibcbhKiKiKiHiHi 0nonz 0:::::	:::	" * *A!!S)) *

16!9----q))))9"G}!;!;U!;!;!;<	(#CCQKK//| &44QV44444 & N N N Nqv N N NI<<)<<<<< & vi%')A 	;:::::------	Aq		A1%% )) ) ) )"#Q) ) )1 	 	 	AAA	d 8 	DV # #C1II773<<!''#,,..KKNNNNKKNNNNtAF||##J NN$$EBNN$$EBB>  G1%% GARUOAB qDqD %%'' 	.A,F,F,H,H 	.--Aq!9---GAq! [A>a4K : 	+,q!,, 	+FA3q!e,,,,X 	+!&), 	+afQi1K1K 	+q	!Aqvabbz**AQQFtTl$:;;;;;s   ?/L/ /MMc                 z    | j         \  }}t          |j        |j        t          |j                  g          rdS d S )NT)r:   r   r   r	   r   )selfr,   r-   s      r5   _eval_is_integerzMod._eval_is_integer   sA    y1alAL)AI2F2FGHH 	4	 	r@   c                 .    | j         d         j        rdS d S Nr   T)r:   r)   r   s    r5   _eval_is_nonnegativezMod._eval_is_nonnegative   "    9Q<# 	4	 	r@   c                 .    | j         d         j        rdS d S r   )r:   r*   r   s    r5   _eval_is_nonpositivezMod._eval_is_nonpositive   r   r@   c                 6    ddl m} || |||z            z  z
  S )Nr   floor)#sympy.functions.elementary.integersr   )r   r|   bkwargsr   s        r5   _eval_rewrite_as_floorzMod._eval_rewrite_as_floor   s/    ======1UU1Q3ZZ<r@   c                 d    ddl m} |                     |                              |||          S Nr   r   )logxcdir)r   r   rewrite_eval_as_leading_term)r   rN   r   r   r   s        r5   r   zMod._eval_as_leading_term   s;    ======||E""88D8QQQr@   r   c                 f    ddl m} |                     |                              ||||          S r   )r   r   r   _eval_nseries)r   rN   nr   r   r   s         r5   r   zMod._eval_nseries  s=    ======||E""00ADt0LLLr@   NrB   )__name__
__module____qualname____doc__r   kindclassmethodr   r   r   r   r   r   r   rM   r@   r5   r   r      s        & &P Ds< s< [s<j  
         R R RM M M M M Mr@   r   N)addr   	exprtoolsr   functionr   r   r   logicr   r	   mulr
   numbersr   
relationalr   r   r   r   	singletonr   r   rM   r@   r5   <module>r      s                     % % % % % %       ' ' ' ' ' ' ' '       ! ! ! ! ! ! 2 2 2 2 2 2 2 2 2 2 2 2      xM xM xM xM xM/ xM xM xM xM xMr@   