
    $)diR                     &   d Z ddlZddlZddlZddlZddlmZmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ g dZ ddZ!ddZ"dd	Z# G d
 d          Z$ddZ%ddZ&d dZ'd!dZ(d Z)d"dZ*d#dZ+d Z,ddZ-d Z.dS )$z.
Useful utilities for working with bitarrays.
    N)bitarray
bits2bytes)zerosonescount_nparity_ssqixor_indices	count_andcount_or	count_xorany_andsubsetcorrespond_allbyteswap	serializedeserializeba2hexhex2baba2basebase2ba	sc_encode	sc_decode	vl_encode	vl_decodecanonical_decode)#r   r   urandomrandom_krandom_p
gen_primespprintstripr   r   sum_indicesr
   r   r   r   r   r   r   r   	intervalsr   r   r   r   ba2intint2bar   r   r   r   r   r   huffman_codecanonical_huffmanr   c                 n    t          t          j        t          |                     |          }|| d= |S )zdurandom(n, /, endian=None) -> bitarray

Return random bitarray of length `n` (uses `os.urandom()`).
N)r   osr   r   )__lengthendianas      T/var/www/menimich/repos/protonApp/venv/lib/python3.11/site-packages/bitarray/util.pyr   r   +   s5    
 	Jx00116::A	())H    c                     t          | |          }t          |t                    s$t          dt	          |          j        z            |                    |          S )aX  random_k(n, /, k, endian=None) -> bitarray

Return (pseudo-) random bitarray of length `n` with `k` elements
set to one.  Mathematically equivalent to setting (in a bitarray of
length `n`) all bits at indices `random.sample(range(n), k)` to one.
The random bitarrays are reproducible when giving Python's `random.seed()`
a specific seed value.
int expected, got '%s')_Random
isinstanceint	TypeErrortype__name__r   )__nkr,   rs       r.   r   r   5   sS     	VAa E04773CCDDD::a==r/         ?c                     t           j        dd         dk     rt          d          t          | |          }|                    |          S )aD  random_p(n, /, p=0.5, endian=None) -> bitarray

Return (pseudo-) random bitarray of length `n`, where each bit has
probability `p` of being one (independent of any other bits).  Mathematically
equivalent to `bitarray((random() < p for _ in range(n)), endian)`, but much
faster for large `n`.  The random bitarrays are reproducible when giving
Python's `random.seed()` with a specific seed value.

This function requires Python 3.12 or higher, as it depends on the standard
library function `random.binomialvariate()`.  Raises `NotImplementedError`
when Python version is too low.
N   )      z7bitarray.util.random_p() requires Python 3.12 or higher)sysversion_infoNotImplementedErrorr2   r   )r8   pr,   r:   s       r.   r   r   E   sQ     g%%! #: ; ; 	;VA::a==r/   c                   F    e Zd ZdZdez  ZdZddZd Zd Zd	 Z	d
 Z
d ZdS )r2         g{Gz?r   Nc                 J    || _         t          |          | _        || _        d S N)nr   nbytesr,   )selfrI   r,   s      r.   __init__z_Random.__init__j   s!     mmr/   c                     | j         }t          j        d|z                                |d          }t	          || j                  }|| j        d= |S )zV
        Return bitarray with each bit having probability p = 1/2 of being 1.
        rE   littleN)rJ   randomgetrandbitsto_bytesr   r,   rI   )rK   rJ   br-   s       r.   random_halfz_Random.random_halfo   sR     q6z**33FHEEQ$$dfggJr/   c                     d|cxk     r| j         k     sn t          d| j         |fz            t          |                    dd          d          }||                    d          dz   | j                 S )z
        Return bitarray containing operator sequence.
        Each item represents a bitwise operation:   0: AND   1: OR
        After applying the sequence (see .combine_half()), we
        obtain a bitarray with probability  q = i / K
        r   z0 < i < %d, got i = %dr=   rN   	byteorderrF   )K
