ó
¡¼™\c           @  sï   d  Z  d d l m Z m Z d d l m Z m Z m Z m Z m	 Z	 m
 Z
 m Z m Z m Z d d l m Z d g Z d „  Z d „  Z d „  Z d d	 „ Z d d
 „ Z d d „ Z d d „ Z d d „ Z d e f d „  ƒ  YZ d „  Z d S(   sŒ  
Wigner, Clebsch-Gordan, Racah, and Gaunt coefficients

Collection of functions for calculating Wigner 3j, 6j, 9j,
Clebsch-Gordan, Racah as well as Gaunt coefficients exactly, all
evaluating to a rational number times the square root of a rational
number [Rasch03]_.

Please see the description of the individual functions for further
details and examples.

References
~~~~~~~~~~

.. [Rasch03] J. Rasch and A. C. H. Yu, 'Efficient Storage Scheme for
  Pre-calculated Wigner 3j, 6j and Gaunt Coefficients', SIAM
  J. Sci. Comput. Volume 25, Issue 4, pp. 1416-1428 (2003)

Credits and Copyright
~~~~~~~~~~~~~~~~~~~~~

This code was taken from Sage with the permission of all authors:

https://groups.google.com/forum/#!topic/sage-devel/M4NZdu-7O38

AUTHORS:

- Jens Rasch (2009-03-24): initial version for Sage

- Jens Rasch (2009-05-31): updated to sage-4.0

Copyright (C) 2008 Jens Rasch <jyr2000@gmail.com>
iÿÿÿÿ(   t   print_functiont   division(	   t   Integert   pit   sqrtt   sympifyt   Dummyt   St   Sumt   Ynmt   Function(   t   rangei   c         C  sj   |  t  t ƒ k rX xC t t  t ƒ t |  d ƒ ƒ D] } t j t | d | ƒ q2 Wn  t t |  ƒ d  S(   sþ  
    Function calculates a list of precomputed factorials in order to
    massively accelerate future calculations of the various
    coefficients.

    INPUT:

    -  ``nn`` -  integer, highest factorial to be computed

    OUTPUT:

    list of integers -- the list of precomputed factorials

    EXAMPLES:

    Calculate list of factorials::

        sage: from sage.functions.wigner import _calc_factlist
        sage: _calc_factlist(10)
        [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
    i   (   t   lent	   _FactlistR   t   intt   append(   t   nnt   ii(    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt   _calc_factlist-   s    & c         C  sø  t  |  d ƒ |  d k sN t  | d ƒ | d k sN t  | d ƒ | d k r] t d ƒ ‚ n  t  | d ƒ | d k s« t  | d ƒ | d k s« t  | d ƒ | d k rº t d ƒ ‚ n  | | | d k rÒ d St d t  |  | | ƒ ƒ } | } |  | | } | d k  rd S|  | | } | d k  r3d S|  | | }	 |	 d k  rRd St | ƒ |  k sˆt | ƒ | k sˆt | ƒ | k rŒd St |  | | d |  t | ƒ | t | ƒ | t | ƒ ƒ }
 t t  |
 ƒ ƒ t t t  |  | | ƒ t t  |  | | ƒ t t  |  | | ƒ t t  |  | ƒ t t  |  | ƒ t t  | | ƒ t t  | | ƒ t t  | | ƒ t t  | | ƒ ƒ t t  |  | | d ƒ } t | ƒ } | j rÔ| j	 ƒ  d } n  t | |  | | | | d ƒ } t
 | | |  | |  | | ƒ } d } xÃ t t  | ƒ t  | ƒ d ƒ D]¢ } t | t t  | | |  | ƒ t t  | | | ƒ t t  |  | | ƒ t t  | | | | ƒ t t  |  | | | ƒ } | t d | ƒ | } q@W| | | } | S(   sn
  
    Calculate the Wigner 3j symbol `\operatorname{Wigner3j}(j_1,j_2,j_3,m_1,m_2,m_3)`.

    INPUT:

    -  ``j_1``, ``j_2``, ``j_3``, ``m_1``, ``m_2``, ``m_3`` - integer or half integer

    OUTPUT:

    Rational number times the square root of a rational number.

    Examples
    ========

    >>> from sympy.physics.wigner import wigner_3j
    >>> wigner_3j(2, 6, 4, 0, 0, 0)
    sqrt(715)/143
    >>> wigner_3j(2, 6, 4, 0, 0, 1)
    0

    It is an error to have arguments that are not integer or half
    integer values::

        sage: wigner_3j(2.1, 6, 4, 0, 0, 0)
        Traceback (most recent call last):
        ...
        ValueError: j values must be integer or half integer
        sage: wigner_3j(2, 6, 4, 1, 0, -1.1)
        Traceback (most recent call last):
        ...
        ValueError: m values must be integer or half integer

    NOTES:

    The Wigner 3j symbol obeys the following symmetry rules:

    - invariant under any permutation of the columns (with the
      exception of a sign change where `J:=j_1+j_2+j_3`):

      .. math::

         \begin{aligned}
         \operatorname{Wigner3j}(j_1,j_2,j_3,m_1,m_2,m_3)
          &=\operatorname{Wigner3j}(j_3,j_1,j_2,m_3,m_1,m_2) \\
          &=\operatorname{Wigner3j}(j_2,j_3,j_1,m_2,m_3,m_1) \\
          &=(-1)^J \operatorname{Wigner3j}(j_3,j_2,j_1,m_3,m_2,m_1) \\
          &=(-1)^J \operatorname{Wigner3j}(j_1,j_3,j_2,m_1,m_3,m_2) \\
          &=(-1)^J \operatorname{Wigner3j}(j_2,j_1,j_3,m_2,m_1,m_3)
         \end{aligned}

    - invariant under space inflection, i.e.

      .. math::

         \operatorname{Wigner3j}(j_1,j_2,j_3,m_1,m_2,m_3)
         =(-1)^J \operatorname{Wigner3j}(j_1,j_2,j_3,-m_1,-m_2,-m_3)

    - symmetric with respect to the 72 additional symmetries based on
      the work by [Regge58]_

    - zero for `j_1`, `j_2`, `j_3` not fulfilling triangle relation

    - zero for `m_1 + m_2 + m_3 \neq 0`

    - zero for violating any one of the conditions
      `j_1 \ge |m_1|`,  `j_2 \ge |m_2|`,  `j_3 \ge |m_3|`

    ALGORITHM:

    This function uses the algorithm of [Edmonds74]_ to calculate the
    value of the 3j symbol exactly. Note that the formula contains
    alternating sums over large factorials and is therefore unsuitable
    for finite precision arithmetic and only useful for a computer
    algebra system [Rasch03]_.

    REFERENCES:

    .. [Regge58] 'Symmetry Properties of Clebsch-Gordan Coefficients',
      T. Regge, Nuovo Cimento, Volume 10, pp. 544 (1958)

    .. [Edmonds74] 'Angular Momentum in Quantum Mechanics',
      A. R. Edmonds, Princeton University Press (1974)

    AUTHORS:

    - Jens Rasch (2009-03-24): initial version
    i   s(   j values must be integer or half integers(   m values must be integer or half integeri    iÿÿÿÿi   (   R   t
   ValueErrorR   t   abst   maxR   R   R   t
   is_complext   as_real_imagt   minR   (   t   j_1t   j_2t   j_3t   m_1t   m_2t   m_3t   prefidt   a1t   a2t   a3t   maxfactt   argsqrtt   ressqrtt   imint   imaxt   sumresR   t   dent   res(    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt	   wigner_3jI   sP    X446,œ	$"&gc         C  sH   d t  |  | | ƒ t d | d ƒ t |  | | | | | ƒ } | S(   s¤  
    Calculates the Clebsch-Gordan coefficient
    `\left\langle j_1 m_1 \; j_2 m_2 | j_3 m_3 \right\rangle`.

    The reference for this function is [Edmonds74]_.

    INPUT:

    -  ``j_1``, ``j_2``, ``j_3``, ``m_1``, ``m_2``, ``m_3`` - integer or half integer

    OUTPUT:

    Rational number times the square root of a rational number.

    EXAMPLES::

        >>> from sympy import S
        >>> from sympy.physics.wigner import clebsch_gordan
        >>> clebsch_gordan(S(3)/2, S(1)/2, 2, S(3)/2, S(1)/2, 2)
        1
        >>> clebsch_gordan(S(3)/2, S(1)/2, 1, S(3)/2, -S(1)/2, 1)
        sqrt(3)/2
        >>> clebsch_gordan(S(3)/2, S(1)/2, 1, -S(1)/2, S(1)/2, 0)
        -sqrt(2)/2

    NOTES:

    The Clebsch-Gordan coefficient will be evaluated via its relation
    to Wigner 3j symbols:

    .. math::

        \left\langle j_1 m_1 \; j_2 m_2 | j_3 m_3 \right\rangle
        =(-1)^{j_1-j_2+m_3} \sqrt{2j_3+1}
        \operatorname{Wigner3j}(j_1,j_2,j_3,m_1,m_2,-m_3)

    See also the documentation on Wigner 3j symbols which exhibit much
    higher symmetry relations than the Clebsch-Gordan coefficient.

    AUTHORS:

    - Jens Rasch (2009-03-24): initial version
    iÿÿÿÿi   i   (   R   R   R+   (   R   R   R   R   R   R   R*   (    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt   clebsch_gordanÚ   s    ,'c         C  sº  t  |  | | ƒ |  | | k r1 t d ƒ ‚ n  t  |  | | ƒ |  | | k rb t d ƒ ‚ n  t  | | |  ƒ | | |  k r“ t d ƒ ‚ n  |  | | d k  r« d S|  | | d k  rÃ d S| | |  d k  rÛ d St |  | | |  | | | | |  |  | | d ƒ } t | ƒ t t t  |  | | ƒ t t  |  | | ƒ t t  | | |  ƒ ƒ t t t  |  | | d ƒ ƒ } t | ƒ } | r¶| j | ƒ j ƒ  d } n  | S(   sh  
    Calculates the Delta coefficient of the 3 angular momenta for
    Racah symbols. Also checks that the differences are of integer
    value.

    INPUT:

    -  ``aa`` - first angular momentum, integer or half integer

    -  ``bb`` - second angular momentum, integer or half integer

    -  ``cc`` - third angular momentum, integer or half integer

    -  ``prec`` - precision of the ``sqrt()`` calculation

    OUTPUT:

    double - Value of the Delta coefficient

    EXAMPLES::

        sage: from sage.functions.wigner import _big_delta_coeff
        sage: _big_delta_coeff(1,1,1)
        1/2*sqrt(1/6)
    sJ   j values must be integer or half integer and fulfill the triangle relationi    i   (	   R   R   R   R   R   R   R   t   evalfR   (   t   aat   bbt   cct   precR#   R$   R%   (    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt   _big_delta_coeff  s,    """9
+#c         C  sP  t  |  | | | ƒ t  | | | | ƒ t  |  | | | ƒ t  | | | | ƒ } | d k r^ d St |  | | | | | |  | | | | | ƒ } t |  | | | |  | | | | | | | ƒ }	 t |	 d |  | | | |  | | | | | | | ƒ }
 t |
 ƒ d } xt t | ƒ t |	 ƒ d ƒ D]î } t t | |  | | ƒ t t | | | | ƒ t t | |  | | ƒ t t | | | | ƒ t t |  | | | | ƒ t t |  | | | | ƒ t t | | | | | ƒ } | t d | t | d ƒ | } q6W| | d t |  | | | ƒ } | S(   s”  
    Calculate the Racah symbol `W(a,b,c,d;e,f)`.

    INPUT:

    -  ``a``, ..., ``f`` - integer or half integer

    -  ``prec`` - precision, default: ``None``. Providing a precision can
       drastically speed up the calculation.

    OUTPUT:

    Rational number times the square root of a rational number
    (if ``prec=None``), or real number if a precision is given.

    Examples
    ========

    >>> from sympy.physics.wigner import racah
    >>> racah(3,3,3,3,3,3)
    -1/14

    NOTES:

    The Racah symbol is related to the Wigner 6j symbol:

    .. math::

       \operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6)
       =(-1)^{j_1+j_2+j_4+j_5} W(j_1,j_2,j_5,j_4,j_3,j_6)

    Please see the 6j symbol for its much richer symmetries and for
    additional properties.

    ALGORITHM:

    This function uses the algorithm of [Edmonds74]_ to calculate the
    value of the 6j symbol exactly. Note that the formula contains
    alternating sums over large factorials and is therefore unsuitable
    for finite precision arithmetic and only useful for a computer
    algebra system [Rasch03]_.

    AUTHORS:

    - Jens Rasch (2009-03-24): initial version
    i    i   iÿÿÿÿ(   R2   R   R   R   R   R   R   R   (   R.   R/   R0   t   ddt   eet   ffR1   t   prefacR&   R'   R#   R(   t   kkR)   R*   (    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt   racahA  s     1856(
&£!($c      	   C  s<   d t  |  | | | ƒ t |  | | | | | | ƒ } | S(   s  
    Calculate the Wigner 6j symbol `\operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6)`.

    INPUT:

    -  ``j_1``, ..., ``j_6`` - integer or half integer

    -  ``prec`` - precision, default: ``None``. Providing a precision can
       drastically speed up the calculation.

    OUTPUT:

    Rational number times the square root of a rational number
    (if ``prec=None``), or real number if a precision is given.

    Examples
    ========

    >>> from sympy.physics.wigner import wigner_6j
    >>> wigner_6j(3,3,3,3,3,3)
    -1/14
    >>> wigner_6j(5,5,5,5,5,5)
    1/52

    It is an error to have arguments that are not integer or half
    integer values or do not fulfill the triangle relation::

        sage: wigner_6j(2.5,2.5,2.5,2.5,2.5,2.5)
        Traceback (most recent call last):
        ...
        ValueError: j values must be integer or half integer and fulfill the triangle relation
        sage: wigner_6j(0.5,0.5,1.1,0.5,0.5,1.1)
        Traceback (most recent call last):
        ...
        ValueError: j values must be integer or half integer and fulfill the triangle relation

    NOTES:

    The Wigner 6j symbol is related to the Racah symbol but exhibits
    more symmetries as detailed below.

    .. math::

       \operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6)
        =(-1)^{j_1+j_2+j_4+j_5} W(j_1,j_2,j_5,j_4,j_3,j_6)

    The Wigner 6j symbol obeys the following symmetry rules:

    - Wigner 6j symbols are left invariant under any permutation of
      the columns:

      .. math::

         \begin{aligned}
         \operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6)
          &=\operatorname{Wigner6j}(j_3,j_1,j_2,j_6,j_4,j_5) \\
          &=\operatorname{Wigner6j}(j_2,j_3,j_1,j_5,j_6,j_4) \\
          &=\operatorname{Wigner6j}(j_3,j_2,j_1,j_6,j_5,j_4) \\
          &=\operatorname{Wigner6j}(j_1,j_3,j_2,j_4,j_6,j_5) \\
          &=\operatorname{Wigner6j}(j_2,j_1,j_3,j_5,j_4,j_6)
         \end{aligned}

    - They are invariant under the exchange of the upper and lower
      arguments in each of any two columns, i.e.

      .. math::

         \operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6)
          =\operatorname{Wigner6j}(j_1,j_5,j_6,j_4,j_2,j_3)
          =\operatorname{Wigner6j}(j_4,j_2,j_6,j_1,j_5,j_3)
          =\operatorname{Wigner6j}(j_4,j_5,j_3,j_1,j_2,j_6)

    - additional 6 symmetries [Regge59]_ giving rise to 144 symmetries
      in total

    - only non-zero if any triple of `j`'s fulfill a triangle relation

    ALGORITHM:

    This function uses the algorithm of [Edmonds74]_ to calculate the
    value of the 6j symbol exactly. Note that the formula contains
    alternating sums over large factorials and is therefore unsuitable
    for finite precision arithmetic and only useful for a computer
    algebra system [Rasch03]_.

    REFERENCES:

    .. [Regge59] 'Symmetry Properties of Racah Coefficients',
      T. Regge, Nuovo Cimento, Volume 11, pp. 116 (1959)
    iÿÿÿÿ(   R   R8   (   R   R   R   t   j_4t   j_5t   j_6R1   R*   (    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt	   wigner_6jŒ  s    [c
         C  sÑ   t  t |  | | | | | ƒ d ƒ }
 |
 d } d } x’ t | t  |
 ƒ d d ƒ D]t } | | d t |  | | | | | d |	 ƒ t | | | | | | d |	 ƒ t |  | | | | | d |	 ƒ } qU W| S(   s  
    Calculate the Wigner 9j symbol
    `\operatorname{Wigner9j}(j_1,j_2,j_3,j_4,j_5,j_6,j_7,j_8,j_9)`.

    INPUT:

    -  ``j_1``, ..., ``j_9`` - integer or half integer

    -  ``prec`` - precision, default: ``None``. Providing a precision can
       drastically speed up the calculation.

    OUTPUT:

    Rational number times the square root of a rational number
    (if ``prec=None``), or real number if a precision is given.

    Examples
    ========

    >>> from sympy.physics.wigner import wigner_9j
    >>> wigner_9j(1,1,1, 1,1,1, 1,1,0 ,prec=64) # ==1/18
    0.05555555...

    >>> wigner_9j(1/2,1/2,0, 1/2,3/2,1, 0,1,1 ,prec=64) # ==1/6
    0.1666666...

    It is an error to have arguments that are not integer or half
    integer values or do not fulfill the triangle relation::

        sage: wigner_9j(0.5,0.5,0.5, 0.5,0.5,0.5, 0.5,0.5,0.5,prec=64)
        Traceback (most recent call last):
        ...
        ValueError: j values must be integer or half integer and fulfill the triangle relation
        sage: wigner_9j(1,1,1, 0.5,1,1.5, 0.5,1,2.5,prec=64)
        Traceback (most recent call last):
        ...
        ValueError: j values must be integer or half integer and fulfill the triangle relation

    ALGORITHM:

    This function uses the algorithm of [Edmonds74]_ to calculate the
    value of the 3j symbol exactly. Note that the formula contains
    alternating sums over large factorials and is therefore unsuitable
    for finite precision arithmetic and only useful for a computer
    algebra system [Rasch03]_.
    i   i    i   (   R   R   R   R8   (   R   R   R   R9   R:   R;   t   j_7t   j_8t   j_9R1   R'   R&   R(   R7   (    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt	   wigner_9jì  s    /(
#G(c         C  sº  t  |  ƒ |  k s6 t  | ƒ | k s6 t  | ƒ | k rE t d ƒ ‚ n  t  | ƒ | k s{ t  | ƒ | k s{ t  | ƒ | k rŠ t d ƒ ‚ n  |  | | } | d } |  | | }	 |	 d k  rÀ d S|  | | }
 |
 d k  rÞ d S|  | | } | d k  rý d S| d rd S| | | d k r#d St | ƒ |  k sYt | ƒ | k sYt | ƒ | k r]d St | |  | | | | d ƒ } t | | |  | |  | | ƒ } t |  | | d | d ƒ } t | ƒ d |  d d | d d | d t |  | t |  | t | | t | | t | | t | | d t } t | ƒ } t	 t | t | |  | t |  | | t |  | | ƒ t d | d t | |  t | | t | | } d } x¥ t
 t  | ƒ t  | ƒ d ƒ D]„ } t | t | | |  | t | | | t |  | | t | | | | t |  | | | } | t	 d | ƒ | } qèW| | | t	 d | | | | ƒ } | d k	 r¶| j | ƒ } n  | S(	   sœ  
    Calculate the Gaunt coefficient.

    The Gaunt coefficient is defined as the integral over three
    spherical harmonics:

    .. math::

        \begin{aligned}
        \operatorname{Gaunt}(l_1,l_2,l_3,m_1,m_2,m_3)
        &=\int Y_{l_1,m_1}(\Omega)
         Y_{l_2,m_2}(\Omega) Y_{l_3,m_3}(\Omega) \,d\Omega \\
        &=\sqrt{\frac{(2l_1+1)(2l_2+1)(2l_3+1)}{4\pi}}
         \operatorname{Wigner3j}(l_1,l_2,l_3,0,0,0)
         \operatorname{Wigner3j}(l_1,l_2,l_3,m_1,m_2,m_3)
        \end{aligned}

    INPUT:

    -  ``l_1``, ``l_2``, ``l_3``, ``m_1``, ``m_2``, ``m_3`` - integer

    -  ``prec`` - precision, default: ``None``. Providing a precision can
       drastically speed up the calculation.

    OUTPUT:

    Rational number times the square root of a rational number
    (if ``prec=None``), or real number if a precision is given.

    Examples
    ========

    >>> from sympy.physics.wigner import gaunt
    >>> gaunt(1,0,1,1,0,-1)
    -1/(2*sqrt(pi))
    >>> gaunt(1000,1000,1200,9,3,-12).n(64)
    0.00689500421922113448...

    It is an error to use non-integer values for `l` and `m`::

        sage: gaunt(1.2,0,1.2,0,0,0)
        Traceback (most recent call last):
        ...
        ValueError: l values must be integer
        sage: gaunt(1,0,1,1.1,0,-1.1)
        Traceback (most recent call last):
        ...
        ValueError: m values must be integer

    NOTES:

    The Gaunt coefficient obeys the following symmetry rules:

    - invariant under any permutation of the columns

      .. math::
        \begin{aligned}
          Y(l_1,l_2,l_3,m_1,m_2,m_3)
          &=Y(l_3,l_1,l_2,m_3,m_1,m_2) \\
          &=Y(l_2,l_3,l_1,m_2,m_3,m_1) \\
          &=Y(l_3,l_2,l_1,m_3,m_2,m_1) \\
          &=Y(l_1,l_3,l_2,m_1,m_3,m_2) \\
          &=Y(l_2,l_1,l_3,m_2,m_1,m_3)
        \end{aligned}

    - invariant under space inflection, i.e.

      .. math::
          Y(l_1,l_2,l_3,m_1,m_2,m_3)
          =Y(l_1,l_2,l_3,-m_1,-m_2,-m_3)

    - symmetric with respect to the 72 Regge symmetries as inherited
      for the `3j` symbols [Regge58]_

    - zero for `l_1`, `l_2`, `l_3` not fulfilling triangle relation

    - zero for violating any one of the conditions: `l_1 \ge |m_1|`,
      `l_2 \ge |m_2|`, `l_3 \ge |m_3|`

    - non-zero only for an even sum of the `l_i`, i.e.
      `L = l_1 + l_2 + l_3 = 2n` for `n` in `\mathbb{N}`

    ALGORITHM:

    This function uses the algorithm of [Liberatodebrito82]_ to
    calculate the value of the Gaunt coefficient exactly. Note that
    the formula contains alternating sums over large factorials and is
    therefore unsuitable for finite precision arithmetic and only
    useful for a computer algebra system [Rasch03]_.

    REFERENCES:

    .. [Liberatodebrito82] 'FORTRAN program for the integral of three
      spherical harmonics', A. Liberato de Brito,
      Comput. Phys. Commun., Volume 25, pp. 81-85 (1982)

    AUTHORS:

    - Jens Rasch (2009-03-24): initial version for Sage
    s   l values must be integers   m values must be integeri   i    i   i   iÿÿÿÿN(   R   R   R   R   R   R   R   R   R   R   R   t   Nonet   n(   t   l_1t   l_2t   l_3R   R   R   R1   t   sumLt   bigLR    R!   R"   R&   R'   R#   R$   R%   R6   R(   R   R)   R*   (    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt   gaunt&  sL    e66

6$"
kM'&f(t   Wigner3jc           B  s   e  Z d  „  Z RS(   c         K  s.   t  d „  |  j Dƒ ƒ r& t |  j Œ  S|  Sd  S(   Nc         s  s   |  ] } | j  Vq d  S(   N(   t	   is_number(   t   .0t   obj(    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pys	   <genexpr>Å  s    (   t   allt   argsR+   (   t   selft   hints(    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt   doitÄ  s    (   t   __name__t
   __module__RQ   (    (    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyRI   Â  s   c      	   C  så   t  |  ƒ }  t  | ƒ } t  | ƒ } t  | ƒ } t  | ƒ } t  | ƒ } t d ƒ } d „  } t d ƒ | | t t | | | | | ƒ | | | |  | | ƒ d | d |  d | d | |  | | t | |  ƒ | |  f ƒ S(   s  
    Returns dot product of rotational gradients of spherical harmonics.

    This function returns the right hand side of the following expression:

    .. math ::
        \vec{R}Y{_j^{p}} \cdot \vec{R}Y{_l^{m}} = (-1)^{m+p}
        \sum\limits_{k=|l-j|}^{l+j}Y{_k^{m+p}}  * \alpha_{l,m,j,p,k} *
        \frac{1}{2} (k^2-j^2-l^2+k-j-l)


    Arguments
    =========

    j, p, l, m .... indices in spherical harmonics (expressions or integers)
    theta, phi .... angle arguments in spherical harmonics

    Example
    =======

    >>> from sympy import symbols
    >>> from sympy.physics.wigner import dot_rot_grad_Ynm
    >>> theta, phi = symbols("theta phi")
    >>> dot_rot_grad_Ynm(3, 2, 2, 0, theta, phi).doit()
    3*sqrt(55)*Ynm(5, 2, theta, phi)/(11*sqrt(pi))

    t   kc      	   S  s{   t  d |  d d | d d | d d t ƒ t | |  | t d ƒ t d ƒ t d ƒ ƒ t | |  | | | | | ƒ S(   Ni   i   i   i    (   R   R   RI   R   (   t   lt   mt   jt   pRT   (    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt   alphaî  s    i   i   (   R   R   R   R   R	   R   (   RW   RX   RU   RV   t   thetat   phiRT   RY   (    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt   dot_rot_grad_YnmÊ  s    	N(   t   __doc__t
   __future__R    R   t   sympyR   R   R   R   R   R   R   R	   R
   t   sympy.core.compatibilityR   R   R   R+   R,   RA   R2   R8   R<   R@   RH   RI   R\   (    (    (    s3   lib/python2.7/site-packages/sympy/physics/wigner.pyt   <module>!   s   @			‘	16K`:œ