Exemplo n.º 1
0
    def test_nonperiodic_external_potential_integration(self):
        # Compute potential energy operator in momentum and position space.
        # Non-periodic test.
        
        '''
        Key: Spatial dimension.
        Value: List of geometries.
        '''
        geometry_sets = {
                    2: [[('H', (0., 0.)), ('H', (0.8, 0.))], 
                        [('H', (0.1, 0.))]], 
                    3: [[('H', (0., 0., 0.)), ('H', (0.8, 0., 0.))], 
                        [('H', (0.1, 0., 0.))]]
                  }
        
        # [[spatial dimension, fieldline dimension]]
        dims = [[2, 2], [2, 3], [3, 3]]
        scale = 8 * 1.
        spinless = True
        
        for dim in dims:
            
            # If dim[0] == 2, get range(2, 4).
            # If dim[0] == 3, get range(2, 3).
            for length in range(2, 6 - dim[0]):
                for geometry in geometry_sets[dim[0]]:
                    grid = Grid(dimensions=dim[0], scale=scale, length=length)
                    period_cutoff = grid.volume_scale() ** (1. / grid.dimensions)

                    momentum_external_potential = plane_wave_external_potential(grid, geometry, spinless, e_cutoff=None, 
                                                                                non_periodic=True, period_cutoff=period_cutoff,
                                                                                fieldlines=dim[1])
                    position_external_potential = dual_basis_external_potential(grid, geometry, spinless, 
                                                                                non_periodic=True, period_cutoff=period_cutoff,
                                                                                fieldlines=dim[1])

                    # Confirm they are Hermitian
                    momentum_external_potential_operator = (
                        get_sparse_operator(momentum_external_potential))
                    self.assertTrue(is_hermitian(momentum_external_potential_operator))

                    position_external_potential_operator = (
                        get_sparse_operator(position_external_potential))
                    self.assertTrue(is_hermitian(position_external_potential_operator))

                    # Diagonalize.
                    jw_momentum = jordan_wigner(momentum_external_potential)
                    jw_position = jordan_wigner(position_external_potential)
                    momentum_spectrum = eigenspectrum(jw_momentum)
                    position_spectrum = eigenspectrum(jw_position)

                    # Confirm spectra are the same.
                    difference = numpy.amax(
                        numpy.absolute(momentum_spectrum - position_spectrum))
                    self.assertAlmostEqual(difference, 0.)
Exemplo n.º 2
0
    def test_nonperiodic_potential_integration(self):
        # Compute potential energy operator in momentum and position space.
        # Non-periodic test.
        spinless = True

        # [[spatial dimension, fieldline dimension]]
        dims = [[2, 2], [2, 3], [3, 3]]

        for dim in dims:

            # If dim[0] == 2, get range(2, 4).
            # If dim[0] == 3, get range(2, 3).
            for length in range(2, 6 - dim[0]):
                grid = Grid(dimensions=dim[0], length=length, scale=1.)
                period_cutoff = grid.volume_scale()**(1. /
                                                      grid.dimensions) / 2.

                momentum_potential = plane_wave_potential(
                    grid,
                    spinless=spinless,
                    e_cutoff=None,
                    non_periodic=True,
                    period_cutoff=period_cutoff,
                    fieldlines=dim[1])
                position_potential = dual_basis_potential(
                    grid,
                    spinless=spinless,
                    non_periodic=True,
                    period_cutoff=period_cutoff,
                    fieldlines=dim[1])

                # Confirm they are Hermitian
                momentum_potential_operator = (
                    get_sparse_operator(momentum_potential))
                self.assertTrue(is_hermitian(momentum_potential_operator))

                position_potential_operator = (
                    get_sparse_operator(position_potential))
                self.assertTrue(is_hermitian(position_potential_operator))

                # Diagonalize and confirm the same energy.
                jw_momentum = jordan_wigner(momentum_potential)
                jw_position = jordan_wigner(position_potential)
                momentum_spectrum = eigenspectrum(jw_momentum)
                position_spectrum = eigenspectrum(jw_position)

                # Confirm spectra are the same.
                difference = numpy.amax(
                    numpy.absolute(momentum_spectrum - position_spectrum))
                self.assertAlmostEqual(difference, 0.)