ValueErrorr   rQ   indexM)rK   ir-   s      r.   op_seqz_Random.op_seqz   sx     1~~~~tv~~~~5CDDD QZZXZ66AAa$&())r/   c                     |                                  }|D ]3}|r||                                  z  }||                                  z  }4|S )zm
        Combine random bitarrays with probability 1/2
        according to given operator sequence.
        )rS   )rK   seqr-   r9   s       r.   combine_halfz_Random.combine_half   sa    
  	( 	(A (T%%'''T%%'''r/   c                    | j         }|dk    s||k    rH|dk    rt          || j                  S ||k    rt          || j                  S t	          d|z            ||dz  k    r.|                     ||z
            }|                                 |S |dk     s|| j        z  d|z  k     rd}n?||z  }|dd|z  z
  t          j	        |          z  z  }t          || j        dz   z            }|dk     rt          || j                  }| }n?|                     |                     |                    }|                                |z
  }t          j        }|dk     r?t!          |           D ]-} ||          }||         r ||          }||         d||<   .nC|dk    r=t!          |          D ]-} ||          }||         s ||          }||         d||<   .|S )	Nr   z&k must be in range 0 <= k <= n, got %sr=      r>   g?g?rF   )rI   r   r,   r   rX   r   invertrW   mathsqrtr4   r_   r\   countrO   	randrangerange)	rK   r9   rI   r-   r[   rC   diffrf   _s	            r.   r   z_Random.random_k   s#   F66Q!VVAvvQ,,,AvvAt{+++EIJJJ qAv::a!e$$AHHJJJH r66QZ!a%''AAAA#a-49Q<<//AA!$%%A q55a%%A2DD!!$++a..11A7799q=D$	!88D5\\  IaLLd %!	!A d %!	
 AXX4[[  IaLLA$ %!	!A A$ %!r/   c                    dk    sdk    sdk    rldk    rt          | j        | j                  S dk    r|                                 S dk    rt	          | j        | j                  S t          dz            | j        dk     r3t          fdt          | j                  D             | j                  S dk    r.|                     dz
            }|	                                 |S | j
        k     r-|                     t          j        | j                            S t          | j        z            }| j        dz   z  |dz   k    r|dz  }|                     |          }|| j        z  }| j        dk     rb| j        t%          |          d	t'          |k              z  z   k    r3t          fd
t          | j                  D             | j                  S |                     |          }|k     r$|z
  d|z
  z  }||                     |          z  }n#|k    r|z  }||                     |          z  }|S )Ng        r;         ?z*p must be in range 0.0 <= p <= 1.0, got %sra   c              3   F   K   | ]}t          j                     k     V  d S rH   rO   .0ri   rC   s     r.   	<genexpr>z#_Random.random_p.<locals>.<genexpr>   .      HHQV]__q0HHHHHHr/   rF   d   r>   c              3   F   K   | ]}t          j                     k     V  d S rH   rm   rn   s     r.   rp   z#_Random.random_p.<locals>.<genexpr>   rq   r/   )r   rI   r,   rS   r   rX   r   rg   r   rb   SMALL_Pr   rO   binomialvariater4   rW   r\   rJ   lenboolr_   )rK   rC   r-   r[   r^   qxs    `     r.   r   z_Random.random_p   sX   88qCxx188CxxTVT[111Cxx'')))CxxDFDK000IAMNNN 6B;;HHHH%--HHH K) ) ) s77cAg&&AHHJJJH t|==!7!B!BCCC DF
