� ��g�I����dZddlmZddlmZddlmZddlmZddl m Z ddl m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZddlmZdd lm Z dd 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBdd lCmDZDmEZEdd lFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSdd lTmUZUmVZVmWZWddlXmYZYmZZZm[Z[ddl\m]Z]ddl^m_Z_ddl`maZad�Zbd�Zcd�Zdd�Zed�ZfGd�de��ZgGd�de��Zhe d��ZiGd�d��ZjGd�d��ZkGd �d!��ZlGd"�d#��ZmGd$�d%��ZnGd&�d'en��ZoGd(�d)en��ZpGd*�d+en��ZqGd,�d-en��ZrGd.�d/en��ZsGd0�d1en��ZtGd2�d3en��ZuGd4�d5en��ZvGd6�d7en��ZwGd8�d9en��ZxGd:�d;en��ZyGd<�d=en��ZzGd>�d?en��Z{Gd@�dAen��Z|dB�Z}dC�Z~dD�ZdE�Z�dF�Z�dG�Z�dH�Z�dI�Z�dJ�Z�dK�Z�dL�Z�dMa�ge dN��dOddPfdQ�Z�dR�Z�dMa� dVdT�Z�dVdU�Z�dMS)Wa@ Expand Hypergeometric (and Meijer G) functions into named special functions. The algorithm for doing this uses a collection of lookup tables of hypergeometric functions, and various of their properties, to expand many hypergeometric functions in terms of special functions. It is based on the following paper: Kelly B. Roach. Meijer G Function Representations. In: Proceedings of the 1997 International Symposium on Symbolic and Algebraic Computation, pages 205-211, New York, 1997. ACM. It is described in great(er) detail in the Sphinx documentation. �)� defaultdict)�product)�reduce)�prod)� SYMPY_DEBUG)�S�Dummy�symbols�sympify�Tuple�expand�I�pi�Mul� EulerGamma�oo�zoo� expand_func�Add�nan�Expr�Rational)�Mod��default_sort_key)!�exp�sqrt�root�log� lowergamma�cos�besseli�gamma� uppergamma�expint�erf�sin�besselj�Ei�Ci�Si�Shi�sinh�cosh�Chi�fresnels�fresnelc� polar_lift� exp_polar�floor�ceiling�rf� factorial�lerchphi� Piecewise�re� elliptic_k� elliptic_e)�polarify� unpolarify) �hyper�HyperRep_atanh�HyperRep_power1�HyperRep_power2� HyperRep_log1�HyperRep_asin1�HyperRep_asin2�HyperRep_sqrts1�HyperRep_sqrts2� HyperRep_log2�HyperRep_cosasin�HyperRep_sinasin�meijerg)�Matrix�eye�zeros)�apart�poly�Poly)�residue)� powdenest��siftc��|jrt|d��S|���\}}t|d��|zS�N�)� is_Numberr� as_coeff_Add)�x�cs �j/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/sympy/simplify/hyperexpand.py�_mod1r^UsA�� �{���1�a�y�y�� �>�>� � �D�A�q� �q�!�9�9�q�=��c�=����� � �tdt���\���� ����� fd�}����� fd�}|ddt� ����|�fdt� � ����|��tjz fd�zft t�� ��t�tjz� ��dz g��t ddgg��t �tjz � zd� z z tj�z � zd� z z g�d� z z �� dz zd� z z gg����|d d t t� ��dg��t d � z dgg��t d� � dz z gddgg����|tjdft d ��ft t� ��dg��t ddgg��t td d��dd� z z dz gddgg����|tjtjft d ��ft t� ��ttd d��� ��g��t ddgg��t td d��tjgd� d� z z dz gg����|�tj�zftjft t� � ��t� tjz � �� g��t ddgg��t d� g� d �zdz zdz d� z z tj� d �zdz zd� z z z gg����|�� gtjgt t�� ��t�� ��g��t ddgg��t d� g�� zd� z z dd� z z dz gg����|ddgdtjzgt t!� ��dg��t ddgg��t � tjz d� z z dd� z z dz gddgg����|tjtjgtjgt t%� ��t'� ��g��t dt(z dgg��t td d��d d� zdz z gtd d��tjgg����|td d��tjgtjgt t%� ��t'� ��g��t ddt(z gg��t td d��d d� zdz z gtd d��tjgg����|td d��ddgtjdgt � t� ��zt� ��dg��t td d��tj d� zz tdd��gg��t tjd� d� z z dz gdd� � dz z ggd�g����|td d��ddgddgt ttj� ��t+� ��dg��t tdd��dd� zz z dd� zz dd� zz gg��t � dz � dz z ddgdd� dz zz dtjggd�g����|dg�gt � d�z zt� ��zt-�dz � ��zdg��t �dz dgg��t d�z � zdgddgg����|�gd�zgt � tj�z zt� dz ��zt/�tjz � dz ��zt1�tjz��zdtj�z zz � tj�z zt� dz ��zt/�tjz� dz ��zt1�tjz��zdtj�z zz g��t ddgg��t � dz � dz g� dz � dz d�zz gg����t3d ��� z}|�g�dzgt |� z�zt-�|��z�t� ��zg��t ddgg��t � dgd� gg����|td d��gtjgt� ��t5t(� z��t6 zt9t6t5� ��z��zz ��|dgtdd��tdd��gt t5t(��t6t;dt5� ��z��zt=dt?� d��ztt6t(zdz ��zt5t(��z ��ztAdt5� ��z��tCdt?� d��ztt6t(zdz ��zt5t(��z ��zzztt6 t(zdz ��zdt?� d��zz t5t(��t?� d��zt;dt5� ��z��tCdt?� d��ztt6t(zdz ��zt5t(��z ��zt6tAdt5� ��z��zt=dt?� d��ztt6t(zdz ��zt5t(��z ��zzztt6 t(zdz ��zdz dg��t gd�g��t td d��dtdd��g� tdd��dggd�g����|tj�gtdd���dzgt �d�zdz z t6 zt5t(� z ��zt9t6t5� ��z��z�d�zdz z t3d ��� z� zzt-�t3d ��� z��z�d�zdz z t� ��zg��t gd�g��t td d��ddgd� dgdd� gg����|ddgddgt tE� ��tG� ��z t� ��dtHg��t d� z ddd � z gg��t gd�d� ddggd�gd�g����|dtjftAdt5� ��z����|g�gt t1���� d�z dz zzt/�dz dt5� ��z��zt1���� d�dz z zzt/�dt5� ��z��zg��t ddgg��t ddg� d�z gg����d� tdd��zz� � fd�}� fd�}|gtj��tjzgt |d�zdz � ��|d�z� ��� tdd��zz|d�zdz � ��t5� ��z|d�z� ��� tdd��zzg��dd �zzzt1d�z��z� dd�zz dz zzt gd�g��t gd�dtj�z ddgddtjdg� ddd�z gg����dd� ztdd��zztKt6t(zdz ��z� |g��tjzd�zgdt5t3d ��� z��zdd�zz zt1d�z��dzzt tMd�zdz � ��t/d�zdz � ��z� t/d�z� ��tMd�zdz � ��zt/d�zdz � ��tMd�z� ��zz z� dzt/d�z� ��ztMd�z� ��z� dzt/d�z� ��tMd�zdz � ��zt/d�zdz � ��tMd�z� ��zzzg��zt gd�g��t dtdd��ddgddd�zz dz td d��dgdddd�zz tdd��gd� zddd�z gg����|�g�tjz d�zgt � tj�z zt/�tjz t5� ����dzz� d�z zt/�tjz t5� ����zt/�tdd��z t5� ����z� tdd���z zt/�tdd��z t5� ����dzzg��t t1�tjz��dz dtj�z zz dt1�tjz ��zt1�tjz��zdd�z zz dgg��t dd�zz ddg� dz tj�z tjgd� dgg����|tjg�d�z gt(d�z ztOt(�z��z t t/d�z t5� ����t/�dz t5� ����zt5� ��t/� t5� ����t/�dz t5� ����zt/d�z t5� ����t/�t5� ����zzzt/� t5� ����t/�t5� ����zg��zt gd�g��t �dz tjdg� d� gdtj� gg����|tjgtdd��tdd��gt tQdt5� ��z��dz t5� ��z t;dt5� ��z��dz t5� ��z tAdt5� ��z��g��t gd�g��t td d��tjdgdtd d��tjgdd� zdgg����|tdd��gtdd��tdd��gt t=tt(t6zdz ��t?� d��zdzt5t(��z ��t(tt(t6zdz ��t?� d��zdzt5t(��z dzzz t;dt5� ��z��t5� ��z tAdt5� ��z��g��t gd�g��t tdd��tdd��dgdtd d��dgd� dgg����|tdd��gtjtdd��gt t5t(��tt6 t(zdz ��ztCdt?� d��ztt6t(zdz ��zt5t(��z ��zdt?� d��zz tAdt5� ��z��t;dt5� ��z��t5� ��zg��t gd�g��t td d��tdd��dggd �d� tjgg����|��tjzgd�z�d�z�z dzgt1���t1d�z�z dz��zt5� ��dz dd�zz zzt t/�dz t5� ����t/d�z�z t5� ����zt5� ��t/�t5� ����zt/d�z�z t5� ����zt5� ��t/�dz t5� ����zt/d�z�z dzt5� ����zt/�t5� ����t/d�z�z dzt5� ����zg��zt gd�g��t dtjtjdg� dz d�z d� dz g� dz d�d�zz � dz gdtjtjd �zgg����|ddgddtdd��gt tSdt5� ��z��tGdt5� ��z��z tAdt5� ��z��t5� ��t;dt5� ��z��zdtHg��t d� z dddd � z gg��t dtjdtd d��dggd!�d� tjddggd"�gd"�g����|dd�gdd�dzgt �tG� ��tUd� ��ztHzz� �dzd�zz dzzz �� � zzt1���tW�� ��z z�dz dzz �t� ��z�dzd�zz dzz �� �dzd�zz dzzz g��t d�z dd � z dgg��t d dd � z dgd� ddgdd� dggd#�g����d$S)%z Create our knowledge base. za b c, z)�clsc �x��t||��}��t|�|���f����dS�N��Hyper_Function�append�Formula) �ap�bq�res�func�a�br\�formulae�zs �����r]�addzadd_formulae.<locals>.addhs>����b�"�%�%�������a��q�!�Q�i�8�8�9�9�9�9�9r_c �~��t||��}� �t|� d���f|||����dSrcrd) rhri�B�C�Mrkrlrmr\rnros �����r]�addbzadd_formulae.<locals>.addblsD����b�"�%�%�������a���1�a�y�!�Q��B�B�C�C�C�C�Cr_��rXr)rXrX)rw�����z3/2������)rrr�� ��)rXrr)rXrxr)rrXrxr)rrrrc�F��t|���t|���zSrc�r"r(�rlror[s �r]�fpzadd_formulae.<locals>.fp������q�!�}�}�w�q�!�}�}�,�,r_c�F��t|���t|���z Srcr�r�s �r]�fmzadd_formulae.<locals>.fm�r�r_)rXrrr)rrXrri�����)�rr�����)rrrX)rrrXrr)rrrrr)rrrrxN),r r rrAr�HalfrLrBrCr@rrDrFrGrIrJrE�Oner;r<rrHr r"r#r2rrr&r-r0rr.r1r)rrr3r(r'r,r/r%r$) rnrpru�mzr�r�rlrmr\r[ros ` @@@@@r]� add_formulaer�dsf�����������/�/�/�J�A�q�!�Q�:�:�:�:�:�:�:�:�:�D�D�D�D�D�D�D�D�D��C��B��A�������C���r�?�A�2�q�)�)�*�*�*� �D�!�Q���Z��1�Q�3�'� ���A�&�&� ��Q�V��Q�/�/��1�3� 4� 4� �!�Q��� � � �1�q�v�:�q�.�!�a�%�(�1�6�A�:�q�.�!�a�%�*@�A��Q��U�)�Q��A��Y��A��.�/�1� 2� 2� 3�3�3�  �D��� ��q�!�!�1�%� &� &���A��q� �{�(;�(;� �!�Q��A��Y��!�Q��(� )� )�+�+�+� �D�!�&�!��q��x�x�l� ���"�"�A�&� '� '� �!�Q��� � � �(�2�q�/�/�1�a�!�e�9�Q�;�/�!�Q��8� 9� 9�;�;�;� �D�!�&�!�&� �A�e�H�H�<� ���"�"�O�H�R��O�O�Q�$G�$G�H� I� I� �!�Q��� � � �(�2�q�/�/�1�6�*�Q��1�q�5� �!� �,<�=� >� >�@�@�@� �D�!�Q�V�a�Z��1�6�*� ��!��Q�'�'�/�1�"�q�v�+�q�*I�*I�)I�J� K� K� �!�Q��� � � �!�a�R���R��T�A�X�,�q�.�!�a�%�(�!�&�1�b��d�Q�h�<��Q��3G�*G�H�J� K� K�L�L�L� �D�!�a�R��1�6�(� �!�!�Q�'�'�)9�!�Q�)?�)?�@� A� A� �!�Q��� � � �!�a�R��1�Q�3��A��;��1�q�5� �!� �4�5� 6� 6�8�8�8� �D�!�Q��!�A�F�(�� ���"�"�A�&� '� '��!�Q���)9�)9� �1�q�v�:��A��&��1�q�5� �!� �4�q�!�f�=� >� >�@�@�@�  �D�!�&�!�&� �A�E�7� ��A��� �1� � �.� /� /� �!�B�$��� � � � �(�2�q�/�/�2�q��s�1�u�:�.��2�q�/�/�1�6�*�,� -� -�.�.�.�  �D�(�2�q�/�/�1�6� "�Q�U�G� ��A��� �1� � �.� /� /� �!�Q�r�T�� � � � �(�2�q�/�/�2�q��s�1�u�:�.��2�q�/�/�1�6�*�,� -� -�.�.�.� �D�(�2�q�/�/�1�a� �1�6�1�+� ��>�!�$�$�$�m�A�&6�&6��:� ;� ;� �(�2�q�/�/�A�E�6�1�Q�3�<��!�Q���@�A� B� B� �!�&�!�Q��A��Y�q�[�)��Q��1�q�5� �"����� � ���� �D�(�2�q�/�/�1�a� �1�a�&� �����+�+�]�1�-=�-=�q�A� B� B� �(�1�a�.�.�2�q��s�8�+�Q��!��W�b�!�A�#�h�?�@� A� A� �!�A�#�q�1�u�+�q�!�$�q�!�Q��U�)�}�a���&@�)�)�)�L� M� M�O�O�O�  �D�!��q�c�6�1�q�1�u�:��A���.��A��E�1�1E�1E�E�q�I�J�J� �!�a�%��� � � �v��A��� �1�~��1�v�&>�?�?�A�A�A��D�!��q��s�e� ��Q�V�a�Z���Q�q�S���)�'�!�a�f�*�a��c�*B�*B�B���Q�V��$�$�%�%&���!��_�5��Q�V�a�Z���Q�q�S���)�'�!�a�f�*�a��c�*B�*B�B���Q�V��$�$�%�%&���!��_�5�6� 7� 7� �!�Q��� � � �!�A�#�q��s��a��c�A�a�C�!�A�#�I�/�0� 1� 1� 3�3�3� �B���� �B��D�!��q�1�u�g� ��q�b��!��J�q�"�-�-�-�q��Q���x�8� 9� 9� �!�Q��� � � �1�"�a��1�a�&�!� "� "�$�$�$� �C��"�a����A�F�8�S��V�V�d�2�a�4�j�j�1�"�o�c�!�D��G�G�)�n�n�.L�%L�M�M�M� �D�!��x��1�~�~�x��1�~�~�.� �$�r�(�(�A�d�1�T�!�W�W�9�o�o�-�h�q��a����|�C��"��Q��K�K�7O�PT�UW�PX�PX�7X�.Y�.Y�Y�"�1�T�!�W�W�9�o�o�h�q��a����|�C��"��Q��K�K�7O�PT�UW�PX�PX�7X�.Y�.Y�Y�Z�[����2��a��L�L�!�"#�D��A�J�J�,�0��r�(�(�4��1�:�:�%�t�A�d�1�g�g�I���x��$�q�!�*�*� �S�QR�SU�QU�VW�QW�[�[�@X�Y]�^`�Ya�Ya�@a�7b�7b�'b�()�$�q��a���y�/�/�(9�(�1�T�!�Q�Z�Z�<�PS�TU�VX�TX�YZ�TZ�P[�P[�C[�\`�ac�\d�\d�Cd�:e�:e�(e�(f�g���r�"�u�Q�w�<�<� � !�"�� � � � ���� � � � �(�2�q�/�/��8�A�q�>�>�B� !�8�A�q�>�>��B�B�B�B�D� E� E� F� F� F� �D�!�&�!��x��1�~�~�q�1�u�-� ��A�a�C�!�G��q�b�!�$�r�!�t�*�*�,�S��4��7�7��^�^�;��A�a�C�!�G��j��n�n�Q�.�1�"�5�5��A�z�"�~�~�a�/�0�0�1��A�a�C�!�G��S��V�V�#�%� &� &� ���� � � � �(�2�q�/�/�1�a�(�1�q�b�!�*�q�!�Q�i�@� A� A� C�C�C� �D�!�Q��!�Q�� ��A����Q�����Q����J�7� 8� 8� �!�A�#�q�!�R��T�"�#� $� $� �����A�q�!� �l�l�l�L�L�L�I� J� J�L�L�L� �C��Q�V�J��Q�t�A�w�w�Y���(�(�(��D��a�S� ��q���!�q�1�u�a�i�.�(���Q���$�q�'�'� �)B�)B�B��q���!�a�!�A�#�g�,�&�w�q�!�D��G�G�)�'<�'<�<�>� ?� ?� �!�Q��� � �6�A�q�6�A��A��<�"8�9�9�;�;�;� �!�X�a��^�^� ��A�-�-�-�-�-�-�-�-�-�-� �D��a�f�a��Q�V�� $� ���A�a�C�!�G�Q�����A�a�C����A�x��1�~�~�,=�!=���A�a�C�!�G�Q����Q���'���A�a�C����A�x��1�~�~�4E�)E�G� H� H� �r�!�t�9� ��1�Q�3�Z�Z� � !�Q��1��W�a�K� 0� 1� ����� � � �����Q�V�a�Z��A�&��Q����"��Q��1�q�5�!�#� $� $� %�%�%� �1�Q�3��!�Q��� �� �!�B�$�q�&� 1� 1�1�A��D��a��Q�V��Q�q�S� !� �D��B����!� "� "� "�a�!�A�#�g� .�u�Q�q�S�z�z�1�}� <� ���1��q��!�$�$�W�Q�q�S�1�W�a�%8�%8�8��G�A�a�C��O�O�G�A�a�C�!�G�Q�$7�$7�7��a��c�A�g�q�)�)�'�!�A�#�q�/�/�9�:�;��A��g�a��c�1�o�o�%�g�a��c�1�o�o�5��A��w�q��s�A���w�q��s�Q�w��':�':�:� ��1��q��!�,�,�W�Q�q�S�!�_�_�<�=�>� ?� @� @� @� ����� � � �!�X�a��^�^�Q��*��a�!�A�#�g�q�[�(�2�q�/�/�1�5��Q��A�a�C���!�Q���0��a�%��A�q�1�u�%�'� (� (� )� )� )� �D�!��q�1�6�z�1�Q�3�� ��Q�V�a�Z����Q�V��T�!�W�W�!=�!=�q�!@�@��Q��U��G�A���J��Q���8�8�8��!�h�q�!�n�n�,�d�1�g�g�6�6�7��X�a��^�^�a�'�(���X�a��^�^�1C�T�!�W�W�)M�)M�q�)P�P�R� S� S� �5��Q�V��$�$�a�'�'��A�F�Q�J��7��5��Q�V��$�$�$�U�1�q�v�:�%6�%6�6�q�1�q�5�z�A���� � � �!�a��c�'�1�a��1�Q�3���� �A�F�";�a��A�Y�G� H� H�J�J�J� �D�!�&��A�q�1�u�:� �Q��U��C��1��I�I� � ���Q���Q���(�(���Q���Q���)@�)@�@��a���'�1�"�d�1�g�g�.�.�w�q�1�u�d�1�g�g�/F�/F�F�#�A��E�4��7�7�3�3�G�A�t�A�w�w�4G�4G�G�H�I��!��T�!�W�W�%�%�g�a��a���&9�&9�9�;� <� <� <� ���� � � � �!�a�%����#��Q����Q�V�a�R��"� #� #� $� $� $� �D�!�&��H�Q��N�N�H�Q��N�N�3� ��Q�t�A�w�w�Y����!�$�q�'�'�)�4��$�q�'�'� �?�?�1�+<�T�!�W�W�+D��a��Q���i���"� #� #� ���� � � � �(�2�q�/�/�1�6�1�-��8�B��?�?�A�F�/K�a�QR�ST�QT�VW�[�Y� Z� Z� \�\�\� �D�(�1�a�.�.� �H�Q��N�N�H�Q��N�N�;� �����T�!�V���!��A���� �!�!%��"!�"!�!�#�#� "$�s�2�a�4��6�{�{�4��1�:�:�'=�a�'?��R���'H�1�&L�!L� O� �A�d�1�g�g�I���t�A�w�w�&��A�d�1�g�g�I���!� "� "� ���� � � � �(�2�q�/�/�H�Q��O�O�Q�7��8�B��?�?�Q�/��A�Q�'�)� *� *� +� +� +�& �D�(�1�a�.�.� �A�F�H�Q��N�N�3� �������R��U�1�W����&��4��1�:�:��c�!�B�$�q�&�k�k�1�$�r�(�(�:�<�<�<�>?�t�A�q�z�z�\�K��A�d�1�g�g�I����A�d�1�g�g�I���t�A�w�w�&� )� *� *� ���� � � � �(�2�q�/�/�H�Q��N�N�A�;�+�+�+��A�A�F�+�-� .� .� /� /� /�" �D�!�Q���Z��1�Q�3��1�Q�3��7�Q�;�/� �q���%��!��a��!� �$�$� $��Q���� �Q��1��W�'=� =� ���Q���Q���(�(���1��q��$�q�'�'�)B�)B�B��a�����D��G�G�,�,�,�W�Q�q�S�1�W�d�1�g�g�-F�-F�F��a�����Q���Q���0�0�0���1��q��1��d�1�g�g�1N�1N�N���D��G�G�$�$�W�Q�q�S�1�W�q�[�$�q�'�'�%B�%B�B�D� E� E� E� ����� � � �!�Q�V�Q�V�Q�'��A�#�q�1�u�a��1��%��A�#�q�!�a��c�'�1�Q�3�'��Q�V�Q�V�R��T�*�,� -� -� .� .� .� �D�!�Q��!�Q���A���'� ��Q�t�A�w�w�Y���#�a��Q���i�.�.�0��a��Q���i���$�q�'�'�$�q��a���y�/�/�"9�1�j�J� K� K� �!�A�#�q�!�Q��1��%�&� '� '� �!�Q�V�Q���Q����3� ����Q����1�%� ��� ��� "� #� #� $�$�$�( �D�!�Q���Q��1�Q�3�K� ��C���G�G�f�Q���m�m�+�j�8�9�1�a��d�Q�q�S�j�1�n�;M�N��Q�B�1�"�:��u�Q�x�x�*�Q���*;�*;�;�<�a�!�e�a�Z�G��3�q�6�6��1�a�4�!�A�#�:��>�*��A�q�!�t�a��c�z�A�~�&�'�)� *� *� �!�A�#�q�"�Q�$��"�#� $� $� �"�Q�r�!�t�A���Q�B�q����A�a������� � � � � � � r_c���� � � � �tttd����\�� � � td��� �� � �� � fd�}�� fd�}|�� zgg� �� zggtt d�z ��� � zzt � ��zt �� ��zt d�z ��� �� zzzg��tddgg��t� � zdgd�� zgg��|���fd�}td t� ��z��}td t� ��z��}td t� ��z��td z z }td t� ��z��}|�gg���tjz ggttt��� �tjz zz||z||zz ztt��� �zz||z||zzztt��� �zzg��tgd �g��t�tjz ddg� �tjgdd�gg��|��dS) N�abcz�rhoc�f��� �t||||� �� � � g||||� � ��dSrc)rf� MeijerFormula)�anrh�bmrirrrsrt�matcherrlrmr\rnr�ros ������r]rpz!add_meijerg_formulae.<locals>.add�sL������ �b�"�b�"�a�!�Q��3��&'��A�w�8�8� 9� 9� 9� 9� 9r_c�4��|jd}|j\}}d}t||z �����sd}||}}t||z �����s ||z dkrdS||g}|r||g}�|�||z it |gg|g��fS)NrFT)r�r�r^�simplify� G_Function)rkr[�yro�swapped�lrlr�s ��r]�detect_uppergammaz/add_meijerg_formulae.<locals>.detect_uppergamma�s���� �G�A�J���w���1����a�!�e�%�%�'�'�(�(� ��G����Q� �!�a�%�!�!�#�#� $� $� ��A��� � ��4� ��F�� � ��A��A��Q��1�q�5�!�:�q�c�2�q�"�#=�#=�=�=r_rXrrxc����|jd�|j\}}}t||z �����dkrTt||z �����dkrdStjtjtjf}|||}}}n{t�|z �����dkr*tjtjtjf}|||}}}n)tjtjtjf}|||}}}t�|z �����dkslt�|z �����dksDt�|z �����tjks�|z dks �|z dkrdS� �it�gg�fd�|D��g��fS)z.https://functions.wolfram.com/07.34.03.0984.01rNc�4��g|]}�tjz |z��Srv)rr�)�.0�tr[s �r]� <listcomp>z=add_meijerg_formulae.<locals>.detect_3113.<locals>.<listcomp>�s#���+H�+H�+H�q�A���J��N�+H�+H�+Hr_)r�r�r^r�rr��Zeror�) rk�u�v�w�sig�x1�x2r�r[rls @�r]� detect_3113z)add_meijerg_formulae.<locals>.detect_3113�s����� �G�A�J���'���1�a� �!�a�%�!�!�#�#� $� $�� )� )��a�!�e�%�%�'�'�(�(�A�-�-����6�1�6�1�6�*�C��1�a�A��B�B��a�!�e�%�%�'�'�(�(�A�-�-��v�q�v�q�v�.���q�!�r�A����v�q�v�q�v�.���q�!�r�2�� �1�r�6�#�#�%�%� &� &�!� +� +� �1�r�6�#�#�%�%� &� &�!� +� +� �1�q�5�"�"�$�$� %� %��� /� /��B��� � �a�"�f�q�j�j� �F��1�v�z�1�#�r�+H�+H�+H�+H�C�+H�+H�+H�"�M�M�M�Mr_rw)ryrr)�list�mapr rLr#rr$r'rr!r+rr*rr�) rnrpr�r��s�c_�S_rsrlrmr\r�ros ` @@@@@r]�add_meijerg_formulaer��s����������c�%��(�(�)�)�J�A�q�!�Q� ��,�,�C�9�9�9�9�9�9�9�9�9�9� >� >� >� >� >� >��C��S�� �2��Q��W�~�r���a�!�e� � �Q��V�#�C��F�F�*�:�a��+;�+;�;��a�!�e� � �Q��S��\�)�+� ,� ,���A��x�����q��"� ��1�s�7�|�,�-�-�� ���N�N�N�N�N�2 �A�d�1�g�g�I���A� �Q�t�A�w�w�Y���B� �A�d�1�g�g�I����A�� �B� �1�T�!�W�W�9� � �A��C���R�!�Q��A�F� �#�R���R����Q���Z��(�"�R�%�!�A�#�+�6��R����A�� �q��t�b��d�{�+��R����A�� �� � � � � � �|�����Q�V��R��#�a��A�F�^�a��A�Y�?�@�@�� ����r_c����fd�}|S)z@ Create a function that simplifies rational functions in ``z``. c���|���\}}|���}t|����t|�����\}}}||���z|���z S)z6 Efficiently simplify the rational function ``expr``. )�as_numer_denomr rP�cancel�as_expr)�expr�numer�denomr\ros �r]�simpzmake_simp.<locals>.simp�sn����*�*�,�,� ��u�� � �����u�a�.�.�/�/��U�A���?�?���5�%��5�=�=�?�?�"�U�]�]�_�_�4�4r_rv)ror�s` r]� make_simpr��s#���5�5�5�5�5� �Kr_c�`�tr&|D]}t|d����t��dSdS)N�)�end)r�print)�argsrls r]�debugr��sF����� � �A� �!�� � � � � � �������r_c���eZdZdZ�fd�Zed���Zed���Zed���Z�fd�Z d�Z d�Z d �Z d �Z �xZS) rez( A generalized hypergeometric function. c���t���|��}ttt t |�����|_ttt t |�����|_|Src)�super�__new__r r�r�r rhri)rarhri�obj� __class__s �r]r�zHyper_Function.__new__�sU����g�g�o�o�c�"�"����S���_�_�-�-�.�����S���_�_�-�-�.���� r_c��|j|jfSrc)rhri��selfs r]r�zHyper_Function.args�s������!�!r_c�R�t|j��t|j��fSrc)�lenrhrir�s r]�sizeszHyper_Function.sizes�s���D�G� � �c�$�'�l�l�+�+r_c�>�td�|jD����S)zt Number of upper parameters that are negative integers This is a transformation invariant. c3�LK�|]}t|jo|j��V�� dSrc)�bool� is_integer� is_negative�r�r[s r]� <genexpr>z'Hyper_Function.gamma.<locals>.<genexpr>�s3����I�I�A�4�� �6���7�7�I�I�I�I�I�Ir_)�sumrhr�s r]r#zHyper_Function.gamma�s#���I�I���I�I�I�I�I�Ir_c�b��t�����|j|jfzSrc)r��_hashable_contentrhri�r�r�s �r]r�z Hyper_Function._hashable_content�s.����w�w�(�(�*�*�d�g���.�� r_c�8�t|j|j|��Src)r?rhri)r��args r]�__call__zHyper_Function.__call__�s���T�W�d�g�s�+�+�+r_c��t|jt��t|jt��}}d�}|j||��||��fS)a6 Compute the invariant vector. Explanation =========== The invariant vector is: (gamma, ((s1, n1), ..., (sk, nk)), ((t1, m1), ..., (tr, mr))) where gamma is the number of integer a < 0, s1 < ... < sk nl is the number of parameters a_i congruent to sl mod 1 t1 < ... < tr ml is the number of parameters b_i congruent to tl mod 1 If the index pair contains parameters, then this is not truly an invariant, since the parameters cannot be sorted uniquely mod1. Examples ======== >>> from sympy.simplify.hyperexpand import Hyper_Function >>> from sympy import S >>> ap = (S.Half, S.One/3, S(-1)/2, -2) >>> bq = (1, 2) Here gamma = 1, k = 3, s1 = 0, s2 = 1/3, s3 = 1/2 n1 = 1, n2 = 1, n2 = 2 r = 1, t1 = 0 m1 = 2: >>> Hyper_Function(ap, bq).build_invariants() (1, ((0, 1), (1/3, 1), (1/2, 2)), ((0, 2),)) c���t|�����}td�|D����s|�d����t d�|D����}|S)Nc3�LK�|]}t|dt��V�� dS)rN)� isinstancerr�s r]r�z>Hyper_Function.build_invariants.<locals>.tr.<locals>.<genexpr>$s0����=�=��z�!�A�$��,�,�=�=�=�=�=�=r_c�,�t|d��S�Nrr�r[s r]�<lambda>z=Hyper_Function.build_invariants.<locals>.tr.<locals>.<lambda>%s��*:�1�Q�4�*@�*@�r_��keyc�:�g|]\}}|�|t|��f��Srv�r�)r��mod�valuess r]r�z?Hyper_Function.build_invariants.<locals>.tr.<locals>.<listcomp>&s;�����;�3����S�#�f�+�+�.���r_)r��items�any�sort�tuple)�buckets r]�trz+Hyper_Function.build_invariants.<locals>.tr"s~���&�,�,�.�.�)�)�F��=�=�f�=�=�=�=�=� B�� � � @� @� �A�A�A����&������F��Mr_)rUrhr^rir#)r��abuckets�bbucketsr�s r]�build_invariantszHyper_Function.build_invariants�sV��F"�$�'�5�1�1�4����3G�3G�(�� � � �� �B�B�x�L�L�"�"�X�,�,�7�7r_c��|j|jkrdSd�|j|j|j|jfD��\}}}}d}||f||ffD�]\}}tt |�����t |�����z��D]�} | |vs0| |vs,t || ��t || ��krdSt || ��} t || ��} | ���| ���t| | ��D]\} } |t| | z ��z }�����|S)zd Estimate how many steps it takes to reach ``func`` from self. Return -1 if impossible. rxc�8�g|]}t|t����Srv�rUr^�r��paramss r]r�z-Hyper_Function.difficulty.<locals>.<listcomp>1s8��4@�4@�4@��59���4G�4G�4@�4@�4@r_r) r#rhri�setr��keysr�r��zip�abs)r�rk� oabuckets� obbucketsr�r��diffr��obucketr��l1�l2�i�js r]� difficultyzHyper_Function.difficulty,sy�� �:��� #� #��2�4@�4@��7�D�G�T�W�d�g�>�4@�4@�4@�0� �9�h����!)�9� 5��)�7L�M� '� '�O�F�G��4�� � � � �.�.��g�l�l�n�n�1E�1E�E�F�F� '� '���v�%�%�3�g�+=�+=��v�c�{�+�+�s�7�3�<�/@�/@�@�@��2�2�2��&��+�&�&���'�#�,�'�'����� � � ���� � � ���B�K�K�'�'�D�A�q��C��A��J�J�&�D�D�'� '�� r_c��|jD]&}|jD]}||z jr||z jdurdS��'|jD] }|dkrdS� |jD]}|jr |jrdS�dS)a� Decide if ``self`` is a suitable origin. Explanation =========== A function is a suitable origin iff: * none of the ai equals bj + n, with n a non-negative integer * none of the ai is zero * none of the bj is a non-positive integer Note that this gives meaningful results only when none of the indices are symbolic. FrT)rhrir�r��is_nonpositive)r�rlrms r]�_is_suitable_originz"Hyper_Function._is_suitable_originCs��� �� !� !�A��W� !� !����E�%�!�1�q�5�*=��*F�*F� �5�5�5�� !��� � �A��A�v�v��u�u���� � �A��|� �� 0� ��u�u���tr_)�__name__� __module__� __qualname__�__doc__r��propertyr�r�r#r�r�r�rr� __classcell__�r�s@r]rere�s��������2�2������ �"�"��X�"��,�,��X�,��J�J��X�J������,�,�,�-8�-8�-8�^���.������r_rec�d��eZdZdZ�fd�Zed���Z�fd�Zd�Zd�Z ed���Z �xZ S)r�z A Meijer G-function. c���t���|��}ttt t |�����|_ttt t |�����|_ttt t |�����|_ttt t |�����|_ |Src) r�r�r r�r�r r�rhr�ri)rar�rhr�rir�r�s �r]r�zG_Function.__new__cs�����g�g�o�o�c�"�"����S���_�_�-�-�.�����S���_�_�-�-�.�����S���_�_�-�-�.�����S���_�_�-�-�.���� r_c�6�|j|j|j|jfSrc)r�rhr�rir�s r]r�zG_Function.argsks������$�'�4�7�3�3r_c�T��t�����|jzSrc)r�r�r�r�s �r]r�zG_Function._hashable_contentos ����w�w�(�(�*�*�T�Y�6�6r_c�P�t|j|j|j|j|��Src)rKr�rhr�ri)r�ros r]r�zG_Function.__call__rs ���t�w�����$�'�1�=�=�=r_c��� �d�td��D��x}\}}}}t||j|j|j|jf��D]2\}}|D]*}|t |���|���+�3t|d��D]F\}} |���D],\} } | d� | � � fd�| ���| || <�-�Gtd�|D����S)a� Compute buckets for the fours sets of parameters. Explanation =========== We guarantee that any two equal Mod objects returned are actually the same, and that the buckets are sorted by real part (an and bq descendending, bm and ap ascending). Examples ======== >>> from sympy.simplify.hyperexpand import G_Function >>> from sympy.abc import y >>> from sympy import S >>> a, b = [1, 3, 2, S(3)/2], [1 + y, y, 2, y + 3] >>> G_Function(a, b, [2], [y]).compute_buckets() ({0: [3, 2, 1], 1/2: [3/2]}, {0: [2], y: [y, y + 1, y + 3]}, {0: [2]}, {y: [y]}) c�6�g|]}tt����Srv)rr�)r�r�s r]r�z.G_Function.compute_buckets.<locals>.<listcomp>�s ��%J�%J�%J�A�k�$�&7�&7�%J�%J�%Jr_r{)TFFTrc���|�z Srcrv)r[�x0s �r]r�z,G_Function.compute_buckets.<locals>.<lambda>�s ����R��r_)r��reversec�,�g|]}t|����Srv)�dict�r�r�s r]r�z.G_Function.compute_buckets.<locals>.<listcomp>�s��-�-�-�!�d�1�g�g�-�-�-r_) �ranger�r�rhr�rir^rfr�r�r�) r��dicts�pan�pap�pbm�pbq�dic�lisr[�flip�mr�rs @r]�compute_bucketszG_Function.compute_bucketsus#���0&K�%J��q���%J�%J�%J�J��"��S�#�s��E�D�G�T�W�d�g�t�w�#G�H�H� (� (�H�C��� (� (���E�!�H�H� �$�$�Q�'�'�'�'� (��U�$>�?�?� � �I�C���I�I�K�K� � ���5��1�X��� � �/�/�/�/�� �>�>�>���A��� � �-�-�u�-�-�-�.�.�.r_c��t|j��t|j��t|j��t|j��fSrc)r�r�rhr�rir�s r]� signaturezG_Function.signature�s1���D�G� � �c�$�'�l�l�C���L�L�#�d�g�,�,�G�Gr_) rrrrr�r r�r�r�r#r%r r s@r]r�r�`s�������� � �������4�4��X�4�7�7�7�7�7�>�>�>�#/�#/�#/�J�H�H��X�H�H�H�H�Hr_r�r[c�<�eZdZdZd�Zdd�Zed���Zd�ZdS)rga- This class represents hypergeometric formulae. Explanation =========== Its data members are: - z, the argument - closed_form, the closed form expression - symbols, the free symbols (parameters) in the formula - func, the function - B, C, M (see _compute_basis) Examples ======== >>> from sympy.abc import a, b, z >>> from sympy.simplify.hyperexpand import Formula, Hyper_Function >>> func = Hyper_Function((a/2, a/3 + b, (1+a)/2), (a, b, (a+b)/7)) >>> f = Formula(func, z, None, [a, b]) c�0�d�|jjD��}d�|jjD��}tt |�z|jt |�zz }t |t��}|j��dz }|g}t|��D]=}|� |j|d� |j��z���>t|��|_ tdgdg|zzg��|_ t|��} | �dt!|d����} |j��dd�} | ���| �|t| g�� |j��dz ��|_dS)z� Compute a set of functions B=(f1, ..., fn), a nxn matrix M and a 1xn matrix C such that: closed_form = C B z d/dz B = M B. c�"�g|] }t|z�� Srv��_x�r�rls r]r�z*Formula._compute_basis.<locals>.<listcomp>�s��1�1�1�q�B��F�1�1�1r_c�(�g|]}t|zdz ��S�rXr)�r�rms r]r�z*Formula._compute_basis.<locals>.<listcomp>�s ��5�5�5�1�B��F�Q�J�5�5�5r_rXrxrN)rkrhrir*rrorQ�degreerrfr�rLrrrsrM� col_insertrN� all_coeffsr� row_insertrt) r�� closed_form�afactors�bfactorsr�rP�nrm�_r"r�s r]�_compute_basiszFormula._compute_basis�se��2�1�D�I�L�1�1�1��5�5�� � �5�5�5���#�x�.� �4�6�#�x�.�#8�8���D�"�~�~�� �D�K�M�M�A� �� �M���q��� 0� 0�A� �H�H�T�V�A�b�E�J�J�t�v�.�.�.� /� /� /� /��������!���s�1�u�� �&�&��� ��F�F�� �L�L��E�!�Q�K�K� (� (�� �D�O� � �a�b�b� !�� � � � � � ����a�&�!��+�+��o�d�o�.?�.?��.B�!B�C�C����r_Nc���t|��}t|��}�fd�t|��D��}||_||_||_||_||_�|_|�|�|��dSdS)Nc�>��g|]}��|���|��Srv��has)r�r[rks �r]r�z$Formula.__init__.<locals>.<listcomp>�s(���>�>�>��$�(�(�1�+�+�>�1�>�>�>r_)r ror rrrsrtrkr8)r�rkrorjr rrrsrts ` r]�__init__zFormula.__init__�s���� �A�J�J���c�l�l��>�>�>�>�g�g�.�.�>�>�>������� ������������ � �?� � � �� $� $� $� $� $� �?r_c�j�td�t|j|j��tj��S)Nc�*�||d|dzzS�NrrXrv�r�r"s r]r�z%Formula.closed_form.<locals>.<lambda>����!�A�a�D��1��I�+�r_�rr�rsrrrr�r�s r]r3zFormula.closed_form��(���-�-�s�4�6�4�6�/B�/B�A�F�K�K�Kr_c ������ddlm}|j}|j}t |��t �jj��ks*t |��t �jj��krt d���g}�jD]e���jjjvr|� |���+��jjjvr|� |���Ttd�������fd�t|�D��}d�||fD��\}}d�||fD��\} } d��jD��} g} t��} |D�]:��fd ��jj�jjfD��\}}||f||ffD�]O\}}tt|�����t|�����z��D]�}||vs0||vs,t ||��t ||��krn�t!�j| ��D]�\�}��jr��fd �||D��}����}|�xx| z cc<|D]\}||D]Q}||�|��|z | ��\}|jrtd ���|� |���R�]������Qg}t!�j| ��D]w\�}���t)t+|����}t-t/|����}|� �fd �t1||d z��D�����x| ��fd�t|�D������<| S)z� Find substitutions of the free symbols that match ``func``. Return the substitution dictionaries as a list. Note that the returned instantiations need not actually match, or be valid! r)�solvez-Cannot instantiate other number of parametersz?At least one of the parameters of the formula must be equal to c �n��g|]1}ttt�j|��������2Srv�rr�r�r )r�r�r�s �r]r�z/Formula.find_instantiations.<locals>.<listcomp>sE���7�7�7���$�s�4�<��8�8�9�9�:�:�7�7�7r_c�8�g|]}t|t����Srvr�r�s r]r�z/Formula.find_instantiations.<locals>.<listcomp>s"��I�I�I�f�d�6�5�1�1�I�I�Ir_c�J�g|] }d�|���D����!S)c�4�i|]\}}|t|����Srvr�)r�rl�valss r]� <dictcomp>z:Formula.find_instantiations.<locals>.<listcomp>.<dictcomp>s$��D�D�D�'�!�T��C��I�I�D�D�Dr_)r�)r�r�s r]r�z/Formula.find_instantiations.<locals>.<listcomp>s?��4�4�4��E�D�V�\�\�^�^�D�D�D�4�4�4r_c��g|]}dg��S�rrv)r�r7s r]r�z/Formula.find_instantiations.<locals>.<listcomp>s��5�5�5�1�A�3�5�5�5r_c�6��g|]}t|�fd�����S)c�H��t|������Src)r^�xreplace)r[�repls �r]r�z8Formula.find_instantiations.<locals>.<listcomp>.<lambda> s���U�1�:�:�d�;K�;K�5L�5L�r_rT)r�r�rSs �r]r�z/Formula.find_instantiations.<locals>.<listcomp> s=���<�<�<��#�6�+L�+L�+L�+L�M�M�<�<�<r_c�>��g|]}|�����|��Srvr;)r�r�rls �r]r�z/Formula.find_instantiations.<locals>.<listcomp>s(��� N� N� N�$�$�(�(�1�+�+� N�� N� N� Nr_zValue should not be truec���g|]}�|z��Srvrv)r�r6�a0s �r]r�z/Formula.find_instantiations.<locals>.<listcomp>"s���"I�"I�"I�a�2��6�"I�"I�"Ir_rXc 3�v�K�|]3}ttt�j|������V��4dSrcrH)r�r�r�s �r]r�z.Formula.find_instantiations.<locals>.<genexpr>#s?�����Y�Y�1�d�4��D�L�!�(<�(<�#=�#=�>�>�Y�Y�Y�Y�Y�Yr_)� sympy.solversrFrhrir�rk� TypeErrorr r�rf� ValueErrorrr r�r�r�r�� free_symbols�copyrRr4�minr5�maxr�extend)r�rkrFrhri� symbol_values� base_replr�r��a_inv�b_inv�critical_values�result�_n�symb_a�symb_br�r�r�rL�exprs�repl0r��target�n0r��min_�max_rlrVrSs` @@@r]�find_instantiationszFormula.find_instantiations�s%������ (�'�'�'�'�'� �W�� �W�� �r�7�7�c�$�)�,�'�'� '� '�3�r�7�7�c�$�)�,�6G�6G�+G�+G��K�L�L� L�� ��� >� >�A��D�I�L�%�%�%��$�$�R�(�(�(�(��d�i�l�'�'�'��$�$�R�(�(�(�(� �j�9:��"=�>�>�>�7�7�7�7�%�}�5�7�7�7� �I�I��R��I�I�I���(�4�4�'��2�4�4�4� ��u�5�5�� �5�5�5���� �W�W��� Z� Z�D�<�<�<�<�#�y�|�T�Y�\�:�<�<�<�N�F�F�%-�v�$6��6�8J�#K� Z� Z�����t�F�K�K�M�M�2�2�T�'�,�,�.�.�5I�5I�I�J�J�0�0�C��6�)�)�s�'�/A�/A�"�6�#�;�/�/�3�w�s�|�3D�3D�D�D���#&�t�|�_�#E�#E� 0� 0���4���7�/�%�$� N� N� N� N�'�#�,� N� N� N�� $� � � � ���a����B�����$)�0�0�D�*0��+�0�0��&+�e�D�M�M�%�,@�,@�6�,I�2�&N�&N���#%�?�!Q�*4�5O�*P�*P�$P� $� � �B����� 0�0� 0����"�4�<��A�A�K�K�G�A�t��a��B� ��T���+�+�D�"�3�t�9�9�-�-�D��M�M�"I�"I�"I�"I�5��t�a�x�3H�3H�"I�"I�"I�J�J�J�J�� � �Y�Y�Y�Y��QW�HX�Y�Y�Y�Y�Y�Y�Y�� r_)NNN) rrrrr8r=r r3rorvr_r]rgrg�sq��������.D�D�D�4%�%�%�%�$�L�L��X�L�:�:�:�:�:r_rgc��eZdZdZd�Zd�ZdS)�FormulaCollectionz- A collection of formulae to use as origins. c��i|_i|_g|_t|j��|jD]�}|jj}t |j��dkr/|j�|g��� |���U|j� ��}||j�|i��|<��dS)z7 Doing this globally at module init time is a pain ... rN) �symbolic_formulae�concrete_formulaernr�rkr�r�r � setdefaultrfr�)r��fr��invs r]r=zFormulaCollection.__init__,s���!#���!#����� ��T�]�#�#�#� �� F� F�A��F�L�E��1�9�~�~��!�!��&�1�1�%��<�<�C�C�A�F�F�F�F��f�-�-�/�/��DE��&�1�1�%��<�<�S�A�A�  F� Fr_c �,�|���}|j}||jvr"||j|vr|j||S||jvrdSg}|j|D]�}|�|��}|D]f}|j�|��}|���s�1|�|��} | dkr�M|� | |||f���g��|� d����|D]�\} }}}t||j dg|j �|��|j�|��|j�|����} t#d�| j | j| jfD����s| cS��dS)a{ Given the suitable target ``func``, try to find an origin in our knowledge base. Examples ======== >>> from sympy.simplify.hyperexpand import (FormulaCollection, ... Hyper_Function) >>> f = FormulaCollection() >>> f.lookup_origin(Hyper_Function((), ())).closed_form exp(_z) >>> f.lookup_origin(Hyper_Function([1], ())).closed_form HyperRep_power1(-1, _z) >>> from sympy import S >>> i = Hyper_Function([S('1/4'), S('3/4 + 4')], [S.Half]) >>> f.lookup_origin(i).closed_form HyperRep_sqrts1(-1/4, _z) Nrxc��|dSr�rvr�s r]r�z1FormulaCollection.lookup_origin.<locals>.<lambda>ks ��A�a�D�r_r�c3�zK�|]6}|�tjtt t��V��7dSrc)r<r�NaNrr)r��es r]r�z2FormulaCollection.lookup_origin.<locals>.<genexpr>os8����N�N�a�q�u�u�Q�U�B���S�1�1�N�N�N�N�N�Nr_)r�r�rtrsrorkrRrrrfr�rgrorr�subsrsrtr�) r�rkrwr��possiblerv�replsrS�func2r�r7�f2s r]� lookup_originzFormulaCollection.lookup_origin?s���*�#�#�%�%��� �� �D�*� *� *��t�-�e�4�4�4��)�%�0��5� 5� ��.� .� .��4����'��.� 8� 8�A��)�)�$�/�/�E�� 8� 8�������-�-���0�0�2�2����'�'��-�-���2�:�:������t�Q�� 6�7�7�7�7� 8� � � �.�.� �)�)�)�!)� � � �A�t�Q������T�2�q�s�x�x��~�~��C�H�H�T�N�N�A�C�H�H�T�N�N�4�4�B��N�N�B�D�"�$���;M�N�N�N�N�N� �� � � � ��tr_N�rrrrr=r�rvr_r]rqrq)s;������7�7�F�F�F�&3�3�3�3�3r_rqc�4�eZdZdZd�Zed���Zd�ZdS)r�z� This class represents a Meijer G-function formula. Its data members are: - z, the argument - symbols, the free symbols (parameters) in the formula - func, the function - B, C, M (c/f ordinary Formula) c ��d�||||fD��\}}}}t||||��|_||_||_| |_||_||_| |_dS)Nc �`�g|]+}tttt|�������,Srv)r r�r�r rs r]r�z*MeijerFormula.__init__.<locals>.<listcomp>�s-��Q�Q�Q�1�%��c�&�!�n�n�!5�!5�6�Q�Q�Qr_)r�rkror �_matcherrrrsrt) r�r�rhr�riror rrrsrtr�s r]r=zMeijerFormula.__init__�si��Q�Q��R��R�@P�Q�Q�Q���B��B��r�2�r�2�.�.�� ������ ��� �����������r_c�j�td�t|j|j��tj��S)Nc�*�||d|dzzSr@rvrAs r]r�z+MeijerFormula.closed_form.<locals>.<lambda>�rBr_rCr�s r]r3zMeijerFormula.closed_form�rDr_c �^�|j|jjkrdS|�|��}|�~|\}}t|j|j|j|j|jg|j � |��|j � |��|j � |��d� � SdS)z Try to instantiate the current formula to (almost) match func. This uses the _matcher passed on init. N) r%rkr�r�r�rhr�rirorrr}rsrt)r�rkrjr}�newfuncs r]�try_instantiatezMeijerFormula.try_instantiate�s��� �>�T�Y�0� 0� 0��4��m�m�D�!�!�� �?��M�D�'� ���W�Z���W�Z�!%���!%����T�!2�!2�D�F�K�K��4E�4E�!%����T�!2�!2�D�:�:� :� �?r_N)rrrrr=r r3r�rvr_r]r�r�usZ������������L�L��X�L� :� :� :� :� :r_r�c��eZdZdZd�Zd�ZdS)�MeijerFormulaCollectionz= This class holds a collection of meijer g formulae. c���g}t|��tt��|_|D],}|j|jj�|���-t|j��|_dSrc)r�rr�rnrkr%rfr)r�rn�formulas r]r=z MeijerFormulaCollection.__init__�sm�����X�&�&�&�#�D�)�)�� �� B� B�G� �M�'�,�0� 1� 8� 8�� A� A� A� A��T�]�+�+�� � � r_c��|j|jvrdS|j|jD]}|�|��}|�|cS�dS)z* Try to find a formula that matches func. N)r%rnr�)r�rkr�rjs r]r�z%MeijerFormulaCollection.lookup_origin�s^�� �>��� .� .��4��}�T�^�4� � �G��)�)�$�/�/�C���� � � �� � r_Nr�rvr_r]r�r��s<��������,�,�,�����r_r�c��eZdZdZd�ZdS)�Operatora� Base class for operators to be applied to our functions. Explanation =========== These operators are differential operators. They are by convention expressed in the variable D = z*d/dz (although this base class does not actually care). Note that when the operator is applied to an object, we typically do *not* blindly differentiate but instead use a different representation of the z*d/dz operator (see make_derivative_operator). To subclass from this, define a __init__ method that initializes a self._poly variable. This variable stores a polynomial. By convention the generator is z*d/dz, and acts to the right of all coefficients. Thus this poly x**2 + 2*z*x + 1 represents the differential operator (z*d/dz)**2 + 2*z**2*d/dz. This class is used only in the implementation of the hypergeometric function expansion algorithm. c�F�|j���}|���|g}|dd�D]&}|�||d�����'|d|dz}t |dd�|dd���D] \}}|||zz }�|S)a� Apply ``self`` to the object ``obj``, where the generator is ``op``. Examples ======== >>> from sympy.simplify.hyperexpand import Operator >>> from sympy.polys.polytools import Poly >>> from sympy.abc import x, y, z >>> op = Operator() >>> op._poly = Poly(x**2 + z*x + y, x) >>> op.apply(z**7, lambda f: f.diff(z)) y*z**7 + 7*z**7 + 42*z**5 rXNrxr)�_polyr1rrfr�)r�r��op�coeffs�diffsr\�r�ds r]�applyzOperator.apply�s�����&�&�(�(���������������� (� (�A� �L�L���E�"�I��� '� '� '� '� �1�I�e�A�h� ����q�r�r� �E�!�"�"�I�.�.� � �D�A�q� ��1��H�A�A��r_N)rrrrr�rvr_r]r�r��s-��������4����r_r�c��eZdZdZd�ZdS)� MultOperatorz! Simply multiply by a "constant" c�:�t|t��|_dSrc)rQr*r�)r��ps r]r=zMultOperator.__init__�s���!�R�[�[�� � � r_N)rrrrr=rvr_r]r�r��s)������+�+�!�!�!�!�!r_r�c��eZdZdZd�Zd�ZdS)�ShiftAz Increment an upper index. c��t|��}|dkrtd���tt|z dzt��|_dS)Nrz"Cannot increment zero upper index.rX�r rZrQr*r�)r��ais r]r=zShiftA.__init__�sB�� �R�[�[�� ��7�7��A�B�B� B��"�R�%�!�)�R�(�(�� � � r_c�L�dd|j���dz zS)Nz<Increment upper %s.>rXr�r�r1r�s r]�__str__zShiftA.__str__�s%��&�!�D�J�,A�,A�,C�,C�A�,F�*F�G�Gr_N�rrrrr=r�rvr_r]r�r��s=������%�%�)�)�)� H�H�H�H�Hr_r�c��eZdZdZd�Zd�ZdS)�ShiftBz Decrement a lower index. c��t|��}|dkrtd���tt|dz z dzt��|_dS)NrXz"Cannot decrement unit lower index.r��r��bis r]r=zShiftB.__init__sF�� �R�[�[�� ��7�7��A�B�B� B��"�b�1�f�+��/�2�.�.�� � � r_c�R�dd|j���dz dzzS)Nz<Decrement lower %s.>rXrr�r�s r]r�zShiftB.__str__s*��&�!�D�J�,A�,A�,C�,C�A�,F�*F��*J�K�Kr_Nr�rvr_r]r�r��s=������$�$�/�/�/� L�L�L�L�Lr_r�c��eZdZdZd�Zd�ZdS)�UnShiftAz Decrement an upper index. c��ttt|||g����\}}}||_||_||_t|��}t|��}|�|��dz }|dkrtd���t||zt��}|D]"}|tt|zt��z}�#td��}t||z|z |��x} } |D] } | | | dz � |��zz} �!| � d�� } | dkrtd���tt| � ��dd�|������|t|z dz��t��} t| |z | z t��|_dS)� Note: i counts from zero! rXrz"Cannot decrement unit upper index.�Az0Cannot decrement upper index: cancels with lowerNrx�r�r�r �_ap�_bq�_i�poprZrQr*r �as_poly�nthr1r�r}r�) r�rhrir�ror�r"rlr�r6�Drm�b0s r]r=zUnShiftA.__init__s�����W�r�2�q�k�2�2�3�3� ��B����������� �"�X�X�� �"�X�X�� �V�V�A�Y�Y��]�� ��7�7��A�B�B� B� ��2��r�N�N��� "� "�A� ��b�1�f�b�!�!� !�A�A� �#�J�J���R��T�B�Y��"�"�"��A�� (� (�A� ��a�!�e�_�_�Q�'�'�'� '�A�A��e�e�A�h�h�Y�� ��7�7��2�3�3� 3� ��a�l�l�n�n�S�b�S�)�1�-�-�5�5�7�7�<�<�Q��2��� �J�J�B� O� O���1�q�5�"�*�b�)�)�� � � r_c�8�d|j�d|j�d|j�d�S)Nz<Decrement upper index #� of �, �.>�r�r�r�r�s r]r�zUnShiftA.__str__/�*���;?�7�7�7�8<����$�(�(�(�L� Lr_Nr�rvr_r]r�r� s>������%�%�*�*�*�BL�L�L�L�Lr_r�c��eZdZdZd�Zd�ZdS)�UnShiftBz Increment a lower index. c���ttt|||g����\}}}||_||_||_t|��}t|��}|�|��dz}|dkrtd���tt|dz zt��}|D]%}|tt|zdz t��z}�&td��}t|dz |z|z dz|��} t||��} |D]} | | | � |��zz} �| � d��} | dkrtd���tt| � ��dd�|������|t|dz z dz��t��} t|| z | z t��|_dS)r�rXrz Cannot increment -1 lower index.rrz*Cannot increment index: cancels with upperNrxr�) r�rhrir�ror�r"rmrrr�r6rlr�s r]r=zUnShiftB.__init__7s�����W�r�2�q�k�2�2�3�3� ��B����������� �"�X�X�� �"�X�X�� �V�V�A�Y�Y��]�� ��7�7��?�@�@� @� ��R�!�V��b� !� !��� &� &�A� ��b�1�f�q�j�"�%�%� %�A�A� �#�J�J�� �"�q�&�!��b��1�$�a� (� (�� ��A�J�J��� $� $�A� �!�a�i�i��l�l�"� #�A�A� �U�U�1�X�X�� ��7�7��I�J�J� J� ��a�l�l�n�n�S�b�S�)�1�-�-�5�5�7�7�<�<� �r�2��6�{�Q�� � �!#� %� %���1�q�5�"�*�b�)�)�� � � r_c�8�d|j�d|j�d|j�d�S)Nz<Increment lower index #r�r�r�r�r�s r]r�zUnShiftB.__str__Yr�r_Nr�rvr_r]r�r�4s>������$�$� *� *� *�DL�L�L�L�Lr_r�c��eZdZdZd�Zd�ZdS)� MeijerShiftAz Increment an upper b index. c�h�t|��}t|tz t��|_dSrc�r rQr*r�r�s r]r=zMeijerShiftA.__init__as&�� �R�[�[���"�r�'�2�&�&�� � � r_c�F�d|j���dzS)Nz<Increment upper b=%s.>rXr�r�s r]r�zMeijerShiftA.__str__es ��(�D�J�,A�,A�,C�,C�A�,F�G�Gr_Nr�rvr_r]r�r�^s=������'�'�'�'�'�H�H�H�H�Hr_r�c��eZdZdZd�Zd�ZdS)� MeijerShiftBz Decrement an upper a index. c�n�t|��}td|z tzt��|_dSrWr�r�s r]r=zMeijerShiftB.__init__ls*�� �R�[�[���!�b�&�2�+�r�*�*�� � � r_c�L�dd|j���dz zS)Nz<Decrement upper a=%s.>rXr�r�s r]r�zMeijerShiftB.__str__ps%��(�A�� �0E�0E�0G�0G��0J�,J�K�Kr_Nr�rvr_r]r�r�is=������'�'�+�+�+�L�L�L�L�Lr_r�c��eZdZdZd�Zd�ZdS)� MeijerShiftCz Increment a lower b index. c�j�t|��}t| tzt��|_dSrcr�r�s r]r=zMeijerShiftC.__init__ws(�� �R�[�[���2�#��(�B�'�'�� � � r_c�H�d|j���d zS)Nz<Increment lower b=%s.>rXr�r�s r]r�zMeijerShiftC.__str__{s#��(�T�Z�-B�-B�-D�-D�Q�-G�,G�H�Hr_Nr�rvr_r]r�r�ts=������&�&�(�(�(�I�I�I�I�Ir_r�c��eZdZdZd�Zd�ZdS)� MeijerShiftDz Decrement a lower a index. c�n�t|��}t|dz tz t��|_dSrWr�r�s r]r=zMeijerShiftD.__init__�s*�� �R�[�[���"�q�&�2�+�r�*�*�� � � r_c�L�d|j���ddzzS)Nz<Decrement lower a=%s.>rXr�r�s r]r�zMeijerShiftD.__str__�s%��(�D�J�,A�,A�,C�,C�A�,F��,J�K�Kr_Nr�rvr_r]r�r�s=������&�&�+�+�+�L�L�L�L�Lr_r�c��eZdZdZd�Zd�ZdS)�MeijerUnShiftAz Decrement an upper b index. c � � �ttt|||||g����\}}}}}||_||_||_||_||_t|��}t|��}t|��}t|��}|�|��dz }tdt��td�|D����ztd�|D����z}td��} t|| z | ��� t|| ��t� fd�|D����zt� fd�|D����z} | � d��} | dkrtd���tt| ���d d �| ������| |tz ��t��} t|| z | z t��|_d S) r�rXc3�PK�|]!}t|tz t��V��"dSrc�rQr*r.s r]r�z*MeijerUnShiftA.__init__.<locals>.<genexpr>�s0����<�<�A�t�A��F�B�/�/�<�<�<�<�<�<r_c3�PK�|]!}tt|z t��V��"dSrcr�r.s r]r�z*MeijerUnShiftA.__init__.<locals>.<genexpr>�s2����Ca�Ca�YZ�D��a��QS�DT�DT�Ca�Ca�Ca�Ca�Ca�Car_r�c3�(�K�|] }�dz|z V�� dS�rXNrv�r�rlr�s �r]r�z*MeijerUnShiftA.__init__.<locals>.<genexpr>�s+�����6�6�a�q�1�u�q�y�6�6�6�6�6�6r_c3�*�K�|] }� |zdz V��dSr�rvr�s �r]r�z*MeijerUnShiftA.__init__.<locals>.<genexpr>�s-�����=W�=W�q��r�A�v��z�=W�=W�=W�=W�=W�=Wr_rz(Cannot decrement upper b index (cancels)Nrx)r�r�r �_anr��_bmr�r�r�rQr*rr r�rZr1r�r}r�) r�r�rhr�rir�ror�r"r�r6r�r�s @r]r=zMeijerUnShiftA.__init__�s���� ��W�r�2�r�2�q�.A�!B�!B�C�C���B��B����������������� �"�X�X�� �"�X�X�� �"�X�X�� �"�X�X�� �V�V�A�Y�Y��]�� ��B�K�K�$�<�<��<�<�<�<�<� <�t�Ca�Ca�^`�Ca�Ca�Ca�?a�?a� a�� �#�J�J�� ��a���O�O�� ��A�J�J��6�6�6�6�2�6�6�6�6�6� 6��=W�=W�=W�=W�TV�=W�=W�=W�9W�9W� W�� �U�U�1�X�X�� ��7�7��G�H�H� H� ��a�l�l�n�n�S�b�S�)�1�-�-�5�5�7�7�<�<�Q��R��H�H�"� M� M���1�q�5�"�*�b�)�)�� � � r_c �X�d|j�d|j�d|j�d|j�d|j�d� S)Nz<Decrement upper b index #r�r�r��r�r�r�r�r�r�s r]r�zMeijerUnShiftA.__str__��:���EI�W�W�W�&*�h�h�h�����$�(�(�(�D�H�H�H�N� Nr_Nr�rvr_r]r�r��s=������'�'�*�*�*�<N�N�N�N�Nr_r�c��eZdZdZd�Zd�ZdS)�MeijerUnShiftBz Increment an upper a index. c �(�ttt|||||g����\}}}}}||_||_||_||_||_t|��}t|��}t|��}t|��}|�|��dz}t|t��}|D]%} |td| z tzt��z}�&|D]%} |t| dz tz t��z}�&td��} t| |zdz | ��} td| ��} |D] } | | | zz} � |D] } | | | z z} � | � d��}|dkrtd���tt| ���dd�| ������| d|z tz��t��} t|| z |z t��|_dS)r�rXrrrz(Cannot increment upper a index (cancels)Nrx�r�r�r r�r�r�r�r�r�rQr*r r�rZr1r�r}r��r�r�rhr�rir�ror�r"rlrrr�r6rmr�s r]r=zMeijerUnShiftB.__init__�s�� ��W�r�2�r�2�q�.A�!B�!B�C�C���B��B����������������� �"�X�X�� �"�X�X�� �"�X�X�� �"�X�X�� �V�V�A�Y�Y��]�� ��B�K�K��� &� &�A� ��a�!�e�b�j�"�%�%� %�A�A�� &� &�A� ��a�!�e�b�j�"�%�%� %�A�A� �#�J�J�� ��R��!��Q� � �� ��A�J�J��� � �A� �1�"�q�&�M�A�A�� � �A� �!�a�%�L�A�A� �U�U�1�X�X�� ��7�7��G�H�H� H� ��a�l�l�n�n�S�b�S�)�1�-�-�5�5�7�7�<�<� �q�2�v��{���� !� !���1�q�5�"�*�b�)�)�� � � r_c �X�d|j�d|j�d|j�d|j�d|j�d� S)Nz<Increment upper a index #r�r�r�r�r�s r]r�zMeijerUnShiftB.__str__�r�r_Nr�rvr_r]r�r��s>������'�'�%*�%*�%*�NN�N�N�N�Nr_r�c��eZdZdZd�Zd�ZdS)�MeijerUnShiftCz Decrement a lower b index. c ��ttt|||||g����\}}}}}||_||_||_||_||_t|��}t|��}t|��}t|��}|�|��dz }tdt��}|D]"} |t| tz t��z}�#|D]"} |tt| z t��z}�#td��} t|| z| ��} t|| ��} |D] } | | dz| z z} �|D]} | | | zdz z} �| � d��}|dkrtd���tt| ���dd�| ������| t|z ��t��} t|| z |z t��|_dS)r�rXrsrz(Cannot decrement lower b index (cancels)Nrxr�)r�r�rhr�rir�ror�r"rmrsr�r6rlr�s r]r=zMeijerUnShiftC.__init__�s��� ��W�r�2�r�2�q�.A�!B�!B�C�C���B��B����������������� �"�X�X�� �"�X�X�� �"�X�X�� �"�X�X�� �V�V�A�Y�Y��]�� ��B�K�K��� "� "�A� ��a�"�f�b�!�!� !�A�A�� "� "�A� ��b�1�f�b�!�!� !�A�A� �#�J�J�� ��a���O�O�� ��A�J�J��� � �A� �!�a�%�!�)� �A�A�� � �A� �1�"�q�&�1�*� �A�A� �U�U�1�X�X�� ��7�7��G�H�H� H� ��a�l�l�n�n�S�b�S�)�1�-�-�5�5�7�7�<�<�Q��R��H�H�"� M� M���1�q�5�"�*�b�)�)�� � � r_c �X�d|j�d|j�d|j�d|j�d|j�d� S)Nz<Decrement lower b index #r�r�r�r�r�s r]r�zMeijerUnShiftC.__str__ r�r_Nr�rvr_r]r�r��s>������&�&�$*�$*�$*�LN�N�N�N�Nr_r�c��eZdZdZd�Zd�ZdS)�MeijerUnShiftDz Increment a lower a index. c �(�ttt|||||g����\}}}}}||_||_||_||_||_t|��}t|��}t|��}t|��}|�|��dz}t|t��}|D]%} |td| z tzt��z}�&|D]%} |t| dz tz t��z}�&td��} t|dz | z | ��} td| ��} |D] } | | | zz} � |D] } | | | z z} � | � d��}|dkrtd���tt| ���dd�| ������| |dz tz ��t��} t|| z |z t��|_dS)r�rXrrrz(Cannot increment lower a index (cancels)Nrxr�r�s r]r=zMeijerUnShiftD.__init__s�� ��W�r�2�r�2�q�.A�!B�!B�C�C���B��B����������������� �"�X�X�� �"�X�X�� �"�X�X�� �"�X�X�� �V�V�A�Y�Y��]�� ��B�K�K��� &� &�A� ��a�!�e�b�j�"�%�%� %�A�A�� &� &�A� ��a�!�e�b�j�"�%�%� %�A�A� �#�J�J�� ��a��!��Q� � �� ��A�J�J��� � �A� �1�"�q�&�M�A�A�� � �A� �!�a�%�L�A�A� �U�U�1�X�X�� ��7�7��G�H�H� H� ��a�l�l�n�n�S�b�S�)�1�-�-�5�5�7�7�<�<� �r�A�v��{���� !� !���1�q�5�"�*�b�)�)�� � � r_c �X�d|j�d|j�d|j�d|j�d|j�d� S)Nz<Increment lower a index #r�r�r�r�r�s r]r�zMeijerUnShiftD.__str__>r�r_Nr�rvr_r]r�r�s>������&�&�%*�%*�%*�NN�N�N�N�Nr_r�c�`�eZdZdZd�Zed���Zed���Zed���Zd�Z dS)� ReduceOrderz8 Reduce Order by cancelling an upper and a lower index. c�v�t|��}t|��}||z }|jr|dkrdS|jr |jrdSt�|��}t j}t|��D]}|t|z|z||zz z}�t|t��|_ ||_ ||_ |S)z< For convenience if reduction is not possible, return None. rN)r � is_Integerr�rr�r�rr�rr*rQr��_a�_b)rar��bjr6r�r��ks r]r�zReduceOrder.__new__Fs��� �R�[�[�� �R�[�[�� ��G���|� �q�1�u�u��4� �=� �R�.� ��4�����$�$�� �E���q��� (� (�A� �"�r�'�A�+��Q��'� '�A�A��!�R�[�[�� �������� r_c���t|��}t|��}||z }|js|jsdSt�|��}t j}t|��D]}||tz|z|zz}�t|t��|_ |dkr||_ ||_ n4td|dz d���|_ td|dz d���|_ |S)zN Cancel b + sign*s and a + sign*s This is for meijer G functions. NrxrXF)�evaluate)r r�r�r�r�rr�rr*rQr�r�r�r)rarmrl�signr6r�r�r�s r]�_meijerzReduceOrder._meijer\s��� �A�J�J�� �A�J�J�� ��E�� �=� �� � ��4�����$�$�� �E���q��� #� #�A� �$�r�'�A�+��/� "�A�A��!�R�[�[�� � �2�:�:��D�G��D�G�G��!�Q��U�U�3�3�3�D�G��!�Q��U�U�3�3�3�D�G�� r_c�0�|�||d��S)Nrx�r)rarmrls r]� meijer_minuszReduceOrder.meijer_minusvs���{�{�1�a��$�$�$r_c�<�|�d|z d|z d��SrWr)rarlrms r]� meijer_pluszReduceOrder.meijer_pluszs ���{�{�1�q�5�!�a�%��+�+�+r_c�(�d|j�d|j�d�S)Nz"<Reduce order by cancelling upper z with lower r�)r�r�r�s r]r�zReduceOrder.__str__~s��� �W�W�W�d�g�g�g�� r_N) rrrrr�� classmethodrrrr�rvr_r]r�r�Cs�������B�B����,����[��2�%�%��[�%��,�,��[�,�����r_r�c��t|��}t|��}|�|���|�|���g}g}|D]{}d}tt|����D]-}||||��}|�|�|��n�.|�|�|���f|�|���||||fS)z? Order reduction algorithm used in Hypergeometric and Meijer G r�N)r�r�rr�r�rf) rhri�genr��nap� operatorsrlr�r�s r]� _reduce_orderr �s��� �b���B� �b���B��G�G��G�����G�G��G���� �C��I� � !� !�� ���s�2�w�w��� � �A���Q��1����B��~����q� � � ���� �:� �J�J�q�M�M�M�M� � � �R� � � � � ��I� �r_c��t|j|jtt��\}}}t t |�t |���|fS)a� Given the hypergeometric function ``func``, find a sequence of operators to reduces order as much as possible. Explanation =========== Return (newfunc, [operators]), where applying the operators to the hypergeometric function newfunc yields func. Examples ======== >>> from sympy.simplify.hyperexpand import reduce_order, Hyper_Function >>> reduce_order(Hyper_Function((1, 2), (3, 4))) (Hyper_Function((1, 2), (3, 4)), []) >>> reduce_order(Hyper_Function((1,), (1,))) (Hyper_Function((), ()), [<Reduce order by cancelling upper 1 with lower 1.>]) >>> reduce_order(Hyper_Function((2, 4), (3, 3))) (Hyper_Function((2,), (3,)), [<Reduce order by cancelling upper 4 with lower 3.>]) )r rhrir�rrer )rkr �nbqr s r]� reduce_orderr�s@��.(�����+�GW�X�X��C��i� �%��+�u�c�{� 3� 3�Y� >�>r_c���t|j|jtjd���\}}}t|j|jtjt��\}}}t||||��||zfS)a  Given the Meijer G function parameters, ``func``, find a sequence of operators that reduces order as much as possible. Return newfunc, [operators]. Examples ======== >>> from sympy.simplify.hyperexpand import (reduce_order_meijer, ... G_Function) >>> reduce_order_meijer(G_Function([3, 4], [5, 6], [3, 4], [1, 2]))[0] G_Function((4, 3), (5, 6), (3, 4), (2, 1)) >>> reduce_order_meijer(G_Function([3, 4], [5, 6], [3, 4], [1, 8]))[0] G_Function((3,), (5, 6), (3, 4), (1,)) >>> reduce_order_meijer(G_Function([3, 4], [5, 6], [7, 5], [1, 5]))[0] G_Function((3,), (), (), (1,)) >>> reduce_order_meijer(G_Function([3, 4], [5, 6], [7, 5], [5, 3]))[0] G_Function((), (), (), ()) c�"�t| ��Srcrr�s r]r�z%reduce_order_meijer.<locals>.<lambda>�s��-=�q�b�-A�-A�r_) r r�rir�rr�rhrrr�)rkrr�ops1�nbmr �ops2s r]�reduce_order_meijerr�sr��,#�4�7�D�G�[�5L�#A�#A�C�C�N�C��d�"�4�7�D�G�[�5M�#3�5�5�N�C��d� �c�3��S� )� )�4�$�;� 6�6r_c������fd�}|S)z? Create a derivative operator, to be passed to Operator.apply. c����|����z|�zz}|�t�����}|Src)r�� applyfuncr�)rsr�rtros ��r]�doitz&make_derivative_operator.<locals>.doit�s;��� �a�f�f�Q�i�i�K�!�A�#� �� �K�K� �!� � � %� %���r_rv)rtrors`` r]�make_derivative_operatorr�s)���������� �Kr_c�Z�|}t|��D]}|�||��}�|S)zk Apply the list of operators ``ops`` to object ``obj``, substituting ``op`` for the generator. )�reversedr�)r��opsr�rj�os r]�apply_operatorsr�s8�� �C� �c�]�]�����g�g�c�2����� �Jr_c �0���d�|j|j|j|jfD��\}}}}tt|�������tt|�������ks^tt|�������tt|�������krt |�d|�����g}d����fd�}��fd�} t t|�����t|�����zt���D�]�} d} d} d} d}| |vr|| } || } | |vr|| } || }t| ��t| ��ks t| ��t|��krt |�d|�����d�| | | |fD��\} } } }d �}||| ��}||| ��}t| ��d kr|| g|| ||��z }n�t| ��d kr||| g| ||��z }n�| d }| d }|d |z d ks| d |z d krt d ���||z d kr%||| || ||��z }|| | || ||��z }n$|| | || ||��z }||| | | ||��z }| || <| || <���|���|S) a( Devise a plan (consisting of shift and un-shift operators) to be applied to the hypergeometric function ``target`` to yield ``origin``. Returns a list of operators. Examples ======== >>> from sympy.simplify.hyperexpand import devise_plan, Hyper_Function >>> from sympy.abc import z Nothing to do: >>> devise_plan(Hyper_Function((1, 2), ()), Hyper_Function((1, 2), ()), z) [] >>> devise_plan(Hyper_Function((), (1, 2)), Hyper_Function((), (1, 2)), z) [] Very simple plans: >>> devise_plan(Hyper_Function((2,), ()), Hyper_Function((1,), ()), z) [<Increment upper 1.>] >>> devise_plan(Hyper_Function((), (2,)), Hyper_Function((), (1,)), z) [<Increment lower index #0 of [], [1].>] Several buckets: >>> from sympy import S >>> devise_plan(Hyper_Function((1, S.Half), ()), ... Hyper_Function((2, S('3/2')), ()), z) #doctest: +NORMALIZE_WHITESPACE [<Decrement upper index #0 of [3/2, 1], [].>, <Decrement upper index #0 of [2, 3/2], [].>] A slightly more complicated plan: >>> devise_plan(Hyper_Function((1, 3), ()), Hyper_Function((2, 2), ()), z) [<Increment upper 2.>, <Decrement upper index #0 of [2, 2], [].>] Another more complicated plan: (note that the ap have to be shifted first!) >>> devise_plan(Hyper_Function((1, -1), (2,)), Hyper_Function((3, -2), (4,)), z) [<Decrement lower 3.>, <Decrement lower 4.>, <Decrement upper index #1 of [-1, 2], [4].>, <Decrement upper index #1 of [-1, 3], [4].>, <Increment upper -2.>] c�8�g|]}t|t����Srvr�r�s r]r�zdevise_plan.<locals>.<listcomp>s8��0D�0D�0D� �15�V�U�0C�0C�0D�0D�0Dr_z not reachable from c� �g}tt|����D]d}||||z dkr|}d}n|}d}||||kr2||||��gz }||xx|z cc<||||k�2�e|S)NrrXrx)rr�)�fro�to�inc�decrr��sh�chs r]� do_shiftszdevise_plan.<locals>.do_shifts"s������s�3�x�x��� � �A��!�u�s�1�v�~��!�!�����������Q�%�3�q�6�/�/����3�� � �|�#���A����"� �����Q�%�3�q�6�/�/��� r_c �4������||d�����fd���S)z( Shift us from (nal, nbk) to (al, nbk). c�,�t||��Src)r��r�r�s r]r�z2devise_plan.<locals>.do_shifts_a.<locals>.<lambda>4s��v�a��d�|�|�r_c�4��t|�z��z|���Src)r�)r�r��aother�bother�nbkros ����r]r�z2devise_plan.<locals>.do_shifts_a.<locals>.<lambda>5s���h�q�6�z�3��<��A�&N�&N�r_rv)�nalr0�alr.r/r)ros ` ``��r]� do_shifts_az devise_plan.<locals>.do_shifts_a2s<�������y��b�";�";�N�N�N�N�N�N�N�P�P� Pr_c�4������||����fd�d���S)z( Shift us from (nal, nbk) to (nal, bk). c�4��t��z|�z|���Src)r�)r�r�r.r/r1ros ����r]r�z2devise_plan.<locals>.do_shifts_b.<locals>.<lambda>:s���h�s�V�|�Q��Z��A�&N�&N�r_c�,�t||��Src)r�r,s r]r�z2devise_plan.<locals>.do_shifts_b.<locals>.<lambda>;s��f�Q�q�T�l�l�r_rv)r1r0�bkr.r/r)ros` ``��r]� do_shifts_bz devise_plan.<locals>.do_shifts_b7s9�������y��b�N�N�N�N�N�N�N�2�2�4�4� 4r_r�rvc�:�g|]}t|t�����S)r�)�sortedrrs r]r�zdevise_plan.<locals>.<listcomp>Ks6��)�)�)��#�1�*:�;�;�;�)�)�)r_c�V�g}|D]#}||kr|�||���$|Src)r_)rr�r�r�s r]�otherszdevise_plan.<locals>.othersNs;���A�� %� %����8�8��H�H�S��V�$�$�$���Hr_rrxzNon-suitable parameters.) rhrir�r�r�rZr:rr)rk�originror�r�� nabuckets� nbbucketsrr3r8r�r2r1r7r0r<r.r/�namax�amaxr)s ` @r]� devise_planrB�s�����\0D�0D��y�&�)�V�Y�� �B�0D�0D�0D�,�H�h� �9� �4�� � ��� � �!�!�S��i�n�n�.>�.>�)?�)?�%@�%@�@�@� ��X�]�]�_�_�%�%� &� &�#�d�9�>�>�3C�3C�.D�.D�*E�*E� E� E��v�v�v�v�v�F�G�G�G� �C���� P�P�P�P�P�P� 4�4�4�4�4�4� �D������)�)�D������,A�,A�A�GW� X� X� X�1�1�� ���� ���� ��=�=��!��B��A�,�C� ��=�=��!��B��A�,�C� �r�7�7�c�#�h�h� � �#�b�'�'�S��X�X�"5�"5��6�6�6�6�6�J�K�K� K�)�)��#�r�3�'�)�)�)���C��S� � � � �� �1�%�%���� �1�%�%�� �r�7�7�a�<�<� �;�;�r�3��F�F�;�;� ;�C�C� ��W�W��\�\� �;�;�s�B��F�F�;�;� ;�C�C���G�E��b�6�D��1�v��~��"�"�b��e�d�l�a�&7�&7� �!;�<�<�<��t�|�a����{�{�3��R���@�@�@���{�{�2�s�B���?�?�?����{�{�3��R���@�@�@���{�{�3��B���?�?�?��� �!� �� �!� � ��K�K�M�M�M� �Jr_c�� � �t|jt��t|jt��}}t |t j��dkrdS|t jd}|dkrdSt j|vrdSt|t j��}|���|d� � dkrdSt|j��}|� |��t|j��}|� � ��� dz� � fd�|D��}� fd�|D��}g}t|dz ��D]'� |� t� dz�����(|� ��t� ��|� zz } | t� fd�|D���z} | t� fd�|D���z} |t!| ��gz }d} t� ��D]L� |� zt� ��z } | t� fd�|D���z} | t� fd �|D���z} | | z } �Mt#||��|| fS) z? Try to recognise a hypergeometric sum that starts from k > 0. rXNrc���g|]}|�z ��Srvrv�r�r[r�s �r]r�z#try_shifted_sum.<locals>.<listcomp>����� � � �Q�1�q�5� � � r_c���g|]}|�z ��SrvrvrEs �r]r�z#try_shifted_sum.<locals>.<listcomp>�rFr_c�0��g|]}t|�����Srv�r6)r�rmr�s �r]r�z#try_shifted_sum.<locals>.<listcomp>��!���'�'�'�a��A�q���'�'�'r_c�0��g|]}t|�����SrvrI)r�rlr�s �r]r�z#try_shifted_sum.<locals>.<listcomp>�rJr_c�0��g|]}t|�����SrvrI�r�rlr6s �r]r�z#try_shifted_sum.<locals>.<listcomp>��!���)�)�)��2�a��8�8�)�)�)r_c�0��g|]}t|�����SrvrI�r�rmr6s �r]r�z#try_shifted_sum.<locals>.<listcomp>�rNr_)rUrhr^rir�rr�r�r��removerrfr�rr7rr�re)rkror�r�r�r�r rr�facr�r"r�r6s @@r]�try_shifted_sumrStsu�����d�g�u�-�-�t�D�G�U�/C�/C�h�H� �8�A�F� ����!�!��t�������A��A�v�v��t��v�X����t� �X�a�f� ���A��F�F�H�H�H� �!��A��A�v�v��t� �t�w�-�-�C��J�J�q�M�M�M� �t�w�-�-�C��J�J�q�M�M�M���F�A� � � � �#� � � �C� � � � �#� � � �C� �C� �1�q�5�\�\�"�"�� � � �6�!�a�%�=�=�!�!�!�!��K�K�M�M�M� �A�,�,�q�!�t� �C��3�'�'�'�'�3�'�'�'� (�(�C��3�'�'�'�'�3�'�'�'� (�(�C��L�� � � ��C� �A� �1�X�X���� �q�D��1��� �� �S�)�)�)�)�S�)�)�)� *�*�� �S�)�)�)�)�S�)�)�)� *�*�� �Q���� �#�s� #� #�S�1�"� ,�,r_c�� � �t|jt��t|jt��}}|tj}|tj}|���|���d�|D��}d�|D��� � r"t� fd�|D����rtS|sdS|d}d}tj } ttt| �����D]N� ||z}|� dzz}|t� fd�|jD���z}|t� fd�|jD���z}| |z } �O| S) zj Recognise polynomial cases. Returns None if not such a case. Requires order to be fully reduced. c��g|] }|dk�|�� SrOrvr�s r]r�z"try_polynomial.<locals>.<listcomp>���� #� #� #��A��F�F�1�F�F�Fr_c��g|] }|dk�|�� SrOrvr�s r]r�z"try_polynomial.<locals>.<listcomp>�rVr_c3�0�K�|]}|�dkV��dS)rxNrv)r�rl�bl0s �r]r�z!try_polynomial.<locals>.<genexpr>�s+�����,�,�1�1�s�2�w�;�,�,�,�,�,�,r_NrxrXc���g|]}|�z��SrvrvrMs �r]r�z"try_polynomial.<locals>.<listcomp>�����,�,�,�q�Q��U�,�,�,r_c���g|]}|�z��SrvrvrPs �r]r�z"try_polynomial.<locals>.<listcomp>�r[r_)rUrhr^rirr�r��allrr�r r�rr) rkror�r�rVr��al0rlrRrjrYr6s @@r]�try_polynomialr_�sf�����d�g�u�-�-�t�D�G�U�/C�/C�h�H� �!�&� �B� �!�&� �B��G�G�I�I�I��G�G�I�I�I� #� #�b� #� #� #�C� #� #�b� #� #� #�C� ��s�,�,�,�,��,�,�,�,�,��� � ���t� �B��A� �C� �%�C� �D���r���O�O� $���� �q��� �q�1�u� �� �s�,�,�,�,�D�G�,�,�,�-�-�� �s�,�,�,�,�D�G�,�,�,�-�-�� �s� ��� �Jr_c �� �t|jt��t|jt��}}i}|���D]Q\}}|dkr||vrdS||}t |��t |��f||<|�|d���R|ikrdStj|vrdS|tj\}}||dgzf|tj<td��} tj } tj } |���D]�\}\} }t| ��t|��krdSt| |��D]l\} }| |z j r/| |z }| t|| z|��z} | t||��z} �>|| z }| t| |��z} | t| | z|��z} �m��t| | z | ��}t!j|��}g}i}|D�]�}|���\} } | �| ��sKt)| | ��}|jst-d���|���\\}} || | z |fgz }�z| �| ��rt1d���| �| ��\}\}d}|jr|j}|j}|| kr| dknz|jrd|�| ��\} }d}|| kr|�| ��\}}||| z| zkrt1d|z���| |z} |||zz}nt1d���|�| g��� | |z |f�����i}i}td ��}|�!d �� ��ddd|z z i}|rBtE|d d��D]&}|||�#|��z||dz<�'|D]A\} }|�tj g��� | ||z���B|���D]�\} }|D]=\} }|�tI||| ��g��� | ���>|�!d �� ��tEd|d ddz��D]>}| tI||| ��fdtI||dz | ��fg|tI||| ��<�?| tI|d| ��fdd|z z tj fg|tI|d| ��<��i}!tKtj gt |�&����z��D] \}}||!|<� d�tO|!���d�� ��D��}"tQ|"��}#tQdgt|#��zg��}$|���D]\}} t!| �|$|!|<�tSt|#����}%|���D] \}}|D]\} }&| |%|!||!|&f<��!tU||dg|#|$|%��S)z� Try to find an expression for Hyper_Function ``func`` in terms of Lerch Transcendents. Return None if no such expression can be found. rNrXr�zp should be monomialz<Need partial fraction decomposition with linear denominatorszunrecognised form %sz%unrecognised form of partial fractionroc��|dSrWrvr�s r]r�ztry_lerchphi.<locals>.<lambda> s ���1��r_r�rxc��|dSrWrvr�s r]r�ztry_lerchphi.<locals>.<lambda>*s ��Q�q�T�r_rwc�2�g|]\}}t|����Srv)r)r�rmr7s r]r�z try_lerchphi.<locals>.<listcomp>3s4�� E� E� E���A�[��^�^� E� E� Er_c��|dSrWrvr�s r]r�ztry_lerchphi.<locals>.<lambda>4s ��a��d�r_)+rUrhr^rir�r�r�rr�r r�r�r�� is_positiver6rOr� make_argsr�r<rQ� is_monomialrY�LT�NotImplementedError� as_coeff_mul�is_Powr�base�is_Add�as_independentrurfr�rr�r8� enumerater�r:rLrNrg)'rkr�r��pairedr��value�bvalue�aints�bintsr�r�r��avaluerlrmr��partr�� monomials�termsr�r��indep�depr6�tmpr7�derivr�ro�monr�r\�trans�basisrrrsrt�b2s' r]� try_lerchphir��s ���d�g�u�-�-�t�D�G�U�/C�/C�h�H� �F��n�n�&�&� � � ��U� �!�8�8��8�+�+��4�4��#����E�{�{�D��L�L�1��s� �� � �S�$������2�~�~��t��v�X����t��!�&�>�L�E�5��U�a�S�[�)�F�1�6�N� �c� � �A� �E�E� �E�E�!'�����&�&��� �f�f� �v�;�;�#�f�+�+� %� %��4�4����'�'� &� &�D�A�q��A��"� &���E����A��E�1���%����A�q���!�����E����A�q���!����A��E�1���%��� &� ��u��a� � �D� �=�� � �D��I� �E��9�9���)�)�+�+� ��u��y�y��|�|� ��U�A���A��=� 8�� 6�7�7�7������J�U�a�A� �1�U�7�A�,�� '�I� � �9�9�Q�<�<� C�%�'B�C�C� C��)�)�!�,�,� ��u�� �� �:� ���A��(�C� �!�8�8� ��F�F�F� �Z� O��'�'��*�*�F�A�s��A��a�x�x��)�)�!�,�,���1��a��c�A�g�~�~�)�*@�3�*F�G�G�G� ��F�A� �Q��T�M�E�E�%�&M�N�N� N� ����B���&�&��e� �Q�'7�8�8�8�8� �E� �F� �c� � �A� �N�N�~�~�N�&�&�&� �a��Q��i�.�C��*��y��}�Q�'�(�(� *� *�A��3�q�6�;�;�q�>�>�)�C��A��J�J��6�6���1����!�%��$�$�+�+�A�c�!�f�H�5�5�5�5�� � � � �8�8���1�� ?� ?�D�A�q� � � �h�q�!�Q�/�/�� 4� 4� ;� ;�A� >� >� >� >� ���>�>��"�"�"��q�!�B�%��(�Q�,�'�'� D� D�A�*+��X�a��A�->�->�(?�)*�H�Q��A��q�,A�,A�(B�(D�E�(�1�a��#�#� $� $�&'�R��!�Q��):�):�$;�%&��A��Y���$6�$8��h�q�!�Q��� � � �E��1�5�'�D������$6�$6�6�7�7�����1���a��� E� E�&������5B�]�+D�+D�+D� E� E� E�E��u� � �A����C��F�F� �|���A�� � �������1��1�g��%��(� � � �c�!�f�f� � �A�� � � � �'�'���1�� '� '�E�A�r�%&�A�e�A�h��b� �!� "� "� '� �4��D�"�a��A� .� .�.r_c ���td��}|j�r%d�|jD��}d�|jD��}tt |�z|t |�zz }t |t��}|j��}g}t|��}t|��D]e} |jd| z} |t| gt|jdd���z|j|��gz }| |dz kr| || | f<| || | dzf<�ft|��} tdgdg|dz zzg��} t|��g} t|��D] } | � || | z���!|j��}|���dg|z}t!|��D]6\} }t!| | | z��D]\}}||xx||zz cc<��7t!|��D]=\} }| | |dz d|dz fz |j��dz ||dz | f<�>t#||dg| | |��Sg}t|jdd���}tt%|����D]'}|tg||��gz }||xxdz cc<�(|tg||��gz }t|��} t%| ��}tdgdg|dz zzg��} t|��}|t |j�z |d|dz f<td|��D]0} |j| dz || | dz f<|j| dz  || | f<�1t#||dg| | |��S)zU Create a formula object representing the hypergeometric function ``func``. roc�"�g|] }t|z�� Srvr)r+s r]r�z0build_hypergeometric_formula.<locals>.<listcomp>Ks��,�,�,�q�B��F�,�,�,r_c�(�g|]}t|zdz ��Sr-r)r.s r]r�z0build_hypergeometric_formula.<locals>.<listcomp>Ls ��0�0�0�1�B��F�Q�J�0�0�0r_rrXN)r rhrir*rrQr/rNrr?r�rLrMrfr1rrorgr�)rkror4r5r�rPr6rrtr�rlrrrs�derivsr�rjr\r�r�rir�s r]�build_hypergeometric_formular�@s��� �c� � �A� �w�-3�,�,�D�G�,�,�,��0�0���0�0�0���#�x�.� �1�S�(�^�#3�3���D�"�~�~�� �D�K�M�M���� �!�H�H���q��� � �A���� �Q��A� �e�Q�C�$�t�w�q�r�r�{�"3�"3�3�T�W�a�@�@�A� A�E��1�q�5�y�y��"��!�Q�$����!�Q��U�(� �� �5�M�M�� �Q�C�1�#�q�1�u�+�%�&� '� '���a�&�&����q��� '� '�A� �M�M�!�F�1�I�+� &� &� &� &� �D�O� � �� � � � � � ��c�!�e���a�L�L� � �D�A�q�!�!�F�1�I�+�.�.� � ���1��A����!�A�#� ����� ��c�N�N� J� J�D�A�q��"�V�A��E�]�1�a�!�e�8�4�4�_�T�_�5F�5F�q�5I�I�A�a�!�e�Q�h�K�K��t�Q��b�!�Q��2�2�2��� �$�'�!�!�!�*� � ���s�2�w�w��� � �A� �e�B��A�&�&�'� '�E� �q�E�E�E�Q�J�E�E�E�E� �%��B��"�"�#�#�� �5�M�M�� ��F�F�� �Q�C�1�#�q�1�u�+�%�&� '� '�� �!�H�H����T�W� �o��!�Q��U�(� ��q�!��� &� &�A��'�!�a�%�.�A�a��Q��h�K��w�q�1�u�~�o�A�a��d�G�G��t�Q��b�!�Q��2�2�2r_c��t|��t|��}}|}t|��}|dkr tjSddlm}|dk�rq|dk�rj||z\}}} |dkrKt | |z |z ��t | ��zt | |z ��z t | |z ��z S|dkr|||z | z��dkr||}}|dkr�|||z | z��dkr�|jrx|jrqdtt|zdz ��zt | ��zt ||z dz��zt | dz ��z t |dz |z dz��z St |dz dz��t ||z dz��zt |dz��z t |dz |z dz��z St|||��S)z� Try to find a closed-form expression for hyper(ap, bq, z), where ``z`` is supposed to be a "special" value, e.g. 1. This function tries various of the classical summation formulae (Gauss, Saalschuetz, etc). r�r�rwrXrx) r�r>rr��sympy.simplify.simplifyr�r#r�r�r!rr?) rhriror��q�z_r�rlrmr\s r]�hyperexpand_specialr�zs��� �r�7�7�C��G�G�q�A� �B��1� � �A��A�v�v��u� �0�0�0�0�0�0��A�v�v�!�q�&�&��r�'���1�a� ��6�6���Q����#�#�E�!�H�H�,�U�1�q�5�\�\�9�%��A��,�,�F� F� ��7�7�x�x��A��� �*�*�a�/�/��a�q�A� ��7�7�x�x��A��� �*�*�a�/�/��|� 5�� � 5���R��T�!�V���}�U�A�2�Y�Y�.�u�Q��U�Q�Y�/?�/?�?��A�2�a�4�[�[�!�!&�q��s�Q�w��{�!3�!3�4�4��Q�q�S�1�W�~�~�e�A��E�A�I�&6�&6�6��1�q�5�\�\�"�"'��!��a��!� �"4�"4�5�5� ��R�� � �r_N�z0rX�defaultc����������jr tjSddlm}t �d�����dkrd�������fd�}t �t��atd |��t|��\}} | rtd |��ntd ��t|���} | �ftd ��t| | �fd ���} t| �z��fd���} t|| ��� ������Stj} t|���} | �| \}} } td|��| | z } t| | �fd���} t| �z��fd���} || ��� ����} t���dvr�t!|j��t!|j��fdkrXt'|��} || | ���t*t,��}|�t*��s|| zSt �|��}|�t3|��}|�tdd��t'|��}td|jd|j��| t9||j���z } ||| ��| z}t;|d����t*t,��S)a7 Try to find an expression for the hypergeometric function ``func``. Explanation =========== The result is expressed in terms of a dummy variable ``z0``. Then it is multiplied by ``premult``. Then ``ops0`` is applied. ``premult`` must be a*z**prem for some a independent of ``z``. rr�F)r}r�� nonrepsmallc ���t|j�|j� ��|t |j�|j� ��� ����}t|�t |j�|j� ���t |jjd��zz� ����}�dkr"|�t� ����}td�t||j �|j� ����tj���z}|�� � ��}�r|����}|S)NrrXc�*�||d|dzzSr@rvrAs r]r�z5_hyperexpand.<locals>.carryout_plan.<locals>.<lambda>�s��q��1��a��d��{�r_)rrsr}rorrtrM�shaperr�rr�rrrr��rewrite) rvrrsr�rj�ops0�prem�premultr�ror�s ������r]� carryout_planz#_hyperexpand.<locals>.carryout_plan�s+��� �A�C�H�H�Q�S�"�-�-�s�4�Q�S�X�X�a�c�2�5F�5F��K�K� M� M�� �A�t�4�Q�S�X�X�a�c�2�5F�5F�+/��A�C�I�a�L�0A�0A�+A�6B�CE�G�G� H� H�� �a�<�<�� � �I�b�M�M�*�*�A� �*�*�C��1�3�8�8�A�C��3D�3D�,E�,E�q�v� N� N�w� V���f�f�R��m�m�� � '��+�+�g�&�&�C�� r_Nz)Trying to expand hypergeometric function � Reduced order to � Could not reduce order.z Recognised polynomial.c�4���|����zSrc�r��rvr�s �r]r�z_hyperexpand.<locals>.<lambda>�s����1�6�6�"�:�:� �r_c�4���|����zSrcr�r�s �r]r�z_hyperexpand.<locals>.<lambda>�s���r�!�&�&��*�*�}�r_z+ Recognised shifted sum, reduced order to c�4���|����zSrcr�r�s �r]r�z_hyperexpand.<locals>.<lambda>�s���"�Q�V�V�B�Z�Z�-�r_c�4���|����zSrcr�r�s �r]r�z_hyperexpand.<locals>.<lambda>�s���2�a�f�f�R�j�j�=�r_)rXrx)rwrXz Could not find an origin. z@Will return answer in terms of simpler hypergeometric functions.z Found an origin: � T��polar)�is_zerorr�r�r�r=� _collectionrqr�rr_rr>r}r�rSr�rhrir��replacer?r�r<r�r�r3rkrBrS)rkror�r�r�r�r�r�r�rrjr��nopsrvr�r�s `````` r]� _hyperexpandr��sF�������� �y���u� �0�0�0�0�0�0�������A��)����� � � � � � � � � � �*��'�)�)� � � 5�t�<�<�<��T�"�"�I�D�#� �+� �#�T�*�*�*�*� �)�*�*�*� ��r� "� "�C� �� �(�)�)�)� �C��&=�&=�&=�&=� >� >�� �A�g�I�t�-D�-D�-D�-D� E� E���(�(�1�+�+�*�*�2�q�1�1�2�2�2� ��A� �$�� #� #�C� ��� ��d�A� �;�T�B�B�B� �t� �� ��3� 7� 7� 7� 7�8�8�A���'� �4�)@�)@�)@�)@�A�A�A���� � ����Q���A��!�}�}����S���\�\�3�t�w�<�<�$@�F�$J�$J� (�� .� .�� �M�!�S� !� !� )� )�%�1D� E� E���u�u�U�|�|� ��q�5�L��'�'��-�-�G����t�$�$���� �,�2� 3� 3� 3�/�t�4�4�� � ��!4�c�7�<�H�H�H��;�t�W�\�2� .� .�.�C� � �g�s�#�#�a�'�A� �Q�d� #� #� #� +� +�E�3F� G� G�Gr_c �0���� � �d�}t|j���t|j���t|j��� t|j��� g}d}|�r3d}|�|j��� � �fd�d� � z��}|� ||gz }d}�.|�|j��� � �fd�d� � z��}|� ||gz }d}�W|� |j��� � �fd�d ��z��}|� ||gz }d}��|� |j��� � �fd �d ��z��}|� ||gz }d}��|�|j�fd �d g��}|� ||gz }d}��|�|j�fd �d g��}|� ||gz }d}��|� |j� fd �dg��}|� ||gz }d}��|� |j� fd�dg��}|� ||gz }d}��3|��3�t|j��ksH�t|j��ks0� t|j��ks� t|j��krt d���|���|S)a Find operators to convert G-function ``fro`` into G-function ``to``. Explanation =========== It is assumed that ``fro`` and ``to`` have the same signatures, and that in fact any corresponding pair of parameters differs by integers, and a direct path is possible. I.e. if there are parameters a1 b1 c1 and a2 b2 c2 it is assumed that a1 can be shifted to a2, etc. The only thing this routine determines is the order of shifts to apply, nothing clever will be tried. It is also assumed that ``fro`` is suitable. Examples ======== >>> from sympy.simplify.hyperexpand import (devise_plan_meijer, ... G_Function) >>> from sympy.abc import z Empty plan: >>> devise_plan_meijer(G_Function([1], [2], [3], [4]), ... G_Function([1], [2], [3], [4]), z) [] Very simple plans: >>> devise_plan_meijer(G_Function([0], [], [], []), ... G_Function([1], [], [], []), z) [<Increment upper a index #0 of [0], [], [], [].>] >>> devise_plan_meijer(G_Function([0], [], [], []), ... G_Function([-1], [], [], []), z) [<Decrement upper a=0.>] >>> devise_plan_meijer(G_Function([], [1], [], []), ... G_Function([], [2], [], []), z) [<Increment lower a index #0 of [], [1], [], [].>] Slightly more complicated plans: >>> devise_plan_meijer(G_Function([0], [], [], []), ... G_Function([2], [], [], []), z) [<Increment upper a index #0 of [1], [], [], [].>, <Increment upper a index #0 of [0], [], [], [].>] >>> devise_plan_meijer(G_Function([0], [], [0], []), ... G_Function([-1], [], [1], []), z) [<Increment upper b=0.>, <Decrement upper a=0.>] Order matters: >>> devise_plan_meijer(G_Function([0], [], [0], []), ... G_Function([1], [], [1], []), z) [<Increment upper a index #0 of [0], [], [1], [].>, <Increment upper b=0.>] c����tt||����D]X\}\�}�|z jrF|�z |z dkr:t�fd�|D����r||��}||xx|z cc<|cS�YdS)aD Try to apply ``shifter`` in order to bring some element in ``f`` nearer to its counterpart in ``to``. ``diff`` is +/- 1 and determines the effect of ``shifter``. Counter is a list of elements blocking the shift. Return an operator if change was possible, else None. rc3�$�K�|] }�|kV�� dSrcrv)r�r[rls �r]r�z8devise_plan_meijer.<locals>.try_shift.<locals>.<genexpr>Rs'�����0�0�1��Q��0�0�0�0�0�0r_N)ror�r�r]) rvr��shifterr��counter�idxrmr'rls @r]� try_shiftz%devise_plan_meijer.<locals>.try_shiftGs����%�S��A�Y�Y�/�/� � �K�C��!�Q��Q��"� �()�A��t�|�a�'7�'7��0�0�0�0��0�0�0�0�0�(8��W�S�\�\���#����$������ � � ��  � r_TFc�,��t����|���Src)r��r��fan�fap�fbm�fbqros �����r]r�z$devise_plan_meijer.<locals>.<lambda>_������S�#�s�A�q�!I�!I�r_rXNc�,��t����|���Src)r�r�s �����r]r�z$devise_plan_meijer.<locals>.<lambda>fr�r_c�,��t����|���Src)r�r�s �����r]r�z$devise_plan_meijer.<locals>.<lambda>mr�r_rxc�,��t����|���Src)r�r�s �����r]r�z$devise_plan_meijer.<locals>.<lambda>tr�r_c�.��t�|��Src)r�)r�r�s �r]r�z$devise_plan_meijer.<locals>.<lambda>z����\�#�a�&�-A�-A�r_c�.��t�|��Src)r�)r�r�s �r]r�z$devise_plan_meijer.<locals>.<lambda>r�r_c�.��t�|��Src)r�)r�r�s �r]r�z$devise_plan_meijer.<locals>.<lambda>�r�r_c�.��t�|��Src)r�)r�r�s �r]r�z$devise_plan_meijer.<locals>.<lambda>�r�r_zCould not devise plan.)r�r�rhr�ririr) r#r$ror�r�changer�r�r�r�r�s ` @@@@r]�devise_plan_meijerr� s�������t��� �s�v�,�,�C� �s�v�,�,�C� �s�v�,�,�C� �s�v�,�,�C� �C� �F� �1��� �Y�s�B�E�I�I�I�I�I�I�I�I��#��)�%�%�� �>� �B�4�K�C��F� � �Y�s�B�E�I�I�I�I�I�I�I�I��#��)�%�%�� �>� �B�4�K�C��F� � �Y�s�B�E�I�I�I�I�I�I�I�I��3��9�&�&�� �>� �B�4�K�C��F� � �Y�s�B�E�I�I�I�I�I�I�I�I��3��9�&�&�� �>� �B�4�K�C��F� � �Y�s�B�E�#A�#A�#A�#A�2�r� J� J�� �>� �B�4�K�C��F� � �Y�s�B�E�#A�#A�#A�#A�2�r� J� J�� �>� �B�4�K�C��F� � �Y�s�B�E�#A�#A�#A�#A�1�b� I� I�� �>� �B�4�K�C��F� � �Y�s�B�E�#A�#A�#A�#A�1�b� I� I�� �>� �B�4�K�C��F� �c �1�d �d�2�5�k�k���S�D���K�K�/�/�3�$�r�u�+�+�3E�3E� �4���;�;� � �!�":�;�;�;��K�K�M�M�M� �Jr_Fc �� ����t�t��a|dkrd}|}td|��td��}t |��\}��rtd|��ntd��t�|��}|��td|j���t|j||��z �t|j � |j |���t|j � |j |��|����}|�t|����}||j� |j |��z} | d� ||��} t#| d � ��Std ��d �����fd �} td���| |j|j|j|j||��\} } d�} �D]F}t-|j� |d�z t0t0 i��t0��|_�G| | |j��| |j��| |j��| |j���d|z ��\}}t#| � ||��d � ��} t#|� �d|z ��d � ��}t3|t4��s|� �d|z ��}||��}|jdkso|jdkrpt9|j��t9|j��krFt;|j��dkdur,t?|��t?d��kr | durd } |durd }| d ur| � |pd��} n| � |pd��} |d ur|� |pd��}n|� |pd��}| dur|dur|dkrd}|tBkrd} t3| t4��s| � ||��} t3|t4��s|� ||��}d�}|| | ��}|||��}tE||��ddtFfkr ||kr| S|StI|d|d��dkr@tI|d|d��dkr tK| | f||f||��d f��StK| | f||f||��d f��} | �&tN��r|std��| �&tN��r|r| S||��S)a� Try to find an expression for the Meijer G function specified by the G_Function ``func``. If ``allow_hyper`` is True, then returning an expression in terms of hypergeometric functions is allowed. Currently this just does Slater's theorem. If expansions exist both at zero and at infinity, ``place`` can be set to ``0`` or ``zoo`` for the preferred choice. Nr�z1Try to expand Meijer G function corresponding to ror�r�z Found a Meijer G formula: rTr�z; Could not find a direct formula. Trying Slater's theorem.c��|D]U}t||��dkr:d}||vrt||��}|dzt||��krdS�VdS)z Test if slater applies. rXrFTr�)rrr�r�s r]�can_doz_meijergexpand.<locals>.can_do�sg��� !� !�A��3�q�6�{�{�Q�������8�8��C��F� � �A��q�5�3�s�1�v�;�;�&�&� �5�5���tr_c �p ���%�&�'�t||||��}|���\}}} }�(|| ��stjdfSt |��t |��zt |��t |��zk} t |��t |��zt |��t |��zkrt ���dk} | durtjdfStj} |D�]4} t || ��dk�rl|| d�'d} t |��}|��'��|D]}| t|�'z ��z} �|D]}| td�'z|z ��z} �|D]}| td�'z|z ��z} �|D]}| t|�'z ��z} ��'fd�t |��t |��zD��}�'fd�t |��t |��zD��}ttj t |��t |��z z��}||z}�*|z �'z}tt||��|�)�*|�'d���}| | |zz } ���|| d�&�&fd�|| dd�D��}t |��}�&fd�| | d|dz�D��}t |��}|| D]}|�|���t |��}| | d|�D]}|�|���|d }d �t||��D��}td ��}�|z} |D]J}t|d��s#|jrt#t%|����}| t||z ��z} �K|D]}| td|z |z��z} �|D]}| td|z |z��z} �|D]}| t||z ��z} �t'| ��} t)t#t%|������D]/}!t+| |�&|!z��}"t-|"�)�fd ���}"| |"z} �0�&|z�%ttj t |��t |��zdzz��}||z}�*|z �%z}�%fd �t |��t |��zD��dgz}�%fd�t |��t |��zD��}tt||��|�)�*|�%d���}tj |zt/|��z }#t)|��D]=}$|#tj ||$zt1|||$z dz||$��z z}#�>|D]}|#td|z �%z��z}#�|D]}|#t|�%z ��z}#�|D]}|#t|�%z ��z}#�|D]}|#td|z �%z��z}#�| |#|zz } ��6| | fS)NFrXrc� ��g|] }d�z|z �� Sr-rv)r�rl�bhs �r]r�z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp>��!���?�?�?�a�q�2�v��z�?�?�?r_c� ��g|] }d�z|z �� Sr-rv)r�rmr�s �r]r�z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp>�r�r_�r�c���g|]}|�z ��Srvrv)r�r��b_s �r]r�z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp> s���3�3�3�"�b�2�g�3�3�3r_c���g|]}|�z ��Srvrv)r�r�r�s �r]r�z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp> s���7�7�7�"�b�2�g�7�7�7r_rxc��g|] \}}||z �� Srvrv)r�r�r�s r]r�z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp> s ��6�6�6���A�a�!�e�6�6�6r_r�c�4���|����zSrcr�)rvros �r]r�z3_meijergexpand.<locals>.do_slater.<locals>.<lambda>! s���!�A�F�F�1�I�I�+�r_c� ��g|] }d�z|z �� Sr-rv)r�rl�aus �r]r�z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp>) r�r_c� ��g|] }d�z|z �� Sr-rv)r�rmr�s �r]r�z5_meijergexpand.<locals>.do_slater.<locals>.<listcomp>* r�r_)r�r#rr�r�r�r�rQr#r2� NegativeOner�rer�r rrY�int�roundrrrRrr7r6)+r�r�rhriro�zfinalrkr7rr�condrjr"rR�bor��ajr rr��hargr��hyp�kir��lirm�aorl�lu�dir�� integrandr��residrsr�r�r�r�r�rr�s+ ` @@@���r]� do_slaterz!_meijergexpand.<locals>.do_slater�s���������"�b�"�b�)�)���-�-�/�/���3��Q��v�c�3��� !��6�5�=� ��2�w�w��R��� �3�r�7�7�S��W�W�#4�4�� �r�7�7�S��W�W� ��B���#�b�'�'� 1� 1� 1��q�6�6�A�:�D� �5�=�=��6�5�=� ��f���T �T �A��3�q�6�{�{�a�����V�A�Y�����"�X�X��� � �"� � � ��*�*�B��5��b��>�>�)�C�C��.�.�B��5��R��"��-�-�-�C�C��.�.�B��5��R��"��-�-�-�C�C��*�*�B��5��b��>�>�)�C�C�?�?�?�?�4��8�8�d�2�h�h�+>�?�?�?��?�?�?�?�4��8�8�d�2�h�h�+>�?�?�?���q�}�s�2�w�w��R���/@�A�B�B����x���Q�3��)��"�>�#�s�#;�#;�T�3�#$�g�r�4�A�A�A���s�S�y� �����V�A�Y��3�3�3�3��A��q�r�r� �3�3�3����G�G��7�7�7�7��A��v��A��v��7�7�7���"�X�X���Q��!�!�A��I�I�a�L�L�L�L��"�X�X���Q������!�!�A��I�I�a�L�L�L�L���V��6�6�#�b�"�+�+�6�6�6���#�J�J���q�D� ��.�.�A��q�!�9�9�*���*���a���M�M����q�1�u���-�I�I��2�2�A���q�1�u�q�y�!1�!1�1�I�I��2�2�A���q�1�u�q�y�!1�!1�1�I�I��.�.�A���q�1�u���-�I�I�(� �2�2� ��s�5��9�9�~�~�.�.�!�!�A�#�I�q�"�q�&�9�9�E�+�E�3�8M�8M�8M�8M�N�N�E��5�L�C�C��"�W���q�}�s�2�w�w��R���/@�1�/D�E�F�F����x���Q�3��)��?�?�?�?�4��8�8�d�2�h�h�+>�?�?�?�1�#�E��?�?�?�?�4��8�8�d�2�h�h�+>�?�?�?��"�>�#�s�#;�#;�T�3�#$�g�r�4�A�A�A���M�B�'� �"� � �5���q���H�H�A�����1��-�b��b��e��a���A��.G�.G�G�G�A�A��+�+�A���q�1�u�r�z�*�*�*�A�A��'�'�A���q�2�v���&�A�A��'�'�A���q�2�v���&�A�A��+�+�A���q�1�u�r�z�*�*�*�A�A��q��u� ����D�y�r_r�c��d�|D��S)Nc��g|]}d|z ��Sr-rvr�s r]r�z._meijergexpand.<locals>.tr.<locals>.<listcomp>C s��!�!�!�!��A��!�!�!r_rv)r�s r]r�z_meijergexpand.<locals>.trB s��!�!�q�!�!�!�!r_rXrxF�nonrepr�c���|durd}n |durd}nd}|�ttt t��rd}||�t ��|���fS)NTrFrXrwrz)r<rrr�countr?� count_ops)r�r��c0s r]�weightz_meijergexpand.<locals>.weightr sm�� �4�<�<��B�B� �U�]�]��B�B��B� �8�8�B��b�S�#� &� &� ��B��D�J�J�u�%�%�t�~�~�'7�'7�8�8r_z@ Could express using hypergeometric functions, but not allowed.)(�_meijercollectionr�r�r rr�rkr�rrsr}rorrtrr�rrrSr�r�rhrirQr�r*r�r��deltar�r:�nur2r�rr]rr^r9r<r?)rkr�� allow_hyperr��place�func0rorvrsr�r��slater1�cond1r�r��slater2�cond2r"r��w1�w2r�rr�s @@@r]�_meijergexpandr��s������� �3�5�5���)����� �E� � =�t�D�D�D� �c� � �A�#�D�)�)�I�D�#� �+� �#�T�*�*�*�*� �)�*�*�*� �'�'��-�-�A��}� �,�a�f�5�5�5� �!�!�&�$��2�2�2�� �A�C�H�H�Q�S�!�,�,�c�4�Q�S�X�X�a�c�1�5E�5E�q�I�I� K� K�� �K�K� �!� � � %� %�� �a�c�h�h�q�s�A��� �� �a�D�I�I�a�� � ����$�'�'�'�'� � G�H�H�H� � � �e�e�e�e�e�e�e�N �c� � �A��Y�t�w�����$�'�1�b�I�I�N�G�U�"�"�"��>�>����� � �q�!�A�#�r�B�3�&7�8�8�"�=�=�����Y�r�r�$�'�{�{�B�B�t�w�K�K���D�G���b�b���k�k� �!�B�$�(�(�N�G�U��� � �Q��+�+�4�8�8�8�G��� � �Q��"��-�-�T�:�:�:�G� �e�T� "� "�#�� � �1�a��c�"�"�� ��Q���A��w��{�{� ��A���#�a�d�)�)�s�1�4�y�y�0�0� ���X�X��]�5� (� (�Z��^�^�z�!�}�}�-L�-L� �� � ��E� �� � ��E� ��}�}��/�/�'�"5�X�6�6����/�/�'�":�]�;�;�� ��}�}��/�/�'�"5�X�6�6����/�/�'�":�]�;�;�� �E���e�5�0�0� �A�:�:��E� �C�<�<��E� �e�T� "� "�"�� � �1�b�!�!�� �e�T� "� "�"�� � �1�b�!�!�� 9� 9� 9� ���� � �B� ���� � �B� �2�r�{�{�q�!�R�j� � � ��7�7��N��N� �2�a�5�"�Q�%���A���#�b��e�R��U�"3�"3�q�"8�"8��'�5�)�G�U�+;�e�e�B�i�i��=N�O�O�O� �7�E�"�W�e�$4�u�u�R�y�y�$�6G�H�H�A��u�u�U�|�|�"�K�"� �!� "� "� "� �5�5��<�<��;���� �5��9�9�r_c�����t|��}�fd�}���fd�}|�t|���t|��S)a� Expand hypergeometric functions. If allow_hyper is True, allow partial simplification (that is a result different from input, but still containing hypergeometric functions). If a G-function has expansions both at zero and at infinity, ``place`` can be set to ``0`` or ``zoo`` to indicate the preferred choice. Examples ======== >>> from sympy.simplify.hyperexpand import hyperexpand >>> from sympy.functions import hyper >>> from sympy.abc import z >>> hyperexpand(hyper([], [], z)) exp(z) Non-hyperegeometric parts of the expression and hypergeometric expressions that are not recognised are left unchanged: >>> hyperexpand(1 + hyper([1, 1, 1], [], z)) hyper((1, 1, 1), (), z) + 1 c�n��tt||��|����}|�t|||��S|S)Nr�)r�rer?)rhriror�r�s �r]� do_replacezhyperexpand.<locals>.do_replace� s=��� ���B�/�/��G� D� D� D�� �9���R��#�#� #��Hr_c ����tt|d|d|d|d��|������}|�ttt t ��s|SdS)NrrX)r�r�)r�r�r<rrr)rhriror�r�r�r�s ���r]� do_meijerzhyperexpand.<locals>.do_meijer� sk��� �:�b��e�R��U�B�q�E�2�a�5�A�A�1���u� >� >� >���u�u�S�#�r�B�3�'�'� ��H� � r_)r r�r?rK)rvr�r�r�r�r�s ``` r]� hyperexpandr�� st�����2 �� � �A������������� �9�9�U�J� '� '� /� /��� C� C�Cr_)Fr�N)�r� collectionsr� itertoolsr� functoolsr�mathr�sympyr� sympy.corerr r r r r rrrrrrrrrrr�sympy.core.modr�sympy.core.sortingr�sympy.functionsrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;r<�$sympy.functions.elementary.complexesr=r>�sympy.functions.special.hyperr?r@rArBrCrDrErFrGrHrIrJrK�sympy.matricesrLrMrN� sympy.polysrOrPrQ� sympy.seriesrR�sympy.simplify.powsimprS�sympy.utilities.iterablesrUr^r�r�r�r�rer�r*rgrqr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r rrrrrBrSr_r�r�r�r�r�r�r�r�r�rvr_r]�<module>rs� ����t$�#�#�#�#�#�������������������������@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�������/�/�/�/�/�/�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�F�E�E�E�E�E�E�E�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�5�.�-�-�-�-�-�-�-�-�-�)�)�)�)�)�)�)�)�)�)� � � � � � �,�,�,�,�,�,�*�*�*�*�*�*� � � �]�]�]�@ @�@�@�F � � ����A�A�A�A�A�T�A�A�A�H<H�<H�<H�<H�<H��<H�<H�<H�@ �U�3�Z�Z��B�B�B�B�B�B�B�B�NI�I�I�I�I�I�I�I�X&:�&:�&:�&:�&:�&:�&:�&:�R��������.2�2�2�2�2�2�2�2�j!�!�!�!�!�8�!�!�!� H� H� H� H� H�X� H� H� H� L� L� L� L� L�X� L� L� L�&L�&L�&L�&L�&L�x�&L�&L�&L�R'L�'L�'L�'L�'L�x�'L�'L�'L�TH�H�H�H�H�8�H�H�H�L�L�L�L�L�8�L�L�L�I�I�I�I�I�8�I�I�I�L�L�L�L�L�8�L�L�L�#N�#N�#N�#N�#N�X�#N�#N�#N�L,N�,N�,N�,N�,N�X�,N�,N�,N�^0N�0N�0N�0N�0N�X�0N�0N�0N�f.N�.N�.N�.N�.N�X�.N�.N�.N�b=�=�=�=�=�(�=�=�=�@���4?�?�?�87�7�7�<������F�F�F�R*-�*-�*-�Z���8@/�@/�@/�F73�73�73�t#�#�#�J� � "�e�e�D�k�k�1�1�"�hH�hH�hH�hH�VE�E�E�N��9B��}�}�}�}�@'D�'D�'D�'D�'D�'Dr_
Memory