Exemplo n.º 3
0
 def test_properties(self):
     g = Grid(dimensions=2, length=3, scale=5.0)
     self.assertEqual(g.num_points, 9)
     self.assertEqual(g.volume_scale(), 25)
     self.assertEqual(list(g.all_points_indices()), [
         (0, 0),
         (0, 1),
         (0, 2),
         (1, 0),
         (1, 1),
         (1, 2),
         (2, 0),
         (2, 1),
         (2, 2),
     ])
Exemplo n.º 4
0
    def test_coefficients(self):
        # Test that the coefficients post-JW transform are as claimed in paper.
        grid = Grid(dimensions=2, length=3, scale=2.)
        spinless = 1
        n_orbitals = grid.num_points
        n_qubits = (2**(1 - spinless)) * n_orbitals
        volume = grid.volume_scale()

        # Kinetic operator.
        kinetic = dual_basis_kinetic(grid, spinless)
        qubit_kinetic = jordan_wigner(kinetic)

        # Potential operator.
        potential = dual_basis_potential(grid, spinless)
        qubit_potential = jordan_wigner(potential)

        # Check identity.
        identity = tuple()
        kinetic_coefficient = qubit_kinetic.terms[identity]
        potential_coefficient = qubit_potential.terms[identity]

        paper_kinetic_coefficient = 0.
        paper_potential_coefficient = 0.
        for indices in grid.all_points_indices():
            momenta = grid.momentum_vector(indices)
            paper_kinetic_coefficient += float(n_qubits) * momenta.dot(
                momenta) / float(4. * n_orbitals)

            if momenta.any():
                potential_contribution = -numpy.pi * float(n_qubits) / float(
                    2. * momenta.dot(momenta) * volume)
                paper_potential_coefficient += potential_contribution

        self.assertAlmostEqual(kinetic_coefficient, paper_kinetic_coefficient)
        self.assertAlmostEqual(potential_coefficient,
                               paper_potential_coefficient)

        # Check Zp.
        for p in range(n_qubits):
            zp = ((p, 'Z'), )
            kinetic_coefficient = qubit_kinetic.terms[zp]
            potential_coefficient = qubit_potential.terms[zp]

            paper_kinetic_coefficient = 0.
            paper_potential_coefficient = 0.
            for indices in grid.all_points_indices():
                momenta = grid.momentum_vector(indices)
                paper_kinetic_coefficient -= momenta.dot(momenta) / float(
                    4. * n_orbitals)

                if momenta.any():
                    potential_contribution = numpy.pi / float(
                        momenta.dot(momenta) * volume)
                    paper_potential_coefficient += potential_contribution

            self.assertAlmostEqual(kinetic_coefficient,
                                   paper_kinetic_coefficient)
            self.assertAlmostEqual(potential_coefficient,
                                   paper_potential_coefficient)

        # Check Zp Zq.
        if spinless:
            spins = [None]

        for indices_a in grid.all_points_indices():
            for indices_b in grid.all_points_indices():

                potential_coefficient = 0.
                paper_kinetic_coefficient = 0.
                paper_potential_coefficient = 0.

                position_a = grid.position_vector(indices_a)
                position_b = grid.position_vector(indices_b)
                differences = position_b - position_a

                for spin_a in spins:
                    for spin_b in spins:

                        p = grid.orbital_id(indices_a, spin_a)
                        q = grid.orbital_id(indices_b, spin_b)

                        if p == q:
                            continue

                        zpzq = ((min(p, q), 'Z'), (max(p, q), 'Z'))
                        if zpzq in qubit_potential.terms:
                            potential_coefficient = qubit_potential.terms[zpzq]

                        for indices_c in grid.all_points_indices():
                            momenta = grid.momentum_vector(indices_c)

                            if momenta.any():
                                potential_contribution = numpy.pi * numpy.cos(
                                    differences.dot(momenta)) / float(
                                        momenta.dot(momenta) * volume)
                                paper_potential_coefficient += (
                                    potential_contribution)

                        self.assertAlmostEqual(potential_coefficient,
                                               paper_potential_coefficient)