OO
a!e##FAkk!nnJ 6C<<DK3s88a$qAv,,6F+FFFHHHH%--HHH K) ) ) c""q55Q37#Aq!!!AAUUAAq!!!Ar/   )r   N)r7   
__module____qualname__rZ   rW   rt   rL   rS   r\   r_   r   r    r/   r.   r2   r2   Y   s         	
A 	
QA G   
	 	 	* * *  . . .`/ / / / /r/   r2   Fc           
         t          |           }|dk     rt          d          |r+t          d|          }d|ddd<   d|ddd<   d|ddd	<   d
}nt          d|          }dD ]
}d|dd|<   d}||t          |          z   dz
  t          |          z  z  }t	          ||          |dd<   ||d= |rV|                    ddt          t          j        |dz            dz                       D ]}d|z  dz   }d|||z  dz  d|<   nJ|                    ddt          t          j        |          dz                       D ]}d|||z  dd|z  <   |S )a_  gen_primes(n, /, endian=None, odd=False) -> bitarray

Generate a bitarray of length `n` in which active indices are prime numbers.
By default (`odd=False`), active indices correspond to prime numbers directly.
When `odd=True`, only odd prime numbers are represented in the resulting
bitarray `a`, and `a[i]` corresponds to `2*i+1` being prime or not.
r   zbitarray length must be >= 0i   rF   Nr>   r=         01110110   )r=   r>   r   r   00110101rE   rk      )r4   rX   r   rv   r   searchrc   rd   )r8   r,   oddrI   r-   fr[   js           r.   r    r       s    	CA1uu7888
 
f!$Q$!$Q$!$Q$f 	 	AAcccFF !c!ff*q.SVV	##AQAbqbE	!""
 "!QDIa1f$5$5$; < <== 	% 	%AA	A#$Aq1ula  	%
 !RTYq\\C%7!8!899 	" 	"A !Aa!enq1unHr/   rF   c                    |dvrt          d|z            d}t          |           |k    rt          | |          S |dz  }||dz
  z  dz  }|d|z  dz
  z  dz  }t          |           |z   dz
  |z  }| j        }d}t	          |          D ]}	t          |           |	|z  |	dz   |z           }
t          d	| j        |

          }|r'|	|dz
  k    r|j        rt          |          }d|| d	<   |	                                }|rZ||	z  }||k    r|nt          |          }|dk    r|||z  |z   z  }||k    r|nt          |d          }|||z  d|z  z   |z  |z   z  }|S )zsum_indices(a, /, mode=1) -> int

Return sum of indices of all active bits in bitarray `a`.
Equivalent to `sum(i for i, v in enumerate(a) if v)`.
`mode=2` sums square of indices.
)rF   r=   zunexpected mode %ri   rE   rF   r=   r>   r   N)buffer)
rX   rv   r	   padbitsrg   
memoryviewr   r,   readonlyre   )__amoderI   mo1o2nblocksr   smr[   vblockr9   yz1z2s                   r.   r#   r#      s    6-4555 	A
3xx1}}S$ 	
QA	
a!e	B	q1uqy	Q	B3xx!|aA%GkG	
B7^^ 0 0sOOAEQUaK/0sz!444 	!qGaK''~ (  E7())KKMM 	0AAAvv5<<Bqyya!ebj 66RRuUAq1uq2v~*R//Ir/   rE      P   c                    |t           j        }t          | t                    sddl}|                    | |||           dS t          |          }|dk     rt          d          t          |          }|dk     rt          d          t          |          }||k    rt          d|z            ||z
  |dz   z  }||z  }|dk    r||z
  dz
  }t          |           j        }t          |          d	z   t          |           z   t          |           |z  z   |k    }	|	rd
}
n| rd}
nd}
|
                    |d|
           t          |           D ]t\  }}|	r$||z  dk    r|
                    d|dz  z             ||z  dk    r||z  dk    r|
                    d           |
                    t          |                     u|	r|
                    d           |
                    d|
z             |                                 dS )a  pprint(bitarray, /, stream=None, group=8, indent=4, width=80)

Pretty-print bitarray object to `stream`, defaults is `sys.stdout`.
By default, bits are grouped in bytes (8 bits), and 64 bits per line.
Non-bitarray objects are printed using `pprint.pprint()`.
Nr   )streamindentwidthrF   zgroup must be >= 1zindent must be >= 0zwidth must be > %d (indent)r=   r   z'''' (z
%s 
z%s)
)r@   stdoutr3   r   r!   r4   rX   r6   r7   rv   write	enumeratestrflush)r   r   groupr   r   _pprintgplepl	type_name	multilinequotesr[   rR   s                r.   r!   r!   M  s;    ~c8$$     s6&FFFJJEqyy-...[[Fzz.///JJE6?@@@6>uqy
)C
#+C
axxfnq S		"II"SXX-CE0AAUJI 	 
LLIIIvv.///#  1 	2SALL6C<0111u9>>a#gllLLSVV T
LL6!"""
LLNNNNNr/   rightc                 R   t          |t                    s$t          dt          |           j        z            |dvrt          d|z            |dk    rdn|                     d          }|dk    r
| dd         S |d	k    rdn|                     dd
          dz   }| ||         S )zstrip(bitarray, /, mode='right') -> bitarray

Return a new bitarray with zeros stripped from left, right or both ends.
Allowed values for mode are the strings: `left`, `right`, `both`
zstr expected for mode, got '%s')leftr   bothz.mode must be 'left', 'right' or 'both', got %rr   NrF   r   r   r   )r3   r   r5   r6   r7   rX   find)r   r   startstops       r.   r"   r"     s     dC   ,9S		*+ , , 	,,,,I   	 GOODD!E{{2A2w6>>44sxxx';';a'?DuTz?r/   c              #     K   	 | d         }n# t           $ r Y dS w xY wt          |           }d}||k     rL|}	 |                     | |          }n# t          $ r |}Y nw xY wt	          |          ||fV  | }||k     JdS dS )zintervals(bitarray, /) -> iterator

Compute all uninterrupted intervals of 1s and 0s, and return an
iterator over tuples `(value, start, stop)`.  The intervals are guaranteed
to be in order, and their size is always non-zero (`stop - start > 0`).
r   N)
IndexErrorrv   rY   rX   r4   )r   valuerI   r   r   s        r.   r$   r$     s      A   CAD
((	99Y..DD 	 	 	DDD	%jj%%%%%	 ((((((s    
A AAc                    t          | t                    s$t          dt          |           j        z            t          |           }|dk    rt          d          | j        r/t          | j        | j	                  }| j	        dk    r| |z   n|| z   } t                              |                                 | j	                  }|r||dz
  z	  r|d|z  z  }|S )zba2int(bitarray, /, signed=False) -> int

Convert the given bitarray to an integer.
The bit-endianness of the bitarray is respected.
`signed` indicates whether two's complement is used to represent the integer.
zbitarray expected, got '%s'r   znon-empty bitarray expectedrN   rU   rF   )r3   r   r5   r6   r7   rv   rX   r   r   r,   r4   
from_bytestobytes)r   signedlengthpadress        r.   r%   r%     s     c8$$ L5S		8JJKKKXXF{{6777
{ ACK,,:11cCiisSy
..#*.
=
=C #!# qF{Jr/   c                    t          | t                    s$t          dt          |           j        z            |9t          |t                    st          d          |dk    rt          d          |rN|t          d          d|dz
  z  }| | cxk    r|k     sn t          d| || fz            | dk     r| d|z  z  } n|r| |z	  rt          d	d|z  | fz            t          d|          }|                     t          | 
                                          |j        
          }|                    |           |j        dk    }||rt          ||rdnd          n|dz   S t          |          |k    r|r
|d|         n
|| d         S t          |          |k    r|S t          |t          |          z
  |j                  }|r||z   n||z   S )a  int2ba(int, /, length=None, endian=None, signed=False) -> bitarray

Convert the given integer to a bitarray (with given bit-endianness,
and no leading (big-endian) / trailing (little-endian) zeros), unless
the `length` of the bitarray is provided.  An `OverflowError` is raised
if the integer is not representable with the given number of bits.
`signed` determines whether two's complement is used to represent the integer,
and requires `length` to be provided.
r1   Nz"int expected for argument 'length'r   zlength must be > 0z!signed requires argument 'length'rF   z+signed integer not in range(%d, %d), got %dz,unsigned integer not in range(0, %d), got %drU   rN   r   r   0)r3   r4   r5   r6   r7   rX   OverflowErrorr   rQ   r   
bit_lengthr,   	frombytesr"   rv   r   )	__ir   r,   r   r   r-   rR   ler   s	            r.   r&   r&     s)    c3 G04993EEFFF&#&& 	B@AAAQ;;1222 ?>?@@@!OcA !)-.B3<!8 9 9 9771;C 	?cVm 	? !),-K+=!> ? ? ? 	FAZ 0 011QXFFAKKNNN	
X	B~67DuQ216222QWD
1vv0q&zzQwxx[0
1vv
Q
*
*C%1s77cAg%r/   c                    ddl m}m}  G d dt                    }g }|                                 D ])\  }} |            }||_        ||_         |||           *t          |          dk    rn |            } ||           ||          f|_        |j        d         j        |j        d         j        z   |_         |||           t          |          dk    n|d         S )z_huffman_tree(dict, /) -> Node

Given a dict mapping symbols to their frequency, construct a Huffman tree
and return its root node.
r   )heappushheappopc                       e Zd ZdZd ZdS )_huffman_tree.<locals>.Nodez
        There are to tyes of Node instances (both have 'freq' attribute):
          * leaf node: has 'symbol' attribute
          * parent node: has 'child' attribute (tuple with both children)
        c                 "    | j         |j         k     S rH   )freq)rK   others     r.   __lt__z"_huffman_tree.<locals>.Node.__lt__  s    9uz))r/   N)r7   rz   r{   __doc__r   r|   r/   r.   Noder     s-        	 	
	* 	* 	* 	* 	*r/   r   rF   )	heapqr   r   objectitemssymbolr   rv   child)	
__freq_mapr   r   r   minheapsymr   leafparents	            r.   _huffman_treer     s)    ('''''''* * * * *v * * * G""$$    Qtvv	$ g,,

 ww'')9)99l1o*V\!_-AA&!!! g,,

 1:r/   c                    t          | t                    s$t          dt          |           j        z            t          |           dk     rIt          |           dk    rt          d          t          |           d         }|t          d|          iS i t          d|          ffd	 t          |                      S )a:  huffman_code(dict, /, endian=None) -> dict

Given a frequency map, a dictionary mapping symbols to their frequency,
calculate the Huffman code, i.e. a dict mapping those symbols to
bitarrays (with given bit-endianness).  Note that the symbols are not limited
to being strings.  Symbols may be any hashable object.
dict expected, got '%s'r=   r   *cannot create Huffman code with no symbolsr   c                     	 || j         <   d S # t          $ r8  | j        d         |dz               | j        d         |dz              Y d S w xY w)Nr   r   rF   1r   AttributeErrorr   )ndprefixresulttraverses     r.   r   zhuffman_code.<locals>.traverse9  sv    	0 &F29 	0 	0 	0HRXa[&3,///HRXa[&3,//////	0   
 >AA)
r3   dictr5   r6   r7   rv   rX   listr   r   )r   r,   r   r   r   s      @@r.   r'   r'      s     j$'' O1D4D4D4MMNNN
:z??aIJJJ :q!Xc6**++F$Q// 0 0 0 0 0 0 0 H]:&&'''Mr/   c                   	
 t          | t                    s$t          dt          |           j        z            t          |           dk     rOt          |           dk    rt          d          t          |           d         }|t          dd          iddg|gfS i 	d	
fd	
 
t          |                      t          	                                d	 
          }|d         d         }i }|dz   dgz  }d}t          |          D ]^\  }\  }}t          ||d          ||<   ||xx         dz  cc<   |dz   t          |          k     r|dz  }|||dz            d         |z
  z  }_||d |D             fS )a  canonical_huffman(dict, /) -> tuple

Given a frequency map, a dictionary mapping symbols to their frequency,
calculate the canonical Huffman code.  Returns a tuple containing:

0. the canonical Huffman code as a dict mapping symbols to bitarrays
1. a list containing the number of symbols of each code length
2. a list of symbols in canonical order

Note: the two lists may be used as input for `canonical_decode()`.
r   r=   r   r   r   bigrF   c                     	 || j         <   d S # t          $ r8  | j        d         |dz               | j        d         |dz              Y d S w xY w)Nr   rF   r   )r   r   code_lengthr   s     r.   r   z#canonical_huffman.<locals>.traverse\  sv    	.%+K	""" 	. 	. 	.HRXa[&1*---HRXa[&1*------	.r   c                     | d         S )NrF   r|   )items    r.   <lambda>z#canonical_huffman.<locals>.<lambda>j  s
    a r/   )keyr   c                     g | ]
}|d          S r   r|   )ro   r   s     r.   
<listcomp>z%canonical_huffman.<locals>.<listcomp>x  s    777T!W777r/   r   )r3   r   r5   r6   r7   rv   rX   r   r   r   sortedr   r   r&   )r   r   tablemaxbitscodedictre   coder[   r   r   r   s            @@r.   r(   r(   D  s    j$'' O1D4D4D4MMNNN
:z??aIJJJ:q!Xc5))*QFSE99K. . . . . . . H]:&&'''
 ;$$&&,@,@AAAEBilGHq[QCED%e,, . .=CtVU33fq53u::AIDU1q5\!_v--DU7777777r/   rH   )r;   N)NF)rF   )NrE   r   r   r   )F)NNF)/r   r*   r@   rc   rO   r   r   bitarray._utilr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __all__r   r   r   r2   r    r#   r!   r"   r$   r%   r&   r   r'   r(   r|   r/   r.   <module>r     s  
  
			 



   ) ) ) ) ) ) ) )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
             ([ [ [ [ [ [ [ [|& & & &R* * * *Z3 3 3 3l   (  2   0-& -& -& -&b$ $ $N! ! ! !H48 48 48 48 48r/   