U
    0e3&                     @   s4  d dl mZ d dlmZ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 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mZmZ d dlm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 )0    )prod)QQZZ)xtheta)	factorint)n_order)Polycyclotomic_poly)DomainMatrix)	round_two)StructureError)
PowerBasisto_col)prime_decomp_two_elt_rep*_check_formal_conditions_for_maximal_order)raisesc                     s   t tdt} t| }|dtdt   dtdt |tdtd d d df tt	 fdd tt	fdd tt	fd	d d S )
N            c                      s   t  S Nr    )Br   N/tmp/pip-unpacked-wheel-_6tpq7m6/sympy/polys/numberfields/tests/test_primes.py<lambda>       z@test_check_formal_conditions_for_maximal_order.<locals>.<lambda>c                      s   t  S r   r   r   )Cr   r   r      r   c                      s   t  S r   r   r   )Dr   r   r      r   )
r	   r
   r   r   Zsubmodule_from_matrixr   Zeyer   r   r   )TAr   )r   r    r!   r   .test_check_formal_conditions_for_maximal_order   s    "r$   c                  C   s   d} t t| }t|\}}dD ]d}t||}|D ]P}|| |j|  }| }t|||}	|	|jkr2|| |	|  }
|
|ks2tq2q d S )N            r   )r	   r
   r   r   alphaZbasis_element_pullbacksr   AssertionError)ellr"   ZKdKpPPiHZgensbZH2r   r   r   test_two_elt_rep!   s    

r4   c                  C   sz   d} t t| }t|\}}t| |||d}t|dks<t|d }|| | }||jks`t|d| dksvtd S )Nr%   r.   r-      r   r   )r	   r
   r   r   lenr+   Z	valuatione)r/   r"   r-   r.   r0   P0vr   r   r   test_valuation_at_prime_ideal7   s    r;   c                  C   s   t td} ttdd  td| }t|dks4t|d }|jdksJt|jdksXt|d |j	ksjt|d |kszt|d d|j	 kstd S )Nr%   c                   S   s   t dS )Nr%   )r   r   r   r   r   r   I   r   ztest_decomp_1.<locals>.<lambda>r6   r      )
r	   r
   r   
ValueErrorr   r7   r+   r8   fr-   )r"   r0   r9   r   r   r   test_decomp_1D   s    
r?   c                  C   st   d} t t| }dD ]Z}t|| }| d | }t||}t||ksHt|D ] }|jdks^t|j|ksLtqLqd S )Nr%   r&   r6   )r	   r
   r   r   r7   r+   r8   r>   )r,   r"   r/   Zf_expZg_expr0   r1   r   r   r   test_decomp_2U   s    

r@   c               	   C   s   t td d } i }t| |d\}}dD ]V}t|| ||||d}t|dksTt|d jdksft|d d || ks(tq(d S )Nr   #   Zradicals)r   r   r%   r.   r-   radicalr6   r   r	   r   r   r   getr7   r+   r8   r"   radr-   r.   r/   r0   r   r   r   test_decomp_3c   s    rI   c               	   C   s   t td d } i }t| |d\}}dD ]V}t|| ||||d}t|dksTt|d jdksft|d d || ks(tq(d S )Nr      rB   )r   r%   rC   r6   r   rE   rG   r   r   r   test_decomp_4p   s    rK   c               	      s  dD ]} t td |  }i }t||d\}}d}t||||||d | d dkrt dksdtt fddtdD stt	d	d  D || kstq| d d
kstt dkst d j
dkst d jdkst d  || kstqd S )N)ir   rB   rC      r6   c                 3   s*   | ]"} | j d ko  | jd kV  qdS r6   Nr8   r>   ).0ir0   r   r   	<genexpr>   s     z test_decomp_5.<locals>.<genexpr>c                 s   s   | ]}||j  V  qd S r   r8   rP   r1   r   r   r   rS      s     r   r   )r	   r   r   r   rF   r7   r+   allranger   r8   r>   as_submodule)dr"   rH   r-   r.   r/   r   rR   r   test_decomp_5}   s     rZ   c                  C   s   t td td  dt  d } i }t| |d\}}d}t|| ||||d}t|dks`ttdd |D svttdd |D || kstd S )	Nr   r   rM   rB   rC   c                 s   s*   | ]"}|j |j  kod kn  V  qdS rN   rO   rU   r   r   r   rS      s     z test_decomp_6.<locals>.<genexpr>c                 s   s   | ]}||j  V  qd S r   rT   rU   r   r   r   rS      s     )	r	   r   r   r   rF   r7   r+   rV   r   rG   r   r   r   test_decomp_6   s     r[   c                  C   s   t td td  dt  d } t| }d}||}| }t|dksPttdd |D sftt	dd |D || kstd S )Nr   r   rM   c                 s   s*   | ]"}|j |j  kod kn  V  qdS rN   rO   rU   r   r   r   rS      s     z test_decomp_7.<locals>.<genexpr>c                 s   s   | ]}||j  V  qd S r   rT   rU   r   r   r   rS      s     )
r	   r   r   alg_field_from_polyprimes_abovemaximal_orderr7   r+   rV   r   )r"   Kr/   r0   r-   r   r   r   test_decomp_7   s     