Exemplo n.º 5
0
    def test_plane_wave_period_cutoff(self):
        # TODO: After figuring out the correct formula for period cutoff for
        #     dual basis, change period_cutoff to default, and change
        #     h_1 to also accept period_cutoff for real integration test.
        
        '''
        Key: Spatial dimension.
        Value: List of geometries.
        '''
        geometry_sets = {
                    2: [[('H', (0., 0.)), ('H', (0.8, 0.))], 
                        [('H', (0.1, 0.))]], 
                    3: [[('H', (0., 0., 0.)), ('H', (0.8, 0., 0.))], 
                        [('H', (0.1, 0., 0.))]]
                  }
        
        # [[spatial dimension, fieldline dimension]]
        dims = [[2, 2], [2, 3], [3, 3]]
        spinless_set = [True, False]
        scale = 8 * 1.
        
        for dim in dims:
            for geometry in geometry_sets[dim[0]]:
                for spinless in spinless_set:
                    grid = Grid(dimensions=dim[0], scale=scale, length=2)
                    period_cutoff = grid.volume_scale() ** (1. / grid.dimensions)

                    h_1 = plane_wave_hamiltonian(grid, geometry, spinless=True, plane_wave=True, include_constant=False,
                                                 e_cutoff=None, fieldlines=dim[1])
                    jw_1 = jordan_wigner(h_1)
                    spectrum_1 = eigenspectrum(jw_1)

                    h_2 = plane_wave_hamiltonian(grid, geometry, spinless=True, plane_wave=True, include_constant=False, 
                                                 e_cutoff=None, non_periodic=True, period_cutoff=period_cutoff,
                                                 fieldlines=dim[1])
                    jw_2 = jordan_wigner(h_2)
                    spectrum_2 = eigenspectrum(jw_2)

                    max_diff = numpy.amax(numpy.absolute(spectrum_1 - spectrum_2))

                    # Checks if non-periodic and periodic cases are different.
                    self.assertGreater(max_diff, 0.)


                    # TODO: This is only for code coverage. Remove after having real
                    #     integration test.
                    momentum_hamiltonian = plane_wave_hamiltonian(grid, geometry, spinless=True, plane_wave=True,
                                                                  include_constant=False, e_cutoff=None, 
                                                                  non_periodic=True, period_cutoff=period_cutoff,
                                                                  fieldlines=dim[1])

                    position_hamiltonian = plane_wave_hamiltonian(grid, geometry, spinless=True, plane_wave=False, 
                                                                  include_constant=False, e_cutoff=None, 
                                                                  non_periodic=True, period_cutoff=period_cutoff,
                                                                  fieldlines=dim[1])

                    # Confirm they are Hermitian
                    momentum_hamiltonian_operator = (
                        get_sparse_operator(momentum_hamiltonian))
                    self.assertTrue(is_hermitian(momentum_hamiltonian_operator))

                    position_hamiltonian_operator = (
                        get_sparse_operator(position_hamiltonian))
                    self.assertTrue(is_hermitian(position_hamiltonian_operator))

                    # Diagonalize.
                    jw_momentum = jordan_wigner(momentum_hamiltonian)
                    jw_position = jordan_wigner(position_hamiltonian)
                    momentum_spectrum = eigenspectrum(jw_momentum)
                    position_spectrum = eigenspectrum(jw_position)

                    # Confirm spectra are the same.
                    difference = numpy.amax(
                        numpy.absolute(momentum_spectrum - position_spectrum))
                    self.assertAlmostEqual(difference, 0.)
