�
I�g� � �� � d Z ddlZddlZddlmZmZmZmZmZ ddl m
Z
ddlmZm
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm 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/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m-Z-m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN dd l mOZO dd
lPmQZQmRZRmSZS G d� deT� � ZU d
� ZVedk rd� ZVe
fd�ZWd� ZXe
fd�ZYd� ZZd� Z[d� Z\d� Z]e
dfd�Z^e
dfd�Z_e
fd�Z`e
fd�Zae
dfd�Zbd/d�Zcd/d�Zde
dfd �Zee
fd!�Zfe
fd"�Zge
fd#�Zhe
fd$�Zie
fd%�Zje
fd&�Zke
fd'�Zle
fd(�Zme
fd)�Zne
fd*�Zoe
fd+�Zpe
fd,�Zqe
fd-�Zre
fd.�ZsdS )0z�
This module implements computation of hypergeometric and related
functions. In particular, it provides code for generic summation
of hypergeometric series. Optimized versions for various special
cases are also provided.
� N� )�MPZ_ZERO�MPZ_ONE�BACKEND�xrange�exec_)�gcd)%�
ComplexResult�
round_fast�
round_nearest�negative_rnd�bitcount�to_fixed�from_man_exp�from_int�to_int�
from_rational�fzero�fone�fnone�ftwo�finf�fninf�fnan�mpf_sign�mpf_add�mpf_abs�mpf_pos�mpf_cmp�mpf_lt�mpf_le�mpf_gt�mpf_min_max�mpf_perturb�mpf_neg� mpf_shift�mpf_sub�mpf_mul�mpf_div�
sqrt_fixed�mpf_sqrt�mpf_rdiv_int�mpf_pow_int�to_rational) �mpf_pi�mpf_exp�mpf_log�pi_fixed�mpf_cos_sin�mpf_cos�mpf_sinr+ � agm_fixed)�mpc_one�mpc_sub�mpc_mul_mpf�mpc_mul�mpc_neg�complex_int_pow�mpc_div�mpc_add_mpf�mpc_sub_mpf�mpc_log�mpc_add�mpc_pos� mpc_shift�
mpc_is_infnan�mpc_zero�mpc_sqrt�mpc_abs�mpc_mpf_div�
mpc_square�mpc_exp)�ifac)�
mpf_gamma_int� mpf_euler�euler_fixedc � � e Zd ZdS )�
NoConvergenceN)�__name__�
__module__�__qualname__� � �e/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/mpmath/libmp/libhyper.pyrP rP + s � � � � � ��DrU rP c � � | \ }}}}d� |� � }d|||d|� ||d� |fz }d|v }|dk }|p|} g }
|
j }g }g }
g }g }g }g }g }g } |d� � |d� � |d� � |d� � | r |d � � |r- |d
� � |d� � |d� � |d
� � n |d� � |d� � |d� � |d� � |d� � |d� � |d� � |r7 |d� � |d� � |d� � |d� � |d� � t |� � D �]�\ }}ddg||k }|dk r3||g||k � |� � |d|||fz � � �M|dk r5|
|g||k � |� � |d|||||fz � � ��|dk r}||g||k � |� � |d|z � � |d� � |d� � |d� � |d||fz � � |d� � |d ||fz � � ��|dk r�||g||k � |� � |d!|z � � |d"� � |d� � |d#� � |d
� � |d� � |d� � |d$||fz � � |d� � |d%||fz � � |d� � |d� � |d&||fz � � |d� � |d'||fz � � ���t �t |� � }t |� � }t ||� � }||d� }||d� } |d(� � |d)� � |d*� � | r |d+� � |d,� � d-� d.� |D � � d/� |
D � � z d0� |D � � z � � }d-� d1� |D � � d2� |D � � z d3� |
D � � z d4gz � � }|r |d5|z � � |d6|z � � |d7� � |r |d8� � |d9� � |d:� � | �r�t
|� � D ]} |d;|| || fz � � �|D ].} |d<� d=t |� � � � � � �/|D ].} |d>� d=t |� � � � � � �/t
|� � D ]} |d?|| || fz � � �|D ].} |d@� d=t |� � � � � � �/|D ].} |dA� d=t |� � � � � � �/|r;|r" |dB� � |dC� � |dD� � nQ |dE� � |dF� � n:|r" |dG� � |dC� � |dD� � n |dH� � |dI� � |D ]D} |dJ� d=t |� � � � � � |dC� � |dD� � �E|D ]�} |dK� d=t |� � � � � � |dL� d=t |� � � � � � |dM� d=t |� � � � � � |dN� d=t |� � � � � � |dO� d=t |� � � � � � ��n�t
|� � D ]} |d;|| || fz � � �|D ].} |d<� d=t |� � � � � � �/|D ].} |d>� d=t |� � � � � � �/|r |dP� � n |dH� � | r- |dQ� � |dR� � |dS� � |dT� � n! |dQ� � |dU� � |dT� � |dV� � |dW� � |D ].} |dX� d=t |� � � � � � �/|D ].} |dY� d=t |� � � � � � �/|
D ].} |dZ� d=t |� � � � � � �/|D ].} |d[� d=t |� � � � � � �/|D ].} |d\� d=t |� � � � � � �/|D ].} |d]� d=t |� � � � � � �/|D ].} |d^� d=t |� � � � � � �/|D ].} |d_� d=t |� � � � � � �/| r� |d`� � |da� � |db� � |dc� � |dd� � |de� � |df� � |dg� � |dh� � |d� � |di� � |dj� � nB |d`� � |db� � |dk� � |d� � |di� � |dl� � dm� dn� |
D � � � � }
do|z |
z }
i }t |
t � � |� � |
|| fS )pz�
Returns a function that sums a generalized hypergeometric series,
for given parameter types (integer, rational, real, complex).
� zhypsum_%i_%i_%s_%s_%sN�Cz$MAX = kwargs.get('maxterms', wp*100)zHIGH = MPZ_ONE<<epsshiftzLOW = -HIGHz!SRE = PRE = one = (MPZ_ONE << wp)zSIM = PIM = MPZ_ZEROzxsign, xm, xe, xbc = z[0]zif xsign: xm = -xmzysign, ym, ye, ybc = z[1]zif ysign: ym = -ymzxsign, xm, xe, xbc = zzoffset = xe + wpzif offset >= 0:z ZRE = xm << offsetzelse:z ZRE = xm >> (-offset)zoffset = ye + wpz ZIM = ym << offsetz ZIM = ym >> (-offset)�A�B�Zz%sINT_%i = coeffs[%i]�Qz!%sP_%i, %sQ_%i = coeffs[%i]._mpq_�Rz%xsign, xm, xe, xbc = coeffs[%i]._mpf_z %sREAL_%i = xm << offsetz %sREAL_%i = xm >> (-offset)z__re, __im = coeffs[%i]._mpc_zxsign, xm, xe, xbc = __rezysign, ym, ye, ybc = __imz %sCRE_%i = xm << offsetz %sCRE_%i = xm >> (-offset)z %sCIM_%i = ym << offsetz %sCIM_%i = ym >> (-offset)zfor n in xrange(1,10**8):z if n in magnitude_check:z" p_mag = bitcount(abs(PRE))z. p_mag = max(p_mag, bitcount(abs(PIM)))z% magnitude_check[n] = wp-p_magz * c �T � g | ]%}d � dt |� � � � ��&S )zAINT_#�#��replace�str��.0�is rV �
<listcomp>z%make_hyp_summator.<locals>.<listcomp>� �. � �I�I�I�q�X�-�-�c�3�q�6�6�:�:�I�I�IrU c �T � g | ]%}d � dt |� � � � ��&S )zAP_#r` ra rd s rV rg z%make_hyp_summator.<locals>.<listcomp>� �, � �G�G�G�Q�V�^�^�C��Q���8�8�G�G�GrU c �T � g | ]%}d � dt |� � � � ��&S )zBQ_#r` ra rd s rV rg z%make_hyp_summator.<locals>.<listcomp>� rj rU c �T � g | ]%}d � dt |� � � � ��&S )zBINT_#r` ra rd s rV rg z%make_hyp_summator.<locals>.<listcomp>� rh rU c �T � g | ]%}d � dt |� � � � ��&S )zBP_#r` ra rd s rV rg z%make_hyp_summator.<locals>.<listcomp>� rj rU c �T � g | ]%}d � dt |� � � � ��&S )zAQ_#r` ra rd s rV rg z%make_hyp_summator.<locals>.<listcomp>� rj rU �nz
mul = z
div = z if not div:z if not mul:z breakz raise ZeroDivisionErrorz$ PRE = PRE * AREAL_%i // BREAL_%iz PRE = (PRE * AREAL_#) >> wpr` z PRE = (PRE << wp) // BREAL_#z$ PIM = PIM * AREAL_%i // BREAL_%iz PIM = (PIM * AREAL_#) >> wpz PIM = (PIM << wp) // BREAL_#zI PRE, PIM = (mul*(PRE*ZRE-PIM*ZIM))//div, (mul*(PIM*ZRE+PRE*ZIM))//divz PRE >>= wpz PIM >>= wpz* PRE = ((mul * PRE * ZRE) >> wp) // divz* PIM = ((mul * PIM * ZRE) >> wp) // divz= PRE, PIM = (PRE*ZRE-PIM*ZIM)//div, (PIM*ZRE+PRE*ZIM)//divz$ PRE = ((PRE * ZRE) >> wp) // divz$ PIM = ((PIM * ZRE) >> wp) // divz; PRE, PIM = PRE*ACRE_#-PIM*ACIM_#, PIM*ACRE_#+PRE*ACIM_#z% mag = BCRE_#*BCRE_#+BCIM_#*BCIM_#z re = PRE*BCRE_# + PIM*BCIM_#z im = PIM*BCRE_# - PRE*BCIM_#z PRE = (re << wp) // magz PIM = (im << wp) // magz* PRE = ((PRE * mul * ZRE) >> wp) // divz SRE += PREz SIM += PIMz1 if (HIGH > PRE > LOW) and (HIGH > PIM > LOW):z
breakz if HIGH > PRE > LOW:z if n > MAX:zc raise NoConvergence('Hypergeometric series converges too slowly. Try increasing maxterms.')z AINT_# += 1z BINT_# += 1z AP_# += AQ_#z BP_# += BQ_#z AREAL_# += onez BREAL_# += onez ACRE_# += onez BCRE_# += onez%a = from_man_exp(SRE, -wp, prec, 'n')z%b = from_man_exp(SIM, -wp, prec, 'n')zif SRE:z if SIM:z( magn = max(a[2]+a[3], b[2]+b[3])z else:z magn = a[2]+a[3]z elif SIM:z magn = b[2]+b[3]z magn = -wp+1zreturn (a, b), True, magnz magn = a[2]+a[3]zreturn a, False, magn�
c 3 � K � | ] }d |z V � �
dS )z NrT )re �lines rV � <genexpr>z$make_hyp_summator.<locals>.<genexpr>+ s&