a
    hP$                     @   s   d dl Z d dlZd dlZdd Zdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
G dd dZd dlZedkrG dd dejZe  dS )    Nc                 C   s   t t| dS N   )f2poly_tint)string r   S/homepages/25/d321765456/htdocs/pub_http_internet/grad-school/src/sack/f2poly_tm.pyf2poly_from_string   s    r	   c                 C   s*   | dkrdS d}| r&|d7 }| dL } q|S )Nr      r   )bitsrvr   r   r   idegree   s    
r   c                 C   s6   d}d}|r2|d@ r || |> N }|dL }|d7 }q|S Nr   r   r   )abitsbbitscbitsshiftr   r   r   imul   s    
r   c           
      C   s   |dkr t tj? df td t|}| dkr8ddgS t| }|| }|dk rXd| gS ||> }d}| }|}|}	||kr|d|> @ r||N }|d|	> O }|dL }|d8 }|	d8 }	qp||gS Nr   z(f2poly_tm.iquot_and_rem: Divide by zero.r   printsysstderrexitr   )
r   r   divisor_l1_posdividend_l1_posl1_diffshift_divisorZquotbitsrembits	check_posquot_posr   r   r   iquot_and_rem=   s.    

r"   c           	      C   s   |dkr t tj? df td t|}| dkr4dS t| }|| }|dk rP| S ||> }| }|}|}||kr|d|> @ r||N }|dL }|d8 }|d8 }qd|S r   r   )	r   r   r   r   r   r   r   r    r!   r   r   r   imod`   s*    

r#   c                 C   s   t | }| }d}| dkrb|dkr:ttj? df td q|dk r\ttj? df td qdS n\|dkrndS |dk rttj? df td n.|dkr|d@ r||9 }|d? }||9 }q|S d S )Nr   r   z f2poly_t.iexp:  0 ^ 0 undefined.z!f2poly_t.iexp:  division by zero.z%f2poly_t.iexp:  division by non-unit.)r   r   r   r   r   )r   eZdegZapr   r   r   r   iexp}   s,    
r%   c                 C   sF   | dkr|S |dkr| S | }|}t ||\}}|dkr8qB|}|}q |S )Nr   )r"   )r   r   r   Zdbitsqbitsrbitsr   r   r   igcd   s    r(   c                 C   s   | dkr|ddgS |dkr$| ddgS d}d}d}d}| }|}t ||\}}|dkrTq|}|}|}	|}t||}
|	|
A }|}	|}t||}|	|A }q<|||gS r   )r"   r   )r   r   ZrprimesrZsprimecdqtZqrZqsr   r   r   iext_gcd   s0    




r/   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#S )$r   c                 C   s
   || _ d S Nr   )selfr   r   r   r   __init__   s    zf2poly_t.__init__c                 C   s   t | j|jA }|S r0   r   r   abr+   r   r   r   __add__   s    zf2poly_t.__add__c                 C   s   t | j|jA }|S r0   r4   r5   r   r   r   __sub__   s    zf2poly_t.__sub__c                 C   s.   | j dk r(ttj? d| j  f td | j S )Nr   z$f2poly_t:  signed input %d detected.r   )r   r   r   r   r   r2   r   r   r   check_unsigned_bits   s    

zf2poly_t.check_unsigned_bitsc                 C   s   t |  S r0   )r   r;   r:   r   r   r   degree   s    zf2poly_t.degreec                 C   s   |  }tt| j|S r0   )r;   r   r   r   )r6   r7   r   r   r   r   __mul__   s    zf2poly_t.__mul__c                 C   s   t | j|j\}}t|S r0   r"   r   r   r6   r7   r&   r'   r   r   r   __div__   s    zf2poly_t.__div__c                 C   s   t | j|j\}}t|S r0   r>   r?   r   r   r   __mod__   s    zf2poly_t.__mod__c                 C   s   t t| j|S r0   )r   r%   r   )r6   r$   r   r   r   __pow__   s    zf2poly_t.__pow__c                 C   s   t t| j|jS r0   )r   r(   r   r6   r7   r   r   r   gcd   s    zf2poly_t.gcdc                 C   s*   t | j|j\}}}t|t|t|gS r0   )r/   r   r   )r6   r7   Zgbitsr'   Zsbitsr   r   r   ext_gcd   s    zf2poly_t.ext_gcdc                 C   s   | j |j kS r0   r1   rC   r   r   r   __eq__   s    zf2poly_t.__eq__c                 C   s
   | |k S r0   r   rC   r   r   r   __ne__  s    zf2poly_t.__ne__c                 C   s   | S r0   r   )r6   r   r   r   __neg__  s    zf2poly_t.__neg__c                 C   s   t |d| _d S r   )r   r   )r2   r   r   r   r   scan  s    zf2poly_t.scanc                 C   s
   d| j  S )Nz0x%xr1   r:   r   r   r   __str__	  s    zf2poly_t.__str__c                 C   s   |   S r0   )rJ   r:   r   r   r   __repr__  s    zf2poly_t.__repr__N)__name__
__module____qualname__r3   r8   r9   r;   r<   r=   r@   rA   rB   rD   rE   rF   rG   rH   rI   rJ   rK   r   r   r   r   r      s"   r   __main__c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )
test_casesc                 C   s   d S r0   r   r:   r   r   r   test_f2poly_from_string  s    z"test_cases.test_f2poly_from_stringc                 C   s   d S r0   r   r:   r   r   r   test_idegree  s    ztest_cases.test_idegreec                 C   s   d S r0   r   r:   r   r   r   	test_imul  s    ztest_cases.test_imulc                 C   s   d S r0   r   r:   r   r   r   test_iquot_and_rem  s    ztest_cases.test_iquot_and_remc                 C   s   d S r0   r   r:   r   r   r   	test_imod  s    ztest_cases.test_imodc                 C   s   d S r0   r   r:   r   r   r   	test_iexp  s    ztest_cases.test_iexpc                 C   s   d S r0   r   r:   r   r   r   	test_igcd  s    ztest_cases.test_igcdc                 C   s   d S r0   r   r:   r   r   r   test_iext_gcd  s    ztest_cases.test_iext_gcdN)rL   rM   rN   rQ   rR   rS   rT   rU   rV   rW   rX   r   r   r   r   rP     s   rP   )r   recopyr	   r   r   r"   r#   r%   r(   r/   r   ZunittestrL   ZTestCaserP   mainr   r   r   r   <module>   s    	#" O