r`   c                  C   s  t d dt d   dt   d t d dt d   dt   d t d dt d   t  d t d dt d   dt   d t d dt d   d t d dt d   dt   d t d dt d   d t d dt d   dt   d t d dt d   t  d t d dt d   dt   d t d dt d   dt   d t d dt d   dt   d t d dt d   dt   d t d dt d   dt   d t d d	t d   dt   d t d d
t d   d	t   d f} dd }d}| D ]}t|}i }t||d\}}| }|| }	t|	}
|
D ]b}||}t|||||d}tdd |D }|| }|rj||||||| ||kstqqd S )Nr   r   r   r   r<   r6   r%   rM   	      r(   c                 S   sX   t d t | || |D ]}t d|d qt d| t d| t d||k  dS )z2Useful for inspection, when running test manually.z====================z  ()zI: zJ: zEqual: N)print)r"   r/   rD   r0   IJr1   r   r   r   display   s    

ztest_decomp_8.<locals>.displayFrB   rC   c                 s   s   | ]}||j  V  qd S r   rT   rU   r   r   r   rS      s     z test_decomp_8.<locals>.<genexpr>)	r   r	   r   Zdiscriminantr   rF   r   r   r+   )Zcasesrg   inspectgr"   rH   r-   r.   ZdTZ	f_squaredFr/   rD   r0   re   rf   r   r   r   test_decomp_8   sD    	
rk   c                  C   sN   t td} td| d }|jdks(t| d|j ks>t|dksJtd S )Nr%   r   r   r<   )r	   r
   r   r>   r+   rX   r-   r"   r9   r   r   r   test_PrimeIdeal_eq   s
    rm   c                  C   s8   t td} td| d }|d|j  | ks4td S )Nr%   r   )r	   r
   r   r-   rX   r+   rl   r   r   r   test_PrimeIdeal_add   s    rn   c                  C   s   t ttd d } | dd }t|dks4t| dd }t|dksRtt jttd d dd} | dd }t|d	kst| dd }t|dkstd S )
Nr   r%   r   z(2, 3*_x/2 + 1/2)r   z(3)r*   )aliasz(2, 3*alpha/2 + 1/2))r   r\   r	   r   r]   strr+   )kfrpr   r   r   test_str   s    rs   c                  C   sv   t td d } t| \}}td| ||d}t|d dks@t|d jtddksXt|d jtdd	d
ksrtd S )Nr   r%   r5   r   z[ (2, (3*x + 1)/2) e=1, f=1 ])	field_genz![ (2, (3*theta + 1)/2) e=1, f=1 ]T)rt   Z	just_gensz(2, (3*theta + 1)/2))r	   r   r   r   reprr+   r   )r"   r-   r.   r0   r   r   r   	test_repr  s    rv   c                  C   s  t ttd td  dt  d } |  }| d}|d }|jtdddgdd}|jtdd	dgdd}||}||kst	| t ddt ddt ddg}| t ddt d	dt ddg}|
|}||kst	| |}| |}||}||kst	d S )
Nr   r   rM         r)   r<   )Zdenomr   )r   r\   r	   r   r^   r]   parentr   Zreduce_elementr+   Z
reduce_ANPZ
to_alg_numZreduce_alg_num)rq   ZZkr0   rr   aZa_bar_expectedZa_barr   r   r   test_PrimeIdeal_reduce  s     &

  



r{   c                  C   sH   t ttd td  dt  d } | d}|d jdsDtd S )Nr   r   rM   r   )r   r\   r	   r   r]   r*   equivr+   )rq   r0   r   r   r   test_issue_23402%  s    &
r}   N)/mathr   Zsympyr   r   Z	sympy.abcr   r   Zsympy.ntheoryr   Zsympy.ntheory.residue_ntheoryr   Zsympy.polysr	   r
   Zsympy.polys.matricesr   Zsympy.polys.numberfields.basisr   Z#sympy.polys.numberfields.exceptionsr   Z sympy.polys.numberfields.modulesr   r   Zsympy.polys.numberfields.primesr   r   r   Zsympy.testing.pytestr   r$   r4   r;   r?   r@   rI   rK   rZ   r[   r`   rk   rm   rn   rs   rv   r{   r}   r   r   r   r   <module>   s8   0
	