20template <
typename Real>
21inline constexpr Real PI = 3.141592653589793238462643383279502884;
23template <
typename Real>
24inline Real wigner_uppercase_d_matrix_pi_half(Real f, Real m_initial, Real m_final) {
25 static_assert(std::is_floating_point_v<Real>);
26 assert(2 * f == std::floor(2 * f) && f >= 0);
27 assert(2 * m_initial == std::floor(2 * m_initial) && m_initial >= -f && m_initial <= f);
28 assert(2 * m_final == std::floor(2 * m_final) && m_final >= -f && m_final <= f);
31 for (
int k = std::max(0,
static_cast<int>(m_final - m_initial));
32 k <= f + std::min(m_final, -m_initial); ++k) {
36 result *= std::pow(-1, m_initial - m_final) / std::pow(2, f) *
44template <
typename Scalar>
52 assert(2 * f == std::floor(2 * f) && f >= 0);
53 assert(2 * m_initial == std::floor(2 * m_initial) && m_initial >= -f && m_initial <= f);
54 assert(2 * m_final == std::floor(2 * m_final) && m_final >= -f && m_final <= f);
57 10 * std::numeric_limits<typename traits::NumTraits<Scalar>::real_t>::epsilon();
60 return Scalar(std::cos(-m_initial * alpha), std::sin(-m_initial * alpha)) *
61 wigner_uppercase_d_matrix<typename traits::NumTraits<Scalar>::real_t>(
62 f, m_initial, m_final, 0, beta, 0) *
63 Scalar(std::cos(-m_final * gamma), std::sin(-m_final * gamma));
65 if (std::abs(std::remainder(m_initial * alpha,
67 throw std::invalid_argument(
68 "The scalar type must be complex if m_initial*alpha is not a multiple of pi");
70 if (std::abs(std::remainder(m_final * gamma,
72 throw std::invalid_argument(
73 "The scalar type must be complex if m_final*gamma is not a multiple of pi");
75 std::complex<Scalar> result = 0;
79 result += wigner_uppercase_d_matrix_pi_half(f, m_initial, m) *
80 std::complex<typename traits::NumTraits<Scalar>::real_t>(std::cos(-m * beta),
81 std::sin(-m * beta)) *
82 wigner_uppercase_d_matrix_pi_half(f, m, -m_final);
85 2 * f - m_initial - m_final) *
Real binomial_coefficient(Real n, Real k)
Scalar wigner_uppercase_d_matrix(typename traits::NumTraits< Scalar >::real_t f, typename traits::NumTraits< Scalar >::real_t m_initial, typename traits::NumTraits< Scalar >::real_t m_final, typename traits::NumTraits< Scalar >::real_t alpha, typename traits::NumTraits< Scalar >::real_t beta, typename traits::NumTraits< Scalar >::real_t gamma)
Helper struct to extract types from a numerical type.