a
    RG5dU  ã                   @   s¤   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 d dlmZ ddlmZmZmZmZ d dlZdd„ Zdd	„ Zd
d„ Zddd„ZdgZdS )é    )ÚfzeroÚfrom_intÚfrom_rationalÚfoneÚfhalfÚbitcountÚto_intÚto_strÚmpf_mulÚmpf_divÚmpf_subÚmpf_addÚmpf_sqrtÚmpf_piÚmpf_cosh_sinhÚmpf_cosÚmpf_sin)Úigcdé   )Ú_sqrt_mod_prime_powerÚlegendre_symbolÚjacobi_symbolÚis_quad_residueNc                  C   sæ   d} dg|  a dg|  at| d ƒd }td|ƒD ]:}t | dkr2t|| | |ƒD ]}t | dkrR|t |< qRq2td| ƒD ]h}t | dkrž|t |< |d t|< qxt | }|| }|| dkrÌt| | t|< qxt| |d  t|< qxd S )Né † r   r   ç      à?é   é   )Ú_factorÚ_totientÚintÚrange)ÚmaxnÚlimÚiÚjÚxÚy© r'   úU/var/www/html/django/DPS/env/lib/python3.9/site-packages/sympy/ntheory/partitions_.pyÚ_pre
   s&    

r)   c                 C   sR  |dkrt S |}d}t| }|| dkr:|| }|d7 }q|| }dd|   }t|ƒ}|dkr |dkrd| }	|	||	  }|td|d |	ƒ |	 }t|d|d ƒd }
tttd|
 ƒ||ƒt|	ƒ|ƒ}tttd	| t|
d |
ƒ ƒt	t|ƒ|ƒ|ƒt
||ƒ|ƒS |dkr¾d| }	|	||	  }|dkrH|td
|d d |	ƒ |	 }t|d|d ƒd }
tttd|
 ƒ||ƒt|	ƒ|ƒ}tttdd	|d   t|
dƒ ƒt	t|d ƒ|ƒ|ƒt
||ƒ|ƒS |||  }|| dkr|dkrtttd|ƒƒt	t|ƒ|ƒ|ƒS tS t||ƒstS ||d  |d  }|td|d |ƒ }t|||ƒd }
tttd|
 ƒ||ƒt|ƒ|ƒ}tttdtd|ƒ ƒt	t|ƒ|ƒ|ƒt||ƒ|ƒS |dks´|dkrrt|dƒt|dƒ }}d||  }|| |  |d d |  t|| | | t| d |ƒ | }|| |  |d d |  t|| | | t| d |ƒ | }tt|||ƒt|||ƒ|ƒS |dkròd|  d tdt| d |ƒ | }d| d |d d d  |d  d  d }tttd	ƒt|||ƒ|ƒt|||ƒƒS d|  d tdt| d |ƒ | }d| |d d d  d  d }tt|||ƒt|||ƒ|ƒS )z‹ Compute the inner sum in HRR formula [1]_

    References
    ==========

    .. [1] http://msp.org/pjm/1956/6-1/pjm-v6-n1-p18-p.pdf

    r   r   é   r   é   é	   é   é   éÿÿÿÿé@   i@  r   é€   é    )r   r   r   Úpowr   r   r
   r   r   r   r   r   r   r   r   r   r   Ú_a)ÚnÚkÚprecÚk1ÚeÚpÚk2ÚvÚpiÚmodÚmÚargZ_phiÚd1Úd2Ún1Ún2r'   r'   r(   r4   "   s¸    	


ÿÿþ
ý

ÿþ
ý
þþþ
ýÿÿÿÿ
$,þ
ý$ r4   c                 C   s”   t |ƒ}t|ƒ}t|||ƒ}tt | ƒtdd|ƒ|ƒ}t||ƒ}tt||ƒ|ƒ\}	}
tt||ƒtt||ƒ|ƒ|ƒ}tt||	ƒt|
||ƒ|ƒ}t||ƒS )z„
    Compute the sinh term in the outer sum of the HRR formula.
    The constants sqrt(2/3*pi) and sqrt(8) must be precomputed.
    r   r*   )r   r   r   r   r   r   r   r
   )r5   r$   r7   Úsq23piÚsqrt8r=   ÚaÚbÚcÚchÚshÚDÚEr'   r'   r(   Ú_dx   s    
þrN   Fc              
   C   sr  t | ƒ} | dk rdS | dkr(g d¢|  S dtƒ vr8tƒ  t tjd|  d d  t d|  ¡ t d	¡ d
 ƒt d	d¡ }t |d d ƒ }}t}tdt d| d  d ƒƒ}|dkr¼tdƒ‚t	t
tdd|ƒ|ƒt|ƒ|ƒ}t
tdƒ|ƒ}td
|ƒD ]j}	t| |	|ƒ}
t| |	|||ƒ}t|t	|
|ƒ|ƒ}|rHtd|	d|t|
d	ƒt|d	ƒƒ ttt|ƒƒƒd }qòt tt|t|ƒƒƒS )aæ  
    Calculate the partition function P(n), i.e. the number of ways that
    n can be written as a sum of positive integers.

    P(n) is computed using the Hardy-Ramanujan-Rademacher formula [1]_.


    The correctness of this implementation has been tested through $10^{10}$.

    Examples
    ========

    >>> from sympy.ntheory import npartitions
    >>> npartitions(25)
    1958

    References
    ==========

    .. [1] http://mathworld.wolfram.com/PartitionFunctionP.html

    r   r   )r   r   r   r-   r   é   r   r   g      @r   r.   é
   r   gš™™™™™ñ?éd   é   g¸…ëQ¸Î?r   zInput too bigr-   r+   ÚstepÚofé2   )r   Úglobalsr)   Úmathr=   Úlogr   ÚmaxÚ
ValueErrorr
   r   r   r   r   r    r4   rN   r   Úprintr	   r   Úabsr   r   )r5   ÚverboseZpbitsr7   r:   ÚsÚMrE   rF   ÚqrG   Údr'   r'   r(   ÚnpartitionsŠ   s@    
ÿþþ
ýrb   )F)Zmpmath.libmpr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Úsympy.core.numbersr   Úresidue_ntheoryr   r   r   r   rW   r)   r4   rN   rb   Ú__all__r'   r'   r'   r(   Ú<module>   s   LV
6