Exemplo n.º 6
0
    def test_plane_wave_period_cutoff(self):
        # TODO: After figuring out the correct formula for period cutoff for
        #     dual basis, change period_cutoff to default, and change
        #     hamiltonian_1 to a real jellium_model for real integration test.
        spinless = True

        # [[spatial dimension, fieldline dimension]]
        dims = [[2, 2], [2, 3], [3, 3]]

        for dim in dims:

            # If dim[0] == 2, get range(2, 4).
            # If dim[0] == 3, get range(2, 3).
            for length in range(2, 6 - dim[0]):
                grid = Grid(dimensions=dim[0], length=length, scale=1.0)
                period_cutoff = grid.volume_scale()**(1. / grid.dimensions)

                hamiltonian_1 = jellium_model(grid,
                                              spinless=spinless,
                                              plane_wave=True,
                                              include_constant=False,
                                              fieldlines=dim[1])
                jw_1 = jordan_wigner(hamiltonian_1)
                spectrum_1 = eigenspectrum(jw_1)

                hamiltonian_2 = jellium_model(grid,
                                              spinless=spinless,
                                              plane_wave=True,
                                              include_constant=False,
                                              e_cutoff=None,
                                              non_periodic=True,
                                              period_cutoff=period_cutoff,
                                              fieldlines=dim[1])
                jw_2 = jordan_wigner(hamiltonian_2)
                spectrum_2 = eigenspectrum(jw_2)

                max_diff = numpy.amax(numpy.absolute(spectrum_1 - spectrum_2))

                # Checks if non-periodic and periodic cases are different.
                self.assertGreater(max_diff, 0.)

                # TODO: This is only for code coverage. Remove after having real
                #     integration test.
                momentum_hamiltonian = jellium_model(
                    grid,
                    spinless=spinless,
                    plane_wave=True,
                    include_constant=False,
                    e_cutoff=None,
                    non_periodic=True,
                    period_cutoff=period_cutoff,
                    fieldlines=dim[1])
                position_hamiltonian = jellium_model(
                    grid,
                    spinless=spinless,
                    plane_wave=False,
                    include_constant=False,
                    e_cutoff=None,
                    non_periodic=True,
                    period_cutoff=period_cutoff,
                    fieldlines=dim[1])

                # Confirm they are Hermitian
                momentum_hamiltonian_operator = (
                    get_sparse_operator(momentum_hamiltonian))
                self.assertTrue(is_hermitian(momentum_hamiltonian_operator))

                position_hamiltonian_operator = (
                    get_sparse_operator(position_hamiltonian))
                self.assertTrue(is_hermitian(position_hamiltonian_operator))

                # Diagonalize.
                jw_momentum = jordan_wigner(momentum_hamiltonian)
                jw_position = jordan_wigner(position_hamiltonian)
                momentum_spectrum = eigenspectrum(jw_momentum)
                position_spectrum = eigenspectrum(jw_position)

                # Confirm spectra are the same.
                difference = numpy.amax(
                    numpy.absolute(momentum_spectrum - position_spectrum))
                self.assertAlmostEqual(difference, 0.)
Exemplo n.º 7
0
    def test_coefficients(self):
        # Test that the coefficients post-JW transform are as claimed in paper.
        spinless = True
        non_periodics = [False, True]

        # [[spatial dimension, fieldline dimension]].
        dims = [[2, 2], [2, 3], [3, 3]]

        # Reference length scale where the 2D Coulomb potential is zero.
        R0 = 1e8

        for dim in dims:

            # If dim[0] == 2, get range(2, 4).
            # If dim[0] == 3, get range(2, 3).
            for length in range(2, 6 - dim[0]):
                for non_periodic in non_periodics:
                    grid = Grid(dimensions=dim[0], length=length, scale=2.)
                    n_orbitals = grid.num_points
                    n_qubits = (2**(1 - spinless)) * n_orbitals
                    volume = grid.volume_scale()
                    period_cutoff = None

                    if non_periodic:
                        period_cutoff = volume**(1. / grid.dimensions)

                    fieldlines = dim[1]

                    # Kinetic operator.
                    kinetic = dual_basis_kinetic(grid, spinless)
                    qubit_kinetic = jordan_wigner(kinetic)

                    # Potential operator.
                    potential = dual_basis_potential(
                        grid,
                        spinless,
                        non_periodic=non_periodic,
                        period_cutoff=period_cutoff,
                        fieldlines=fieldlines)
                    qubit_potential = jordan_wigner(potential)

                    # Check identity.
                    identity = tuple()
                    kinetic_coefficient = qubit_kinetic.terms[identity]
                    potential_coefficient = qubit_potential.terms[identity]

                    paper_kinetic_coefficient = 0.
                    paper_potential_coefficient = 0.
                    for indices in grid.all_points_indices():
                        momenta = grid.momentum_vector(indices)
                        momenta_squared = momenta.dot(momenta)
                        paper_kinetic_coefficient += (float(n_qubits) *
                                                      momenta_squared /
                                                      float(4. * n_orbitals))

                        if momenta.any():
                            potential_contribution = 0.

                            # 3D case.
                            if grid.dimensions == 3:
                                potential_contribution = -(
                                    numpy.pi * float(n_qubits) /
                                    float(2. * momenta_squared * volume))

                                # If non-periodic.
                                if non_periodic:
                                    correction = 1.0 - numpy.cos(
                                        period_cutoff *
                                        numpy.sqrt(momenta_squared))
                                    potential_contribution *= correction

                            # 2D case.
                            elif grid.dimensions == 2:
                                V_nu = 0.

                                # 2D Coulomb potential.
                                if fieldlines == 2:

                                    # If non-periodic.
                                    if non_periodic:
                                        Dkv = period_cutoff * numpy.sqrt(
                                            momenta_squared)
                                        V_nu = (
                                            2. * numpy.pi / momenta_squared *
                                            (Dkv *
                                             numpy.log(R0 / period_cutoff) *
                                             scipy.special.jv(1, Dkv) -
                                             scipy.special.jv(0, Dkv)))

                                    # If periodic.
                                    else:
                                        var1 = 4. / momenta_squared
                                        var2 = 0.25 * momenta_squared

                                        V_nu = 0.5 * numpy.complex128(
                                            mpmath.meijerg([[1., 1.5, 2.], []],
                                                           [[1.5], []], var1) -
                                            mpmath.meijerg(
                                                [[-0.5, 0., 0.], []],
                                                [[-0.5, 0.], [-1.]], var2))

                                # 3D Coulomb potential.
                                elif fieldlines == 3:

                                    # If non-periodic.
                                    if non_periodic:
                                        var = (-0.25 * period_cutoff**2 *
                                               momenta_squared)
                                        V_nu = numpy.complex128(
                                            2 * numpy.pi * period_cutoff *
                                            mpmath.hyp1f2(0.5, 1., 1.5, var))

                                    # If periodic.
                                    else:
                                        V_nu = (2 * numpy.pi /
                                                numpy.sqrt(momenta_squared))

                                potential_contribution = (-float(n_qubits) /
                                                          (8. * volume) * V_nu)

                            paper_potential_coefficient += potential_contribution

                    # Check if coefficients are equal.
                    self.assertAlmostEqual(kinetic_coefficient,
                                           paper_kinetic_coefficient)
                    self.assertAlmostEqual(potential_coefficient,
                                           paper_potential_coefficient)

                    # Check Zp.
                    for p in range(n_qubits):
                        zp = ((p, 'Z'), )
                        kinetic_coefficient = qubit_kinetic.terms[zp]
                        potential_coefficient = qubit_potential.terms[zp]

                        paper_kinetic_coefficient = 0.
                        paper_potential_coefficient = 0.
                        for indices in grid.all_points_indices():
                            momenta = grid.momentum_vector(indices)
                            momenta_squared = momenta.dot(momenta)
                            paper_kinetic_coefficient -= (
                                momenta_squared / float(4. * n_orbitals))

                            if momenta.any():
                                potential_contribution = 0.

                                # 3D case.
                                if grid.dimensions == 3:
                                    potential_contribution = (
                                        numpy.pi /
                                        float(momenta_squared * volume))

                                    # If non-periodic.
                                    if non_periodic:
                                        correction = 1.0 - numpy.cos(
                                            period_cutoff *
                                            numpy.sqrt(momenta_squared))
                                        potential_contribution *= correction

                                # 2D case.
                                elif grid.dimensions == 2:
                                    V_nu = 0.

                                    # 2D Coulomb potential.
                                    if fieldlines == 2:

                                        # If non-periodic.
                                        if non_periodic:
                                            Dkv = period_cutoff * numpy.sqrt(
                                                momenta_squared)
                                            V_nu = (2. * numpy.pi /
                                                    momenta_squared *
                                                    (Dkv * numpy.log(
                                                        R0 / period_cutoff) *
                                                     scipy.special.jv(1, Dkv) -
                                                     scipy.special.jv(0, Dkv)))

                                        # If periodic.
                                        else:
                                            var1 = 4. / momenta_squared
                                            var2 = 0.25 * momenta_squared

                                            V_nu = 0.5 * numpy.complex128(
                                                mpmath.meijerg(
                                                    [[1., 1.5, 2.], []],
                                                    [[1.5], []], var1) -
                                                mpmath.meijerg(
                                                    [[-0.5, 0., 0.], []],
                                                    [[-0.5, 0.], [-1.]], var2))

                                    # 3D Coulomb potential.
                                    elif fieldlines == 3:

                                        # If non-periodic.
                                        if non_periodic:
                                            var = (-0.25 * period_cutoff**2 *
                                                   momenta_squared)
                                            V_nu = numpy.complex128(
                                                2 * numpy.pi * period_cutoff *
                                                mpmath.hyp1f2(
                                                    0.5, 1., 1.5, var))

                                        # If periodic.
                                        else:
                                            V_nu = (
                                                2 * numpy.pi /
                                                numpy.sqrt(momenta_squared))

                                    potential_contribution = (1. /
                                                              (4. * volume) *
                                                              V_nu)

                                paper_potential_coefficient += potential_contribution

                        # Check if coefficients are equal.
                        self.assertAlmostEqual(kinetic_coefficient,
                                               paper_kinetic_coefficient)
                        self.assertAlmostEqual(potential_coefficient,
                                               paper_potential_coefficient)

                    # Check Zp Zq.
                    if spinless:
                        spins = [None]

                    for indices_a in grid.all_points_indices():
                        for indices_b in grid.all_points_indices():

                            potential_coefficient = 0.
                            paper_kinetic_coefficient = 0.
                            paper_potential_coefficient = 0.

                            position_a = grid.position_vector(indices_a)
                            position_b = grid.position_vector(indices_b)
                            differences = position_b - position_a

                            for spin_a in spins:
                                for spin_b in spins:

                                    p = grid.orbital_id(indices_a, spin_a)
                                    q = grid.orbital_id(indices_b, spin_b)

                                    if p == q:
                                        continue

                                    zpzq = ((min(p, q), 'Z'), (max(p, q), 'Z'))
                                    if zpzq in qubit_potential.terms:
                                        potential_coefficient = qubit_potential.terms[
                                            zpzq]

                                    for indices_c in grid.all_points_indices():
                                        momenta = grid.momentum_vector(
                                            indices_c)
                                        momenta_squared = momenta.dot(momenta)

                                        if momenta.any():
                                            potential_contribution = 0.

                                            # 3D case.
                                            if grid.dimensions == 3:
                                                potential_contribution = (
                                                    numpy.pi * numpy.cos(
                                                        differences.dot(
                                                            momenta)) /
                                                    float(momenta_squared *
                                                          volume))

                                                # If non-periodic.
                                                if non_periodic:
                                                    correction = 1.0 - numpy.cos(
                                                        period_cutoff * numpy.
                                                        sqrt(momenta_squared))
                                                    potential_contribution *= correction

                                            # 2D case.
                                            elif grid.dimensions == 2:
                                                V_nu = 0.

                                                # 2D Coulomb potential.
                                                if fieldlines == 2:

                                                    # If non-periodic.
                                                    if non_periodic:
                                                        Dkv = (
                                                            period_cutoff *
                                                            numpy.sqrt(
                                                                momenta_squared
                                                            ))
                                                        V_nu = (
                                                            2. * numpy.pi /
                                                            momenta_squared *
                                                            (Dkv * numpy.log(
                                                                R0 /
                                                                period_cutoff)
                                                             * scipy.special.
                                                             jv(1, Dkv) -
                                                             scipy.special.jv(
                                                                 0, Dkv)))

                                                    # If periodic.
                                                    else:
                                                        var1 = 4. / momenta_squared
                                                        var2 = 0.25 * momenta_squared

                                                        V_nu = 0.5 * numpy.complex128(
                                                            mpmath.meijerg([[
                                                                1., 1.5, 2.
                                                            ], []], [[1.5], []
                                                                     ], var1) -
                                                            mpmath.meijerg([[
                                                                -0.5, 0., 0.
                                                            ], []], [[
                                                                -0.5, 0.
                                                            ], [-1.]], var2))

                                                # 3D Coulomb potential.
                                                elif fieldlines == 3:

                                                    # If non-periodic.
                                                    if non_periodic:
                                                        var = -0.25 * period_cutoff**2 * momenta_squared
                                                        V_nu = numpy.complex128(
                                                            2 * numpy.pi *
                                                            period_cutoff *
                                                            mpmath.hyp1f2(
                                                                0.5, 1., 1.5,
                                                                var))

                                                    # If periodic.
                                                    else:
                                                        V_nu = 2 * numpy.pi / numpy.sqrt(
                                                            momenta_squared)

                                                potential_contribution = (
                                                    numpy.cos(
                                                        differences.dot(
                                                            momenta)) /
                                                    (4. * volume) * V_nu)

                                            paper_potential_coefficient += potential_contribution

                                    # Check if coefficients are equal.
                                    self.assertAlmostEqual(
                                        potential_coefficient,
                                        paper_potential_coefficient)