diff --git a/benchmarks/.gitignore b/benchmarks/.gitignore index b34cba189..ff7d75b05 100644 --- a/benchmarks/.gitignore +++ b/benchmarks/.gitignore @@ -1,3 +1,7 @@ +# ignore airspeed velocity output +html/ +results/ + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/benchmarks/NNPDF_bench.py b/benchmarks/NNPDF_bench.py index 71adf313a..833d5cca6 100644 --- a/benchmarks/NNPDF_bench.py +++ b/benchmarks/NNPDF_bench.py @@ -1,9 +1,14 @@ # -*- coding: utf-8 -*- """ -Benchmark NNDPF31 pdf family +Benchmark NNPDF pdf family """ +import numpy as np +from banana import register + from ekomark.benchmark.runner import Runner +register(__file__) + class BenchmarkNNPDF(Runner): """ @@ -26,9 +31,7 @@ def skip_pdfs(self, _theory): ] -base_operator = { - "ev_op_iterations": 1, -} +base_operator = {"ev_op_iterations": 1, "backward_inversion": "exact"} base_theory = { "Qref": 91.2, @@ -39,7 +42,6 @@ def skip_pdfs(self, _theory): "kbThr": 1.0, "ktThr": 1.0, "alphas": 0.118000, - "FNS": "ZM-VFNS", "ModEv": "TRN", } @@ -75,6 +77,8 @@ def benchmark_nnlo(self, Q0=1.65, Q2grid=(100,)): theory_card = { **base_theory, "PTO": 2, + "IC": 1, + "IB": 1, "Q0": Q0, } @@ -83,13 +87,13 @@ def benchmark_nnlo(self, Q0=1.65, Q2grid=(100,)): if __name__ == "__main__": + low2 = 4**2 + high2 = 30**2 # nn31 = BenchmarkNNPDF31() - # low2 = 1.65**2 - # high2 = 20 # # test forward # nn31.benchmark_nlo(Q0=np.sqrt(low2), Q2grid=[10]) # # test backward # #nn31.benchmark_nlo(Q0=np.sqrt(high2), Q2grid=[low2]) nn40 = BenchmarkNNPDF40() - # nn40.benchmark_nlo(Q2grid=[100]) - nn40.benchmark_nnlo(Q2grid=[100]) + # nn40.benchmark_nnlo(Q2grid=[100]) + nn40.benchmark_nnlo(Q0=np.sqrt(high2), Q2grid=[low2]) diff --git a/benchmarks/asv.conf.json b/benchmarks/asv.conf.json new file mode 100644 index 000000000..628c6b460 --- /dev/null +++ b/benchmarks/asv.conf.json @@ -0,0 +1,91 @@ +{ + // The version of the config file format. Do not change, unless + // you know what you are doing. + "version": 1, + + // The name of the project being benchmarked + "project": "eko", + + // The project's homepage + "project_url": "https://n3pdf.github.io/eko/", + + // The URL or local path of the source code repository for the + // project being benchmarked + "repo": "..", + + // List of branches to benchmark. If not provided, defaults to "master" + // (for git) or "tip" (for mercurial). + "branches": ["HEAD"], + + // The DVCS being used. If not set, it will be automatically + // determined from "repo" by looking at the protocol in the URL + // (if remote), or by looking for special directories, such as + // ".git" (if local). + "dvcs": "git", + + // The tool to use to create environments. May be "conda", + // "virtualenv" or other value depending on the plugins in use. + // If missing or the empty string, the tool will be automatically + // determined by looking for tools on the PATH environment + // variable. + "environment_type": "virtualenv", + + // the base URL to show a commit for the project. + "show_commit_url": "https://github.com/N3PDF/eko/commit/", + + // The Pythons you'd like to test against. If not provided, defaults + // to the current version of Python used to run `asv`. + "pythons": ["3.8", "3.9", "3.10"], + + // The matrix of dependencies to test. Each key is the name of a + // package (in PyPI) and the values are version numbers. An empty + // list indicates to just test against the default (latest) + //version. + "matrix": { + "poetry": [] + }, + + // The directory (relative to the current directory) that benchmarks are + // stored in. If not provided, defaults to "benchmarks" + "benchmark_dir": "performance", + + // The directory (relative to the current directory) to cache the Python + // environments in. If not provided, defaults to "env" + // "env_dir": "env", + + // The directory (relative to the current directory) that raw benchmark + // results are stored in. If not provided, defaults to "results". + "results_dir": "results", + + // The directory (relative to the current directory) that the html tree + // should be written to. If not provided, defaults to "html". + "html_dir": "html", + + // The number of characters to retain in the commit hashes. + // "hash_length": 8, + + // `asv` will cache wheels of the recent builds in each + // environment, making them faster to install next time. This is + // number of builds to keep, per environment. + "build_cache_size": 8, + + // The commits after which the regression search in `asv publish` + // should start looking for regressions. Dictionary whose keys are + // regexps matching to benchmark names, and values corresponding to + // the commit (exclusive) after which to start looking for + // regressions. The default is to start from the first commit + // with results. If the commit is `null`, regression detection is + // skipped for the matching benchmark. + // + // "regressions_first_commits": { + // "some_benchmark": "352cdf", // Consider regressions only after this commit + // "another_benchmark": null, // Skip regression detection altogether + // } + + + "install_command": ["in-dir={env_dir} python -mpip install {wheel_file}[mark]"], + + "build_command": [ + "PIP_NO_BUILD_ISOLATION=false python -mpip wheel --no-deps -w {build_cache_dir} {build_dir}" + ] +} diff --git a/benchmarks/eko/benchmark_ad.py b/benchmarks/eko/benchmark_ad.py index 1087db0e0..6ccd12547 100644 --- a/benchmarks/eko/benchmark_ad.py +++ b/benchmarks/eko/benchmark_ad.py @@ -4,7 +4,7 @@ import pytest import eko.anomalous_dimensions.as2 as ad_as2 -import eko.anomalous_dimensions.harmonics as h +import eko.harmonics as h from eko.constants import CA, CF, TR @@ -15,7 +15,7 @@ def benchmark_melling_g3_pegasus(): def check_melling_g3_pegasus(N): - S1 = h.harmonic_S1(N) + S1 = h.S1(N) N1 = N + 1.0 N2 = N + 2.0 N3 = N + 3.0 @@ -28,7 +28,7 @@ def check_melling_g3_pegasus(N): S14 = S13 + 1.0 / N4 S15 = S14 + 1.0 / N5 S16 = S15 + 1.0 / N6 - zeta2 = h.zeta2 + zeta2 = h.constants.zeta2 SPMOM = ( 1.0000 * (zeta2 - S1 / N) / N @@ -39,7 +39,7 @@ def check_melling_g3_pegasus(N): - 0.3174 * (zeta2 - S15 / N5) / N5 + 0.0699 * (zeta2 - S16 / N6) / N6 ) - np.testing.assert_allclose(h.mellin_g3(N), SPMOM) + np.testing.assert_allclose(h.g_functions.mellin_g3(N, S1), SPMOM) @pytest.mark.isolated @@ -52,12 +52,12 @@ def benchmark_gamma_ns_1_pegasus(): def check_gamma_1_pegasus(N, NF): # Test against pegasus implementation - ZETA2 = h.zeta2 - ZETA3 = h.zeta3 + ZETA2 = h.constants.zeta2 + ZETA3 = h.constants.zeta3 # N = np.random.rand(1) + np.random.rand(1) * 1j - S1 = h.harmonic_S1(N) - S2 = h.harmonic_S2(N) + S1 = h.S1(N) + S2 = h.S2(N) N1 = N + 1.0 N2 = N + 2.0 @@ -87,16 +87,18 @@ def check_gamma_1_pegasus(N, NF): ) SLC = -5.0 / 8.0 * ZETA3 SLV = ( - -ZETA2 / 2.0 * (h.cern_polygamma(N1 / 2, 0) - h.cern_polygamma(N / 2, 0)) + -ZETA2 + / 2.0 + * (h.polygamma.cern_polygamma(N1 / 2, 0) - h.polygamma.cern_polygamma(N / 2, 0)) + S1 / NS + SPMOM ) SSCHLM = SLC - SLV - SSTR2M = ZETA2 - h.cern_polygamma(N1 / 2, 1) - SSTR3M = 0.5 * h.cern_polygamma(N1 / 2, 2) + ZETA3 + SSTR2M = ZETA2 - h.polygamma.cern_polygamma(N1 / 2, 1) + SSTR3M = 0.5 * h.polygamma.cern_polygamma(N1 / 2, 2) + ZETA3 SSCHLP = SLC + SLV - SSTR2P = ZETA2 - h.cern_polygamma(N2 / 2, 1) - SSTR3P = 0.5 * h.cern_polygamma(N2 / 2, 2) + ZETA3 + SSTR2P = ZETA2 - h.polygamma.cern_polygamma(N2 / 2, 1) + SSTR3P = 0.5 * h.polygamma.cern_polygamma(N2 / 2, 2) + ZETA3 PNMA = ( 16.0 * S1 * (2.0 * N + 1.0) / (NS * N1S) @@ -136,8 +138,9 @@ def check_gamma_1_pegasus(N, NF): P1NSP = CF * ((CF - CA / 2.0) * PNPA + CA * PNSB + TR * NF * PNSC) P1NSM = CF * ((CF - CA / 2.0) * PNMA + CA * PNSB + TR * NF * PNSC) - np.testing.assert_allclose(ad_as2.gamma_nsp(N, NF), -P1NSP) - np.testing.assert_allclose(ad_as2.gamma_nsm(N, NF), -P1NSM) + sx = h.sx(N, 2) + np.testing.assert_allclose(ad_as2.gamma_nsp(N, NF, sx), -P1NSP) + np.testing.assert_allclose(ad_as2.gamma_nsm(N, NF, sx), -P1NSM) NS = N * N NT = NS * N @@ -254,7 +257,7 @@ def check_gamma_1_pegasus(N, NF): P1Sgq = (CF * CF * PGQA + CF * CA * PGQB + TR * NF * CF * PGQC) * 4.0 P1Sgg = (CA * CA * PGGA + TR * NF * (CA * PGGB + CF * PGGC)) * 4.0 - gS1 = ad_as2.gamma_singlet(N, NF) + gS1 = ad_as2.gamma_singlet(N, NF, sx) np.testing.assert_allclose(gS1[0, 0], -P1Sqq) np.testing.assert_allclose(gS1[0, 1], -P1Sqg) np.testing.assert_allclose(gS1[1, 0], -P1Sgq) diff --git a/benchmarks/eko/benchmark_evol_to_unity.py b/benchmarks/eko/benchmark_evol_to_unity.py index 79065061b..376c76c18 100644 --- a/benchmarks/eko/benchmark_evol_to_unity.py +++ b/benchmarks/eko/benchmark_evol_to_unity.py @@ -49,6 +49,7 @@ class BenchmarkBackwardForward: "ev_op_max_order": 1, "ev_op_iterations": 1, "backward_inversion": "exact", + "n_integration_cores": 1, } g = OperatorGrid.from_dict( theory_card, @@ -99,12 +100,20 @@ def test_operator_grid( np.zeros(dim), atol=7e-4, ) - # gg - np.testing.assert_allclose( + # gg, check last two rows separately + gg_id = ( o_back.op_members[(21, 21)].value @ o.op_members[(21, 21)].value - + o_back.op_members[(21, 100)].value @ o.op_members[(100, 21)].value, - np.eye(dim[0]), - atol=9e-2, + + o_back.op_members[(21, 100)].value @ o.op_members[(100, 21)].value + ) + np.testing.assert_allclose( + gg_id[:-2], + np.eye(dim[0])[:-2], + atol=3e-2, + ) + np.testing.assert_allclose( + gg_id[-2:], + np.eye(dim[0])[-2:], + atol=11.2e-2, ) # gq np.testing.assert_allclose( @@ -126,14 +135,14 @@ def test_operator_grid( # ome.compute( q2, L) # ome_back.compute(q2, L) - # dim = ome.ome_members[(100, 100)].value.shape + # dim = ome.op_members[(100, 100)].value.shape # ome_tensor = np.zeros((3,3,dim[0],dim[0])) # ome_tensor_back = ome_tensor # idx_dict = dict(zip(["g", "q", "H"],[0,1,2])) # for p1, j in idx_dict.items(): # for p2, k in idx_dict.items(): - # ome_tensor[j,k] = ome.ome_members[f"S_{p1}{p2}"].value - # ome_tensor_back[j,k] = ome_back.ome_members[f"S_{p1}{p2}"].value + # ome_tensor[j,k] = ome.op_members[f"S_{p1}{p2}"].value + # ome_tensor_back[j,k] = ome_back.op_members[f"S_{p1}{p2}"].value # ome_product = np.einsum("abjk,bckl -> acjl", ome_tensor_back, ome_tensor) # for j, line in enumerate(ome_product): diff --git a/benchmarks/lha_paper_bench.py b/benchmarks/lha_paper_bench.py index 415ed665d..27573b721 100644 --- a/benchmarks/lha_paper_bench.py +++ b/benchmarks/lha_paper_bench.py @@ -222,9 +222,9 @@ def benchmark_sv(self, pto): # Benchmark to LHA # obj = BenchmarkVFNS() - # obj = BenchmarkFFNS() + obj = BenchmarkFFNS() - # obj.benchmark_plain(2) + # obj.benchmark_plain(0) # obj.benchmark_sv(2) # # VFNS benchmarks with LHA settings diff --git a/benchmarks/performance/__init__.py b/benchmarks/performance/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/benchmarks/performance/harmonics.py b/benchmarks/performance/harmonics.py new file mode 100644 index 000000000..1d173ba15 --- /dev/null +++ b/benchmarks/performance/harmonics.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +import numpy as np + +from eko import anomalous_dimensions as ad +from eko.mellin import Path + +NF = 5 + + +class TimeSuite: + def setup(self): + ts = np.linspace(0.5, 1.0 - 1e-5, 100) + logx = 0.8 + axis_offset = True + self.ns = [] + for t in ts: + self.ns.append(Path(t, logx, axis_offset).n) + + def time_as1_sing(self): + for n in self.ns: + ad.gamma_singlet(0, n, NF) + + def time_as2_sing(self): + for n in self.ns: + ad.gamma_singlet(1, n, NF) + + def time_as3_sing(self): + for n in self.ns: + ad.gamma_singlet(2, n, NF) diff --git a/doc/source/code/IO.rst b/doc/source/code/IO.rst index 70b7641cb..cc518c57d 100644 --- a/doc/source/code/IO.rst +++ b/doc/source/code/IO.rst @@ -12,29 +12,6 @@ The input is split into two runcard and environment - a operator runcard that defines the numerical setup and the requested operators -.. list-table:: theory input runcard - :header-rows: 1 - - * - Name - - Type - - default - - description - * - ``PTO`` - - :py:obj:`int` - - [required] - - order of perturbation theory: ``0`` = LO, ... - * - ``alphas`` - - :py:obj:`float` - - [required] - - reference value of the strong coupling :math:`\alpha_s(\mu_0^2)` (Note that we have to use - :math:`\alpha_s(\mu_0^2)` here, instead of :math:`a_s(\mu_0^2)` for legacy reasons) - -.. include:: IO-tabs/ThresholdConfig.rst - -.. include:: IO-tabs/InterpolatorDispatcher.rst - -- :py:obj:`list(float)` ``Q2grid`` the target grid in :math:`Q^2`; **Required** - Output ------ diff --git a/doc/source/code/Utilities.rst b/doc/source/code/Utilities.rst index 2c7a6b83e..0bb12f3e6 100644 --- a/doc/source/code/Utilities.rst +++ b/doc/source/code/Utilities.rst @@ -12,7 +12,7 @@ Apart from the :doc:`operator ` classes, `eko` also provides some uti can be different depending of the chosen setting. This path is determined by :meth:`eko.thresholds.ThresholdsAtlas.path`. Let us consider two examples to better illustrate how it works. - Imagine to have a boundary condition ``q2_ref=1``, ``nf_ref=3`` with heavy quarks mass thresholds + Imagine to have a boundary condition ``q2_ref=1``, ``nf_ref=3`` with heavy quarks mass matching scales at: ``mc=2``, ``mb=3``, ``mt=4`` and would like to evolve your object (|PDF| or :math:`a_s`) to an higher scale (say ``q2_to=49``). The corresponding ``ThresholdsAtlas`` will look like: @@ -27,7 +27,7 @@ Apart from the :doc:`operator ` classes, `eko` also provides some uti [PathSegment(1 -> 4, nf=3), PathSegment(4 -> 9, nf=4), PathSegment(9 -> 16, nf=5), PathSegment(16 -> 49, nf=6)] where automatically the number of flavors active in each :class:`eko.thresholds.PathSegment` is determined according with the - specified thresholds scales. + specified matching scales. However some more complicated situations can arise when the boundary conditions are not given with the same prescription of the :class:`eko.thresholds.ThresholdAtlas`. Let's now consider as boundary condition ``q2_ref=64`` with ``nf_ref=3``: @@ -63,7 +63,7 @@ Apart from the :doc:`operator ` classes, `eko` also provides some uti In the first two cases as first step, you go back to the closest matching scale (closest in `nf`), running in ``nf=3``, since that is what has been specified in the boundary conditions. - Then you are back in the flavor flow, and you cross all the other thresholds going according to the prescription given + Then you are back in the flavor flow, and you cross all the other scales going according to the prescription given by the :class:`eko.thresholds.ThresholdAtlas`. While in the third example you go directly to the final scale, since there is no matching scale in the middle. You can notice that :meth:`eko.thresholds.ThresholdsAtlas.path` are always ordered according to `nf` and not `q2` scales. diff --git a/doc/source/refs.bib b/doc/source/refs.bib index 8131027b0..8e7218349 100644 --- a/doc/source/refs.bib +++ b/doc/source/refs.bib @@ -228,7 +228,7 @@ @phdthesis{Bonvini:2012sh year = "2012" } @article{Buckley:2014ana, - author = {Buckley, Andy and Ferrando, James and Lloyd, Stephen and Nordstr\"om, Karl and Page, Ben and R\"ufenacht, Martin and Sch\"onherr, Marek and Watt, Graeme}, + author = {Buckley, Andy and Ferrando, James and Lloyd, Stephen and Nordström, Karl and Page, Ben and Rüfenacht, Martin and Schönherr, Marek and Watt, Graeme}, title = "{LHAPDF6: parton density access in the LHC precision era}", eprint = "1412.7420", archivePrefix = "arXiv", @@ -341,19 +341,160 @@ @article{Ball_2016 } -@article{Bierenbaum_2009, - title={Mellin moments of the heavy flavor contributions to unpolarized deep-inelastic scattering at and anomalous dimensions}, - volume={820}, +@article{Bierenbaum:2009mv, + author = "Bierenbaum, Isabella and Blümlein, Johannes and Klein, Sebastian", + title = "{Mellin Moments of the O(alpha**3(s)) Heavy Flavor Contributions to unpolarized Deep-Inelastic Scattering at Q**2 \ensuremath{>}\ensuremath{>} m**2 and Anomalous Dimensions}", + eprint = "0904.3563", + archivePrefix = "arXiv", + primaryClass = "hep-ph", + reportNumber = "DESY-09-057, SFB-CPP-09-033, IFIC-09-16", + doi = "10.1016/j.nuclphysb.2009.06.005", + journal = "Nucl. Phys. B", + volume = "820", + pages = "417--482", + year = "2009" +} + +@article{Bl_mlein_2000, + title={Analytic continuation of Mellin transforms up to two-loop order}, + volume={133}, + ISSN={0010-4655}, + url={http://dx.doi.org/10.1016/S0010-4655(00)00156-9}, + DOI={10.1016/s0010-4655(00)00156-9}, + number={1}, + journal={Computer Physics Communications}, + publisher={Elsevier BV}, + author={Blümlein, Johannes}, + year={2000}, + month={Dec}, + pages={76–104} +} + +@article{Blumlein:2009ta, + author = "Blümlein, Johannes", + title = "{Structural Relations of Harmonic Sums and Mellin Transforms up to Weight w = 5}", + eprint = "0901.3106", + archivePrefix = "arXiv", + primaryClass = "hep-ph", + reportNumber = "DESY-07-042, SFB-CPP-09-05", + doi = "10.1016/j.cpc.2009.07.004", + journal = "Comput. Phys. Commun.", + volume = "180", + pages = "2218--2249", + year = "2009" +} + +@article{Bierenbaum:2009zt, + author = "Bierenbaum, Isabella and Blümlein, Johannes and Klein, Sebastian", + title = "{The Gluonic Operator Matrix Elements at O(alpha(s)**2) for DIS Heavy Flavor Production}", + eprint = "0901.0669", + archivePrefix = "arXiv", + primaryClass = "hep-ph", + reportNumber = "DESY-08-187, SFB-CPP-08-107, IFIC-08-68", + doi = "10.1016/j.physletb.2009.01.057", + journal = "Phys. Lett. B", + volume = "672", + pages = "401--406", + year = "2009" +} + +@article{Ablinger:2010ty, + author = "Ablinger, J. and Blümlein, J. and Klein, S. and Schneider, C. and Wissbrock, F.", + title = "{The $O(\alpha_s^3)$ Massive Operator Matrix Elements of $O(n_f)$ for the Structure Function $F_2(x,Q^2)$ and Transversity}", + eprint = "1008.3347", + archivePrefix = "arXiv", + primaryClass = "hep-ph", + reportNumber = "DESY-10-109, TTK-10-46, SFB-CPP-10-077, DESY-10--109, TTK--10--46, SFB-CPP-10--077", + doi = "10.1016/j.nuclphysb.2010.10.021", + journal = "Nucl. Phys. B", + volume = "844", + pages = "26--54", + year = "2011" +} + +@article{Ablinger:2014vwa, + author = {Ablinger, J. and Behring, A. and Blümlein, J. and De Freitas, A. and Hasselhuhn, A. and von Manteuffel, A. and Round, M. and Schneider, C. and Wißbrock, F.}, + title = "{The 3-Loop Non-Singlet Heavy Flavor Contributions and Anomalous Dimensions for the Structure Function $F_2(x,Q^2)$ and Transversity}", + eprint = "1406.4654", + archivePrefix = "arXiv", + primaryClass = "hep-ph", + reportNumber = "DESY-13--210, DO--TH-13-11, MITP-14-028, SFB-CPP-14-26, LPN-14-074", + doi = "10.1016/j.nuclphysb.2014.07.010", + journal = "Nucl. Phys. B", + volume = "886", + pages = "733--823", + year = "2014" +} + +@article{Ablinger:2014uka, + author = {Ablinger, J. and Blümlein, J. and De Freitas, A. and Hasselhuhn, A. and von Manteuffel, A. and Round, M. and Schneider, C.}, + title = "{The $O(\alpha_s^3 T_F^2)$ Contributions to the Gluonic Operator Matrix Element}", + eprint = "1405.4259", + archivePrefix = "arXiv", + primaryClass = "hep-ph", + reportNumber = "DESY-14-018, DO-TH-14-04, MITP-14-019, SFB-CPP-14-24, LPN-14-069, HIGGSTOOLS-14-006, DO-TH 14/04, MITP/14-019, SFB/CPP-14-24, LPN 14-069, Higgstools 14-006", + doi = "10.1016/j.nuclphysb.2014.05.028", + journal = "Nucl. Phys. B", + volume = "885", + pages = "280--317", + year = "2014" +} + +@article{Behring:2014eya, + author = {Behring, A. and Bierenbaum, I. and Blümlein, J. and De Freitas, A. and Klein, S. and Wißbrock, F.}, + title = "{The logarithmic contributions to the $O(\alpha^3_s)$ asymptotic massive Wilson coefficients and operator matrix elements in deeply inelastic scattering}", + eprint = "1403.6356", + archivePrefix = "arXiv", + primaryClass = "hep-ph", + reportNumber = "DESY-11-144, DO-TH-13-33, SFB-CPP-14-002, LPN-14-002, HIGGSTOOLS-14-003, DESY-11--144, SFB-CPP-14--002, LPN-14--002, HIGGSTOOLS --14--003", + doi = "10.1140/epjc/s10052-014-3033-x", + journal = "Eur. Phys. J. C", + volume = "74", + number = "9", + pages = "3033", + year = "2014" +} + +@article{Blumlein:2017wxd, + author = {Blümlein, Johannes and Ablinger, Jakob and Behring, Arnd and De Freitas, Abilio and von Manteuffel, Andreas and Schneider, Carsten and Schneider, C.}, + title = "{Heavy Flavor Wilson Coefficients in Deep-Inelastic Scattering: Recent Results}", + eprint = "1711.07957", + archivePrefix = "arXiv", + primaryClass = "hep-ph", + reportNumber = "DESY-17-199, DO-TH-17-33, TTK-17-39, MSUHEP-17-020", + doi = "10.22323/1.308.0031", + journal = "PoS", + volume = "QCDEV2017", + pages = "031", + year = "2017" +} + +@article{Ablinger_2014, + title={The transition matrix element A_{gq}(N) of the Variable Flavor Number Scheme at O(α_s^3)}, + volume={882}, ISSN={0550-3213}, - url={http://dx.doi.org/10.1016/j.nuclphysb.2009.06.005}, - DOI={10.1016/j.nuclphysb.2009.06.005}, - number={1-2}, + url={http://dx.doi.org/10.1016/j.nuclphysb.2014.02.007}, + DOI={10.1016/j.nuclphysb.2014.02.007}, + journal={Nuclear Physics B}, + publisher={Elsevier BV}, + author={Ablinger, J. and Blümlein, J. and De Freitas, A. and Hasselhuhn, A. and von Manteuffel, A. and Round, M. and Schneider, C. and Wißbrock, F.}, + year={2014}, + month={May}, + pages={263–288} +} + +@article{Ablinger_2015, + title={The 3-loop pure singlet heavy flavor contributions to the structure function F2(x,Q2) and the anomalous dimension}, + volume={890}, + ISSN={0550-3213}, + url={http://dx.doi.org/10.1016/j.nuclphysb.2014.10.008}, + DOI={10.1016/j.nuclphysb.2014.10.008}, journal={Nuclear Physics B}, publisher={Elsevier BV}, - author={Bierenbaum, Isabella and Blümlein, Johannes and Klein, Sebastian}, - year={2009}, - month={Oct}, - pages={417–482} + author={Ablinger, J. and Behring, A. and Blümlein, J. and De Freitas, A. and von Manteuffel, A. and Schneider, C.}, + year={2015}, + month={Jan}, + pages={48–151} } @article{Carrazza_2020, diff --git a/doc/source/theory/DGLAP.rst b/doc/source/theory/DGLAP.rst index f7441977c..79d182686 100644 --- a/doc/source/theory/DGLAP.rst +++ b/doc/source/theory/DGLAP.rst @@ -284,7 +284,7 @@ And thus the |NLO| solution: .. math:: \ln \tilde E^{(2)}_{ns}(a_s \leftarrow a_s^0) &= \ln \tilde E^{(1)}_{ns}(a_s \leftarrow a_s^0) + j^{(1,2)'}(a_s,a_s^0)(\gamma^{(1)} - b_1 \gamma^{(0)}) + j^{(2,2)}(a_s,a_s^0)(\gamma^{(2)} - b_2 \gamma^{(0)}) \\ - j^{(1,2)'}(a_s,a_s^0) &= \int\limits_{a_s^0}^{a_s}\!da_s'\,\frac{ \beta_2 a_s'^2}{\beta_0 + \beta_1 a_s' + \beta_2 a_s'^2 ) (\beta_0 + \beta_1 a_s')} + j^{(1,2)'}(a_s,a_s^0) &= \int\limits_{a_s^0}^{a_s}\!da_s'\,\frac{ \beta_2 a_s'^2}{( \beta_0 + \beta_1 a_s' + \beta_2 a_s'^2 ) (\beta_0 + \beta_1 a_s')} In |NNLO| we provide different strategies to define the |EKO|: diff --git a/doc/source/theory/FlavorSpace.rst b/doc/source/theory/FlavorSpace.rst index 2baf94f5d..bc22b69d1 100644 --- a/doc/source/theory/FlavorSpace.rst +++ b/doc/source/theory/FlavorSpace.rst @@ -222,7 +222,7 @@ Operator Flavor Basis - here we mean :ref:`theory/FlavorSpace:Flavor Basis` both in the input and the output space - the :class:`~eko.output.Output` is delivered in this basis - this basis has :math:`(2n_f+ 1)^2 = 13^2 = 169` elements -- this basis can span arbitrary thresholds +- this basis can span arbitrary matching scales Operator Anomalous Dimension Basis ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -240,4 +240,4 @@ Operator Intrinsic QCD Evolution Basis - this basis does **not** coincide with the :ref:`theory/FlavorSpace:Operator Anomalous Dimension Basis` as the decision on which operator of that basis is used is a non-trivial decision - see :doc:`Matching` - this basis has :math:`2n_f+ 3 = 15` elements -- this basis can span arbitrary thresholds +- this basis can span arbitrary matching scales diff --git a/doc/source/theory/Matching.rst b/doc/source/theory/Matching.rst index cc2902022..90a5449a2 100644 --- a/doc/source/theory/Matching.rst +++ b/doc/source/theory/Matching.rst @@ -1,7 +1,7 @@ Matching Conditions on Crossing Thresholds ========================================== -In a |VFNS| one considers several matching thresholds (as provided by the :class:`~eko.thresholds.ThresholdsAtlas`) +In a |VFNS| one considers several matching scales (as provided by the :class:`~eko.thresholds.ThresholdsAtlas`) where the number of active, light flavors that are participating in the :doc:`DGLAP equation ` changes by one unit: :math:`n_f \to n_f +1`. This means the distributions do not behave in the same matter above and below the threshold: in esp. the new quark distributions :math:`q_{n_f+1}(x,\mu_F^2) = h(x,\mu_F^2)` and @@ -28,7 +28,7 @@ We can then denote the solution as .. math :: \tilde{\mathbf{f}}^{(n_f+1)}(Q^2_1)= \tilde{\mathbf{E}}^{(n_f+1)}(Q^2_1\leftarrow \mu_{h}^2) {\mathbf{R}^{(n_f)}} \tilde{\mathbf{A}}^{(n_f)}(\mu_{h}^2) \tilde{\mathbf{E}}^{(n_f)}(\mu_{h}^2\leftarrow Q^2_0) \tilde{\mathbf{f}}^{(n_f)}(Q^2_0) -In the case of more than one threshold being present, the matching procedure is iterated on all thresholds starting from the lowest one. +In the case of more than one threshold being present, the matching procedure is iterated on all matching scales starting from the lowest one. Operator Matrix Elements @@ -39,16 +39,16 @@ and :math:`\mathcal F_{iev,n_f}^{(n_f+1)}`, i.e. they transform the basis vector in a :math:`n_f`-flavor scheme to the :math:`(n_f+1)`-flavor scheme. Hence, the supscript refers to the flavor scheme with a smaller number of active flavors. To compute the matrices in a minimal coupled system we decompose the :ref:`Intrinsic Evolution Basis ` :math:`\mathcal F_{iev,n_f}` into -several subspaces (of course irrespective of the |FNS|): +several subspaces (below for the example of `n_f = 3`): .. math :: \mathcal F_{iev,3,S,c^+} &= \span(g,\Sigma,c^+)\\ \mathcal F_{iev,3,nsv,c^-} &= \span(V,c^-)\\ \mathcal F_{iev,3,ns+} &= \span(T_3,T_8)\\ \mathcal F_{iev,3,ns-} &= \span(V_3,V_8)\\ - \mathcal F_{iev,3,hh} &= \span(b^+,b^-,t^+,t^-)\\ + \mathcal F_{iev,3,h} &= \span(b^+,b^-,t^+,t^-)\\ \mathcal F_{iev,n_f} &= \mathcal F_{iev,3,S,c^+} \otimes \mathcal F_{iev,3,nsv,c^-} \otimes \mathcal F_{iev,3,ns+} - \otimes \mathcal F_{iev,3,ns-} \otimes \mathcal F_{iev,3,hh} + \otimes \mathcal F_{iev,3,ns-} \otimes \mathcal F_{iev,3,h} We can then write the matching matrices :math:`\mathbf{A}^{(n_f)}(\mu_{h+1}^2)` as @@ -59,24 +59,26 @@ We can then write the matching matrices :math:`\mathbf{A}^{(n_f)}(\mu_{h+1}^2)` \dTj{j}{n_f+1}{\mu_h^2} &= \tilde{A}_{ns+}^{(n_f)}(\mu_{h}^2) \dTj{j}{n_f}{\mu_h^2}\\ &\text{for }j=3,\ldots, n_f^2-1 -Note that in the left hand side basis the distributions :math:`\tilde \Sigma_{(n_f)}, \tilde V_{(n_f)}` are not the Singlet and the Valence distributions any longer since, they -do not contain the new higher flavor. -Furthermore in the right side basis :math:`\tilde h^{+}, \tilde h^{-}` are intrinsic contributions. +Note that in the left hand side basis the distributions :math:`\tilde \Sigma_{(n_f)}, \tilde V_{(n_f)}` +are no longer the ordinary singlet and valence distribution as they +do not contain the new flavor :math:`\tilde h^{+}, \tilde h^{-}`. +Furthermore, in the right side basis :math:`\tilde h^{+}, \tilde h^{-}` are intrinsic contributions. The :math:`\mathbf{A}^{(n_f)}(\mu_{h+1}^2)` can be computed order by order in :math:`a_s`: .. math :: - \mathbf{A}^{(n_f)}(\mu_{h}^2) = \mathbf{I} + a_s^{(n_f+1)}(\mu_{h}^2) \mathbf{A}^{(n_f),(1)} + \left(a_s^{(n_f+1)}(\mu_{h}^2)\right)^2 \mathbf{A}^{(n_f),(2)} + \mathbf{A}^{(n_f)}(\mu_{h}^2) = \mathbf{I} + \sum_{k=1} \left(a_s^{(n_f+1)}(\mu_{h}^2)\right)^k \mathbf{A}^{(n_f),(k)} -where the :math:`\mathbf{A}^{(n_f),(k)}` are given up to |NNLO| by the following expressions: +where the :math:`\mathbf{A}^{(n_f),(k)}` are given up to |N3LO| by the following expressions: .. math :: \mathbf{A}_{S,h^+}^{(n_f),(1)} &= \begin{pmatrix} A_{gg,H}^{S,(1)} & 0 & A_{gH}^{S,(1)} \\ 0 & 0 & 0 \\ A_{Hg}^{S,(1)} & 0 & A_{HH}^{(1)} \end{pmatrix} \\ \mathbf{A}_{nsv,h^-}^{(n_f),(1)} &= \begin{pmatrix} 0 & 0 \\ 0 & A_{HH}^{(1)}\end{pmatrix} \\ \mathbf{A}_{S,h^+}^{(n_f),(2)} &= \begin{pmatrix} A_{gg,H}^{S,(2)} & A_{gq,H}^{S,(2)} & 0 \\ 0 & A_{qq,H}^{ns,(2)} & 0 \\ A_{Hg}^{S,(2)} & A_{Hq}^{ps,(2)} & 0 \end{pmatrix} \\ - \mathbf{A}_{nsv,h^-}^{(n_f),(2)} &= \begin{pmatrix} A_{qq,H}^{ns,(2)} & 0 \\ 0 & 0 \end{pmatrix} - + \mathbf{A}_{nsv,h^-}^{(n_f),(2)} &= \begin{pmatrix} A_{qq,H}^{ns,(2)} & 0 \\ 0 & 0 \end{pmatrix} \\ + \mathbf{A}_{S,h^+}^{(n_f),(3)} &= \begin{pmatrix} A_{gg,H}^{S,(3)} & A_{gq,H}^{S,(3)} & 0 \\ A_{qg,H}^{S,(3)} & A_{qq,H}^{ns,(3)} + A_{qq,H}^{ps,(3)} & 0 \\ A_{Hg}^{S,(3)} & A_{Hq}^{ps,(3)} & 0 \end{pmatrix} \\ + \mathbf{A}_{nsv,h^-}^{(n_f),(3)} &= \begin{pmatrix} A_{qq,H}^{ns,(3)} & 0 \\ 0 & 0 \end{pmatrix} The coefficients :math:`A^{(n_f),(k)}_{ij}(z,\mu_{h}^2)` have been firstly computed in :cite:`Buza_1998` and have been :doc:`Mellin transformed ` to be used inside EKO. @@ -85,8 +87,15 @@ in particular the coefficient :math:`A_{gg,H}^{S,(1)}` is fully proportional to During the matching we use :math:`a_s^{(n_f+1)}`: in fact the :math:`a_s` decoupling gives raise to some additional logarithms :math:`\ln(\mu_{h}^2/m_{h}^2)`, which are cancelled by the OME's :math:`A_{kl,H}`. -We remark that contributions of the higher quark at |NNLO| have not been computed yet, thus the elements :math:`A_{qH}^{(2)},A_{gH}^{(2)}A_{HH}^{(2)}` are not encoded in EKO despite of being present. -On the other hand the elements :math:`A_{qq}^{ps},A_{qg}` are known to start at |N3LO|. +|N3LO| matrix elements have been presented in :cite:`Bierenbaum:2009mv` and following publications +:cite:`Ablinger:2010ty,Ablinger:2014vwa,Ablinger:2014uka,Behring:2014eya,Blumlein:2017wxd,Ablinger_2014,Ablinger_2015`. +We have included at |N3LO| also parts proportional to :math:`\ln(\mu_{h}^2/m_{h}^2)`. + +We remark that contributions of the higher quark at |NNLO| and |N3LO| have not been computed yet, thus the elements :math:`A_{qH}^{(2)},A_{gH}^{(2)}A_{HH}^{(2)}` +are not encoded in EKO despite of being present. +On the other hand the elements :math:`A_{qq,H}^{ps},A_{qg,H}` are known to start at |N3LO|. + +Additional contributions due to |MSbar| masses are included only up to |NNLO|. The |OME| are also required in the context of the FONLL matching scheme :cite:`Forte:2010ta`. For :ref:`Intrinsic Evolution ` this leads to considerable simplifications :cite:`Ball:2015dpa`. @@ -118,7 +127,10 @@ EKO implements two different strategies to perform this operation, that can be s - ``backward_inversion = 'expanded'``: the matching matrices are inverted through a perturbative expansion in :math:`a_s` before the Mellin inversion: .. math :: - \mathbf{A}_{exp}^{-1}(\mu_{h}^2) &= \mathbf{I} - a_s(\mu_{h}^2) \mathbf{A}^{(1)} + a_s^2(\mu_{h}^2) \left [ \mathbf{A}^{(2)} - \left(\mathbf{A}^{(1)}\right)^2 \right ] + O(a_s^3) \\ + \mathbf{A}_{exp}^{-1}(\mu_{h}^2) &= \mathbf{I} \\ + & - a_s(\mu_{h}^2) \mathbf{A}^{(1)} \\ + & + a_s^2(\mu_{h}^2) \left [ \mathbf{A}^{(2)} - \left(\mathbf{A}^{(1)}\right)^2 \right ] \\ + & + a_s^3(\mu_{h}^2) \left [ - \mathbf{A}^{(3)} + \mathbf{A}^{(1)} \mathbf{A}^{(2)} + \mathbf{A}^{(2)} \mathbf{A}^{(1)} - \left( \mathbf{A}^{(1)} \right )^3 \right ] \\ We emphasize that in the backward evolution, below the threshold, the remaining high quark PDFs are always intrinsic and do not evolve anymore. In fact, if the initial PDFs (above threshold) do contain an intrinsic contribution, this has to be evolved below the threshold otherwise momentum sum rules diff --git a/doc/source/theory/Mellin.rst b/doc/source/theory/Mellin.rst index 2c69e477a..083f3e9a9 100644 --- a/doc/source/theory/Mellin.rst +++ b/doc/source/theory/Mellin.rst @@ -107,38 +107,79 @@ are doing, are proportional to Harmonic Sums ------------- -In the computations of the anomalous dimensions (generalized) harmonic sums +In the computations of the anomalous dimensions and matching conditions, (generalized) harmonic sums :cite:`Ablinger:2013hcp` appear naturally: .. math :: S_{m}(N) &= \sum\limits_{j=1}^N \frac{(\text{sign}(m))^j}{j^{|m|}} \\ S_{m_0,m_1\ldots}(N) &= \sum\limits_{j=1}^N \frac{(\text{sign}(m_0))^j}{j^{|m_0|}} S_{m_1\ldots}(j) +At |N3LO| the anomalous dimensions contains at maximum weight 7 harmonic sums. We then need to find an analytical continuation of these sums into the complex plain to perform the Mellin inverse. - the sums :math:`S_{m}(N)` for :math:`m > 0` do have a straight continuation: -.. math :: + .. math :: S_m(N) = \sum\limits_{j=1}^N \frac 1 {j^m} = \frac{(-1)^{m-1}}{(m-1)!} \psi_{m-1}(N+1)+c_m \quad - \text{with}\, c_m = \left\{\begin{array}{ll} \gamma_E, & m=1\\ \zeta(m), & m>1\end{array} \right. + \text{with},\quad c_m = \left\{\begin{array}{ll} \gamma_E, & m=1\\ \zeta(m), & m>1\end{array} \right. -and where :math:`\psi_k(N)` is the :math:`k`-th polygamma function (implemented as :meth:`~eko.anomalous_dimensions.harmonics.cern_polygamma`) -and :math:`\zeta` the Riemann zeta function (using :func:`scipy.special.zeta`). + where :math:`\psi_k(N)` is the :math:`k`-th polygamma function (implemented as :meth:`~eko.harmonics.polygamma.cern_polygamma`) + and :math:`\zeta` the Riemann zeta function (using :func:`scipy.special.zeta`). -- for the sums :math:`S_{-m}(N)` and :math:`m > 0` we use :cite:`Gluck:1989ze` +- for the sums :math:`S_{-m}(N)` and m > 0 we use :cite:`Gluck:1989ze`: -.. math :: - S_m'(N) = 2^{m-1}(S_m(N) + S_{-m}(N)) = \frac{1+\eta}{2} S_m(N/2) + \frac{1-\eta}{2}S_m((N-1)/2) + .. math :: + S_m'(N) = 2^{m-1}(S_m(N) + S_{-m}(N)) = \frac{1+\eta}{2} S_m\left(\frac{N}{2}\right) + \frac{1-\eta}{2} S_m\left(\frac{N-1}{2}\right) -where formally :math:`\eta = (-1)^N` but in all singlet-like quantities it has to be analytically continued with 1 -and with -1 elsewise. + .. math :: + S_{-m}(N) = \frac{1}{2^{m-1}} \left [ \frac{1+\eta}{2} S_m\left(\frac{N}{2}\right) + \frac{1-\eta}{2}S_m\left(\frac{N-1}{2}\right)\right ] - S_m(N) -- for the sums with greater depth we use the lists provided in :cite:`Gluck:1989ze,MuselliPhD,Blumlein:1998if`. -- For :math:`S_{-2,1}(N)` we use the implementation of :cite:`Gluck:1989ze` (where it is called :math:`\tilde S`): + where formally :math:`\eta = (-1)^N` but in all singlet-like quantities it has to be analytically continued with 1 + and with -1 elsewise. In case the symmetry condition is not given the formal definition of :math:`\eta` is used. + This relation is equivalent to the standard analytical continuation :cite:`Blumlein:2009ta,MuselliPhD`: -.. math :: - S_{-2,1}(N) &= - \frac 5 8 \zeta(3) + \zeta(2)\left(S_{-1}(N) - \frac{\eta}{N} + \log(2)\right) + \eta\left(\frac{S_{1}(N)}{N^2} + g_3(N)\right)\\ - g_3(N) &= \mathcal M \left[\frac{\text{Li}_2(x)}{1+x}\right](N) + .. math :: + S_{-m}(N) &= \frac{\eta}{2^m} \left[ S_m\left(\frac{N}{2}\right) - S_m\left(\frac{N-1}{2}\right) \right] - d_{m} \quad + \text{with},\quad d_m = \left\{\begin{array}{ll} \log(2), & m=1\\ \frac{2^{m-1}-1}{2^{m-1}}\zeta(m), & m>1\end{array} \right.\\ + + but it's faster for :math:`\eta = \pm 1`. + +- for the sums with greater depth we use the definitions provided in :cite:`Gluck:1989ze,MuselliPhD,Blumlein:1998if,Blumlein:2009ta`, + which express higher weight sums in terms of simple one :math:`S_{m}, S_{-m}` and some irreducible integrals. + The above prescription on the analytical continuation of :math:`\eta` is applied. + +The complete list of harmonics sums available in :mod:`eko.harmonics` is: + + - weight 1: + + .. math:: + S_{1}, S_{-1} + + - weight 2: + + .. math:: + S_{2}, S_{-2} + + - weight 3: + + .. math:: + S_{3}, S_{2,1}, S_{2,-1}, S_{-2,1}, S_{-2,-1}, S_{-3} + + these sums relies on the integrals :mod:`eko.harmonics.g_functions` :cite:`MuselliPhD,Blumlein:1998if` + + - weight 4: + + .. math :: + S_{4}, S_{3,1}, S_{2,1,1}, S_{-2,-2}, S_{-3, 1}, S_{-4} + + these sums relies on the integrals :mod:`eko.harmonics.g_functions` :cite:`MuselliPhD,Blumlein:1998if` + + - weight 5: + + .. math :: + S_{5}, S_{4,1}, S_{3,1,1}, S_{2,3}, S_{2,2,1}, S_{2,1,1,1}, S_{2,1,-2}, S_{2,-3}, S_{-2,3}, S_{-2,2,1}, S_{-2,1,1,1}, S_{-5} + + these sums relies on the integrals :mod:`eko.harmonics.f_functions` :cite:`Blumlein:2009ta` -where for :math:`g_3(N)` we use the parametrization of :cite:`Vogt:2004ns` (implemented as :meth:`~eko.anomalous_dimensions.harmonics.mellin_g3`). +We have also implemented a recursive computation of simple harmonics (single index), see :func:`eko.harmonics.polygamma.recursive_harmonic_sum` diff --git a/doc/source/theory/pQCD.rst b/doc/source/theory/pQCD.rst index 2611c9876..49f538fa0 100644 --- a/doc/source/theory/pQCD.rst +++ b/doc/source/theory/pQCD.rst @@ -261,7 +261,7 @@ is necessary to always start computing the mass scales closer to :math:`\mu_{ref Eventually, to ensure that the threshold values are properly set, we add a consistency check, asserting that the :math:`m_{\overline{MS},h}` are properly sorted. -Note that also for |MSbar| mass running when the heavy threshold scales are +Note that also for |MSbar| mass running when the heavy matching scales are crossed we need to apply non trivial matching from order :math:`\mathcal{O}(a_s^2)` as described here :cite:`Liu:2015fxa`. @@ -278,7 +278,7 @@ then the heavy quarks initial conditions must satisfy: and EKO will start solving the equation :math:`m_{\overline{MS},h}(m_h^2) = m_h` in the order :math:`h={t,b,c}`. -Since the charm mass will be computed only when both the top and bottom threshold scales +Since the charm mass will be computed only when both the top and bottom matching scales are known, the boundary condition :math:`m_c(\mu_{c})` can be evolved safely below the scale :math:`m_{\overline{MS},b}` where the solution of :math:`m_{\overline{MS},c}(m_c^2) = m_c` is sitting. diff --git a/poetry.lock b/poetry.lock index fc0504481..adeffd516 100644 --- a/poetry.lock +++ b/poetry.lock @@ -24,7 +24,7 @@ python-versions = "*" [[package]] name = "appnope" -version = "0.1.2" +version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" category = "main" optional = true @@ -32,7 +32,7 @@ python-versions = "*" [[package]] name = "astroid" -version = "2.9.3" +version = "2.11.5" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false @@ -41,7 +41,7 @@ python-versions = ">=3.6.2" [package.dependencies] lazy-object-proxy = ">=1.4.0" typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} -wrapt = ">=1.11,<1.14" +wrapt = ">=1.11,<2" [[package]] name = "asttokens" @@ -57,6 +57,20 @@ six = "*" [package.extras] test = ["astroid", "pytest"] +[[package]] +name = "asv" +version = "0.4.2" +description = "Airspeed Velocity: A simple Python history benchmarking tool" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +six = ">=1.4" + +[package.extras] +hg = ["python-hglib (>=1.5)"] + [[package]] name = "atomicwrites" version = "1.4.0" @@ -81,11 +95,11 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "babel" -version = "2.9.1" +version = "2.10.1" description = "Internationalization utilities" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] pytz = ">=2015.7" @@ -100,7 +114,7 @@ python-versions = "*" [[package]] name = "banana-hep" -version = "0.6.4" +version = "0.6.5" description = "Benchmark QCD physics" category = "main" optional = true @@ -150,11 +164,11 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.4" +version = "8.1.3" description = "Composable command line interface toolkit" category = "main" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -208,6 +222,17 @@ category = "main" optional = true python-versions = ">=3.5" +[[package]] +name = "dill" +version = "0.3.4" +description = "serialize all of python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*" + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + [[package]] name = "distlib" version = "0.3.4" @@ -258,19 +283,20 @@ testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-co [[package]] name = "fonttools" -version = "4.29.1" +version = "4.33.3" description = "Tools to manipulate font files" category = "main" optional = true python-versions = ">=3.7" [package.extras] -all = ["fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "zopfli (>=0.1.4)", "lz4 (>=1.7.4.2)", "matplotlib", "sympy", "skia-pathops (>=0.5.0)", "brotlicffi (>=0.8.0)", "scipy", "brotli (>=1.0.1)", "munkres", "unicodedata2 (>=14.0.0)", "xattr"] +all = ["fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "zopfli (>=0.1.4)", "lz4 (>=1.7.4.2)", "matplotlib", "sympy", "skia-pathops (>=0.5.0)", "uharfbuzz (>=0.23.0)", "brotlicffi (>=0.8.0)", "scipy", "brotli (>=1.0.1)", "munkres", "unicodedata2 (>=14.0.0)", "xattr"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["scipy", "munkres"] lxml = ["lxml (>=4.0,<5)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] @@ -290,7 +316,7 @@ docs = ["sphinx"] [[package]] name = "identify" -version = "2.4.11" +version = "2.5.0" description = "File identification library for Python" category = "dev" optional = false @@ -317,7 +343,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "4.11.2" +version = "4.11.3" description = "Read metadata from Python packages" category = "main" optional = false @@ -341,7 +367,7 @@ python-versions = "*" [[package]] name = "ipython" -version = "8.1.1" +version = "8.3.0" description = "IPython: Productive Interactive Computing" category = "main" optional = true @@ -362,7 +388,7 @@ stack-data = "*" traitlets = ">=5" [package.extras] -all = ["black", "Sphinx (>=1.3)", "ipykernel", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.19)", "pandas", "pytest", "testpath", "trio", "pytest-asyncio"] +all = ["black", "Sphinx (>=1.3)", "ipykernel", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.19)", "pandas", "trio"] black = ["black"] doc = ["Sphinx (>=1.3)"] kernel = ["ipykernel"] @@ -371,8 +397,8 @@ nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest", "pytest-asyncio", "testpath"] -test_extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.19)", "pandas", "pytest", "testpath", "trio"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.19)", "pandas", "trio"] [[package]] name = "isort" @@ -405,11 +431,11 @@ testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.0.3" +version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] MarkupSafe = ">=2.0" @@ -419,7 +445,7 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "kiwisolver" -version = "1.3.2" +version = "1.4.2" description = "A fast implementation of the Cassowary constraint solver" category = "main" optional = true @@ -467,7 +493,7 @@ tests = ["pytest (!=3.3.0)", "psutil", "pytest-cov"] [[package]] name = "markupsafe" -version = "2.1.0" +version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false @@ -475,7 +501,7 @@ python-versions = ">=3.7" [[package]] name = "matplotlib" -version = "3.5.1" +version = "3.5.2" description = "Python plotting package" category = "main" optional = true @@ -505,11 +531,11 @@ traitlets = "*" [[package]] name = "mccabe" -version = "0.6.1" +version = "0.7.0" description = "McCabe checker, plugin for flake8" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "nodeenv" @@ -533,7 +559,7 @@ numpy = ">=1.18,<1.22" [[package]] name = "numpy" -version = "1.21.5" +version = "1.21.6" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false @@ -552,7 +578,7 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pandas" -version = "1.4.1" +version = "1.4.2" description = "Powerful data structures for data analysis, time series, and statistics" category = "main" optional = true @@ -633,23 +659,27 @@ python-versions = "*" [[package]] name = "pillow" -version = "9.0.1" +version = "9.1.0" description = "Python Imaging Library (Fork)" category = "main" optional = true python-versions = ">=3.7" +[package.extras] +docs = ["olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinx-rtd-theme (>=1.0)", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -665,11 +695,11 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "2.17.0" +version = "2.19.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7" [package.dependencies] cfgv = ">=2.0.0" @@ -681,7 +711,7 @@ virtualenv = ">=20.0.8" [[package]] name = "prompt-toolkit" -version = "3.0.28" +version = "3.0.29" description = "Library for building powerful interactive command lines in Python" category = "main" optional = true @@ -747,39 +777,43 @@ pybtex = ">=0.16" [[package]] name = "pygments" -version = "2.11.2" +version = "2.12.0" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "pylint" -version = "2.12.2" +version = "2.13.8" description = "python code static checker" category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -astroid = ">=2.9.0,<2.10" +astroid = ">=2.11.3,<=2.12.0-dev0" colorama = {version = "*", markers = "sys_platform == \"win32\""} +dill = ">=0.2" isort = ">=4.2.5,<6" -mccabe = ">=0.6,<0.7" +mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" -toml = ">=0.9.2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} +[package.extras] +testutil = ["gitpython (>3)"] + [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.8" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pyreadline" @@ -857,7 +891,7 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2021.3" +version = "2022.1" description = "World timezone definitions, modern and historical" category = "main" optional = false @@ -958,7 +992,7 @@ python-versions = "*" [[package]] name = "sphinx" -version = "4.4.0" +version = "4.5.0" description = "Python documentation generator" category = "main" optional = false @@ -1017,7 +1051,7 @@ test = ["pytest"] [[package]] name = "sphinxcontrib-bibtex" -version = "2.4.1" +version = "2.4.2" description = "Sphinx extension for BibTeX style citations." category = "main" optional = false @@ -1025,7 +1059,7 @@ python-versions = ">=3.6" [package.dependencies] docutils = ">=0.8" -pybtex = ">=0.20" +pybtex = ">=0.24" pybtex-docutils = ">=1.0.0" Sphinx = ">=2.1" @@ -1090,7 +1124,7 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "1.4.32" +version = "1.4.36" description = "Database Abstraction Library" category = "main" optional = true @@ -1103,7 +1137,7 @@ greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platfo aiomysql = ["greenlet (!=0.4.17)", "aiomysql"] aiosqlite = ["typing_extensions (!=3.10.0.1)", "greenlet (!=0.4.17)", "aiosqlite"] asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3)"] +asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3,!=0.2.4)"] mariadb_connector = ["mariadb (>=1.0.1)"] mssql = ["pyodbc"] mssql_pymssql = ["pymssql"] @@ -1165,28 +1199,28 @@ test = ["pytest"] [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "urllib3" -version = "1.26.8" +version = "1.26.9" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.13.3" +version = "20.14.1" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -1220,7 +1254,7 @@ python-versions = "*" [[package]] name = "wrapt" -version = "1.13.3" +version = "1.14.1" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false @@ -1228,15 +1262,15 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "zipp" -version = "3.7.0" +version = "3.8.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [extras] box = ["banana-hep", "sqlalchemy", "pandas", "matplotlib"] @@ -1246,7 +1280,7 @@ mark = ["banana-hep", "sqlalchemy", "pandas", "matplotlib"] [metadata] lock-version = "1.1" python-versions = "^3.8,<3.11" -content-hash = "59deb666ca547633026cedb1a6ef346c95da7e29168c026881b42da5cb0ea983" +content-hash = "9b8ab0d99343d12eddf300d550a5a33aa7e747cc19b7a03e5bcbbbed0f1cd211" [metadata.files] a3b2bbc3ced97675ac3a71df45f55ba = [ @@ -1267,17 +1301,20 @@ appdirs = [ {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, ] appnope = [ - {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, - {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, ] astroid = [ - {file = "astroid-2.9.3-py3-none-any.whl", hash = "sha256:506daabe5edffb7e696ad82483ad0228245a9742ed7d2d8c9cdb31537decf9f6"}, - {file = "astroid-2.9.3.tar.gz", hash = "sha256:1efdf4e867d4d8ba4a9f6cf9ce07cd182c4c41de77f23814feb27ca93ca9d877"}, + {file = "astroid-2.11.5-py3-none-any.whl", hash = "sha256:14ffbb4f6aa2cf474a0834014005487f7ecd8924996083ab411e7fa0b508ce0b"}, + {file = "astroid-2.11.5.tar.gz", hash = "sha256:f4e4ec5294c4b07ac38bab9ca5ddd3914d4bf46f9006eb5c0ae755755061044e"}, ] asttokens = [ {file = "asttokens-2.0.5-py2.py3-none-any.whl", hash = "sha256:0844691e88552595a6f4a4281a9f7f79b8dd45ca4ccea82e5e05b4bbdb76705c"}, {file = "asttokens-2.0.5.tar.gz", hash = "sha256:9a54c114f02c7a9480d56550932546a3f1fe71d8a02f1bc7ccd0ee3ee35cf4d5"}, ] +asv = [ + {file = "asv-0.4.2.tar.gz", hash = "sha256:9134f56b7a2f465420f17b5bb0dee16047a70f01029c996b7ab3f197de2d0779"}, +] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -1287,16 +1324,16 @@ attrs = [ {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, ] babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, + {file = "Babel-2.10.1-py3-none-any.whl", hash = "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2"}, + {file = "Babel-2.10.1.tar.gz", hash = "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"}, ] backcall = [ {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] banana-hep = [ - {file = "banana-hep-0.6.4.tar.gz", hash = "sha256:e642946fad9545e1aec0a8108b0d31deb01b8f0d50411951f323123c4da75c2e"}, - {file = "banana_hep-0.6.4-py3-none-any.whl", hash = "sha256:9e02874b135e900244fe8c007d192844cccb1191eb07ed949c9e229524365b07"}, + {file = "banana-hep-0.6.5.tar.gz", hash = "sha256:748923aae41d5be0e117516698e523935d5f68146b53a8565372c7489137b0f1"}, + {file = "banana_hep-0.6.5-py3-none-any.whl", hash = "sha256:6a8da394b0492cdd11f454a73c81727aff1bc96b206f1ca109cecdd087b980cd"}, ] certifi = [ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, @@ -1311,8 +1348,8 @@ charset-normalizer = [ {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1373,6 +1410,10 @@ decorator = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +dill = [ + {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"}, + {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"}, +] distlib = [ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, @@ -1394,8 +1435,8 @@ filelock = [ {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, ] fonttools = [ - {file = "fonttools-4.29.1-py3-none-any.whl", hash = "sha256:1933415e0fbdf068815cb1baaa1f159e17830215f7e8624e5731122761627557"}, - {file = "fonttools-4.29.1.zip", hash = "sha256:2b18a172120e32128a80efee04cff487d5d140fe7d817deb648b2eee023a40e4"}, + {file = "fonttools-4.33.3-py3-none-any.whl", hash = "sha256:f829c579a8678fa939a1d9e9894d01941db869de44390adb49ce67055a06cc2a"}, + {file = "fonttools-4.33.3.zip", hash = "sha256:c0fdcfa8ceebd7c1b2021240bd46ef77aa8e7408cf10434be55df52384865f8e"}, ] greenlet = [ {file = "greenlet-1.1.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6"}, @@ -1450,8 +1491,8 @@ greenlet = [ {file = "greenlet-1.1.2.tar.gz", hash = "sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a"}, ] identify = [ - {file = "identify-2.4.11-py2.py3-none-any.whl", hash = "sha256:fd906823ed1db23c7a48f9b176a1d71cb8abede1e21ebe614bac7bdd688d9213"}, - {file = "identify-2.4.11.tar.gz", hash = "sha256:2986942d3974c8f2e5019a190523b0b0e2a07cb8e89bf236727fb4b26f27f8fd"}, + {file = "identify-2.5.0-py2.py3-none-any.whl", hash = "sha256:3acfe15a96e4272b4ec5662ee3e231ceba976ef63fd9980ed2ce9cc415df393f"}, + {file = "identify-2.5.0.tar.gz", hash = "sha256:c83af514ea50bf2be2c4a3f2fb349442b59dc87284558ae9ff54191bff3541d2"}, ] idna = [ {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, @@ -1462,16 +1503,16 @@ imagesize = [ {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.11.2-py3-none-any.whl", hash = "sha256:d16e8c1deb60de41b8e8ed21c1a7b947b0bc62fab7e1d470bcdf331cea2e6735"}, - {file = "importlib_metadata-4.11.2.tar.gz", hash = "sha256:b36ffa925fe3139b2f6ff11d6925ffd4fa7bc47870165e3ac260ac7b4f91e6ac"}, + {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, + {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] ipython = [ - {file = "ipython-8.1.1-py3-none-any.whl", hash = "sha256:6f56bfaeaa3247aa3b9cd3b8cbab3a9c0abf7428392f97b21902d12b2f42a381"}, - {file = "ipython-8.1.1.tar.gz", hash = "sha256:8138762243c9b3a3ffcf70b37151a2a35c23d3a29f9743878c33624f4207be3d"}, + {file = "ipython-8.3.0-py3-none-any.whl", hash = "sha256:341456643a764c28f670409bbd5d2518f9b82c013441084ff2c2fc999698f83b"}, + {file = "ipython-8.3.0.tar.gz", hash = "sha256:807ae3cf43b84693c9272f70368440a9a7eaa2e7e6882dad943c32fbf7e51402"}, ] isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, @@ -1482,54 +1523,53 @@ jedi = [ {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, ] jinja2 = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] kiwisolver = [ - {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6"}, - {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470"}, - {file = "kiwisolver-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4550a359c5157aaf8507e6820d98682872b9100ce7607f8aa070b4b8af6c298"}, - {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2210f28778c7d2ee13f3c2a20a3a22db889e75f4ec13a21072eabb5693801e84"}, - {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:82f49c5a79d3839bc8f38cb5f4bfc87e15f04cbafa5fbd12fb32c941cb529cfb"}, - {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9661a04ca3c950a8ac8c47f53cbc0b530bce1b52f516a1e87b7736fec24bfff0"}, - {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ddb500a2808c100e72c075cbb00bf32e62763c82b6a882d403f01a119e3f402"}, - {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72be6ebb4e92520b9726d7146bc9c9b277513a57a38efcf66db0620aec0097e0"}, - {file = "kiwisolver-1.3.2-cp310-cp310-win32.whl", hash = "sha256:83d2c9db5dfc537d0171e32de160461230eb14663299b7e6d18ca6dca21e4977"}, - {file = "kiwisolver-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:cba430db673c29376135e695c6e2501c44c256a81495da849e85d1793ee975ad"}, - {file = "kiwisolver-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4116ba9a58109ed5e4cb315bdcbff9838f3159d099ba5259c7c7fb77f8537492"}, - {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19554bd8d54cf41139f376753af1a644b63c9ca93f8f72009d50a2080f870f77"}, - {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a4cf5bbdc861987a7745aed7a536c6405256853c94abc9f3287c3fa401b174"}, - {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0007840186bacfaa0aba4466d5890334ea5938e0bb7e28078a0eb0e63b5b59d5"}, - {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec2eba188c1906b05b9b49ae55aae4efd8150c61ba450e6721f64620c50b59eb"}, - {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3dbb3cea20b4af4f49f84cffaf45dd5f88e8594d18568e0225e6ad9dec0e7967"}, - {file = "kiwisolver-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:5326ddfacbe51abf9469fe668944bc2e399181a2158cb5d45e1d40856b2a0589"}, - {file = "kiwisolver-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c6572c2dab23c86a14e82c245473d45b4c515314f1f859e92608dcafbd2f19b8"}, - {file = "kiwisolver-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b5074fb09429f2b7bc82b6fb4be8645dcbac14e592128beeff5461dcde0af09f"}, - {file = "kiwisolver-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:22521219ca739654a296eea6d4367703558fba16f98688bd8ce65abff36eaa84"}, - {file = "kiwisolver-1.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c358721aebd40c243894298f685a19eb0491a5c3e0b923b9f887ef1193ddf829"}, - {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ba5a1041480c6e0a8b11a9544d53562abc2d19220bfa14133e0cdd9967e97af"}, - {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44e6adf67577dbdfa2d9f06db9fbc5639afefdb5bf2b4dfec25c3a7fbc619536"}, - {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d45d1c74f88b9f41062716c727f78f2a59a5476ecbe74956fafb423c5c87a76"}, - {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70adc3658138bc77a36ce769f5f183169bc0a2906a4f61f09673f7181255ac9b"}, - {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6a5431940f28b6de123de42f0eb47b84a073ee3c3345dc109ad550a3307dd28"}, - {file = "kiwisolver-1.3.2-cp38-cp38-win32.whl", hash = "sha256:ee040a7de8d295dbd261ef2d6d3192f13e2b08ec4a954de34a6fb8ff6422e24c"}, - {file = "kiwisolver-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:8dc3d842fa41a33fe83d9f5c66c0cc1f28756530cd89944b63b072281e852031"}, - {file = "kiwisolver-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a498bcd005e8a3fedd0022bb30ee0ad92728154a8798b703f394484452550507"}, - {file = "kiwisolver-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80efd202108c3a4150e042b269f7c78643420cc232a0a771743bb96b742f838f"}, - {file = "kiwisolver-1.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f8eb7b6716f5b50e9c06207a14172cf2de201e41912ebe732846c02c830455b9"}, - {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f441422bb313ab25de7b3dbfd388e790eceb76ce01a18199ec4944b369017009"}, - {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:30fa008c172355c7768159983a7270cb23838c4d7db73d6c0f6b60dde0d432c6"}, - {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f8f6c8f4f1cff93ca5058d6ec5f0efda922ecb3f4c5fb76181f327decff98b8"}, - {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba677bcaff9429fd1bf01648ad0901cea56c0d068df383d5f5856d88221fe75b"}, - {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7843b1624d6ccca403a610d1277f7c28ad184c5aa88a1750c1a999754e65b439"}, - {file = "kiwisolver-1.3.2-cp39-cp39-win32.whl", hash = "sha256:e6f5eb2f53fac7d408a45fbcdeda7224b1cfff64919d0f95473420a931347ae9"}, - {file = "kiwisolver-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:eedd3b59190885d1ebdf6c5e0ca56828beb1949b4dfe6e5d0256a461429ac386"}, - {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dedc71c8eb9c5096037766390172c34fb86ef048b8e8958b4e484b9e505d66bc"}, - {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bf7eb45d14fc036514c09554bf983f2a72323254912ed0c3c8e697b62c4c158f"}, - {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b65bd35f3e06a47b5c30ea99e0c2b88f72c6476eedaf8cfbc8e66adb5479dcf"}, - {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25405f88a37c5f5bcba01c6e350086d65e7465fd1caaf986333d2a045045a223"}, - {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bcadb05c3d4794eb9eee1dddf1c24215c92fb7b55a80beae7a60530a91060560"}, - {file = "kiwisolver-1.3.2.tar.gz", hash = "sha256:fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c"}, + {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e395ece147f0692ca7cdb05a028d31b83b72c369f7b4a2c1798f4b96af1e3d8"}, + {file = "kiwisolver-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b7f50a1a25361da3440f07c58cd1d79957c2244209e4f166990e770256b6b0b"}, + {file = "kiwisolver-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c032c41ae4c3a321b43a3650e6ecc7406b99ff3e5279f24c9b310f41bc98479"}, + {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dcade8f6fe12a2bb4efe2cbe22116556e3b6899728d3b2a0d3b367db323eacc"}, + {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e45e780a74416ef2f173189ef4387e44b5494f45e290bcb1f03735faa6779bf"}, + {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d2bb56309fb75a811d81ed55fbe2208aa77a3a09ff5f546ca95e7bb5fac6eff"}, + {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b2d6c12f2ad5f55104a36a356192cfb680c049fe5e7c1f6620fc37f119cdc2"}, + {file = "kiwisolver-1.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:262c248c60f22c2b547683ad521e8a3db5909c71f679b93876921549107a0c24"}, + {file = "kiwisolver-1.4.2-cp310-cp310-win32.whl", hash = "sha256:1008346a7741620ab9cc6c96e8ad9b46f7a74ce839dbb8805ddf6b119d5fc6c2"}, + {file = "kiwisolver-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:6ece2e12e4b57bc5646b354f436416cd2a6f090c1dadcd92b0ca4542190d7190"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b978afdb913ca953cf128d57181da2e8798e8b6153be866ae2a9c446c6162f40"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f88c4b8e449908eeddb3bbd4242bd4dc2c7a15a7aa44bb33df893203f02dc2d"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e348f1904a4fab4153407f7ccc27e43b2a139752e8acf12e6640ba683093dd96"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c839bf28e45d7ddad4ae8f986928dbf5a6d42ff79760d54ec8ada8fb263e097c"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8ae5a071185f1a93777c79a9a1e67ac46544d4607f18d07131eece08d415083a"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c222f91a45da9e01a9bc4f760727ae49050f8e8345c4ff6525495f7a164c8973"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:a4e8f072db1d6fb7a7cc05a6dbef8442c93001f4bb604f1081d8c2db3ca97159"}, + {file = "kiwisolver-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:be9a650890fb60393e60aacb65878c4a38bb334720aa5ecb1c13d0dac54dd73b"}, + {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ec2e55bf31b43aabe32089125dca3b46fdfe9f50afbf0756ae11e14c97b80ca"}, + {file = "kiwisolver-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d1078ba770d6165abed3d9a1be1f9e79b61515de1dd00d942fa53bba79f01ae"}, + {file = "kiwisolver-1.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cbb5eb4a2ea1ffec26268d49766cafa8f957fe5c1b41ad00733763fae77f9436"}, + {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e6cda72db409eefad6b021e8a4f964965a629f577812afc7860c69df7bdb84a"}, + {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1605c7c38cc6a85212dfd6a641f3905a33412e49f7c003f35f9ac6d71f67720"}, + {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81237957b15469ea9151ec8ca08ce05656090ffabc476a752ef5ad7e2644c526"}, + {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:240009fdf4fa87844f805e23f48995537a8cb8f8c361e35fda6b5ac97fcb906f"}, + {file = "kiwisolver-1.4.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:240c2d51d098395c012ddbcb9bd7b3ba5de412a1d11840698859f51d0e643c4f"}, + {file = "kiwisolver-1.4.2-cp38-cp38-win32.whl", hash = "sha256:8b6086aa6936865962b2cee0e7aaecf01ab6778ce099288354a7229b4d9f1408"}, + {file = "kiwisolver-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:0d98dca86f77b851350c250f0149aa5852b36572514d20feeadd3c6b1efe38d0"}, + {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:91eb4916271655dfe3a952249cb37a5c00b6ba68b4417ee15af9ba549b5ba61d"}, + {file = "kiwisolver-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa4d97d7d2b2c082e67907c0b8d9f31b85aa5d3ba0d33096b7116f03f8061261"}, + {file = "kiwisolver-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:71469b5845b9876b8d3d252e201bef6f47bf7456804d2fbe9a1d6e19e78a1e65"}, + {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8ff3033e43e7ca1389ee59fb7ecb8303abb8713c008a1da49b00869e92e3dd7c"}, + {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89b57c2984f4464840e4b768affeff6b6809c6150d1166938ade3e22fbe22db8"}, + {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffbdb9a96c536f0405895b5e21ee39ec579cb0ed97bdbd169ae2b55f41d73219"}, + {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a830a03970c462d1a2311c90e05679da56d3bd8e78a4ba9985cb78ef7836c9f"}, + {file = "kiwisolver-1.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f74f2a13af201559e3d32b9ddfc303c94ae63d63d7f4326d06ce6fe67e7a8255"}, + {file = "kiwisolver-1.4.2-cp39-cp39-win32.whl", hash = "sha256:e677cc3626287f343de751e11b1e8a5b915a6ac897e8aecdbc996cd34de753a0"}, + {file = "kiwisolver-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b3e251e5c38ac623c5d786adb21477f018712f8c6fa54781bd38aa1c60b60fc2"}, + {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c380bb5ae20d829c1a5473cfcae64267b73aaa4060adc091f6df1743784aae0"}, + {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:484f2a5f0307bc944bc79db235f41048bae4106ffa764168a068d88b644b305d"}, + {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8afdf533b613122e4bbaf3c1e42c2a5e9e2d1dd3a0a017749a7658757cb377"}, + {file = "kiwisolver-1.4.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42f6ef9b640deb6f7d438e0a371aedd8bef6ddfde30683491b2e6f568b4e884e"}, + {file = "kiwisolver-1.4.2.tar.gz", hash = "sha256:7f606d91b8a8816be476513a77fd30abe66227039bd6f8b406c348cb0247dcc9"}, ] latexcodec = [ {file = "latexcodec-2.0.1-py2.py3-none-any.whl", hash = "sha256:c277a193638dc7683c4c30f6684e3db728a06efb0dc9cf346db8bd0aa6c5d271"}, @@ -1625,91 +1665,91 @@ lz4 = [ {file = "lz4-3.1.10.tar.gz", hash = "sha256:439e575ecfa9ecffcbd63cfed99baefbe422ab9645b1e82278024d8a21d9720b"}, ] markupsafe = [ - {file = "MarkupSafe-2.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3028252424c72b2602a323f70fbf50aa80a5d3aa616ea6add4ba21ae9cc9da4c"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:290b02bab3c9e216da57c1d11d2ba73a9f73a614bbdcc027d299a60cdfabb11a"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e104c0c2b4cd765b4e83909cde7ec61a1e313f8a75775897db321450e928cce"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24c3be29abb6b34052fd26fc7a8e0a49b1ee9d282e3665e8ad09a0a68faee5b3"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204730fd5fe2fe3b1e9ccadb2bd18ba8712b111dcabce185af0b3b5285a7c989"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d3b64c65328cb4cd252c94f83e66e3d7acf8891e60ebf588d7b493a55a1dbf26"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:96de1932237abe0a13ba68b63e94113678c379dca45afa040a17b6e1ad7ed076"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75bb36f134883fdbe13d8e63b8675f5f12b80bb6627f7714c7d6c5becf22719f"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-win32.whl", hash = "sha256:4056f752015dfa9828dce3140dbadd543b555afb3252507348c493def166d454"}, - {file = "MarkupSafe-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:d4e702eea4a2903441f2735799d217f4ac1b55f7d8ad96ab7d4e25417cb0827c"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f0eddfcabd6936558ec020130f932d479930581171368fd728efcfb6ef0dd357"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddea4c352a488b5e1069069f2f501006b1a4362cb906bee9a193ef1245a7a61"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09c86c9643cceb1d87ca08cdc30160d1b7ab49a8a21564868921959bd16441b8"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0a0abef2ca47b33fb615b491ce31b055ef2430de52c5b3fb19a4042dbc5cadb"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:736895a020e31b428b3382a7887bfea96102c529530299f426bf2e636aacec9e"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:679cbb78914ab212c49c67ba2c7396dc599a8479de51b9a87b174700abd9ea49"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:84ad5e29bf8bab3ad70fd707d3c05524862bddc54dc040982b0dbcff36481de7"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-win32.whl", hash = "sha256:8da5924cb1f9064589767b0f3fc39d03e3d0fb5aa29e0cb21d43106519bd624a"}, - {file = "MarkupSafe-2.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:454ffc1cbb75227d15667c09f164a0099159da0c1f3d2636aa648f12675491ad"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:142119fb14a1ef6d758912b25c4e803c3ff66920635c44078666fe7cc3f8f759"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b2a5a856019d2833c56a3dcac1b80fe795c95f401818ea963594b345929dffa7"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d1fb9b2eec3c9714dd936860850300b51dbaa37404209c8d4cb66547884b7ed"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62c0285e91414f5c8f621a17b69fc0088394ccdaa961ef469e833dbff64bd5ea"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc3150f85e2dbcf99e65238c842d1cfe69d3e7649b19864c1cc043213d9cd730"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f02cf7221d5cd915d7fa58ab64f7ee6dd0f6cddbb48683debf5d04ae9b1c2cc1"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5653619b3eb5cbd35bfba3c12d575db2a74d15e0e1c08bf1db788069d410ce8"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d2f5d97fcbd004c03df8d8fe2b973fe2b14e7bfeb2cfa012eaa8759ce9a762f"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-win32.whl", hash = "sha256:3cace1837bc84e63b3fd2dfce37f08f8c18aeb81ef5cf6bb9b51f625cb4e6cd8"}, - {file = "MarkupSafe-2.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:fabbe18087c3d33c5824cb145ffca52eccd053061df1d79d4b66dafa5ad2a5ea"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:023af8c54fe63530545f70dd2a2a7eed18d07a9a77b94e8bf1e2ff7f252db9a3"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d66624f04de4af8bbf1c7f21cc06649c1c69a7f84109179add573ce35e46d448"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c532d5ab79be0199fa2658e24a02fce8542df196e60665dd322409a03db6a52c"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ec74fada3841b8c5f4c4f197bea916025cb9aa3fe5abf7d52b655d042f956"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c653fde75a6e5eb814d2a0a89378f83d1d3f502ab710904ee585c38888816c"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:961eb86e5be7d0973789f30ebcf6caab60b844203f4396ece27310295a6082c7"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:598b65d74615c021423bd45c2bc5e9b59539c875a9bdb7e5f2a6b92dfcfc268d"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:599941da468f2cf22bf90a84f6e2a65524e87be2fce844f96f2dd9a6c9d1e635"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-win32.whl", hash = "sha256:e6f7f3f41faffaea6596da86ecc2389672fa949bd035251eab26dc6697451d05"}, - {file = "MarkupSafe-2.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:b8811d48078d1cf2a6863dafb896e68406c5f513048451cd2ded0473133473c7"}, - {file = "MarkupSafe-2.1.0.tar.gz", hash = "sha256:80beaf63ddfbc64a0452b841d8036ca0611e049650e20afcb882f5d3c266d65f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, ] matplotlib = [ - {file = "matplotlib-3.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:456cc8334f6d1124e8ff856b42d2cc1c84335375a16448189999496549f7182b"}, - {file = "matplotlib-3.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8a77906dc2ef9b67407cec0bdbf08e3971141e535db888974a915be5e1e3efc6"}, - {file = "matplotlib-3.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e70ae6475cfd0fad3816dcbf6cac536dc6f100f7474be58d59fa306e6e768a4"}, - {file = "matplotlib-3.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53273c5487d1c19c3bc03b9eb82adaf8456f243b97ed79d09dded747abaf1235"}, - {file = "matplotlib-3.5.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3b6f3fd0d8ca37861c31e9a7cab71a0ef14c639b4c95654ea1dd153158bf0df"}, - {file = "matplotlib-3.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8c87cdaf06fd7b2477f68909838ff4176f105064a72ca9d24d3f2a29f73d393"}, - {file = "matplotlib-3.5.1-cp310-cp310-win32.whl", hash = "sha256:e2f28a07b4f82abb40267864ad7b3a4ed76f1b1663e81c7efc84a9b9248f672f"}, - {file = "matplotlib-3.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:d70a32ee1f8b55eed3fd4e892f0286df8cccc7e0475c11d33b5d0a148f5c7599"}, - {file = "matplotlib-3.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:68fa30cec89b6139dc559ed6ef226c53fd80396da1919a1b5ef672c911aaa767"}, - {file = "matplotlib-3.5.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e3484d8455af3fdb0424eae1789af61f6a79da0c80079125112fd5c1b604218"}, - {file = "matplotlib-3.5.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e293b16cf303fe82995e41700d172a58a15efc5331125d08246b520843ef21ee"}, - {file = "matplotlib-3.5.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e3520a274a0e054e919f5b3279ee5dbccf5311833819ccf3399dab7c83e90a25"}, - {file = "matplotlib-3.5.1-cp37-cp37m-win32.whl", hash = "sha256:2252bfac85cec7af4a67e494bfccf9080bcba8a0299701eab075f48847cca907"}, - {file = "matplotlib-3.5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf67e05a1b7f86583f6ebd01f69b693b9c535276f4e943292e444855870a1b8"}, - {file = "matplotlib-3.5.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6c094e4bfecd2fa7f9adffd03d8abceed7157c928c2976899de282f3600f0a3d"}, - {file = "matplotlib-3.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:506b210cc6e66a0d1c2bb765d055f4f6bc2745070fb1129203b67e85bbfa5c18"}, - {file = "matplotlib-3.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b04fc29bcef04d4e2d626af28d9d892be6aba94856cb46ed52bcb219ceac8943"}, - {file = "matplotlib-3.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:577ed20ec9a18d6bdedb4616f5e9e957b4c08563a9f985563a31fd5b10564d2a"}, - {file = "matplotlib-3.5.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e486f60db0cd1c8d68464d9484fd2a94011c1ac8593d765d0211f9daba2bd535"}, - {file = "matplotlib-3.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b71f3a7ca935fc759f2aed7cec06cfe10bc3100fadb5dbd9c435b04e557971e1"}, - {file = "matplotlib-3.5.1-cp38-cp38-win32.whl", hash = "sha256:d24e5bb8028541ce25e59390122f5e48c8506b7e35587e5135efcb6471b4ac6c"}, - {file = "matplotlib-3.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:778d398c4866d8e36ee3bf833779c940b5f57192fa0a549b3ad67bc4c822771b"}, - {file = "matplotlib-3.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bb1c613908f11bac270bc7494d68b1ef6e7c224b7a4204d5dacf3522a41e2bc3"}, - {file = "matplotlib-3.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:edf5e4e1d5fb22c18820e8586fb867455de3b109c309cb4fce3aaed85d9468d1"}, - {file = "matplotlib-3.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:40e0d7df05e8efe60397c69b467fc8f87a2affeb4d562fe92b72ff8937a2b511"}, - {file = "matplotlib-3.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a350ca685d9f594123f652ba796ee37219bf72c8e0fc4b471473d87121d6d34"}, - {file = "matplotlib-3.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3e66497cd990b1a130e21919b004da2f1dc112132c01ac78011a90a0f9229778"}, - {file = "matplotlib-3.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:87900c67c0f1728e6db17c6809ec05c025c6624dcf96a8020326ea15378fe8e7"}, - {file = "matplotlib-3.5.1-cp39-cp39-win32.whl", hash = "sha256:b8a4fb2a0c5afbe9604f8a91d7d0f27b1832c3e0b5e365f95a13015822b4cd65"}, - {file = "matplotlib-3.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:fe8d40c434a8e2c68d64c6d6a04e77f21791a93ff6afe0dce169597c110d3079"}, - {file = "matplotlib-3.5.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34a1fc29f8f96e78ec57a5eff5e8d8b53d3298c3be6df61e7aa9efba26929522"}, - {file = "matplotlib-3.5.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b19a761b948e939a9e20173aaae76070025f0024fc8f7ba08bef22a5c8573afc"}, - {file = "matplotlib-3.5.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6803299cbf4665eca14428d9e886de62e24f4223ac31ab9c5d6d5339a39782c7"}, - {file = "matplotlib-3.5.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:14334b9902ec776461c4b8c6516e26b450f7ebe0b3ef8703bf5cdfbbaecf774a"}, - {file = "matplotlib-3.5.1.tar.gz", hash = "sha256:b2e9810e09c3a47b73ce9cab5a72243a1258f61e7900969097a817232246ce1c"}, + {file = "matplotlib-3.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:03bbb3f5f78836855e127b5dab228d99551ad0642918ccbf3067fcd52ac7ac5e"}, + {file = "matplotlib-3.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49a5938ed6ef9dda560f26ea930a2baae11ea99e1c2080c8714341ecfda72a89"}, + {file = "matplotlib-3.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:77157be0fc4469cbfb901270c205e7d8adb3607af23cef8bd11419600647ceed"}, + {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5844cea45d804174bf0fac219b4ab50774e504bef477fc10f8f730ce2d623441"}, + {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c87973ddec10812bddc6c286b88fdd654a666080fbe846a1f7a3b4ba7b11ab78"}, + {file = "matplotlib-3.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a05f2b37222319753a5d43c0a4fd97ed4ff15ab502113e3f2625c26728040cf"}, + {file = "matplotlib-3.5.2-cp310-cp310-win32.whl", hash = "sha256:9776e1a10636ee5f06ca8efe0122c6de57ffe7e8c843e0fb6e001e9d9256ec95"}, + {file = "matplotlib-3.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:b4fedaa5a9aa9ce14001541812849ed1713112651295fdddd640ea6620e6cf98"}, + {file = "matplotlib-3.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ee175a571e692fc8ae8e41ac353c0e07259113f4cb063b0ec769eff9717e84bb"}, + {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e8bda1088b941ead50caabd682601bece983cadb2283cafff56e8fcddbf7d7f"}, + {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9480842d5aadb6e754f0b8f4ebeb73065ac8be1855baa93cd082e46e770591e9"}, + {file = "matplotlib-3.5.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6c623b355d605a81c661546af7f24414165a8a2022cddbe7380a31a4170fa2e9"}, + {file = "matplotlib-3.5.2-cp37-cp37m-win32.whl", hash = "sha256:a91426ae910819383d337ba0dc7971c7cefdaa38599868476d94389a329e599b"}, + {file = "matplotlib-3.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c4b82c2ae6d305fcbeb0eb9c93df2602ebd2f174f6e8c8a5d92f9445baa0c1d3"}, + {file = "matplotlib-3.5.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ebc27ad11df3c1661f4677a7762e57a8a91dd41b466c3605e90717c9a5f90c82"}, + {file = "matplotlib-3.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a32ea6e12e80dedaca2d4795d9ed40f97bfa56e6011e14f31502fdd528b9c89"}, + {file = "matplotlib-3.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a0967d4156adbd0d46db06bc1a877f0370bce28d10206a5071f9ecd6dc60b79"}, + {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2b696699386766ef171a259d72b203a3c75d99d03ec383b97fc2054f52e15cf"}, + {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f409716119fa39b03da3d9602bd9b41142fab7a0568758cd136cd80b1bf36c8"}, + {file = "matplotlib-3.5.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b8d3f4e71e26307e8c120b72c16671d70c5cd08ae412355c11254aa8254fb87f"}, + {file = "matplotlib-3.5.2-cp38-cp38-win32.whl", hash = "sha256:b6c63cd01cad0ea8704f1fd586e9dc5777ccedcd42f63cbbaa3eae8dd41172a1"}, + {file = "matplotlib-3.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:75c406c527a3aa07638689586343f4b344fcc7ab1f79c396699eb550cd2b91f7"}, + {file = "matplotlib-3.5.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4a44cdfdb9d1b2f18b1e7d315eb3843abb097869cd1ef89cfce6a488cd1b5182"}, + {file = "matplotlib-3.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d8e129af95b156b41cb3be0d9a7512cc6d73e2b2109f82108f566dbabdbf377"}, + {file = "matplotlib-3.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:364e6bca34edc10a96aa3b1d7cd76eb2eea19a4097198c1b19e89bee47ed5781"}, + {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea75df8e567743207e2b479ba3d8843537be1c146d4b1e3e395319a4e1a77fe9"}, + {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:44c6436868186564450df8fd2fc20ed9daaef5caad699aa04069e87099f9b5a8"}, + {file = "matplotlib-3.5.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d7705022df2c42bb02937a2a824f4ec3cca915700dd80dc23916af47ff05f1a"}, + {file = "matplotlib-3.5.2-cp39-cp39-win32.whl", hash = "sha256:ee0b8e586ac07f83bb2950717e66cb305e2859baf6f00a9c39cc576e0ce9629c"}, + {file = "matplotlib-3.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:c772264631e5ae61f0bd41313bbe48e1b9bcc95b974033e1118c9caa1a84d5c6"}, + {file = "matplotlib-3.5.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:751d3815b555dcd6187ad35b21736dc12ce6925fc3fa363bbc6dc0f86f16484f"}, + {file = "matplotlib-3.5.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:31fbc2af27ebb820763f077ec7adc79b5a031c2f3f7af446bd7909674cd59460"}, + {file = "matplotlib-3.5.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4fa28ca76ac5c2b2d54bc058b3dad8e22ee85d26d1ee1b116a6fd4d2277b6a04"}, + {file = "matplotlib-3.5.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:24173c23d1bcbaed5bf47b8785d27933a1ac26a5d772200a0f3e0e38f471b001"}, + {file = "matplotlib-3.5.2.tar.gz", hash = "sha256:48cf850ce14fa18067f2d9e0d646763681948487a8080ec0af2686468b4607a2"}, ] matplotlib-inline = [ {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, ] mccabe = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] nodeenv = [ {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, @@ -1743,63 +1783,64 @@ numba = [ {file = "numba-0.55.1.tar.gz", hash = "sha256:03e9069a2666d1c84f93b00dbd716fb8fedde8bb2c6efafa2f04842a46442ea3"}, ] numpy = [ - {file = "numpy-1.21.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:301e408a052fdcda5cdcf03021ebafc3c6ea093021bf9d1aa47c54d48bdad166"}, - {file = "numpy-1.21.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7e8f6216f180f3fd4efb73de5d1eaefb5f5a1ee5b645c67333033e39440e63a"}, - {file = "numpy-1.21.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc7a7d7b0ed72589fd8b8486b9b42a564f10b8762be8bd4d9df94b807af4a089"}, - {file = "numpy-1.21.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58ca1d7c8aef6e996112d0ce873ac9dfa1eaf4a1196b4ff7ff73880a09923ba7"}, - {file = "numpy-1.21.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4b2fb01f1b4ddbe2453468ea0719f4dbb1f5caa712c8b21bb3dd1480cd30d9"}, - {file = "numpy-1.21.5-cp310-cp310-win_amd64.whl", hash = "sha256:cc1b30205d138d1005adb52087ff45708febbef0e420386f58664f984ef56954"}, - {file = "numpy-1.21.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:08de8472d9f7571f9d51b27b75e827f5296295fa78817032e84464be8bb905bc"}, - {file = "numpy-1.21.5-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4fe6a006557b87b352c04596a6e3f12a57d6e5f401d804947bd3188e6b0e0e76"}, - {file = "numpy-1.21.5-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3d893b0871322eaa2f8c7072cdb552d8e2b27645b7875a70833c31e9274d4611"}, - {file = "numpy-1.21.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:341dddcfe3b7b6427a28a27baa59af5ad51baa59bfec3264f1ab287aa3b30b13"}, - {file = "numpy-1.21.5-cp37-cp37m-win32.whl", hash = "sha256:ca9c23848292c6fe0a19d212790e62f398fd9609aaa838859be8459bfbe558aa"}, - {file = "numpy-1.21.5-cp37-cp37m-win_amd64.whl", hash = "sha256:025b497014bc33fc23897859350f284323f32a2fff7654697f5a5fc2a19e9939"}, - {file = "numpy-1.21.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a5098df115340fb17fc93867317a947e1dcd978c3888c5ddb118366095851f8"}, - {file = "numpy-1.21.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:311283acf880cfcc20369201bd75da907909afc4666966c7895cbed6f9d2c640"}, - {file = "numpy-1.21.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b545ebadaa2b878c8630e5bcdb97fc4096e779f335fc0f943547c1c91540c815"}, - {file = "numpy-1.21.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c5562bcc1a9b61960fc8950ade44d00e3de28f891af0acc96307c73613d18f6e"}, - {file = "numpy-1.21.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eed2afaa97ec33b4411995be12f8bdb95c87984eaa28d76cf628970c8a2d689a"}, - {file = "numpy-1.21.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61bada43d494515d5b122f4532af226fdb5ee08fe5b5918b111279843dc6836a"}, - {file = "numpy-1.21.5-cp38-cp38-win32.whl", hash = "sha256:7b9d6b14fc9a4864b08d1ba57d732b248f0e482c7b2ff55c313137e3ed4d8449"}, - {file = "numpy-1.21.5-cp38-cp38-win_amd64.whl", hash = "sha256:dbce7adeb66b895c6aaa1fad796aaefc299ced597f6fbd9ceddb0dd735245354"}, - {file = "numpy-1.21.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:507c05c7a37b3683eb08a3ff993bd1ee1e6c752f77c2f275260533b265ecdb6c"}, - {file = "numpy-1.21.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:00c9fa73a6989895b8815d98300a20ac993c49ac36c8277e8ffeaa3631c0dbbb"}, - {file = "numpy-1.21.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69a5a8d71c308d7ef33ef72371c2388a90e3495dbb7993430e674006f94797d5"}, - {file = "numpy-1.21.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2d8adfca843bc46ac199a4645233f13abf2011a0b2f4affc5c37cd552626f27b"}, - {file = "numpy-1.21.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c293d3c0321996cd8ffe84215ffe5d269fd9d1d12c6f4ffe2b597a7c30d3e593"}, - {file = "numpy-1.21.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c978544be9e04ed12016dd295a74283773149b48f507d69b36f91aa90a643e5"}, - {file = "numpy-1.21.5-cp39-cp39-win32.whl", hash = "sha256:2a9add27d7fc0fdb572abc3b2486eb3b1395da71e0254c5552b2aad2a18b5441"}, - {file = "numpy-1.21.5-cp39-cp39-win_amd64.whl", hash = "sha256:1964db2d4a00348b7a60ee9d013c8cb0c566644a589eaa80995126eac3b99ced"}, - {file = "numpy-1.21.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a7c4b701ca418cd39e28ec3b496e6388fe06de83f5f0cb74794fa31cfa384c02"}, - {file = "numpy-1.21.5.zip", hash = "sha256:6a5928bc6241264dce5ed509e66f33676fc97f464e7a919edc672fb5532221ee"}, + {file = "numpy-1.21.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8737609c3bbdd48e380d463134a35ffad3b22dc56295eff6f79fd85bd0eeeb25"}, + {file = "numpy-1.21.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fdffbfb6832cd0b300995a2b08b8f6fa9f6e856d562800fea9182316d99c4e8e"}, + {file = "numpy-1.21.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3820724272f9913b597ccd13a467cc492a0da6b05df26ea09e78b171a0bb9da6"}, + {file = "numpy-1.21.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f17e562de9edf691a42ddb1eb4a5541c20dd3f9e65b09ded2beb0799c0cf29bb"}, + {file = "numpy-1.21.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f30427731561ce75d7048ac254dbe47a2ba576229250fb60f0fb74db96501a1"}, + {file = "numpy-1.21.6-cp310-cp310-win32.whl", hash = "sha256:d4bf4d43077db55589ffc9009c0ba0a94fa4908b9586d6ccce2e0b164c86303c"}, + {file = "numpy-1.21.6-cp310-cp310-win_amd64.whl", hash = "sha256:d136337ae3cc69aa5e447e78d8e1514be8c3ec9b54264e680cf0b4bd9011574f"}, + {file = "numpy-1.21.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6aaf96c7f8cebc220cdfc03f1d5a31952f027dda050e5a703a0d1c396075e3e7"}, + {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:67c261d6c0a9981820c3a149d255a76918278a6b03b6a036800359aba1256d46"}, + {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a6be4cb0ef3b8c9250c19cc122267263093eee7edd4e3fa75395dfda8c17a8e2"}, + {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c4068a8c44014b2d55f3c3f574c376b2494ca9cc73d2f1bd692382b6dffe3db"}, + {file = "numpy-1.21.6-cp37-cp37m-win32.whl", hash = "sha256:7c7e5fa88d9ff656e067876e4736379cc962d185d5cd808014a8a928d529ef4e"}, + {file = "numpy-1.21.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bcb238c9c96c00d3085b264e5c1a1207672577b93fa666c3b14a45240b14123a"}, + {file = "numpy-1.21.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:82691fda7c3f77c90e62da69ae60b5ac08e87e775b09813559f8901a88266552"}, + {file = "numpy-1.21.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:643843bcc1c50526b3a71cd2ee561cf0d8773f062c8cbaf9ffac9fdf573f83ab"}, + {file = "numpy-1.21.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:357768c2e4451ac241465157a3e929b265dfac85d9214074985b1786244f2ef3"}, + {file = "numpy-1.21.6-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9f411b2c3f3d76bba0865b35a425157c5dcf54937f82bbeb3d3c180789dd66a6"}, + {file = "numpy-1.21.6-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4aa48afdce4660b0076a00d80afa54e8a97cd49f457d68a4342d188a09451c1a"}, + {file = "numpy-1.21.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a96eef20f639e6a97d23e57dd0c1b1069a7b4fd7027482a4c5c451cd7732f4"}, + {file = "numpy-1.21.6-cp38-cp38-win32.whl", hash = "sha256:5c3c8def4230e1b959671eb959083661b4a0d2e9af93ee339c7dada6759a9470"}, + {file = "numpy-1.21.6-cp38-cp38-win_amd64.whl", hash = "sha256:bf2ec4b75d0e9356edea834d1de42b31fe11f726a81dfb2c2112bc1eaa508fcf"}, + {file = "numpy-1.21.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4391bd07606be175aafd267ef9bea87cf1b8210c787666ce82073b05f202add1"}, + {file = "numpy-1.21.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:67f21981ba2f9d7ba9ade60c9e8cbaa8cf8e9ae51673934480e45cf55e953673"}, + {file = "numpy-1.21.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee5ec40fdd06d62fe5d4084bef4fd50fd4bb6bfd2bf519365f569dc470163ab0"}, + {file = "numpy-1.21.6-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dbe1c91269f880e364526649a52eff93ac30035507ae980d2fed33aaee633ac"}, + {file = "numpy-1.21.6-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9caa9d5e682102453d96a0ee10c7241b72859b01a941a397fd965f23b3e016b"}, + {file = "numpy-1.21.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58459d3bad03343ac4b1b42ed14d571b8743dc80ccbf27444f266729df1d6f5b"}, + {file = "numpy-1.21.6-cp39-cp39-win32.whl", hash = "sha256:7f5ae4f304257569ef3b948810816bc87c9146e8c446053539947eedeaa32786"}, + {file = "numpy-1.21.6-cp39-cp39-win_amd64.whl", hash = "sha256:e31f0bb5928b793169b87e3d1e070f2342b22d5245c755e2b81caa29756246c3"}, + {file = "numpy-1.21.6-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd1c8f6bd65d07d3810b90d02eba7997e32abbdf1277a481d698969e921a3be0"}, + {file = "numpy-1.21.6.zip", hash = "sha256:ecb55251139706669fdec2ff073c98ef8e9a84473e51e716211b41aa0f18e656"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] pandas = [ - {file = "pandas-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3dfb32ed50122fe8c5e7f2b8d97387edd742cc78f9ec36f007ee126cd3720907"}, - {file = "pandas-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0259cd11e7e6125aaea3af823b80444f3adad6149ff4c97fef760093598b3e34"}, - {file = "pandas-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:96e9ece5759f9b47ae43794b6359bbc54805d76e573b161ae770c1ea59393106"}, - {file = "pandas-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508c99debccd15790d526ce6b1624b97a5e1e4ca5b871319fb0ebfd46b8f4dad"}, - {file = "pandas-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6a7bbbb7950063bfc942f8794bc3e31697c020a14f1cd8905fc1d28ec674a01"}, - {file = "pandas-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:c614001129b2a5add5e3677c3a213a9e6fd376204cb8d17c04e84ff7dfc02a73"}, - {file = "pandas-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4e1176f45981c8ccc8161bc036916c004ca51037a7ed73f2d2a9857e6dbe654f"}, - {file = "pandas-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bbb15ad79050e8b8d39ec40dd96a30cd09b886a2ae8848d0df1abba4d5502a67"}, - {file = "pandas-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6d6ad1da00c7cc7d8dd1559a6ba59ba3973be6b15722d49738b2be0977eb8a0c"}, - {file = "pandas-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:358b0bc98a5ff067132d23bf7a2242ee95db9ea5b7bbc401cf79205f11502fd3"}, - {file = "pandas-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6105af6533f8b63a43ea9f08a2ede04e8f43e49daef0209ab0d30352bcf08bee"}, - {file = "pandas-1.4.1-cp38-cp38-win32.whl", hash = "sha256:04dd15d9db538470900c851498e532ef28d4e56bfe72c9523acb32042de43dfb"}, - {file = "pandas-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b384516dbb4e6aae30e3464c2e77c563da5980440fbdfbd0968e3942f8f9d70"}, - {file = "pandas-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f02e85e6d832be37d7f16cf6ac8bb26b519ace3e5f3235564a91c7f658ab2a43"}, - {file = "pandas-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0b1a13f647e4209ed7dbb5da3497891d0045da9785327530ab696417ef478f84"}, - {file = "pandas-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:19f7c632436b1b4f84615c3b127bbd7bc603db95e3d4332ed259dc815c9aaa26"}, - {file = "pandas-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ea47ba1d6f359680130bd29af497333be6110de8f4c35b9211eec5a5a9630fa"}, - {file = "pandas-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e5a7a1e0ecaac652326af627a3eca84886da9e667d68286866d4e33f6547caf"}, - {file = "pandas-1.4.1-cp39-cp39-win32.whl", hash = "sha256:1d85d5f6be66dfd6d1d8d13b9535e342a2214260f1852654b19fa4d7b8d1218b"}, - {file = "pandas-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:3129a35d9dad1d80c234dd78f8f03141b914395d23f97cf92a366dcd19f8f8bf"}, - {file = "pandas-1.4.1.tar.gz", hash = "sha256:8db93ec98ac7cb5f8ac1420c10f5e3c43533153f253fe7fb6d891cf5aa2b80d2"}, + {file = "pandas-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be67c782c4f1b1f24c2f16a157e12c2693fd510f8df18e3287c77f33d124ed07"}, + {file = "pandas-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5a206afa84ed20e07603f50d22b5f0db3fb556486d8c2462d8bc364831a4b417"}, + {file = "pandas-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0010771bd9223f7afe5f051eb47c4a49534345dfa144f2f5470b27189a4dd3b5"}, + {file = "pandas-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3228198333dd13c90b6434ddf61aa6d57deaca98cf7b654f4ad68a2db84f8cfe"}, + {file = "pandas-1.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b79af3a69e5175c6fa7b4e046b21a646c8b74e92c6581a9d825687d92071b51"}, + {file = "pandas-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:5586cc95692564b441f4747c47c8a9746792e87b40a4680a2feb7794defb1ce3"}, + {file = "pandas-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:061609334a8182ab500a90fe66d46f6f387de62d3a9cb9aa7e62e3146c712167"}, + {file = "pandas-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b8134651258bce418cb79c71adeff0a44090c98d955f6953168ba16cc285d9f7"}, + {file = "pandas-1.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:df82739e00bb6daf4bba4479a40f38c718b598a84654cbd8bb498fd6b0aa8c16"}, + {file = "pandas-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:385c52e85aaa8ea6a4c600a9b2821181a51f8be0aee3af6f2dcb41dafc4fc1d0"}, + {file = "pandas-1.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295872bf1a09758aba199992c3ecde455f01caf32266d50abc1a073e828a7b9d"}, + {file = "pandas-1.4.2-cp38-cp38-win32.whl", hash = "sha256:95c1e422ced0199cf4a34385ff124b69412c4bc912011ce895582bee620dfcaa"}, + {file = "pandas-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:5c54ea4ef3823108cd4ec7fb27ccba4c3a775e0f83e39c5e17f5094cb17748bc"}, + {file = "pandas-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c072c7f06b9242c855ed8021ff970c0e8f8b10b35e2640c657d2a541c5950f59"}, + {file = "pandas-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f549097993744ff8c41b5e8f2f0d3cbfaabe89b4ae32c8c08ead6cc535b80139"}, + {file = "pandas-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ff08a14ef21d94cdf18eef7c569d66f2e24e0bc89350bcd7d243dd804e3b5eb2"}, + {file = "pandas-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c5bf555b6b0075294b73965adaafb39cf71c312e38c5935c93d78f41c19828a"}, + {file = "pandas-1.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51649ef604a945f781105a6d2ecf88db7da0f4868ac5d45c51cb66081c4d9c73"}, + {file = "pandas-1.4.2-cp39-cp39-win32.whl", hash = "sha256:d0d4f13e4be7ce89d7057a786023c461dd9370040bdb5efa0a7fe76b556867a0"}, + {file = "pandas-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:09d8be7dd9e1c4c98224c4dfe8abd60d145d934e9fc1f5f411266308ae683e6a"}, + {file = "pandas-1.4.2.tar.gz", hash = "sha256:92bc1fc585f1463ca827b45535957815b7deb218c549b7c18402c322c7549a12"}, ] parso = [ {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, @@ -1841,57 +1882,60 @@ pickleshare = [ {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] pillow = [ - {file = "Pillow-9.0.1-1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a5d24e1d674dd9d72c66ad3ea9131322819ff86250b30dc5821cbafcfa0b96b4"}, - {file = "Pillow-9.0.1-1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2632d0f846b7c7600edf53c48f8f9f1e13e62f66a6dbc15191029d950bfed976"}, - {file = "Pillow-9.0.1-1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b9618823bd237c0d2575283f2939655f54d51b4527ec3972907a927acbcc5bfc"}, - {file = "Pillow-9.0.1-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:9bfdb82cdfeccec50aad441afc332faf8606dfa5e8efd18a6692b5d6e79f00fd"}, - {file = "Pillow-9.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5100b45a4638e3c00e4d2320d3193bdabb2d75e79793af7c3eb139e4f569f16f"}, - {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:528a2a692c65dd5cafc130de286030af251d2ee0483a5bf50c9348aefe834e8a"}, - {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f29d831e2151e0b7b39981756d201f7108d3d215896212ffe2e992d06bfe049"}, - {file = "Pillow-9.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:855c583f268edde09474b081e3ddcd5cf3b20c12f26e0d434e1386cc5d318e7a"}, - {file = "Pillow-9.0.1-cp310-cp310-win32.whl", hash = "sha256:d9d7942b624b04b895cb95af03a23407f17646815495ce4547f0e60e0b06f58e"}, - {file = "Pillow-9.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81c4b81611e3a3cb30e59b0cf05b888c675f97e3adb2c8672c3154047980726b"}, - {file = "Pillow-9.0.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:413ce0bbf9fc6278b2d63309dfeefe452835e1c78398efb431bab0672fe9274e"}, - {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80fe64a6deb6fcfdf7b8386f2cf216d329be6f2781f7d90304351811fb591360"}, - {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cef9c85ccbe9bee00909758936ea841ef12035296c748aaceee535969e27d31b"}, - {file = "Pillow-9.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d19397351f73a88904ad1aee421e800fe4bbcd1aeee6435fb62d0a05ccd1030"}, - {file = "Pillow-9.0.1-cp37-cp37m-win32.whl", hash = "sha256:d21237d0cd37acded35154e29aec853e945950321dd2ffd1a7d86fe686814669"}, - {file = "Pillow-9.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ede5af4a2702444a832a800b8eb7f0a7a1c0eed55b644642e049c98d589e5092"}, - {file = "Pillow-9.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:b5b3f092fe345c03bca1e0b687dfbb39364b21ebb8ba90e3fa707374b7915204"}, - {file = "Pillow-9.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:335ace1a22325395c4ea88e00ba3dc89ca029bd66bd5a3c382d53e44f0ccd77e"}, - {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db6d9fac65bd08cea7f3540b899977c6dee9edad959fa4eaf305940d9cbd861c"}, - {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f154d173286a5d1863637a7dcd8c3437bb557520b01bddb0be0258dcb72696b5"}, - {file = "Pillow-9.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d4b1341ac07ae07eb2cc682f459bec932a380c3b122f5540432d8977e64eae"}, - {file = "Pillow-9.0.1-cp38-cp38-win32.whl", hash = "sha256:effb7749713d5317478bb3acb3f81d9d7c7f86726d41c1facca068a04cf5bb4c"}, - {file = "Pillow-9.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:7f7609a718b177bf171ac93cea9fd2ddc0e03e84d8fa4e887bdfc39671d46b00"}, - {file = "Pillow-9.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:80ca33961ced9c63358056bd08403ff866512038883e74f3a4bf88ad3eb66838"}, - {file = "Pillow-9.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c3c33ac69cf059bbb9d1a71eeaba76781b450bc307e2291f8a4764d779a6b28"}, - {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12875d118f21cf35604176872447cdb57b07126750a33748bac15e77f90f1f9c"}, - {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:514ceac913076feefbeaf89771fd6febde78b0c4c1b23aaeab082c41c694e81b"}, - {file = "Pillow-9.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3c5c79ab7dfce6d88f1ba639b77e77a17ea33a01b07b99840d6ed08031cb2a7"}, - {file = "Pillow-9.0.1-cp39-cp39-win32.whl", hash = "sha256:718856856ba31f14f13ba885ff13874be7fefc53984d2832458f12c38205f7f7"}, - {file = "Pillow-9.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:f25ed6e28ddf50de7e7ea99d7a976d6a9c415f03adcaac9c41ff6ff41b6d86ac"}, - {file = "Pillow-9.0.1-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:011233e0c42a4a7836498e98c1acf5e744c96a67dd5032a6f666cc1fb97eab97"}, - {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253e8a302a96df6927310a9d44e6103055e8fb96a6822f8b7f514bb7ef77de56"}, - {file = "Pillow-9.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6295f6763749b89c994fcb6d8a7f7ce03c3992e695f89f00b741b4580b199b7e"}, - {file = "Pillow-9.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a9f44cd7e162ac6191491d7249cceb02b8116b0f7e847ee33f739d7cb1ea1f70"}, - {file = "Pillow-9.0.1.tar.gz", hash = "sha256:6c8bc8238a7dfdaf7a75f5ec5a663f4173f8c367e5a39f87e720495e1eed75fa"}, + {file = "Pillow-9.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af79d3fde1fc2e33561166d62e3b63f0cc3e47b5a3a2e5fea40d4917754734ea"}, + {file = "Pillow-9.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55dd1cf09a1fd7c7b78425967aacae9b0d70125f7d3ab973fadc7b5abc3de652"}, + {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66822d01e82506a19407d1afc104c3fcea3b81d5eb11485e593ad6b8492f995a"}, + {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5eaf3b42df2bcda61c53a742ee2c6e63f777d0e085bbc6b2ab7ed57deb13db7"}, + {file = "Pillow-9.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01ce45deec9df310cbbee11104bae1a2a43308dd9c317f99235b6d3080ddd66e"}, + {file = "Pillow-9.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aea7ce61328e15943d7b9eaca87e81f7c62ff90f669116f857262e9da4057ba3"}, + {file = "Pillow-9.1.0-cp310-cp310-win32.whl", hash = "sha256:7a053bd4d65a3294b153bdd7724dce864a1d548416a5ef61f6d03bf149205160"}, + {file = "Pillow-9.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:97bda660702a856c2c9e12ec26fc6d187631ddfd896ff685814ab21ef0597033"}, + {file = "Pillow-9.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21dee8466b42912335151d24c1665fcf44dc2ee47e021d233a40c3ca5adae59c"}, + {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6d4050b208c8ff886fd3db6690bf04f9a48749d78b41b7a5bf24c236ab0165"}, + {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cfca31ab4c13552a0f354c87fbd7f162a4fafd25e6b521bba93a57fe6a3700a"}, + {file = "Pillow-9.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed742214068efa95e9844c2d9129e209ed63f61baa4d54dbf4cf8b5e2d30ccf2"}, + {file = "Pillow-9.1.0-cp37-cp37m-win32.whl", hash = "sha256:c9efef876c21788366ea1f50ecb39d5d6f65febe25ad1d4c0b8dff98843ac244"}, + {file = "Pillow-9.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:de344bcf6e2463bb25179d74d6e7989e375f906bcec8cb86edb8b12acbc7dfef"}, + {file = "Pillow-9.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:17869489de2fce6c36690a0c721bd3db176194af5f39249c1ac56d0bb0fcc512"}, + {file = "Pillow-9.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:25023a6209a4d7c42154073144608c9a71d3512b648a2f5d4465182cb93d3477"}, + {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8782189c796eff29dbb37dd87afa4ad4d40fc90b2742704f94812851b725964b"}, + {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:463acf531f5d0925ca55904fa668bb3461c3ef6bc779e1d6d8a488092bdee378"}, + {file = "Pillow-9.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f42364485bfdab19c1373b5cd62f7c5ab7cc052e19644862ec8f15bb8af289e"}, + {file = "Pillow-9.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3fddcdb619ba04491e8f771636583a7cc5a5051cd193ff1aa1ee8616d2a692c5"}, + {file = "Pillow-9.1.0-cp38-cp38-win32.whl", hash = "sha256:4fe29a070de394e449fd88ebe1624d1e2d7ddeed4c12e0b31624561b58948d9a"}, + {file = "Pillow-9.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c24f718f9dd73bb2b31a6201e6db5ea4a61fdd1d1c200f43ee585fc6dcd21b34"}, + {file = "Pillow-9.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fb89397013cf302f282f0fc998bb7abf11d49dcff72c8ecb320f76ea6e2c5717"}, + {file = "Pillow-9.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c870193cce4b76713a2b29be5d8327c8ccbe0d4a49bc22968aa1e680930f5581"}, + {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69e5ddc609230d4408277af135c5b5c8fe7a54b2bdb8ad7c5100b86b3aab04c6"}, + {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35be4a9f65441d9982240e6966c1eaa1c654c4e5e931eaf580130409e31804d4"}, + {file = "Pillow-9.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82283af99c1c3a5ba1da44c67296d5aad19f11c535b551a5ae55328a317ce331"}, + {file = "Pillow-9.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a325ac71914c5c043fa50441b36606e64a10cd262de12f7a179620f579752ff8"}, + {file = "Pillow-9.1.0-cp39-cp39-win32.whl", hash = "sha256:a598d8830f6ef5501002ae85c7dbfcd9c27cc4efc02a1989369303ba85573e58"}, + {file = "Pillow-9.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c51cb9edac8a5abd069fd0758ac0a8bfe52c261ee0e330f363548aca6893595"}, + {file = "Pillow-9.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a336a4f74baf67e26f3acc4d61c913e378e931817cd1e2ef4dfb79d3e051b481"}, + {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb1b89b11256b5b6cad5e7593f9061ac4624f7651f7a8eb4dfa37caa1dfaa4d0"}, + {file = "Pillow-9.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:255c9d69754a4c90b0ee484967fc8818c7ff8311c6dddcc43a4340e10cd1636a"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5a3ecc026ea0e14d0ad7cd990ea7f48bfcb3eb4271034657dc9d06933c6629a7"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5b0ff59785d93b3437c3703e3c64c178aabada51dea2a7f2c5eccf1bcf565a3"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7110ec1701b0bf8df569a7592a196c9d07c764a0a74f65471ea56816f10e2c8"}, + {file = "Pillow-9.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8d79c6f468215d1a8415aa53d9868a6b40c4682165b8cb62a221b1baa47db458"}, + {file = "Pillow-9.1.0.tar.gz", hash = "sha256:f401ed2bbb155e1ade150ccc63db1a4f6c1909d3d378f7d1235a44e90d75fb97"}, ] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, + {file = "pre_commit-2.19.0-py2.py3-none-any.whl", hash = "sha256:10c62741aa5704faea2ad69cb550ca78082efe5697d6f04e5710c3c229afdd10"}, + {file = "pre_commit-2.19.0.tar.gz", hash = "sha256:4233a1e38621c87d9dda9808c6606d7e7ba0e087cd56d3fe03202a01d2919615"}, ] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.28-py3-none-any.whl", hash = "sha256:30129d870dcb0b3b6a53efdc9d0a83ea96162ffd28ffe077e94215b233dc670c"}, - {file = "prompt_toolkit-3.0.28.tar.gz", hash = "sha256:9f1cd16b1e86c2968f2519d7fb31dd9d669916f515612c269d14e9ed52b51650"}, + {file = "prompt_toolkit-3.0.29-py3-none-any.whl", hash = "sha256:62291dad495e665fca0bda814e342c69952086afb0f4094d0893d357e5c78752"}, + {file = "prompt_toolkit-3.0.29.tar.gz", hash = "sha256:bd640f60e8cecd74f0dc249713d433ace2ddc62b65ee07f96d358e0b152b6ea7"}, ] ptyprocess = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, @@ -1914,16 +1958,16 @@ pybtex-docutils = [ {file = "pybtex_docutils-1.0.1-py3-none-any.whl", hash = "sha256:42e379bd1d5473b9fd7be4b3a64ca291d4fdc9ae6c6854e52d1d0157c955bbfa"}, ] pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, ] pylint = [ - {file = "pylint-2.12.2-py3-none-any.whl", hash = "sha256:daabda3f7ed9d1c60f52d563b1b854632fd90035bcf01443e234d3dc794e3b74"}, - {file = "pylint-2.12.2.tar.gz", hash = "sha256:9d945a73640e1fec07ee34b42f5669b770c759acd536ec7b16d7e4b87a9c9ff9"}, + {file = "pylint-2.13.8-py3-none-any.whl", hash = "sha256:f87e863a0b08f64b5230e7e779bcb75276346995737b2c0dc2793070487b1ff6"}, + {file = "pylint-2.13.8.tar.gz", hash = "sha256:ced8968c3b699df0615e2a709554dec3ddac2f5cd06efadb69554a69eeca364a"}, ] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, + {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, ] pyreadline = [ {file = "pyreadline-2.1.win-amd64.exe", hash = "sha256:9ce5fa65b8992dfa373bddc5b6e0864ead8f291c94fbfec05fbd5c836162e67b"}, @@ -1949,8 +1993,8 @@ python-dateutil = [ {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] pytz = [ - {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, - {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, + {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, + {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, ] pytzdata = [ {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, @@ -2037,8 +2081,8 @@ snowballstemmer = [ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] sphinx = [ - {file = "Sphinx-4.4.0-py3-none-any.whl", hash = "sha256:5da895959511473857b6d0200f56865ed62c31e8f82dd338063b84ec022701fe"}, - {file = "Sphinx-4.4.0.tar.gz", hash = "sha256:6caad9786055cb1fa22b4a365c1775816b876f91966481765d7d50e9f0dd35cc"}, + {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, + {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, ] sphinx-rtd-theme = [ {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, @@ -2049,8 +2093,8 @@ sphinxcontrib-applehelp = [ {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, ] sphinxcontrib-bibtex = [ - {file = "sphinxcontrib-bibtex-2.4.1.tar.gz", hash = "sha256:282223309bbaf34cd20a8fe1ba346fe8642f403a8930607e77a8cb08ae81fc5f"}, - {file = "sphinxcontrib_bibtex-2.4.1-py3-none-any.whl", hash = "sha256:b7da94e960a855c07c6816c7b0f4e8619b5b3ada00a5cb99b1eaa847a788f779"}, + {file = "sphinxcontrib-bibtex-2.4.2.tar.gz", hash = "sha256:65b023ee47f35f1f03ac4d71c824e67c624c7ecac1bb26e83623271a01f9da86"}, + {file = "sphinxcontrib_bibtex-2.4.2-py3-none-any.whl", hash = "sha256:608512afde6b732148cdc9123550bd560bf48e071d1fb7bb1bab4f4437ff04f4"}, ] sphinxcontrib-devhelp = [ {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, @@ -2073,41 +2117,42 @@ sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] sqlalchemy = [ - {file = "SQLAlchemy-1.4.32-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:4b2bcab3a914715d332ca783e9bda13bc570d8b9ef087563210ba63082c18c16"}, - {file = "SQLAlchemy-1.4.32-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:159c2f69dd6efd28e894f261ffca1100690f28210f34cfcd70b895e0ea7a64f3"}, - {file = "SQLAlchemy-1.4.32-cp27-cp27m-win_amd64.whl", hash = "sha256:d7e483f4791fbda60e23926b098702340504f7684ce7e1fd2c1bf02029288423"}, - {file = "SQLAlchemy-1.4.32-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4aa96e957141006181ca58e792e900ee511085b8dae06c2d08c00f108280fb8a"}, - {file = "SQLAlchemy-1.4.32-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:576684771456d02e24078047c2567025f2011977aa342063468577d94e194b00"}, - {file = "SQLAlchemy-1.4.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fff677fa4522dafb5a5e2c0cf909790d5d367326321aeabc0dffc9047cb235bd"}, - {file = "SQLAlchemy-1.4.32-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8679f9aba5ac22e7bce54ccd8a77641d3aea3e2d96e73e4356c887ebf8ff1082"}, - {file = "SQLAlchemy-1.4.32-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7046f7aa2db445daccc8424f50b47a66c4039c9f058246b43796aa818f8b751"}, - {file = "SQLAlchemy-1.4.32-cp310-cp310-win32.whl", hash = "sha256:bedd89c34ab62565d44745212814e4b57ef1c24ad4af9b29c504ce40f0dc6558"}, - {file = "SQLAlchemy-1.4.32-cp310-cp310-win_amd64.whl", hash = "sha256:199dc6d0068753b6a8c0bd3aceb86a3e782df118260ebc1fa981ea31ee054674"}, - {file = "SQLAlchemy-1.4.32-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:8e1e5d96b744a4f91163290b01045430f3f32579e46d87282449e5b14d27d4ac"}, - {file = "SQLAlchemy-1.4.32-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edfcf93fd92e2f9eef640b3a7a40db20fe3c1d7c2c74faa41424c63dead61b76"}, - {file = "SQLAlchemy-1.4.32-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:04164e0063feb7aedd9d073db0fd496edb244be40d46ea1f0d8990815e4b8c34"}, - {file = "SQLAlchemy-1.4.32-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba59761c19b800bc2e1c9324da04d35ef51e4ee9621ff37534bc2290d258f71"}, - {file = "SQLAlchemy-1.4.32-cp36-cp36m-win32.whl", hash = "sha256:708973b5d9e1e441188124aaf13c121e5b03b6054c2df59b32219175a25aa13e"}, - {file = "SQLAlchemy-1.4.32-cp36-cp36m-win_amd64.whl", hash = "sha256:316270e5867566376e69a0ac738b863d41396e2b63274616817e1d34156dff0e"}, - {file = "SQLAlchemy-1.4.32-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:9a0195af6b9050c9322a97cf07514f66fe511968e623ca87b2df5e3cf6349615"}, - {file = "SQLAlchemy-1.4.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7e4a3c0c3c596296b37f8427c467c8e4336dc8d50f8ed38042e8ba79507b2c9"}, - {file = "SQLAlchemy-1.4.32-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bca714d831e5b8860c3ab134c93aec63d1a4f493bed20084f54e3ce9f0a3bf99"}, - {file = "SQLAlchemy-1.4.32-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9a680d9665f88346ed339888781f5236347933906c5a56348abb8261282ec48"}, - {file = "SQLAlchemy-1.4.32-cp37-cp37m-win32.whl", hash = "sha256:9cb5698c896fa72f88e7ef04ef62572faf56809093180771d9be8d9f2e264a13"}, - {file = "SQLAlchemy-1.4.32-cp37-cp37m-win_amd64.whl", hash = "sha256:8b9a395122770a6f08ebfd0321546d7379f43505882c7419d7886856a07caa13"}, - {file = "SQLAlchemy-1.4.32-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:3f88a4ee192142eeed3fe173f673ea6ab1f5a863810a9d85dbf6c67a9bd08f97"}, - {file = "SQLAlchemy-1.4.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd93162615870c976dba43963a24bb418b28448fef584f30755990c134a06a55"}, - {file = "SQLAlchemy-1.4.32-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a2e73508f939175363d8a4be9dcdc84cf16a92578d7fa86e6e4ca0e6b3667b2"}, - {file = "SQLAlchemy-1.4.32-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfec934aac7f9fa95fc82147a4ba5db0a8bdc4ebf1e33b585ab8860beb10232f"}, - {file = "SQLAlchemy-1.4.32-cp38-cp38-win32.whl", hash = "sha256:bb42f9b259c33662c6a9b866012f6908a91731a419e69304e1261ba3ab87b8d1"}, - {file = "SQLAlchemy-1.4.32-cp38-cp38-win_amd64.whl", hash = "sha256:7ff72b3cc9242d1a1c9b84bd945907bf174d74fc2519efe6184d6390a8df478b"}, - {file = "SQLAlchemy-1.4.32-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5dc9801ae9884e822ba942ca493642fb50f049c06b6dbe3178691fce48ceb089"}, - {file = "SQLAlchemy-1.4.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4607d2d16330757818c9d6fba322c2e80b4b112ff24295d1343a80b876eb0ed"}, - {file = "SQLAlchemy-1.4.32-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:20e9eba7fd86ef52e0df25bea83b8b518dfdf0bce09b336cfe51671f52aaaa3f"}, - {file = "SQLAlchemy-1.4.32-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:290cbdf19129ae520d4bdce392648c6fcdbee763bc8f750b53a5ab51880cb9c9"}, - {file = "SQLAlchemy-1.4.32-cp39-cp39-win32.whl", hash = "sha256:1bbac3e8293b34c4403d297e21e8f10d2a57756b75cff101dc62186adec725f5"}, - {file = "SQLAlchemy-1.4.32-cp39-cp39-win_amd64.whl", hash = "sha256:b3f1d9b3aa09ab9adc7f8c4b40fc3e081eb903054c9a6f9ae1633fe15ae503b4"}, - {file = "SQLAlchemy-1.4.32.tar.gz", hash = "sha256:6fdd2dc5931daab778c2b65b03df6ae68376e028a3098eb624d0909d999885bc"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:81e53bd383c2c33de9d578bfcc243f559bd3801a0e57f2bcc9a943c790662e0c"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6e1fe00ee85c768807f2a139b83469c1e52a9ffd58a6eb51aa7aeb524325ab18"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-win32.whl", hash = "sha256:d57ac32f8dc731fddeb6f5d1358b4ca5456e72594e664769f0a9163f13df2a31"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27m-win_amd64.whl", hash = "sha256:fca8322e04b2dde722fcb0558682740eebd3bd239bea7a0d0febbc190e99dc15"}, + {file = "SQLAlchemy-1.4.36-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:53d2d9ee93970c969bc4e3c78b1277d7129554642f6ffea039c282c7dc4577bc"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:f0394a3acfb8925db178f7728adb38c027ed7e303665b225906bfa8099dc1ce8"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c606d8238feae2f360b8742ffbe67741937eb0a05b57f536948d198a3def96"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8d07fe2de0325d06e7e73281e9a9b5e259fbd7cbfbe398a0433cbb0082ad8fa7"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5041474dcab7973baa91ec1f3112049a9dd4652898d6a95a6a895ff5c58beb6b"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-win32.whl", hash = "sha256:be094460930087e50fd08297db9d7aadaed8408ad896baf758e9190c335632da"}, + {file = "SQLAlchemy-1.4.36-cp310-cp310-win_amd64.whl", hash = "sha256:64d796e9af522162f7f2bf7a3c5531a0a550764c426782797bbeed809d0646c5"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a0ae3aa2e86a4613f2d4c49eb7da23da536e6ce80b2bfd60bbb2f55fc02b0b32"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d50cb71c1dbed70646d521a0975fb0f92b7c3f84c61fa59e07be23a1aaeecfc"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:16abf35af37a3d5af92725fc9ec507dd9e9183d261c2069b6606d60981ed1c6e"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864a83bd345871ad9699ce466388f836db7572003d67d9392a71998092210e3"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-win32.whl", hash = "sha256:fbf8c09fe9728168f8cc1b40c239eab10baf9c422c18be7f53213d70434dea43"}, + {file = "SQLAlchemy-1.4.36-cp36-cp36m-win_amd64.whl", hash = "sha256:6e859fa96605027bd50d8e966db1c4e1b03e7b3267abbc4b89ae658c99393c58"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:166a3887ec355f7d2f12738f7fa25dc8ac541867147a255f790f2f41f614cb44"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e885548da361aa3f8a9433db4cfb335b2107e533bf314359ae3952821d84b3e"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5c90ef955d429966d84326d772eb34333178737ebb669845f1d529eb00c75e72"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a052bd9f53004f8993c624c452dfad8ec600f572dd0ed0445fbe64b22f5570e"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-win32.whl", hash = "sha256:dce3468bf1fc12374a1a732c9efd146ce034f91bb0482b602a9311cb6166a920"}, + {file = "SQLAlchemy-1.4.36-cp37-cp37m-win_amd64.whl", hash = "sha256:6cb4c4f57a20710cea277edf720d249d514e587f796b75785ad2c25e1c0fed26"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e74ce103b81c375c3853b436297952ef8d7863d801dcffb6728d01544e5191b5"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b20c4178ead9bc398be479428568ff31b6c296eb22e75776273781a6551973f"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:af2587ae11400157753115612d6c6ad255143efba791406ad8a0cbcccf2edcb3"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cf3077712be9f65c9aaa0b5bc47bc1a44789fd45053e2e3ecd59ff17c63fe9"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-win32.whl", hash = "sha256:ce20f5da141f8af26c123ebaa1b7771835ca6c161225ce728962a79054f528c3"}, + {file = "SQLAlchemy-1.4.36-cp38-cp38-win_amd64.whl", hash = "sha256:316c7e5304dda3e3ad711569ac5d02698bbc71299b168ac56a7076b86259f7ea"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:f522214f6749bc073262529c056f7dfd660f3b5ec4180c5354d985eb7219801e"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ecac4db8c1aa4a269f5829df7e706639a24b780d2ac46b3e485cbbd27ec0028"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3db741beaa983d4cbf9087558620e7787106319f7e63a066990a70657dd6b35"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ec89bf98cc6a0f5d1e28e3ad28e9be6f3b4bdbd521a4053c7ae8d5e1289a8a1"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-win32.whl", hash = "sha256:e12532c4d3f614678623da5d852f038ace1f01869b89f003ed6fe8c793f0c6a3"}, + {file = "SQLAlchemy-1.4.36-cp39-cp39-win_amd64.whl", hash = "sha256:cb441ca461bf97d00877b607f132772644b623518b39ced54da433215adce691"}, + {file = "SQLAlchemy-1.4.36.tar.gz", hash = "sha256:64678ac321d64a45901ef2e24725ec5e783f1f4a588305e196431447e7ace243"}, ] stack-data = [ {file = "stack_data-0.2.0-py3-none-any.whl", hash = "sha256:999762f9c3132308789affa03e9271bbbe947bf78311851f4d485d8402ed858e"}, @@ -2126,16 +2171,16 @@ traitlets = [ {file = "traitlets-5.1.1.tar.gz", hash = "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] urllib3 = [ - {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"}, - {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"}, + {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, + {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] virtualenv = [ - {file = "virtualenv-20.13.3-py2.py3-none-any.whl", hash = "sha256:dd448d1ded9f14d1a4bfa6bfc0c5b96ae3be3f2d6c6c159b23ddcfd701baa021"}, - {file = "virtualenv-20.13.3.tar.gz", hash = "sha256:e9dd1a1359d70137559034c0f5433b34caf504af2dc756367be86a5a32967134"}, + {file = "virtualenv-20.14.1-py2.py3-none-any.whl", hash = "sha256:e617f16e25b42eb4f6e74096b9c9e37713cf10bf30168fb4a739f3fa8f898a3a"}, + {file = "virtualenv-20.14.1.tar.gz", hash = "sha256:ef589a79795589aada0c1c5b319486797c03b67ac3984c48c669c0e4f50df3a5"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -2145,59 +2190,72 @@ wmctrl = [ {file = "wmctrl-0.4.tar.gz", hash = "sha256:66cbff72b0ca06a22ec3883ac3a4d7c41078bdae4fb7310f52951769b10e14e0"}, ] wrapt = [ - {file = "wrapt-1.13.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a"}, - {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489"}, - {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909"}, - {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229"}, - {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af"}, - {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de"}, - {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb"}, - {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80"}, - {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca"}, - {file = "wrapt-1.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44"}, - {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056"}, - {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785"}, - {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096"}, - {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33"}, - {file = "wrapt-1.13.3-cp310-cp310-win32.whl", hash = "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f"}, - {file = "wrapt-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e"}, - {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d"}, - {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179"}, - {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3"}, - {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755"}, - {file = "wrapt-1.13.3-cp35-cp35m-win32.whl", hash = "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851"}, - {file = "wrapt-1.13.3-cp35-cp35m-win_amd64.whl", hash = "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13"}, - {file = "wrapt-1.13.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918"}, - {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade"}, - {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc"}, - {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf"}, - {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125"}, - {file = "wrapt-1.13.3-cp36-cp36m-win32.whl", hash = "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36"}, - {file = "wrapt-1.13.3-cp36-cp36m-win_amd64.whl", hash = "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10"}, - {file = "wrapt-1.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068"}, - {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709"}, - {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df"}, - {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2"}, - {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b"}, - {file = "wrapt-1.13.3-cp37-cp37m-win32.whl", hash = "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829"}, - {file = "wrapt-1.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea"}, - {file = "wrapt-1.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9"}, - {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554"}, - {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c"}, - {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b"}, - {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce"}, - {file = "wrapt-1.13.3-cp38-cp38-win32.whl", hash = "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79"}, - {file = "wrapt-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb"}, - {file = "wrapt-1.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb"}, - {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32"}, - {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7"}, - {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e"}, - {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640"}, - {file = "wrapt-1.13.3-cp39-cp39-win32.whl", hash = "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374"}, - {file = "wrapt-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb"}, - {file = "wrapt-1.13.3.tar.gz", hash = "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185"}, + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, + {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, + {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, ] diff --git a/pyproject.toml b/pyproject.toml index 97429f93e..694da05fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ Sphinx = { version = "^4.3.2", optional = true } sphinx-rtd-theme = { version = "^1.0.0", optional = true } sphinxcontrib-bibtex = { version = "^2.4.1", optional = true } # ekomark -banana-hep = { version = "^0.6.4", optional = true } +banana-hep = { version = "^0.6.5", optional = true } sqlalchemy = { version = "^1.4.21", optional = true } pandas = { version = "^1.3.0", optional = true } matplotlib = { version = "^3.5.1", optional = true } @@ -53,6 +53,9 @@ pytest-cov = "^3.0.0" pytest-env = "^0.6.2" a3b2bbc3ced97675ac3a71df45f55ba = "^6.4.0" # = lhapdf # benchmark +asv = "^0.4.2" +virtualenv = "^20.13.2" +# docs Sphinx = "^4.3.2" sphinx-rtd-theme = "^1.0.0" sphinxcontrib-bibtex = "^2.4.1" @@ -84,6 +87,7 @@ bench-run.env.NUMBA_DISABLE_JIT.default = "0" lint = "pylint src/**/*.py -E" lint-warnings = "pylint src/**/*.py --exit-zero" sandbox = "python benchmarks/sandbox.py" +lha = "python benchmarks/lha_paper_bench.py" nav = "ekonav --config benchmarks/banana.yaml" navigator = "ekonav --config benchmarks/banana.yaml" docs = { "shell" = "cd doc; make html" } @@ -91,6 +95,12 @@ docs-view = { "shell" = "cd doc; make view" } docs-server = { "shell" = "cd doc; make server" } docs-clean = { "shell" = "cd doc; make clean" } docs-cleanall = { "shell" = "cd doc; make cleanall" } +asv-run = "asv run --config benchmarks/asv.conf.json master..HEAD" +asv-preview = "asv preview --config benchmarks/asv.conf.json" +asv-publish = "asv publish --config benchmarks/asv.conf.json" +asv-show = "asv show --config benchmarks/asv.conf.json" +asv-clean = { "shell" = "rm -rf benchmarks/env benchmarks/html benchmarks/results" } +asv = ["asv-run", "asv-publish", "asv-preview"] [tool.pytest.ini_options] testpaths = ['tests/', 'benchmarks/'] diff --git a/src/eko/anomalous_dimensions/__init__.py b/src/eko/anomalous_dimensions/__init__.py index bdf7d67ef..f1e9edba8 100644 --- a/src/eko/anomalous_dimensions/__init__.py +++ b/src/eko/anomalous_dimensions/__init__.py @@ -20,11 +20,11 @@ import numba as nb import numpy as np -from .. import basis_rotation as br -from . import as1, as2, as3, harmonics +from .. import harmonics +from . import as1, as2, as3 -@nb.njit("Tuple((c16[:,:],c16,c16,c16[:,:],c16[:,:]))(c16[:,:])", cache=True) +@nb.njit(cache=True) def exp_singlet(gamma_S): r""" Computes the exponential and the eigensystem of the singlet anomalous dimension matrix @@ -72,7 +72,7 @@ def exp_singlet(gamma_S): return exp, lambda_p, lambda_m, e_p, e_m -@nb.njit("c16[:](u1,u2,c16,u1)", cache=True) +@nb.njit(cache=True) def gamma_ns(order, mode, n, nf): r""" Computes the tower of the non-singlet anomalous dimensions @@ -103,25 +103,22 @@ def gamma_ns(order, mode, n, nf): eko.anomalous_dimensions.as3.gamma_nsv : :math:`\gamma_{ns,v}^{(2)}(N)` """ # cache the s-es - sx = np.full(1, harmonics.harmonic_S1(n)) + sx = harmonics.sx(n, max_weight=order + 1) # now combine gamma_ns = np.zeros(order + 1, np.complex_) gamma_ns[0] = as1.gamma_ns(n, sx[0]) # NLO and beyond if order >= 1: - # TODO: pass the necessary harmonics to nlo gammas if mode == 10101: - gamma_ns_1 = as2.gamma_nsp(n, nf) + gamma_ns_1 = as2.gamma_nsp(n, nf, sx) # To fill the full valence vector in NNLO we need to add gamma_ns^1 explicitly here elif mode in [10201, 10200]: - gamma_ns_1 = as2.gamma_nsm(n, nf) + gamma_ns_1 = as2.gamma_nsm(n, nf, sx) else: raise NotImplementedError("Non-singlet sector is not implemented") gamma_ns[1] = gamma_ns_1 # NNLO and beyond if order >= 2: - sx = np.append(sx, harmonics.harmonic_S2(n)) - sx = np.append(sx, harmonics.harmonic_S3(n)) if mode == 10101: gamma_ns_2 = -as3.gamma_nsp(n, nf, sx) elif mode == 10201: @@ -132,7 +129,7 @@ def gamma_ns(order, mode, n, nf): return gamma_ns -@nb.njit("c16[:,:,:](u1,c16,u1)", cache=True) +@nb.njit(cache=True) def gamma_singlet(order, n, nf): r""" Computes the tower of the singlet anomalous dimensions matrices @@ -158,16 +155,12 @@ def gamma_singlet(order, n, nf): eko.anomalous_dimensions.as3.gamma_singlet : :math:`\gamma_{S}^{(2)}(N)` """ # cache the s-es - sx = np.full(1, harmonics.harmonic_S1(n)) + sx = harmonics.sx(n, max_weight=order + 1) + gamma_s = np.zeros((order + 1, 2, 2), np.complex_) + gamma_s[0] = as1.gamma_singlet(n, sx[0], nf) if order >= 1: - sx = np.append(sx, harmonics.harmonic_S2(n)) - sx = np.append(sx, harmonics.harmonic_S3(n)) - - gamma_singlet = np.zeros((order + 1, 2, 2), np.complex_) - gamma_singlet[0] = as1.gamma_singlet(n, sx[0], nf) - if order >= 1: - gamma_singlet[1] = as2.gamma_singlet(n, nf) + gamma_s[1] = as2.gamma_singlet(n, nf, sx) if order == 2: - sx = np.append(sx, harmonics.harmonic_S4(n)) - gamma_singlet[2] = -as3.gamma_singlet(n, nf, sx) - return gamma_singlet + sx = np.append(sx, harmonics.S4(n)) + gamma_s[2] = -as3.gamma_singlet(n, nf, sx) + return gamma_s diff --git a/src/eko/anomalous_dimensions/aem1.py b/src/eko/anomalous_dimensions/aem1.py index de620655a..9b125a7f5 100644 --- a/src/eko/anomalous_dimensions/aem1.py +++ b/src/eko/anomalous_dimensions/aem1.py @@ -5,7 +5,7 @@ from . import as1 -@nb.njit("c16(c16)", cache=True) +@nb.njit(cache=True) def gamma_phq(N): """ Computes the leading-order photon-quark anomalous dimension @@ -26,7 +26,7 @@ def gamma_phq(N): return as1.gamma_gq(N) / constants.CF -@nb.njit("c16(c16,u1)", cache=True) +@nb.njit(cache=True) def gamma_qph(N, nf): """ Computes the leading-order quark-photon anomalous dimension @@ -50,7 +50,7 @@ def gamma_qph(N, nf): return as1.gamma_qg(N, nf) / constants.TR * constants.NC -@nb.njit("c16(u1)", cache=True) +@nb.njit(cache=True) def gamma_phph(nf): """ Computes the leading-order photon-photon anomalous dimension @@ -71,7 +71,7 @@ def gamma_phph(nf): return 2 / 3 * constants.NC * 2 * nf -@nb.njit("c16(c16,c16)", cache=True) +@nb.njit(cache=True) def gamma_ns(N, s1): """ Computes the leading-order non-singlet QED anomalous dimension. diff --git a/src/eko/anomalous_dimensions/as1.py b/src/eko/anomalous_dimensions/as1.py index 2efc0cae5..a178a3f08 100644 --- a/src/eko/anomalous_dimensions/as1.py +++ b/src/eko/anomalous_dimensions/as1.py @@ -7,7 +7,7 @@ from .. import constants -@nb.njit("c16(c16,c16)", cache=True) +@nb.njit(cache=True) def gamma_ns(N, s1): """ Computes the leading-order non-singlet anomalous dimension. @@ -19,7 +19,7 @@ def gamma_ns(N, s1): N : complex Mellin moment s1 : complex - S1(N) + harmonic sum :math:`S_{1}` Returns ------- @@ -31,7 +31,7 @@ def gamma_ns(N, s1): return result -@nb.njit("c16(c16,u1)", cache=True) +@nb.njit(cache=True) def gamma_qg(N, nf): """ Computes the leading-order quark-gluon anomalous dimension @@ -55,7 +55,7 @@ def gamma_qg(N, nf): return result -@nb.njit("c16(c16)", cache=True) +@nb.njit(cache=True) def gamma_gq(N): """ Computes the leading-order gluon-quark anomalous dimension @@ -77,7 +77,7 @@ def gamma_gq(N): return result -@nb.njit("c16(c16,c16,u1)", cache=True) +@nb.njit(cache=True) def gamma_gg(N, s1, nf): """ Computes the leading-order gluon-gluon anomalous dimension @@ -89,7 +89,7 @@ def gamma_gg(N, s1, nf): N : complex Mellin moment s1 : complex - S1(N) + harmonic sum :math:`S_{1}` nf : int Number of active flavors @@ -103,7 +103,7 @@ def gamma_gg(N, s1, nf): return result -@nb.njit("c16[:,:](c16,c16,u1)", cache=True) +@nb.njit(cache=True) def gamma_singlet(N, s1, nf): r""" Computes the leading-order singlet anomalous dimension matrix @@ -119,7 +119,7 @@ def gamma_singlet(N, s1, nf): N : complex Mellin moment s1 : complex - S1(N) + harmonic sum :math:`S_{1}` nf : int Number of active flavors diff --git a/src/eko/anomalous_dimensions/as2.py b/src/eko/anomalous_dimensions/as2.py index 7c477c591..4dd6088c5 100644 --- a/src/eko/anomalous_dimensions/as2.py +++ b/src/eko/anomalous_dimensions/as2.py @@ -10,12 +10,12 @@ import numba as nb import numpy as np -from .. import constants -from . import harmonics +from .. import constants, harmonics +from ..harmonics.constants import log2, zeta2, zeta3 -@nb.njit("c16(c16,u1)", cache=True) -def gamma_nsm(n, nf): +@nb.njit(cache=True) +def gamma_nsm(n, nf, sx): """ Computes the |NLO| valence-like non-singlet anomalous dimension. @@ -27,6 +27,8 @@ def gamma_nsm(n, nf): Mellin moment nf : int Number of active flavors + sx : numpy.ndarray + List of harmonic sums: :math:`S_{1},S_{2}` Returns ------- @@ -34,19 +36,17 @@ def gamma_nsm(n, nf): |NLO| valence-like non-singlet anomalous dimension :math:`\\gamma_{ns,-}^{(1)}(N)` """ - S1 = harmonics.harmonic_S1(n) - S2 = harmonics.harmonic_S2(n) + S1 = sx[0] + S2 = sx[1] # Here, Sp refers to S' ("s-prime") (german: "s-strich" or in Pegasus language: SSTR) # of :cite:`Gluck:1989ze` and NOT to the Spence function a.k.a. dilogarithm - Sp1m = harmonics.harmonic_S1((n - 1) / 2) - Sp2m = harmonics.harmonic_S2((n - 1) / 2) - Sp3m = harmonics.harmonic_S3((n - 1) / 2) - g3n = harmonics.mellin_g3(n) - zeta2 = harmonics.zeta2 - zeta3 = harmonics.zeta3 + Sp1m = harmonics.S1((n - 1) / 2) + Sp2m = harmonics.S2((n - 1) / 2) + Sp3m = harmonics.S3((n - 1) / 2) + g3n = harmonics.g_functions.mellin_g3(n, S1) # fmt: off - gqq1m_cfca = 16*g3n - (144 + n*(1 + n)*(156 + n*(340 + n*(655 + 51*n*(2 + n)))))/(18.*np.power(n,3)*np.power(1 + n,3)) + (-14.666666666666666 + 8/n - 8/(1 + n))*S2 - (4*Sp2m)/(n + np.power(n,2)) + S1*(29.77777777777778 + 16/np.power(n,2) - 16*S2 + 8*Sp2m) + 2*Sp3m + 10*zeta3 + zeta2*(16*S1 - 16*Sp1m - (16*(1 + n*np.log(2)))/n) # pylint: disable=line-too-long - gqq1m_cfcf = -32*g3n + (24 - n*(-32 + 3*n*(-8 + n*(3 + n)*(3 + np.power(n,2)))))/(2.*np.power(n,3)*np.power(1 + n,3)) + (12 - 8/n + 8/(1 + n))*S2 + S1*(-24/np.power(n,2) - 8/np.power(1 + n,2) + 16*S2 - 16*Sp2m) + (8*Sp2m)/(n + np.power(n,2)) - 4*Sp3m - 20*zeta3 + zeta2*(-32*S1 + 32*Sp1m + 32*(1/n + np.log(2))) # pylint: disable=line-too-long + gqq1m_cfca = 16*g3n - (144 + n*(1 + n)*(156 + n*(340 + n*(655 + 51*n*(2 + n)))))/(18.*np.power(n,3)*np.power(1 + n,3)) + (-14.666666666666666 + 8/n - 8/(1 + n))*S2 - (4*Sp2m)/(n + np.power(n,2)) + S1*(29.77777777777778 + 16/np.power(n,2) - 16*S2 + 8*Sp2m) + 2*Sp3m + 10*zeta3 + zeta2*(16*S1 - 16*Sp1m - (16*(1 + n*log2))/n) # pylint: disable=line-too-long + gqq1m_cfcf = -32*g3n + (24 - n*(-32 + 3*n*(-8 + n*(3 + n)*(3 + np.power(n,2)))))/(2.*np.power(n,3)*np.power(1 + n,3)) + (12 - 8/n + 8/(1 + n))*S2 + S1*(-24/np.power(n,2) - 8/np.power(1 + n,2) + 16*S2 - 16*Sp2m) + (8*Sp2m)/(n + np.power(n,2)) - 4*Sp3m - 20*zeta3 + zeta2*(-32*S1 + 32*Sp1m + 32*(1/n + log2)) # pylint: disable=line-too-long gqq1m_cfnf = (-12 + n*(20 + n*(47 + 3*n*(2 + n))))/(9.*np.power(n,2)*np.power(1 + n,2)) - (40*S1)/9. + (8*S2)/3. # pylint: disable=line-too-long # fmt: on result = constants.CF * ( @@ -57,8 +57,8 @@ def gamma_nsm(n, nf): return result -@nb.njit("c16(c16,u1)", cache=True) -def gamma_nsp(n, nf): +@nb.njit(cache=True) +def gamma_nsp(n, nf, sx): """ Computes the |NLO| singlet-like non-singlet anomalous dimension. @@ -70,6 +70,8 @@ def gamma_nsp(n, nf): Mellin moment nf : int Number of active flavors + sx : numpy.ndarray + List of harmonic sums: :math:`S_{1},S_{2}` Returns ------- @@ -77,17 +79,15 @@ def gamma_nsp(n, nf): |NLO| singlet-like non-singlet anomalous dimension :math:`\\gamma_{ns,+}^{(1)}(N)` """ - S1 = harmonics.harmonic_S1(n) - S2 = harmonics.harmonic_S2(n) - Sp1p = harmonics.harmonic_S1(n / 2) - Sp2p = harmonics.harmonic_S2(n / 2) - Sp3p = harmonics.harmonic_S3(n / 2) - g3n = harmonics.mellin_g3(n) - zeta2 = harmonics.zeta2 - zeta3 = harmonics.zeta3 + S1 = sx[0] + S2 = sx[1] + Sp1p = harmonics.S1(n / 2) + Sp2p = harmonics.S2(n / 2) + Sp3p = harmonics.S3(n / 2) + g3n = harmonics.g_functions.mellin_g3(n, S1) # fmt: off - gqq1p_cfca = -16*g3n + (132 - n*(340 + n*(655 + 51*n*(2 + n))))/(18.*np.power(n,2)*np.power(1 + n,2)) + (-14.666666666666666 + 8/n - 8/(1 + n))*S2 - (4*Sp2p)/(n + np.power(n,2)) + S1*(29.77777777777778 - 16/np.power(n,2) - 16*S2 + 8*Sp2p) + 2*Sp3p + 10*zeta3 + zeta2*(16*S1 - 16*Sp1p + 16*(1/n - np.log(2))) # pylint: disable=line-too-long - gqq1p_cfcf = 32*g3n - (8 + n*(32 + n*(40 + 3*n*(3 + n)*(3 + np.power(n,2)))))/(2.*np.power(n,3)*np.power(1 + n,3)) + (12 - 8/n + 8/(1 + n))*S2 + S1*(40/np.power(n,2) - 8/np.power(1 + n,2) + 16*S2 - 16*Sp2p) + (8*Sp2p)/(n + np.power(n,2)) - 4*Sp3p - 20*zeta3 + zeta2*(-32*S1 + 32*Sp1p + 32*(-(1/n) + np.log(2))) # pylint: disable=line-too-long + gqq1p_cfca = -16*g3n + (132 - n*(340 + n*(655 + 51*n*(2 + n))))/(18.*np.power(n,2)*np.power(1 + n,2)) + (-14.666666666666666 + 8/n - 8/(1 + n))*S2 - (4*Sp2p)/(n + np.power(n,2)) + S1*(29.77777777777778 - 16/np.power(n,2) - 16*S2 + 8*Sp2p) + 2*Sp3p + 10*zeta3 + zeta2*(16*S1 - 16*Sp1p + 16*(1/n - log2)) # pylint: disable=line-too-long + gqq1p_cfcf = 32*g3n - (8 + n*(32 + n*(40 + 3*n*(3 + n)*(3 + np.power(n,2)))))/(2.*np.power(n,3)*np.power(1 + n,3)) + (12 - 8/n + 8/(1 + n))*S2 + S1*(40/np.power(n,2) - 8/np.power(1 + n,2) + 16*S2 - 16*Sp2p) + (8*Sp2p)/(n + np.power(n,2)) - 4*Sp3p - 20*zeta3 + zeta2*(-32*S1 + 32*Sp1p + 32*(-(1/n) + log2)) # pylint: disable=line-too-long gqq1p_cfnf = (-12 + n*(20 + n*(47 + 3*n*(2 + n))))/(9.*np.power(n,2)*np.power(1 + n,2)) - (40*S1)/9. + (8*S2)/3. # pylint: disable=line-too-long # fmt: on result = constants.CF * ( @@ -98,7 +98,7 @@ def gamma_nsp(n, nf): return result -@nb.njit("c16(c16,u1)", cache=True) +@nb.njit(cache=True) def gamma_ps(n, nf): """ Computes the |NLO| pure-singlet quark-quark anomalous dimension. @@ -125,8 +125,8 @@ def gamma_ps(n, nf): return result -@nb.njit("c16(c16,u1)", cache=True) -def gamma_qg(n, nf): +@nb.njit(cache=True) +def gamma_qg(n, nf, sx): """ Computes the |NLO| quark-gluon singlet anomalous dimension. @@ -138,6 +138,8 @@ def gamma_qg(n, nf): Mellin moment nf : int Number of active flavors + sx : numpy.ndarray + List of harmonic sums: :math:`S_{1},S_{2}` Returns ------- @@ -145,9 +147,9 @@ def gamma_qg(n, nf): |NLO| quark-gluon singlet anomalous dimension :math:`\\gamma_{qg}^{(1)}(N)` """ - S1 = harmonics.harmonic_S1(n) - S2 = harmonics.harmonic_S2(n) - Sp2p = harmonics.harmonic_S2(n / 2) + S1 = sx[0] + S2 = sx[1] + Sp2p = harmonics.S2(n / 2) # fmt: off gqg1_nfca = (-4*(16 + n*(64 + n*(104 + n*(128 + n*(85 + n*(36 + n*(25 + n*(15 + n*(6 + n))))))))))/((-1 + n)*np.power(n,3)*np.power(1 + n,3)*np.power(2 + n,3)) - (16*(3 + 2*n)*S1)/np.power(2 + 3*n + np.power(n,2),2) + (4*(2 + n + np.power(n,2))*np.power(S1,2))/(n*(2 + 3*n + np.power(n,2))) - (4*(2 + n + np.power(n,2))*S2)/(n*(2 + 3*n + np.power(n,2))) + (4*(2 + n + np.power(n,2))*Sp2p)/(n*(2 + 3*n + np.power(n,2))) # pylint: disable=line-too-long gqg1_nfcf = (-2*(4 + n*(8 + n*(1 + n)*(25 + n*(26 + 5*n*(2 + n))))))/(np.power(n,3)*np.power(1 + n,3)*(2 + n)) + (8*S1)/np.power(n,2) - (4*(2 + n + np.power(n,2))*np.power(S1,2))/(n*(2 + 3*n + np.power(n,2))) + (4*(2 + n + np.power(n,2))*S2)/(n*(2 + 3*n + np.power(n,2))) # pylint: disable=line-too-long @@ -158,8 +160,8 @@ def gamma_qg(n, nf): return result -@nb.njit("c16(c16,u1)", cache=True) -def gamma_gq(n, nf): +@nb.njit(cache=True) +def gamma_gq(n, nf, sx): """ Computes the |NLO| gluon-quark singlet anomalous dimension. @@ -171,6 +173,8 @@ def gamma_gq(n, nf): Mellin moment nf : int Number of active flavors + sx : numpy.ndarray + List of harmonic sums: :math:`S_{1},S_{2}` Returns ------- @@ -178,9 +182,9 @@ def gamma_gq(n, nf): |NLO| gluon-quark singlet anomalous dimension :math:`\\gamma_{gq}^{(1)}(N)` """ - S1 = harmonics.harmonic_S1(n) - S2 = harmonics.harmonic_S2(n) - Sp2p = harmonics.harmonic_S2(n / 2) + S1 = sx[0] + S2 = sx[1] + Sp2p = harmonics.S2(n / 2) # fmt: off ggq1_cfcf = (-8 + 2*n*(-12 + n*(-1 + n*(28 + n*(43 + 6*n*(5 + 2*n))))))/((-1 + n)*np.power(n,3)*np.power(1 + n,3)) - (4*(10 + n*(17 + n*(8 + 5*n)))*S1)/((-1 + n)*n*np.power(1 + n,2)) + (4*(2 + n + np.power(n,2))*np.power(S1,2))/(n*(-1 + np.power(n,2))) + (4*(2 + n + np.power(n,2))*S2)/(n*(-1 + np.power(n,2))) # pylint: disable=line-too-long ggq1_cfca = (-4*(144 + n*(432 + n*(-152 + n*(-1304 + n*(-1031 + n*(695 + n*(1678 + n*(1400 + n*(621 + 109*n))))))))))/(9.*np.power(n,3)*np.power(1 + n,3)*np.power(-2 + n + np.power(n,2),2)) + (4*(-12 + n*(-22 + 41*n + 17*np.power(n,3)))*S1)/(3.*np.power(-1 + n,2)*np.power(n,2)*(1 + n)) + ((8 + 4*n + 4*np.power(n,2))*np.power(S1,2))/(n - np.power(n,3)) + ((8 + 4*n + 4*np.power(n,2))*S2)/(n - np.power(n,3)) + (4*(2 + n + np.power(n,2))*Sp2p)/(n*(-1 + np.power(n,2))) # pylint: disable=line-too-long @@ -194,8 +198,8 @@ def gamma_gq(n, nf): return result -@nb.njit("c16(c16,u1)", cache=True) -def gamma_gg(n, nf): +@nb.njit(cache=True) +def gamma_gg(n, nf, sx): """ Computes the |NLO| gluon-gluon singlet anomalous dimension. @@ -207,6 +211,8 @@ def gamma_gg(n, nf): Mellin moment nf : int Number of active flavors + sx : numpy.ndarray + List of harmonic sums: :math:`S_{1},S_{2}` Returns ------- @@ -214,15 +220,13 @@ def gamma_gg(n, nf): |NLO| gluon-gluon singlet anomalous dimension :math:`\\gamma_{gg}^{(1)}(N)` """ - S1 = harmonics.harmonic_S1(n) - Sp1p = harmonics.harmonic_S1(n / 2) - Sp2p = harmonics.harmonic_S2(n / 2) - Sp3p = harmonics.harmonic_S3(n / 2) - g3n = harmonics.mellin_g3(n) - zeta2 = harmonics.zeta2 - zeta3 = harmonics.zeta3 + S1 = sx[0] + Sp1p = harmonics.S1(n / 2) + Sp2p = harmonics.S2(n / 2) + Sp3p = harmonics.S3(n / 2) + g3n = harmonics.g_functions.mellin_g3(n, S1) # fmt: off - ggg1_caca = 16*g3n - (2*(576 + n*(1488 + n*(560 + n*(-1248 + n*(-1384 + n*(1663 + n*(4514 + n*(4744 + n*(3030 + n*(1225 + 48*n*(7 + n))))))))))))/(9.*np.power(-1 + n,2)*np.power(n,3)*np.power(1 + n,3)*np.power(2 + n,3)) + S1*(29.77777777777778 + 16/np.power(-1 + n,2) + 16/np.power(1 + n,2) - 16/np.power(2 + n,2) - 8*Sp2p) + (16*(1 + n + np.power(n,2))*Sp2p)/(n*(1 + n)*(-2 + n + np.power(n,2))) - 2*Sp3p - 10*zeta3 + zeta2*(-16*S1 + 16*Sp1p + 16*(-(1/n) + np.log(2))) # pylint: disable=line-too-long + ggg1_caca = 16*g3n - (2*(576 + n*(1488 + n*(560 + n*(-1248 + n*(-1384 + n*(1663 + n*(4514 + n*(4744 + n*(3030 + n*(1225 + 48*n*(7 + n))))))))))))/(9.*np.power(-1 + n,2)*np.power(n,3)*np.power(1 + n,3)*np.power(2 + n,3)) + S1*(29.77777777777778 + 16/np.power(-1 + n,2) + 16/np.power(1 + n,2) - 16/np.power(2 + n,2) - 8*Sp2p) + (16*(1 + n + np.power(n,2))*Sp2p)/(n*(1 + n)*(-2 + n + np.power(n,2))) - 2*Sp3p - 10*zeta3 + zeta2*(-16*S1 + 16*Sp1p + 16*(-(1/n) + log2)) # pylint: disable=line-too-long ggg1_canf = (8*(6 + n*(1 + n)*(28 + n*(1 + n)*(13 + 3*n*(1 + n)))))/(9.*np.power(n,2)*np.power(1 + n,2)*(-2 + n + np.power(n,2))) - (40*S1)/9. # pylint: disable=line-too-long ggg1_cfnf = (2*(-8 + n*(-8 + n*(-10 + n*(-22 + n*(-3 + n*(6 + n*(8 + n*(4 + n)))))))))/(np.power(n,3)*np.power(1 + n,3)*(-2 + n + np.power(n,2))) # pylint: disable=line-too-long # fmt: on @@ -232,8 +236,8 @@ def gamma_gg(n, nf): return result -@nb.njit("c16[:,:](c16,u1)", cache=True) -def gamma_singlet(N, nf): +@nb.njit(cache=True) +def gamma_singlet(n, nf, sx): r""" Computes the next-leading-order singlet anomalous dimension matrix @@ -247,6 +251,8 @@ def gamma_singlet(N, nf): ---------- N : complex Mellin moment + sx : numpy.ndarray + List of harmonic sums: :math:`S_{1},S_{2}` nf : int Number of active flavors @@ -263,8 +269,9 @@ def gamma_singlet(N, nf): gamma_gq : :math:`\gamma_{gq}^{(1)}` gamma_gg : :math:`\gamma_{gg}^{(1)}` """ - gamma_qq = gamma_nsp(N, nf) + gamma_ps(N, nf) + gamma_qq = gamma_nsp(n, nf, sx) + gamma_ps(n, nf) gamma_S_0 = np.array( - [[gamma_qq, gamma_qg(N, nf)], [gamma_gq(N, nf), gamma_gg(N, nf)]], np.complex_ + [[gamma_qq, gamma_qg(n, nf, sx)], [gamma_gq(n, nf, sx), gamma_gg(n, nf, sx)]], + np.complex_, ) return gamma_S_0 diff --git a/src/eko/anomalous_dimensions/as3.py b/src/eko/anomalous_dimensions/as3.py index c0864d2ff..49fe1cc0f 100644 --- a/src/eko/anomalous_dimensions/as3.py +++ b/src/eko/anomalous_dimensions/as3.py @@ -9,14 +9,10 @@ import numba as nb import numpy as np -from . import harmonics +from ..harmonics.constants import zeta2, zeta3 -# Global variables -zeta2 = harmonics.zeta2 -zeta3 = harmonics.zeta3 - -@nb.njit("c16(c16,u1,c16[:])", cache=True) +@nb.njit(cache=True) def gamma_nsm(n, nf, sx): """ Computes the |NNLO| valence-like non-singlet anomalous dimension. @@ -29,8 +25,8 @@ def gamma_nsm(n, nf, sx): Mellin moment nf : int Number of active flavors - sx : np array - List of harmonic sums + sx : np.ndarray + List of harmonic sums: :math:`S_{1},S_{2},S_{3}` Returns ------- @@ -93,7 +89,7 @@ def gamma_nsm(n, nf, sx): return result -@nb.njit("c16(c16,u1,c16[:])", cache=True) +@nb.njit(cache=True) def gamma_nsp(n, nf, sx): """ Computes the |NNLO| singlet-like non-singlet anomalous dimension. @@ -106,8 +102,8 @@ def gamma_nsp(n, nf, sx): Mellin moment nf : int Number of active flavors - sx : np array - List of harmonic sums + sx : np.ndarray + List of harmonic sums: :math:`S_{1},S_{2},S_{3}` Returns ------- @@ -170,7 +166,7 @@ def gamma_nsp(n, nf, sx): return result -@nb.njit("c16(c16,u1,c16[:])", cache=True) +@nb.njit(cache=True) def gamma_nsv(n, nf, sx): """ Computes the |NNLO| valence non-singlet anomalous dimension. @@ -183,8 +179,8 @@ def gamma_nsv(n, nf, sx): Mellin moment nf : int Number of active flavors - sx : np array - List of harmonic sums + sx : np.ndarray + List of harmonic sums: :math:`S_{1},S_{2},S_{3}` Returns ------- @@ -225,7 +221,7 @@ def gamma_nsv(n, nf, sx): return result -@nb.njit("c16(c16,u1,c16[:])", cache=True) +@nb.njit(cache=True) def gamma_ps(n, nf, sx): """ Computes the |NNLO| pure-singlet quark-quark anomalous dimension. @@ -238,8 +234,8 @@ def gamma_ps(n, nf, sx): Mellin moment nf : int Number of active flavors - sx : np array - List of harmonic sums + sx : np.ndarray + List of harmonic sums: :math:`S_{1},S_{2},S_{3}` Returns ------- @@ -297,7 +293,7 @@ def gamma_ps(n, nf, sx): return result -@nb.njit("c16(c16,u1,c16[:])", cache=True) +@nb.njit(cache=True) def gamma_qg(n, nf, sx): """ Computes the |NNLO| quark-gluon singlet anomalous dimension. @@ -310,8 +306,8 @@ def gamma_qg(n, nf, sx): Mellin moment nf : int Number of active flavors - sx : np array - List of harmonic sums + sx : np.ndarray + List of harmonic sums: :math:`S_{1},S_{2},S_{3}` Returns ------- @@ -371,7 +367,7 @@ def gamma_qg(n, nf, sx): return result -@nb.njit("c16(c16,u1,c16[:])", cache=True) +@nb.njit(cache=True) def gamma_gq(n, nf, sx): """ Computes the |NNLO| gluon-quark singlet anomalous dimension. @@ -384,8 +380,8 @@ def gamma_gq(n, nf, sx): Mellin moment nf : int Number of active flavors - sx : np array - List of harmonic sums + sx : np.ndarray + List of harmonic sums: :math:`S_{1},S_{2},S_{3}` Returns ------- @@ -461,7 +457,7 @@ def gamma_gq(n, nf, sx): return result -@nb.njit("c16(c16,u1,c16[:])", cache=True) +@nb.njit(cache=True) def gamma_gg(n, nf, sx): """ Computes the |NNLO| gluon-gluon singlet anomalous dimension. @@ -474,8 +470,8 @@ def gamma_gg(n, nf, sx): Mellin moment nf : int Number of active flavors - sx : np array - List of harmonic sums + sx : np.ndarray + List of harmonic sums: :math:`S_{1},S_{2},S_{3}` Returns ------- @@ -549,7 +545,7 @@ def gamma_gg(n, nf, sx): return result -@nb.njit("c16[:,:](c16,u1,c16[:])", cache=True) +@nb.njit(cache=True) def gamma_singlet(N, nf, sx): r""" Computes the |NNLO| singlet anomalous dimension matrix @@ -566,8 +562,8 @@ def gamma_singlet(N, nf, sx): Mellin moment nf : int Number of active flavors - sx : np array - List of harmonic sums + sx : np.ndarray + List of harmonic sums: :math:`S_{1},S_{2},S_{3}` Returns diff --git a/src/eko/beta.py b/src/eko/beta.py index f7d9af05d..6a466727d 100644 --- a/src/eko/beta.py +++ b/src/eko/beta.py @@ -8,10 +8,10 @@ import numba as nb from . import constants -from .anomalous_dimensions.harmonics import zeta3 +from .harmonics.constants import zeta3 -@nb.njit("f8(u1)", cache=True) +@nb.njit(cache=True) def beta_0(nf): """ Computes the first coefficient of the QCD beta function. @@ -32,7 +32,7 @@ def beta_0(nf): return beta_0 -@nb.njit("f8(u1)", cache=True) +@nb.njit(cache=True) def beta_1(nf): """ Computes the second coefficient of the QCD beta function. @@ -57,7 +57,7 @@ def beta_1(nf): return beta_1 -@nb.njit("f8(u1)", cache=True) +@nb.njit(cache=True) def beta_2(nf): """ Computes the third coefficient of the QCD beta function @@ -86,7 +86,7 @@ def beta_2(nf): return beta_2 -@nb.njit("f8(u1)", cache=True) +@nb.njit(cache=True) def beta_3(nf): """ Computes the fourth coefficient of the QCD beta function @@ -113,7 +113,7 @@ def beta_3(nf): return beta_3 -@nb.njit("f8(u1,u1)", cache=True) +@nb.njit(cache=True) def beta(k, nf): """ Compute value of a beta coefficients @@ -144,7 +144,7 @@ def beta(k, nf): return beta_ -@nb.njit("f8(u1,u1)", cache=True) +@nb.njit(cache=True) def b(k, nf): """ Compute b coefficient. diff --git a/src/eko/constants.py b/src/eko/constants.py index a9bb89027..46cea08e1 100644 --- a/src/eko/constants.py +++ b/src/eko/constants.py @@ -1,36 +1,45 @@ # -*- coding: utf-8 -*- -r""" -This files sets the physical constants. - -""" +"""This files sets the physical constants.""" NC = 3 -"""the number of colors""" +"""The number of colors.""" TR = float(1.0 / 2.0) -"""the normalization of fundamental generators - defaults to :math:`T_R = 1/2`""" +"""The normalization of fundamental generators. + +Defaults to :math:`T_R = 1/2`. +""" CA = float(NC) -"""second Casimir constant in the adjoint representation - defaults to :math:`N_C = 3`""" +"""Second Casimir constant in the adjoint representation. + +Defaults to :math:`N_C = 3`. +""" CF = float((NC * NC - 1.0) / (2.0 * NC)) -"""second Casimir constant in the fundamental representation - defaults to :math:`\frac{N_C^2-1}{2N_C} = 4/3`""" +r"""Second Casimir constant in the fundamental representation. + +Defaults to :math:`\frac{N_C^2-1}{2N_C} = 4/3`. +""" eu2 = 4.0 / 9 -"""up quarks charge squared""" +"""Up quarks charge squared.""" ed2 = 1.0 / 9 -"""down quarks charge squared""" +"""Down quarks charge squared.""" def update_colors(nc): - """ - Updates the number of colors to :math:`NC = nc` and the Casimirs for a generic value of :math:`NC` + """Updates the number of colors to :math:`NC = nc`. + + The Casimirs for a generic value of :math:`NC` are consistenly updated as + well. Parameters ---------- - nc : int - Number of colors + nc : int + Number of colors + """ global NC, CA, CF # pylint: disable=global-statement diff --git a/src/eko/evolution_operator/__init__.py b/src/eko/evolution_operator/__init__.py index 3ed1db0a5..69087526a 100644 --- a/src/eko/evolution_operator/__init__.py +++ b/src/eko/evolution_operator/__init__.py @@ -5,6 +5,7 @@ See :doc:`Operator overview `. """ +import functools import logging import os import time @@ -16,7 +17,7 @@ from .. import anomalous_dimensions as ad from .. import basis_rotation as br -from .. import beta, interpolation, mellin +from .. import interpolation, mellin from .. import scale_variations as sv from ..kernels import non_singlet as ns from ..kernels import singlet as s @@ -24,15 +25,8 @@ logger = logging.getLogger(__name__) -sv_mode_dict = dict( - zip( - [None, "exponentiated", "expanded"], - [sv.unvaried, sv.mode_exponentiated, sv.mode_expanded], - ) -) - -@nb.njit("c16(c16[:,:],u2,u2)") +@nb.njit(cache=True) def select_singlet_element(ker, mode0, mode1): """ Select element of the singlet matrix @@ -77,12 +71,12 @@ class QuadKerBase: is a logarithmic interpolation logx : float Mellin inversion point - mode : str - sector element + mode0 : str + first sector element """ - def __init__(self, u, is_log, logx, mode1): - self.is_singlet = mode1 != 0 + def __init__(self, u, is_log, logx, mode0): + self.is_singlet = mode0 in [100, 21, 90] self.is_log = is_log self.u = u self.logx = logx @@ -122,7 +116,7 @@ def integrand( return self.path.prefactor * pj * self.path.jac -@nb.njit("f8(f8,u1,u2,u2,string,b1,f8,f8[:,:],f8,f8,f8,f8,u4,u1,u1)", cache=True) +@nb.njit(cache=True) def quad_ker( u, order, @@ -173,15 +167,15 @@ def quad_ker( number of evolution steps ev_op_max_order : int perturbative expansion order of U - sv_mode: int - use scale variation mode 0: none, 1: exponentiated, 2: expanded + sv_mode: int, `enum.IntEnum` + scale variation mode, see `eko.scale_variations.Modes` Returns ------- ker : float evaluated integration kernel """ - ker_base = QuadKerBase(u, is_log, logx, mode1) + ker_base = QuadKerBase(u, is_log, logx, mode0) integrand = ker_base.integrand(areas) if integrand == 0.0: return 0.0 @@ -189,23 +183,23 @@ def quad_ker( # compute the actual evolution kernel if ker_base.is_singlet: gamma_singlet = ad.gamma_singlet(order, ker_base.n, nf) - # scale var A is directly applied on gamma - if sv_mode == sv.mode_exponentiated: + # scale var exponentiated is directly applied on gamma + if sv_mode == sv.Modes.exponentiated: gamma_singlet = sv.exponentiated.gamma_variation( gamma_singlet, order, nf, L ) ker = s.dispatcher( order, method, gamma_singlet, a1, a0, nf, ev_op_iterations, ev_op_max_order ) - # scale var B is applied on the kernel - if sv_mode == sv.mode_expanded: + # scale var expanded is applied on the kernel + if sv_mode == sv.Modes.expanded: ker = np.ascontiguousarray(ker) @ np.ascontiguousarray( sv.expanded.singlet_variation(gamma_singlet, a1, order, nf, L) ) ker = select_singlet_element(ker, mode0, mode1) else: gamma_ns = ad.gamma_ns(order, mode0, ker_base.n, nf) - if sv_mode == sv.mode_exponentiated: + if sv_mode == sv.Modes.exponentiated: gamma_ns = sv.exponentiated.gamma_variation(gamma_ns, order, nf, L) ker = ns.dispatcher( order, @@ -216,7 +210,7 @@ def quad_ker( nf, ev_op_iterations, ) - if sv_mode == sv.mode_expanded: + if sv_mode == sv.Modes.expanded: ker = ker * sv.expanded.non_singlet_variation(gamma_ns, a1, order, nf, L) # recombine everthing @@ -245,7 +239,11 @@ class Operator: cut to the upper limit in the mellin inversion """ - def __init__(self, config, managers, nf, q2_from, q2_to, mellin_cut=5e-2): + log_label = "Evolution" + # complete list of possible evolution operators labels + full_labels = br.full_labels + + def __init__(self, config, managers, nf, q2_from, q2_to=None, mellin_cut=5e-2): self.config = config self.managers = managers self.nf = nf @@ -255,6 +253,13 @@ def __init__(self, config, managers, nf, q2_from, q2_to, mellin_cut=5e-2): self._mellin_cut = mellin_cut self.op_members = {} + @property + def n_pools(self): + n_pools = self.config["n_integration_cores"] + if n_pools > 0: + return n_pools + return os.cpu_count() + n_pools + @property def fact_to_ren(self): r"""Returns the factor :math:`(\mu_F/\mu_R)^2`""" @@ -263,7 +268,9 @@ def fact_to_ren(self): @property def sv_mode(self): """Returns the scale variation mode""" - return sv_mode_dict[self.config["ModSV"]] + if self.config["ModSV"] is not None: + return sv.Modes[self.config["ModSV"]] + return sv.Modes.unvaried @property def int_disp(self): @@ -299,7 +306,7 @@ def labels(self): labels = [] # the NS sector is dynamic if self.config["debug_skip_non_singlet"]: - logger.warning("Evolution: skipping non-singlet sector") + logger.warning("%s: skipping non-singlet sector", self.log_label) else: # add + as default labels.append(br.non_singlet_labels[1]) @@ -309,15 +316,48 @@ def labels(self): labels.append(br.non_singlet_labels[2]) # singlet sector is fixed if self.config["debug_skip_singlet"]: - logger.warning("Evolution: skipping singlet sector") + logger.warning("%s: skipping singlet sector", self.log_label) else: labels.extend(br.singlet_labels) return labels - @property - def quad_ker(self): - """Integrand function""" - return quad_ker + def quad_ker(self, label, logx, areas): + """ + Partially initialized integrand function + + Parameters + ---------- + label: tuple + operator element pids + logx: float + Mellin inversion point + areas : tuple + basis function configuration + + Returns + ------- + quad_ker : functools.partial + partially initialized intration kernel + + """ + return functools.partial( + quad_ker, + # TODO: implement N3LO evolution kernels + order=self.config["order"] if self.config["order"] != 3 else 2, + mode0=label[0], + mode1=label[1], + method=self.config["method"], + is_log=self.int_disp.log, + logx=logx, + areas=areas, + a1=self.a_s[1], + a0=self.a_s[0], + nf=self.nf, + L=np.log(self.fact_to_ren), + ev_op_iterations=self.config["ev_op_iterations"], + ev_op_max_order=self.config["ev_op_max_order"], + sv_mode=self.sv_mode, + ) def initialize_op_members(self): """Init all ops with identity or zeros if we skip them""" @@ -325,13 +365,13 @@ def initialize_op_members(self): np.eye(self.grid_size), np.zeros((self.grid_size, self.grid_size)) ) zero = OpMember(*[np.zeros((self.grid_size, self.grid_size))] * 2) - for n in br.full_labels: + for n in self.full_labels: if n in self.labels: - # off diag singlet are zero - if n in br.singlet_labels and n[0] != n[1]: - self.op_members[n] = zero.copy() - else: + # non-singlet evolution and diagonal op are identities + if n in br.non_singlet_labels or n[0] == n[1]: self.op_members[n] = eye.copy() + else: + self.op_members[n] = zero.copy() else: self.op_members[n] = zero.copy() @@ -364,25 +404,9 @@ def run_op_integration( # iterate sectors for label in self.labels: res = integrate.quad( - self.quad_ker, + self.quad_ker(label, logx, bf.areas_representation), 0.5, 1.0 - self._mellin_cut, - args=( - self.config["order"], - label[0], - label[1], - self.config["method"], - self.int_disp.log, - logx, - bf.areas_representation, - self.a_s[1], - self.a_s[0], - self.nf, - np.log(self.fact_to_ren), - self.config["ev_op_iterations"], - self.config["ev_op_max_order"], - self.sv_mode, - ), epsabs=1e-12, epsrel=1e-5, limit=100, @@ -390,9 +414,8 @@ def run_op_integration( ) temp_dict[label] = res[:2] column.append(temp_dict) - print( - f"Evolution: computing operators: - {k+1}/{self.grid_size} took: {(time.perf_counter() - start_time):6f} s" # pylint: disable=line-too-long + f"{self.log_label}: computing operators: - {k+1}/{self.grid_size} took: {(time.perf_counter() - start_time):6f} s" # pylint: disable=line-too-long ) return column @@ -402,41 +425,59 @@ def compute(self): # skip computation ? if np.isclose(self.q2_from, self.q2_to): - logger.info("Evolution: skipping unity operator at %e", self.q2_from) + logger.info( + "%s: skipping unity operator at %e", self.log_label, self.q2_from + ) self.copy_ns_ops() return - tot_start_time = time.perf_counter() logger.info( - "Evolution: computing operators %e -> %e, nf=%d", + "%s: computing operators %e -> %e, nf=%d", + self.log_label, self.q2_from, self.q2_to, self.nf, ) logger.info( - "Evolution: µ_R^2 distance: %e -> %e", + "%s: µ_R^2 distance: %e -> %e", + self.log_label, self.q2_from / self.fact_to_ren, self.q2_to / self.fact_to_ren, ) - if self.sv_mode != 0: + if self.sv_mode.name != "unvaried": logger.info( "Scale Variation: (µ_F/µ_R)^2 = %e, mode: %s", self.fact_to_ren, - "exponentiated" if self.sv_mode == 1 else "expanded", + self.sv_mode.name, ) - logger.info("Evolution: a_s distance: %e -> %e", self.a_s[0], self.a_s[1]) logger.info( - "Evolution: order: %d, solution strategy: %s", + "%s: a_s distance: %e -> %e", self.log_label, self.a_s[0], self.a_s[1] + ) + logger.info( + "%s: order: %d, solution strategy: %s", + self.log_label, self.config["order"], self.config["method"], ) + self.integrate() + # copy non-singlet kernels, if necessary + self.copy_ns_ops() + + def integrate( + self, + ): + """Run the integration""" + tot_start_time = time.perf_counter() + # run integration in parallel for each grid point - with Pool(int(os.cpu_count() / 2)) as pool: - res = pool.map( - self.run_op_integration, - enumerate(np.log(self.int_disp.xgrid_raw)), - ) + # or avoid opening a single pool + args = (self.run_op_integration, enumerate(np.log(self.int_disp.xgrid_raw))) + if self.n_pools == 1: + res = map(*args) + else: + with Pool(self.n_pools) as pool: + res = pool.map(*args) # collect results for k, row in enumerate(res): @@ -446,9 +487,11 @@ def compute(self): self.op_members[label].error[k][l] = err # closing comment - logger.info("Evolution: Total time %f s", time.perf_counter() - tot_start_time) - # copy non-singlet kernels, if necessary - self.copy_ns_ops() + logger.info( + "%s: Total time %f s", + self.log_label, + time.perf_counter() - tot_start_time, + ) def copy_ns_ops(self): """Copy non-singlet kernels, if necessary""" diff --git a/src/eko/evolution_operator/grid.py b/src/eko/evolution_operator/grid.py index bea651f1c..0a28802f7 100644 --- a/src/eko/evolution_operator/grid.py +++ b/src/eko/evolution_operator/grid.py @@ -126,6 +126,7 @@ def from_dict( config["ev_op_iterations"] = operators_card["ev_op_iterations"] config["debug_skip_singlet"] = operators_card["debug_skip_singlet"] config["debug_skip_non_singlet"] = operators_card["debug_skip_non_singlet"] + config["n_integration_cores"] = operators_card["n_integration_cores"] config["HQ"] = theory_card["HQ"] config["ModSV"] = theory_card["ModSV"] q2_grid = np.array(operators_card["Q2grid"], np.float_) @@ -170,7 +171,17 @@ def get_threshold_operators(self, path): shift = flavor_shift(is_downward) for seg in path[:-1]: new_op_key = seg.tuple - ome = OperatorMatrixElement(self.config, self.managers, is_downward) + thr_config = self.managers["thresholds_config"] + kthr = thr_config.thresholds_ratios[seg.nf - shift] + ome = OperatorMatrixElement( + self.config, + self.managers, + seg.nf - shift + 3, + seg.q2_to, + is_downward, + np.log(kthr), + self.config["HQ"] == "MSBAR", + ) if new_op_key not in self._threshold_operators: # Compute the operator and store it logger.info("Prepare threshold operator") @@ -183,15 +194,8 @@ def get_threshold_operators(self, path): # Compute the matching conditions and store it if seg.q2_to not in self._matching_operators: - thr_config = self.managers["thresholds_config"] - kthr = thr_config.thresholds_ratios[seg.nf - shift] - ome.compute( - seg.q2_to, - seg.nf - shift + 3, - np.log(kthr), - self.config["HQ"] == "MSBAR", - ) - self._matching_operators[seg.q2_to] = ome.ome_members + ome.compute() + self._matching_operators[seg.q2_to] = ome.op_members return thr_ops def compute(self, q2grid=None): diff --git a/src/eko/gamma.py b/src/eko/gamma.py index 15fc1b53b..6e539562c 100644 --- a/src/eko/gamma.py +++ b/src/eko/gamma.py @@ -6,10 +6,10 @@ """ import numba as nb -from .anomalous_dimensions.harmonics import zeta3, zeta4, zeta5 +from .harmonics.constants import zeta3, zeta4, zeta5 -@nb.njit("f8()", cache=True) +@nb.njit(cache=True) def gamma_0(): """ Computes the first coefficient of the QCD gamma function. @@ -24,7 +24,7 @@ def gamma_0(): return 4.0 -@nb.njit("f8(u1)", cache=True) +@nb.njit(cache=True) def gamma_1(nf): """ Computes the second coefficient of the QCD gamma function. @@ -44,7 +44,7 @@ def gamma_1(nf): return 202.0 / 3.0 - 20.0 / 9.0 * nf -@nb.njit("f8(u1)", cache=True) +@nb.njit(cache=True) def gamma_2(nf): """ Computes the third coefficient of the QCD gamma function. @@ -64,7 +64,7 @@ def gamma_2(nf): return 1249.0 - (2216.0 / 27.0 + 160.0 / 3.0 * zeta3) * nf - 140.0 / 81.0 * nf**2 -@nb.njit("f8(u1)", cache=True) +@nb.njit(cache=True) def gamma_3(nf): """ Computes the fourth coefficient of the QCD gamma function. @@ -97,7 +97,7 @@ def gamma_3(nf): ) -@nb.njit("f8(u1,u1)", cache=True) +@nb.njit(cache=True) def gamma(order, nf): """ Compute the value of a gamma coefficient diff --git a/src/eko/harmonics/__init__.py b/src/eko/harmonics/__init__.py new file mode 100644 index 000000000..087ea60f0 --- /dev/null +++ b/src/eko/harmonics/__init__.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- +""" +This module contains some harmonics sum. +Defintion are coming from :cite:`MuselliPhD,Bl_mlein_2000,Blumlein:2009ta` +""" +import numba as nb +import numpy as np + +from .w1 import S1, Sm1 +from .w2 import S2, Sm2 +from .w3 import S3, S21, S2m1, Sm2m1, Sm3, Sm21 +from .w4 import S4, S31, S211, Sm4, Sm22, Sm31, Sm211 +from .w5 import S5, S23, S41, S221, S311, S2111, S2m3, S21m2, Sm5, Sm23, Sm221, Sm2111 + + +@nb.njit(cache=True) +def base_harmonics_cache(n, is_singlet, max_weight=5, n_max_sums_weight=7): + r""" + Get the harmonics sums S basic cache. + Only single index harmonics are computed and stored + in the first (:math:`S_{n}`) or in the last column (:math:`S_{-n}`) + + Multi indices harmonics sums can be stored in the middle columns. + + Parameters + ---------- + n : complex + Mellin moment + is_singlet: bool + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`), + False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + max_weight : int + max harmonics weight, max value 5 (default) + n_max_sums_weight : int + max number of harmonics sums for a given weight + + Returns + ------- + h_cache : np.ndarray + list of harmonics sums: (weights, n_max_sums_weight) + """ + h_cache = np.zeros((max_weight, n_max_sums_weight), dtype=np.complex_) + h_cache[:, 0] = sx(n, max_weight) + if n_max_sums_weight > 1: + h_cache[:, -1] = smx(n, h_cache[:, 0], is_singlet) + return h_cache + + +@nb.njit(cache=True) +def sx(n, max_weight=5): + """ + Get the harmonics sums S cache + + Parameters + ---------- + n : complex + Mellin moment + max_weight : int + max harmonics weight, max value 5 (default) + + Returns + ------- + sx : np.ndarray + list of harmonics sums (:math:`S_{1,..,w}`) + """ + sx = np.zeros(max_weight, dtype=np.complex_) + if max_weight >= 1: + sx[0] = S1(n) + if max_weight >= 2: + sx[1] = S2(n) + if max_weight >= 3: + sx[2] = S3(n) + if max_weight >= 4: + sx[3] = S4(n) + if max_weight >= 5: + sx[4] = S5(n) + return sx + + +@nb.njit(cache=True) +def smx(n, sx, is_singlet): + r""" + Get the harmonics S-minus cache + + Parameters + ---------- + n : complex + Mellin moment + sx : numpy.ndarray + List of harmonics sums: :math:`S_{1},\dots,S_{w}` + is_singlet: bool + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`), + False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + Returns + ------- + smx : np.ndarray + list of harmonics sums (:math:`S_{-1,..,-w}`) + """ + max_weight = sx.size + smx = np.zeros(max_weight, dtype=np.complex_) + if max_weight >= 1: + smx[0] = Sm1(n, sx[0], is_singlet) + if max_weight >= 2: + smx[1] = Sm2(n, sx[1], is_singlet) + if max_weight >= 3: + smx[2] = Sm3(n, sx[2], is_singlet) + if max_weight >= 4: + smx[3] = Sm4(n, sx[3], is_singlet) + if max_weight >= 5: + smx[4] = Sm5(n, sx[4], is_singlet) + return smx + + +@nb.njit(cache=True) +def s3x(n, sx, smx, is_singlet): + r""" + Compute the weight 3 multi indices harmonics sums cache + + Parameters + ---------- + n: complex + Mellin moment + sx : list + List of harmonics sums: :math:`S_{1},S_{2}` + smx : list + List of harmonics sums: :math:`S_{-1},S_{-2}` + is_singlet: bool + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`), + False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + s3x: np.ndarray + list containing: :math:`S_{2,1},S_{2,-1},S_{-2,1},S_{-2,-1}` + """ + return np.array( + [ + S21(n, sx[0], sx[1]), + S2m1(n, sx[1], smx[0], smx[1], is_singlet), + Sm21(n, sx[0], smx[0], is_singlet), + Sm2m1(n, sx[0], sx[1], smx[1]), + ] + ) + + +@nb.njit(cache=True) +def s4x(n, sx, smx, is_singlet): + r""" + Compute the weight 4 multi indices harmonics sums cache + + Parameters + ---------- + n: complex + Mellin moment + sx : list + List of harmonics sums: :math:`S_{1},S_{2},S_{3},S_{4}` + smx : list + List of harmonics sums: :math:`S_{-1},S_{-2}` + is_singlet: bool + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`), + False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + s4x: np.ndarray + list containing: :math:`S_{3,1},S_{2,1,1},S_{-2,2},S_{-2,1,1},S_{-3,1}` + """ + sm31 = Sm31(n, sx[0], smx[0], smx[1], is_singlet) + return np.array( + [ + S31(n, sx[0], sx[1], sx[2], sx[3]), + S211(n, sx[0], sx[1], sx[2]), + Sm22(n, sx[0], sx[1], smx[1], sm31, is_singlet), + Sm211(n, sx[0], sx[1], smx[0], is_singlet), + sm31, + ] + ) diff --git a/src/eko/harmonics/constants.py b/src/eko/harmonics/constants.py new file mode 100644 index 000000000..e4f7bb98d --- /dev/null +++ b/src/eko/harmonics/constants.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +"""Zeta function values and other constants.""" + +import numpy as np +from scipy.special import zeta + +zeta2 = zeta(2) +r""":math:`\zeta(2)`""" + +zeta3 = zeta(3) +r""":math:`\zeta(3)`""" + +zeta4 = zeta(4) +r""":math:`\zeta(4)`""" + +zeta5 = zeta(5) +r""":math:`\zeta(5)`""" + +log2 = np.log(2) +r""":math:`\ln(2)`""" + +li4half = 0.517479 +""":math:`Li_{4}(1/2)`""" diff --git a/src/eko/harmonics/f_functions/__init__.py b/src/eko/harmonics/f_functions/__init__.py new file mode 100644 index 000000000..f653e1c17 --- /dev/null +++ b/src/eko/harmonics/f_functions/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +r"""This subpackage contains some Mellin transformations for 5th order harmonics sum. + +Notation refers to: + + - :cite:`Blumlein:2009ta`. Johannes Blumlein. Structural Relations of + Harmonic Sums and Mellin Transforms up to Weight w = 5. Comput. Phys. + Commun., 180:2218-2249, 2009. arXiv:0901.3106, + doi:10.1016/j.cpc.2009.07.004. + +Mellin transform is defined with the convention x^(N). +F19, F20, F21 are not present explicitly in the paper +""" # pylint: disable=line-too-long + +from .f9 import F9 +from .f11 import F11 +from .f13 import F13 +from .f14_f12 import F14F12 +from .f16 import F16 +from .f17 import F17 +from .f18 import F18 +from .f19 import F19 +from .f20 import F20 +from .f21 import F21 diff --git a/src/eko/harmonics/f_functions/f11.py b/src/eko/harmonics/f_functions/f11.py new file mode 100644 index 000000000..5ec1984e4 --- /dev/null +++ b/src/eko/harmonics/f_functions/f11.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +"""This module contains implemtation of F11. + +When using it, please cite :cite:`Blumlein:2009ta`. +Mellin transform is defined with the convention x^(N). +""" +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def F11(n, S1, S2): + """Implements eq 9.27 of :cite:`Blumlein:2009ta`""" + return ( + -0.1570209743051114 * n + - (0.4961137242141078 * n) / (2.0 + n) + + (0.14325154607236013 * n) / (3.0 + n) + + (0.043572446555835365 * n) / (4.0 + n) + - (0.1367619721729137 * n) / (5.0 + n) + + (0.5737638752229648 * n) / (6.0 + n) + - (1.6610332243741988 * n) / (7.0 + n) + + (3.333896376517311 * n) / (8.0 + n) + - (4.660416088583179 * n) / (9.0 + n) + + (4.454651830395971 * n) / (10.0 + n) + - (2.7814009672516686 * n) / (11.0 + n) + + (1.0238605215663694 * n) / (12.0 + n) + - (0.16899247190231767 * n) / (13.0 + n) + - 0.4887437258762844 * (-1.0 + 1 / (1.0 + n)) + - 1.0 + * n + * ( + -0.1570209813585035 + + 0.4166666666666667 / np.power(n, 3) + + 0.47941919157221546 / np.power(n, 2) + - 1.0 / np.power(1.0 + n, 3) + - 1.75 / np.power(1.0 + n, 2) + + 0.009326544681477866 / (1.0 + n) + + 0.75 / np.power(2.0 + n, 3) + + 1.25 / np.power(2.0 + n, 2) + + 0.8057445842680144 / (2.0 + n) + - 0.16666666666666666 / np.power(3.0 + n, 3) + - 0.25 / np.power(3.0 + n, 2) + - 0.13958627001930435 / (3.0 + n) + - (0.25 * (4.0 + 7.0 * (1.0 + n)) * S1) / np.power(1.0 + n, 2) + + (0.75 * (1 / (1.0 + n) + S1)) / np.power(2.0 + n, 2) + + (1.25 * (1 / (1.0 + n) + S1)) / (2.0 + n) + - (0.16666666666666666 * (1 / (1.0 + n) + 1 / (2.0 + n) + S1)) + / np.power(3.0 + n, 2) + - (0.25 * (1 / (1.0 + n) + 1 / (2.0 + n) + S1)) / (3.0 + n) + - ( + 0.002777777777777778 + * (22.59090896599757 - 172.59090896599758 * (1.0 + n)) + * (1 / (1.0 + n) + (1.0 - 2.0 * (1.0 + n)) / (n * (1.0 + n)) + S1) + ) + / np.power(n, 2) + + ( + 0.75 + * ( + np.power(1.0 + n, -2) + + S1 / (1.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + / (2.0 + n) + - ( + 1.0 + * ( + np.power(1.0 + n, -2) + + S1 / (1.0 + n) + - (1.0 * (1 / (1.0 + n) + S1)) / (1.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + / (1.0 + n) + - ( + 0.16666666666666666 + * ( + np.power(1.0 + n, -2) + + np.power(2.0 + n, -2) + + S1 / (1.0 + n) + + (1 / (1.0 + n) + S1) / (2.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + / (3.0 + n) + + ( + 0.4166666666666667 + * ( + np.power(1.0 + n, -2) + + 1 / (n * (1.0 + n)) + + S1 / (1.0 + n) + + ((1.0 - 2.0 * (1.0 + n)) * (1 / (1.0 + n) + S1)) / (n * (1.0 + n)) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + / n + ) + ) diff --git a/src/eko/harmonics/f_functions/f13.py b/src/eko/harmonics/f_functions/f13.py new file mode 100644 index 000000000..f540a834e --- /dev/null +++ b/src/eko/harmonics/f_functions/f13.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +"""This module contains implemtation of F13. + +When using it, please cite :cite:`Blumlein:2009ta`. +Mellin transform is defined with the convention x^(N). +""" +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def F13(n, S1, S2): + """Implements eq 9.29 of :cite:`Blumlein:2009ta`""" + return ( + -0.15312792746068732 * n + + (0.13621083778040208 * n) / (2.0 + n) + - (0.474631789932249 * n) / (3.0 + n) + + (0.24528438212633397 * n) / (4.0 + n) + - (0.26580874921126374 * n) / (5.0 + n) + + (1.2217722976683179 * n) / (6.0 + n) + - (3.6324293738026023 * n) / (7.0 + n) + + (7.4838836775956015 * n) / (8.0 + n) + - (10.706375063797914 * n) / (9.0 + n) + + (10.449787985527623 * n) / (10.0 + n) + - (6.649468393739114 * n) / (11.0 + n) + + (2.4904695902320904 * n) / (12.0 + n) + - (0.41762920477450316 * n) / (13.0 + n) + - 0.2720646169555415 * (-1.0 + 1 / (1.0 + n)) + - 0.0030864197530864196 + * n + * ( + -49.613452021037574 + + 1695.6636939202713 / (1.0 + n) + + 297.65017554444273 / (2.0 + n) + - 53.043164791285136 / (3.0 + n) + + (280.1816714156928 * (1.0 + (1.0 + n) * S1)) / np.power(1.0 + n, 2) + + (566.2149227313704 * (1.0 + (2.0 + n) * (1 / (1.0 + n) + S1))) + / np.power(2.0 + n, 2) + - ( + 115.5647471869277 + * (1.0 + (3.0 + n) * (1 / (1.0 + n) + 1 / (2.0 + n) + S1)) + ) + / np.power(3.0 + n, 2) + - ( + 1607.5136662661575 + * ( + 1.0 + + n + * (1 / (1.0 + n) + (1.0 - 2.0 * (1.0 + n)) / (n * (1.0 + n)) + S1) + ) + ) + / np.power(n, 2) + + ( + 972.0 + * ( + 1.0 + + (2.0 + n) * (1 / (1.0 + n) + S1) + + np.power(2.0 + n, 2) + * ( + np.power(1.0 + n, -2) + + S1 / (1.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + ) + / np.power(2.0 + n, 3) + - ( + 1296.0 + * ( + 1.0 + + (1.0 + n) * S1 + + np.power(1.0 + n, 2) + * ( + np.power(1.0 + n, -2) + + S1 / (1.0 + n) + - (1.0 * (1 / (1.0 + n) + S1)) / (1.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + ) + / np.power(1.0 + n, 3) + - ( + 216.0 + * ( + 1.0 + + (3.0 + n) * (1 / (1.0 + n) + 1 / (2.0 + n) + S1) + + np.power(3.0 + n, 2) + * ( + np.power(1.0 + n, -2) + + np.power(2.0 + n, -2) + + S1 / (1.0 + n) + + (1 / (1.0 + n) + S1) / (2.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + ) + / np.power(3.0 + n, 3) + + ( + 540.0 + * ( + 1.0 + + n + * (1 / (1.0 + n) + (1.0 - 2.0 * (1.0 + n)) / (n * (1.0 + n)) + S1) + + np.power(n, 2) + * ( + np.power(1.0 + n, -2) + + 1 / (n * (1.0 + n)) + + S1 / (1.0 + n) + + ((1.0 - 2.0 * (1.0 + n)) * (1 / (1.0 + n) + S1)) + / (n * (1.0 + n)) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + ) + / np.power(n, 3) + ) + ) diff --git a/src/eko/harmonics/f_functions/f14_f12.py b/src/eko/harmonics/f_functions/f14_f12.py new file mode 100644 index 000000000..de0745bb7 --- /dev/null +++ b/src/eko/harmonics/f_functions/f14_f12.py @@ -0,0 +1,1353 @@ +# -*- coding: utf-8 -*- +# pylint: disable=too-many-lines +"""This module contains implemtation of F14 - F12. + +When using it, please cite :cite:`Blumlein:2009ta`. +Mellin transform is defined with the convention x^(N). +""" +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def F14F12(n, S1, S21): + """Linear combination of :math:`M[( 2 S_{2,2}(x)- Li_2(x)^2/2)/(1+x)](N)`""" + return ( + -0.5626569734260486 + + 0.49999902059348167 + * ( + (-1.6449340668482262 * (1 / (1.0 + n) + 1 / (2.0 + n) + S1)) / (2.0 + n) + + ( + np.power(1.0 + n, -3) + + np.power(2.0 + n, -3) + + S1 / np.power(1.0 + n, 2) + + (1 / (1.0 + n) + S1) / np.power(2.0 + n, 2) + + S21 + ) + / (2.0 + n) + + n + * ( + -1.0 / np.power(2.0 + n, 5) + + 1.6449340668482262 / np.power(2.0 + n, 3) + - 0.8117424252833533 / (2.0 + n) + - (1.0 * (1 / (1.0 + n) + S1)) / np.power(2.0 + n, 4) + + (1.6449340668482262 * (1 / (1.0 + n) + S1)) / np.power(2.0 + n, 2) + - (1.0 * (np.power(1.0 + n, -3) + S1 / np.power(1.0 + n, 2) + S21)) + / np.power(2.0 + n, 2) + ) + ) + - 0.9999999952263307 + * ( + (-1.6449340668482262 * (1 / (1.0 + n) + S1)) / (1.0 + n) + + (np.power(1.0 + n, -3) + S1 / np.power(1.0 + n, 2) + S21) / (1.0 + n) + + n + * ( + -1.0 / np.power(1.0 + n, 5) + + 1.6449340668482262 / np.power(1.0 + n, 3) + - 0.8117424252833533 / (1.0 + n) + - (1.0 * S1) / np.power(1.0 + n, 4) + + (1.6449340668482262 * S1) / np.power(1.0 + n, 2) + - ( + 1.0 + * ( + np.power(1.0 + n, -3) + + S1 / np.power(1.0 + n, 2) + - (1.0 * (1 / (1.0 + n) + S1)) / np.power(1.0 + n, 2) + + S21 + ) + ) + / np.power(1.0 + n, 2) + ) + ) + - 0.3332995604546604 + * ( + ( + -1.6449340668482262 + * ( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1 + ) + ) + / (3.0 + n) + + ( + np.power(1.0 + n, -3) + + ( + 11.0 + + 20.0 * (1.0 + n) + + 13.0 * np.power(1.0 + n, 2) + + 3.0 * np.power(1.0 + n, 3) + ) + / (np.power(2.0 + n, 3) * np.power(3.0 + n, 3)) + + S1 / np.power(1.0 + n, 2) + + ( + (5.0 + 6.0 * (1.0 + n) + 2.0 * np.power(1.0 + n, 2)) + * (1 / (1.0 + n) + S1) + ) + / (np.power(2.0 + n, 2) * np.power(3.0 + n, 2)) + + S21 + ) + / (3.0 + n) + + n + * ( + -1.0 / np.power(3.0 + n, 5) + + 1.6449340668482262 / np.power(3.0 + n, 3) + - 0.8117424252833533 / (3.0 + n) + - (1.0 * (1 / (1.0 + n) + 1 / (2.0 + n) + S1)) / np.power(3.0 + n, 4) + + (1.6449340668482262 * (1 / (1.0 + n) + 1 / (2.0 + n) + S1)) + / np.power(3.0 + n, 2) + - ( + 1.0 + * ( + np.power(1.0 + n, -3) + + np.power(2.0 + n, -3) + + S1 / np.power(1.0 + n, 2) + + (1 / (1.0 + n) + S1) / np.power(2.0 + n, 2) + + S21 + ) + ) + / np.power(3.0 + n, 2) + ) + ) + + 0.24954082848379078 + * ( + ( + -1.6449340668482262 + * ( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1 + ) + ) + / (4.0 + n) + + ( + np.power(1.0 + n, -3) + + ( + 341.0 + + 1017.0 * (1.0 + n) + + 1289.0 * np.power(1.0 + n, 2) + + 881.0 * np.power(1.0 + n, 3) + + 340.0 * np.power(1.0 + n, 4) + + 70.0 * np.power(1.0 + n, 5) + + 6.0 * np.power(1.0 + n, 6) + ) + / (np.power(2.0 + n, 3) * np.power(3.0 + n, 3) * np.power(4.0 + n, 3)) + + S1 / np.power(1.0 + n, 2) + + ( + ( + 49.0 + + 96.0 * (1.0 + n) + + 72.0 * np.power(1.0 + n, 2) + + 24.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + * (1 / (1.0 + n) + S1) + ) + / (np.power(2.0 + n, 2) * np.power(3.0 + n, 2) * np.power(4.0 + n, 2)) + + S21 + ) + / (4.0 + n) + + n + * ( + -1.0 / np.power(4.0 + n, 5) + + 1.6449340668482262 / np.power(4.0 + n, 3) + - 0.8117424252833533 / (4.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1 + ) + ) + / np.power(4.0 + n, 4) + + ( + 1.6449340668482262 + * ( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1 + ) + ) + / np.power(4.0 + n, 2) + - ( + 1.0 + * ( + np.power(1.0 + n, -3) + + ( + 11.0 + + 20.0 * (1.0 + n) + + 13.0 * np.power(1.0 + n, 2) + + 3.0 * np.power(1.0 + n, 3) + ) + / (np.power(2.0 + n, 3) * np.power(3.0 + n, 3)) + + S1 / np.power(1.0 + n, 2) + + ( + (5.0 + 6.0 * (1.0 + n) + 2.0 * np.power(1.0 + n, 2)) + * (1 / (1.0 + n) + S1) + ) + / (np.power(2.0 + n, 2) * np.power(3.0 + n, 2)) + + S21 + ) + ) + / np.power(4.0 + n, 2) + ) + ) + - 0.1967571967137462 + * ( + ( + -1.6449340668482262 + * ( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1 + ) + ) + / (5.0 + n) + + ( + np.power(1.0 + n, -3) + + ( + 23624.0 + + 90576.0 * (1.0 + n) + + 155374.0 * np.power(1.0 + n, 2) + + 155615.0 * np.power(1.0 + n, 3) + + 99831.0 * np.power(1.0 + n, 4) + + 42413.0 * np.power(1.0 + n, 5) + + 11911.0 * np.power(1.0 + n, 6) + + 2130.0 * np.power(1.0 + n, 7) + + 220.0 * np.power(1.0 + n, 8) + + 10.0 * np.power(1.0 + n, 9) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + 2.0 + * ( + 410.0 + + 1030.0 * (1.0 + n) + + 1081.0 * np.power(1.0 + n, 2) + + 600.0 * np.power(1.0 + n, 3) + + 185.0 * np.power(1.0 + n, 4) + + 30.0 * np.power(1.0 + n, 5) + + 2.0 * np.power(1.0 + n, 6) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + ) + + S21 + ) + / (5.0 + n) + + n + * ( + -1.0 / np.power(5.0 + n, 5) + + 1.6449340668482262 / np.power(5.0 + n, 3) + - 0.8117424252833533 / (5.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1 + ) + ) + / np.power(5.0 + n, 4) + + ( + 1.6449340668482262 + * ( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1 + ) + ) + / np.power(5.0 + n, 2) + - ( + 1.0 + * ( + np.power(1.0 + n, -3) + + ( + 341.0 + + 1017.0 * (1.0 + n) + + 1289.0 * np.power(1.0 + n, 2) + + 881.0 * np.power(1.0 + n, 3) + + 340.0 * np.power(1.0 + n, 4) + + 70.0 * np.power(1.0 + n, 5) + + 6.0 * np.power(1.0 + n, 6) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + ( + 49.0 + + 96.0 * (1.0 + n) + + 72.0 * np.power(1.0 + n, 2) + + 24.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + ) + + S21 + ) + ) + / np.power(5.0 + n, 2) + ) + ) + + 0.1530503487172192 + * ( + ( + -1.6449340668482262 + * ( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n) * (6.0 + n)) + + S1 + ) + ) + / (6.0 + n) + + ( + np.power(1.0 + n, -3) + + ( + 3.110824e6 + + 1.40106e7 * (1.0 + n) + + 2.894151e7 * np.power(1.0 + n, 2) + + 3.6105269e7 * np.power(1.0 + n, 3) + + 3.0197768e7 * np.power(1.0 + n, 4) + + 1.7798299e7 * np.power(1.0 + n, 5) + + 7.568825e6 * np.power(1.0 + n, 6) + + 2.337861e6 * np.power(1.0 + n, 7) + + 520317.0 * np.power(1.0 + n, 8) + + 81361.0 * np.power(1.0 + n, 9) + + 8485.0 * np.power(1.0 + n, 10) + + 530.0 * np.power(1.0 + n, 11) + + 15.0 * np.power(1.0 + n, 12) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + ( + 21076.0 + + 62100.0 * (1.0 + n) + + 79650.0 * np.power(1.0 + n, 2) + + 57660.0 * np.power(1.0 + n, 3) + + 25685.0 * np.power(1.0 + n, 4) + + 7200.0 * np.power(1.0 + n, 5) + + 1240.0 * np.power(1.0 + n, 6) + + 120.0 * np.power(1.0 + n, 7) + + 5.0 * np.power(1.0 + n, 8) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + ) + + S21 + ) + / (6.0 + n) + + n + * ( + -1.0 / np.power(6.0 + n, 5) + + 1.6449340668482262 / np.power(6.0 + n, 3) + - 0.8117424252833533 / (6.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1 + ) + ) + / np.power(6.0 + n, 4) + + ( + 1.6449340668482262 + * ( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1 + ) + ) + / np.power(6.0 + n, 2) + - ( + 1.0 + * ( + np.power(1.0 + n, -3) + + ( + 23624.0 + + 90576.0 * (1.0 + n) + + 155374.0 * np.power(1.0 + n, 2) + + 155615.0 * np.power(1.0 + n, 3) + + 99831.0 * np.power(1.0 + n, 4) + + 42413.0 * np.power(1.0 + n, 5) + + 11911.0 * np.power(1.0 + n, 6) + + 2130.0 * np.power(1.0 + n, 7) + + 220.0 * np.power(1.0 + n, 8) + + 10.0 * np.power(1.0 + n, 9) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + 2.0 + * ( + 410.0 + + 1030.0 * (1.0 + n) + + 1081.0 * np.power(1.0 + n, 2) + + 600.0 * np.power(1.0 + n, 3) + + 185.0 * np.power(1.0 + n, 4) + + 30.0 * np.power(1.0 + n, 5) + + 2.0 * np.power(1.0 + n, 6) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + ) + + S21 + ) + ) + / np.power(6.0 + n, 2) + ) + ) + - 0.10602798528818422 + * ( + ( + -1.6449340668482262 + * ( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1 + ) + ) + / (7.0 + n) + + ( + np.power(1.0 + n, -3) + + ( + 6.97339584e8 + + 3.525030432e9 * (1.0 + n) + + 8.293536336e9 * np.power(1.0 + n, 2) + + 1.2007529256e10 * np.power(1.0 + n, 3) + + 1.193375892e10 * np.power(1.0 + n, 4) + + 8.60864186e9 * np.power(1.0 + n, 5) + + 4.650892802e9 * np.power(1.0 + n, 6) + + 1.914862936e9 * np.power(1.0 + n, 7) + + 6.05522329e8 * np.power(1.0 + n, 8) + + 1.47044895e8 * np.power(1.0 + n, 9) + + 2.7198669e7 * np.power(1.0 + n, 10) + + 3.763711e6 * np.power(1.0 + n, 11) + + 377251.0 * np.power(1.0 + n, 12) + + 25865.0 * np.power(1.0 + n, 13) + + 1085.0 * np.power(1.0 + n, 14) + + 21.0 * np.power(1.0 + n, 15) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + ( + 773136.0 + + 2.554272e6 * (1.0 + n) + + 3.762752e6 * np.power(1.0 + n, 2) + + 3.23736e6 * np.power(1.0 + n, 3) + + 1.797035e6 * np.power(1.0 + n, 4) + + 671790.0 * np.power(1.0 + n, 5) + + 171248.0 * np.power(1.0 + n, 6) + + 29400.0 * np.power(1.0 + n, 7) + + 3255.0 * np.power(1.0 + n, 8) + + 210.0 * np.power(1.0 + n, 9) + + 6.0 * np.power(1.0 + n, 10) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + ) + + S21 + ) + / (7.0 + n) + + n + * ( + -1.0 / np.power(7.0 + n, 5) + + 1.6449340668482262 / np.power(7.0 + n, 3) + - 0.8117424252833533 / (7.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n) * (6.0 + n)) + + S1 + ) + ) + / np.power(7.0 + n, 4) + + ( + 1.6449340668482262 + * ( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n) * (6.0 + n)) + + S1 + ) + ) + / np.power(7.0 + n, 2) + - ( + 1.0 + * ( + np.power(1.0 + n, -3) + + ( + 3.110824e6 + + 1.40106e7 * (1.0 + n) + + 2.894151e7 * np.power(1.0 + n, 2) + + 3.6105269e7 * np.power(1.0 + n, 3) + + 3.0197768e7 * np.power(1.0 + n, 4) + + 1.7798299e7 * np.power(1.0 + n, 5) + + 7.568825e6 * np.power(1.0 + n, 6) + + 2.337861e6 * np.power(1.0 + n, 7) + + 520317.0 * np.power(1.0 + n, 8) + + 81361.0 * np.power(1.0 + n, 9) + + 8485.0 * np.power(1.0 + n, 10) + + 530.0 * np.power(1.0 + n, 11) + + 15.0 * np.power(1.0 + n, 12) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + ( + 21076.0 + + 62100.0 * (1.0 + n) + + 79650.0 * np.power(1.0 + n, 2) + + 57660.0 * np.power(1.0 + n, 3) + + 25685.0 * np.power(1.0 + n, 4) + + 7200.0 * np.power(1.0 + n, 5) + + 1240.0 * np.power(1.0 + n, 6) + + 120.0 * np.power(1.0 + n, 7) + + 5.0 * np.power(1.0 + n, 8) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + ) + + S21 + ) + ) + / np.power(7.0 + n, 2) + ) + ) + + 0.056951717764149916 + * ( + ( + -1.6449340668482262 + * ( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1 + ) + ) + / (8.0 + n) + + ( + np.power(1.0 + n, -3) + + ( + 2.0 + * ( + 1.22980964256e11 + + 6.79202212752e11 * (1.0 + n) + + 1.762986212232e12 * np.power(1.0 + n, 2) + + 2.849976037428e12 * np.power(1.0 + n, 3) + + 3.208712317944e12 * np.power(1.0 + n, 4) + + 2.66793900071e12 * np.power(1.0 + n, 5) + + 1.696140569839e12 * np.power(1.0 + n, 6) + + 8.42534361945e11 * np.power(1.0 + n, 7) + + 3.31394293594e11 * np.power(1.0 + n, 8) + + 1.03973066426e11 * np.power(1.0 + n, 9) + + 2.6083138284e10 * np.power(1.0 + n, 10) + + 5.220244242e9 * np.power(1.0 + n, 11) + + 8.27501148e8 * np.power(1.0 + n, 12) + + 1.02512358e8 * np.power(1.0 + n, 13) + + 9.709175e6 * np.power(1.0 + n, 14) + + 678601.0 * np.power(1.0 + n, 15) + + 32970.0 * np.power(1.0 + n, 16) + + 994.0 * np.power(1.0 + n, 17) + + 14.0 * np.power(1.0 + n, 18) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + ( + 3.8402064e7 + + 1.38523392e8 * (1.0 + n) + + 2.26358048e8 * np.power(1.0 + n, 2) + + 2.20651312e8 * np.power(1.0 + n, 3) + + 1.42622963e8 * np.power(1.0 + n, 4) + + 6.434848e7 * np.power(1.0 + n, 5) + + 2.07774e7 * np.power(1.0 + n, 6) + + 4.838848e6 * np.power(1.0 + n, 7) + + 807086.0 * np.power(1.0 + n, 8) + + 94080.0 * np.power(1.0 + n, 9) + + 7280.0 * np.power(1.0 + n, 10) + + 336.0 * np.power(1.0 + n, 11) + + 7.0 * np.power(1.0 + n, 12) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + ) + + S21 + ) + / (8.0 + n) + + n + * ( + -1.0 / np.power(8.0 + n, 5) + + 1.6449340668482262 / np.power(8.0 + n, 3) + - 0.8117424252833533 / (8.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1 + ) + ) + / np.power(8.0 + n, 4) + + ( + 1.6449340668482262 + * ( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1 + ) + ) + / np.power(8.0 + n, 2) + - ( + 1.0 + * ( + np.power(1.0 + n, -3) + + ( + 6.97339584e8 + + 3.525030432e9 * (1.0 + n) + + 8.293536336e9 * np.power(1.0 + n, 2) + + 1.2007529256e10 * np.power(1.0 + n, 3) + + 1.193375892e10 * np.power(1.0 + n, 4) + + 8.60864186e9 * np.power(1.0 + n, 5) + + 4.650892802e9 * np.power(1.0 + n, 6) + + 1.914862936e9 * np.power(1.0 + n, 7) + + 6.05522329e8 * np.power(1.0 + n, 8) + + 1.47044895e8 * np.power(1.0 + n, 9) + + 2.7198669e7 * np.power(1.0 + n, 10) + + 3.763711e6 * np.power(1.0 + n, 11) + + 377251.0 * np.power(1.0 + n, 12) + + 25865.0 * np.power(1.0 + n, 13) + + 1085.0 * np.power(1.0 + n, 14) + + 21.0 * np.power(1.0 + n, 15) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + ( + 773136.0 + + 2.554272e6 * (1.0 + n) + + 3.762752e6 * np.power(1.0 + n, 2) + + 3.23736e6 * np.power(1.0 + n, 3) + + 1.797035e6 * np.power(1.0 + n, 4) + + 671790.0 * np.power(1.0 + n, 5) + + 171248.0 * np.power(1.0 + n, 6) + + 29400.0 * np.power(1.0 + n, 7) + + 3255.0 * np.power(1.0 + n, 8) + + 210.0 * np.power(1.0 + n, 9) + + 6.0 * np.power(1.0 + n, 10) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + ) + + S21 + ) + ) + / np.power(8.0 + n, 2) + ) + ) + - 0.019847559824380426 + * ( + ( + -1.6449340668482262 + * ( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1 + ) + ) + / (9.0 + n) + + ( + np.power(1.0 + n, -3) + + ( + 6.0 + * ( + 2.1452686055424e13 + + 1.27193972324352e14 * (1.0 + n) + + 3.569135825824e14 * np.power(1.0 + n, 2) + + 6.28964181904288e14 * np.power(1.0 + n, 3) + + 7.79557064653264e14 * np.power(1.0 + n, 4) + + 7.2173981400876e14 * np.power(1.0 + n, 5) + + 5.17717816384772e14 * np.power(1.0 + n, 6) + + 2.94648846212476e14 * np.power(1.0 + n, 7) + + 1.35183891860404e14 * np.power(1.0 + n, 8) + + 5.0528576648611e13 * np.power(1.0 + n, 9) + + 1.5487423206191e13 * np.power(1.0 + n, 10) + + 3.905253305568e12 * np.power(1.0 + n, 11) + + 8.10278287284e11 * np.power(1.0 + n, 12) + + 1.37943606892e11 * np.power(1.0 + n, 13) + + 1.9149259574e10 * np.power(1.0 + n, 14) + + 2.145327532e9 * np.power(1.0 + n, 15) + + 1.90913568e8 * np.power(1.0 + n, 16) + + 1.3175883e7 * np.power(1.0 + n, 17) + + 679567.0 * np.power(1.0 + n, 18) + + 24640.0 * np.power(1.0 + n, 19) + + 560.0 * np.power(1.0 + n, 20) + + 6.0 * np.power(1.0 + n, 21) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + 4.0 + * ( + 6.20783424e8 + + 2.402913888e9 * (1.0 + n) + + 4.261208648e9 * np.power(1.0 + n, 2) + + 4.5733464e9 * np.power(1.0 + n, 3) + + 3.31344237e9 * np.power(1.0 + n, 4) + + 1.713293694e9 * np.power(1.0 + n, 5) + + 6.51986769e8 * np.power(1.0 + n, 6) + + 1.85551632e8 * np.power(1.0 + n, 7) + + 3.9703709e7 * np.power(1.0 + n, 8) + + 6.360228e6 * np.power(1.0 + n, 9) + + 751317.0 * np.power(1.0 + n, 10) + + 63504.0 * np.power(1.0 + n, 11) + + 3633.0 * np.power(1.0 + n, 12) + + 126.0 * np.power(1.0 + n, 13) + + 2.0 * np.power(1.0 + n, 14) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + ) + + S21 + ) + / (9.0 + n) + + n + * ( + -1.0 / np.power(9.0 + n, 5) + + 1.6449340668482262 / np.power(9.0 + n, 3) + - 0.8117424252833533 / (9.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1 + ) + ) + / np.power(9.0 + n, 4) + + ( + 1.6449340668482262 + * ( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1 + ) + ) + / np.power(9.0 + n, 2) + - ( + 1.0 + * ( + np.power(1.0 + n, -3) + + ( + 2.0 + * ( + 1.22980964256e11 + + 6.79202212752e11 * (1.0 + n) + + 1.762986212232e12 * np.power(1.0 + n, 2) + + 2.849976037428e12 * np.power(1.0 + n, 3) + + 3.208712317944e12 * np.power(1.0 + n, 4) + + 2.66793900071e12 * np.power(1.0 + n, 5) + + 1.696140569839e12 * np.power(1.0 + n, 6) + + 8.42534361945e11 * np.power(1.0 + n, 7) + + 3.31394293594e11 * np.power(1.0 + n, 8) + + 1.03973066426e11 * np.power(1.0 + n, 9) + + 2.6083138284e10 * np.power(1.0 + n, 10) + + 5.220244242e9 * np.power(1.0 + n, 11) + + 8.27501148e8 * np.power(1.0 + n, 12) + + 1.02512358e8 * np.power(1.0 + n, 13) + + 9.709175e6 * np.power(1.0 + n, 14) + + 678601.0 * np.power(1.0 + n, 15) + + 32970.0 * np.power(1.0 + n, 16) + + 994.0 * np.power(1.0 + n, 17) + + 14.0 * np.power(1.0 + n, 18) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + ( + 3.8402064e7 + + 1.38523392e8 * (1.0 + n) + + 2.26358048e8 * np.power(1.0 + n, 2) + + 2.20651312e8 * np.power(1.0 + n, 3) + + 1.42622963e8 * np.power(1.0 + n, 4) + + 6.434848e7 * np.power(1.0 + n, 5) + + 2.07774e7 * np.power(1.0 + n, 6) + + 4.838848e6 * np.power(1.0 + n, 7) + + 807086.0 * np.power(1.0 + n, 8) + + 94080.0 * np.power(1.0 + n, 9) + + 7280.0 * np.power(1.0 + n, 10) + + 336.0 * np.power(1.0 + n, 11) + + 7.0 * np.power(1.0 + n, 12) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + ) + + S21 + ) + ) + / np.power(9.0 + n, 2) + ) + ) + + 0.003243204652309423 + * ( + ( + -1.6449340668482262 + * ( + 1 / (1.0 + n) + + ( + 3.0 + * ( + 342192.0 + + 781800.0 * (1.0 + n) + + 723680.0 * np.power(1.0 + n, 2) + + 359100.0 * np.power(1.0 + n, 3) + + 105455.0 * np.power(1.0 + n, 4) + + 18900.0 * np.power(1.0 + n, 5) + + 2030.0 * np.power(1.0 + n, 6) + + 120.0 * np.power(1.0 + n, 7) + + 3.0 * np.power(1.0 + n, 8) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + * (10.0 + n) + ) + + S1 + ) + ) + / (10.0 + n) + + ( + np.power(1.0 + n, -3) + + ( + 3.0 + * ( + 3.183431862446899e16 + + 2.001696918700032e17 * (1.0 + n) + + 5.98808681111543e17 * np.power(1.0 + n, 2) + + 1.1319310863695514e18 * np.power(1.0 + n, 3) + + 1.5156493142882596e18 * np.power(1.0 + n, 4) + + 1.5282976372182676e18 * np.power(1.0 + n, 5) + + 1.2049970049036114e18 * np.power(1.0 + n, 6) + + 7.616938706128154e17 * np.power(1.0 + n, 7) + + 3.92747201355673e17 * np.power(1.0 + n, 8) + + 1.6722252430665453e17 * np.power(1.0 + n, 9) + + 5.92988929379218e16 * np.power(1.0 + n, 10) + + 1.7614071211379864e16 * np.power(1.0 + n, 11) + + 4.397465867910487e15 * np.power(1.0 + n, 12) + + 9.23902782587314e14 * np.power(1.0 + n, 13) + + 1.6322843101295e14 * np.power(1.0 + n, 14) + + 2.4179602098084e13 * np.power(1.0 + n, 15) + + 2.987313035113e12 * np.power(1.0 + n, 16) + + 3.05296487914e11 * np.power(1.0 + n, 17) + + 2.550145462e10 * np.power(1.0 + n, 18) + + 1.711289424e9 * np.power(1.0 + n, 19) + + 8.9968697e7 * np.power(1.0 + n, 20) + + 3.567374e6 * np.power(1.0 + n, 21) + + 100270.0 * np.power(1.0 + n, 22) + + 1780.0 * np.power(1.0 + n, 23) + + 15.0 * np.power(1.0 + n, 24) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + * np.power(10.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + 3.0 + * ( + 6.7586510592e10 + + 2.7735912e11 * (1.0 + n) + + 5.25886236e11 * np.power(1.0 + n, 2) + + 6.098325648e11 * np.power(1.0 + n, 3) + + 4.8346372324e11 * np.power(1.0 + n, 4) + + 2.77716663e11 * np.power(1.0 + n, 5) + + 1.195744907e11 * np.power(1.0 + n, 6) + + 3.937668588e10 * np.power(1.0 + n, 7) + + 1.0027662147e10 * np.power(1.0 + n, 8) + + 1.982481e9 * np.power(1.0 + n, 9) + + 3.0344942e8 * np.power(1.0 + n, 10) + + 3.560508e7 * np.power(1.0 + n, 11) + + 3.141418e6 * np.power(1.0 + n, 12) + + 201600.0 * np.power(1.0 + n, 13) + + 8880.0 * np.power(1.0 + n, 14) + + 240.0 * np.power(1.0 + n, 15) + + 3.0 * np.power(1.0 + n, 16) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + * np.power(10.0 + n, 2) + ) + + S21 + ) + / (10.0 + n) + + n + * ( + -1.0 / np.power(10.0 + n, 5) + + 1.6449340668482262 / np.power(10.0 + n, 3) + - 0.8117424252833533 / (10.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1 + ) + ) + / np.power(10.0 + n, 4) + + ( + 1.6449340668482262 + * ( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1 + ) + ) + / np.power(10.0 + n, 2) + - ( + 1.0 + * ( + np.power(1.0 + n, -3) + + ( + 6.0 + * ( + 2.1452686055424e13 + + 1.27193972324352e14 * (1.0 + n) + + 3.569135825824e14 * np.power(1.0 + n, 2) + + 6.28964181904288e14 * np.power(1.0 + n, 3) + + 7.79557064653264e14 * np.power(1.0 + n, 4) + + 7.2173981400876e14 * np.power(1.0 + n, 5) + + 5.17717816384772e14 * np.power(1.0 + n, 6) + + 2.94648846212476e14 * np.power(1.0 + n, 7) + + 1.35183891860404e14 * np.power(1.0 + n, 8) + + 5.0528576648611e13 * np.power(1.0 + n, 9) + + 1.5487423206191e13 * np.power(1.0 + n, 10) + + 3.905253305568e12 * np.power(1.0 + n, 11) + + 8.10278287284e11 * np.power(1.0 + n, 12) + + 1.37943606892e11 * np.power(1.0 + n, 13) + + 1.9149259574e10 * np.power(1.0 + n, 14) + + 2.145327532e9 * np.power(1.0 + n, 15) + + 1.90913568e8 * np.power(1.0 + n, 16) + + 1.3175883e7 * np.power(1.0 + n, 17) + + 679567.0 * np.power(1.0 + n, 18) + + 24640.0 * np.power(1.0 + n, 19) + + 560.0 * np.power(1.0 + n, 20) + + 6.0 * np.power(1.0 + n, 21) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + ) + + S1 / np.power(1.0 + n, 2) + + ( + 4.0 + * ( + 6.20783424e8 + + 2.402913888e9 * (1.0 + n) + + 4.261208648e9 * np.power(1.0 + n, 2) + + 4.5733464e9 * np.power(1.0 + n, 3) + + 3.31344237e9 * np.power(1.0 + n, 4) + + 1.713293694e9 * np.power(1.0 + n, 5) + + 6.51986769e8 * np.power(1.0 + n, 6) + + 1.85551632e8 * np.power(1.0 + n, 7) + + 3.9703709e7 * np.power(1.0 + n, 8) + + 6.360228e6 * np.power(1.0 + n, 9) + + 751317.0 * np.power(1.0 + n, 10) + + 63504.0 * np.power(1.0 + n, 11) + + 3633.0 * np.power(1.0 + n, 12) + + 126.0 * np.power(1.0 + n, 13) + + 2.0 * np.power(1.0 + n, 14) + ) + * (1 / (1.0 + n) + S1) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + ) + + S21 + ) + ) + / np.power(10.0 + n, 2) + ) + ) + ) diff --git a/src/eko/harmonics/f_functions/f16.py b/src/eko/harmonics/f_functions/f16.py new file mode 100644 index 000000000..db9ecd017 --- /dev/null +++ b/src/eko/harmonics/f_functions/f16.py @@ -0,0 +1,3013 @@ +# -*- coding: utf-8 -*- +# pylint: disable=too-many-lines +"""This module contains implemtation of F16. + +When using it, please cite :cite:`Blumlein:2009ta`. +Mellin transform is defined with the convention x^(N). +""" +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def F16(n, S1, Sm1, Sm2, Sm3, Sm21): + """Implements eq 9.32 of :cite:`Blumlein:2009ta`""" + return ( + -0.23444040559418688 + - 0.9999999952263307 + * ( + -0.419833592426477 / (1.0 + n) + - (0.18119485915332012 * np.power(-1.0, 1.0 + n)) / (1.0 + n) + - (0.6010284515797971 * np.power(-1.0, 2.0 + n)) / (1.0 + n) + - (0.8224670334241131 * np.power(-1.0, 1.0 + n) * (1 / (1.0 + n) + S1)) + / (1.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 2.0 + n) + * (Sm1 - (1.0 * np.power(-1.0, n)) / (1.0 + n)) + ) + / (1.0 + n) + + ( + np.power(-1.0, 2.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + (1 / (1.0 + n) + S1) + * (Sm2 - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2)) + ) + ) + / (1.0 + n) + + n + * ( + np.power(1.0 + n, -5) + - 0.8224670334241131 / np.power(1.0 + n, 3) + - (0.8224670334241131 * np.power(-1.0, n)) / np.power(1.0 + n, 3) + + 0.419833592426477 / np.power(1.0 + n, 2) + + (1.6218904955860713 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + (1.2020569031595942 * np.power(-1.0, 1.0 + n)) / np.power(1.0 + n, 2) + - 0.3382260105347306 / (1.0 + n) + - (0.8224670334241131 * np.power(-1.0, n) * S1) / np.power(1.0 + n, 2) + - (0.8224670334241131 * np.power(-1.0, 1.0 + n) * Sm1) + / np.power(1.0 + n, 2) + + (np.power(-1.0, 1.0 + n) * Sm2) / np.power(1.0 + n, 3) + + ( + np.power(-1.0, 1.0 + n) + * ( + S1 * Sm2 + - 1.0 * Sm21 + + Sm3 + + np.power(-1.0, n) / np.power(1.0 + n, 3) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - (1.0 * (1 / (1.0 + n) + S1) * np.power(-1.0, n)) + / np.power(1.0 + n, 2) + ) + ) + / np.power(1.0 + n, 2) + ) + ) + + 0.49999902059348167 + * ( + -0.419833592426477 / (2.0 + n) + - (0.18119485915332012 * np.power(-1.0, 2.0 + n)) / (2.0 + n) + - (0.6010284515797971 * np.power(-1.0, 3.0 + n)) / (2.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 2.0 + n) + * (1 / (1.0 + n) + 1 / (2.0 + n) + S1) + ) + / (2.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 3.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + + np.power(-1.0, n) / (2.0 + n) + ) + ) + / (2.0 + n) + + ( + np.power(-1.0, 3.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - (1.0 * (1 / (1.0 + n) + S1) * np.power(-1.0, n)) + / np.power(2.0 + n, 2) + + (1 / (1.0 + n) + 1 / (2.0 + n) + S1) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + np.power(-1.0, n) / np.power(2.0 + n, 2) + ) + ) + ) + / (2.0 + n) + + n + * ( + np.power(2.0 + n, -5) + - 0.8224670334241131 / np.power(2.0 + n, 3) + - (0.8224670334241131 * np.power(-1.0, 1.0 + n)) / np.power(2.0 + n, 3) + + 0.419833592426477 / np.power(2.0 + n, 2) + + (1.6218904955860713 * np.power(-1.0, 1.0 + n)) / np.power(2.0 + n, 2) + + (1.2020569031595942 * np.power(-1.0, 2.0 + n)) / np.power(2.0 + n, 2) + - 0.3382260105347306 / (2.0 + n) + - (0.8224670334241131 * np.power(-1.0, 1.0 + n) * (1 / (1.0 + n) + S1)) + / np.power(2.0 + n, 2) + + ( + np.power(-1.0, 2.0 + n) + * (Sm2 - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2)) + ) + / np.power(2.0 + n, 3) + - ( + 0.8224670334241131 + * np.power(-1.0, 2.0 + n) + * (Sm1 - (1.0 * np.power(-1.0, n)) / (1.0 + n)) + ) + / np.power(2.0 + n, 2) + + ( + np.power(-1.0, 2.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + (1 / (1.0 + n) + S1) + * (Sm2 - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2)) + ) + ) + / np.power(2.0 + n, 2) + ) + ) + - 0.3332995604546604 + * ( + -0.419833592426477 / (3.0 + n) + - (0.18119485915332012 * np.power(-1.0, 3.0 + n)) / (3.0 + n) + - (0.6010284515797971 * np.power(-1.0, 4.0 + n)) / (3.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 3.0 + n) + * ( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1 + ) + ) + / (3.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 4.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + + np.power(-1.0, n) / ((2.0 + n) * (3.0 + n)) + ) + ) + / (3.0 + n) + + ( + np.power(-1.0, 4.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + - ( + 1.0 + * (-7.0 - 9.0 * (1.0 + n) - 3.0 * np.power(1.0 + n, 2)) + * np.power(-1.0, n) + ) + / (np.power(2.0 + n, 3) * np.power(3.0 + n, 3)) + + ( + ( + -5.0 + - 4.0 * (1.0 + n) + + np.power(1.0 + n, 2) + + np.power(1.0 + n, 3) + ) + * np.power(-1.0, n) + ) + / (np.power(2.0 + n, 3) * np.power(3.0 + n, 3)) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + (-3.0 - 2.0 * (1.0 + n)) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / (np.power(2.0 + n, 2) * np.power(3.0 + n, 2)) + + ( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - (1.0 * (-3.0 - 2.0 * (1.0 + n)) * np.power(-1.0, n)) + / (np.power(2.0 + n, 2) * np.power(3.0 + n, 2)) + ) + ) + ) + / (3.0 + n) + + n + * ( + np.power(3.0 + n, -5) + - 0.8224670334241131 / np.power(3.0 + n, 3) + - (0.8224670334241131 * np.power(-1.0, 2.0 + n)) / np.power(3.0 + n, 3) + + 0.419833592426477 / np.power(3.0 + n, 2) + + (1.6218904955860713 * np.power(-1.0, 2.0 + n)) / np.power(3.0 + n, 2) + + (1.2020569031595942 * np.power(-1.0, 3.0 + n)) / np.power(3.0 + n, 2) + - 0.3382260105347306 / (3.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 2.0 + n) + * (1 / (1.0 + n) + 1 / (2.0 + n) + S1) + ) + / np.power(3.0 + n, 2) + + ( + np.power(-1.0, 3.0 + n) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + np.power(-1.0, n) / np.power(2.0 + n, 2) + ) + ) + / np.power(3.0 + n, 3) + - ( + 0.8224670334241131 + * np.power(-1.0, 3.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + + np.power(-1.0, n) / (2.0 + n) + ) + ) + / np.power(3.0 + n, 2) + + ( + np.power(-1.0, 3.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - (1.0 * (1 / (1.0 + n) + S1) * np.power(-1.0, n)) + / np.power(2.0 + n, 2) + + (1 / (1.0 + n) + 1 / (2.0 + n) + S1) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + np.power(-1.0, n) / np.power(2.0 + n, 2) + ) + ) + ) + / np.power(3.0 + n, 2) + ) + ) + + 0.24954082848379078 + * ( + -0.419833592426477 / (4.0 + n) + - (0.18119485915332012 * np.power(-1.0, 4.0 + n)) / (4.0 + n) + - (0.6010284515797971 * np.power(-1.0, 5.0 + n)) / (4.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 4.0 + n) + * ( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1 + ) + ) + / (4.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 5.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + - ( + 1.0 + * (-5.0 - 4.0 * (1.0 + n) - 1.0 * np.power(1.0 + n, 2)) + * np.power(-1.0, n) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + ) + ) + / (4.0 + n) + + ( + np.power(-1.0, 5.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + ( + ( + -179.0 + - 423.0 * (1.0 + n) + - 425.0 * np.power(1.0 + n, 2) + - 245.0 * np.power(1.0 + n, 3) + - 90.0 * np.power(1.0 + n, 4) + - 20.0 * np.power(1.0 + n, 5) + - 2.0 * np.power(1.0 + n, 6) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + ) + - ( + 1.0 + * ( + -197.0 + - 468.0 * (1.0 + n) + - 453.0 * np.power(1.0 + n, 2) + - 232.0 * np.power(1.0 + n, 3) + - 69.0 * np.power(1.0 + n, 4) + - 12.0 * np.power(1.0 + n, 5) + - 1.0 * np.power(1.0 + n, 6) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + ( + -31.0 + - 48.0 * (1.0 + n) + - 28.0 * np.power(1.0 + n, 2) + - 8.0 * np.power(1.0 + n, 3) + - 1.0 * np.power(1.0 + n, 4) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 1.0 + * ( + -31.0 + - 48.0 * (1.0 + n) + - 28.0 * np.power(1.0 + n, 2) + - 8.0 * np.power(1.0 + n, 3) + - 1.0 * np.power(1.0 + n, 4) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + ) + ) + ) + ) + / (4.0 + n) + + n + * ( + np.power(4.0 + n, -5) + - 0.8224670334241131 / np.power(4.0 + n, 3) + - (0.8224670334241131 * np.power(-1.0, 3.0 + n)) / np.power(4.0 + n, 3) + + 0.419833592426477 / np.power(4.0 + n, 2) + + (1.6218904955860713 * np.power(-1.0, 3.0 + n)) / np.power(4.0 + n, 2) + + (1.2020569031595942 * np.power(-1.0, 4.0 + n)) / np.power(4.0 + n, 2) + - 0.3382260105347306 / (4.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 3.0 + n) + * ( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1 + ) + ) + / np.power(4.0 + n, 2) + - ( + 0.8224670334241131 + * np.power(-1.0, 4.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + + np.power(-1.0, n) / ((2.0 + n) * (3.0 + n)) + ) + ) + / np.power(4.0 + n, 2) + + ( + np.power(-1.0, 4.0 + n) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - (1.0 * (-3.0 - 2.0 * (1.0 + n)) * np.power(-1.0, n)) + / (np.power(2.0 + n, 2) * np.power(3.0 + n, 2)) + ) + ) + / np.power(4.0 + n, 3) + + ( + np.power(-1.0, 4.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + - ( + 1.0 + * (-7.0 - 9.0 * (1.0 + n) - 3.0 * np.power(1.0 + n, 2)) + * np.power(-1.0, n) + ) + / (np.power(2.0 + n, 3) * np.power(3.0 + n, 3)) + + ( + ( + -5.0 + - 4.0 * (1.0 + n) + + np.power(1.0 + n, 2) + + np.power(1.0 + n, 3) + ) + * np.power(-1.0, n) + ) + / (np.power(2.0 + n, 3) * np.power(3.0 + n, 3)) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + (-3.0 - 2.0 * (1.0 + n)) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / (np.power(2.0 + n, 2) * np.power(3.0 + n, 2)) + + ( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - (1.0 * (-3.0 - 2.0 * (1.0 + n)) * np.power(-1.0, n)) + / (np.power(2.0 + n, 2) * np.power(3.0 + n, 2)) + ) + ) + ) + / np.power(4.0 + n, 2) + ) + ) + - 0.1967571967137462 + * ( + -0.419833592426477 / (5.0 + n) + - (0.18119485915332012 * np.power(-1.0, 5.0 + n)) / (5.0 + n) + - (0.6010284515797971 * np.power(-1.0, 6.0 + n)) / (5.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 5.0 + n) + * ( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1 + ) + ) + / (5.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 6.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + + ( + 2.0 + * (7.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + * np.power(-1.0, n) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + ) + ) + / (5.0 + n) + + ( + np.power(-1.0, 6.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + ( + 2.0 + * ( + 6196.0 + + 19110.0 * (1.0 + n) + + 25497.0 * np.power(1.0 + n, 2) + + 19295.0 * np.power(1.0 + n, 3) + + 9117.0 * np.power(1.0 + n, 4) + + 2775.0 * np.power(1.0 + n, 5) + + 535.0 * np.power(1.0 + n, 6) + + 60.0 * np.power(1.0 + n, 7) + + 3.0 * np.power(1.0 + n, 8) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + ) + + ( + ( + -9656.0 + - 26544.0 * (1.0 + n) + - 29682.0 * np.power(1.0 + n, 2) + - 16521.0 * np.power(1.0 + n, 3) + - 3745.0 * np.power(1.0 + n, 4) + + 787.0 * np.power(1.0 + n, 5) + + 793.0 * np.power(1.0 + n, 6) + + 236.0 * np.power(1.0 + n, 7) + + 34.0 * np.power(1.0 + n, 8) + + 2.0 * np.power(1.0 + n, 9) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * ( + 46.0 + + 70.0 * (1.0 + n) + + 39.0 * np.power(1.0 + n, 2) + + 10.0 * np.power(1.0 + n, 3) + + np.power(1.0 + n, 4) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * ( + 46.0 + + 70.0 * (1.0 + n) + + 39.0 * np.power(1.0 + n, 2) + + 10.0 * np.power(1.0 + n, 3) + + np.power(1.0 + n, 4) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + ) + ) + ) + ) + / (5.0 + n) + + n + * ( + np.power(5.0 + n, -5) + - 0.8224670334241131 / np.power(5.0 + n, 3) + - (0.8224670334241131 * np.power(-1.0, 4.0 + n)) / np.power(5.0 + n, 3) + + 0.419833592426477 / np.power(5.0 + n, 2) + + (1.6218904955860713 * np.power(-1.0, 4.0 + n)) / np.power(5.0 + n, 2) + + (1.2020569031595942 * np.power(-1.0, 5.0 + n)) / np.power(5.0 + n, 2) + - 0.3382260105347306 / (5.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 4.0 + n) + * ( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1 + ) + ) + / np.power(5.0 + n, 2) + - ( + 0.8224670334241131 + * np.power(-1.0, 5.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + - ( + 1.0 + * (-5.0 - 4.0 * (1.0 + n) - 1.0 * np.power(1.0 + n, 2)) + * np.power(-1.0, n) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + ) + ) + / np.power(5.0 + n, 2) + + ( + np.power(-1.0, 5.0 + n) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 1.0 + * ( + -31.0 + - 48.0 * (1.0 + n) + - 28.0 * np.power(1.0 + n, 2) + - 8.0 * np.power(1.0 + n, 3) + - 1.0 * np.power(1.0 + n, 4) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + ) + ) + ) + / np.power(5.0 + n, 3) + + ( + np.power(-1.0, 5.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + ( + ( + -179.0 + - 423.0 * (1.0 + n) + - 425.0 * np.power(1.0 + n, 2) + - 245.0 * np.power(1.0 + n, 3) + - 90.0 * np.power(1.0 + n, 4) + - 20.0 * np.power(1.0 + n, 5) + - 2.0 * np.power(1.0 + n, 6) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + ) + - ( + 1.0 + * ( + -197.0 + - 468.0 * (1.0 + n) + - 453.0 * np.power(1.0 + n, 2) + - 232.0 * np.power(1.0 + n, 3) + - 69.0 * np.power(1.0 + n, 4) + - 12.0 * np.power(1.0 + n, 5) + - 1.0 * np.power(1.0 + n, 6) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + ( + -31.0 + - 48.0 * (1.0 + n) + - 28.0 * np.power(1.0 + n, 2) + - 8.0 * np.power(1.0 + n, 3) + - 1.0 * np.power(1.0 + n, 4) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 1.0 + * ( + -31.0 + - 48.0 * (1.0 + n) + - 28.0 * np.power(1.0 + n, 2) + - 8.0 * np.power(1.0 + n, 3) + - 1.0 * np.power(1.0 + n, 4) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + ) + ) + ) + ) + / np.power(5.0 + n, 2) + ) + ) + + 0.1530503487172192 + * ( + -0.419833592426477 / (6.0 + n) + - (0.18119485915332012 * np.power(-1.0, 6.0 + n)) / (6.0 + n) + - (0.6010284515797971 * np.power(-1.0, 7.0 + n)) / (6.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 6.0 + n) + * ( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n) * (6.0 + n)) + + S1 + ) + ) + / (6.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 7.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + - ( + 1.0 + * ( + -94.0 + - 114.0 * (1.0 + n) + - 55.0 * np.power(1.0 + n, 2) + - 12.0 * np.power(1.0 + n, 3) + - 1.0 * np.power(1.0 + n, 4) + ) + * np.power(-1.0, n) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n) * (6.0 + n)) + ) + ) + / (6.0 + n) + + ( + np.power(-1.0, 7.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + ( + ( + -1.364824e6 + - 4.959e6 * (1.0 + n) + - 8.21809e6 * np.power(1.0 + n, 2) + - 8.317171e6 * np.power(1.0 + n, 3) + - 5.805556e6 * np.power(1.0 + n, 4) + - 2.979747e6 * np.power(1.0 + n, 5) + - 1.160441e6 * np.power(1.0 + n, 6) + - 345225.0 * np.power(1.0 + n, 7) + - 77357.0 * np.power(1.0 + n, 8) + - 12617.0 * np.power(1.0 + n, 9) + - 1409.0 * np.power(1.0 + n, 10) + - 96.0 * np.power(1.0 + n, 11) + - 3.0 * np.power(1.0 + n, 12) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + ) + - ( + 1.0 + * ( + -1.562824e6 + - 5.7933e6 * (1.0 + n) + - 9.66711e6 * np.power(1.0 + n, 2) + - 9.628272e6 * np.power(1.0 + n, 3) + - 6.401058e6 * np.power(1.0 + n, 4) + - 3.007494e6 * np.power(1.0 + n, 5) + - 1.029715e6 * np.power(1.0 + n, 6) + - 260424.0 * np.power(1.0 + n, 7) + - 48597.0 * np.power(1.0 + n, 8) + - 6570.0 * np.power(1.0 + n, 9) + - 615.0 * np.power(1.0 + n, 10) + - 36.0 * np.power(1.0 + n, 11) + - 1.0 * np.power(1.0 + n, 12) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + ( + -12076.0 + - 29100.0 * (1.0 + n) + - 30230.0 * np.power(1.0 + n, 2) + - 17964.0 * np.power(1.0 + n, 3) + - 6753.0 * np.power(1.0 + n, 4) + - 1656.0 * np.power(1.0 + n, 5) + - 260.0 * np.power(1.0 + n, 6) + - 24.0 * np.power(1.0 + n, 7) + - 1.0 * np.power(1.0 + n, 8) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n) * (6.0 + n)) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 1.0 + * ( + -12076.0 + - 29100.0 * (1.0 + n) + - 30230.0 * np.power(1.0 + n, 2) + - 17964.0 * np.power(1.0 + n, 3) + - 6753.0 * np.power(1.0 + n, 4) + - 1656.0 * np.power(1.0 + n, 5) + - 260.0 * np.power(1.0 + n, 6) + - 24.0 * np.power(1.0 + n, 7) + - 1.0 * np.power(1.0 + n, 8) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + ) + ) + ) + ) + / (6.0 + n) + + n + * ( + np.power(6.0 + n, -5) + - 0.8224670334241131 / np.power(6.0 + n, 3) + - (0.8224670334241131 * np.power(-1.0, 5.0 + n)) / np.power(6.0 + n, 3) + + 0.419833592426477 / np.power(6.0 + n, 2) + + (1.6218904955860713 * np.power(-1.0, 5.0 + n)) / np.power(6.0 + n, 2) + + (1.2020569031595942 * np.power(-1.0, 6.0 + n)) / np.power(6.0 + n, 2) + - 0.3382260105347306 / (6.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 5.0 + n) + * ( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1 + ) + ) + / np.power(6.0 + n, 2) + - ( + 0.8224670334241131 + * np.power(-1.0, 6.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + + ( + 2.0 + * (7.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + * np.power(-1.0, n) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + ) + ) + / np.power(6.0 + n, 2) + + ( + np.power(-1.0, 6.0 + n) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * ( + 46.0 + + 70.0 * (1.0 + n) + + 39.0 * np.power(1.0 + n, 2) + + 10.0 * np.power(1.0 + n, 3) + + np.power(1.0 + n, 4) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + ) + ) + ) + / np.power(6.0 + n, 3) + + ( + np.power(-1.0, 6.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + ( + 2.0 + * ( + 6196.0 + + 19110.0 * (1.0 + n) + + 25497.0 * np.power(1.0 + n, 2) + + 19295.0 * np.power(1.0 + n, 3) + + 9117.0 * np.power(1.0 + n, 4) + + 2775.0 * np.power(1.0 + n, 5) + + 535.0 * np.power(1.0 + n, 6) + + 60.0 * np.power(1.0 + n, 7) + + 3.0 * np.power(1.0 + n, 8) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + ) + + ( + ( + -9656.0 + - 26544.0 * (1.0 + n) + - 29682.0 * np.power(1.0 + n, 2) + - 16521.0 * np.power(1.0 + n, 3) + - 3745.0 * np.power(1.0 + n, 4) + + 787.0 * np.power(1.0 + n, 5) + + 793.0 * np.power(1.0 + n, 6) + + 236.0 * np.power(1.0 + n, 7) + + 34.0 * np.power(1.0 + n, 8) + + 2.0 * np.power(1.0 + n, 9) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * ( + 46.0 + + 70.0 * (1.0 + n) + + 39.0 * np.power(1.0 + n, 2) + + 10.0 * np.power(1.0 + n, 3) + + np.power(1.0 + n, 4) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * ( + 46.0 + + 70.0 * (1.0 + n) + + 39.0 * np.power(1.0 + n, 2) + + 10.0 * np.power(1.0 + n, 3) + + np.power(1.0 + n, 4) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + ) + ) + ) + ) + / np.power(6.0 + n, 2) + ) + ) + - 0.10602798528818422 + * ( + -0.419833592426477 / (7.0 + n) + - (0.18119485915332012 * np.power(-1.0, 7.0 + n)) / (7.0 + n) + - (0.6010284515797971 * np.power(-1.0, 8.0 + n)) / (7.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 7.0 + n) + * ( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1 + ) + ) + / (7.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 8.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + + ( + 3.0 + * ( + 148.0 + + 168.0 * (1.0 + n) + + 73.0 * np.power(1.0 + n, 2) + + 14.0 * np.power(1.0 + n, 3) + + np.power(1.0 + n, 4) + ) + * np.power(-1.0, n) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + ) + ) + / (7.0 + n) + + ( + np.power(-1.0, 8.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + ( + 9.0 + * ( + 3.7315776e7 + + 1.56477888e8 * (1.0 + n) + + 3.00572848e8 * np.power(1.0 + n, 2) + + 3.51218448e8 * np.power(1.0 + n, 3) + + 2.79551676e8 * np.power(1.0 + n, 4) + + 1.60708716e8 * np.power(1.0 + n, 5) + + 6.8959587e7 * np.power(1.0 + n, 6) + + 2.2477189e7 * np.power(1.0 + n, 7) + + 5.600212e6 * np.power(1.0 + n, 8) + + 1.062467e6 * np.power(1.0 + n, 9) + + 151200.0 * np.power(1.0 + n, 10) + + 15659.0 * np.power(1.0 + n, 11) + + 1116.0 * np.power(1.0 + n, 12) + + 49.0 * np.power(1.0 + n, 13) + + np.power(1.0 + n, 14) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + ) + + ( + ( + -2.69400384e8 + - 1.055773152e9 * (1.0 + n) + - 1.862215728e9 * np.power(1.0 + n, 2) + - 1.946883032e9 * np.power(1.0 + n, 3) + - 1.328424984e9 * np.power(1.0 + n, 4) + - 6.04538588e8 * np.power(1.0 + n, 5) + - 1.71139894e8 * np.power(1.0 + n, 6) + - 1.745252e7 * np.power(1.0 + n, 7) + + 8.746623e6 * np.power(1.0 + n, 8) + + 5.172041e6 * np.power(1.0 + n, 9) + + 1.470723e6 * np.power(1.0 + n, 10) + + 270665.0 * np.power(1.0 + n, 11) + + 33685.0 * np.power(1.0 + n, 12) + + 2759.0 * np.power(1.0 + n, 13) + + 135.0 * np.power(1.0 + n, 14) + + 3.0 * np.power(1.0 + n, 15) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 3.0 + * (7.0 + 2.0 * (1.0 + n)) + * ( + 20016.0 + + 47936.0 * (1.0 + n) + + 49184.0 * np.power(1.0 + n, 2) + + 28560.0 * np.power(1.0 + n, 3) + + 10321.0 * np.power(1.0 + n, 4) + + 2380.0 * np.power(1.0 + n, 5) + + 342.0 * np.power(1.0 + n, 6) + + 28.0 * np.power(1.0 + n, 7) + + np.power(1.0 + n, 8) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + 3.0 + * (7.0 + 2.0 * (1.0 + n)) + * ( + 20016.0 + + 47936.0 * (1.0 + n) + + 49184.0 * np.power(1.0 + n, 2) + + 28560.0 * np.power(1.0 + n, 3) + + 10321.0 * np.power(1.0 + n, 4) + + 2380.0 * np.power(1.0 + n, 5) + + 342.0 * np.power(1.0 + n, 6) + + 28.0 * np.power(1.0 + n, 7) + + np.power(1.0 + n, 8) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + ) + ) + ) + ) + / (7.0 + n) + + n + * ( + np.power(7.0 + n, -5) + - 0.8224670334241131 / np.power(7.0 + n, 3) + - (0.8224670334241131 * np.power(-1.0, 6.0 + n)) / np.power(7.0 + n, 3) + + 0.419833592426477 / np.power(7.0 + n, 2) + + (1.6218904955860713 * np.power(-1.0, 6.0 + n)) / np.power(7.0 + n, 2) + + (1.2020569031595942 * np.power(-1.0, 7.0 + n)) / np.power(7.0 + n, 2) + - 0.3382260105347306 / (7.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 6.0 + n) + * ( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n) * (6.0 + n)) + + S1 + ) + ) + / np.power(7.0 + n, 2) + - ( + 0.8224670334241131 + * np.power(-1.0, 7.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + - ( + 1.0 + * ( + -94.0 + - 114.0 * (1.0 + n) + - 55.0 * np.power(1.0 + n, 2) + - 12.0 * np.power(1.0 + n, 3) + - 1.0 * np.power(1.0 + n, 4) + ) + * np.power(-1.0, n) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n) * (6.0 + n)) + ) + ) + / np.power(7.0 + n, 2) + + ( + np.power(-1.0, 7.0 + n) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 1.0 + * ( + -12076.0 + - 29100.0 * (1.0 + n) + - 30230.0 * np.power(1.0 + n, 2) + - 17964.0 * np.power(1.0 + n, 3) + - 6753.0 * np.power(1.0 + n, 4) + - 1656.0 * np.power(1.0 + n, 5) + - 260.0 * np.power(1.0 + n, 6) + - 24.0 * np.power(1.0 + n, 7) + - 1.0 * np.power(1.0 + n, 8) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + ) + ) + ) + / np.power(7.0 + n, 3) + + ( + np.power(-1.0, 7.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + ( + ( + -1.364824e6 + - 4.959e6 * (1.0 + n) + - 8.21809e6 * np.power(1.0 + n, 2) + - 8.317171e6 * np.power(1.0 + n, 3) + - 5.805556e6 * np.power(1.0 + n, 4) + - 2.979747e6 * np.power(1.0 + n, 5) + - 1.160441e6 * np.power(1.0 + n, 6) + - 345225.0 * np.power(1.0 + n, 7) + - 77357.0 * np.power(1.0 + n, 8) + - 12617.0 * np.power(1.0 + n, 9) + - 1409.0 * np.power(1.0 + n, 10) + - 96.0 * np.power(1.0 + n, 11) + - 3.0 * np.power(1.0 + n, 12) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + ) + - ( + 1.0 + * ( + -1.562824e6 + - 5.7933e6 * (1.0 + n) + - 9.66711e6 * np.power(1.0 + n, 2) + - 9.628272e6 * np.power(1.0 + n, 3) + - 6.401058e6 * np.power(1.0 + n, 4) + - 3.007494e6 * np.power(1.0 + n, 5) + - 1.029715e6 * np.power(1.0 + n, 6) + - 260424.0 * np.power(1.0 + n, 7) + - 48597.0 * np.power(1.0 + n, 8) + - 6570.0 * np.power(1.0 + n, 9) + - 615.0 * np.power(1.0 + n, 10) + - 36.0 * np.power(1.0 + n, 11) + - 1.0 * np.power(1.0 + n, 12) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + ( + -12076.0 + - 29100.0 * (1.0 + n) + - 30230.0 * np.power(1.0 + n, 2) + - 17964.0 * np.power(1.0 + n, 3) + - 6753.0 * np.power(1.0 + n, 4) + - 1656.0 * np.power(1.0 + n, 5) + - 260.0 * np.power(1.0 + n, 6) + - 24.0 * np.power(1.0 + n, 7) + - 1.0 * np.power(1.0 + n, 8) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + ) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 1.0 + * ( + -12076.0 + - 29100.0 * (1.0 + n) + - 30230.0 * np.power(1.0 + n, 2) + - 17964.0 * np.power(1.0 + n, 3) + - 6753.0 * np.power(1.0 + n, 4) + - 1656.0 * np.power(1.0 + n, 5) + - 260.0 * np.power(1.0 + n, 6) + - 24.0 * np.power(1.0 + n, 7) + - 1.0 * np.power(1.0 + n, 8) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + ) + ) + ) + ) + / np.power(7.0 + n, 2) + ) + ) + + 0.056951717764149916 + * ( + -0.419833592426477 / (8.0 + n) + - (0.18119485915332012 * np.power(-1.0, 8.0 + n)) / (8.0 + n) + - (0.6010284515797971 * np.power(-1.0, 9.0 + n)) / (8.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 8.0 + n) + * ( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1 + ) + ) + / (8.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 9.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + - ( + 1.0 + * ( + -3828.0 + - 5736.0 * (1.0 + n) + - 3661.0 * np.power(1.0 + n, 2) + - 1248.0 * np.power(1.0 + n, 3) + - 238.0 * np.power(1.0 + n, 4) + - 24.0 * np.power(1.0 + n, 5) + - 1.0 * np.power(1.0 + n, 6) + ) + * np.power(-1.0, n) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + ) + ) + / (8.0 + n) + + ( + np.power(-1.0, 9.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + - ( + 1.0 + * ( + -1.15567048512e11 + - 5.35159384704e11 * (1.0 + n) + - 1.151188217424e12 * np.power(1.0 + n, 2) + - 1.53078715296e12 * np.power(1.0 + n, 3) + - 1.412584727652e12 * np.power(1.0 + n, 4) + - 9.62381167416e11 * np.power(1.0 + n, 5) + - 5.02598549197e11 * np.power(1.0 + n, 6) + - 2.0609943264e11 * np.power(1.0 + n, 7) + - 6.7393018182e10 * np.power(1.0 + n, 8) + - 1.7735954328e10 * np.power(1.0 + n, 9) + - 3.772650903e9 * np.power(1.0 + n, 10) + - 6.48395136e8 * np.power(1.0 + n, 11) + - 8.9565928e7 * np.power(1.0 + n, 12) + - 9.831528e6 * np.power(1.0 + n, 13) + - 840651.0 * np.power(1.0 + n, 14) + - 54144.0 * np.power(1.0 + n, 15) + - 2478.0 * np.power(1.0 + n, 16) + - 72.0 * np.power(1.0 + n, 17) + - 1.0 * np.power(1.0 + n, 18) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + ) + - ( + 2.0 + * ( + 4.9589391456e10 + + 2.24271058032e11 * (1.0 + n) + + 4.7403095628e11 * np.power(1.0 + n, 2) + + 6.25731974284e11 * np.power(1.0 + n, 3) + + 5.81676555432e11 * np.power(1.0 + n, 4) + + 4.0689079961e11 * np.power(1.0 + n, 5) + + 2.23175026185e11 * np.power(1.0 + n, 6) + + 9.8520885539e10 * np.power(1.0 + n, 7) + + 3.554804558e10 * np.power(1.0 + n, 8) + + 1.0556408108e10 * np.power(1.0 + n, 9) + + 2.579863556e9 * np.power(1.0 + n, 10) + + 5.15736142e8 * np.power(1.0 + n, 11) + + 8.3361904e7 * np.power(1.0 + n, 12) + + 1.0703902e7 * np.power(1.0 + n, 13) + + 1.064065e6 * np.power(1.0 + n, 14) + + 78795.0 * np.power(1.0 + n, 15) + + 4084.0 * np.power(1.0 + n, 16) + + 132.0 * np.power(1.0 + n, 17) + + 2.0 * np.power(1.0 + n, 18) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + ( + -2.1114864e7 + - 6.3635712e7 * (1.0 + n) + - 8.634864e7 * np.power(1.0 + n, 2) + - 7.024968e7 * np.power(1.0 + n, 3) + - 3.8347981e7 * np.power(1.0 + n, 4) + - 1.4846592e7 * np.power(1.0 + n, 5) + - 4.190576e6 * np.power(1.0 + n, 6) + - 870720.0 * np.power(1.0 + n, 7) + - 132426.0 * np.power(1.0 + n, 8) + - 14400.0 * np.power(1.0 + n, 9) + - 1064.0 * np.power(1.0 + n, 10) + - 48.0 * np.power(1.0 + n, 11) + - 1.0 * np.power(1.0 + n, 12) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 1.0 + * ( + -2.1114864e7 + - 6.3635712e7 * (1.0 + n) + - 8.634864e7 * np.power(1.0 + n, 2) + - 7.024968e7 * np.power(1.0 + n, 3) + - 3.8347981e7 * np.power(1.0 + n, 4) + - 1.4846592e7 * np.power(1.0 + n, 5) + - 4.190576e6 * np.power(1.0 + n, 6) + - 870720.0 * np.power(1.0 + n, 7) + - 132426.0 * np.power(1.0 + n, 8) + - 14400.0 * np.power(1.0 + n, 9) + - 1064.0 * np.power(1.0 + n, 10) + - 48.0 * np.power(1.0 + n, 11) + - 1.0 * np.power(1.0 + n, 12) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + ) + ) + ) + ) + / (8.0 + n) + + n + * ( + np.power(8.0 + n, -5) + - 0.8224670334241131 / np.power(8.0 + n, 3) + - (0.8224670334241131 * np.power(-1.0, 7.0 + n)) / np.power(8.0 + n, 3) + + 0.419833592426477 / np.power(8.0 + n, 2) + + (1.6218904955860713 * np.power(-1.0, 7.0 + n)) / np.power(8.0 + n, 2) + + (1.2020569031595942 * np.power(-1.0, 8.0 + n)) / np.power(8.0 + n, 2) + - 0.3382260105347306 / (8.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 7.0 + n) + * ( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1 + ) + ) + / np.power(8.0 + n, 2) + - ( + 0.8224670334241131 + * np.power(-1.0, 8.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + + ( + 3.0 + * ( + 148.0 + + 168.0 * (1.0 + n) + + 73.0 * np.power(1.0 + n, 2) + + 14.0 * np.power(1.0 + n, 3) + + np.power(1.0 + n, 4) + ) + * np.power(-1.0, n) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + ) + ) + / np.power(8.0 + n, 2) + + ( + np.power(-1.0, 8.0 + n) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + 3.0 + * (7.0 + 2.0 * (1.0 + n)) + * ( + 20016.0 + + 47936.0 * (1.0 + n) + + 49184.0 * np.power(1.0 + n, 2) + + 28560.0 * np.power(1.0 + n, 3) + + 10321.0 * np.power(1.0 + n, 4) + + 2380.0 * np.power(1.0 + n, 5) + + 342.0 * np.power(1.0 + n, 6) + + 28.0 * np.power(1.0 + n, 7) + + np.power(1.0 + n, 8) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + ) + ) + ) + / np.power(8.0 + n, 3) + + ( + np.power(-1.0, 8.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + ( + 9.0 + * ( + 3.7315776e7 + + 1.56477888e8 * (1.0 + n) + + 3.00572848e8 * np.power(1.0 + n, 2) + + 3.51218448e8 * np.power(1.0 + n, 3) + + 2.79551676e8 * np.power(1.0 + n, 4) + + 1.60708716e8 * np.power(1.0 + n, 5) + + 6.8959587e7 * np.power(1.0 + n, 6) + + 2.2477189e7 * np.power(1.0 + n, 7) + + 5.600212e6 * np.power(1.0 + n, 8) + + 1.062467e6 * np.power(1.0 + n, 9) + + 151200.0 * np.power(1.0 + n, 10) + + 15659.0 * np.power(1.0 + n, 11) + + 1116.0 * np.power(1.0 + n, 12) + + 49.0 * np.power(1.0 + n, 13) + + np.power(1.0 + n, 14) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + ) + + ( + ( + -2.69400384e8 + - 1.055773152e9 * (1.0 + n) + - 1.862215728e9 * np.power(1.0 + n, 2) + - 1.946883032e9 * np.power(1.0 + n, 3) + - 1.328424984e9 * np.power(1.0 + n, 4) + - 6.04538588e8 * np.power(1.0 + n, 5) + - 1.71139894e8 * np.power(1.0 + n, 6) + - 1.745252e7 * np.power(1.0 + n, 7) + + 8.746623e6 * np.power(1.0 + n, 8) + + 5.172041e6 * np.power(1.0 + n, 9) + + 1.470723e6 * np.power(1.0 + n, 10) + + 270665.0 * np.power(1.0 + n, 11) + + 33685.0 * np.power(1.0 + n, 12) + + 2759.0 * np.power(1.0 + n, 13) + + 135.0 * np.power(1.0 + n, 14) + + 3.0 * np.power(1.0 + n, 15) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 3.0 + * (7.0 + 2.0 * (1.0 + n)) + * ( + 20016.0 + + 47936.0 * (1.0 + n) + + 49184.0 * np.power(1.0 + n, 2) + + 28560.0 * np.power(1.0 + n, 3) + + 10321.0 * np.power(1.0 + n, 4) + + 2380.0 * np.power(1.0 + n, 5) + + 342.0 * np.power(1.0 + n, 6) + + 28.0 * np.power(1.0 + n, 7) + + np.power(1.0 + n, 8) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + 3.0 + * (7.0 + 2.0 * (1.0 + n)) + * ( + 20016.0 + + 47936.0 * (1.0 + n) + + 49184.0 * np.power(1.0 + n, 2) + + 28560.0 * np.power(1.0 + n, 3) + + 10321.0 * np.power(1.0 + n, 4) + + 2380.0 * np.power(1.0 + n, 5) + + 342.0 * np.power(1.0 + n, 6) + + 28.0 * np.power(1.0 + n, 7) + + np.power(1.0 + n, 8) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + ) + ) + ) + ) + / np.power(8.0 + n, 2) + ) + ) + - 0.019847559824380426 + * ( + -0.419833592426477 / (9.0 + n) + - (0.18119485915332012 * np.power(-1.0, 9.0 + n)) / (9.0 + n) + - (0.6010284515797971 * np.power(-1.0, 10.0 + n)) / (9.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 9.0 + n) + * ( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1 + ) + ) + / (9.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 10.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + + ( + 4.0 + * ( + 6396.0 + + 9162.0 * (1.0 + n) + + 5473.0 * np.power(1.0 + n, 2) + + 1719.0 * np.power(1.0 + n, 3) + + 298.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + * np.power(-1.0, n) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + ) + ) + / (9.0 + n) + + ( + np.power(-1.0, 10.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + ( + 4.0 + * ( + 1.4760576193536e13 + + 7.3798658489088e13 * (1.0 + n) + + 1.72837443710016e14 * np.power(1.0 + n, 2) + + 2.52453402491616e14 * np.power(1.0 + n, 3) + + 2.5828967175624e14 * np.power(1.0 + n, 4) + + 1.97032446481464e14 * np.power(1.0 + n, 5) + + 1.16425369498108e14 * np.power(1.0 + n, 6) + + 5.4627507667116e13 * np.power(1.0 + n, 7) + + 2.0690074606371e13 * np.power(1.0 + n, 8) + + 6.392775359655e12 * np.power(1.0 + n, 9) + + 1.621160332314e12 * np.power(1.0 + n, 10) + + 3.38175413478e11 * np.power(1.0 + n, 11) + + 5.7948536701e10 * np.power(1.0 + n, 12) + + 8.115008166e9 * np.power(1.0 + n, 13) + + 9.1986012e8 * np.power(1.0 + n, 14) + + 8.3116584e7 * np.power(1.0 + n, 15) + + 5.847213e6 * np.power(1.0 + n, 16) + + 308691.0 * np.power(1.0 + n, 17) + + 11506.0 * np.power(1.0 + n, 18) + + 270.0 * np.power(1.0 + n, 19) + + 3.0 * np.power(1.0 + n, 20) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + ) + + ( + 2.0 + * ( + -2.3997963958272e13 + - 1.14129905965056e14 * (1.0 + n) + - 2.5222059905856e14 * np.power(1.0 + n, 2) + - 3.44033181492512e14 * np.power(1.0 + n, 3) + - 3.23935732772496e14 * np.power(1.0 + n, 4) + - 2.22502088875352e14 * np.power(1.0 + n, 5) + - 1.14348498644148e14 * np.power(1.0 + n, 6) + - 4.3968646592044e13 * np.power(1.0 + n, 7) + - 1.21438136977e13 * np.power(1.0 + n, 8) + - 2.010931672623e12 * np.power(1.0 + n, 9) + + 4.9482178305e10 * np.power(1.0 + n, 10) + + 1.59991878826e11 * np.power(1.0 + n, 11) + + 6.0723226806e10 * np.power(1.0 + n, 12) + + 1.4651858516e10 * np.power(1.0 + n, 13) + + 2.59766429e9 * np.power(1.0 + n, 14) + + 3.51680472e8 * np.power(1.0 + n, 15) + + 3.6575004e7 * np.power(1.0 + n, 16) + + 2.886025e6 * np.power(1.0 + n, 17) + + 167625.0 * np.power(1.0 + n, 18) + + 6770.0 * np.power(1.0 + n, 19) + + 170.0 * np.power(1.0 + n, 20) + + 2.0 * np.power(1.0 + n, 21) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3.6831936e7 + + 1.10670624e8 * (1.0 + n) + + 1.4936364e8 * np.power(1.0 + n, 2) + + 1.2041208e8 * np.power(1.0 + n, 3) + + 6.4783246e7 * np.power(1.0 + n, 4) + + 2.454111e7 * np.power(1.0 + n, 5) + + 6.715739e6 * np.power(1.0 + n, 6) + + 1.33785e6 * np.power(1.0 + n, 7) + + 192561.0 * np.power(1.0 + n, 8) + + 19530.0 * np.power(1.0 + n, 9) + + 1325.0 * np.power(1.0 + n, 10) + + 54.0 * np.power(1.0 + n, 11) + + np.power(1.0 + n, 12) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3.6831936e7 + + 1.10670624e8 * (1.0 + n) + + 1.4936364e8 * np.power(1.0 + n, 2) + + 1.2041208e8 * np.power(1.0 + n, 3) + + 6.4783246e7 * np.power(1.0 + n, 4) + + 2.454111e7 * np.power(1.0 + n, 5) + + 6.715739e6 * np.power(1.0 + n, 6) + + 1.33785e6 * np.power(1.0 + n, 7) + + 192561.0 * np.power(1.0 + n, 8) + + 19530.0 * np.power(1.0 + n, 9) + + 1325.0 * np.power(1.0 + n, 10) + + 54.0 * np.power(1.0 + n, 11) + + np.power(1.0 + n, 12) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + ) + ) + ) + ) + / (9.0 + n) + + n + * ( + np.power(9.0 + n, -5) + - 0.8224670334241131 / np.power(9.0 + n, 3) + - (0.8224670334241131 * np.power(-1.0, 8.0 + n)) / np.power(9.0 + n, 3) + + 0.419833592426477 / np.power(9.0 + n, 2) + + (1.6218904955860713 * np.power(-1.0, 8.0 + n)) / np.power(9.0 + n, 2) + + (1.2020569031595942 * np.power(-1.0, 9.0 + n)) / np.power(9.0 + n, 2) + - 0.3382260105347306 / (9.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 8.0 + n) + * ( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1 + ) + ) + / np.power(9.0 + n, 2) + - ( + 0.8224670334241131 + * np.power(-1.0, 9.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + - ( + 1.0 + * ( + -3828.0 + - 5736.0 * (1.0 + n) + - 3661.0 * np.power(1.0 + n, 2) + - 1248.0 * np.power(1.0 + n, 3) + - 238.0 * np.power(1.0 + n, 4) + - 24.0 * np.power(1.0 + n, 5) + - 1.0 * np.power(1.0 + n, 6) + ) + * np.power(-1.0, n) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + ) + ) + / np.power(9.0 + n, 2) + + ( + np.power(-1.0, 9.0 + n) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 1.0 + * ( + -2.1114864e7 + - 6.3635712e7 * (1.0 + n) + - 8.634864e7 * np.power(1.0 + n, 2) + - 7.024968e7 * np.power(1.0 + n, 3) + - 3.8347981e7 * np.power(1.0 + n, 4) + - 1.4846592e7 * np.power(1.0 + n, 5) + - 4.190576e6 * np.power(1.0 + n, 6) + - 870720.0 * np.power(1.0 + n, 7) + - 132426.0 * np.power(1.0 + n, 8) + - 14400.0 * np.power(1.0 + n, 9) + - 1064.0 * np.power(1.0 + n, 10) + - 48.0 * np.power(1.0 + n, 11) + - 1.0 * np.power(1.0 + n, 12) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + ) + ) + ) + / np.power(9.0 + n, 3) + + ( + np.power(-1.0, 9.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + - ( + 1.0 + * ( + -1.15567048512e11 + - 5.35159384704e11 * (1.0 + n) + - 1.151188217424e12 * np.power(1.0 + n, 2) + - 1.53078715296e12 * np.power(1.0 + n, 3) + - 1.412584727652e12 * np.power(1.0 + n, 4) + - 9.62381167416e11 * np.power(1.0 + n, 5) + - 5.02598549197e11 * np.power(1.0 + n, 6) + - 2.0609943264e11 * np.power(1.0 + n, 7) + - 6.7393018182e10 * np.power(1.0 + n, 8) + - 1.7735954328e10 * np.power(1.0 + n, 9) + - 3.772650903e9 * np.power(1.0 + n, 10) + - 6.48395136e8 * np.power(1.0 + n, 11) + - 8.9565928e7 * np.power(1.0 + n, 12) + - 9.831528e6 * np.power(1.0 + n, 13) + - 840651.0 * np.power(1.0 + n, 14) + - 54144.0 * np.power(1.0 + n, 15) + - 2478.0 * np.power(1.0 + n, 16) + - 72.0 * np.power(1.0 + n, 17) + - 1.0 * np.power(1.0 + n, 18) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + ) + - ( + 2.0 + * ( + 4.9589391456e10 + + 2.24271058032e11 * (1.0 + n) + + 4.7403095628e11 * np.power(1.0 + n, 2) + + 6.25731974284e11 * np.power(1.0 + n, 3) + + 5.81676555432e11 * np.power(1.0 + n, 4) + + 4.0689079961e11 * np.power(1.0 + n, 5) + + 2.23175026185e11 * np.power(1.0 + n, 6) + + 9.8520885539e10 * np.power(1.0 + n, 7) + + 3.554804558e10 * np.power(1.0 + n, 8) + + 1.0556408108e10 * np.power(1.0 + n, 9) + + 2.579863556e9 * np.power(1.0 + n, 10) + + 5.15736142e8 * np.power(1.0 + n, 11) + + 8.3361904e7 * np.power(1.0 + n, 12) + + 1.0703902e7 * np.power(1.0 + n, 13) + + 1.064065e6 * np.power(1.0 + n, 14) + + 78795.0 * np.power(1.0 + n, 15) + + 4084.0 * np.power(1.0 + n, 16) + + 132.0 * np.power(1.0 + n, 17) + + 2.0 * np.power(1.0 + n, 18) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + ( + -2.1114864e7 + - 6.3635712e7 * (1.0 + n) + - 8.634864e7 * np.power(1.0 + n, 2) + - 7.024968e7 * np.power(1.0 + n, 3) + - 3.8347981e7 * np.power(1.0 + n, 4) + - 1.4846592e7 * np.power(1.0 + n, 5) + - 4.190576e6 * np.power(1.0 + n, 6) + - 870720.0 * np.power(1.0 + n, 7) + - 132426.0 * np.power(1.0 + n, 8) + - 14400.0 * np.power(1.0 + n, 9) + - 1064.0 * np.power(1.0 + n, 10) + - 48.0 * np.power(1.0 + n, 11) + - 1.0 * np.power(1.0 + n, 12) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 1.0 + * ( + -2.1114864e7 + - 6.3635712e7 * (1.0 + n) + - 8.634864e7 * np.power(1.0 + n, 2) + - 7.024968e7 * np.power(1.0 + n, 3) + - 3.8347981e7 * np.power(1.0 + n, 4) + - 1.4846592e7 * np.power(1.0 + n, 5) + - 4.190576e6 * np.power(1.0 + n, 6) + - 870720.0 * np.power(1.0 + n, 7) + - 132426.0 * np.power(1.0 + n, 8) + - 14400.0 * np.power(1.0 + n, 9) + - 1064.0 * np.power(1.0 + n, 10) + - 48.0 * np.power(1.0 + n, 11) + - 1.0 * np.power(1.0 + n, 12) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + ) + ) + ) + ) + / np.power(9.0 + n, 2) + ) + ) + + 0.003243204652309423 + * ( + -0.419833592426477 / (10.0 + n) + - (0.18119485915332012 * np.power(-1.0, 10.0 + n)) / (10.0 + n) + - (0.6010284515797971 * np.power(-1.0, 11.0 + n)) / (10.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 10.0 + n) + * ( + 1 / (1.0 + n) + + ( + 3.0 + * ( + 342192.0 + + 781800.0 * (1.0 + n) + + 723680.0 * np.power(1.0 + n, 2) + + 359100.0 * np.power(1.0 + n, 3) + + 105455.0 * np.power(1.0 + n, 4) + + 18900.0 * np.power(1.0 + n, 5) + + 2030.0 * np.power(1.0 + n, 6) + + 120.0 * np.power(1.0 + n, 7) + + 3.0 * np.power(1.0 + n, 8) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + * (10.0 + n) + ) + + S1 + ) + ) + / (10.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 11.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + - ( + 1.0 + * ( + -270576.0 + - 465000.0 * (1.0 + n) + - 351800.0 * np.power(1.0 + n, 2) + - 151060.0 * np.power(1.0 + n, 3) + - 40053.0 * np.power(1.0 + n, 4) + - 6700.0 * np.power(1.0 + n, 5) + - 690.0 * np.power(1.0 + n, 6) + - 40.0 * np.power(1.0 + n, 7) + - 1.0 * np.power(1.0 + n, 8) + ) + * np.power(-1.0, n) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + * (10.0 + n) + ) + ) + ) + / (10.0 + n) + + ( + np.power(-1.0, 11.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + ( + ( + -3.665793851814298e16 + - 1.909490377752576e17 * (1.0 + n) + - 4.70862544109472e17 * np.power(1.0 + n, 2) + - 7.33980385029854e17 * np.power(1.0 + n, 3) + - 8.148989973914079e17 * np.power(1.0 + n, 4) + - 6.882981306584479e17 * np.power(1.0 + n, 5) + - 4.611713296031033e17 * np.power(1.0 + n, 6) + - 2.5219843129581005e17 * np.power(1.0 + n, 7) + - 1.14842783872951e17 * np.power(1.0 + n, 8) + - 4.415488009076552e16 * np.power(1.0 + n, 9) + - 1.44652124073368e16 * np.power(1.0 + n, 10) + - 4.05880131245378e15 * np.power(1.0 + n, 11) + - 9.77306344262685e14 * np.power(1.0 + n, 12) + - 2.01769269859842e14 * np.power(1.0 + n, 13) + - 3.560081466145e13 * np.power(1.0 + n, 14) + - 5.339127383592e12 * np.power(1.0 + n, 15) + - 6.75333270995e11 * np.power(1.0 + n, 16) + - 7.1298201266e10 * np.power(1.0 + n, 17) + - 6.19612062e9 * np.power(1.0 + n, 18) + - 4.34978004e8 * np.power(1.0 + n, 19) + - 2.4024499e7 * np.power(1.0 + n, 20) + - 1.00395e6 * np.power(1.0 + n, 21) + - 29810.0 * np.power(1.0 + n, 22) + - 560.0 * np.power(1.0 + n, 23) + - 5.0 * np.power(1.0 + n, 24) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + * np.power(10.0 + n, 3) + ) + - ( + 1.0 + * ( + -4.310738850111898e16 + - 2.300786211297024e17 * (1.0 + n) + - 5.793490942232486e17 * np.power(1.0 + n, 2) + - 9.169570554312557e17 * np.power(1.0 + n, 3) + - 1.0253555704764628e18 * np.power(1.0 + n, 4) + - 8.63111634551316e17 * np.power(1.0 + n, 5) + - 5.689117565311652e17 * np.power(1.0 + n, 6) + - 3.014933810188104e17 * np.power(1.0 + n, 7) + - 1.3085272169429526e17 * np.power(1.0 + n, 8) + - 4.712719391395e16 * np.power(1.0 + n, 9) + - 1.42167692592585e16 * np.power(1.0 + n, 10) + - 3.6154166212347e15 * np.power(1.0 + n, 11) + - 7.78200392291745e14 * np.power(1.0 + n, 12) + - 1.420469104479e14 * np.power(1.0 + n, 13) + - 2.198557186497e13 * np.power(1.0 + n, 14) + - 2.8791357052e12 * np.power(1.0 + n, 15) + - 3.17567574315e11 * np.power(1.0 + n, 16) + - 2.92849434e10 * np.power(1.0 + n, 17) + - 2.23273176e9 * np.power(1.0 + n, 18) + - 1.384419e8 * np.power(1.0 + n, 19) + - 6.812919e6 * np.power(1.0 + n, 20) + - 256300.0 * np.power(1.0 + n, 21) + - 6930.0 * np.power(1.0 + n, 22) + - 120.0 * np.power(1.0 + n, 23) + - 1.0 * np.power(1.0 + n, 24) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + * np.power(10.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + ( + -1.09027627776e11 + - 3.792865824e11 * (1.0 + n) + - 6.0713742384e11 * np.power(1.0 + n, 2) + - 5.9622705312e11 * np.power(1.0 + n, 3) + - 4.03242887656e11 * np.power(1.0 + n, 4) + - 1.99571643e11 * np.power(1.0 + n, 5) + - 7.48814979e10 * np.power(1.0 + n, 6) + - 2.175554084e10 * np.power(1.0 + n, 7) + - 4.951843521e9 * np.power(1.0 + n, 8) + - 8.86903e8 * np.power(1.0 + n, 9) + - 1.2470866e8 * np.power(1.0 + n, 10) + - 1.363476e7 * np.power(1.0 + n, 11) + - 1.137246e6 * np.power(1.0 + n, 12) + - 70000.0 * np.power(1.0 + n, 13) + - 3000.0 * np.power(1.0 + n, 14) + - 80.0 * np.power(1.0 + n, 15) + - 1.0 * np.power(1.0 + n, 16) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + * np.power(10.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + ( + 3.0 + * ( + 342192.0 + + 781800.0 * (1.0 + n) + + 723680.0 * np.power(1.0 + n, 2) + + 359100.0 * np.power(1.0 + n, 3) + + 105455.0 * np.power(1.0 + n, 4) + + 18900.0 * np.power(1.0 + n, 5) + + 2030.0 * np.power(1.0 + n, 6) + + 120.0 * np.power(1.0 + n, 7) + + 3.0 * np.power(1.0 + n, 8) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + * (10.0 + n) + ) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 1.0 + * ( + -1.09027627776e11 + - 3.792865824e11 * (1.0 + n) + - 6.0713742384e11 * np.power(1.0 + n, 2) + - 5.9622705312e11 * np.power(1.0 + n, 3) + - 4.03242887656e11 * np.power(1.0 + n, 4) + - 1.99571643e11 * np.power(1.0 + n, 5) + - 7.48814979e10 * np.power(1.0 + n, 6) + - 2.175554084e10 * np.power(1.0 + n, 7) + - 4.951843521e9 * np.power(1.0 + n, 8) + - 8.86903e8 * np.power(1.0 + n, 9) + - 1.2470866e8 * np.power(1.0 + n, 10) + - 1.363476e7 * np.power(1.0 + n, 11) + - 1.137246e6 * np.power(1.0 + n, 12) + - 70000.0 * np.power(1.0 + n, 13) + - 3000.0 * np.power(1.0 + n, 14) + - 80.0 * np.power(1.0 + n, 15) + - 1.0 * np.power(1.0 + n, 16) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + * np.power(10.0 + n, 2) + ) + ) + ) + ) + / (10.0 + n) + + n + * ( + np.power(10.0 + n, -5) + - 0.8224670334241131 / np.power(10.0 + n, 3) + - (0.8224670334241131 * np.power(-1.0, 9.0 + n)) / np.power(10.0 + n, 3) + + 0.419833592426477 / np.power(10.0 + n, 2) + + (1.6218904955860713 * np.power(-1.0, 9.0 + n)) / np.power(10.0 + n, 2) + + (1.2020569031595942 * np.power(-1.0, 10.0 + n)) + / np.power(10.0 + n, 2) + - 0.3382260105347306 / (10.0 + n) + - ( + 0.8224670334241131 + * np.power(-1.0, 9.0 + n) + * ( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1 + ) + ) + / np.power(10.0 + n, 2) + - ( + 0.8224670334241131 + * np.power(-1.0, 10.0 + n) + * ( + Sm1 + - (1.0 * np.power(-1.0, n)) / (1.0 + n) + + ( + 4.0 + * ( + 6396.0 + + 9162.0 * (1.0 + n) + + 5473.0 * np.power(1.0 + n, 2) + + 1719.0 * np.power(1.0 + n, 3) + + 298.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + * np.power(-1.0, n) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + ) + ) + / np.power(10.0 + n, 2) + + ( + np.power(-1.0, 10.0 + n) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3.6831936e7 + + 1.10670624e8 * (1.0 + n) + + 1.4936364e8 * np.power(1.0 + n, 2) + + 1.2041208e8 * np.power(1.0 + n, 3) + + 6.4783246e7 * np.power(1.0 + n, 4) + + 2.454111e7 * np.power(1.0 + n, 5) + + 6.715739e6 * np.power(1.0 + n, 6) + + 1.33785e6 * np.power(1.0 + n, 7) + + 192561.0 * np.power(1.0 + n, 8) + + 19530.0 * np.power(1.0 + n, 9) + + 1325.0 * np.power(1.0 + n, 10) + + 54.0 * np.power(1.0 + n, 11) + + np.power(1.0 + n, 12) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + ) + ) + ) + / np.power(10.0 + n, 3) + + ( + np.power(-1.0, 10.0 + n) + * ( + -1.0 * Sm21 + + Sm3 + + ( + 4.0 + * ( + 1.4760576193536e13 + + 7.3798658489088e13 * (1.0 + n) + + 1.72837443710016e14 * np.power(1.0 + n, 2) + + 2.52453402491616e14 * np.power(1.0 + n, 3) + + 2.5828967175624e14 * np.power(1.0 + n, 4) + + 1.97032446481464e14 * np.power(1.0 + n, 5) + + 1.16425369498108e14 * np.power(1.0 + n, 6) + + 5.4627507667116e13 * np.power(1.0 + n, 7) + + 2.0690074606371e13 * np.power(1.0 + n, 8) + + 6.392775359655e12 * np.power(1.0 + n, 9) + + 1.621160332314e12 * np.power(1.0 + n, 10) + + 3.38175413478e11 * np.power(1.0 + n, 11) + + 5.7948536701e10 * np.power(1.0 + n, 12) + + 8.115008166e9 * np.power(1.0 + n, 13) + + 9.1986012e8 * np.power(1.0 + n, 14) + + 8.3116584e7 * np.power(1.0 + n, 15) + + 5.847213e6 * np.power(1.0 + n, 16) + + 308691.0 * np.power(1.0 + n, 17) + + 11506.0 * np.power(1.0 + n, 18) + + 270.0 * np.power(1.0 + n, 19) + + 3.0 * np.power(1.0 + n, 20) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + ) + + ( + 2.0 + * ( + -2.3997963958272e13 + - 1.14129905965056e14 * (1.0 + n) + - 2.5222059905856e14 * np.power(1.0 + n, 2) + - 3.44033181492512e14 * np.power(1.0 + n, 3) + - 3.23935732772496e14 * np.power(1.0 + n, 4) + - 2.22502088875352e14 * np.power(1.0 + n, 5) + - 1.14348498644148e14 * np.power(1.0 + n, 6) + - 4.3968646592044e13 * np.power(1.0 + n, 7) + - 1.21438136977e13 * np.power(1.0 + n, 8) + - 2.010931672623e12 * np.power(1.0 + n, 9) + + 4.9482178305e10 * np.power(1.0 + n, 10) + + 1.59991878826e11 * np.power(1.0 + n, 11) + + 6.0723226806e10 * np.power(1.0 + n, 12) + + 1.4651858516e10 * np.power(1.0 + n, 13) + + 2.59766429e9 * np.power(1.0 + n, 14) + + 3.51680472e8 * np.power(1.0 + n, 15) + + 3.6575004e7 * np.power(1.0 + n, 16) + + 2.886025e6 * np.power(1.0 + n, 17) + + 167625.0 * np.power(1.0 + n, 18) + + 6770.0 * np.power(1.0 + n, 19) + + 170.0 * np.power(1.0 + n, 20) + + 2.0 * np.power(1.0 + n, 21) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + ) + + (S1 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + - ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3.6831936e7 + + 1.10670624e8 * (1.0 + n) + + 1.4936364e8 * np.power(1.0 + n, 2) + + 1.2041208e8 * np.power(1.0 + n, 3) + + 6.4783246e7 * np.power(1.0 + n, 4) + + 2.454111e7 * np.power(1.0 + n, 5) + + 6.715739e6 * np.power(1.0 + n, 6) + + 1.33785e6 * np.power(1.0 + n, 7) + + 192561.0 * np.power(1.0 + n, 8) + + 19530.0 * np.power(1.0 + n, 9) + + 1325.0 * np.power(1.0 + n, 10) + + 54.0 * np.power(1.0 + n, 11) + + np.power(1.0 + n, 12) + ) + * (1 / (1.0 + n) + S1) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + ) + + ( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1 + ) + * ( + Sm2 + - (1.0 * np.power(-1.0, n)) / np.power(1.0 + n, 2) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3.6831936e7 + + 1.10670624e8 * (1.0 + n) + + 1.4936364e8 * np.power(1.0 + n, 2) + + 1.2041208e8 * np.power(1.0 + n, 3) + + 6.4783246e7 * np.power(1.0 + n, 4) + + 2.454111e7 * np.power(1.0 + n, 5) + + 6.715739e6 * np.power(1.0 + n, 6) + + 1.33785e6 * np.power(1.0 + n, 7) + + 192561.0 * np.power(1.0 + n, 8) + + 19530.0 * np.power(1.0 + n, 9) + + 1325.0 * np.power(1.0 + n, 10) + + 54.0 * np.power(1.0 + n, 11) + + np.power(1.0 + n, 12) + ) + * np.power(-1.0, n) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + ) + ) + ) + ) + / np.power(10.0 + n, 2) + ) + ) + ) diff --git a/src/eko/harmonics/f_functions/f17.py b/src/eko/harmonics/f_functions/f17.py new file mode 100644 index 000000000..cc0f0a4cd --- /dev/null +++ b/src/eko/harmonics/f_functions/f17.py @@ -0,0 +1,232 @@ +# -*- coding: utf-8 -*- +"""This module contains implemtation of F17. + +When using it, please cite :cite:`Blumlein:2009ta`. +Mellin transform is defined with the convention x^(N). +""" +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def F17(n, S1, S2, S3): + """Implements eq 9.35 of :cite:`Blumlein:2009ta`""" + return ( + 0.006250114775233491 * n + - (0.003746947390066303 * n) / (2.0 + n) + - (0.0023126098502258036 * n) / (3.0 + n) + + (0.0099367254968704 * n) / (4.0 + n) + + (0.011620487178071414 * n) / (5.0 + n) + - (0.06649377693249485 * n) / (6.0 + n) + + (0.19948261641123977 * n) / (7.0 + n) + - (0.4211429420070887 * n) / (8.0 + n) + + (0.6134519590989854 * n) / (9.0 + n) + - (0.6080710864181954 * n) / (10.0 + n) + + (0.39145233830114945 * n) / (11.0 + n) + - (0.1477783591293883 * n) / (12.0 + n) + + (0.02482853473316387 * n) / (13.0 + n) + + 0.007477407032205702 * (-1.0 + 1 / (1.0 + n)) + - 0.000051440329218106995 + * n + * ( + 121.50223994844418 + + 83580.0 / (1.0 + n) + - 3390.0 / (2.0 + n) + + 320.0 / (3.0 + n) + + (67770.0 * (1.0 + (1.0 + n) * S1)) / np.power(1.0 + n, 2) + - (5805.0 * (1.0 + (2.0 + n) * (1 / (1.0 + n) + S1))) / np.power(2.0 + n, 2) + + (720.0 * (1.0 + (3.0 + n) * (1 / (1.0 + n) + 1 / (2.0 + n) + S1))) + / np.power(3.0 + n, 2) + - ( + 83725.36366334453 + * ( + 1.0 + + n + * (1 / (1.0 + n) + (1.0 - 2.0 * (1.0 + n)) / (n * (1.0 + n)) + S1) + ) + ) + / np.power(n, 2) + - ( + 9180.0 + * ( + 1.0 + + (2.0 + n) * (1 / (1.0 + n) + S1) + + np.power(2.0 + n, 2) + * ( + np.power(1.0 + n, -2) + + S1 / (1.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + ) + / np.power(2.0 + n, 3) + + ( + 52920.0 + * ( + 1.0 + + (1.0 + n) * S1 + + np.power(1.0 + n, 2) + * ( + np.power(1.0 + n, -2) + + S1 / (1.0 + n) + - (1.0 * (1 / (1.0 + n) + S1)) / (1.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + ) + / np.power(1.0 + n, 3) + + ( + 1440.0 + * ( + 1.0 + + (3.0 + n) * (1 / (1.0 + n) + 1 / (2.0 + n) + S1) + + np.power(3.0 + n, 2) + * ( + np.power(1.0 + n, -2) + + np.power(2.0 + n, -2) + + S1 / (1.0 + n) + + (1 / (1.0 + n) + S1) / (2.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + ) + / np.power(3.0 + n, 3) + - ( + 45180.0 + * ( + 1.0 + + n + * (1 / (1.0 + n) + (1.0 - 2.0 * (1.0 + n)) / (n * (1.0 + n)) + S1) + + np.power(n, 2) + * ( + np.power(1.0 + n, -2) + + 1 / (n * (1.0 + n)) + + S1 / (1.0 + n) + + ((1.0 - 2.0 * (1.0 + n)) * (1 / (1.0 + n) + S1)) + / (n * (1.0 + n)) + + 0.5 * (np.power(S1, 2) + S2) + ) + ) + ) + / np.power(n, 3) + + ( + 11340.0 + * ( + -1.0 + - 1.0 * (2.0 + n) * (1 / (1.0 + n) + S1) + - 1.0 + * np.power(2.0 + n, 2) + * ( + np.power(1.0 + n, -2) + + S1 / (1.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + - 1.0 + * np.power(2.0 + n, 3) + * ( + np.power(1.0 + n, -3) + + S1 / np.power(1.0 + n, 2) + + (0.5 * np.power(S1, 2)) / (1.0 + n) + + (0.5 * S2) / (1.0 + n) + + 0.16666666666666666 + * (np.power(S1, 3) + 3.0 * S1 * S2 + 2.0 * S3) + ) + ) + ) + / np.power(2.0 + n, 4) + + ( + 35640.0 + * ( + 1.0 + + (1.0 + n) * S1 + + np.power(1.0 + n, 2) + * ( + np.power(1.0 + n, -2) + + S1 / (1.0 + n) + - (1.0 * (1 / (1.0 + n) + S1)) / (1.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + + np.power(1.0 + n, 3) + * ( + np.power(1.0 + n, -3) + + S1 / np.power(1.0 + n, 2) + + (0.5 * np.power(S1, 2)) / (1.0 + n) + - (0.5 * np.power(1 / (1.0 + n) + S1, 2)) / (1.0 + n) + + (0.5 * S2) / (1.0 + n) + - (0.5 * (np.power(1.0 + n, -2) + S2)) / (1.0 + n) + + 0.16666666666666666 + * (np.power(S1, 3) + 3.0 * S1 * S2 + 2.0 * S3) + ) + ) + ) + / np.power(1.0 + n, 4) + + ( + 2160.0 + * ( + 1.0 + + (3.0 + n) * (1 / (1.0 + n) + 1 / (2.0 + n) + S1) + + np.power(3.0 + n, 2) + * ( + np.power(1.0 + n, -2) + + np.power(2.0 + n, -2) + + S1 / (1.0 + n) + + (1 / (1.0 + n) + S1) / (2.0 + n) + + 0.5 * (np.power(S1, 2) + S2) + ) + + np.power(3.0 + n, 3) + * ( + np.power(1.0 + n, -3) + + np.power(2.0 + n, -3) + + S1 / np.power(1.0 + n, 2) + + (0.5 * np.power(S1, 2)) / (1.0 + n) + + (1 / (1.0 + n) + S1) / np.power(2.0 + n, 2) + + (0.5 * np.power(1 / (1.0 + n) + S1, 2)) / (2.0 + n) + + (0.5 * S2) / (1.0 + n) + + (0.5 * (np.power(1.0 + n, -2) + S2)) / (2.0 + n) + + 0.16666666666666666 + * (np.power(S1, 3) + 3.0 * S1 * S2 + 2.0 * S3) + ) + ) + ) + / np.power(3.0 + n, 4) + + ( + 26460.0 + * ( + -1.0 + - 1.0 + * n + * (1 / (1.0 + n) + (1.0 - 2.0 * (1.0 + n)) / (n * (1.0 + n)) + S1) + - 1.0 + * np.power(n, 2) + * ( + np.power(1.0 + n, -2) + + 1 / (n * (1.0 + n)) + + S1 / (1.0 + n) + + ((1.0 - 2.0 * (1.0 + n)) * (1 / (1.0 + n) + S1)) + / (n * (1.0 + n)) + + 0.5 * (np.power(S1, 2) + S2) + ) + - 1.0 + * np.power(n, 3) + * ( + np.power(1.0 + n, -3) + + S1 / np.power(1.0 + n, 2) + + (0.5 * np.power(S1, 2)) / (1.0 + n) + + (1 / (1.0 + n) + S1) / (n * (1.0 + n)) + + ( + 0.5 + * (1.0 - 2.0 * (1.0 + n)) + * np.power(1 / (1.0 + n) + S1, 2) + ) + / (n * (1.0 + n)) + + (0.5 * S2) / (1.0 + n) + + (0.5 * (1.0 - 2.0 * (1.0 + n)) * (np.power(1.0 + n, -2) + S2)) + / (n * (1.0 + n)) + + 0.16666666666666666 + * (np.power(S1, 3) + 3.0 * S1 * S2 + 2.0 * S3) + ) + ) + ) + / np.power(n, 4) + ) + ) diff --git a/src/eko/harmonics/f_functions/f18.py b/src/eko/harmonics/f_functions/f18.py new file mode 100644 index 000000000..344a2fe84 --- /dev/null +++ b/src/eko/harmonics/f_functions/f18.py @@ -0,0 +1,1991 @@ +# -*- coding: utf-8 -*- +# pylint: disable=too-many-lines +"""This module contains implemtation of F18. + +When using it, please cite :cite:`Blumlein:2009ta`. +Mellin transform is defined with the convention x^(N). +""" +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def F18(n, S1, S2, S3): + """Implements eq 9.36 of :cite:`Blumlein:2009ta`""" + return ( + 0.7502092979013981 + - 0.9999999952263307 + * ( + n + * ( + -1.0 / np.power(1.0 + n, 5) + + 1.0823232337111381 / (1.0 + n) + - (1.0 * S1) / np.power(1.0 + n, 4) + - (1.0 * (0.5 * np.power(S1, 2) + 0.5 * S2)) / np.power(1.0 + n, 3) + - ( + 1.0 + * ( + 0.16666666666666666 * np.power(S1, 3) + + 0.5 * S1 * S2 + + 0.3333333333333333 * S3 + ) + ) + / np.power(1.0 + n, 2) + ) + + ( + 0.16666666666666666 * np.power(1 / (1.0 + n) + S1, 3) + + 0.5 * (1 / (1.0 + n) + S1) * (np.power(1.0 + n, -2) + S2) + + 0.3333333333333333 * (np.power(1.0 + n, -3) + S3) + ) + / (1.0 + n) + ) + + 0.49999902059348167 + * ( + ( + 0.16666666666666666 * np.power(1 / (1.0 + n) + 1 / (2.0 + n) + S1, 3) + + 0.5 + * (1 / (1.0 + n) + 1 / (2.0 + n) + S1) + * (np.power(1.0 + n, -2) + np.power(2.0 + n, -2) + S2) + + 0.3333333333333333 + * (np.power(1.0 + n, -3) + np.power(2.0 + n, -3) + S3) + ) + / (2.0 + n) + + n + * ( + -1.0 / np.power(2.0 + n, 5) + + 1.0823232337111381 / (2.0 + n) + - (1.0 * (1 / (1.0 + n) + S1)) / np.power(2.0 + n, 4) + - ( + 1.0 + * ( + 0.5 * np.power(1 / (1.0 + n) + S1, 2) + + 0.5 * (np.power(1.0 + n, -2) + S2) + ) + ) + / np.power(2.0 + n, 3) + - ( + 1.0 + * ( + 0.16666666666666666 * np.power(1 / (1.0 + n) + S1, 3) + + 0.5 * (1 / (1.0 + n) + S1) * (np.power(1.0 + n, -2) + S2) + + 0.3333333333333333 * (np.power(1.0 + n, -3) + S3) + ) + ) + / np.power(2.0 + n, 2) + ) + ) + - 0.3332995604546604 + * ( + ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + (5.0 + 6.0 * (1.0 + n) + 2.0 * np.power(1.0 + n, 2)) + / (np.power(2.0 + n, 2) * np.power(3.0 + n, 2)) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + (3.0 + 2.0 * (1.0 + n)) + * (3.0 + 3.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / (np.power(2.0 + n, 3) * np.power(3.0 + n, 3)) + + S3 + ) + ) + / (3.0 + n) + + n + * ( + -1.0 / np.power(3.0 + n, 5) + + 1.0823232337111381 / (3.0 + n) + - (1.0 * (1 / (1.0 + n) + 1 / (2.0 + n) + S1)) / np.power(3.0 + n, 4) + - ( + 1.0 + * ( + 0.5 * np.power(1 / (1.0 + n) + 1 / (2.0 + n) + S1, 2) + + 0.5 * (np.power(1.0 + n, -2) + np.power(2.0 + n, -2) + S2) + ) + ) + / np.power(3.0 + n, 3) + - ( + 1.0 + * ( + 0.16666666666666666 + * np.power(1 / (1.0 + n) + 1 / (2.0 + n) + S1, 3) + + 0.5 + * (1 / (1.0 + n) + 1 / (2.0 + n) + S1) + * (np.power(1.0 + n, -2) + np.power(2.0 + n, -2) + S2) + + 0.3333333333333333 + * (np.power(1.0 + n, -3) + np.power(2.0 + n, -3) + S3) + ) + ) + / np.power(3.0 + n, 2) + ) + ) + + 0.24954082848379078 + * ( + ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 49.0 + + 96.0 * (1.0 + n) + + 72.0 * np.power(1.0 + n, 2) + + 24.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + 251.0 + + 684.0 * (1.0 + n) + + 795.0 * np.power(1.0 + n, 2) + + 504.0 * np.power(1.0 + n, 3) + + 183.0 * np.power(1.0 + n, 4) + + 36.0 * np.power(1.0 + n, 5) + + 3.0 * np.power(1.0 + n, 6) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + ) + + S3 + ) + ) + / (4.0 + n) + + n + * ( + -1.0 / np.power(4.0 + n, 5) + + 1.0823232337111381 / (4.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1 + ) + ) + / np.power(4.0 + n, 4) + - ( + 1.0 + * ( + 0.5 + * np.power( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1, + 2, + ) + + 0.5 + * ( + np.power(1.0 + n, -2) + + (5.0 + 6.0 * (1.0 + n) + 2.0 * np.power(1.0 + n, 2)) + / (np.power(2.0 + n, 2) * np.power(3.0 + n, 2)) + + S2 + ) + ) + ) + / np.power(4.0 + n, 3) + - ( + 1.0 + * ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + (3.0 + 2.0 * (1.0 + n)) / ((2.0 + n) * (3.0 + n)) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + (5.0 + 6.0 * (1.0 + n) + 2.0 * np.power(1.0 + n, 2)) + / (np.power(2.0 + n, 2) * np.power(3.0 + n, 2)) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + (3.0 + 2.0 * (1.0 + n)) + * (3.0 + 3.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / (np.power(2.0 + n, 3) * np.power(3.0 + n, 3)) + + S3 + ) + ) + ) + / np.power(4.0 + n, 2) + ) + ) + - 0.1967571967137462 + * ( + ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 2.0 + * ( + 410.0 + + 1030.0 * (1.0 + n) + + 1081.0 * np.power(1.0 + n, 2) + + 600.0 * np.power(1.0 + n, 3) + + 185.0 * np.power(1.0 + n, 4) + + 30.0 * np.power(1.0 + n, 5) + + 2.0 * np.power(1.0 + n, 6) + ) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * ( + 1628.0 + + 5050.0 * (1.0 + n) + + 6935.0 * np.power(1.0 + n, 2) + + 5495.0 * np.power(1.0 + n, 3) + + 2737.0 * np.power(1.0 + n, 4) + + 875.0 * np.power(1.0 + n, 5) + + 175.0 * np.power(1.0 + n, 6) + + 20.0 * np.power(1.0 + n, 7) + + np.power(1.0 + n, 8) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + ) + + S3 + ) + ) + / (5.0 + n) + + n + * ( + -1.0 / np.power(5.0 + n, 5) + + 1.0823232337111381 / (5.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1 + ) + ) + / np.power(5.0 + n, 4) + - ( + 1.0 + * ( + 0.5 + * np.power( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1, + 2, + ) + + 0.5 + * ( + np.power(1.0 + n, -2) + + ( + 49.0 + + 96.0 * (1.0 + n) + + 72.0 * np.power(1.0 + n, 2) + + 24.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + ) + + S2 + ) + ) + ) + / np.power(5.0 + n, 3) + - ( + 1.0 + * ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + (11.0 + 12.0 * (1.0 + n) + 3.0 * np.power(1.0 + n, 2)) + / ((2.0 + n) * (3.0 + n) * (4.0 + n)) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 49.0 + + 96.0 * (1.0 + n) + + 72.0 * np.power(1.0 + n, 2) + + 24.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + 251.0 + + 684.0 * (1.0 + n) + + 795.0 * np.power(1.0 + n, 2) + + 504.0 * np.power(1.0 + n, 3) + + 183.0 * np.power(1.0 + n, 4) + + 36.0 * np.power(1.0 + n, 5) + + 3.0 * np.power(1.0 + n, 6) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + ) + + S3 + ) + ) + ) + / np.power(5.0 + n, 2) + ) + ) + + 0.1530503487172192 + * ( + ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n) * (6.0 + n)) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n) * (6.0 + n)) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 21076.0 + + 62100.0 * (1.0 + n) + + 79650.0 * np.power(1.0 + n, 2) + + 57660.0 * np.power(1.0 + n, 3) + + 25685.0 * np.power(1.0 + n, 4) + + 7200.0 * np.power(1.0 + n, 5) + + 1240.0 * np.power(1.0 + n, 6) + + 120.0 * np.power(1.0 + n, 7) + + 5.0 * np.power(1.0 + n, 8) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + 2.048824e6 + + 8.4339e6 * (1.0 + n) + + 1.595433e7 * np.power(1.0 + n, 2) + + 1.831824e7 * np.power(1.0 + n, 3) + + 1.419519e7 * np.power(1.0 + n, 4) + + 7.80975e6 * np.power(1.0 + n, 5) + + 3.124155e6 * np.power(1.0 + n, 6) + + 914760.0 * np.power(1.0 + n, 7) + + 194445.0 * np.power(1.0 + n, 8) + + 29250.0 * np.power(1.0 + n, 9) + + 2955.0 * np.power(1.0 + n, 10) + + 180.0 * np.power(1.0 + n, 11) + + 5.0 * np.power(1.0 + n, 12) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + ) + + S3 + ) + ) + / (6.0 + n) + + n + * ( + -1.0 / np.power(6.0 + n, 5) + + 1.0823232337111381 / (6.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1 + ) + ) + / np.power(6.0 + n, 4) + - ( + 1.0 + * ( + 0.5 + * np.power( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1, + 2, + ) + + 0.5 + * ( + np.power(1.0 + n, -2) + + ( + 2.0 + * ( + 410.0 + + 1030.0 * (1.0 + n) + + 1081.0 * np.power(1.0 + n, 2) + + 600.0 * np.power(1.0 + n, 3) + + 185.0 * np.power(1.0 + n, 4) + + 30.0 * np.power(1.0 + n, 5) + + 2.0 * np.power(1.0 + n, 6) + ) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + ) + + S2 + ) + ) + ) + / np.power(6.0 + n, 3) + - ( + 1.0 + * ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * (5.0 + 5.0 * (1.0 + n) + np.power(1.0 + n, 2)) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 2.0 + * ( + 410.0 + + 1030.0 * (1.0 + n) + + 1081.0 * np.power(1.0 + n, 2) + + 600.0 * np.power(1.0 + n, 3) + + 185.0 * np.power(1.0 + n, 4) + + 30.0 * np.power(1.0 + n, 5) + + 2.0 * np.power(1.0 + n, 6) + ) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + 2.0 + * (5.0 + 2.0 * (1.0 + n)) + * ( + 1628.0 + + 5050.0 * (1.0 + n) + + 6935.0 * np.power(1.0 + n, 2) + + 5495.0 * np.power(1.0 + n, 3) + + 2737.0 * np.power(1.0 + n, 4) + + 875.0 * np.power(1.0 + n, 5) + + 175.0 * np.power(1.0 + n, 6) + + 20.0 * np.power(1.0 + n, 7) + + np.power(1.0 + n, 8) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + ) + + S3 + ) + ) + ) + / np.power(6.0 + n, 2) + ) + ) + - 0.10602798528818422 + * ( + ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 773136.0 + + 2.554272e6 * (1.0 + n) + + 3.762752e6 * np.power(1.0 + n, 2) + + 3.23736e6 * np.power(1.0 + n, 3) + + 1.797035e6 * np.power(1.0 + n, 4) + + 671790.0 * np.power(1.0 + n, 5) + + 171248.0 * np.power(1.0 + n, 6) + + 29400.0 * np.power(1.0 + n, 7) + + 3255.0 * np.power(1.0 + n, 8) + + 210.0 * np.power(1.0 + n, 9) + + 6.0 * np.power(1.0 + n, 10) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 6.3467712e7 + + 2.75413824e8 * (1.0 + n) + + 5.54256432e8 * np.power(1.0 + n, 2) + + 6.84826352e8 * np.power(1.0 + n, 3) + + 5.79544028e8 * np.power(1.0 + n, 4) + + 3.54873092e8 * np.power(1.0 + n, 5) + + 1.61970683e8 * np.power(1.0 + n, 6) + + 5.5932611e7 * np.power(1.0 + n, 7) + + 1.4676674e7 * np.power(1.0 + n, 8) + + 2.911041e6 * np.power(1.0 + n, 9) + + 429534.0 * np.power(1.0 + n, 10) + + 45717.0 * np.power(1.0 + n, 11) + + 3318.0 * np.power(1.0 + n, 12) + + 147.0 * np.power(1.0 + n, 13) + + 3.0 * np.power(1.0 + n, 14) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + ) + + S3 + ) + ) + / (7.0 + n) + + n + * ( + -1.0 / np.power(7.0 + n, 5) + + 1.0823232337111381 / (7.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ((2.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n) * (6.0 + n)) + + S1 + ) + ) + / np.power(7.0 + n, 4) + - ( + 1.0 + * ( + 0.5 + * np.power( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + ) + + S1, + 2, + ) + + 0.5 + * ( + np.power(1.0 + n, -2) + + ( + 21076.0 + + 62100.0 * (1.0 + n) + + 79650.0 * np.power(1.0 + n, 2) + + 57660.0 * np.power(1.0 + n, 3) + + 25685.0 * np.power(1.0 + n, 4) + + 7200.0 * np.power(1.0 + n, 5) + + 1240.0 * np.power(1.0 + n, 6) + + 120.0 * np.power(1.0 + n, 7) + + 5.0 * np.power(1.0 + n, 8) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + ) + + S2 + ) + ) + ) + / np.power(7.0 + n, 3) + - ( + 1.0 + * ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + ) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + ( + 274.0 + + 450.0 * (1.0 + n) + + 255.0 * np.power(1.0 + n, 2) + + 60.0 * np.power(1.0 + n, 3) + + 5.0 * np.power(1.0 + n, 4) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + ) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 21076.0 + + 62100.0 * (1.0 + n) + + 79650.0 * np.power(1.0 + n, 2) + + 57660.0 * np.power(1.0 + n, 3) + + 25685.0 * np.power(1.0 + n, 4) + + 7200.0 * np.power(1.0 + n, 5) + + 1240.0 * np.power(1.0 + n, 6) + + 120.0 * np.power(1.0 + n, 7) + + 5.0 * np.power(1.0 + n, 8) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + 2.048824e6 + + 8.4339e6 * (1.0 + n) + + 1.595433e7 * np.power(1.0 + n, 2) + + 1.831824e7 * np.power(1.0 + n, 3) + + 1.419519e7 * np.power(1.0 + n, 4) + + 7.80975e6 * np.power(1.0 + n, 5) + + 3.124155e6 * np.power(1.0 + n, 6) + + 914760.0 * np.power(1.0 + n, 7) + + 194445.0 * np.power(1.0 + n, 8) + + 29250.0 * np.power(1.0 + n, 9) + + 2955.0 * np.power(1.0 + n, 10) + + 180.0 * np.power(1.0 + n, 11) + + 5.0 * np.power(1.0 + n, 12) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + ) + + S3 + ) + ) + ) + / np.power(7.0 + n, 2) + ) + ) + + 0.056951717764149916 + * ( + ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 3.8402064e7 + + 1.38523392e8 * (1.0 + n) + + 2.26358048e8 * np.power(1.0 + n, 2) + + 2.20651312e8 * np.power(1.0 + n, 3) + + 1.42622963e8 * np.power(1.0 + n, 4) + + 6.434848e7 * np.power(1.0 + n, 5) + + 2.07774e7 * np.power(1.0 + n, 6) + + 4.838848e6 * np.power(1.0 + n, 7) + + 807086.0 * np.power(1.0 + n, 8) + + 94080.0 * np.power(1.0 + n, 9) + + 7280.0 * np.power(1.0 + n, 10) + + 336.0 * np.power(1.0 + n, 11) + + 7.0 * np.power(1.0 + n, 12) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + 1.52759224512e11 + + 7.72859090304e11 * (1.0 + n) + + 1.840340570544e12 * np.power(1.0 + n, 2) + + 2.738393029568e12 * np.power(1.0 + n, 3) + + 2.850741832092e12 * np.power(1.0 + n, 4) + + 2.203027167432e12 * np.power(1.0 + n, 5) + + 1.308849323187e12 * np.power(1.0 + n, 6) + + 6.10929168192e11 * np.power(1.0 + n, 7) + + 2.2702816521e11 * np.power(1.0 + n, 8) + + 6.7650709672e10 * np.power(1.0 + n, 9) + + 1.6200316881e10 * np.power(1.0 + n, 10) + + 3.110018688e9 * np.power(1.0 + n, 11) + + 4.75055e8 * np.power(1.0 + n, 12) + + 5.6957208e7 * np.power(1.0 + n, 13) + + 5.242629e6 * np.power(1.0 + n, 14) + + 357504.0 * np.power(1.0 + n, 15) + + 17010.0 * np.power(1.0 + n, 16) + + 504.0 * np.power(1.0 + n, 17) + + 7.0 * np.power(1.0 + n, 18) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + ) + + S3 + ) + ) + / (8.0 + n) + + n + * ( + -1.0 / np.power(8.0 + n, 5) + + 1.0823232337111381 / (8.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1 + ) + ) + / np.power(8.0 + n, 4) + - ( + 1.0 + * ( + 0.5 + * np.power( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1, + 2, + ) + + 0.5 + * ( + np.power(1.0 + n, -2) + + ( + 773136.0 + + 2.554272e6 * (1.0 + n) + + 3.762752e6 * np.power(1.0 + n, 2) + + 3.23736e6 * np.power(1.0 + n, 3) + + 1.797035e6 * np.power(1.0 + n, 4) + + 671790.0 * np.power(1.0 + n, 5) + + 171248.0 * np.power(1.0 + n, 6) + + 29400.0 * np.power(1.0 + n, 7) + + 3255.0 * np.power(1.0 + n, 8) + + 210.0 * np.power(1.0 + n, 9) + + 6.0 * np.power(1.0 + n, 10) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + ) + + S2 + ) + ) + ) + / np.power(8.0 + n, 3) + - ( + 1.0 + * ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 252.0 + + 392.0 * (1.0 + n) + + 203.0 * np.power(1.0 + n, 2) + + 42.0 * np.power(1.0 + n, 3) + + 3.0 * np.power(1.0 + n, 4) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + ) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 773136.0 + + 2.554272e6 * (1.0 + n) + + 3.762752e6 * np.power(1.0 + n, 2) + + 3.23736e6 * np.power(1.0 + n, 3) + + 1.797035e6 * np.power(1.0 + n, 4) + + 671790.0 * np.power(1.0 + n, 5) + + 171248.0 * np.power(1.0 + n, 6) + + 29400.0 * np.power(1.0 + n, 7) + + 3255.0 * np.power(1.0 + n, 8) + + 210.0 * np.power(1.0 + n, 9) + + 6.0 * np.power(1.0 + n, 10) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + (7.0 + 2.0 * (1.0 + n)) + * ( + 6.3467712e7 + + 2.75413824e8 * (1.0 + n) + + 5.54256432e8 * np.power(1.0 + n, 2) + + 6.84826352e8 * np.power(1.0 + n, 3) + + 5.79544028e8 * np.power(1.0 + n, 4) + + 3.54873092e8 * np.power(1.0 + n, 5) + + 1.61970683e8 * np.power(1.0 + n, 6) + + 5.5932611e7 * np.power(1.0 + n, 7) + + 1.4676674e7 * np.power(1.0 + n, 8) + + 2.911041e6 * np.power(1.0 + n, 9) + + 429534.0 * np.power(1.0 + n, 10) + + 45717.0 * np.power(1.0 + n, 11) + + 3318.0 * np.power(1.0 + n, 12) + + 147.0 * np.power(1.0 + n, 13) + + 3.0 * np.power(1.0 + n, 14) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + ) + + S3 + ) + ) + ) + / np.power(8.0 + n, 2) + ) + ) + - 0.019847559824380426 + * ( + ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 4.0 + * ( + 6.20783424e8 + + 2.402913888e9 * (1.0 + n) + + 4.261208648e9 * np.power(1.0 + n, 2) + + 4.5733464e9 * np.power(1.0 + n, 3) + + 3.31344237e9 * np.power(1.0 + n, 4) + + 1.713293694e9 * np.power(1.0 + n, 5) + + 6.51986769e8 * np.power(1.0 + n, 6) + + 1.85551632e8 * np.power(1.0 + n, 7) + + 3.9703709e7 * np.power(1.0 + n, 8) + + 6.360228e6 * np.power(1.0 + n, 9) + + 751317.0 * np.power(1.0 + n, 10) + + 63504.0 * np.power(1.0 + n, 11) + + 3633.0 * np.power(1.0 + n, 12) + + 126.0 * np.power(1.0 + n, 13) + + 2.0 * np.power(1.0 + n, 14) + ) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 2.176131861504e12 + + 1.135056707712e13 * (1.0 + n) + + 2.7974661270464e13 * np.power(1.0 + n, 2) + + 4.3284545841312e13 * np.power(1.0 + n, 3) + + 4.7115984701808e13 * np.power(1.0 + n, 4) + + 3.8323387681704e13 * np.power(1.0 + n, 5) + + 2.4153337475604e13 * np.power(1.0 + n, 6) + + 1.2072584201292e13 * np.power(1.0 + n, 7) + + 4.858675624797e12 * np.power(1.0 + n, 8) + + 1.589624084295e12 * np.power(1.0 + n, 9) + + 4.25052833112e11 * np.power(1.0 + n, 10) + + 9.304706925e10 * np.power(1.0 + n, 11) + + 1.6646348871e10 * np.power(1.0 + n, 12) + + 2.420753526e9 * np.power(1.0 + n, 13) + + 2.8338678e8 * np.power(1.0 + n, 14) + + 2.6298432e7 * np.power(1.0 + n, 15) + + 1.889595e6 * np.power(1.0 + n, 16) + + 101331.0 * np.power(1.0 + n, 17) + + 3816.0 * np.power(1.0 + n, 18) + + 90.0 * np.power(1.0 + n, 19) + + np.power(1.0 + n, 20) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + ) + + S3 + ) + ) + / (9.0 + n) + + n + * ( + -1.0 / np.power(9.0 + n, 5) + + 1.0823232337111381 / (9.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1 + ) + ) + / np.power(9.0 + n, 4) + - ( + 1.0 + * ( + 0.5 + * np.power( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1, + 2, + ) + + 0.5 + * ( + np.power(1.0 + n, -2) + + ( + 3.8402064e7 + + 1.38523392e8 * (1.0 + n) + + 2.26358048e8 * np.power(1.0 + n, 2) + + 2.20651312e8 * np.power(1.0 + n, 3) + + 1.42622963e8 * np.power(1.0 + n, 4) + + 6.434848e7 * np.power(1.0 + n, 5) + + 2.07774e7 * np.power(1.0 + n, 6) + + 4.838848e6 * np.power(1.0 + n, 7) + + 807086.0 * np.power(1.0 + n, 8) + + 94080.0 * np.power(1.0 + n, 9) + + 7280.0 * np.power(1.0 + n, 10) + + 336.0 * np.power(1.0 + n, 11) + + 7.0 * np.power(1.0 + n, 12) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + ) + + S2 + ) + ) + ) + / np.power(9.0 + n, 3) + - ( + 1.0 + * ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + ( + 13068.0 + + 26264.0 * (1.0 + n) + + 20307.0 * np.power(1.0 + n, 2) + + 7840.0 * np.power(1.0 + n, 3) + + 1610.0 * np.power(1.0 + n, 4) + + 168.0 * np.power(1.0 + n, 5) + + 7.0 * np.power(1.0 + n, 6) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + ) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 3.8402064e7 + + 1.38523392e8 * (1.0 + n) + + 2.26358048e8 * np.power(1.0 + n, 2) + + 2.20651312e8 * np.power(1.0 + n, 3) + + 1.42622963e8 * np.power(1.0 + n, 4) + + 6.434848e7 * np.power(1.0 + n, 5) + + 2.07774e7 * np.power(1.0 + n, 6) + + 4.838848e6 * np.power(1.0 + n, 7) + + 807086.0 * np.power(1.0 + n, 8) + + 94080.0 * np.power(1.0 + n, 9) + + 7280.0 * np.power(1.0 + n, 10) + + 336.0 * np.power(1.0 + n, 11) + + 7.0 * np.power(1.0 + n, 12) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + 1.52759224512e11 + + 7.72859090304e11 * (1.0 + n) + + 1.840340570544e12 * np.power(1.0 + n, 2) + + 2.738393029568e12 * np.power(1.0 + n, 3) + + 2.850741832092e12 * np.power(1.0 + n, 4) + + 2.203027167432e12 * np.power(1.0 + n, 5) + + 1.308849323187e12 * np.power(1.0 + n, 6) + + 6.10929168192e11 * np.power(1.0 + n, 7) + + 2.2702816521e11 * np.power(1.0 + n, 8) + + 6.7650709672e10 * np.power(1.0 + n, 9) + + 1.6200316881e10 * np.power(1.0 + n, 10) + + 3.110018688e9 * np.power(1.0 + n, 11) + + 4.75055e8 * np.power(1.0 + n, 12) + + 5.6957208e7 * np.power(1.0 + n, 13) + + 5.242629e6 * np.power(1.0 + n, 14) + + 357504.0 * np.power(1.0 + n, 15) + + 17010.0 * np.power(1.0 + n, 16) + + 504.0 * np.power(1.0 + n, 17) + + 7.0 * np.power(1.0 + n, 18) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + ) + + S3 + ) + ) + ) + / np.power(9.0 + n, 2) + ) + ) + + 0.003243204652309423 + * ( + ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + ( + 3.0 + * ( + 342192.0 + + 781800.0 * (1.0 + n) + + 723680.0 * np.power(1.0 + n, 2) + + 359100.0 * np.power(1.0 + n, 3) + + 105455.0 * np.power(1.0 + n, 4) + + 18900.0 * np.power(1.0 + n, 5) + + 2030.0 * np.power(1.0 + n, 6) + + 120.0 * np.power(1.0 + n, 7) + + 3.0 * np.power(1.0 + n, 8) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + * (10.0 + n) + ) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + ( + 3.0 + * ( + 342192.0 + + 781800.0 * (1.0 + n) + + 723680.0 * np.power(1.0 + n, 2) + + 359100.0 * np.power(1.0 + n, 3) + + 105455.0 * np.power(1.0 + n, 4) + + 18900.0 * np.power(1.0 + n, 5) + + 2030.0 * np.power(1.0 + n, 6) + + 120.0 * np.power(1.0 + n, 7) + + 3.0 * np.power(1.0 + n, 8) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + * (10.0 + n) + ) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 3.0 + * ( + 6.7586510592e10 + + 2.7735912e11 * (1.0 + n) + + 5.25886236e11 * np.power(1.0 + n, 2) + + 6.098325648e11 * np.power(1.0 + n, 3) + + 4.8346372324e11 * np.power(1.0 + n, 4) + + 2.77716663e11 * np.power(1.0 + n, 5) + + 1.195744907e11 * np.power(1.0 + n, 6) + + 3.937668588e10 * np.power(1.0 + n, 7) + + 1.0027662147e10 * np.power(1.0 + n, 8) + + 1.982481e9 * np.power(1.0 + n, 9) + + 3.0344942e8 * np.power(1.0 + n, 10) + + 3.560508e7 * np.power(1.0 + n, 11) + + 3.141418e6 * np.power(1.0 + n, 12) + + 201600.0 * np.power(1.0 + n, 13) + + 8880.0 * np.power(1.0 + n, 14) + + 240.0 * np.power(1.0 + n, 15) + + 3.0 * np.power(1.0 + n, 16) + ) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + * np.power(10.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + 3.0 + * ( + 1.905865096469299e16 + + 1.100489126093568e17 * (1.0 + n) + + 3.026775163197197e17 * np.power(1.0 + n, 2) + + 5.274174874222368e17 * np.power(1.0 + n, 3) + + 6.532963289874519e17 * np.power(1.0 + n, 4) + + 6.118731135138024e17 * np.power(1.0 + n, 5) + + 4.5005054609223366e17 * np.power(1.0 + n, 6) + + 2.6656016992225488e17 * np.power(1.0 + n, 7) + + 1.2935179046741138e17 * np.power(1.0 + n, 8) + + 5.2054701631938e16 * np.power(1.0 + n, 9) + + 1.751929057804686e16 * np.power(1.0 + n, 10) + + 4.95861919609626e15 * np.power(1.0 + n, 11) + + 1.184087108357771e15 * np.power(1.0 + n, 12) + + 2.388131885349e14 * np.power(1.0 + n, 13) + + 4.064171822907e13 * np.power(1.0 + n, 14) + + 5.818192578e12 * np.power(1.0 + n, 15) + + 6.96833685225e11 * np.power(1.0 + n, 16) + + 6.92402094e10 * np.power(1.0 + n, 17) + + 5.63902616e9 * np.power(1.0 + n, 18) + + 3.699297e8 * np.power(1.0 + n, 19) + + 1.9060797e7 * np.power(1.0 + n, 20) + + 742500.0 * np.power(1.0 + n, 21) + + 20550.0 * np.power(1.0 + n, 22) + + 360.0 * np.power(1.0 + n, 23) + + 3.0 * np.power(1.0 + n, 24) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + * np.power(10.0 + n, 3) + ) + + S3 + ) + ) + / (10.0 + n) + + n + * ( + -1.0 / np.power(10.0 + n, 5) + + 1.0823232337111381 / (10.0 + n) + - ( + 1.0 + * ( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1 + ) + ) + / np.power(10.0 + n, 4) + - ( + 1.0 + * ( + 0.5 + * np.power( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1, + 2, + ) + + 0.5 + * ( + np.power(1.0 + n, -2) + + ( + 4.0 + * ( + 6.20783424e8 + + 2.402913888e9 * (1.0 + n) + + 4.261208648e9 * np.power(1.0 + n, 2) + + 4.5733464e9 * np.power(1.0 + n, 3) + + 3.31344237e9 * np.power(1.0 + n, 4) + + 1.713293694e9 * np.power(1.0 + n, 5) + + 6.51986769e8 * np.power(1.0 + n, 6) + + 1.85551632e8 * np.power(1.0 + n, 7) + + 3.9703709e7 * np.power(1.0 + n, 8) + + 6.360228e6 * np.power(1.0 + n, 9) + + 751317.0 * np.power(1.0 + n, 10) + + 63504.0 * np.power(1.0 + n, 11) + + 3633.0 * np.power(1.0 + n, 12) + + 126.0 * np.power(1.0 + n, 13) + + 2.0 * np.power(1.0 + n, 14) + ) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + ) + + S2 + ) + ) + ) + / np.power(10.0 + n, 3) + - ( + 1.0 + * ( + 0.16666666666666666 + * np.power( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1, + 3, + ) + + 0.5 + * ( + 1 / (1.0 + n) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 3044.0 + + 5886.0 * (1.0 + n) + + 4299.0 * np.power(1.0 + n, 2) + + 1539.0 * np.power(1.0 + n, 3) + + 288.0 * np.power(1.0 + n, 4) + + 27.0 * np.power(1.0 + n, 5) + + np.power(1.0 + n, 6) + ) + ) + / ( + (2.0 + n) + * (3.0 + n) + * (4.0 + n) + * (5.0 + n) + * (6.0 + n) + * (7.0 + n) + * (8.0 + n) + * (9.0 + n) + ) + + S1 + ) + * ( + np.power(1.0 + n, -2) + + ( + 4.0 + * ( + 6.20783424e8 + + 2.402913888e9 * (1.0 + n) + + 4.261208648e9 * np.power(1.0 + n, 2) + + 4.5733464e9 * np.power(1.0 + n, 3) + + 3.31344237e9 * np.power(1.0 + n, 4) + + 1.713293694e9 * np.power(1.0 + n, 5) + + 6.51986769e8 * np.power(1.0 + n, 6) + + 1.85551632e8 * np.power(1.0 + n, 7) + + 3.9703709e7 * np.power(1.0 + n, 8) + + 6.360228e6 * np.power(1.0 + n, 9) + + 751317.0 * np.power(1.0 + n, 10) + + 63504.0 * np.power(1.0 + n, 11) + + 3633.0 * np.power(1.0 + n, 12) + + 126.0 * np.power(1.0 + n, 13) + + 2.0 * np.power(1.0 + n, 14) + ) + ) + / ( + np.power(2.0 + n, 2) + * np.power(3.0 + n, 2) + * np.power(4.0 + n, 2) + * np.power(5.0 + n, 2) + * np.power(6.0 + n, 2) + * np.power(7.0 + n, 2) + * np.power(8.0 + n, 2) + * np.power(9.0 + n, 2) + ) + + S2 + ) + + 0.3333333333333333 + * ( + np.power(1.0 + n, -3) + + ( + 4.0 + * (9.0 + 2.0 * (1.0 + n)) + * ( + 2.176131861504e12 + + 1.135056707712e13 * (1.0 + n) + + 2.7974661270464e13 * np.power(1.0 + n, 2) + + 4.3284545841312e13 * np.power(1.0 + n, 3) + + 4.7115984701808e13 * np.power(1.0 + n, 4) + + 3.8323387681704e13 * np.power(1.0 + n, 5) + + 2.4153337475604e13 * np.power(1.0 + n, 6) + + 1.2072584201292e13 * np.power(1.0 + n, 7) + + 4.858675624797e12 * np.power(1.0 + n, 8) + + 1.589624084295e12 * np.power(1.0 + n, 9) + + 4.25052833112e11 * np.power(1.0 + n, 10) + + 9.304706925e10 * np.power(1.0 + n, 11) + + 1.6646348871e10 * np.power(1.0 + n, 12) + + 2.420753526e9 * np.power(1.0 + n, 13) + + 2.8338678e8 * np.power(1.0 + n, 14) + + 2.6298432e7 * np.power(1.0 + n, 15) + + 1.889595e6 * np.power(1.0 + n, 16) + + 101331.0 * np.power(1.0 + n, 17) + + 3816.0 * np.power(1.0 + n, 18) + + 90.0 * np.power(1.0 + n, 19) + + np.power(1.0 + n, 20) + ) + ) + / ( + np.power(2.0 + n, 3) + * np.power(3.0 + n, 3) + * np.power(4.0 + n, 3) + * np.power(5.0 + n, 3) + * np.power(6.0 + n, 3) + * np.power(7.0 + n, 3) + * np.power(8.0 + n, 3) + * np.power(9.0 + n, 3) + ) + + S3 + ) + ) + ) + / np.power(10.0 + n, 2) + ) + ) + ) diff --git a/src/eko/harmonics/f_functions/f19.py b/src/eko/harmonics/f_functions/f19.py new file mode 100644 index 000000000..f372b89d9 --- /dev/null +++ b/src/eko/harmonics/f_functions/f19.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +"""This module contains implemtation of F19. + +When using it, please cite :cite:`Blumlein:2009ta`. +Mellin transform is defined with the convention x^(N). +""" +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def F19(n, S1, S2, S3): + """Mellin tranfrom of eq 9.3 of :cite:`Blumlein:2009ta`""" + return ( + 7.548974594558902 + - 1.5497677311665408 / np.power(1.0 + n, 3) + - 0.5497677311665407 / np.power(2.0 + n, 3) + + 2.0 / np.power(2.0 + n, 2) + - 11.975319856741933 / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - (14.370383828090318 * n) / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - (4.790127942696773 * np.power(n, 2)) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + 3.0 / (2.0 + n) + - 9.738329251443808 / ((1.0 + n) * (2.0 + n)) + - (6.492219500962539 * n) / ((1.0 + n) * (2.0 + n)) + - 0.2997677311665407 / np.power(3.0 + n, 3) + - 0.1450639713483865 / np.power(3.0 + n, 2) + - 0.05860975048126964 / (3.0 + n) + - 0.18865662005542957 / np.power(4.0 + n, 3) + - 0.07098989727431243 / np.power(4.0 + n, 2) + - 0.021572713444232602 / (4.0 + n) + - 0.12615662005542957 / np.power(5.0 + n, 3) + - 0.03973989727431243 / np.power(5.0 + n, 2) + - 0.009853963444232604 / (5.0 + n) + - 0.08615662005542958 / np.power(6.0 + n, 3) + - 0.02373989727431243 / np.power(6.0 + n, 2) + - 0.005053963444232604 / (6.0 + n) + - 0.058378842277651805 / np.power(7.0 + n, 3) + - 0.01448063801505317 / np.power(7.0 + n, 2) + - 0.0027391486294177886 / (7.0 + n) + - 0.03797067901234568 / np.power(8.0 + n, 3) + - 0.008649734224965707 / np.power(8.0 + n, 2) + - 0.0014896692458276177 / (8.0 + n) + - 0.02234567901234568 / np.power(9.0 + n, 3) + - 0.004743484224965707 / np.power(9.0 + n, 2) + - 0.0007572473708276177 / (9.0 + n) + - 0.01 / np.power(10.0 + n, 3) + - 0.002 / np.power(10.0 + n, 2) + - 0.0003 / (10.0 + n) + - 3.2461097504812697 * S1 + - 2.3950639713483866 * S2 + - (1.5497677311665408 * S3) / np.power(1.0 + n, 3) + - (4.649303193499622 * n * S3) / np.power(1.0 + n, 3) + - (4.649303193499622 * np.power(n, 2) * S3) / np.power(1.0 + n, 3) + - (1.5497677311665408 * np.power(n, 3) * S3) / np.power(1.0 + n, 3) + ) diff --git a/src/eko/harmonics/f_functions/f20.py b/src/eko/harmonics/f_functions/f20.py new file mode 100644 index 000000000..2db510935 --- /dev/null +++ b/src/eko/harmonics/f_functions/f20.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +"""This module contains implemtation of F20. + +When using it, please cite :cite:`Blumlein:2009ta`. +Mellin transform is defined with the convention x^(N). +""" +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def F20(n, Sm1, Sm2, Sm3): + """Mellin transform of eq 9.5 :cite:`Blumlein:2009ta`""" + return 2.3148148148148148e-7 * ( + 1.8204889223408133e7 / np.power(-1.0, 1.0 * n) + - 650000.0 / (2.0 + n) + - 382800.0 / np.power(3.0 + n, 3) + - 254120.0 / np.power(3.0 + n, 2) + - 109375.0 / (3.0 + n) + + 600000.0 / np.power(4.0 + n, 3) + - 4.32e7 / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3)) + - (3.6e7 * n) / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3)) + - (1.08e7 * np.power(n, 2)) / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3)) + - (1.2e6 * np.power(n, 3)) / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3)) + + 760000.0 / np.power(4.0 + n, 2) + - 1.52e7 / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2)) + - (9.12e6 * n) / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2)) + - (1.52e6 * np.power(n, 2)) / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2)) + - 172800.0 / np.power(5.0 + n, 3) + - 69120.0 / np.power(5.0 + n, 2) + + 97200.0 / np.power(6.0 + n, 3) + - 1.5614208e9 + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + - (2.1275136e9 * n) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + - (1.236384e9 * np.power(n, 2)) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + - (3.919104e8 * np.power(n, 3)) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + - (7.11504e7 * np.power(n, 4)) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + - (6.9984e6 * np.power(n, 5)) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + - (291600.0 * np.power(n, 6)) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + + 65880.0 / np.power(6.0 + n, 2) + - 5.164992e7 + / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2) * np.power(6.0 + n, 2)) + - (5.059584e7 * n) + / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2) * np.power(6.0 + n, 2)) + - (1.897344e7 * np.power(n, 2)) + / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2) * np.power(6.0 + n, 2)) + - (3.16224e6 * np.power(n, 3)) + / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2) * np.power(6.0 + n, 2)) + - (197640.0 * np.power(n, 4)) + / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2) * np.power(6.0 + n, 2)) + - 179334.0 / (8.0 + 6.0 * n + np.power(n, 2)) + - (59778.0 * n) / (8.0 + 6.0 * n + np.power(n, 2)) + - 165888.0 / (15.0 + 8.0 * n + np.power(n, 2)) + - (41472.0 * n) / (15.0 + 8.0 * n + np.power(n, 2)) + + (1.2280111e7 * Sm1) / np.power(-1.0, 1.0 * n) + + (7.81412e6 * Sm2) / np.power(-1.0, 1.0 * n) + + (3.6228e6 * Sm3) / np.power(-1.0, 1.0 * n) + + ( + np.power(-1.0, 1.0 - 1.0 * n) + * (2.3717031e7 + 3.2374342e7 * n + 1.2280111e7 * np.power(n, 2)) + * np.power(-1.0, n) + ) + / np.power(1.0 + n, 3) + ) diff --git a/src/eko/harmonics/f_functions/f21.py b/src/eko/harmonics/f_functions/f21.py new file mode 100644 index 000000000..a2aba7b90 --- /dev/null +++ b/src/eko/harmonics/f_functions/f21.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +"""This module contains implemtation of F21. + +When using it, please cite :cite:`Blumlein:2009ta`. +Mellin transform is defined with the convention x^(N). +""" +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def F21(n, Sm1, Sm2, Sm3): + """Mellin transform of eq 9.4 of :cite:`Blumlein:2009ta`""" + return 2.3148148148148148e-7 * ( + 2.383072892806571e7 / np.power(-1.0, 1.0 * n) + + 970000.0 / (2.0 + n) + - 922800.0 / np.power(3.0 + n, 3) + - 524120.0 / np.power(3.0 + n, 2) + - 210625.0 / (3.0 + n) + - 1.56e6 / np.power(4.0 + n, 3) + + 1.1232e8 / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3)) + + (9.36e7 * n) / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3)) + + (2.808e7 * np.power(n, 2)) / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3)) + + (3.12e6 * np.power(n, 3)) / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3)) + - 1.4e6 / np.power(4.0 + n, 2) + + 2.8e7 / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2)) + + (1.68e7 * n) / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2)) + + (2.8e6 * np.power(n, 2)) / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2)) + - 172800.0 / np.power(5.0 + n, 3) + - 69120.0 / np.power(5.0 + n, 2) + - 442800.0 / np.power(6.0 + n, 3) + + 7.1131392e9 + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + + (9.6920064e9 * n) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + + (5.632416e9 * np.power(n, 2)) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + + (1.7853696e9 * np.power(n, 3)) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + + (3.241296e8 * np.power(n, 4)) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + + (3.18816e7 * np.power(n, 5)) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + + (1.3284e6 * np.power(n, 6)) + / (np.power(2.0 + n, 3) * np.power(4.0 + n, 3) * np.power(6.0 + n, 3)) + - 204120.0 / np.power(6.0 + n, 2) + + 1.6003008e8 + / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2) * np.power(6.0 + n, 2)) + + (1.5676416e8 * n) + / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2) * np.power(6.0 + n, 2)) + + (5.878656e7 * np.power(n, 2)) + / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2) * np.power(6.0 + n, 2)) + + (9.79776e6 * np.power(n, 3)) + / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2) * np.power(6.0 + n, 2)) + + (612360.0 * np.power(n, 4)) + / (np.power(2.0 + n, 2) * np.power(4.0 + n, 2) * np.power(6.0 + n, 2)) + + 428166.0 / (8.0 + 6.0 * n + np.power(n, 2)) + + (142722.0 * n) / (8.0 + 6.0 * n + np.power(n, 2)) + - 165888.0 / (15.0 + 8.0 * n + np.power(n, 2)) + - (41472.0 * n) / (15.0 + 8.0 * n + np.power(n, 2)) + + (1.4001361e7 * Sm1) / np.power(-1.0, 1.0 * n) + + (1.024412e7 * Sm2) / np.power(-1.0, 1.0 * n) + + (6.3228e6 * Sm3) / np.power(-1.0, 1.0 * n) + + ( + np.power(-1.0, 1.0 - 1.0 * n) + * (3.0568281e7 + 3.8246842e7 * n + 1.4001361e7 * np.power(n, 2)) + * np.power(-1.0, n) + ) + / np.power(1.0 + n, 3) + ) diff --git a/src/eko/harmonics/f_functions/f9.py b/src/eko/harmonics/f_functions/f9.py new file mode 100644 index 000000000..94d41fb2e --- /dev/null +++ b/src/eko/harmonics/f_functions/f9.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +"""This module contains implemtation of F9. + +When using it, please cite :cite:`Blumlein:2009ta`. +Mellin transform is defined with the convention x^(N). +""" +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def F9(n, S1): + """Implements eq 9.19 of :cite:`Blumlein:2009ta`""" + return ( + 0.06236473052300693 * n + + (0.2690947900632558 * n) / (2.0 + n) + - (0.12825410062391376 * n) / (3.0 + n) + + (0.007553694508943639 * n) / (4.0 + n) + + (0.030446610389993342 * n) / (5.0 + n) + - (0.11774020607944516 * n) / (6.0 + n) + + (0.33716180147388786 * n) / (7.0 + n) + - (0.6676623948212598 * n) / (8.0 + n) + + (0.9225597682535133 * n) / (9.0 + n) + - (0.8726283036193748 * n) / (10.0 + n) + + (0.5398117849858193 * n) / (11.0 + n) + - (0.1970839223372511 * n) / (12.0 + n) + + (0.03230590731253853 * n) / (13.0 + n) + + 0.21793029342350395 * (-1.0 + 1 / (1.0 + n)) + - 0.000925925925925926 + * n + * ( + 67.35391078053772 + + 993.5438760599122 / (1.0 + n) + + 185.10074515651877 / (2.0 + n) + - 21.841303653529422 / (3.0 + n) + + (180.0 * (1.0 + (1.0 + n) * S1)) / np.power(1.0 + n, 2) + - (180.0 * (1.0 + (2.0 + n) * (1 / (1.0 + n) + S1))) / np.power(2.0 + n, 2) + + (60.0 * (1.0 + (3.0 + n) * (1 / (1.0 + n) + 1 / (2.0 + n) + S1))) + / np.power(3.0 + n, 2) + - ( + 1228.9090924080292 + * ( + 1.0 + + n + * (1 / (1.0 + n) + (1.0 - 2.0 * (1.0 + n)) / (n * (1.0 + n)) + S1) + ) + ) + / np.power(n, 2) + ) + ) diff --git a/src/eko/harmonics/g_functions.py b/src/eko/harmonics/g_functions.py new file mode 100644 index 000000000..220dc95ed --- /dev/null +++ b/src/eko/harmonics/g_functions.py @@ -0,0 +1,366 @@ +# -*- coding: utf-8 -*- +""" +Implemtations of some mellin transformations :cite:`MuselliPhD` +appearing in the analytic continuation of harmonics sums of weight = 3,4. +""" +import numba as nb +import numpy as np + +from . import w1 +from .constants import log2, zeta2, zeta3 +from .polygamma import recursive_harmonic_sum as s + +a1 = np.array( + [ + 0.999999974532238, + -0.499995525889840, + 0.333203435557262, + -0.248529457782640, + 0.191451164719161, + -0.137466222728331, + 0.0792107412244877, + -0.0301109656912626, + 0.00538406208663153, + 0.0000001349586745, + ] +) + +c1 = np.array( + [ + 2.2012182965269744e-8, + 2.833327652357064, + -1.8330909624101532, + 0.7181879191200942, + -0.0280403220046588, + -0.181869786537805, + 0.532318519269331, + -1.07281686995035, + 1.38194913357518, + -1.11100841298484, + 0.506649587198046, + -0.100672390783659, + ] +) + +c3 = np.array( + [ + 0, + 1.423616247405256, + -0.08001203559240111, + -0.39875367195395994, + 0.339241791547134, + -0.0522116678353452, + -0.0648354706049337, + 0.0644165053822532, + -0.0394927322542075, + 0.0100879370657869, + ] +) + +p11 = np.array([11.0 / 6.0, -3.0, 3.0 / 2.0, -1.0 / 3.0]) +p32 = np.array([-25.0 / 24.0, 2.0, -3.0 / 2.0, 2.0 / 3.0, -1.0 / 8.0]) +p31 = np.array([205.0 / 144.0, -25.0 / 12.0, 23.0 / 24.0, -13.0 / 36.0, 1.0 / 16]) + + +@nb.njit(cache=True) +def mellin_g3(N, S1): + r""" + Computes the Mellin transform of :math:`\text{Li}_2(x)/(1+x)`. + + This function appears in the analytic continuation of the harmonic sum + :math:`S_{-2,1}(N)` which in turn appears in the |NLO| anomalous dimension + (see :ref:`theory/mellin:harmonic sums`). + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + + Returns + ------- + mellin_g3 : complex + approximate Mellin transform :math:`\mathcal{M}[\text{Li}_2(x)/(1+x)](N)` + + Note + ---- + We use the name from :cite:`MuselliPhD`, but not his implementation - rather we use the + Pegasus :cite:`Vogt:2004ns` implementation. + """ + cs = [1.0000e0, -0.9992e0, 0.9851e0, -0.9005e0, 0.6621e0, -0.3174e0, 0.0699e0] + g3 = 0 + for j, c in enumerate(cs): + Nj = N + j + g3 += c * (zeta2 - s(S1, N, j, 1) / Nj) / Nj + return g3 + + +@nb.njit(cache=True) +def mellin_g4(N): + r""" + Computes the Mellin transform of :math:`\text{Li}_2(-x)/(1+x)`. + + Implementation and definition in B.5.25 of :cite:`MuselliPhD` or + in eq 61 of :cite:`Bl_mlein_2000`, but none of them is fully correct. + + + Parameters + ---------- + N : complex + Mellin moment + + Returns + ------- + mellin_g4 : complex + Mellin transform :math:`\mathcal{M}[\text{Li}_2(-x)/(1+x)](N)` + """ + g4 = -1 / 2 * zeta2 * log2 + for k, ak in enumerate(a1): + Nk = N + k + 1 + beta = 1 / 2 * (w1.S1((Nk) / 2) - w1.S1((Nk - 1) / 2)) + g4 += ak * (N / Nk * zeta2 / 2 + (k + 1) / Nk**2 * (log2 - beta)) + return g4 + + +@nb.njit(cache=True) +def mellin_g5(N, S1, S2): + r""" + Computes the Mellin transform of :math:`(\text{Li}_2(x)ln(x))/(1+x)`. + + Implementation and definition in B.5.26 of :cite:`MuselliPhD` or + in eq 62 of :cite:`Bl_mlein_2000`, but none of them is fully correct. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + + Returns + ------- + mellin_g5 : complex + Mellin transform :math:`\mathcal{M}[(\text{Li}_2(x)ln(x))/(1+x)](N)` + """ + g5 = 0.0 + for k, ak in enumerate(a1): + Nk = N + k + 1 + poly1nk = -s(S2, N, k + 1, 2) + zeta2 + g5 -= ak * ((k + 1) / Nk**2 * (zeta2 + poly1nk - 2 * s(S1, N, k + 1, 1) / Nk)) + return g5 + + +@nb.njit(cache=True) +def mellin_g6(N, S1): + r""" + Computes the Mellin transform of :math:`\text{Li}_3(x)/(1+x)`. + + Implementation and definition in B.5.27 of :cite:`MuselliPhD` or + in eq 63 of :cite:`Bl_mlein_2000`, but none of them is fully correct. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + + Returns + ------- + mellin_g6 : complex + Mellin transform :math:`\mathcal{M}[\text{Li}_3(x)/(1+x)](N)` + + + """ + g6 = zeta3 * log2 + for k, ak in enumerate(a1): + Nk = N + k + 1 + g6 -= ak * ( + N / Nk * zeta3 + (k + 1) / Nk**2 * (zeta2 - s(S1, N, k + 1, 1) / Nk) + ) + return g6 + + +@nb.njit(cache=True) +def mellin_g8(N, S1, S2): + r""" + Computes the Mellin transform of :math:`S_{1,2}(x)/(1+x)`. + + Implementation and definition in B.5.29 of :cite:`MuselliPhD` or + in eq 65 of :cite:`Bl_mlein_2000`, but none of them is fully correct. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + + Returns + ------- + mellin_g8 : complex + Mellin transform :math:`\mathcal{M}[S_{1,2}(x)/(1+x)](N)` + """ + g8 = zeta3 * log2 + for k, ak in enumerate(a1): + Nk = N + k + 1 + g8 -= ak * ( + N / Nk * zeta3 + + (k + 1) / Nk**2 * 1 / 2 * (s(S1, N, k + 1, 1) ** 2 + s(S2, N, k + 1, 2)) + ) + return g8 + + +@nb.njit(cache=True) +def mellin_g18(N, S1, S2): + r""" + Computes the Mellin transform of :math:`-(\text{Li}_2(x) - \zeta_2)/(1-x)`. + + Implementation and definition in eq 124 of :cite:`Bl_mlein_2000` + + Note: comparing to :cite:`Bl_mlein_2000`, we believe :cite:`MuselliPhD` + was not changing the notations of :math:`P^{(1)}_{2}` to :math:`P^{(1)}_{1}`. + So we implement eq 124 of :cite:`Bl_mlein_2000` but using :cite:`MuselliPhD` + notation. + + Parameters + ---------- + N : complex + Mellin moment + S1 : complex + Harmonic sum :math:`S_{1}(N)` + S2 : complex + Harmonic sum :math:`S_{2}(N)` + Returns + ------- + mellin_g18 : complex + Mellin transform :math:`\mathcal{M}[-(\text{Li}_2(x) - \zeta_2)/(1-x)](N)` + """ + g18 = (S1**2 + S2) / (N) - zeta2 * S1 + for k, ck in enumerate(c1): + Nk = N + k + g18 += ck * (N) / (Nk) * s(S1, N, k, 1) + for k, p11k in enumerate(p11): + Nk = N + k + g18 -= p11k * (N) / (Nk) * (s(S1, N, k, 1) ** 2 + s(S2, N, k, 2)) + return g18 + + +@nb.njit(cache=True) +def mellin_g19(N, S1): + r""" + Computes the Mellin transform of :math:`-(\text{Li}_2(-x) + \zeta_2/2)/(1-x)`. + + Implementation and definition in B.5.40 of :cite:`MuselliPhD` or in 125 of + :cite:`Bl_mlein_2000`, but none of them is fully correct. + + Parameters + ---------- + N : complex + Mellin moment + S1 : complex + Harmonic sum :math:`S_{1}(N)` + + Returns + ------- + mellin_g19 : complex + Mellin transform :math:`\mathcal{M}[-(\text{Li}_2(-x) + \zeta_2/2)/(1-x)](N)` + """ + g19 = 1 / 2 * zeta2 * S1 + for k, ak in enumerate(a1): + g19 -= ak / (k + 1) * s(S1, N, k + 1, 1) + return g19 + + +@nb.njit(cache=True) +def mellin_g21(N, S1, S2, S3): + r""" + Computes the Mellin transform of :math:`-(S_{1,2}(x) - \zeta_3)/(1-x)`. + + Implementation and definition in B.5.42 of :cite:`MuselliPhD` + + Note: comparing to :cite:`Bl_mlein_2000`, we believe :cite:`MuselliPhD` + was not changing the notations of :math:`P^{(3)}_{2}` to :math:`P^{(3)}_{1}` + and :math:`P^{(3)}_{3}` to :math:`P^{(3)}_{2}`. + So we implement eq 127 of :cite:`Bl_mlein_2000` but using :cite:`MuselliPhD` + notation. + + Parameters + ---------- + N : complex + Mellin moment + S1 : complex + Harmonic sum :math:`S_{1}(N)` + S2 : complex + Harmonic sum :math:`S_{2}(N)` + S3 : complex + Harmonic sum :math:`S_{3}(N)` + + Returns + ------- + mellin_g21 : complex + Mellin transform :math:`\mathcal{M}[-(S_{1,2}(x) - \zeta_3)/(1-x)](N)` + """ + g21 = -zeta3 * S1 + (S1**3 + 3 * S1 * S2 + 2 * S3) / (2 * N) + for k, ck in enumerate(c3): + Nk = N + k + g21 += ck * N / Nk * s(S1, N, k, 1) + for k in range(0, 5): + Nk = N + k + S1nk = s(S1, N, k, 1) + S2nk = s(S2, N, k, 2) + S3nk = s(S3, N, k, 3) + g21 += ( + N + / Nk + * ( + p32[k] * (S1nk**3 + 3 * S1nk * S2nk + 2 * S3nk) + - p31[k] * (S1nk**2 + S2nk) + ) + ) + return g21 + + +@nb.njit(cache=True) +def mellin_g22(N, S1, S2, S3): + r""" + Computes the Mellin transform of :math:`-(\text{Li}_2(x) ln(x))/(1-x)`. + + Implementation and definition in B.5.43 of :cite:`MuselliPhD` + + Note: comparing to :cite:`Bl_mlein_2000`, we believe :cite:`MuselliPhD` + was not changing the notations of :math:`P^{(1)}_{2}` to :math:`P^{(1)}_{1}` + So we implement eq 128 of :cite:`Bl_mlein_2000` but using :cite:`MuselliPhD` + notation. + + Parameters + ---------- + N : complex + Mellin moment + S1 : complex + Harmonic sum :math:`S_{1}(N)` + S2 : complex + Harmonic sum :math:`S_{2}(N)` + S3 : complex + Harmonic sum :math:`S_{3}(N)` + + Returns + ------- + mellin_g22 : complex + Mellin transform :math:`\mathcal{M}[-(\text{Li}_2(x) ln(x))/(1-x)](N)` + """ + g22 = 0.0 + for k, ck in enumerate(c1): + poly1nk = -s(S2, N, k, 2) + zeta2 + g22 += ck * poly1nk + for k, p11k in enumerate(p11): + S1nk = s(S1, N, k, 1) + poly1nk = -s(S2, N, k, 2) + zeta2 + poly2nk = 2 * s(S3, N, k, 3) + zeta3 + g22 -= p11k * (S1nk * poly1nk - 1 / 2 * poly2nk) + return g22 diff --git a/src/eko/anomalous_dimensions/harmonics.py b/src/eko/harmonics/polygamma.py similarity index 50% rename from src/eko/anomalous_dimensions/harmonics.py rename to src/eko/harmonics/polygamma.py index 75163b781..b63ce5846 100644 --- a/src/eko/anomalous_dimensions/harmonics.py +++ b/src/eko/harmonics/polygamma.py @@ -7,16 +7,9 @@ import numba as nb import numpy as np -import scipy.special -# compute constants only once -zeta2 = scipy.special.zeta(2) -zeta3 = scipy.special.zeta(3) -zeta4 = scipy.special.zeta(4) -zeta5 = scipy.special.zeta(5) - -@nb.njit("c16(c16,u1)", cache=True) +@nb.njit(cache=True) def cern_polygamma(Z, K): # pylint: disable=all """ Computes the polygamma functions :math:`\\psi_k(z)`. @@ -133,145 +126,57 @@ def cern_polygamma(Z, K): # pylint: disable=all # fmt: on -@nb.njit("c16(c16)", cache=True) -def harmonic_S1(N): - r""" - Computes the harmonic sum :math:`S_1(N)`. - - .. math:: - S_1(N) = \sum\limits_{j=1}^N \frac 1 j = \psi_0(N+1)+\gamma_E - - with :math:`\psi_0(N)` the digamma function and :math:`\gamma_E` the - Euler-Mascheroni constant. - - Parameters - ---------- - N : complex - Mellin moment - - Returns - ------- - S_1 : complex - (simple) Harmonic sum :math:`S_1(N)` - - See Also - -------- - cern_polygamma : :math:`\psi_k(N)` - """ - return cern_polygamma(N + 1.0, 0) + np.euler_gamma - - -@nb.njit("c16(c16)", cache=True) -def harmonic_S2(N): - r""" - Computes the harmonic sum :math:`S_2(N)`. - - .. math:: - S_2(N) = \sum\limits_{j=1}^N \frac 1 {j^2} = -\psi_1(N+1)+\zeta(2) - - with :math:`\psi_1(N)` the trigamma function and :math:`\zeta` the - Riemann zeta function. - - Parameters - ---------- - N : complex - Mellin moment - - Returns - ------- - S_2 : complex - Harmonic sum :math:`S_2(N)` - - See Also - -------- - cern_polygamma : :math:`\psi_k(N)` +@nb.njit(cache=True) +def recursive_harmonic_sum(base_value, n, iterations, weight): """ - return -cern_polygamma(N + 1.0, 1) + zeta2 - - -@nb.njit("c16(c16)", cache=True) -def harmonic_S3(N): - r""" - Computes the harmonic sum :math:`S_3(N)`. - - .. math:: - S_3(N) = \sum\limits_{j=1}^N \frac 1 {j^3} = \frac 1 2 \psi_2(N+1)+\zeta(3) - - with :math:`\psi_2(N)` the 2nd-polygamma function and :math:`\zeta` the - Riemann zeta function. + Compute the harmonic sum :math:`S_{w}(N+k)` stating from the value + :math:`S_{w}(N)` via the recurrence relations. Parameters ---------- - N : complex - Mellin moment + base_value: complex + starting value :math:`S_{w}(N)` + n: complex + starting point + iterations: int + number of iterations + weight: int + harmonic sum weight Returns ------- - S_3 : complex - Harmonic sum :math:`S_3(N)` - - See Also - -------- - cern_polygamma : :math:`\psi_k(N)` + sni : complex + :math:`S_{w}(N+k)` """ - return 0.5 * cern_polygamma(N + 1.0, 2) + zeta3 - - -@nb.njit("c16(c16)", cache=True) -def harmonic_S4(N): - r""" - Computes the harmonic sum :math:`S_4(N)`. - - .. math:: - S_4(N) = \sum\limits_{j=1}^N \frac 1 {j^4} = - \frac 1 6 \psi_3(N+1)+\zeta(4) + fact = 0.0 + for i in range(1, iterations + 1): + fact += 1.0 / (n + i) ** weight + return base_value + fact - with :math:`\psi_3(N)` the 3rd-polygamma function and :math:`\zeta` the - Riemann zeta function. - Parameters - ---------- - N : complex - Mellin moment - - Returns - ------- - S_4 : complex - Harmonic sum :math:`S_4(N)` - - See Also - -------- - cern_polygamma : :math:`\psi_k(N)` +@nb.njit(cache=True) +def symmetry_factor(N, is_singlet=None): """ - return zeta4 - 1.0 / 6.0 * cern_polygamma(N + 1.0, 3) - - -@nb.njit("c16(c16)", cache=True) -def mellin_g3(N): - r""" - Computes the Mellin transform of :math:`\text{Li}_2(x)/(1+x)`. - - This function appears in the analytic continuation of the harmonic sum - :math:`S_{-2,1}(N)` which in turn appears in the |NLO| anomalous dimension - (see :ref:`theory/mellin:harmonic sums`). + Compute the analytical continuation of :math:`(-1)^N` Parameters ---------- - N : complex + N: complex Mellin moment + is_singlet: bool, None + True for singlet like quantities + False for non-singlet like quantities + None for generic complex N value Returns ------- - mellin_g3 : complex - approximate Mellin transform :math:`\mathcal{M}[\text{Li}_2(x)/(1+x)](N)` - - Note - ---- - We use the name from :cite:`MuselliPhD`, but not his implementation - rather we use the - Pegasus :cite:`Vogt:2004ns` implementation. + eta: complex + 1 for singlet like quantities, + -1 for non-singlet like quantities, + :math:`(-1)^N` elsewise """ - cs = [1.0000e0, -0.9992e0, 0.9851e0, -0.9005e0, 0.6621e0, -0.3174e0, 0.0699e0] - g3 = 0 - for j, c in enumerate(cs): - Nj = N + j - g3 += c * (zeta2 - harmonic_S1(Nj) / Nj) / Nj - return g3 + if is_singlet is None: + return (-1) ** N + if is_singlet: + return 1 + return -1 diff --git a/src/eko/harmonics/w1.py b/src/eko/harmonics/w1.py new file mode 100644 index 000000000..8cff68f98 --- /dev/null +++ b/src/eko/harmonics/w1.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +"""Weight 1 harmonic sums.""" + +import numba as nb +import numpy as np + +from .polygamma import cern_polygamma + + +@nb.njit(cache=True) +def S1(N): + r"""Computes the harmonic sum :math:`S_1(N)`. + + .. math:: + S_1(N) = \sum\limits_{j=1}^N \frac 1 j = \psi_0(N+1)+\gamma_E + + with :math:`\psi_0(N)` the digamma function and :math:`\gamma_E` the + Euler-Mascheroni constant. + + Parameters + ---------- + N : complex + Mellin moment + + Returns + ------- + S_1 : complex + (simple) Harmonic sum :math:`S_1(N)` + + See Also + -------- + eko.harmonics.polygamma.cern_polygamma : :math:`\psi_k(N)` + """ + return cern_polygamma(N + 1.0, 0) + np.euler_gamma + + +@nb.njit(cache=True) +def Sm1(N, hS1, is_singlet=None): + r"""Analytic continuation of harmonic sum :math:`S_{-1}(N)`. + + .. math:: + S_{-1}(N) = \sum\limits_{j=1}^N \frac {(-1)^j} j + + Parameters + ---------- + N : complex + Mellin moment + hS1: complex + Harmonic sum :math:`S_{1}(N)` + is_singlet: bool, None + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`), + False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + Returns + ------- + Sm1 : complex + Harmonic sum :math:`S_{-1}(N)` + + See Also + -------- + eko.anomalous_dimension.w1.S1 : :math:`S_1(N)` + """ + if is_singlet is None: + return ( + (1 - (-1) ** N) / 2 * S1((N - 1) / 2) + + ((-1) ** N + 1) / 2 * S1(N / 2) + - hS1 + ) + if is_singlet: + return S1(N / 2) - hS1 + return S1((N - 1) / 2) - hS1 diff --git a/src/eko/harmonics/w2.py b/src/eko/harmonics/w2.py new file mode 100644 index 000000000..976928fe3 --- /dev/null +++ b/src/eko/harmonics/w2.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +"""Weight 2 harmonic sums.""" + +import numba as nb + +from .constants import zeta2 +from .polygamma import cern_polygamma + + +@nb.njit(cache=True) +def S2(N): + r"""Computes the harmonic sum :math:`S_2(N)`. + + .. math:: + S_2(N) = \sum\limits_{j=1}^N \frac 1 {j^2} = -\psi_1(N+1)+\zeta(2) + + with :math:`\psi_1(N)` the trigamma function and :math:`\zeta` the + Riemann zeta function. + + Parameters + ---------- + N : complex + Mellin moment + + Returns + ------- + S_2 : complex + Harmonic sum :math:`S_2(N)` + + See Also + -------- + eko.harmonics.polygamma.cern_polygamma : :math:`\psi_k(N)` + """ + return -cern_polygamma(N + 1.0, 1) + zeta2 + + +@nb.njit(cache=True) +def Sm2(N, hS2, is_singlet=None): + r"""Analytic continuation of harmonic sum :math:`S_{-2}(N)`. + + .. math:: + S_{-2}(N) = \sum\limits_{j=1}^N \frac {(-1)^j}{j^2} + + Parameters + ---------- + N : complex + Mellin moment + hS2: complex + Harmonic sum :math:`S_{2}(N)` + is_singlet: bool, None + symmetry factor: True for singlet like quantities + (:math:`\eta=(-1)^N = 1`), False for non-singlet like quantities + (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + Sm2 : complex + Harmonic sum :math:`S_{-2}(N)` + + See Also + -------- + eko.anomalous_dimension.w2.S2 : :math:`S_2(N)` + """ + if is_singlet is None: + return ( + 1 + / 2 + * ((1 - (-1) ** N) / 2 * S2((N - 1) / 2) + ((-1) ** N + 1) / 2 * S2(N / 2)) + - hS2 + ) + if is_singlet: + return 1 / 2 * S2(N / 2) - hS2 + return 1 / 2 * S2((N - 1) / 2) - hS2 diff --git a/src/eko/harmonics/w3.py b/src/eko/harmonics/w3.py new file mode 100644 index 000000000..3f51d9162 --- /dev/null +++ b/src/eko/harmonics/w3.py @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- +"""Weight 3 harmonic sums.""" + +import numba as nb + +from . import g_functions as gf +from .constants import log2, zeta2, zeta3 +from .polygamma import cern_polygamma, symmetry_factor + + +@nb.njit(cache=True) +def S3(N): + r"""Computes the harmonic sum :math:`S_3(N)`. + + .. math:: + S_3(N) = \sum\limits_{j=1}^N \frac 1 {j^3} = \frac 1 2 \psi_2(N+1)+\zeta(3) + + with :math:`\psi_2(N)` the 2nd-polygamma function and :math:`\zeta` the + Riemann zeta function. + + Parameters + ---------- + N : complex + Mellin moment + + Returns + ------- + S_3 : complex + Harmonic sum :math:`S_3(N)` + + See Also + -------- + eko.harmonics.polygamma.cern_polygamma : :math:`\psi_k(N)` + + """ + return 0.5 * cern_polygamma(N + 1.0, 2) + zeta3 + + +@nb.njit(cache=True) +def Sm3(N, hS3, is_singlet=None): + r"""Analytic continuation of harmonic sum :math:`S_{-3}(N)`. + + .. math:: + S_{-3}(N) = \sum\limits_{j=1}^N \frac {(-1)^j} {j^3} + + Parameters + ---------- + N : complex + Mellin moment + hS3: complex + Harmonic sum :math:`S_{3}(N)` + is_singlet: bool, None + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`), + False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + Sm3 : complex + Harmonic sum :math:`S_{-3}(N)` + + See Also + -------- + eko.harmonics.w3.S3 : :math:`S_3(N)` + + """ + if is_singlet is None: + return ( + 1 + / 2**2 + * ((1 - (-1) ** N) / 2 * S3((N - 1) / 2) + ((-1) ** N + 1) / 2 * S3(N / 2)) + - hS3 + ) + if is_singlet: + return 1 / 2**2 * S3(N / 2) - hS3 + return 1 / 2**2 * S3((N - 1) / 2) - hS3 + + +@nb.njit(cache=True) +def S21(N, S1, S2): + r"""Analytic continuation of harmonic sum :math:`S_{2,1}(N)`. + + As implemented in eq B.5.77 of :cite:`MuselliPhD` and eq 37 of + :cite:`Bl_mlein_2000`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + + Returns + ------- + S21 : complex + Harmonic sum :math:`S_{2,1}(N)` + + See Also + -------- + eko.harmonics.g_functions.mellin_g18 : :math:`g_18(N)` + + """ + return -gf.mellin_g18(N, S1, S2) + 2 * zeta3 + + +@nb.njit(cache=True) +def Sm21(N, S1, Sm1, is_singlet=None): + r"""Analytic continuation of harmonic sum :math:`S_{-2,1}(N)`. + + As implemented in eq B.5.75 of :cite:`MuselliPhD` and eq 22 of + :cite:`Bl_mlein_2000`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + Sm1: complex + Harmonic sum :math:`S_{-1}(N)` + is_singlet: bool, None + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`), + False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + Sm21 : complex + Harmonic sum :math:`S_{-2,1}(N)` + + See Also + -------- + eko.harmonics.g_functions : :math:`g_3(N)` + + """ + # Note mellin g3 was integrated following x^(N-1) convention. + eta = symmetry_factor(N, is_singlet) + return ( + -eta * gf.mellin_g3(N + 1, S1 + 1 / (N + 1)) + + zeta2 * Sm1 + - 5 / 8 * zeta3 + + zeta2 * log2 + ) + + +@nb.njit(cache=True) +def S2m1(N, S2, Sm1, Sm2, is_singlet=None): + r"""Analytic continuation of harmonic sum :math:`S_{2,-1}(N)`. + + As implemented in eq B.5.76 of :cite:`MuselliPhD` and eq 23 of + :cite:`Bl_mlein_2000`. + + Parameters + ---------- + N : complex + Mellin moment + S2: complex + Harmonic sum :math:`S_{2}(N)` + Sm1: complex + Harmonic sum :math:`S_{-1}(N)` + Sm2: complex + Harmonic sum :math:`S_{-2}(N)` + is_singlet: bool, None + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = + 1`), False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + S2m1 : complex + Harmonic sum :math:`S_{2,-1}(N)` + + See Also + -------- + eko.harmonics.g_functions.mellin_g4 : :math:`g_4(N)` + + """ + eta = symmetry_factor(N, is_singlet) + return ( + -eta * gf.mellin_g4(N) + - log2 * (S2 - Sm2) + - 1 / 2 * zeta2 * Sm1 + + 1 / 4 * zeta3 + - 1 / 2 * zeta2 * log2 + ) + + +@nb.njit(cache=True) +def Sm2m1(N, S1, S2, Sm2): + r"""Analytic continuation of harmonic sum :math:`S_{-2,-1}(N)`. + + As implemented in eq B.5.74 of :cite:`MuselliPhD` and eq 38 of + :cite:`Bl_mlein_2000`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + Sm2: complex + Harmonic sum :math:`S_{-2}(N)` + + Returns + ------- + Sm2m1 : complex + Harmonic sum :math:`S_{-2,-1}(N)` + + See Also + -------- + eko.harmonics.g_functions.mellin_g19 : :math:`g_19(N)` + + """ + return -gf.mellin_g19(N, S1) + log2 * (S2 - Sm2) - 5 / 8 * zeta3 diff --git a/src/eko/harmonics/w4.py b/src/eko/harmonics/w4.py new file mode 100644 index 000000000..43a251931 --- /dev/null +++ b/src/eko/harmonics/w4.py @@ -0,0 +1,271 @@ +# -*- coding: utf-8 -*- +"""Weight 4 harmonic sums.""" + +import numba as nb + +from . import g_functions as gf +from .constants import li4half, log2, zeta2, zeta3, zeta4 +from .polygamma import cern_polygamma, symmetry_factor + + +@nb.njit(cache=True) +def S4(N): + r"""Computes the harmonic sum :math:`S_4(N)`. + + .. math:: + S_4(N) = \sum\limits_{j=1}^N \frac 1 {j^4} = - \frac 1 6 \psi_3(N+1)+\zeta(4) + + with :math:`\psi_3(N)` the 3rd-polygamma function and :math:`\zeta` the + Riemann zeta function. + + Parameters + ---------- + N : complex + Mellin moment + + Returns + ------- + S_4 : complex + Harmonic sum :math:`S_4(N)` + + See Also + -------- + eko.harmonics.polygamma.cern_polygamma : :math:`\psi_k(N)` + + """ + return zeta4 - 1.0 / 6.0 * cern_polygamma(N + 1.0, 3) + + +@nb.njit(cache=True) +def Sm4(N, hS4, is_singlet=None): + r"""Analytic continuation of harmonic sum :math:`S_{-4}(N)`. + + .. math:: + S_{-4}(N) = \sum\limits_{j=1}^N \frac {(-1)^j} {j^4} + + Parameters + ---------- + N : complex + Mellin moment + hS4: complex + Harmonic sum :math:`S_{4}(N)` + is_singlet: bool, None + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = + 1`), False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + Sm4 : complex + Harmonic sum :math:`S_{-4}(N)` + + See Also + -------- + eko.anomalous_dimension.w4.S4 : :math:`S_4(N)` + + """ + if is_singlet is None: + return ( + 1 + / 2**3 + * ((1 - (-1) ** N) / 2 * S4((N - 1) / 2) + ((-1) ** N + 1) / 2 * S4(N / 2)) + - hS4 + ) + if is_singlet: + return 1 / 2**3 * S4(N / 2) - hS4 + return 1 / 2**3 * S4((N - 1) / 2) - hS4 + + +@nb.njit(cache=True) +def Sm31(N, S1, Sm1, Sm2, is_singlet=None): + r"""Analytic continuation of harmonic sum :math:`S_{-3,1}(N)`. + + As implemented in eq B.5.93 of :cite:`MuselliPhD` and eq 25 of + cite:`Bl_mlein_2000`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + Sm1: complex + Harmonic sum :math:`S_{-1}(N)` + Sm2: complex + Harmonic sum :math:`S_{-2}(N)` + is_singlet: bool, None + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = + 1`), False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + Sm31 : complex + Harmonic sum :math:`S_{-3,1}(N)` + + See Also + -------- + eko.harmonics.g_functions.mellin_g6 : :math:`g_6(N)` + + """ + eta = symmetry_factor(N, is_singlet) + return ( + eta * gf.mellin_g6(N, S1) + + zeta2 * Sm2 + - zeta3 * Sm1 + - 3 / 5 * zeta2**2 + + 2 * li4half + + 3 / 4 * zeta3 * log2 + - 1 / 2 * zeta2 * log2**2 + + 1 / 12 * log2**4 + ) + + +@nb.njit(cache=True) +def Sm22(N, S1, S2, Sm2, Sm31, is_singlet=None): + r"""Analytic continuation of harmonic sum :math:`S_{-2,2}(N)`. + + As implemented in eq B.5.94 of :cite:`MuselliPhD` and eq 24 of + cite:`Bl_mlein_2000`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + Sm2: complex + Harmonic sum :math:`S_{-2}(N)` + Sm31: complex + Harmonic sum :math:`S_{-3,1}(N)` + is_singlet: bool, None + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = + 1`), False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + Sm22 : complex + Harmonic sum :math:`S_{-2,2}(N)` + + See Also + -------- + eko.harmonics.g_functions.mellin_g5 : :math:`g_5(N)` + + """ + eta = symmetry_factor(N, is_singlet) + return ( + eta * gf.mellin_g5(N, S1, S2) - 2 * Sm31 + 2 * zeta2 * Sm2 + 3 / 40 * zeta2**2 + ) + + +@nb.njit(cache=True) +def Sm211(N, S1, S2, Sm1, is_singlet=None): + r"""Analytic continuation of harmonic sum :math:`S_{-2,1,1}(N)`. + + As implemented in eq B.5.104 of :cite:`MuselliPhD` and eq 27 of + cite:`Bl_mlein_2000`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + Sm1: complex + Harmonic sum :math:`S_{-1}(N)` + is_singlet: bool, None + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = + 1`), False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + Sm221 : complex + Harmonic sum :math:`S_{-2,1,1}(N)` + + See Also + -------- + eko.harmonics.g_functions.mellin_g8 : :math:`g_8(N)` + + """ + eta = symmetry_factor(N, is_singlet) + return ( + -eta * gf.mellin_g8(N, S1, S2) + + zeta3 * Sm1 + - li4half + + 1 / 8 * zeta2**2 + + 1 / 8 * zeta3 * log2 + + 1 / 4 * zeta2 * log2**2 + - 1 / 24 * log2**4 + ) + + +@nb.njit(cache=True) +def S211(N, S1, S2, S3): + r"""Analytic continuation of harmonic sum :math:`S_{2,1,1}(N)`. + + As implemented in eq B.5.115 of :cite:`MuselliPhD` and eq 40 of + cite:`Bl_mlein_2000`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + S3: complex + Harmonic sum :math:`S_{3}(N)` + + Returns + ------- + S211 : complex + Harmonic sum :math:`S_{2,1,1}(N)` + + See Also + -------- + eko.harmonics.g_functions.mellin_g21 : :math:`g_21(N)` + + """ + return -gf.mellin_g21(N, S1, S2, S3) + 6 / 5 * zeta2**2 + + +@nb.njit(cache=True) +def S31(N, S1, S2, S3, S4): + r"""Analytic continuation of harmonic sum :math:`S_{3,1}(N)`. + + As implemented in eq B.5.99 of :cite:`MuselliPhD` and eq 41 of + cite:`Bl_mlein_2000`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + S3: complex + Harmonic sum :math:`S_{3}(N)` + S4: complex + Harmonic sum :math:`S_{4}(N)` + + Returns + ------- + S31 : complex + Harmonic sum :math:`S_{3,1}(N)` + + See Also + -------- + eko.harmonics.g_functions.mellin_g22 : :math:`g_22(N)` + + """ + return ( + 1 / 2 * gf.mellin_g22(N, S1, S2, S3) + - 1 / 4 * S4 + - 1 / 4 * S2**2 + + zeta2 * S2 + - 3 / 20 * zeta2**2 + ) diff --git a/src/eko/harmonics/w5.py b/src/eko/harmonics/w5.py new file mode 100644 index 000000000..8084ae9af --- /dev/null +++ b/src/eko/harmonics/w5.py @@ -0,0 +1,453 @@ +# -*- coding: utf-8 -*- +"""Weight 5 harmonic sums.""" + +import numba as nb + +from . import f_functions as f +from .constants import log2, zeta2, zeta3, zeta4, zeta5 +from .polygamma import cern_polygamma, symmetry_factor + + +@nb.njit(cache=True) +def S5(N): + r"""Computes the harmonic sum :math:`S_5(N)`. + + .. math:: + S_5(N) = \sum\limits_{j=1}^N \frac 1 {j^5} = \frac 1 24 \psi_4(N+1)+\zeta(5) + + with :math:`\psi_4(N)` the 4th-polygamma function and :math:`\zeta` the + Riemann zeta function. + + Parameters + ---------- + N : complex + Mellin moment + + Returns + ------- + S_5 : complex + Harmonic sum :math:`S_5(N)` + + See Also + -------- + eko.harmonics.polygamma.cern_polygamma : :math:`\psi_k(N)` + + """ + return zeta5 + 1.0 / 24.0 * cern_polygamma(N + 1.0, 4) + + +@nb.njit(cache=True) +def Sm5(N, hS5, is_singlet=None): + r"""Analytic continuation of harmonic sum :math:`S_{-5}(N)`. + + .. math:: + S_{-5}(N) = \sum\limits_{j=1}^N \frac {(-1)^j} {j^5} + + Parameters + ---------- + N : complex + Mellin moment + hS5: complex + Harmonic sum :math:`S_{5}(N)` + is_singlet: bool, None + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = + 1`), False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + Sm5 : complex + Harmonic sum :math:`S_{-5}(N)` + + See Also + -------- + eko.harmonic.w5.S5 : :math:`S_5(N)` + + """ + if is_singlet is None: + return ( + 1 + / 2**4 + * ((1 - (-1) ** N) / 2 * S5((N - 1) / 2) + ((-1) ** N + 1) / 2 * S5(N / 2)) + - hS5 + ) + if is_singlet: + return 1 / 2**4 * S5(N / 2) - hS5 + return 1 / 2**4 * S5((N - 1) / 2) - hS5 + + +@nb.njit(cache=True) +def S41(N, S1, S2, S3): + r"""Analytic continuation of harmonic sum :math:`S_{4,1}(N)`. + + As implemented in eq 9.1 of :cite:`Blumlein:2009ta`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + S3: complex + Harmonic sum :math:`S_{3}(N)` + + Returns + ------- + S41 : complex + Harmonic sum :math:`S_{4,1}(N)` + + See Also + -------- + eko.harmonic.f_functions.F9 : + :math:`\mathcal{M}[(\text{Li}_4(x)/(x-1))_{+}](N)` + + """ + return -f.F9(N, S1) + S1 * zeta4 - S2 * zeta3 + S3 * zeta2 + + +@nb.njit(cache=True) +def S311(N, S1, S2): + r"""Analytic continuation of harmonic sum :math:`S_{3,1,1}(N)`. + + As implemented in eq 9.21 of :cite:`Blumlein:2009ta`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + + Returns + ------- + S311 : complex + Harmonic sum :math:`S_{3,1,1}(N)` + + See Also + -------- + eko.harmonic.f_functions.F11 : + :math:`\mathcal{M}[(\text{S}_{2,2}(x)/(x-1))_{+}](N)` + + """ + return f.F11(N, S1, S2) + zeta3 * S2 - zeta4 / 4 * S1 + + +@nb.njit(cache=True) +def S221(N, S1, S2, S21): + r"""Analytic continuation of harmonic sum :math:`S_{2,2,1}(N)`. + + As implemented in eq 9.23 of :cite:`Blumlein:2009ta`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + S21: complex + Harmonic sum :math:`S_{2,1}(N)` + + Returns + ------- + S221 : complex + Harmonic sum :math:`S_{2,2,1}(N)` + + See Also + -------- + eko.harmonic.f_functions.F11 : + :math:`\mathcal{M}[(\text{S}_{2,2}(x)/(x-1))_{+}](N)` + eko.harmonic.f_functions.F13 : + :math:`\mathcal{M}[(\text{Li}_{2}^2(x)/(x-1))_{+}](N)` + + """ + return ( + -2 * f.F11(N, S1, S2) + + 1 / 2 * f.F13(N, S1, S2) + + zeta2 * S21 + - 3 / 10 * zeta2**2 * S1 + ) + + +@nb.njit(cache=True) +def Sm221(N, S1, Sm1, S21, Sm21): + r"""Analytic continuation of harmonic sum :math:`S_{-2,2,1}(N)`. + + As implemented in eq 9.25 of :cite:`Blumlein:2009ta`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + Sm1: complex + Harmonic sum :math:`S_{-1}(N)` + S21: complex + Harmonic sum :math:`S_{2,1}(N)` + Sm21: complex + Harmonic sum :math:`S_{-2,1}(N)` + + Returns + ------- + Sm221 : complex + Harmonic sum :math:`S_{-2,2,1}(N)` + + See Also + -------- + eko.harmonic.f_functions.F14F12 : + :math:`\mathcal{M}[(2 \text{S}_{2,2}(x) - 1/2 \text{Li}_{2}^2(x))/(x+1)](N)` + + """ + return ( + (-1) ** (N + 1) * (f.F14F12(N, S1, S21)) + + zeta2 * Sm21 + - 3 / 10 * zeta2**2 * Sm1 + - 0.119102 + + 0.0251709 + ) + + +@nb.njit(cache=True) +def S21m2(N, S1, S2, Sm1, Sm2, Sm3, S21, Sm21, S2m1): + r"""Analytic continuation of harmonic sum :math:`S_{2,1,-2}(N)`. + + As implemented in eq 9.26 of :cite:`Blumlein:2009ta`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + Sm1: complex + Harmonic sum :math:`S_{-1}(N)` + Sm2: complex + Harmonic sum :math:`S_{-2}(N)` + Sm3: complex + Harmonic sum :math:`S_{-3}(N)` + S21: complex + Harmonic sum :math:`S_{2,1}(N)` + Sm21: complex + Harmonic sum :math:`S_{-2,1}(N)` + S2m1: complex + Harmonic sum :math:`S_{2,-1}(N)` + + Returns + ------- + S21m2 : complex + Harmonic sum :math:`S_{2,1,-2}(N)` + + See Also + -------- + eko.harmonic.f_functions.F14F12 : + :math:`\mathcal{M}[ + (\text{ln}(x) \text{S}_{1,2}(−x) − \text{Li}_2^2(−x)/2)/(x+1) + ](N)` + + """ + return ( + (-1) ** (N) * f.F16(N, S1, Sm1, Sm2, Sm3, Sm21) + - 1 / 2 * zeta2 * (S21 - S2m1) + - (1 / 8 * zeta3 - 1 / 2 * zeta2 * log2) * (S2 - Sm2) + + 1 / 8 * zeta2**2 * Sm1 + + 0.0854806 + ) + + +@nb.njit(cache=True) +def S2111(N, S1, S2, S3): + r"""Analytic continuation of harmonic sum :math:`S_{2,1,1,1}(N)`. + + As implemented in eq 9.33 of :cite:`Blumlein:2009ta`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + S3: complex + Harmonic sum :math:`S_{3}(N)` + + Returns + ------- + S2111 : complex + Harmonic sum :math:`S_{2,1,1,1}(N)` + + See Also + -------- + eko.harmonic.f_functions.F17 : + :math:`\mathcal{M}[(\text{S}_{1,3}(x)/(x-1))_{+}](N)` + + """ + return -f.F17(N, S1, S2, S3) + zeta4 * S1 + + +@nb.njit(cache=True) +def Sm2111(N, S1, S2, S3, Sm1): + r"""Analytic continuation of harmonic sum :math:`S_{-2,1,1,1}(N)`. + + As implemented in eq 9.34 of :cite:`Blumlein:2009ta`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + S3: complex + Harmonic sum :math:`S_{3}(N)` + Sm1: complex + Harmonic sum :math:`S_{-1}(N)` + + Returns + ------- + Sm2111 : complex + Harmonic sum :math:`S_{-2,1,1,1}(N)` + + See Also + -------- + eko.harmonic.f_functions.F18 : + :math:`\mathcal{M}[\text{S}_{1,3}(x)/(x+1)](N)` + + """ + return ( + (-1) ** (N + 1) * f.F18(N, S1, S2, S3) + + zeta4 * Sm1 + - 0.706186 + + 0.693147 * zeta4 + ) + + +@nb.njit(cache=True) +def S23(N, S1, S2, S3): + r"""Analytic continuation of harmonic sum :math:`S_{2,3}(N)`. + + As implemented in eq 9.3 of :cite:`Blumlein:2009ta`. + + Parameters + ---------- + N : complex + Mellin moment + S1: complex + Harmonic sum :math:`S_{1}(N)` + S2: complex + Harmonic sum :math:`S_{2}(N)` + S3: complex + Harmonic sum :math:`S_{3}(N)` + + Returns + ------- + S23 : complex + Harmonic sum :math:`S_{2,3}(N)` + + See Also + -------- + eko.harmonic.f_functions.F19 : + :math:`\mathcal{M}[ + (( + \text{ln}(x)[\text{S}_{1,2}(1-x) - \zeta_3] + +3 [\text{S}_{1,3}(1-x) - \zeta_4] + /(x-1))_{+}](N)` + + """ + return f.F19(N, S1, S2, S3) + 3 * zeta4 * S1 + + +@nb.njit(cache=True) +def Sm23(N, Sm1, Sm2, Sm3, is_singlet=None): + r"""Analytic continuation of harmonic sum :math:`S_{-2,3}(N)`. + + As implemented in eq 9.4 of :cite:`Blumlein:2009ta`. + + Parameters + ---------- + N : complex + Mellin moment + Sm1: complex + Harmonic sum :math:`S_{-1}(N)` + Sm2: complex + Harmonic sum :math:`S_{-2}(N)` + Sm3: complex + Harmonic sum :math:`S_{-3}(N)` + is_singlet: bool, None + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = + 1`), False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + Sm23 : complex + Harmonic sum :math:`S_{-2,3}(N)` + + See Also + -------- + eko.harmonic.f_functions.F19 : + :math:`\mathcal{M}[ + ( + \text{ln}(x)[\text{S}_{1,2}(1-x) - \zeta_3] + +3 [\text{S}_{1,3}(1-x) - \zeta_4] + /(x+1)](N)` + + """ + eta = symmetry_factor(N, is_singlet) + return ( + eta * f.F20(N, Sm1, Sm2, Sm3) + + 3 * zeta4 * Sm1 + + 21 / 32 * zeta5 + + 3 * zeta4 * log2 + - 3 / 4 * zeta2 * zeta3 + ) + + +@nb.njit(cache=True) +def S2m3(N, S2, Sm1, Sm2, Sm3): + r"""Analytic continuation of harmonic sum :math:`S_{2,-3}(N)`. + + As implemented in eq 9.5 of :cite:`Blumlein:2009ta`. + + Parameters + ---------- + N : complex + Mellin moment + S2: complex + Harmonic sum :math:`S_{2}(N)` + Sm1: complex + Harmonic sum :math:`S_{-1}(N)` + Sm2: complex + Harmonic sum :math:`S_{-2}(N)` + Sm3: complex + Harmonic sum :math:`S_{-3}(N)` + + Returns + ------- + S2m3 : complex + Harmonic sum :math:`S_{2,-3}(N)` + + See Also + -------- + eko.harmonic.f_functions.F19 : + :math:`\mathcal{M}[ + (( + 1/2 \text{ln}^2(x) \text{Li}_2(-x) + -2 \text{ln}(x) \text{Li}_3(-x) + +3 \text{Li}_4(-x) + )/(x-1)](N)` + + """ + return ( + (-1) ** (N + 1) * f.F21(N, Sm1, Sm2, Sm3) + + 3 / 4 * zeta3 * (Sm2 - S2) + - 21 / 8 * zeta4 * Sm1 + - 1.32056 + ) diff --git a/src/eko/interpolation.py b/src/eko/interpolation.py index bb0ade7b0..08d37f771 100644 --- a/src/eko/interpolation.py +++ b/src/eko/interpolation.py @@ -76,7 +76,7 @@ def __iter__(self): yield coef -@nb.njit("c16(c16,f8,f8[:,:])", cache=True) +@nb.njit(cache=True) def log_evaluate_Nx(N, logx, area_list): r""" Evaluates a single logarithmic Lagrange interpolator in N-space multiplied @@ -133,7 +133,7 @@ def log_evaluate_Nx(N, logx, area_list): return res -@nb.njit("c16(c16,f8,f8[:,:])", cache=True) +@nb.njit(cache=True) def evaluate_Nx(N, logx, area_list): r""" Evaluates a single linear Lagrange interpolator in N-space multiplied @@ -176,7 +176,7 @@ def evaluate_Nx(N, logx, area_list): return res -@nb.njit("c16(c16,b1,f8,f8[:,:])", cache=True) +@nb.njit(cache=True) def evaluate_grid(N, is_log, logx, area_list): """ Evaluate interpolator in N-space @@ -208,7 +208,7 @@ def evaluate_grid(N, is_log, logx, area_list): _atol_eps = 10 * np.finfo(float).eps -@nb.njit("f8(f8,f8[:,:])", cache=True) +@nb.njit(cache=True) def evaluate_x(x, area_list): """ Get a single linear Lagrange interpolator in x-space @@ -241,7 +241,7 @@ def evaluate_x(x, area_list): return res -@nb.njit("f8(f8,f8[:,:])", cache=True) +@nb.njit(cache=True) def log_evaluate_x(x, area_list): """ Get a single logarithmic Lagrange interpolator in x-space diff --git a/src/eko/kernels/evolution_integrals.py b/src/eko/kernels/evolution_integrals.py index 148990d4f..3c764d0c3 100644 --- a/src/eko/kernels/evolution_integrals.py +++ b/src/eko/kernels/evolution_integrals.py @@ -15,7 +15,7 @@ from .. import beta -@nb.njit("f8(f8,f8,u1)", cache=True) +@nb.njit(cache=True) def j00(a1, a0, nf): r""" LO-LO exact evolution integral. @@ -41,7 +41,7 @@ def j00(a1, a0, nf): return np.log(a1 / a0) / beta.beta(0, nf) -@nb.njit("f8(f8,f8,u1)", cache=True) +@nb.njit(cache=True) def j11_exact(a1, a0, nf): r""" NLO-NLO exact evolution integral. @@ -70,7 +70,7 @@ def j11_exact(a1, a0, nf): return (1.0 / beta_1) * np.log((1.0 + a1 * b1) / (1.0 + a0 * b1)) -@nb.njit("f8(f8,f8,u1)", cache=True) +@nb.njit(cache=True) def j11_expanded(a1, a0, nf): r""" NLO-NLO expanded evolution integral. @@ -95,7 +95,7 @@ def j11_expanded(a1, a0, nf): return 1.0 / beta.beta(0, nf) * (a1 - a0) -@nb.njit("f8(f8,f8,u1)", cache=True) +@nb.njit(cache=True) def j01_exact(a1, a0, nf): r""" LO-NLO exact evolution integral. @@ -122,7 +122,7 @@ def j01_exact(a1, a0, nf): return j00(a1, a0, nf) - beta.b(1, nf) * j11_exact(a1, a0, nf) -@nb.njit("f8(f8,f8,u1)", cache=True) +@nb.njit(cache=True) def j01_expanded(a1, a0, nf): r""" LO-NLO expanded evolution integral. @@ -147,7 +147,7 @@ def j01_expanded(a1, a0, nf): return j00(a1, a0, nf) - beta.b(1, nf) * j11_expanded(a1, a0, nf) -@nb.njit("f8(f8,f8,u1)", cache=True) +@nb.njit(cache=True) def j22_exact(a1, a0, nf): r""" NNLO-NNLO exact evolution integral. @@ -190,7 +190,7 @@ def j22_exact(a1, a0, nf): ) -@nb.njit("f8(f8,f8,u1)", cache=True) +@nb.njit(cache=True) def j12_exact(a1, a0, nf): r""" NLO-NNLO exact evolution integral. @@ -225,7 +225,7 @@ def j12_exact(a1, a0, nf): return 2.0 / (beta.beta(0, nf)) * np.real(delta / Delta) -@nb.njit("f8(f8,f8,u1)", cache=True) +@nb.njit(cache=True) def j02_exact(a1, a0, nf): r""" LO-NNLO exact evolution integral. @@ -256,7 +256,7 @@ def j02_exact(a1, a0, nf): ) -@nb.njit("f8(f8,f8,u1)", cache=True) +@nb.njit(cache=True) def j22_expanded(a1, a0, nf): r""" NNLO-NNLO expanded evolution integral. @@ -281,7 +281,7 @@ def j22_expanded(a1, a0, nf): return 1 / (2 * beta.beta(0, nf)) * (a1**2 - a0**2) -@nb.njit("f8(f8,f8,u1)", cache=True) +@nb.njit(cache=True) def j12_expanded(a1, a0, nf): r""" NLO-NNLO expanded evolution integral. @@ -308,7 +308,7 @@ def j12_expanded(a1, a0, nf): return 1 / beta.beta(0, nf) * (a1 - a0 - b1 / 2 * (a1**2 - a0**2)) -@nb.njit("f8(f8,f8,u1)", cache=True) +@nb.njit(cache=True) def j02_expanded(a1, a0, nf): r""" LO-NNLO expanded evolution integral. diff --git a/src/eko/kernels/non_singlet.py b/src/eko/kernels/non_singlet.py index 0229e75df..72ac438d2 100644 --- a/src/eko/kernels/non_singlet.py +++ b/src/eko/kernels/non_singlet.py @@ -11,7 +11,7 @@ from . import utils -@nb.njit("c16(c16[:],f8,f8,u1)", cache=True) +@nb.njit(cache=True) def lo_exact(gamma_ns, a1, a0, nf): """ |LO| non-singlet exact EKO @@ -35,7 +35,7 @@ def lo_exact(gamma_ns, a1, a0, nf): return np.exp(gamma_ns[0] * ei.j00(a1, a0, nf)) -@nb.njit("c16(c16[:],f8,f8,u1)", cache=True) +@nb.njit(cache=True) def nlo_exact(gamma_ns, a1, a0, nf): """ |NLO| non-singlet exact EKO @@ -61,7 +61,7 @@ def nlo_exact(gamma_ns, a1, a0, nf): ) -@nb.njit("c16(c16[:],f8,f8,u1)", cache=True) +@nb.njit(cache=True) def nlo_expanded(gamma_ns, a1, a0, nf): """ |NLO| non-singlet expanded EKO @@ -88,7 +88,7 @@ def nlo_expanded(gamma_ns, a1, a0, nf): ) -@nb.njit("c16(c16[:],f8,f8,u1,u4)", cache=True) +@nb.njit(cache=True) def nlo_truncated(gamma_ns, a1, a0, nf, ev_op_iterations): """ |NLO| non-singlet truncated EKO @@ -122,7 +122,7 @@ def nlo_truncated(gamma_ns, a1, a0, nf, ev_op_iterations): return e -@nb.njit("c16(c16[:],f8,f8,u1,u4)", cache=True) +@nb.njit(cache=True) def nlo_ordered_truncated(gamma_ns, a1, a0, nf, ev_op_iterations): """ |NLO| non-singlet ordered-truncated EKO @@ -161,7 +161,7 @@ def nlo_ordered_truncated(gamma_ns, a1, a0, nf, ev_op_iterations): return e -@nb.njit("c16(c16[:],f8,f8,u1)", cache=True) +@nb.njit(cache=True) def nnlo_exact(gamma_ns, a1, a0, nf): """ |NNLO| non-singlet exact EKO @@ -189,7 +189,7 @@ def nnlo_exact(gamma_ns, a1, a0, nf): ) -@nb.njit("c16(c16[:],f8,f8,u1)", cache=True) +@nb.njit(cache=True) def nnlo_expanded(gamma_ns, a1, a0, nf): """ |NNLO| non-singlet expanded EKO @@ -217,7 +217,7 @@ def nnlo_expanded(gamma_ns, a1, a0, nf): ) -@nb.njit("c16(c16[:],f8,f8,u1,u4)", cache=True) +@nb.njit(cache=True) def nnlo_truncated(gamma_ns, a1, a0, nf, ev_op_iterations): """ |NNLO| non-singlet truncated EKO @@ -263,7 +263,7 @@ def nnlo_truncated(gamma_ns, a1, a0, nf, ev_op_iterations): return e -@nb.njit("c16(c16[:],f8,f8,u1,u4)", cache=True) +@nb.njit(cache=True) def nnlo_ordered_truncated(gamma_ns, a1, a0, nf, ev_op_iterations): """ |NNLO| non-singlet ordered truncated EKO @@ -303,7 +303,7 @@ def nnlo_ordered_truncated(gamma_ns, a1, a0, nf, ev_op_iterations): return e -@nb.njit("c16(u1,string,c16[:],f8,f8,u1,u4)", cache=True) +@nb.njit(cache=True) def dispatcher( order, method, gamma_ns, a1, a0, nf, ev_op_iterations ): # pylint: disable=too-many-return-statements diff --git a/src/eko/kernels/singlet.py b/src/eko/kernels/singlet.py index 40ac12e0b..1a4b536ed 100644 --- a/src/eko/kernels/singlet.py +++ b/src/eko/kernels/singlet.py @@ -12,7 +12,7 @@ from . import utils -@nb.njit("c16[:,:](c16[:,:,:],f8,f8,u1)", cache=True) +@nb.njit(cache=True) def lo_exact(gamma_singlet, a1, a0, nf): """ Singlet leading order exact EKO @@ -36,7 +36,7 @@ def lo_exact(gamma_singlet, a1, a0, nf): return ad.exp_singlet(gamma_singlet[0] * ei.j00(a1, a0, nf))[0] -@nb.njit("c16[:,:](c16[:,:,:],f8,f8)", cache=True) +@nb.njit(cache=True) def nlo_decompose(gamma_singlet, j01, j11): """ Singlet next-to-leading order decompose EKO @@ -64,7 +64,7 @@ def nlo_decompose(gamma_singlet, j01, j11): return ad.exp_singlet(gamma_singlet[0] * j01 + gamma_singlet[1] * j11)[0] -@nb.njit("c16[:,:](c16[:,:,:],f8,f8,u1)", cache=True) +@nb.njit(cache=True) def nlo_decompose_exact(gamma_singlet, a1, a0, nf): """ Singlet next-to-leading order decompose-exact EKO @@ -90,7 +90,7 @@ def nlo_decompose_exact(gamma_singlet, a1, a0, nf): ) -@nb.njit("c16[:,:](c16[:,:,:],f8,f8,u1)", cache=True) +@nb.njit(cache=True) def nlo_decompose_expanded(gamma_singlet, a1, a0, nf): """ Singlet next-to-leading order decompose-expanded EKO @@ -116,7 +116,7 @@ def nlo_decompose_expanded(gamma_singlet, a1, a0, nf): ) -@nb.njit("c16[:,:](c16[:,:,:],c16,c16,c16)", cache=True) +@nb.njit(cache=True) def nnlo_decompose(gamma_singlet, j02, j12, j22): """ Singlet next-to-next-to-leading order decompose EKO @@ -147,7 +147,7 @@ def nnlo_decompose(gamma_singlet, j02, j12, j22): )[0] -@nb.njit("c16[:,:](c16[:,:,:],f8,f8,u1)", cache=True) +@nb.njit(cache=True) def nnlo_decompose_exact(gamma_singlet, a1, a0, nf): """ Singlet next-to-next-to-leading order decompose-exact EKO @@ -176,7 +176,7 @@ def nnlo_decompose_exact(gamma_singlet, a1, a0, nf): ) -@nb.njit("c16[:,:](c16[:,:,:],f8,f8,u1)", cache=True) +@nb.njit(cache=True) def nnlo_decompose_expanded(gamma_singlet, a1, a0, nf): """ Singlet next-to-next-to-leading order decompose-expanded EKO @@ -205,7 +205,7 @@ def nnlo_decompose_expanded(gamma_singlet, a1, a0, nf): ) -@nb.njit("c16[:,:](c16[:,:,:],f8,f8,u1, u1, u4)", cache=True) +@nb.njit(cache=True) def eko_iterate(gamma_singlet, a1, a0, nf, order, ev_op_iterations): """ Singlet NLO or NNLO iterated (exact) EKO @@ -262,7 +262,7 @@ def eko_iterate(gamma_singlet, a1, a0, nf, order, ev_op_iterations): return e -@nb.njit("c16[:,:,:](c16[:,:,:],u1,u1,u1,b1)", cache=True) +@nb.njit(cache=True) def r_vec(gamma_singlet, nf, ev_op_max_order, order, is_exact): r""" Compute singlet R vector for perturbative mode. @@ -310,7 +310,7 @@ def r_vec(gamma_singlet, nf, ev_op_max_order, order, is_exact): return r -@nb.njit("c16[:,:,:](c16[:,:,:],u1)", cache=True) +@nb.njit(cache=True) def u_vec(r, ev_op_max_order): r""" Compute the elements of the singlet U vector. @@ -351,7 +351,7 @@ def u_vec(r, ev_op_max_order): return u -@nb.njit("c16[:,:](c16[:,:,:],f8)", cache=True) +@nb.njit(cache=True) def sum_u(uvec, a): r""" Sums up the actual U operator. @@ -383,7 +383,7 @@ def sum_u(uvec, a): return res -@nb.njit("c16[:,:](c16[:,:,:],f8,f8,u1,u1,u4,u1,b1)", cache=True) +@nb.njit(cache=True) def eko_perturbative( gamma_singlet, a1, a0, nf, order, ev_op_iterations, ev_op_max_order, is_exact ): @@ -431,7 +431,7 @@ def eko_perturbative( return e -@nb.njit("c16[:,:](c16[:,:,:],f8,f8,u1,u1,u4)", cache=True) +@nb.njit(cache=True) def eko_truncated(gamma_singlet, a1, a0, nf, order, ev_op_iterations): """ Singlet NLO or NNLO truncated EKO @@ -480,7 +480,7 @@ def eko_truncated(gamma_singlet, a1, a0, nf, order, ev_op_iterations): return e -@nb.njit("c16[:,:](u1,string,c16[:,:,:],f8,f8,u1,u4,u1)", cache=True) +@nb.njit(cache=True) def dispatcher( # pylint: disable=too-many-return-statements order, method, gamma_singlet, a1, a0, nf, ev_op_iterations, ev_op_max_order ): diff --git a/src/eko/kernels/utils.py b/src/eko/kernels/utils.py index 474686aac..083c40edb 100644 --- a/src/eko/kernels/utils.py +++ b/src/eko/kernels/utils.py @@ -5,7 +5,7 @@ import numpy as np -@nb.njit("f8[:](f8,f8,u4)", cache=True) +@nb.njit(cache=True) def geomspace(start, end, num): """ Numba port of :func:`numpy.geomspace`. diff --git a/src/eko/matching_conditions/__init__.py b/src/eko/matching_conditions/__init__.py index 90324bb62..033f3a6f7 100644 --- a/src/eko/matching_conditions/__init__.py +++ b/src/eko/matching_conditions/__init__.py @@ -20,7 +20,7 @@ class MatchingCondition(member.OperatorBase): @classmethod def split_ad_to_evol_map( cls, - ome_members, + op_members, nf, q2_thr, intrinsic_range, @@ -30,7 +30,7 @@ def split_ad_to_evol_map( Parameters ---------- - ome_members : eko.operator_matrix_element.OperatorMatrixElement.ome_member + op_members : eko.operator_matrix_element.OperatorMatrixElement.op_members Attribute of :class:`~eko.operator_matrix_element.OperatorMatrixElement` containing the |OME| nf : int @@ -42,11 +42,11 @@ def split_ad_to_evol_map( """ m = { - "S.S": ome_members[(100, 100)], - "S.g": ome_members[(100, 21)], # This is always zero for the time being - "g.S": ome_members[(21, 100)], - "g.g": ome_members[(21, 21)], - "V.V": ome_members[(200, 200)], + "S.S": op_members[(100, 100)], + "S.g": op_members[(100, 21)], + "g.S": op_members[(21, 100)], + "g.g": op_members[(21, 21)], + "V.V": op_members[(200, 200)], } # add elements which are already active @@ -59,15 +59,15 @@ def split_ad_to_evol_map( hq = br.quark_names[nf] m.update( { - f"{hq}-.V": ome_members[(br.matching_hminus_pid, 200)], - f"{hq}+.S": ome_members[(br.matching_hplus_pid, 100)], - f"{hq}+.g": ome_members[(br.matching_hplus_pid, 21)], + # f"{hq}-.V": op_members[(br.matching_hminus_pid, 200)], + f"{hq}+.S": op_members[(br.matching_hplus_pid, 100)], + f"{hq}+.g": op_members[(br.matching_hplus_pid, 21)], } ) # intrinsic matching if len(intrinsic_range) != 0: - op_id = member.OpMember.id_like(ome_members[(200, 200)]) + op_id = member.OpMember.id_like(op_members[(200, 200)]) for intr_fl in intrinsic_range: ihq = br.quark_names[intr_fl - 1] # find name if intr_fl > nf + 1: @@ -78,15 +78,15 @@ def split_ad_to_evol_map( # match the missing contribution from h+ and h- m.update( { - f"{ihq}+.{ihq}+": ome_members[ + f"{ihq}+.{ihq}+": op_members[ (br.matching_hplus_pid, br.matching_hplus_pid) ], - # f"S.{ihq}+": ome_members[(100, br.matching_hplus_pid)], - f"g.{ihq}+": ome_members[(21, br.matching_hplus_pid)], - f"{ihq}-.{ihq}-": ome_members[ + f"S.{ihq}+": op_members[(100, br.matching_hplus_pid)], + f"g.{ihq}+": op_members[(21, br.matching_hplus_pid)], + f"{ihq}-.{ihq}-": op_members[ (br.matching_hminus_pid, br.matching_hminus_pid) ], - # f"V.{ihq}-": ome_members[(200, br.matching_hminus_pid)], + # f"V.{ihq}-": op_members[(200, br.matching_hminus_pid)], } ) return cls.promote_names(m, q2_thr) diff --git a/src/eko/matching_conditions/nlo.py b/src/eko/matching_conditions/as1.py similarity index 73% rename from src/eko/matching_conditions/nlo.py rename to src/eko/matching_conditions/as1.py index 374cf44cd..cbd9a0baf 100644 --- a/src/eko/matching_conditions/nlo.py +++ b/src/eko/matching_conditions/as1.py @@ -13,8 +13,8 @@ from ..constants import CF -@nb.njit("c16(c16,c16[:],f8)", cache=True) -def A_hh_1(n, sx, L): +@nb.njit(cache=True) +def A_hh(n, sx, L): r""" |NLO| heavy-heavy |OME| :math:`A_{HH}^{(1)}` defined as the mellin transform of :math:`K_{hh}` given in Eq. (20a) of :cite:`Ball_2016`. @@ -23,18 +23,18 @@ def A_hh_1(n, sx, L): ---------- n : complex Mellin moment - sx : numpy.ndarray - List of harmonic sums + sx : list + harmonic sums cache L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- - A_hh_1 : complex + A_hh : complex |NLO| heavy-heavy |OME| :math:`A_{HH}^{(1)}` """ - S1m = sx[0] - 1 / n # harmonics.harmonic_S1(n - 1) - S2m = sx[1] - 1 / n**2 # harmonics.harmonic_S2(n - 1) + S1m = sx[0][0] - 1 / n # harmonics.S1(n - 1) + S2m = sx[1][0] - 1 / n**2 # harmonics.S2(n - 1) ahh_l = (2 + n - 3 * n**2) / (n * (1 + n)) + 4 * S1m ahh = 2 * ( 2 @@ -47,8 +47,8 @@ def A_hh_1(n, sx, L): return -CF * (ahh_l * L + ahh) -@nb.njit("c16(c16,f8)", cache=True) -def A_gh_1(n, L): +@nb.njit(cache=True) +def A_gh(n, L): r""" |NLO| gluon-heavy |OME| :math:`A_{gH}^{(1)}` defined as the mellin transform of :math:`K_{gh}` given in Eq. (20b) of :cite:`Ball_2016`. @@ -62,7 +62,7 @@ def A_gh_1(n, L): Returns ------- - A_hg_1 : complex + A_hg : complex |NLO| gluon-heavy |OME| :math:`A_{gH}^{(1)}` """ @@ -73,8 +73,8 @@ def A_gh_1(n, L): return 2 * CF * (agh_l0 + agh_l1 * L) -@nb.njit("c16(c16,f8)", cache=True) -def A_hg_1(n, L): +@nb.njit(cache=True) +def A_hg(n, L): r""" |NLO| heavy-gluon |OME| :math:`A_{Hg}^{S,(1)}` defined as the mellin transform of Eq. (B.2) from :cite:`Buza_1998`. @@ -88,7 +88,7 @@ def A_hg_1(n, L): Returns ------- - A_hg_1 : complex + A_hg : complex |NLO| heavy-gluon |OME| :math:`A_{Hg}^{S,(1)}` """ den = 1.0 / (n * (n + 1) * (2 + n)) @@ -96,8 +96,8 @@ def A_hg_1(n, L): return num * den * L -@nb.njit("c16(f8)", cache=True) -def A_gg_1(L): +@nb.njit(cache=True) +def A_gg(L): r""" |NLO| gluon-gluon |OME| :math:`A_{gg,H}^{S,(1)}` defined as the mellin transform of Eq. (B.6) from :cite:`Buza_1998`. @@ -109,14 +109,14 @@ def A_gg_1(L): Returns ------- - A_gg_1 : complex + A_gg : complex |NLO| gluon-gluon |OME| :math:`A_{gg,H}^{S,(1)}` """ return -2.0 / 3.0 * L -@nb.njit("c16[:,:](c16,c16[:],f8)", cache=True) -def A_singlet_1(n, sx, L): +@nb.njit(cache=True) +def A_singlet(n, sx, L): r""" Computes the |NLO| singlet |OME|. @@ -131,33 +131,36 @@ def A_singlet_1(n, sx, L): ---------- n : complex Mellin moment + sx : list + harmonic sums cache containing: [[:math:`S_1`][:math:`S_2`]] L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- - A_S_1 : numpy.ndarray + A_S : numpy.ndarray |NLO| singlet |OME| :math:`A^{S,(1)}` See Also -------- - A_hg_1 : :math:`A_{hg}^{S,(1)}` - A_hh_1 : :math:`A_{HH}^{(1)}` - A_gg_1 : :math:`A_{gg,H}^{S,(1)}` - A_gh_1 : :math:`A_{gH}^{(1)}` + A_hg : :math:`A_{hg}^{S,(1)}` + A_hh : :math:`A_{HH}^{(1)}` + A_gg : :math:`A_{gg,H}^{S,(1)}` + A_gh : :math:`A_{gH}^{(1)}` """ - A_hg = A_hg_1(n, L) - A_gg = A_gg_1(L) - A_gh = A_gh_1(n, L) - A_hh = A_hh_1(n, sx, L) - A_S_1 = np.array( - [[A_gg, 0.0, A_gh], [0 + 0j, 0 + 0j, 0 + 0j], [A_hg, 0.0, A_hh]], np.complex_ + A_S = np.array( + [ + [A_gg(L), 0.0, A_gh(n, L)], + [0 + 0j, 0 + 0j, 0 + 0j], + [A_hg(n, L), 0.0, A_hh(n, sx, L)], + ], + np.complex_, ) - return A_S_1 + return A_S -@nb.njit("c16[:,:](c16,c16[:],f8)", cache=True) -def A_ns_1(n, sx, L): +@nb.njit(cache=True) +def A_ns(n, sx, L): r""" Computes the |NLO| non-singlet |OME| with intrinsic contributions. @@ -171,17 +174,17 @@ def A_ns_1(n, sx, L): ---------- n : complex Mellin moment - sx : numpy.ndarray - List of harmonic sums + sx : list + harmonic sums cache containing: [[:math:`S_1`][:math:`S_2`]] L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- - A_NS_1 : numpy.ndarray + A_NS : numpy.ndarray |NLO| non-singlet |OME| :math:`A^{S,(1)}` See Also -------- - A_hh_1 : :math:`A_{HH}^{(1)}` + A_hh : :math:`A_{HH}^{(1)}` """ - return np.array([[0 + 0j, 0 + 0j], [0 + 0j, A_hh_1(n, sx, L)]], np.complex_) + return np.array([[0 + 0j, 0 + 0j], [0 + 0j, A_hh(n, sx, L)]], np.complex_) diff --git a/src/eko/matching_conditions/nnlo.py b/src/eko/matching_conditions/as2.py similarity index 71% rename from src/eko/matching_conditions/nnlo.py rename to src/eko/matching_conditions/as2.py index e7923c377..a6e18953d 100644 --- a/src/eko/matching_conditions/nnlo.py +++ b/src/eko/matching_conditions/as2.py @@ -7,22 +7,19 @@ (https://github.com/N3PDF/external/blob/master/qcdnum/qcdnum/pij/ome.f) and Mellin transformed with Mathematica. -The expession for A_Hg_2_l0 comes form :cite:`Bierenbaum_2009` +The expession for A_Hg_l0 comes form :cite:`Bierenbaum:2009zt` """ import numba as nb import numpy as np from .. import constants -from ..anomalous_dimensions import harmonics -from .nlo import A_gg_1, A_hg_1 +from ..harmonics.constants import zeta2, zeta3 +from .as1 import A_gg as A_gg_1 +from .as1 import A_hg as A_hg_1 -# Global variables -zeta2 = harmonics.zeta2 -zeta3 = harmonics.zeta3 - -@nb.njit("c16(c16,c16[:],f8)", cache=True) -def A_qq_2_ns(n, sx, L): +@nb.njit(cache=True) +def A_qq_ns(n, sx, L): r""" |NNLO| light-light non-singlet |OME| :math:`A_{qq,H}^{NS,(2)}` given in Eq. (B.4) of :cite:`Buza_1998`. @@ -31,23 +28,23 @@ def A_qq_2_ns(n, sx, L): ---------- n : complex Mellin moment - sx : numpy.ndarray - List of harmonic sums + sx : list + harmonic sums cache L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- - A_qq_2_ns : complex + A_qq_ns : complex |NNLO| light-light non-singlet |OME| :math:`A_{qq,H}^{NS,(2)}` """ - S1 = sx[0] - S2 = sx[1] - S3 = sx[2] + S1 = sx[0][0] + S2 = sx[1][0] + S3 = sx[2][0] S1m = S1 - 1 / n # harmonic_S1(n - 1) S2m = S2 - 1 / n**2 # harmonic_S2(n - 1) - a_qq_2_l0 = ( + a_qq_l0 = ( -224.0 / 27.0 * (S1 - 1.0 / n) - 8.0 / 3.0 * zeta3 + 40 / 9.0 * zeta2 @@ -64,7 +61,7 @@ def A_qq_2_ns(n, sx, L): ) ) - a_qq_2_l1 = ( + a_qq_l1 = ( 2 * (-12 - 28 * n + 9 * n**2 + 34 * n**3 - 3 * n**4) / (9 * (n * (n + 1)) ** 2) @@ -72,14 +69,12 @@ def A_qq_2_ns(n, sx, L): - 16 / 3 * S2m ) - a_qq_2_l2 = -2 * ((2 + n - 3 * n**2) / (3 * n * (n + 1)) + 4 / 3 * S1m) - return ( - constants.CF * constants.TR * (a_qq_2_l2 * L**2 + a_qq_2_l1 * L + a_qq_2_l0) - ) + a_qq_l2 = -2 * ((2 + n - 3 * n**2) / (3 * n * (n + 1)) + 4 / 3 * S1m) + return constants.CF * constants.TR * (a_qq_l2 * L**2 + a_qq_l1 * L + a_qq_l0) -@nb.njit("c16(c16,c16[:],f8)", cache=True) -def A_hq_2_ps(n, sx, L): +@nb.njit(cache=True) +def A_hq_ps(n, sx, L): r""" |NNLO| heavy-light pure-singlet |OME| :math:`A_{Hq}^{PS,(2)}` given in Eq. (B.1) of :cite:`Buza_1998`. @@ -88,23 +83,23 @@ def A_hq_2_ps(n, sx, L): ---------- n : complex Mellin moment - sx : numpy.ndarray - List of harmonic sums + sx : list + harmonic sums cache L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- - A_hq_2_ps : complex + A_hq_ps : complex |NNLO| heavy-light pure-singlet |OME| :math:`A_{Hq}^{PS,(2)}` """ - S2 = sx[1] + S2 = sx[1][0] F1M = 1.0 / (n - 1.0) * (zeta2 - (S2 - 1.0 / n**2)) F11 = 1.0 / (n + 1.0) * (zeta2 - (S2 + 1.0 / (n + 1.0) ** 2)) F12 = 1.0 / (n + 2.0) * (zeta2 - (S2 + 1.0 / (n + 1.0) ** 2 + 1.0 / (n + 2.0) ** 2)) F21 = -F11 / (n + 1.0) - a_hq_2_l0 = ( + a_hq_l0 = ( -( 32.0 / 3.0 / (n - 1.0) + 8.0 * (1.0 / n - 1.0 / (n + 1.0)) @@ -129,59 +124,49 @@ def A_hq_2_ps(n, sx, L): + 16.0 * (-(zeta2 - S2) / n**2 + F21) ) - a_hq_2_l1 = ( + a_hq_l1 = ( 8 * (2 + n * (5 + n)) * (4 + n * (4 + n * (7 + 5 * n))) / ((n - 1) * (n + 2) ** 2 * (n * (n + 1)) ** 3) ) - a_hq_2_l2 = -4 * (2 + n + n**2) ** 2 / ((n - 1) * (n + 2) * (n * (n + 1)) ** 2) + a_hq_l2 = -4 * (2 + n + n**2) ** 2 / ((n - 1) * (n + 2) * (n * (n + 1)) ** 2) - return ( - constants.CF * constants.TR * (a_hq_2_l2 * L**2 + a_hq_2_l1 * L + a_hq_2_l0) - ) + return constants.CF * constants.TR * (a_hq_l2 * L**2 + a_hq_l1 * L + a_hq_l0) -@nb.njit("c16(c16,c16[:],f8)", cache=True) -def A_hg_2(n, sx, L): +@nb.njit(cache=True) +def A_hg(n, sx, L): r""" |NNLO| heavy-gluon |OME| :math:`A_{Hg}^{S,(2)}` given in Eq. (B.3) of :cite:`Buza_1998`. - The expession for A_Hg_2_l0 comes form :cite:`Bierenbaum_2009`. + The expession for A_Hg_l0 comes form :cite:`Bierenbaum:2009zt`. Parameters ---------- n : complex Mellin moment - sx : numpy.ndarray - List of harmonic sums + sx : list + harmonic sums cache L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- - A_hg_2 : complex + A_hg : complex |NNLO| heavy-gluon |OME| :math:`A_{Hg}^{S,(2)}` """ - S1 = sx[0] - S2 = sx[1] - S3 = sx[2] + S1 = sx[0][0] + S2, Sm2 = sx[1] + if len(sx[2]) == 3: + S3, Sm21, Sm3 = sx[2] + else: + S3, _, _, Sm21, _, Sm3 = sx[2] S1m = S1 - 1 / n S2m = S2 - 1 / n**2 - Sp2m = harmonics.harmonic_S2((n - 1) / 2) - Sp2p = harmonics.harmonic_S2(n / 2) - Sm1 = -S1 + harmonics.harmonic_S1(n / 2) - Sm2 = -S2 + 1 / 2 * Sp2p - Sm3 = -S3 + 1 / 4 * harmonics.harmonic_S3(n / 2) - Sm21 = ( - -5 / 8 * harmonics.zeta3 - + harmonics.zeta2 * (Sm1 - 1 / n + np.log(2)) - + S1 / n**2 - + harmonics.mellin_g3(n) - ) - a_hg_2_l0 = ( + a_hg_l0 = ( -( 3084 + 192 / n**4 @@ -245,7 +230,7 @@ def A_hg_2(n, sx, L): ) ) - a_hg_2_l1 = ( + a_hg_l1 = ( 2 * ( +640 @@ -262,7 +247,7 @@ def A_hg_2(n, sx, L): / (3 * (n * (n + 1) * (n + 2)) ** 3 * (n - 1)) ) - a_hg_2_l1 -= ( + a_hg_l1 -= ( 2 * ( n @@ -274,25 +259,25 @@ def A_hg_2(n, sx, L): * (n + 1) * (n + 2) * (2 + n + n**2) - * (10 * S1m**2 - 9 * Sp2m + 26 * S2m + 9 * Sp2p) + * (10 * S1m**2 + 18 * (2 * Sm2 + zeta2) + 26 * S2m) ) ) / (3 * (n * (n + 1) * (n + 2)) ** 3 * (n - 1)) ) - a_hg_2_l1 += 12 * zeta2 * (-2 + n + n**3) / (n * (n**2 - 1) * (n + 2)) + a_hg_l1 += 12 * zeta2 * (-2 + n + n**3) / (n * (n**2 - 1) * (n + 2)) - a_hg_2_l2 = ( + a_hg_l2 = ( 4 * (2 + n + n**2) * (2 * (-11 + n + n**2) * (1 + n + n**2) / (n - 1)) / (3 * (n * (n + 1) * (n + 2)) ** 2) ) + 20 * (2 + n + n**2) * S1 / (3 * n * (n + 1) * (n + 2)) - return a_hg_2_l2 * L**2 + a_hg_2_l1 * L + a_hg_2_l0 + return a_hg_l2 * L**2 + a_hg_l1 * L + a_hg_l0 -@nb.njit("c16(c16,c16[:],f8)", cache=True) -def A_gq_2(n, sx, L): +@nb.njit(cache=True) +def A_gq(n, sx, L): r""" |NNLO| gluon-quark |OME| :math:`A_{gq,H}^{S,(2)}` given in Eq. (B.5) of :cite:`Buza_1998`. @@ -301,24 +286,24 @@ def A_gq_2(n, sx, L): ---------- n : complex Mellin moment - sx : numpy.ndarray - List of harmonic sums + sx : list + harmonic sums cache L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- - A_gq_2 : complex + A_gq : complex |NNLO| gluon-quark |OME| :math:`A_{gq,H}^{S,(2)}` """ - S1 = sx[0] - S2 = sx[1] + S1 = sx[0][0] + S2 = sx[1][0] S1m = S1 - 1 / n # harmonic_S1(n - 1) B2M = ((S1 - 1.0 / n) ** 2 + S2 - 1.0 / n**2) / (n - 1.0) B21 = ((S1 + 1.0 / (n + 1.0)) ** 2 + S2 + 1.0 / (n + 1.0) ** 2) / (n + 1.0) - a_gq_2_l0 = ( + a_gq_l0 = ( 4.0 / 3.0 * (2.0 * B2M - 2.0 * (S1**2 + S2) / n + B21) + 8.0 / 9.0 @@ -330,21 +315,19 @@ def A_gq_2(n, sx, L): + 1.0 / 27.0 * (448.0 * (1.0 / (n - 1.0) - 1.0 / n) + 344.0 / (n + 1.0)) ) - a_gq_2_l1 = -( + a_gq_l1 = -( -96 + 16 * n * (7 + n * (21 + 10 * n + 8 * n**2)) - 48 * n * (1 + n) * (2 + n + n**2) * S1m ) / (9 * (n - 1) * (n * (1 + n)) ** 2) - a_gq_2_l2 = 8 * (2 + n + n**2) / (3 * n * (n**2 - 1)) + a_gq_l2 = 8 * (2 + n + n**2) / (3 * n * (n**2 - 1)) - return ( - constants.CF * constants.TR * (a_gq_2_l2 * L**2 + a_gq_2_l1 * L + a_gq_2_l0) - ) + return constants.CF * constants.TR * (a_gq_l2 * L**2 + a_gq_l1 * L + a_gq_l0) -@nb.njit("c16(c16,c16[:],f8)", cache=True) -def A_gg_2(n, sx, L): +@nb.njit(cache=True) +def A_gg(n, sx, L): r""" |NNLO| gluon-gluon |OME| :math:`A_{gg,H}^{S,(2)} ` given in Eq. (B.7) of :cite:`Buza_1998`. @@ -353,17 +336,17 @@ def A_gg_2(n, sx, L): ---------- n : complex Mellin moment - sx : numpy.ndarray - List of harmonic sums + sx : list + harmonic sums cache L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- - A_gg_2 : complex + A_gg : complex |NNLO| gluon-gluon |OME| :math:`A_{gg,H}^{S,(2)}` """ - S1 = sx[0] + S1 = sx[0][0] S1m = S1 - 1 / n # harmonic_S1(n - 1) D1 = -1.0 / n**2 @@ -371,7 +354,7 @@ def A_gg_2(n, sx, L): D2 = 2.0 / n**3 D21 = 2.0 / (n + 1.0) ** 3 - a_gg_2f = ( + a_gg_f = ( -15.0 - 8.0 / (n - 1.0) + 80.0 / n @@ -383,7 +366,7 @@ def A_gg_2(n, sx, L): + 32.0 * D1 + 48.0 * D11 ) - a_gg_2a = ( + a_gg_a = ( -224.0 / 27.0 * (S1 - 1.0 / n) + 10.0 / 9.0 + 4.0 / 3.0 * (S1 + 1.0 / (n + 1.0)) / (n + 1.0) @@ -394,9 +377,9 @@ def A_gg_2(n, sx, L): + 1.0 / 9.0 * (52.0 * D1 + 88.0 * D11) ) - a_gg_2_l0 = constants.TR * (constants.CF * a_gg_2f + constants.CA * a_gg_2a) + a_gg_l0 = constants.TR * (constants.CF * a_gg_f + constants.CA * a_gg_a) - a_gg_2_l1 = ( + a_gg_l1 = ( 8 / 3 * ( @@ -416,7 +399,7 @@ def A_gg_2(n, sx, L): ) ) - a_gg_2_l2 = ( + a_gg_l2 = ( 4 / 9 * ( @@ -427,17 +410,17 @@ def A_gg_2(n, sx, L): - 4 * S1m ) - return a_gg_2_l2 * L**2 + a_gg_2_l1 * L + a_gg_2_l0 + return a_gg_l2 * L**2 + a_gg_l1 * L + a_gg_l0 -@nb.njit("c16[:,:](c16,c16[:],f8,b1)", cache=True) -def A_singlet_2(n, sx, L, is_msbar=False): +@nb.njit(cache=True) +def A_singlet(n, sx, L, is_msbar=False): r""" Computes the |NNLO| singlet |OME|. .. math:: A^{S,(2)} = \left(\begin{array}{cc} - A_{gg, H}^{S,(2)} & A_{gq, H}^{S,(2)} & 0 + A_{gg, H}^{S,(2)} & A_{gq, H}^{S,(2)} & 0 \\ 0 & A_{qq,H}^{NS,(2)} & 0\\ A_{hg}^{S,(2)} & A_{hq}^{PS,(2)} & 0\\ \end{array}\right) @@ -446,8 +429,9 @@ def A_singlet_2(n, sx, L, is_msbar=False): ---------- n : complex Mellin moment - sx : numpy.ndarray - List of harmonic sums + sx : list + harmonic sums cache containing: + [[:math:`S_1,S_{-1}`],[:math:`S_2,S_{-2}`],[:math:`S_3,S_{-2,1},S_{-3}`]] L : float :math:`\ln(\mu_F^2 / m_h^2)` is_msbar: bool @@ -455,59 +439,59 @@ def A_singlet_2(n, sx, L, is_msbar=False): Returns ------- - A_S_2 : numpy.ndarray + A_S : numpy.ndarray |NNLO| singlet |OME| :math:`A^{S,(2)}(N)` See Also -------- - A_ns_2 : :math:`A_{qq,H}^{NS,(2)}` - A_hq_2 : :math:`A_{hq}^{PS,(2)}` - A_hg_2 : :math:`A_{hg}^{S,(2)}` - A_gq_2 : :math:`A_{gq, H}^{S,(2)}` - A_gg_2 : :math:`A_{gg, H}^{S,(2)}` + A_ns : :math:`A_{qq,H}^{NS,(2)}` + A_hq : :math:`A_{hq}^{PS,(2)}` + A_hg : :math:`A_{hg}^{S,(2)}` + A_gq : :math:`A_{gq, H}^{S,(2)}` + A_gg : :math:`A_{gg, H}^{S,(2)}` """ - A_hq = A_hq_2_ps(n, sx, L) - A_qq = A_qq_2_ns(n, sx, L) - A_hg = A_hg_2(n, sx, L) - A_gq = A_gq_2(n, sx, L) - A_gg = A_gg_2(n, sx, L) + A_hq_2 = A_hq_ps(n, sx, L) + A_qq_2 = A_qq_ns(n, sx, L) + A_hg_2 = A_hg(n, sx, L) + A_gq_2 = A_gq(n, sx, L) + A_gg_2 = A_gg(n, sx, L) if is_msbar: - A_hg -= 2.0 * 4.0 * constants.CF * A_hg_1(n, L=1.0) - A_gg -= 2.0 * 4.0 * constants.CF * A_gg_1(L=1.0) - A_S_2 = np.array( - [[A_gg, A_gq, 0.0], [0.0, A_qq, 0.0], [A_hg, A_hq, 0.0]], np.complex_ + A_hg_2 -= 2.0 * 4.0 * constants.CF * A_hg_1(n, L=1.0) + A_gg_2 -= 2.0 * 4.0 * constants.CF * A_gg_1(L=1.0) + A_S = np.array( + [[A_gg_2, A_gq_2, 0.0], [0.0, A_qq_2, 0.0], [A_hg_2, A_hq_2, 0.0]], np.complex_ ) - return A_S_2 + return A_S -@nb.njit("c16[:,:](c16,c16[:],f8)", cache=True) -def A_ns_2(n, sx, L): +@nb.njit(cache=True) +def A_ns(n, sx, L): r""" Computes the |NNLO| non-singlet |OME|. .. math:: A^{NS,(2)} = \left(\begin{array}{cc} - A_{qq,H}^{NS,(2)} & 0\\ - 0 & 0\\ + A_{qq,H}^{NS,(2)} & 0 \\ + 0 & 0 \\ \end{array}\right) Parameters ---------- n : complex Mellin moment - sx : numpy.ndarray - List of harmonic sums + sx : list + harmonic sums cache containing: + [[:math:`S_1,S_{-1}`],[:math:`S_2,S_{-2}`],[:math:`S_3,S_{-2,1},S_{-3}`]] L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- - A_NS_2 : numpy.ndarray + A_NS : numpy.ndarray |NNLO| non-singlet |OME| :math:`A^{NS,(2)}` See Also -------- - A_qq_2_ns : :math:`A_{qq,H}^{NS,(2)}` + A_qq_ns : :math:`A_{qq,H}^{NS,(2)}` """ - A_qq = A_qq_2_ns(n, sx, L) - return np.array([[A_qq, 0.0], [0 + 0j, 0 + 0j]], np.complex_) + return np.array([[A_qq_ns(n, sx, L), 0.0], [0 + 0j, 0 + 0j]], np.complex_) diff --git a/src/eko/matching_conditions/as3/__init__.py b/src/eko/matching_conditions/as3/__init__.py new file mode 100644 index 000000000..93a96fc4c --- /dev/null +++ b/src/eko/matching_conditions/as3/__init__.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +r"""This module defines the matching conditions for the N3LO |VFNS| evolution. + +The expressions are based on: + + - :cite:`Bierenbaum:2009mv`. Isabella Bierenbaum, Johannes Blümlein, and + Sebastian Klein. Mellin Moments of the O(alpha**3(s)) Heavy Flavor + Contributions to unpolarized Deep-Inelastic Scattering at Q**2 \ensuremath + >\ensuremath > m**2 and Anomalous Dimensions. Nucl. Phys. B, 820:417-482, + 2009. arXiv:0904.3563, doi:10.1016/j.nuclphysb.2009.06.005. + - :cite:`Bl_mlein_2000`. Johannes Blümlein. Analytic continuation of mellin + transforms up to two-loop order. Computer Physics Communications, + 133(1):76-104, Dec 2000. URL: + http://dx.doi.org/10.1016/S0010-4655(00)00156-9, + doi:10.1016/s0010-4655(00)00156-9. + - :cite:`Bierenbaum:2009zt`. Isabella Bierenbaum, Johannes Blümlein, and + Sebastian Klein. The Gluonic Operator Matrix Elements at O(alpha(s)**2) for + DIS Heavy Flavor Production. Phys. Lett. B, 672:401-406, 2009. + arXiv:0901.0669, doi:10.1016/j.physletb.2009.01.057. + - :cite:`Ablinger:2010ty`. J. Ablinger, J. Blümlein, S. Klein, C. Schneider, + and F. Wissbrock. The $O(\alpha _s^3)$ Massive Operator Matrix Elements of + $O(n_f)$ for the Structure Function $F_2(x,Q^2)$ and Transversity. Nucl. + Phys. B, 844:26-54, 2011. arXiv:1008.3347, + doi:10.1016/j.nuclphysb.2010.10.021. + - :cite:`Ablinger:2014vwa`. J. Ablinger, A. Behring, J. Blümlein, A. De + Freitas, A. Hasselhuhn, A. von Manteuffel, M. Round, C. Schneider, and F. + Wißbrock. The 3-Loop Non-Singlet Heavy Flavor Contributions and Anomalous + Dimensions for the Structure Function $F_2(x,Q^2)$ and Transversity. Nucl. + Phys. B, 886:733-823, 2014. arXiv:1406.4654, + doi:10.1016/j.nuclphysb.2014.07.010. + - :cite:`Ablinger:2014uka`. J. Ablinger, J. Blümlein, A. De Freitas, A. + Hasselhuhn, A. von Manteuffel, M. Round, and C. Schneider. The $O(\alpha + _s^3 T_F^2)$ Contributions to the Gluonic Operator Matrix Element. Nucl. + Phys. B, 885:280-317, 2014. arXiv:1405.4259, + doi:10.1016/j.nuclphysb.2014.05.028. + - :cite:`Behring:2014eya`. A. Behring, I. Bierenbaum, J. Blümlein, A. De + Freitas, S. Klein, and F. Wißbrock. The logarithmic contributions to the + $O(\alpha ^3_s)$ asymptotic massive Wilson coefficients and operator matrix + elements in deeply inelastic scattering. Eur. Phys. J. C, 74(9):3033, 2014. + arXiv:1403.6356, doi:10.1140/epjc/s10052-014-3033-x. + - :cite:`Blumlein:2017wxd`. Johannes Blümlein, Jakob Ablinger, Arnd Behring, + Abilio De Freitas, Andreas von Manteuffel, Carsten Schneider, and C. + Schneider. Heavy Flavor Wilson Coefficients in Deep-Inelastic Scattering: + Recent Results. PoS, QCDEV2017:031, 2017. arXiv:1711.07957, + doi:10.22323/1.308.0031. + - :cite:`Ablinger_2014`. J. Ablinger, J. Blümlein, A. De Freitas, A. + Hasselhuhn, A. von Manteuffel, M. Round, C. Schneider, and F. Wißbrock. The + transition matrix element a_gq(n) of the variable flavor number scheme at + o(α_s^3). Nuclear Physics B, 882:263-288, May 2014. URL: + http://dx.doi.org/10.1016/j.nuclphysb.2014.02.007, + doi:10.1016/j.nuclphysb.2014.02.007. + - :cite:`Ablinger_2015`. J. Ablinger, A. Behring, J. Blümlein, A. De + Freitas, A. von Manteuffel, and C. Schneider. The 3-loop pure singlet heavy + flavor contributions to the structure function f2(x,q2) and the anomalous + dimension. Nuclear Physics B, 890:48-151, Jan 2015. URL: + http://dx.doi.org/10.1016/j.nuclphysb.2014.10.008, + doi:10.1016/j.nuclphysb.2014.10.008. +""" + +import numba as nb +import numpy as np + +from .agg import A_gg +from .agq import A_gq +from .aHg import A_Hg +from .aHq import A_Hq +from .aqg import A_qg +from .aqqNS import A_qqNS +from .aqqPS import A_qqPS + + +@nb.njit(cache=True) +def A_singlet(n, sx_singlet, sx_non_singlet, nf, L): + r"""Computes the |N3LO| singlet |OME|. + + .. math:: + A^{S,(3)} = \left(\begin{array}{cc} + A_{gg, H}^{S,(3)} & A_{gq, H}^{S,(3)} & 0 \\ + A_{qg, H}^{S,(3)} & A_{qq,H}^{NS,(3)} + A_{qq,H}^{PS,(3)} & 0\\ + A_{hg}^{S,(3)} & A_{hq}^{PS,(3)} & 0\\ + \end{array}\right) + + When using the code, please cite the complete list of references + available at the top of this module :mod:`eko.matching_conditions.as3`. + + Parameters + ---------- + n : complex + Mellin moment + sx_singlet : list + singlet like harmonic sums cache containing: + + .. math :: + [[S_1,S_{-1}], + [S_2,S_{-2}], + [S_{3}, S_{2,1}, S_{2,-1}, S_{-2,1}, S_{-2,-1}, S_{-3}], + [S_{4}, S_{3,1}, S_{2,1,1}, S_{-2,-2}, S_{-3, 1}, S_{-4}],] + + sx_non_singlet: list + same as sx_singlet but now for non-singlet like harmonics + nf : int + number of active flavor below the threshold + L : float + :math:`\ln(\mu_F^2 / m_h^2)` + + Returns + ------- + A_S : numpy.ndarray + |NNLO| singlet |OME| :math:`A^{S,(3)}(N)` + + """ + A_hq_3 = A_Hq(n, sx_singlet, nf, L) + A_hg_3 = A_Hg(n, sx_singlet, nf, L) + + A_gq_3 = A_gq(n, sx_singlet, nf, L) + A_gg_3 = A_gg(n, sx_singlet, nf, L) + + A_qq_ps_3 = A_qqPS(n, sx_singlet, nf, L) + A_qq_ns_3 = A_qqNS(n, sx_non_singlet, nf, L) + A_qg_3 = A_qg(n, sx_singlet, nf, L) + + A_S = np.array( + [ + [A_gg_3, A_gq_3, 0.0], + [A_qg_3, A_qq_ps_3 + A_qq_ns_3, 0.0], + [A_hg_3, A_hq_3, 0.0], + ], + np.complex_, + ) + return A_S + + +@nb.njit(cache=True) +def A_ns(n, sx_all, nf, L): + r"""Computes the |N3LO| non-singlet |OME|. + + .. math:: + A^{NS,(3)} = \left(\begin{array}{cc} + A_{qq,H}^{NS,(3)} & 0\\ + 0 & 0\\ + \end{array}\right) + + When using the code, please cite the complete list of references available + at the top of this module :mod:`eko.matching_conditions.as3`. + + Parameters + ---------- + n : complex + Mellin moment + sx_all : list + harmonic sums cache containing: + + .. math :: + [[S_1,S_{-1}], + [S_2,S_{-2}], + [S_{3}, S_{2,1}, S_{2,-1}, S_{-2,1}, S_{-2,-1}, S_{-3}], + [S_{4}, S_{3,1}, S_{2,1,1}, S_{-2,-2}, S_{-3, 1}, S_{-4}],] + + nf : int + number of active flavor below the threshold + L : float + :math:`\ln(\mu_F^2 / m_h^2)` + + Returns + ------- + A_NS : numpy.ndarray + |N3LO| non-singlet |OME| :math:`A^{NS,(3)}` + + See Also + -------- + A_qqNS_3 : :math:`A_{qq,H}^{NS,(3))}` + + """ + return np.array([[A_qqNS(n, sx_all, nf, L), 0.0], [0 + 0j, 0 + 0j]], np.complex_) diff --git a/src/eko/matching_conditions/as3/aHg.py b/src/eko/matching_conditions/as3/aHg.py new file mode 100644 index 000000000..af1c76052 --- /dev/null +++ b/src/eko/matching_conditions/as3/aHg.py @@ -0,0 +1,3805 @@ +# -*- coding: utf-8 -*- +# pylint: disable=too-many-lines +import numba as nb +import numpy as np + +from .aHgstfac import A_Hgstfac + + +@nb.njit(cache=True) +def A_Hg(n, sx, nf, L): # pylint: disable=too-many-locals + r""" + Computes the |N3LO| singlet |OME| :math:`A_{Hg}^{S,(3)}(N)`. + The experssion is presented in :cite:`Bierenbaum:2009mv`. + + When using the code, please cite the complete list of references + available in :mod:`eko.matching_conditions.as3`. + + Parameters + ---------- + n : complex + Mellin moment + sx : list + harmonic sums cache + nf : int + number of active flavor below the threshold + L : float + :math:`\ln(\mu_F^2 / m_h^2)` + + Returns + ------- + A_Hg : complex + :math:`A_{Hg}^{S,(3)}(N)` + See Also + -------- + A_Hgstfac: eko.matching_conditions.as3.aHgstfac.A_Hgstfac + Incomplete part of the |OME|. + """ + S1, _ = sx[0] + S2, Sm2 = sx[1] + S3, S21, _, Sm21, _, Sm3 = sx[2] + S4, S31, S211, Sm22, Sm211, Sm31, Sm4 = sx[3] + a_Hg_l0 = ( + A_Hgstfac(n, sx, nf) + + (1.0684950250307503 * (2.0 + n + np.power(n, 2))) + / (n * (1.0 + n) * (2.0 + n)) + + 0.3333333333333333 + * nf + * ( + ( + -1.0684950250307503 + * (2.0 + n + np.power(n, 2)) + * ( + -24.0 + - 28.0 * n + - 38.0 * np.power(n, 2) + - 17.0 * np.power(n, 3) + - 1.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 0.3655409037440503 + * ( + -1728.0 + - 5664.0 * n + - 9200.0 * np.power(n, 2) + - 15680.0 * np.power(n, 3) + - 20036.0 * np.power(n, 4) + - 17554.0 * np.power(n, 5) + - 6701.0 * np.power(n, 6) + + 5081.0 * np.power(n, 7) + + 9270.0 * np.power(n, 8) + + 6556.0 * np.power(n, 9) + + 2331.0 * np.power(n, 10) + + 333.0 * np.power(n, 11) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 1.3333333333333333 + * ( + -768.0 + - 5248.0 * n + - 16064.0 * np.power(n, 2) + - 28256.0 * np.power(n, 3) + - 30384.0 * np.power(n, 4) + - 30808.0 * np.power(n, 5) + - 35844.0 * np.power(n, 6) + - 39994.0 * np.power(n, 7) + - 40778.0 * np.power(n, 8) + - 30218.0 * np.power(n, 9) + - 2639.0 * np.power(n, 10) + + 29583.0 * np.power(n, 11) + + 45159.0 * np.power(n, 12) + + 37119.0 * np.power(n, 13) + + 19019.0 * np.power(n, 14) + + 6055.0 * np.power(n, 15) + + 1099.0 * np.power(n, 16) + + 87.0 * np.power(n, 17) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 6) + * np.power(1.0 + n, 6) + * np.power(2.0 + n, 5) + ) + - ( + 2.9243272299524024 + * (12.0 + 28.0 * n + 11.0 * np.power(n, 2) + 5.0 * np.power(n, 3)) + * S1 + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + + ( + 5.333333333333333 + * ( + -12.0 + - 44.0 * n + - 19.0 * np.power(n, 2) + - 11.0 * np.power(n, 3) + - 2.0 * np.power(n, 4) + + 2.0 * np.power(n, 5) + ) + * S1 + ) + / (np.power(n, 2) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 2.6666666666666665 + * ( + -4.0 + - 18.0 * n + - 32.0 * np.power(n, 2) + - 5.0 * np.power(n, 3) + + np.power(n, 4) + ) + * np.power(S1, 2) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 2.6666666666666665 + * ( + -192.0 + - 736.0 * n + - 1232.0 * np.power(n, 2) + - 1688.0 * np.power(n, 3) + - 1424.0 * np.power(n, 4) + - 1152.0 * np.power(n, 5) + - 1060.0 * np.power(n, 6) + - 459.0 * np.power(n, 7) + + 74.0 * np.power(n, 8) + + 144.0 * np.power(n, 9) + + 42.0 * np.power(n, 10) + + 3.0 * np.power(n, 11) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + (2.0 + 3.0 * n) + * (-1.7777777777777777 * np.power(S1, 3) - 5.333333333333333 * S1 * S2) + ) + / (np.power(n, 2) * (2.0 + n)) + + (21.333333333333332 * (-2.0 - 3.0 * n + np.power(n, 2)) * S21) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - ( + 1.7777777777777777 + * ( + -144.0 + - 200.0 * n + - 272.0 * np.power(n, 2) + - 314.0 * np.power(n, 3) + - 353.0 * np.power(n, 4) + - 44.0 * np.power(n, 5) + + 118.0 * np.power(n, 6) + + 54.0 * np.power(n, 7) + + 3.0 * np.power(n, 8) + ) + * S3 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -1.0684950250307503 * S1 + - 2.193245422464302 * np.power(S1, 2) + - 0.1111111111111111 * np.power(S1, 4) + - 0.6666666666666666 * np.power(S1, 2) * S2 + - 0.3333333333333333 * np.power(S2, 2) + + 10.666666666666666 * S211 + + S1 * (-5.333333333333333 * S21 - 0.8888888888888888 * S3) + - 5.333333333333333 * S31 + + 2.0 * S4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 0.3333333333333333 + * ( + ( + -2.1369900500615007 + * (2.0 + n + np.power(n, 2)) + * ( + -12.0 + - 20.0 * n + - 31.0 * np.power(n, 2) + - 16.0 * np.power(n, 3) + + 7.0 * np.power(n, 4) + + 18.0 * np.power(n, 5) + + 6.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 0.3655409037440503 + * ( + -1728.0 + - 4992.0 * n + - 8944.0 * np.power(n, 2) + - 16288.0 * np.power(n, 3) + - 20572.0 * np.power(n, 4) + - 14684.0 * np.power(n, 5) + + 1193.0 * np.power(n, 6) + + 11479.0 * np.power(n, 7) + + 10350.0 * np.power(n, 8) + + 5378.0 * np.power(n, 9) + + 1701.0 * np.power(n, 10) + + 243.0 * np.power(n, 11) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 0.6666666666666666 + * ( + 192.0 + + 736.0 * n + + 1616.0 * np.power(n, 2) + + 1544.0 * np.power(n, 3) + + 256.0 * np.power(n, 4) + + 1676.0 * np.power(n, 5) + + 3876.0 * np.power(n, 6) + + 905.0 * np.power(n, 7) + - 3313.0 * np.power(n, 8) + - 1207.0 * np.power(n, 9) + + 5375.0 * np.power(n, 10) + + 9235.0 * np.power(n, 11) + + 6877.0 * np.power(n, 12) + + 2567.0 * np.power(n, 13) + + 385.0 * np.power(n, 14) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 6) + * np.power(1.0 + n, 6) + * np.power(2.0 + n, 2) + ) + - ( + 14.621636149762011 + * (6.0 + 11.0 * n + 4.0 * np.power(n, 2) + np.power(n, 3)) + * S1 + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + + ( + 10.666666666666666 + * ( + -12.0 + - 44.0 * n + - 19.0 * np.power(n, 2) + - 11.0 * np.power(n, 3) + - 2.0 * np.power(n, 4) + + 2.0 * np.power(n, 5) + ) + * S1 + ) + / (np.power(n, 2) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 5.333333333333333 + * ( + -4.0 + - 18.0 * n + - 32.0 * np.power(n, 2) + - 5.0 * np.power(n, 3) + + np.power(n, 4) + ) + * np.power(S1, 2) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 5.333333333333333 + * ( + -8.0 + - 20.0 * n + - 56.0 * np.power(n, 2) + - 64.0 * np.power(n, 3) + + 15.0 * np.power(n, 4) + + 30.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + ) + * S2 + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + (2.0 + 3.0 * n) + * (-3.5555555555555554 * np.power(S1, 3) - 10.666666666666666 * S1 * S2) + ) + / (np.power(n, 2) * (2.0 + n)) + + (42.666666666666664 * (-2.0 - 3.0 * n + np.power(n, 2)) * S21) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - ( + 3.5555555555555554 + * ( + -8.0 + - 22.0 * n + + 43.0 * np.power(n, 2) + + 48.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + * S3 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -4.273980100123001 * S1 + - 0.2222222222222222 * np.power(S1, 4) + - 1.3333333333333333 * np.power(S1, 2) * S2 + - 0.6666666666666666 * np.power(S2, 2) + + 1.6449340668482262 + * (-3.3333333333333335 * np.power(S1, 2) + 2.0 * S2) + + 21.333333333333332 * S211 + + S1 * (-10.666666666666666 * S21 - 1.7777777777777777 * S3) + - 10.666666666666666 * S31 + + 4.0 * S4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 0.8888888888888888 + * ( + (-437.8296616868554 * (2.0 + n + np.power(n, 2))) + / (n * (1.0 + n) * (2.0 + n)) + + ( + 0.8013712687730628 + * (2.0 + n + np.power(n, 2)) + * ( + 4.0 + + 12.0 * n + + 165.0 * np.power(n, 2) + + 306.0 * np.power(n, 3) + + 153.0 * np.power(n, 4) + ) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 0.8224670334241131 + * ( + -48.0 + - 184.0 * n + - 176.0 * np.power(n, 2) + + 1182.0 * np.power(n, 3) + + 4307.0 * np.power(n, 4) + + 6174.0 * np.power(n, 5) + + 5036.0 * np.power(n, 6) + + 2532.0 * np.power(n, 7) + + 633.0 * np.power(n, 8) + ) + ) + / (np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + - ( + 1.0 + * ( + 16.0 + + 120.0 * n + + 444.0 * np.power(n, 2) + + 1066.0 * np.power(n, 3) + + 1540.0 * np.power(n, 4) + + 246.0 * np.power(n, 5) + - 4163.0 * np.power(n, 6) + - 8462.0 * np.power(n, 7) + - 7605.0 * np.power(n, 8) + - 3148.0 * np.power(n, 9) + - 311.0 * np.power(n, 10) + + 138.0 * np.power(n, 11) + + 23.0 * np.power(n, 12) + ) + ) + / (np.power(n, 6) * np.power(1.0 + n, 6) * (2.0 + n)) + - ( + 13.15947253478581 + * ( + -10.0 + - 29.0 * n + - 21.0 * np.power(n, 2) + + 8.0 * np.power(n, 3) + + 39.0 * np.power(n, 4) + + 36.0 * np.power(n, 5) + + 13.0 * np.power(n, 6) + ) + * S1 + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 4.0 + * ( + -8.0 + - 48.0 * n + - 114.0 * np.power(n, 2) + - 90.0 * np.power(n, 3) + + 240.0 * np.power(n, 4) + + 889.0 * np.power(n, 5) + + 1405.0 * np.power(n, 6) + + 1119.0 * np.power(n, 7) + + 407.0 * np.power(n, 8) + + 62.0 * np.power(n, 9) + + 10.0 * np.power(n, 10) + ) + * S1 + ) + / (np.power(n, 5) * np.power(1.0 + n, 5) * (2.0 + n)) + - ( + 6.579736267392905 + * ( + 20.0 + + 48.0 * n + + 43.0 * np.power(n, 2) + + 14.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + * np.power(S1, 2) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 2.0 + * ( + -8.0 + - 96.0 * n + - 202.0 * np.power(n, 2) + + 208.0 * np.power(n, 3) + + 227.0 * np.power(n, 4) + + 140.0 * np.power(n, 5) + + 51.0 * np.power(n, 6) + ) + * np.power(S1, 2) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 1.3333333333333333 + * ( + -4.0 + - 40.0 * n + - 111.0 * np.power(n, 2) + - 180.0 * np.power(n, 3) + - 15.0 * np.power(n, 4) + + 18.0 * np.power(n, 5) + ) + * np.power(S1, 3) + ) + / (np.power(n, 3) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 0.3333333333333333 + * ( + 36.0 + + 120.0 * n + + 139.0 * np.power(n, 2) + + 54.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + * np.power(S1, 4) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 2.0 + * ( + -16.0 + - 64.0 * n + - 244.0 * np.power(n, 2) + - 636.0 * np.power(n, 3) + - 434.0 * np.power(n, 4) + + 697.0 * np.power(n, 5) + + 1133.0 * np.power(n, 6) + + 427.0 * np.power(n, 7) + + np.power(n, 8) + ) + * S2 + ) + / (np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + - ( + 4.0 + * ( + -20.0 + - 60.0 * n + - 131.0 * np.power(n, 2) + - 119.0 * np.power(n, 3) + + 57.0 * np.power(n, 4) + + 87.0 * np.power(n, 5) + + 18.0 * np.power(n, 6) + ) + * S1 + * S2 + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 2.0 + * (10.0 + 27.0 * n + 24.0 * np.power(n, 2) + 3.0 * np.power(n, 3)) + * np.power(S1, 2) + * S2 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + - ( + 16.0 + * (-2.0 - 3.0 * n + np.power(n, 2)) + * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + * S21 + ) + / (np.power(n, 3) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 16.0 + * ( + 12.0 + + 28.0 * n + + 19.0 * np.power(n, 2) + + 2.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + * S1 + * S21 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 1.3333333333333333 + * ( + -16.0 + - 68.0 * n + + 92.0 * np.power(n, 2) + + 399.0 * np.power(n, 3) + + 519.0 * np.power(n, 4) + + 297.0 * np.power(n, 5) + + 57.0 * np.power(n, 6) + ) + * S3 + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 2.6666666666666665 + * ( + -12.0 + - 36.0 * n + + 97.0 * np.power(n, 2) + + 102.0 * np.power(n, 3) + + 9.0 * np.power(n, 4) + ) + * S1 + * S3 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + (2.0 + n + np.power(n, 2)) + * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + * ( + -6.410970150184502 * S1 + + 13.15947253478581 * S2 + - 1.0 * np.power(S2, 2) + + 32.0 * S211 + - 16.0 * S31 + + 6.0 * S4 + ) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + (26.31894506957162 * (2.0 + n + np.power(n, 2)) * Sm2) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -3.205485075092251 * np.power(S1, 2) + - 0.3333333333333333 * np.power(S1, 5) + - 2.0 * np.power(S1, 3) * S2 + + np.power(S1, 2) * (-16.0 * S21 - 2.6666666666666665 * S3) + + S1 + * (-1.0 * np.power(S2, 2) + 32.0 * S211 - 16.0 * S31 + 6.0 * S4) + + 1.6449340668482262 + * ( + -4.0 * np.power(S1, 3) + + 8.0 * S1 * S2 + + 4.0 * S3 + + 8.0 * S1 * Sm2 + - 8.0 * Sm21 + + 4.0 * Sm3 + ) + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 0.75 + * nf + * ( + ( + 2.1369900500615007 + * ( + 8.0 + + 12.0 * n + + 52.0 * np.power(n, 2) + - 19.0 * np.power(n, 3) + - 14.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + 0.7310818074881006 + * ( + 48.0 + + 88.0 * n + - 68.0 * np.power(n, 2) + + 152.0 * np.power(n, 3) + - 357.0 * np.power(n, 4) + - 252.0 * np.power(n, 5) + + 50.0 * np.power(n, 6) + + 36.0 * np.power(n, 7) + + 15.0 * np.power(n, 8) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 5.333333333333333 + * ( + 64.0 + + 448.0 * n + + 1392.0 * np.power(n, 2) + + 2400.0 * np.power(n, 3) + + 2268.0 * np.power(n, 4) + + 1500.0 * np.power(n, 5) + + 457.0 * np.power(n, 6) + - 1116.0 * np.power(n, 7) + - 1858.0 * np.power(n, 8) + - 826.0 * np.power(n, 9) + + 682.0 * np.power(n, 10) + + 1183.0 * np.power(n, 11) + + 765.0 * np.power(n, 12) + + 267.0 * np.power(n, 13) + + 50.0 * np.power(n, 14) + + 4.0 * np.power(n, 15) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 5) + ) + + ( + 2.9243272299524024 + * ( + 20.0 + + 28.0 * n + + 47.0 * np.power(n, 2) + + 32.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * S1 + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - ( + 5.333333333333333 + * ( + 32.0 + + 72.0 * n + + 396.0 * np.power(n, 2) + + 810.0 * np.power(n, 3) + + 759.0 * np.power(n, 4) + + 386.0 * np.power(n, 5) + + 117.0 * np.power(n, 6) + + 22.0 * np.power(n, 7) + + 2.0 * np.power(n, 8) + ) + * S1 + ) + / (n * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + + ( + 2.6666666666666665 + * ( + -8.0 + + 16.0 * n + + 18.0 * np.power(n, 2) + + 4.0 * np.power(n, 3) + + 7.0 * np.power(n, 4) + + 6.0 * np.power(n, 5) + + np.power(n, 6) + ) + * np.power(S1, 2) + ) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + ( + 1.7777777777777777 + * (2.0 + 11.0 * n + 8.0 * np.power(n, 2) + np.power(n, 3)) + * np.power(S1, 3) + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + 2.6666666666666665 + * ( + 64.0 + + 256.0 * n + + 456.0 * np.power(n, 2) + + 600.0 * np.power(n, 3) + + 290.0 * np.power(n, 4) + + 42.0 * np.power(n, 5) + + 105.0 * np.power(n, 6) + + 85.0 * np.power(n, 7) + + 21.0 * np.power(n, 8) + + np.power(n, 9) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 5.333333333333333 + * (-2.0 - 27.0 * n - 12.0 * np.power(n, 2) + 3.0 * np.power(n, 3)) + * S1 + * S2 + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + 14.222222222222221 + * ( + 6.0 + + 7.0 * n + + 3.0 * np.power(n, 2) + + 9.0 * np.power(n, 3) + + 10.0 * np.power(n, 4) + + np.power(n, 5) + ) + * S3 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + ( + 20.0 + + 22.0 * n + + 7.0 * np.power(n, 2) + + 2.0 * np.power(n, 3) + + np.power(n, 4) + ) + * (17.545963379714415 + 21.333333333333332 * Sm2) + ) + / (np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + ( + (-4.0 - 1.0 * n + np.power(n, 2)) + * ( + -19.232910450553508 + - 35.09192675942883 * S1 + - 42.666666666666664 * S1 * Sm2 + + 42.666666666666664 * Sm21 + - 21.333333333333332 * Sm3 + ) + ) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + 1.0684950250307503 * S1 + + 0.1111111111111111 * np.power(S1, 4) + + 3.3333333333333335 * np.power(S1, 2) * S2 + + 0.3333333333333333 * np.power(S2, 2) + - 2.6666666666666665 * S211 + - 2.6666666666666665 * S31 + + 6.0 * S4 + + (5.333333333333333 * np.power(S1, 2) + 5.333333333333333 * S2) + * Sm2 + + 1.6449340668482262 + * ( + 1.3333333333333333 * np.power(S1, 2) + + 1.3333333333333333 * S2 + + 2.6666666666666665 * Sm2 + ) + + S1 * (8.88888888888889 * S3 - 10.666666666666666 * Sm21) + + 10.666666666666666 * Sm211 + - 5.333333333333333 * Sm22 + + 5.333333333333333 * S1 * Sm3 + - 5.333333333333333 * Sm31 + + 2.6666666666666665 * Sm4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 0.75 + * ( + ( + 4.273980100123001 + * ( + 28.0 + + 42.0 * n + + 92.0 * np.power(n, 2) + + np.power(n, 3) + - 4.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + 0.7310818074881006 + * ( + 672.0 + + 3008.0 * n + + 5352.0 * np.power(n, 2) + + 7460.0 * np.power(n, 3) + + 5276.0 * np.power(n, 4) + + 2451.0 * np.power(n, 5) + + 1894.0 * np.power(n, 6) + + 1100.0 * np.power(n, 7) + + 366.0 * np.power(n, 8) + + 69.0 * np.power(n, 9) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + + ( + 0.09876543209876543 + * ( + 10368.0 + + 59904.0 * n + + 165984.0 * np.power(n, 2) + + 328672.0 * np.power(n, 3) + + 592440.0 * np.power(n, 4) + + 1.113248e6 * np.power(n, 5) + + 1.704634e6 * np.power(n, 6) + + 1.889534e6 * np.power(n, 7) + + 1.57506e6 * np.power(n, 8) + + 1.065977e6 * np.power(n, 9) + + 620328.0 * np.power(n, 10) + + 307057.0 * np.power(n, 11) + + 119006.0 * np.power(n, 12) + + 32317.0 * np.power(n, 13) + + 5436.0 * np.power(n, 14) + + 435.0 * np.power(n, 15) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 5) + ) + - ( + 5.848654459904805 + * ( + 20.0 + + 43.0 * n + + 17.0 * np.power(n, 2) + + 8.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * S1 + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - ( + 0.19753086419753085 + * ( + 864.0 + - 1936.0 * n + - 11056.0 * np.power(n, 2) + - 33648.0 * np.power(n, 3) + - 28270.0 * np.power(n, 4) + + 17745.0 * np.power(n, 5) + + 46431.0 * np.power(n, 6) + + 36343.0 * np.power(n, 7) + + 15787.0 * np.power(n, 8) + + 3960.0 * np.power(n, 9) + + 436.0 * np.power(n, 10) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 4) + ) + + ( + 2.6666666666666665 + * ( + -24.0 + + 12.0 * n + + 14.0 * np.power(n, 2) + - 7.0 * np.power(n, 3) + + 8.0 * np.power(n, 4) + + 11.0 * np.power(n, 5) + + 2.0 * np.power(n, 6) + ) + * np.power(S1, 2) + ) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + ( + 3.5555555555555554 + * (2.0 + 11.0 * n + 8.0 * np.power(n, 2) + np.power(n, 3)) + * np.power(S1, 3) + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + 2.6666666666666665 + * ( + 128.0 + + 512.0 * n + + 904.0 * np.power(n, 2) + + 1172.0 * np.power(n, 3) + + 554.0 * np.power(n, 4) + + 87.0 * np.power(n, 5) + + 233.0 * np.power(n, 6) + + 193.0 * np.power(n, 7) + + 53.0 * np.power(n, 8) + + 4.0 * np.power(n, 9) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 10.666666666666666 + * (-2.0 - 27.0 * n - 12.0 * np.power(n, 2) + 3.0 * np.power(n, 3)) + * S1 + * S2 + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + 28.444444444444443 + * ( + 6.0 + + 7.0 * n + + 3.0 * np.power(n, 2) + + 9.0 * np.power(n, 3) + + 10.0 * np.power(n, 4) + + np.power(n, 5) + ) + * S3 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + ( + 20.0 + + 22.0 * n + + 7.0 * np.power(n, 2) + + 2.0 * np.power(n, 3) + + np.power(n, 4) + ) + * (35.09192675942883 + 42.666666666666664 * Sm2) + ) + / (np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + ( + (-4.0 - 1.0 * n + np.power(n, 2)) + * ( + -38.465820901107016 + - 70.18385351885766 * S1 + - 85.33333333333333 * S1 * Sm2 + + 85.33333333333333 * Sm21 + - 42.666666666666664 * Sm3 + ) + ) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + 7.479465175215253 * S1 + + 0.2222222222222222 * np.power(S1, 4) + + 6.666666666666667 * np.power(S1, 2) * S2 + + 0.6666666666666666 * np.power(S2, 2) + - 5.333333333333333 * S211 + - 5.333333333333333 * S31 + + 12.0 * S4 + + (10.666666666666666 * np.power(S1, 2) + 10.666666666666666 * S2) + * Sm2 + + 1.6449340668482262 + * ( + 3.3333333333333335 * np.power(S1, 2) + + 3.3333333333333335 * S2 + + 6.666666666666667 * Sm2 + ) + + S1 * (17.77777777777778 * S3 - 21.333333333333332 * Sm21) + + 21.333333333333332 * Sm211 + - 10.666666666666666 * Sm22 + + 10.666666666666666 * S1 * Sm3 + - 10.666666666666666 * Sm31 + + 5.333333333333333 * Sm4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 4.5 + * ( + ( + -0.5342475125153752 + * ( + -24.0 + - 46.0 * n + - 35.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * ( + 8.0 + + 12.0 * n + + 52.0 * np.power(n, 2) + - 19.0 * np.power(n, 3) + - 14.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 0.3655409037440503 + * ( + -3456.0 + - 17184.0 * n + - 39184.0 * np.power(n, 2) + - 62960.0 * np.power(n, 3) + - 65616.0 * np.power(n, 4) + - 41818.0 * np.power(n, 5) + - 5017.0 * np.power(n, 6) + - 4436.0 * np.power(n, 7) + - 18414.0 * np.power(n, 8) + - 11265.0 * np.power(n, 9) + - 1501.0 * np.power(n, 10) + + 794.0 * np.power(n, 11) + + 420.0 * np.power(n, 12) + + 69.0 * np.power(n, 13) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 4) + ) + - ( + 1.3333333333333333 + * ( + -24.0 + - 46.0 * n + - 35.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * ( + 64.0 + + 448.0 * n + + 1392.0 * np.power(n, 2) + + 2400.0 * np.power(n, 3) + + 2268.0 * np.power(n, 4) + + 1500.0 * np.power(n, 5) + + 457.0 * np.power(n, 6) + - 1116.0 * np.power(n, 7) + - 1858.0 * np.power(n, 8) + - 826.0 * np.power(n, 9) + + 682.0 * np.power(n, 10) + + 1183.0 * np.power(n, 11) + + 765.0 * np.power(n, 12) + + 267.0 * np.power(n, 13) + + 50.0 * np.power(n, 14) + + 4.0 * np.power(n, 15) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 6) + * np.power(1.0 + n, 6) + * np.power(2.0 + n, 6) + ) + - ( + 0.5342475125153752 + * ( + -240.0 + - 668.0 * n + - 356.0 * np.power(n, 2) + - 487.0 * np.power(n, 3) + - 105.0 * np.power(n, 4) + + 339.0 * np.power(n, 5) + + 77.0 * np.power(n, 6) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 0.7310818074881006 + * ( + -864.0 + - 2160.0 * n + - 472.0 * np.power(n, 2) + + 36.0 * np.power(n, 3) + + 4926.0 * np.power(n, 4) + + 3755.0 * np.power(n, 5) + - 1505.0 * np.power(n, 6) + - 334.0 * np.power(n, 7) + + 1124.0 * np.power(n, 8) + + 575.0 * np.power(n, 9) + + 103.0 * np.power(n, 10) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 1.3333333333333333 + * ( + 768.0 + + 5376.0 * n + + 16704.0 * np.power(n, 2) + + 29568.0 * np.power(n, 3) + + 30416.0 * np.power(n, 4) + + 31936.0 * np.power(n, 5) + + 44956.0 * np.power(n, 6) + + 54008.0 * np.power(n, 7) + + 40728.0 * np.power(n, 8) + + 15041.0 * np.power(n, 9) + + 1996.0 * np.power(n, 10) + + 2510.0 * np.power(n, 11) + + 3222.0 * np.power(n, 12) + + 1503.0 * np.power(n, 13) + + 314.0 * np.power(n, 14) + + 26.0 * np.power(n, 15) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 5) + ) + - ( + 2.193245422464302 + * ( + -48.0 + - 116.0 * n + - 92.0 * np.power(n, 2) + - 133.0 * np.power(n, 3) + + 9.0 * np.power(n, 4) + + 81.0 * np.power(n, 5) + + 11.0 * np.power(n, 6) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + 0.6666666666666666 + * ( + -192.0 + - 752.0 * n + - 72.0 * np.power(n, 2) + - 6116.0 * np.power(n, 3) + - 9218.0 * np.power(n, 4) + + 1258.0 * np.power(n, 5) + + 9211.0 * np.power(n, 6) + + 6514.0 * np.power(n, 7) + + 2106.0 * np.power(n, 8) + + 392.0 * np.power(n, 9) + + 37.0 * np.power(n, 10) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 4) + ) + - ( + 0.4444444444444444 + * ( + -48.0 + - 212.0 * n + - 1200.0 * np.power(n, 2) + - 769.0 * np.power(n, 3) + + 190.0 * np.power(n, 4) + + 208.0 * np.power(n, 5) + + 128.0 * np.power(n, 6) + + 101.0 * np.power(n, 7) + + 18.0 * np.power(n, 8) + ) + * np.power(S1, 3) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + + ( + 0.1111111111111111 + * ( + -48.0 + - 20.0 * n + + 292.0 * np.power(n, 2) + - 181.0 * np.power(n, 3) + - 327.0 * np.power(n, 4) + - 15.0 * np.power(n, 5) + + 11.0 * np.power(n, 6) + ) + * np.power(S1, 4) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 0.6666666666666666 + * ( + -24.0 + - 46.0 * n + - 35.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * ( + 64.0 + + 256.0 * n + + 456.0 * np.power(n, 2) + + 600.0 * np.power(n, 3) + + 290.0 * np.power(n, 4) + + 42.0 * np.power(n, 5) + + 105.0 * np.power(n, 6) + + 85.0 * np.power(n, 7) + + 21.0 * np.power(n, 8) + + np.power(n, 9) + ) + * S2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 4) + ) + - ( + 1.3333333333333333 + * ( + 384.0 + + 1488.0 * n + + 1996.0 * np.power(n, 2) + + 2000.0 * np.power(n, 3) + + 359.0 * np.power(n, 4) + + 586.0 * np.power(n, 5) + + 1296.0 * np.power(n, 6) + + 576.0 * np.power(n, 7) + + 93.0 * np.power(n, 8) + + 6.0 * np.power(n, 9) + ) + * S1 + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + + ( + 0.6666666666666666 + * (-2.0 + n) + * ( + 120.0 + + 326.0 * n + + 213.0 * np.power(n, 2) + + 379.0 * np.power(n, 3) + + 347.0 * np.power(n, 4) + + 55.0 * np.power(n, 5) + ) + * np.power(S1, 2) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 3.5555555555555554 + * ( + -24.0 + - 46.0 * n + - 35.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * ( + 6.0 + + 7.0 * n + + 3.0 * np.power(n, 2) + + 9.0 * np.power(n, 3) + + 10.0 * np.power(n, 4) + + np.power(n, 5) + ) + * S3 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + + ( + 1.7777777777777777 + * ( + -384.0 + - 748.0 * n + - 772.0 * np.power(n, 2) + - 401.0 * np.power(n, 3) + - 195.0 * np.power(n, 4) + + 141.0 * np.power(n, 5) + + 55.0 * np.power(n, 6) + ) + * S1 + * S3 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + ( + 20.0 + + 22.0 * n + + 7.0 * np.power(n, 2) + + 2.0 * np.power(n, 3) + + np.power(n, 4) + ) + * ( + -24.0 + - 46.0 * n + - 35.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * (-4.386490844928604 - 5.333333333333333 * Sm2) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + - ( + 52.63789013914324 + * (1.0 + n + np.power(n, 2)) + * (2.0 + n + np.power(n, 2)) + * Sm2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + ( + 96.0 + + 232.0 * n + - 58.0 * np.power(n, 2) + - 131.0 * np.power(n, 3) + + 5.0 * np.power(n, 5) + ) + * (8.772981689857207 * S1 + 10.666666666666666 * S1 * Sm2) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2) * np.power(2.0 + n, 3)) + + ( + ( + -48.0 + - 116.0 * n + - 44.0 * np.power(n, 2) + - 109.0 * np.power(n, 3) + - 39.0 * np.power(n, 4) + + 57.0 * np.power(n, 5) + + 11.0 * np.power(n, 6) + ) + * ( + 4.386490844928604 * np.power(S1, 2) + + 5.333333333333333 * np.power(S1, 2) * Sm2 + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + (-4.0 - 1.0 * n + np.power(n, 2)) + * ( + -24.0 + - 46.0 * n + - 35.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * ( + 4.808227612638377 + - 10.666666666666666 * Sm21 + + 5.333333333333333 * Sm3 + ) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + ( + ( + -48.0 + - 68.0 * n + - 24.0 * np.power(n, 2) + - 49.0 * np.power(n, 3) + + 34.0 * np.power(n, 4) + + 11.0 * np.power(n, 5) + ) + * ( + 4.808227612638377 * S1 + - 10.666666666666666 * S1 * Sm21 + + 5.333333333333333 * S1 * Sm3 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * (1.0 + n) * np.power(2.0 + n, 2)) + + ( + (2.0 + n + np.power(n, 2)) + * ( + -24.0 + - 46.0 * n + - 35.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * ( + 0.3333333333333333 * np.power(S2, 2) + - 2.6666666666666665 * S211 + - 2.6666666666666665 * S31 + + 6.0 * S4 + + 5.333333333333333 * S2 * Sm2 + + 1.6449340668482262 + * (2.6666666666666665 * S2 + 2.6666666666666665 * Sm2) + + 10.666666666666666 * Sm211 + - 5.333333333333333 * Sm22 + - 5.333333333333333 * Sm31 + + 2.6666666666666665 * Sm4 + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -3.205485075092251 * np.power(S1, 2) + - 0.3333333333333333 * np.power(S1, 5) + - 10.0 * np.power(S1, 3) * S2 + + (-16.0 * np.power(S1, 3) - 16.0 * S1 * S2) * Sm2 + + np.power(S1, 2) * (-26.666666666666668 * S3 + 32.0 * Sm21) + + 1.6449340668482262 + * ( + -4.0 * np.power(S1, 3) + + 3.6666666666666665 * S2 + - 8.0 * S1 * S2 + - 2.0 * S3 + - 12.0 * S1 * Sm2 + + 4.0 * Sm21 + - 2.0 * Sm3 + ) + - 16.0 * np.power(S1, 2) * Sm3 + + S1 + * ( + -1.0 * np.power(S2, 2) + + 8.0 * S211 + + 8.0 * S31 + - 18.0 * S4 + - 32.0 * Sm211 + + 16.0 * Sm22 + + 16.0 * Sm31 + ) + - 8.0 * S1 * Sm4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 2.0 + * ( + (218.9148308434277 * (2.0 + n + np.power(n, 2))) + / (n * (1.0 + n) * (2.0 + n)) + - ( + 0.2671237562576876 + * ( + 192.0 + + 664.0 * n + - 404.0 * np.power(n, 2) + - 2554.0 * np.power(n, 3) + - 681.0 * np.power(n, 4) + + 1692.0 * np.power(n, 5) + + 3002.0 * np.power(n, 6) + + 2190.0 * np.power(n, 7) + + 507.0 * np.power(n, 8) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 0.09138522593601257 + * ( + 1776.0 + + 9488.0 * n + + 25144.0 * np.power(n, 2) + + 44064.0 * np.power(n, 3) + + 55339.0 * np.power(n, 4) + + 37623.0 * np.power(n, 5) + + 21430.0 * np.power(n, 6) + + 15070.0 * np.power(n, 7) + + 5751.0 * np.power(n, 8) + + 891.0 * np.power(n, 9) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 2) + ) + + ( + 0.3333333333333333 + * ( + 1408.0 + - 4480.0 * n + - 64672.0 * np.power(n, 2) + - 200160.0 * np.power(n, 3) + - 261272.0 * np.power(n, 4) + - 73752.0 * np.power(n, 5) + + 207634.0 * np.power(n, 6) + + 337718.0 * np.power(n, 7) + + 425270.0 * np.power(n, 8) + + 712841.0 * np.power(n, 9) + + 1.086519e6 * np.power(n, 10) + + 1.160715e6 * np.power(n, 11) + + 831483.0 * np.power(n, 12) + + 394315.0 * np.power(n, 13) + + 119399.0 * np.power(n, 14) + + 20963.0 * np.power(n, 15) + + 1623.0 * np.power(n, 16) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 6) + * np.power(2.0 + n, 5) + ) + - ( + 0.5342475125153752 + * ( + -312.0 + - 556.0 * n + - 1054.0 * np.power(n, 2) + + 259.0 * np.power(n, 3) + + 351.0 * np.power(n, 4) + + 93.0 * np.power(n, 5) + + 67.0 * np.power(n, 6) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + 0.7310818074881006 + * ( + 144.0 + - 48.0 * n + - 1096.0 * np.power(n, 2) + + 184.0 * np.power(n, 3) + - 381.0 * np.power(n, 4) + + 358.0 * np.power(n, 5) + + 924.0 * np.power(n, 6) + + 370.0 * np.power(n, 7) + + 121.0 * np.power(n, 8) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 2.6666666666666665 + * ( + 576.0 + + 4032.0 * n + + 10416.0 * np.power(n, 2) + + 7584.0 * np.power(n, 3) + - 16628.0 * np.power(n, 4) + - 40468.0 * np.power(n, 5) + - 40915.0 * np.power(n, 6) + - 33352.0 * np.power(n, 7) + - 27541.0 * np.power(n, 8) + - 11753.0 * np.power(n, 9) + + 6624.0 * np.power(n, 10) + + 11508.0 * np.power(n, 11) + + 6497.0 * np.power(n, 12) + + 1953.0 * np.power(n, 13) + + 335.0 * np.power(n, 14) + + 28.0 * np.power(n, 15) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 5) + ) + - ( + 4.386490844928604 + * ( + 12.0 + + 20.0 * n + - 97.0 * np.power(n, 2) + - 44.0 * np.power(n, 3) + - 39.0 * np.power(n, 4) + - 6.0 * np.power(n, 5) + + 10.0 * np.power(n, 6) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 1.3333333333333333 + * ( + -192.0 + - 416.0 * n + - 1712.0 * np.power(n, 2) + - 10832.0 * np.power(n, 3) + - 26920.0 * np.power(n, 4) + - 23342.0 * np.power(n, 5) + - 282.0 * np.power(n, 6) + + 12320.0 * np.power(n, 7) + + 9245.0 * np.power(n, 8) + + 3599.0 * np.power(n, 9) + + 853.0 * np.power(n, 10) + + 95.0 * np.power(n, 11) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 4) + ) + + ( + 0.8888888888888888 + * ( + -48.0 + - 128.0 * n + + 84.0 * np.power(n, 2) + + 300.0 * np.power(n, 3) + - 78.0 * np.power(n, 4) + - 1251.0 * np.power(n, 5) + - 1116.0 * np.power(n, 6) + - 115.0 * np.power(n, 7) + + 156.0 * np.power(n, 8) + + 36.0 * np.power(n, 9) + ) + * np.power(S1, 3) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 0.2222222222222222 + * ( + 84.0 + + 296.0 * n + + 329.0 * np.power(n, 2) + - 317.0 * np.power(n, 3) + - 444.0 * np.power(n, 4) + - 93.0 * np.power(n, 5) + + np.power(n, 6) + ) + * np.power(S1, 4) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 6.579736267392905 + * (2.0 + n + np.power(n, 2)) + * ( + 4.0 + + 4.0 * n + + 7.0 * np.power(n, 2) + + 6.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 1.3333333333333333 + * ( + 112.0 + + 992.0 * n + + 2888.0 * np.power(n, 2) + + 5000.0 * np.power(n, 3) + + 8997.0 * np.power(n, 4) + + 13213.0 * np.power(n, 5) + + 12399.0 * np.power(n, 6) + + 7171.0 * np.power(n, 7) + + 2448.0 * np.power(n, 8) + + 456.0 * np.power(n, 9) + + 36.0 * np.power(n, 10) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 2.6666666666666665 + * ( + 240.0 + + 736.0 * n + + 996.0 * np.power(n, 2) + + 588.0 * np.power(n, 3) + - 1116.0 * np.power(n, 4) + - 933.0 * np.power(n, 5) + + 1080.0 * np.power(n, 6) + + 1409.0 * np.power(n, 7) + + 534.0 * np.power(n, 8) + + 66.0 * np.power(n, 9) + ) + * S1 + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + + ( + 1.3333333333333333 + * ( + -84.0 + - 200.0 * n + - 389.0 * np.power(n, 2) + + 359.0 * np.power(n, 3) + + 390.0 * np.power(n, 4) + + 51.0 * np.power(n, 5) + + 17.0 * np.power(n, 6) + ) + * np.power(S1, 2) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 0.6666666666666666 + * (2.0 + n + np.power(n, 2)) + * ( + -6.0 + - 17.0 * n + - 16.0 * np.power(n, 2) + + 2.0 * np.power(n, 3) + + np.power(n, 4) + ) + * np.power(S2, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 5.333333333333333 + * (-2.0 - 3.0 * n + np.power(n, 2)) + * ( + -24.0 + - 46.0 * n + - 35.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * S21 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 5.333333333333333 + * ( + -20.0 + - 176.0 * n + - 145.0 * np.power(n, 2) + - 3.0 * np.power(n, 3) + + 45.0 * np.power(n, 4) + + 11.0 * np.power(n, 5) + ) + * S1 + * S21 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + 2.6666666666666665 + * (2.0 + n + np.power(n, 2)) + * ( + -84.0 + - 172.0 * n + - 137.0 * np.power(n, 2) + + 70.0 * np.power(n, 3) + + 35.0 * np.power(n, 4) + ) + * S211 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + 0.4444444444444444 + * ( + -96.0 + + 128.0 * n + - 1972.0 * np.power(n, 2) + - 5992.0 * np.power(n, 3) + - 6565.0 * np.power(n, 4) + - 1378.0 * np.power(n, 5) + + 2360.0 * np.power(n, 6) + + 1674.0 * np.power(n, 7) + + 321.0 * np.power(n, 8) + ) + * S3 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 0.8888888888888888 + * ( + 192.0 + + 308.0 * n + - 712.0 * np.power(n, 2) + + 229.0 * np.power(n, 3) + + 1311.0 * np.power(n, 4) + + 591.0 * np.power(n, 5) + + 97.0 * np.power(n, 6) + ) + * S1 + * S3 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 2.6666666666666665 + * (2.0 + n + np.power(n, 2)) + * ( + -60.0 + - 104.0 * n + - 73.0 * np.power(n, 2) + + 62.0 * np.power(n, 3) + + 31.0 * np.power(n, 4) + ) + * S31 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -30.0 + - 41.0 * n + - 22.0 * np.power(n, 2) + + 38.0 * np.power(n, 3) + + 19.0 * np.power(n, 4) + ) + * S4 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - (13.15947253478581 * (2.0 + n + np.power(n, 2)) * Sm2) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + ( + -40.0 + - 200.0 * n + - 404.0 * np.power(n, 2) + - 319.0 * np.power(n, 3) + - 65.0 * np.power(n, 4) + + 27.0 * np.power(n, 5) + + 9.0 * np.power(n, 6) + ) + * (13.15947253478581 + 16.0 * Sm2) + ) + / (n * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + ( + ( + 32.0 + + 172.0 * n + + 256.0 * np.power(n, 2) + + 223.0 * np.power(n, 3) + + 136.0 * np.power(n, 4) + + 47.0 * np.power(n, 5) + + 6.0 * np.power(n, 6) + ) + * (26.31894506957162 * S1 + 32.0 * S1 * Sm2) + ) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + ( + ( + 8.0 + + 20.0 * n + + 62.0 * np.power(n, 2) + + 31.0 * np.power(n, 3) + + 4.0 * np.power(n, 4) + + 3.0 * np.power(n, 5) + ) + * (13.15947253478581 * np.power(S1, 2) + 16.0 * np.power(S1, 2) * Sm2) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + ( + 16.0 + + 58.0 * n + + 77.0 * np.power(n, 2) + + 66.0 * np.power(n, 3) + + 33.0 * np.power(n, 4) + + 6.0 * np.power(n, 5) + ) + * (14.424682837915132 - 32.0 * Sm21 + 16.0 * Sm3) + ) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + + ( + ( + 8.0 + + 20.0 * n + + 46.0 * np.power(n, 2) + + 27.0 * np.power(n, 3) + + 8.0 * np.power(n, 4) + + 3.0 * np.power(n, 5) + ) + * (14.424682837915132 * S1 - 32.0 * S1 * Sm21 + 16.0 * S1 * Sm3) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + (2.0 + n + np.power(n, 2)) + * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + * ( + 16.0 * S2 * Sm2 + + 1.6449340668482262 * (8.0 * S2 + 8.0 * Sm2) + + 32.0 * Sm211 + - 16.0 * Sm22 + - 16.0 * Sm31 + + 8.0 * Sm4 + ) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + 6.410970150184502 * np.power(S1, 2) + + 0.6666666666666666 * np.power(S1, 5) + + 12.0 * np.power(S1, 3) * S2 + + (32.0 + 16.0 * np.power(S1, 3) + 16.0 * S1 * S2) * Sm2 + + np.power(S1, 2) + * (16.0 * S21 + 29.333333333333332 * S3 - 32.0 * Sm21) + + 1.6449340668482262 + * ( + 8.0 * np.power(S1, 3) + - 2.0 * S3 + + 4.0 * S1 * Sm2 + + 4.0 * Sm21 + - 2.0 * Sm3 + ) + + 16.0 * np.power(S1, 2) * Sm3 + + S1 + * ( + 2.0 * np.power(S2, 2) + - 40.0 * S211 + + 8.0 * S31 + + 12.0 * S4 + + 32.0 * Sm211 + - 16.0 * Sm22 + - 16.0 * Sm31 + ) + + 8.0 * S1 * Sm4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + ) + a_Hg_l3 = ( + (0.8888888888888888 * (2.0 + n + np.power(n, 2))) / (n * (1.0 + n) * (2.0 + n)) + - 0.3333333333333333 + * nf + * ( + ( + 0.8888888888888888 + * (2.0 + n + np.power(n, 2)) + * ( + -24.0 + - 28.0 * n + - 38.0 * np.power(n, 2) + - 17.0 * np.power(n, 3) + - 1.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - (3.5555555555555554 * (2.0 + n + np.power(n, 2)) * S1) + / (n * (1.0 + n) * (2.0 + n)) + ) + - 0.75 + * nf + * ( + ( + -7.111111111111111 + * (1.0 + n + np.power(n, 2)) + * (2.0 + n + np.power(n, 2)) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + (3.5555555555555554 * (2.0 + n + np.power(n, 2)) * S1) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 0.3333333333333333 + * ( + ( + -1.7777777777777777 + * (2.0 + n + np.power(n, 2)) + * ( + -12.0 + - 20.0 * n + - 31.0 * np.power(n, 2) + - 16.0 * np.power(n, 3) + + 7.0 * np.power(n, 4) + + 18.0 * np.power(n, 5) + + 6.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + (14.222222222222221 * (2.0 + n + np.power(n, 2)) * S1) + / (n * (1.0 + n) * (2.0 + n)) + ) + - 0.75 + * ( + ( + -49.77777777777778 + * (1.0 + n + np.power(n, 2)) + * (2.0 + n + np.power(n, 2)) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + (24.88888888888889 * (2.0 + n + np.power(n, 2)) * S1) + / (n * (1.0 + n) * (2.0 + n)) + ) + - 0.8888888888888888 + * ( + ( + -0.6666666666666666 + * (2.0 + n + np.power(n, 2)) + * np.power(2.0 + 3.0 * n + 3.0 * np.power(n, 2), 2) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 5.333333333333333 + * (2.0 + n + np.power(n, 2)) + * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + * S1 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - (10.666666666666666 * (2.0 + n + np.power(n, 2)) * np.power(S1, 2)) + / (n * (1.0 + n) * (2.0 + n)) + ) + - 4.5 + * ( + ( + 1.7777777777777777 + * (1.0 + n + np.power(n, 2)) + * (2.0 + n + np.power(n, 2)) + * ( + -24.0 + - 46.0 * n + - 35.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 0.8888888888888888 + * (2.0 + n + np.power(n, 2)) + * ( + -48.0 + - 70.0 * n + - 59.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - (10.666666666666666 * (2.0 + n + np.power(n, 2)) * np.power(S1, 2)) + / (n * (1.0 + n) * (2.0 + n)) + ) + - 2.0 + * ( + ( + -0.2222222222222222 + * (2.0 + n + np.power(n, 2)) + * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + * ( + -48.0 + - 70.0 * n + - 59.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 0.8888888888888888 + * (2.0 + n + np.power(n, 2)) + * (6.0 + n + np.power(n, 2)) + * (4.0 + 7.0 * n + 7.0 * np.power(n, 2)) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + (21.333333333333332 * (2.0 + n + np.power(n, 2)) * np.power(S1, 2)) + / (n * (1.0 + n) * (2.0 + n)) + ) + ) + a_Hg_l2 = ( + 0.3333333333333333 + * ( + ( + -0.4444444444444444 + * ( + -1152.0 + - 3648.0 * n + - 6640.0 * np.power(n, 2) + - 11680.0 * np.power(n, 3) + - 13912.0 * np.power(n, 4) + - 9464.0 * np.power(n, 5) + + 383.0 * np.power(n, 6) + + 6505.0 * np.power(n, 7) + + 5730.0 * np.power(n, 8) + + 2894.0 * np.power(n, 9) + + 903.0 * np.power(n, 10) + + 129.0 * np.power(n, 11) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 3.5555555555555554 + * (18.0 + 37.0 * n + 14.0 * np.power(n, 2) + 5.0 * np.power(n, 3)) + * S1 + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * (4.0 * np.power(S1, 2) - 1.3333333333333333 * S2) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 0.3333333333333333 + * nf + * ( + ( + -0.4444444444444444 + * ( + 1152.0 + + 3456.0 * n + + 5456.0 * np.power(n, 2) + + 7328.0 * np.power(n, 3) + + 5096.0 * np.power(n, 4) + + 2236.0 * np.power(n, 5) + + 1463.0 * np.power(n, 6) + + 1513.0 * np.power(n, 7) + + 1290.0 * np.power(n, 8) + + 698.0 * np.power(n, 9) + + 231.0 * np.power(n, 10) + + 33.0 * np.power(n, 11) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 3.5555555555555554 + * (6.0 + 19.0 * n + 8.0 * np.power(n, 2) + 5.0 * np.power(n, 3)) + * S1 + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * (1.3333333333333333 * np.power(S1, 2) + 1.3333333333333333 * S2) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 0.75 + * ( + ( + -0.8888888888888888 + * ( + 384.0 + + 1696.0 * n + + 2928.0 * np.power(n, 2) + + 3484.0 * np.power(n, 3) + + 2740.0 * np.power(n, 4) + + 1731.0 * np.power(n, 5) + + 1262.0 * np.power(n, 6) + + 724.0 * np.power(n, 7) + + 270.0 * np.power(n, 8) + + 45.0 * np.power(n, 9) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + + ( + 3.5555555555555554 + * ( + 20.0 + - 14.0 * n + - 1.0 * np.power(n, 2) + + 20.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * S1 + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * (-4.0 * np.power(S1, 2) - 4.0 * S2 - 8.0 * Sm2) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 0.75 + * nf + * ( + ( + -0.8888888888888888 + * ( + -160.0 + - 672.0 * n + - 1012.0 * np.power(n, 2) + - 1120.0 * np.power(n, 3) + - 717.0 * np.power(n, 4) + - 182.0 * np.power(n, 5) + + 56.0 * np.power(n, 6) + + 54.0 * np.power(n, 7) + + 9.0 * np.power(n, 8) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 3.5555555555555554 + * ( + 20.0 + + 58.0 * n + + 47.0 * np.power(n, 2) + + 20.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * S1 + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -1.3333333333333333 * np.power(S1, 2) + - 1.3333333333333333 * S2 + - 2.6666666666666665 * Sm2 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 0.8888888888888888 + * ( + ( + 32.0 + + 128.0 * n + + 292.0 * np.power(n, 2) + + 528.0 * np.power(n, 3) + + 685.0 * np.power(n, 4) + + 636.0 * np.power(n, 5) + + 350.0 * np.power(n, 6) + + 132.0 * np.power(n, 7) + + 33.0 * np.power(n, 8) + ) + / (np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + - ( + 8.0 + * ( + 12.0 + + 34.0 * n + + 60.0 * np.power(n, 2) + + 84.0 * np.power(n, 3) + + 51.0 * np.power(n, 4) + + 18.0 * np.power(n, 5) + + 5.0 * np.power(n, 6) + ) + * S1 + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 4.0 + * ( + 20.0 + + 48.0 * n + + 43.0 * np.power(n, 2) + + 14.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + * np.power(S1, 2) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 12.0 + * (2.0 + n + np.power(n, 2)) + * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + * S2 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - (32.0 * (2.0 + n + np.power(n, 2)) * Sm2) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + 4.0 * np.power(S1, 3) + - 12.0 * S1 * S2 + - 8.0 * S3 + - 16.0 * S1 * Sm2 + + 16.0 * Sm21 + - 8.0 * Sm3 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 2.0 + * ( + ( + 0.1111111111111111 + * ( + 2304.0 + - 2864.0 * n + - 16272.0 * np.power(n, 2) + - 24608.0 * np.power(n, 3) + - 12692.0 * np.power(n, 4) + + 6675.0 * np.power(n, 5) + + 12206.0 * np.power(n, 6) + + 7636.0 * np.power(n, 7) + + 2934.0 * np.power(n, 8) + + 489.0 * np.power(n, 9) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 0.8888888888888888 + * ( + 144.0 + + 24.0 * n + - 668.0 * np.power(n, 2) + - 314.0 * np.power(n, 3) + - 2.0 * np.power(n, 4) + + 119.0 * np.power(n, 5) + + 613.0 * np.power(n, 6) + + 635.0 * np.power(n, 7) + + 273.0 * np.power(n, 8) + + 40.0 * np.power(n, 9) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + + ( + 2.6666666666666665 + * ( + 36.0 + + 56.0 * n + + 29.0 * np.power(n, 2) + - 137.0 * np.power(n, 3) + - 120.0 * np.power(n, 4) + - 9.0 * np.power(n, 5) + + np.power(n, 6) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + 2.6666666666666665 + * (2.0 + n + np.power(n, 2)) + * ( + 18.0 + + 7.0 * n + + 8.0 * np.power(n, 2) + + 2.0 * np.power(n, 3) + + np.power(n, 4) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 * np.power(S1, 3) + + 4.0 * S3 + + 6.0 * Sm2 + - 8.0 * Sm21 + + 4.0 * Sm3 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 4.5 + * ( + ( + 1.7777777777777777 + * ( + -576.0 + - 2592.0 * n + - 5296.0 * np.power(n, 2) + - 6992.0 * np.power(n, 3) + - 6012.0 * np.power(n, 4) + - 4462.0 * np.power(n, 5) + - 3841.0 * np.power(n, 6) + - 4619.0 * np.power(n, 7) + - 4428.0 * np.power(n, 8) + - 2325.0 * np.power(n, 9) + - 511.0 * np.power(n, 10) + + 101.0 * np.power(n, 11) + + 72.0 * np.power(n, 12) + + 9.0 * np.power(n, 13) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 4) + ) + + ( + 0.8888888888888888 + * ( + -576.0 + - 1296.0 * n + + 968.0 * np.power(n, 2) + + 2568.0 * np.power(n, 3) + + 2238.0 * np.power(n, 4) + - 325.0 * np.power(n, 5) + - 521.0 * np.power(n, 6) + + 788.0 * np.power(n, 7) + + 830.0 * np.power(n, 8) + + 425.0 * np.power(n, 9) + + 85.0 * np.power(n, 10) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 1.3333333333333333 + * ( + -48.0 + - 116.0 * n + + 4.0 * np.power(n, 2) + - 85.0 * np.power(n, 3) + - 87.0 * np.power(n, 4) + + 33.0 * np.power(n, 5) + + 11.0 * np.power(n, 6) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 1.3333333333333333 + * (2.0 + n + np.power(n, 2)) + * ( + -72.0 + - 94.0 * n + - 83.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 2.6666666666666665 + * (2.0 + n + np.power(n, 2)) + * ( + -48.0 + - 70.0 * n + - 59.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * Sm2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + 4.0 * np.power(S1, 3) + + 12.0 * S1 * S2 + + 4.0 * S3 + + 16.0 * S1 * Sm2 + - 8.0 * Sm21 + + 4.0 * Sm3 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + ) + a_Hg_l1 = ( + 0.3333333333333333 + * ( + ( + -0.07407407407407407 + * ( + -34560.0 + - 144000.0 * n + - 299712.0 * np.power(n, 2) + - 453440.0 * np.power(n, 3) + - 534656.0 * np.power(n, 4) + - 492936.0 * np.power(n, 5) + - 435356.0 * np.power(n, 6) + - 228072.0 * np.power(n, 7) + + 154773.0 * np.power(n, 8) + + 398930.0 * np.power(n, 9) + + 371423.0 * np.power(n, 10) + + 214620.0 * np.power(n, 11) + + 80795.0 * np.power(n, 12) + + 18018.0 * np.power(n, 13) + + 1773.0 * np.power(n, 14) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + + ( + 0.5925925925925926 + * ( + 192.0 + + 592.0 * n + + 786.0 * np.power(n, 2) + + 163.0 * np.power(n, 3) + + 29.0 * np.power(n, 4) + ) + * S1 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 1.7777777777777777 + * (18.0 + 59.0 * n + 31.0 * np.power(n, 2) + 10.0 * np.power(n, 3)) + * np.power(S1, 2) + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - ( + 5.333333333333333 + * ( + -2.0 + - 5.0 * n + + 42.0 * np.power(n, 2) + + 39.0 * np.power(n, 3) + + 2.0 * np.power(n, 4) + ) + * S2 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * (1.3333333333333333 * np.power(S1, 3) + 4.0 * S1 * S2 - 8.0 * S3) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + - 0.3333333333333333 + * nf + * ( + ( + 0.07407407407407407 + * ( + -34560.0 + - 158976.0 * n + - 355584.0 * np.power(n, 2) + - 562304.0 * np.power(n, 3) + - 735104.0 * np.power(n, 4) + - 694320.0 * np.power(n, 5) + - 490544.0 * np.power(n, 6) + - 207408.0 * np.power(n, 7) + + 82971.0 * np.power(n, 8) + + 205070.0 * np.power(n, 9) + + 159437.0 * np.power(n, 10) + + 77604.0 * np.power(n, 11) + + 25877.0 * np.power(n, 12) + + 5454.0 * np.power(n, 13) + + 531.0 * np.power(n, 14) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + - ( + 1.1851851851851851 + * ( + 78.0 + + 251.0 * n + + 303.0 * np.power(n, 2) + + 77.0 * np.power(n, 3) + + 19.0 * np.power(n, 4) + ) + * S1 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 3.5555555555555554 + * (6.0 + 22.0 * n + 11.0 * np.power(n, 2) + 5.0 * np.power(n, 3)) + * np.power(S1, 2) + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + + ( + 5.333333333333333 + * ( + -48.0 + - 72.0 * n + - 108.0 * np.power(n, 2) + - 128.0 * np.power(n, 3) + - 123.0 * np.power(n, 4) + + 8.0 * np.power(n, 5) + + 62.0 * np.power(n, 6) + + 24.0 * np.power(n, 7) + + np.power(n, 8) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + 0.8888888888888888 * np.power(S1, 3) + + 2.6666666666666665 * S1 * S2 + - 6.222222222222222 * S3 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + - 0.75 + * ( + ( + 0.5925925925925926 + * ( + 288.0 + + 1008.0 * n + + 80.0 * np.power(n, 2) + - 4560.0 * np.power(n, 3) + - 19122.0 * np.power(n, 4) + - 34963.0 * np.power(n, 5) + - 37157.0 * np.power(n, 6) + - 21724.0 * np.power(n, 7) + - 2662.0 * np.power(n, 8) + + 5168.0 * np.power(n, 9) + + 3634.0 * np.power(n, 10) + + 1035.0 * np.power(n, 11) + + 111.0 * np.power(n, 12) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 4) + ) + + ( + 0.5925925925925926 + * ( + 536.0 + + 1516.0 * n + + 3186.0 * np.power(n, 2) + + 3271.0 * np.power(n, 3) + + 1692.0 * np.power(n, 4) + + 487.0 * np.power(n, 5) + + 76.0 * np.power(n, 6) + ) + * S1 + ) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - ( + 3.5555555555555554 + * ( + 26.0 + + 82.0 * n + + 65.0 * np.power(n, 2) + + 23.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * np.power(S1, 2) + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - ( + 3.5555555555555554 + * ( + 48.0 + + 34.0 * n + + 40.0 * np.power(n, 2) + + 35.0 * np.power(n, 3) + + 84.0 * np.power(n, 4) + + 42.0 * np.power(n, 5) + + 5.0 * np.power(n, 6) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + (42.666666666666664 * (-4.0 - 1.0 * n + np.power(n, 2)) * Sm2) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - (7.111111111111111 * (10.0 + 8.0 * n + 5.0 * np.power(n, 2)) * Sm2) + / (n * (1.0 + n) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -1.3333333333333333 * np.power(S1, 3) + - 6.666666666666667 * S1 * S2 + - 5.333333333333333 * S21 + - 8.0 * S3 + - 10.666666666666666 * S1 * Sm2 + + 10.666666666666666 * Sm21 + - 10.666666666666666 * Sm3 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + - 0.75 + * nf + * ( + ( + 0.2962962962962963 + * ( + 576.0 + + 4128.0 * n + + 12416.0 * np.power(n, 2) + + 22080.0 * np.power(n, 3) + + 16644.0 * np.power(n, 4) + - 2110.0 * np.power(n, 5) + - 15710.0 * np.power(n, 6) + - 8917.0 * np.power(n, 7) + + 7139.0 * np.power(n, 8) + + 11990.0 * np.power(n, 9) + + 6742.0 * np.power(n, 10) + + 1845.0 * np.power(n, 11) + + 201.0 * np.power(n, 12) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 4) + ) + + ( + 0.5925925925925926 + * ( + 232.0 + + 776.0 * n + + 1878.0 * np.power(n, 2) + + 1820.0 * np.power(n, 3) + + 777.0 * np.power(n, 4) + + 176.0 * np.power(n, 5) + + 29.0 * np.power(n, 6) + ) + * S1 + ) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - ( + 1.7777777777777777 + * ( + 46.0 + + 131.0 * n + + 106.0 * np.power(n, 2) + + 43.0 * np.power(n, 3) + + 10.0 * np.power(n, 4) + ) + * np.power(S1, 2) + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - ( + 1.7777777777777777 + * ( + 48.0 + + 14.0 * n + + 17.0 * np.power(n, 2) + + 31.0 * np.power(n, 3) + + 105.0 * np.power(n, 4) + + 63.0 * np.power(n, 5) + + 10.0 * np.power(n, 6) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + (21.333333333333332 * (-4.0 - 1.0 * n + np.power(n, 2)) * Sm2) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - (7.111111111111111 * (10.0 + 8.0 * n + 5.0 * np.power(n, 2)) * Sm2) + / (n * (1.0 + n) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -0.8888888888888888 * np.power(S1, 3) + - 2.6666666666666665 * S1 * S2 + - 5.333333333333333 * S21 + - 4.444444444444445 * S3 + - 5.333333333333333 * S1 * Sm2 + + 5.333333333333333 * Sm21 + - 8.0 * Sm3 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + - 2.0 + * ( + ( + -7.212341418957566 + * ( + -248.0 + + 12.0 * n + - 214.0 * np.power(n, 2) + - 407.0 * np.power(n, 3) + - 91.0 * np.power(n, 4) + + 135.0 * np.power(n, 5) + + 45.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 0.018518518518518517 + * ( + 27648.0 + + 143424.0 * n + + 372192.0 * np.power(n, 2) + + 664624.0 * np.power(n, 3) + + 606016.0 * np.power(n, 4) + + 189820.0 * np.power(n, 5) + + 204230.0 * np.power(n, 6) + + 650149.0 * np.power(n, 7) + + 820775.0 * np.power(n, 8) + + 532170.0 * np.power(n, 9) + + 206656.0 * np.power(n, 10) + + 53973.0 * np.power(n, 11) + + 7299.0 * np.power(n, 12) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 0.2962962962962963 + * ( + 1944.0 + + 6156.0 * n + + 7122.0 * np.power(n, 2) + + 13.0 * np.power(n, 3) + - 2242.0 * np.power(n, 4) + + 4008.0 * np.power(n, 5) + + 6764.0 * np.power(n, 6) + + 4206.0 * np.power(n, 7) + + 1586.0 * np.power(n, 8) + + 251.0 * np.power(n, 9) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 0.4444444444444444 + * ( + 864.0 + + 2712.0 * n + + 3116.0 * np.power(n, 2) + + 4106.0 * np.power(n, 3) + + 2003.0 * np.power(n, 4) + - 1202.0 * np.power(n, 5) + - 592.0 * np.power(n, 6) + + 568.0 * np.power(n, 7) + + 441.0 * np.power(n, 8) + + 80.0 * np.power(n, 9) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + + ( + 0.8888888888888888 + * ( + -144.0 + - 496.0 * n + - 866.0 * np.power(n, 2) + - 499.0 * np.power(n, 3) + - 46.0 * np.power(n, 4) + + 11.0 * np.power(n, 5) + ) + * np.power(S1, 3) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + 1.3333333333333333 + * ( + 480.0 + + 1944.0 * n + + 4020.0 * np.power(n, 2) + + 6446.0 * np.power(n, 3) + + 7513.0 * np.power(n, 4) + + 4345.0 * np.power(n, 5) + + 462.0 * np.power(n, 6) + - 424.0 * np.power(n, 7) + - 43.0 * np.power(n, 8) + + 25.0 * np.power(n, 9) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 2.6666666666666665 + * (3.0 + n) + * ( + 8.0 + + 8.0 * n + + 52.0 * np.power(n, 2) + + 93.0 * np.power(n, 3) + + 114.0 * np.power(n, 4) + + 13.0 * np.power(n, 5) + ) + * S1 + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + (48.0 * np.power(2.0 + n + np.power(n, 2), 2) * S21) + / ((-1.0 + n) * n * (1.0 + n) * np.power(2.0 + n, 2)) + - ( + 0.8888888888888888 + * ( + 432.0 + - 452.0 * n + - 128.0 * np.power(n, 2) + + 977.0 * np.power(n, 3) + + 627.0 * np.power(n, 4) + + 195.0 * np.power(n, 5) + + 77.0 * np.power(n, 6) + ) + * S3 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 16.0 + * (-4.0 - 1.0 * n + np.power(n, 2)) + * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + * Sm2 + ) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + - ( + 16.0 + * ( + 12.0 + - 10.0 * n + - 54.0 * np.power(n, 2) + - 87.0 * np.power(n, 3) + - 40.0 * np.power(n, 4) + + 3.0 * np.power(n, 5) + ) + * Sm2 + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 64.0 + * (-2.0 - 14.0 * n - 13.0 * np.power(n, 2) + np.power(n, 3)) + * S1 + * Sm2 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 16.0 + * ( + 8.0 + + 20.0 * n + + 46.0 * np.power(n, 2) + + 27.0 * np.power(n, 3) + + 8.0 * np.power(n, 4) + + 3.0 * np.power(n, 5) + ) + * S1 + * Sm2 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + 16.0 + * ( + -12.0 + + 32.0 * n + + 39.0 * np.power(n, 2) + + 2.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + * Sm21 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + (2.0 + n + np.power(n, 2)) + * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + * (-7.212341418957566 - 8.0 * Sm3) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 16.0 + * ( + 8.0 + - 6.0 * n + - 5.0 * np.power(n, 2) + + 8.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + * Sm3 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + 28.849365675830263 * S1 + - 4.0 * np.power(S1, 4) + - 36.0 * np.power(S1, 2) * S2 + + 8.0 * np.power(S2, 2) + - 24.0 * S211 + - 8.0 * S31 + - 40.0 * np.power(S1, 2) * Sm2 + - 12.0 * np.power(Sm2, 2) + + S1 * (48.0 * S21 - 32.0 * S3 + 16.0 * Sm21) + + 32.0 * Sm211 + - 8.0 * Sm22 + - 8.0 * S1 * Sm3 + - 20.0 * Sm4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + - 0.8888888888888888 + * ( + (57.69873135166053 * (-1.0 + n) * (-2.0 + 3.0 * n + 3.0 * np.power(n, 2))) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + - ( + 0.5 + * ( + 96.0 + + 400.0 * n + + 1296.0 * np.power(n, 2) + + 3168.0 * np.power(n, 3) + + 5062.0 * np.power(n, 4) + + 6277.0 * np.power(n, 5) + + 6853.0 * np.power(n, 6) + + 5026.0 * np.power(n, 7) + + 2368.0 * np.power(n, 8) + + 793.0 * np.power(n, 9) + + 149.0 * np.power(n, 10) + ) + ) + / (np.power(n, 5) * np.power(1.0 + n, 5) * (2.0 + n)) + + ( + 8.0 + * ( + 24.0 + + 92.0 * n + + 172.0 * np.power(n, 2) + + 332.0 * np.power(n, 3) + + 529.0 * np.power(n, 4) + + 441.0 * np.power(n, 5) + + 179.0 * np.power(n, 6) + + 29.0 * np.power(n, 7) + + 2.0 * np.power(n, 8) + ) + * S1 + ) + / (np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + - ( + 8.0 + * ( + 22.0 + + 79.0 * n + + 135.0 * np.power(n, 2) + + 160.0 * np.power(n, 3) + + 97.0 * np.power(n, 4) + + 26.0 * np.power(n, 5) + + 5.0 * np.power(n, 6) + ) + * np.power(S1, 2) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + (64.0 * (1.0 + n) * np.power(S1, 3)) / (np.power(n, 2) * (2.0 + n)) + + ( + 4.0 + * ( + 28.0 + + 70.0 * n + + 96.0 * np.power(n, 2) + + 157.0 * np.power(n, 3) + + 75.0 * np.power(n, 4) + + 39.0 * np.power(n, 5) + + 23.0 * np.power(n, 6) + ) + * S2 + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 16.0 + * ( + -4.0 + - 18.0 * n + + 3.0 * np.power(n, 2) + + 10.0 * np.power(n, 3) + + np.power(n, 4) + ) + * S1 + * S2 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - (64.0 * (2.0 + n + np.power(n, 2)) * S21) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 8.0 + * (2.0 + 5.0 * n + np.power(n, 2)) + * (2.0 - 1.0 * n + 3.0 * np.power(n, 2)) + * S3 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 32.0 + * ( + 8.0 + - 2.0 * n + + np.power(n, 2) + - 1.0 * np.power(n, 3) + + 4.0 * np.power(n, 4) + + 2.0 * np.power(n, 5) + ) + * Sm2 + ) + / (np.power(n, 3) * np.power(1.0 + n, 2) * (2.0 + n)) + + ((2.0 - 1.0 * n + np.power(n, 2)) * (-128.0 * S1 * Sm2 + 128.0 * Sm21)) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - (64.0 * (-1.0 + n) * Sm3) / (np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + 2.0 * np.power(S1, 4) + + 4.0 * np.power(S1, 2) * S2 + + 6.0 * np.power(S2, 2) + + 24.0 * S211 + + S1 * (-32.0 * S21 + 24.0 * S3) + - 8.0 * S31 + + 20.0 * S4 + + 16.0 * S2 * Sm2 + + 8.0 * np.power(Sm2, 2) + - 16.0 * Sm22 + + 32.0 * S1 * Sm3 + - 32.0 * Sm31 + + 40.0 * Sm4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + - 4.5 + * ( + ( + 2.4041138063191885 + * ( + -624.0 + - 596.0 * n + - 956.0 * np.power(n, 2) + - 637.0 * np.power(n, 3) + - 111.0 * np.power(n, 4) + + 249.0 * np.power(n, 5) + + 83.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 0.14814814814814814 + * ( + 34560.0 + + 211392.0 * n + + 604032.0 * np.power(n, 2) + + 1.099952e6 * np.power(n, 3) + + 1.506496e6 * np.power(n, 4) + + 1.640548e6 * np.power(n, 5) + + 1.596952e6 * np.power(n, 6) + + 1.332497e6 * np.power(n, 7) + + 702425.0 * np.power(n, 8) + - 16829.0 * np.power(n, 9) + - 322813.0 * np.power(n, 10) + - 155710.0 * np.power(n, 11) + + 66350.0 * np.power(n, 12) + + 101719.0 * np.power(n, 13) + + 47251.0 * np.power(n, 14) + + 10527.0 * np.power(n, 15) + + 939.0 * np.power(n, 16) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 5) + ) + - ( + 0.2962962962962963 + * ( + 432.0 + + 7344.0 * n + + 4968.0 * np.power(n, 2) + - 26584.0 * np.power(n, 3) + - 33249.0 * np.power(n, 4) + - 44369.0 * np.power(n, 5) + - 71221.0 * np.power(n, 6) + - 71723.0 * np.power(n, 7) + - 31716.0 * np.power(n, 8) + + 13564.0 * np.power(n, 9) + + 22254.0 * np.power(n, 10) + + 9908.0 * np.power(n, 11) + + 2368.0 * np.power(n, 12) + + 296.0 * np.power(n, 13) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 4) + ) + + ( + 0.4444444444444444 + * ( + -864.0 + - 2016.0 * n + + 1132.0 * np.power(n, 2) + + 5904.0 * np.power(n, 3) + + 561.0 * np.power(n, 4) + - 4745.0 * np.power(n, 5) + - 448.0 * np.power(n, 6) + + 2710.0 * np.power(n, 7) + + 1897.0 * np.power(n, 8) + + 883.0 * np.power(n, 9) + + 170.0 * np.power(n, 10) + ) + * np.power(S1, 2) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 0.8888888888888888 + * ( + 8.0 + - 218.0 * n + - 139.0 * np.power(n, 2) + + 26.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * np.power(S1, 3) + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + 0.4444444444444444 + * ( + -2016.0 + - 6240.0 * n + - 5324.0 * np.power(n, 2) + - 2352.0 * np.power(n, 3) + - 861.0 * np.power(n, 4) + - 3047.0 * np.power(n, 5) + - 2692.0 * np.power(n, 6) + + 2506.0 * np.power(n, 7) + + 3091.0 * np.power(n, 8) + + 1213.0 * np.power(n, 9) + + 170.0 * np.power(n, 10) + ) + * S2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 2.6666666666666665 + * ( + -240.0 + - 368.0 * n + - 254.0 * np.power(n, 2) + - 319.0 * np.power(n, 3) + - 285.0 * np.power(n, 4) + + 15.0 * np.power(n, 5) + + 11.0 * np.power(n, 6) + ) + * S1 + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 5.333333333333333 + * (2.0 + n + np.power(n, 2)) + * ( + 24.0 + + 2.0 * n + + 13.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * S21 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 0.8888888888888888 + * ( + -1188.0 + - 1336.0 * n + - 1561.0 * np.power(n, 2) + - 899.0 * np.power(n, 3) + - 420.0 * np.power(n, 4) + + 165.0 * np.power(n, 5) + + 55.0 * np.power(n, 6) + ) + * S3 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 5.333333333333333 + * (-4.0 - 1.0 * n + np.power(n, 2)) + * ( + -24.0 + - 46.0 * n + - 35.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * Sm2 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + ( + 1.7777777777777777 + * ( + 648.0 + + 2916.0 * n + + 3802.0 * np.power(n, 2) + + 2731.0 * np.power(n, 3) + + 1381.0 * np.power(n, 4) + + 1517.0 * np.power(n, 5) + + 2086.0 * np.power(n, 6) + + 1508.0 * np.power(n, 7) + + 597.0 * np.power(n, 8) + + 94.0 * np.power(n, 9) + ) + * Sm2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 32.0 + * ( + -12.0 + + 4.0 * n + + 13.0 * np.power(n, 2) + - 32.0 * np.power(n, 3) + - 23.0 * np.power(n, 4) + + 2.0 * np.power(n, 5) + ) + * S1 + * Sm2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 5.333333333333333 + * ( + -48.0 + - 68.0 * n + - 24.0 * np.power(n, 2) + - 49.0 * np.power(n, 3) + + 34.0 * np.power(n, 4) + + 11.0 * np.power(n, 5) + ) + * S1 + * Sm2 + ) + / ((-1.0 + n) * np.power(n, 2) * (1.0 + n) * np.power(2.0 + n, 2)) + + ( + 5.333333333333333 + * ( + -72.0 + - 92.0 * n + - 194.0 * np.power(n, 2) + - 361.0 * np.power(n, 3) + - 189.0 * np.power(n, 4) + + 33.0 * np.power(n, 5) + + 11.0 * np.power(n, 6) + ) + * Sm21 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + -24.0 + - 46.0 * n + - 35.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * (-2.4041138063191885 - 2.6666666666666665 * Sm3) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 5.333333333333333 + * ( + -108.0 + - 176.0 * n + - 263.0 * np.power(n, 2) + - 247.0 * np.power(n, 3) + - 114.0 * np.power(n, 4) + + 33.0 * np.power(n, 5) + + 11.0 * np.power(n, 6) + ) + * Sm3 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -28.849365675830263 * S1 + + 2.0 * np.power(S1, 4) + + 32.0 * np.power(S1, 2) * S2 + + 2.0 * np.power(S2, 2) + + 16.0 * S31 + + 4.0 * S4 + + (40.0 * np.power(S1, 2) + 16.0 * S2) * Sm2 + + 12.0 * np.power(Sm2, 2) + + S1 * (-16.0 * S21 + 40.0 * S3 - 80.0 * Sm21) + + 96.0 * Sm211 + - 56.0 * Sm22 + + 72.0 * S1 * Sm3 + - 64.0 * Sm31 + + 44.0 * Sm4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + ) + return a_Hg_l0 + a_Hg_l1 * L + a_Hg_l2 * L**2 + a_Hg_l3 * L**3 diff --git a/src/eko/matching_conditions/as3/aHgstfac.py b/src/eko/matching_conditions/as3/aHgstfac.py new file mode 100644 index 000000000..eb057262b --- /dev/null +++ b/src/eko/matching_conditions/as3/aHgstfac.py @@ -0,0 +1,937 @@ +# -*- coding: utf-8 -*- +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def A_Hgstfac(n, sx, nf): + r""" + Computes the approximate incomplete part of :math:`A_{Hg}^{S,(3)}(N)` + proportional to various color factors. + The experssion is presented in cite:`ablinger2017heavy` (eq 3.1). + + When using the code, please cite the complete list of references + available in :mod:`eko.matching_conditions.as3`. + + Parameters + ---------- + n : complex + Mellin moment + sx : list + harmonic sums cache + + Returns + ------- + A_ggTF2 : complex + """ + S1, _ = sx[0] + S2, Sm2 = sx[1] + S3, S21, _, Sm21, _, Sm3 = sx[2] + S4, S31, S211, Sm22, Sm211, Sm31, Sm4 = sx[3] + return ( + (-1.0684950250307503 * (2.0 + n + np.power(n, 2))) / (n * (1.0 + n) * (2.0 + n)) + + 1.3333333333333333 + * ( + 0.25 + * ( + 1.6449340668482262 + * ( + ( + 0.2222222222222222 + * ( + 1728.0 + + 4992.0 * n + + 8944.0 * np.power(n, 2) + + 11680.0 * np.power(n, 3) + + 4444.0 * np.power(n, 4) + - 4900.0 * np.power(n, 5) + - 6377.0 * np.power(n, 6) + + 617.0 * np.power(n, 7) + + 6930.0 * np.power(n, 8) + + 6142.0 * np.power(n, 9) + + 2331.0 * np.power(n, 10) + + 333.0 * np.power(n, 11) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 8.88888888888889 + * (6.0 + 11.0 * n + 4.0 * np.power(n, 2) + np.power(n, 3)) + * S1 + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + ) + + ( + 1.6449340668482262 + * (2.0 + n + np.power(n, 2)) + * (-13.333333333333334 * np.power(S1, 2) + 8.0 * S2) + ) + / (n * (1.0 + n) * (2.0 + n)) + + nf + * ( + ( + 0.00411522633744856 + * ( + -1.24416e6 + - 7.865856e6 * n + - 2.3256576e7 * np.power(n, 2) + - 4.2534912e7 * np.power(n, 3) + - 5.3947712e7 * np.power(n, 4) + - 5.5711424e7 * np.power(n, 5) + - 4.075048e7 * np.power(n, 6) + - 1.0343664e7 * np.power(n, 7) + + 1.264032e7 * np.power(n, 8) + + 1.1884298e7 * np.power(n, 9) + - 2.970289e6 * np.power(n, 10) + - 1.0465411e7 * np.power(n, 11) + - 5.568833e6 * np.power(n, 12) + + 575913.0 * np.power(n, 13) + + 1.874085e6 * np.power(n, 14) + + 879391.0 * np.power(n, 15) + + 186525.0 * np.power(n, 16) + + 15777.0 * np.power(n, 17) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 6) + * np.power(1.0 + n, 6) + * np.power(2.0 + n, 5) + ) + - ( + 0.3950617283950617 + * ( + 141.0 + + 521.0 * n + + 789.0 * np.power(n, 2) + + 185.0 * np.power(n, 3) + + 10.0 * np.power(n, 4) + ) + * np.power(S1, 2) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 0.3950617283950617 + * ( + 24.0 + + 83.0 * n + + 49.0 * np.power(n, 2) + + 10.0 * np.power(n, 3) + ) + * np.power(S1, 3) + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + + 1.6449340668482262 + * ( + ( + 0.2222222222222222 + * (-2.0 + n) + * ( + 864.0 + + 3264.0 * n + + 6232.0 * np.power(n, 2) + + 9804.0 * np.power(n, 3) + + 10888.0 * np.power(n, 4) + + 9325.0 * np.power(n, 5) + + 6717.0 * np.power(n, 6) + + 3842.0 * np.power(n, 7) + + 1606.0 * np.power(n, 8) + + 405.0 * np.power(n, 9) + + 45.0 * np.power(n, 10) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 1.7777777777777777 + * ( + 12.0 + + 28.0 * n + + 11.0 * np.power(n, 2) + + 5.0 * np.power(n, 3) + ) + * S1 + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + ) + + ( + 0.2962962962962963 + * ( + -5184.0 + - 16992.0 * n + - 27808.0 * np.power(n, 2) + - 39024.0 * np.power(n, 3) + - 31384.0 * np.power(n, 4) + - 19422.0 * np.power(n, 5) + - 13965.0 * np.power(n, 6) + - 6819.0 * np.power(n, 7) + - 398.0 * np.power(n, 8) + + 1416.0 * np.power(n, 9) + + 547.0 * np.power(n, 10) + + 57.0 * np.power(n, 11) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + S1 + * ( + ( + -0.06584362139917696 + * ( + -2670.0 + - 10217.0 * n + - 7454.0 * np.power(n, 2) + - 5165.0 * np.power(n, 3) + - 924.0 * np.power(n, 4) + + 230.0 * np.power(n, 5) + ) + ) + / (np.power(n, 2) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 1.1851851851851851 + * ( + 24.0 + + 83.0 * n + + 49.0 * np.power(n, 2) + + 10.0 * np.power(n, 3) + ) + * S2 + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + ) + - (42.666666666666664 * (-2.0 - 3.0 * n + np.power(n, 2)) * S21) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - ( + 0.19753086419753085 + * ( + 3888.0 + + 5376.0 * n + + 6832.0 * np.power(n, 2) + + 7472.0 * np.power(n, 3) + + 9129.0 * np.power(n, 4) + + 1736.0 * np.power(n, 5) + - 2382.0 * np.power(n, 6) + - 976.0 * np.power(n, 7) + + 29.0 * np.power(n, 8) + ) + * S3 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + -8.772981689857207 * np.power(S1, 2) + - 1.1851851851851851 * np.power(S1, 4) + + 1.2020569031595942 + * ( + ( + -6.222222222222222 + * ( + -24.0 + - 28.0 * n + - 38.0 * np.power(n, 2) + - 17.0 * np.power(n, 3) + - 1.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * (2.0 + n) + ) + + 24.88888888888889 * S1 + ) + - 7.111111111111111 * np.power(S1, 2) * S2 + - 14.222222222222221 * np.power(S2, 2) + + 85.33333333333333 * S211 + + S1 * (-42.666666666666664 * S21 - 9.481481481481481 * S3) + - 42.666666666666664 * S31 + + 28.444444444444443 * S4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + ) + + 1.5 + * ( + ( + -212.26414844076453 + * ( + -16.0 + - 14.0 * np.power(n, 2) + - 25.0 * np.power(n, 3) + - 5.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + 1.6449340668482262 + * ( + ( + 0.05555555555555555 + * ( + 3552.0 + + 17200.0 * n + + 46032.0 * np.power(n, 2) + + 76456.0 * np.power(n, 3) + + 88078.0 * np.power(n, 4) + + 65115.0 * np.power(n, 5) + + 27752.0 * np.power(n, 6) + + 2506.0 * np.power(n, 7) + - 1566.0 * np.power(n, 8) + - 261.0 * np.power(n, 9) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 0.4444444444444444 + * ( + 288.0 + + 48.0 * n + - 3392.0 * np.power(n, 2) + - 5768.0 * np.power(n, 3) + - 3602.0 * np.power(n, 4) + + 1523.0 * np.power(n, 5) + + 5338.0 * np.power(n, 6) + + 4868.0 * np.power(n, 7) + + 2088.0 * np.power(n, 8) + + 337.0 * np.power(n, 9) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + + ( + 2.6666666666666665 + * ( + 36.0 + + 56.0 * n + + 29.0 * np.power(n, 2) + - 137.0 * np.power(n, 3) + - 120.0 * np.power(n, 4) + - 9.0 * np.power(n, 5) + + np.power(n, 6) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + -212.26414844076453 * S1 + + 1.6449340668482262 + * ( + 32.0 * np.power(S1, 3) + - ( + 12.0 + * ( + -4.0 + - 4.0 * n + - 3.0 * np.power(n, 2) + + 2.0 * np.power(n, 3) + + np.power(n, 4) + ) + * S2 + ) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + - 8.0 * S3 + + ( + (-8.0 * (1.0 + 3.0 * n + 3.0 * np.power(n, 2))) + / (n * (1.0 + n)) + + 16.0 * S1 + ) + * Sm2 + + 16.0 * Sm21 + - 8.0 * Sm3 + ) + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + ) + + 4.5 + * ( + ( + 77.92727282720195 + * (-2.0 + n) + * (3.0 + n) + * ( + 4.0 + + 4.0 * n + + 7.0 * np.power(n, 2) + + 6.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + 7.05120034829508 + * ( + -56.0 + - 20.0 * n + - 62.0 * np.power(n, 2) + - 75.0 * np.power(n, 3) + - 15.0 * np.power(n, 4) + + 27.0 * np.power(n, 5) + + 9.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + 1.6449340668482262 + * ( + ( + 0.2222222222222222 + * ( + -3456.0 + - 17184.0 * n + - 39184.0 * np.power(n, 2) + - 57200.0 * np.power(n, 3) + - 54000.0 * np.power(n, 4) + - 36634.0 * np.power(n, 5) + - 19177.0 * np.power(n, 6) + - 16952.0 * np.power(n, 7) + - 17658.0 * np.power(n, 8) + - 8937.0 * np.power(n, 9) + - 997.0 * np.power(n, 10) + + 1190.0 * np.power(n, 11) + + 552.0 * np.power(n, 12) + + 69.0 * np.power(n, 13) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 4) + ) + + ( + 0.4444444444444444 + * ( + -864.0 + - 2160.0 * n + + 680.0 * np.power(n, 2) + + 2820.0 * np.power(n, 3) + + 3078.0 * np.power(n, 4) + - 601.0 * np.power(n, 5) + - 809.0 * np.power(n, 6) + + 1298.0 * np.power(n, 7) + + 1124.0 * np.power(n, 8) + + 515.0 * np.power(n, 9) + + 103.0 * np.power(n, 10) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 1.3333333333333333 + * ( + -48.0 + - 116.0 * n + + 4.0 * np.power(n, 2) + - 85.0 * np.power(n, 3) + - 87.0 * np.power(n, 4) + + 33.0 * np.power(n, 5) + + 11.0 * np.power(n, 6) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + 184.0593470475842 * S1 + + 1.6449340668482262 + * ( + -16.0 * np.power(S1, 3) + - ( + 1.3333333333333333 + * ( + -48.0 + - 70.0 * n + - 59.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + * S2 + ) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + - 32.0 * S1 * S2 + - 8.0 * S3 + + ( + ( + -2.6666666666666665 + * ( + -36.0 + - 58.0 * n + - 47.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + ) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + - 48.0 * S1 + ) + * Sm2 + + 16.0 * Sm21 + - 8.0 * Sm3 + ) + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 0.8888888888888888 + * ( + (106.13207422038226 * (-1.0 + n) * (-2.0 + 3.0 * n + 3.0 * np.power(n, 2))) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + + 1.6449340668482262 + * ( + ( + 0.5 + * ( + 48.0 + + 184.0 * n + + 176.0 * np.power(n, 2) + - 222.0 * np.power(n, 3) + - 947.0 * np.power(n, 4) + - 1374.0 * np.power(n, 5) + - 1196.0 * np.power(n, 6) + - 612.0 * np.power(n, 7) + - 153.0 * np.power(n, 8) + ) + ) + / (np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + + ( + 8.0 + * ( + -10.0 + - 29.0 * n + - 21.0 * np.power(n, 2) + + 8.0 * np.power(n, 3) + + 39.0 * np.power(n, 4) + + 36.0 * np.power(n, 5) + + 13.0 * np.power(n, 6) + ) + * S1 + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 4.0 + * ( + 20.0 + + 48.0 * n + + 43.0 * np.power(n, 2) + + 14.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + * np.power(S1, 2) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + ( + 1.6449340668482262 + * (2.0 + n + np.power(n, 2)) + * ( + -16.0 * np.power(S1, 3) + - (8.0 * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) * S2) + / (n * (1.0 + n)) + + 32.0 * S1 * S2 + + 16.0 * S3 + + (-16.0 / (n * (1.0 + n)) + 32.0 * S1) * Sm2 + - 32.0 * Sm21 + + 16.0 * Sm3 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + + 0.75 + * ( + 1.6449340668482262 + * ( + ( + -0.4444444444444444 + * ( + 672.0 + + 3008.0 * n + + 5352.0 * np.power(n, 2) + + 6500.0 * np.power(n, 3) + + 5180.0 * np.power(n, 4) + + 3171.0 * np.power(n, 5) + + 2134.0 * np.power(n, 6) + + 1148.0 * np.power(n, 7) + + 414.0 * np.power(n, 8) + + 69.0 * np.power(n, 9) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + + ( + 17.77777777777778 + * ( + 4.0 + - 1.0 * n + + np.power(n, 2) + + 4.0 * np.power(n, 3) + + np.power(n, 4) + ) + * S1 + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + ) + + ( + 1.6449340668482262 + * (2.0 + n + np.power(n, 2)) + * ( + 13.333333333333334 * np.power(S1, 2) + + 13.333333333333334 * S2 + + 26.666666666666668 * Sm2 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + + nf + * ( + ( + -0.03292181069958848 + * ( + 3456.0 + + 18432.0 * n + + 33504.0 * np.power(n, 2) + - 22912.0 * np.power(n, 3) + - 281016.0 * np.power(n, 4) + - 465872.0 * np.power(n, 5) + - 806374.0 * np.power(n, 6) + - 1.459136e6 * np.power(n, 7) + - 1.48494e6 * np.power(n, 8) + - 377441.0 * np.power(n, 9) + + 849246.0 * np.power(n, 10) + + 1.139033e6 * np.power(n, 11) + + 692290.0 * np.power(n, 12) + + 237011.0 * np.power(n, 13) + + 44514.0 * np.power(n, 14) + + 3597.0 * np.power(n, 15) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 5) + ) + + ( + 0.09876543209876543 + * ( + 1256.0 + + 3172.0 * n + + 6816.0 * np.power(n, 2) + + 6430.0 * np.power(n, 3) + + 2355.0 * np.power(n, 4) + + 271.0 * np.power(n, 5) + + 22.0 * np.power(n, 6) + ) + * np.power(S1, 2) + ) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - ( + 0.19753086419753085 + * ( + 134.0 + + 439.0 * n + + 344.0 * np.power(n, 2) + + 107.0 * np.power(n, 3) + + 20.0 * np.power(n, 4) + ) + * np.power(S1, 3) + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + 1.6449340668482262 + * ( + ( + -0.4444444444444444 + * ( + 96.0 + + 224.0 * n + - 48.0 * np.power(n, 2) + - 244.0 * np.power(n, 3) + - 610.0 * np.power(n, 4) + - 501.0 * np.power(n, 5) + - 32.0 * np.power(n, 6) + + 146.0 * np.power(n, 7) + + 90.0 * np.power(n, 8) + + 15.0 * np.power(n, 9) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 1.7777777777777777 + * ( + 20.0 + + 76.0 * n + + 59.0 * np.power(n, 2) + + 20.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * S1 + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + ) + + ( + 0.09876543209876543 + * ( + -1728.0 + - 4032.0 * n + - 3128.0 * np.power(n, 2) + - 6644.0 * np.power(n, 3) + + 7720.0 * np.power(n, 4) + + 15770.0 * np.power(n, 5) + + 6901.0 * np.power(n, 6) + + 806.0 * np.power(n, 7) + - 117.0 * np.power(n, 8) + + 4.0 * np.power(n, 9) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + + S1 + * ( + ( + 0.06584362139917696 + * ( + 864.0 + - 2672.0 * n + - 11408.0 * np.power(n, 2) + - 73764.0 * np.power(n, 3) + - 73982.0 * np.power(n, 4) + + 29418.0 * np.power(n, 5) + + 87216.0 * np.power(n, 6) + + 61598.0 * np.power(n, 7) + + 23603.0 * np.power(n, 8) + + 5292.0 * np.power(n, 9) + + 491.0 * np.power(n, 10) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 4) + ) + - ( + 0.5925925925925926 + * ( + 214.0 + + 779.0 * n + + 544.0 * np.power(n, 2) + + 151.0 * np.power(n, 3) + + 40.0 * np.power(n, 4) + ) + * S2 + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + ) + - ( + 2.3703703703703702 + * ( + 20.0 + + 85.0 * n + + 50.0 * np.power(n, 2) + + 11.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * S21 + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - ( + 0.3950617283950617 + * ( + 648.0 + + 496.0 * n + + 370.0 * np.power(n, 2) + + 725.0 * np.power(n, 3) + + 1155.0 * np.power(n, 4) + + 429.0 * np.power(n, 5) + + 65.0 * np.power(n, 6) + ) + * S3 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + 0.3950617283950617 + * ( + 448.0 + + 284.0 * n + + 1794.0 * np.power(n, 2) + + 2552.0 * np.power(n, 3) + + 1257.0 * np.power(n, 4) + + 278.0 * np.power(n, 5) + + 47.0 * np.power(n, 6) + ) + * Sm2 + ) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + ( + 1.1851851851851851 + * ( + 216.0 + - 20.0 * n + - 548.0 * np.power(n, 2) + - 511.0 * np.power(n, 3) + - 339.0 * np.power(n, 4) + - 99.0 * np.power(n, 5) + + 5.0 * np.power(n, 6) + ) + * Sm3 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - ( + 7.111111111111111 + * ( + 36.0 + - 20.0 * n + - 143.0 * np.power(n, 2) + - 61.0 * np.power(n, 3) + - 24.0 * np.power(n, 4) + - 9.0 * np.power(n, 5) + + 5.0 * np.power(n, 6) + ) + * (S1 * Sm2 - 1.0 * Sm21 + Sm3) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + 1.2020569031595942 + * ( + (49.77777777777778 * (1.0 + n + np.power(n, 2))) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + - 24.88888888888889 * S1 + ) + + 1.1851851851851851 * np.power(S1, 4) + + 19.555555555555557 * np.power(S1, 2) * S2 + + 8.88888888888889 * np.power(S2, 2) + - 46.22222222222222 * S211 + + S1 * (24.88888888888889 * S21 + 69.92592592592592 * S3) + - 3.5555555555555554 * S31 + + 71.11111111111111 * S4 + + ( + (-64.0 * (-1.0 + 2.0 * n) * S1) / ((-1.0 + n) * n) + + 42.666666666666664 * S2 + ) + * Sm2 + + 1.6449340668482262 + * ( + 5.333333333333333 * np.power(S1, 2) + + 5.333333333333333 * S2 + + 10.666666666666666 * Sm2 + ) + + (64.0 * (-1.0 + 2.0 * n) * Sm21) / ((-1.0 + n) * n) + + 7.111111111111111 * Sm4 + - 21.333333333333332 * (S2 * Sm2 - 1.0 * Sm22 + Sm4) + - 10.666666666666666 * (S1 * Sm3 - 1.0 * Sm31 + Sm4) + + 64.0 + * ( + S2 * Sm2 + - 0.5 * (np.power(S1, 2) + S2) * Sm2 + + Sm211 + - 1.0 * Sm22 + + S1 * (S1 * Sm2 - 1.0 * Sm21 + Sm3) + - 1.0 * Sm31 + + Sm4 + ) + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + ) + ) diff --git a/src/eko/matching_conditions/as3/aHq.py b/src/eko/matching_conditions/as3/aHq.py new file mode 100644 index 000000000..09702bdb2 --- /dev/null +++ b/src/eko/matching_conditions/as3/aHq.py @@ -0,0 +1,2088 @@ +# -*- coding: utf-8 -*- +# pylint: disable=too-many-lines +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def A_Hq(n, sx, nf, L): # pylint: disable=too-many-locals + r""" + Computes the |N3LO| singlet |OME| :math:`A_{Hq}^{S,(3)}(N)`. + The experssion is presented in :cite:`Ablinger_2015` (eq 5.1) + and :cite:`Blumlein:2017wxd` (eq 3.1). + + When using the code, please cite the complete list of references + available in :mod:`eko.matching_conditions.as3`. + + Parameters + ---------- + n : complex + Mellin moment + sx : list + harmonic sums cache + nf : int + number of active flavor below the threshold + L : float + :math:`\ln(\mu_F^2 / m_h^2)` + + Returns + ------- + A_Hq : complex + :math:`A_{Hq}^{S,(3)}(N)` + """ + S1, _ = sx[0] + S2, Sm2 = sx[1] + S3, S21, _, Sm21, _, Sm3 = sx[2] + S4, S31, S211, Sm22, Sm211, Sm31, Sm4 = sx[3] + S5, _ = sx[4] + + # fit of: + # 2^-N * ( H1 + 8.41439832211716) + # with_ + # H1 = S111l211 + S12l21 - S21l21 - S3l2 + H1fit = -( + 510293.43726255593 + - 5915.11168241528 / n**6 + + 33646.895861267105 / n**5 + - 94189.35516864149 / n**4 + + 168450.87857184012 / n**3 + - 188441.14940576284 / n**2 + + 26762.00346212842 / n + - 0.46328880737715383 * np.log(n) + - 0.2678498730023523 * np.log(n) ** 2 + + 0.02148061287110971 * np.log(n) ** 3 + - 0.0006754153597171009 * np.log(n) ** 4 + + 2.022675964189347 * S1 + + 26765.31463304929 * S2 + - 350138.44481493114 * S3 + - 33034.748321832885 * S4 + - 94205.95027238235 * S5 + ) + + # fit of: + # H2fit = prefactor * (-32.0 * H2 + 269.261 * S1l05) + # H3fit = prefactor * (64.0 * H2 - 538.521 * S1l05) + # + # with: + # prefactor = (2.0 + n + np.power(n, 2)) ** 2 / ( + # (-1 + n) * (1 + n) ** 2 * n ** 2 * (2 + n) + # H26 = S211l2051 + S211l2105 - S22l205 + # H27 = + S1111l21105 + S112l2051 - S112l2105 + S121l2105 - S13l205 + # H2 = (-H26 + H27 + S1111l20511 + S1111l21051 - S121l2051 - S31l205) - S1l05 * H1 ) + H2fit = ( + 1.0 + / (n - 1.0) + * ( + -1.2122995321654172e9 + - 1.6321515740311185e6 / n**6 + + 1.2421028124707704e7 / n**5 + - 4.994381534440697e7 / n**4 + + 1.4346480588676238e8 / n**3 + - 3.334513742914795e8 / n**2 + + 6.702141229565731e8 / n + + 8977.499795321732 * np.log(n) + + 0.2193175885121321 * np.log(n) ** 2 + - 0.01870057746554005 * np.log(n) ** 3 + + 0.0006132249418581175 * np.log(n) ** 4 + - 8978.67658145791 * S1 + + 6.702093972527187e8 * S2 + + 3.3097692381650484e6 * S3 + + 1.0024220054647666e8 * S4 + - 2.52529244632317e6 * S5 + ) + ) + H3fit = ( + 1.0 + / (n - 1.0) + * ( + 2.4245990643308344e9 + + 3.264303148062237e6 / n**6 + - 2.484205624941541e7 / n**5 + + 9.988763068881394e7 / n**4 + - 2.8692961177352476e8 / n**3 + + 6.66902748582959e8 / n**2 + - 1.3404282459131463e9 / n + - 17954.999590643463 * np.log(n) + - 0.4386351770242642 * np.log(n) ** 2 + + 0.037401154931080 * np.log(n) ** 3 + - 0.001226449883716235 * np.log(n) ** 4 + + 17957.35316291582 * S1 + - 1.3404187945054374e9 * S2 + - 6.619538476330097e6 * S3 + - 2.0048440109295332e8 * S4 + + 5.05058489264634e6 * S5 + ) + ) + a_Hq_l0 = ( + 0.3333333333333333 + * nf + * ( + ( + 2.9243272299524024 + * ( + -48.0 + - 104.0 * n + - 56.0 * np.power(n, 2) + - 86.0 * np.power(n, 3) + - 11.0 * np.power(n, 4) + + 68.0 * np.power(n, 5) + + 37.0 * np.power(n, 6) + + 8.0 * np.power(n, 7) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 0.13168724279835392 + * ( + -6912.0 + - 35712.0 * n + - 77952.0 * np.power(n, 2) + - 84608.0 * np.power(n, 3) + - 24944.0 * np.power(n, 4) + - 12856.0 * np.power(n, 5) + - 8896.0 * np.power(n, 6) + + 59452.0 * np.power(n, 7) + + 89880.0 * np.power(n, 8) + + 56186.0 * np.power(n, 9) + + 23003.0 * np.power(n, 10) + + 7714.0 * np.power(n, 11) + + 1663.0 * np.power(n, 12) + + 158.0 * np.power(n, 13) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + - ( + 0.3950617283950617 + * ( + 576.0 + + 2112.0 * n + + 3040.0 * np.power(n, 2) + + 1648.0 * np.power(n, 3) + + 2244.0 * np.power(n, 4) + + 1848.0 * np.power(n, 5) + - 20.0 * np.power(n, 6) + + 30.0 * np.power(n, 7) + + 417.0 * np.power(n, 8) + + 176.0 * np.power(n, 9) + + 25.0 * np.power(n, 10) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 0.5925925925925926 + * ( + -48.0 + - 104.0 * n + - 56.0 * np.power(n, 2) + - 86.0 * np.power(n, 3) + - 11.0 * np.power(n, 4) + + 68.0 * np.power(n, 5) + + 37.0 * np.power(n, 6) + + 8.0 * np.power(n, 7) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 7.703703703703703 + * ( + -48.0 + - 104.0 * n + - 56.0 * np.power(n, 2) + - 86.0 * np.power(n, 3) + - 11.0 * np.power(n, 4) + + 68.0 * np.power(n, 5) + + 37.0 * np.power(n, 6) + + 8.0 * np.power(n, 7) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + 29.917860700861013 + - 8.772981689857207 * S1 + - 0.5925925925925926 * np.power(S1, 3) + - 23.11111111111111 * S1 * S2 + - 65.18518518518519 * S3 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 0.3333333333333333 + * ( + ( + -5.848654459904805 + * ( + 24.0 + + 124.0 * n + + 162.0 * np.power(n, 2) + + 193.0 * np.power(n, 3) + + 84.0 * np.power(n, 4) + + 29.0 * np.power(n, 5) + + 8.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + 1.1851851851851851 + * ( + ( + -0.2222222222222222 + * ( + 207360.0 + + 1.026432e6 * n + + 2.192832e6 * np.power(n, 2) + + 3.109248e6 * np.power(n, 3) + + 4.514336e6 * np.power(n, 4) + + 8.472792e6 * np.power(n, 5) + + 1.2693884e7 * np.power(n, 6) + + 1.2958212e7 * np.power(n, 7) + + 9.333994e6 * np.power(n, 8) + + 4.877344e6 * np.power(n, 9) + + 1.87144e6 * np.power(n, 10) + + 559575.0 * np.power(n, 11) + + 145948.0 * np.power(n, 12) + + 32280.0 * np.power(n, 13) + + 4670.0 * np.power(n, 14) + + 293.0 * np.power(n, 15) + ) + ) + / (np.power(n, 5) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + + ( + 0.6666666666666666 + * ( + -17280.0 + - 76896.0 * n + - 82368.0 * np.power(n, 2) + + 155864.0 * np.power(n, 3) + + 599060.0 * np.power(n, 4) + + 886552.0 * np.power(n, 5) + + 837697.0 * np.power(n, 6) + + 553796.0 * np.power(n, 7) + + 251778.0 * np.power(n, 8) + + 79990.0 * np.power(n, 9) + + 20431.0 * np.power(n, 10) + + 4658.0 * np.power(n, 11) + + 746.0 * np.power(n, 12) + + 52.0 * np.power(n, 13) + ) + * S1 + ) + / (np.power(n, 4) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + - ( + 1.0 + * ( + -7200.0 + - 3960.0 * n + + 22748.0 * np.power(n, 2) + + 37370.0 * np.power(n, 3) + + 40683.0 * np.power(n, 4) + + 34749.0 * np.power(n, 5) + + 18410.0 * np.power(n, 6) + + 5724.0 * np.power(n, 7) + + 1095.0 * np.power(n, 8) + + 133.0 * np.power(n, 9) + + 8.0 * np.power(n, 10) + ) + * np.power(S1, 2) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + + ( + ( + 7200.0 + - 26280.0 * n + - 46100.0 * np.power(n, 2) + - 47454.0 * np.power(n, 3) + - 33693.0 * np.power(n, 4) + - 7014.0 * np.power(n, 5) + + 5392.0 * np.power(n, 6) + + 3284.0 * np.power(n, 7) + + 625.0 * np.power(n, 8) + + 40.0 * np.power(n, 9) + ) + * S2 + ) + / (np.power(n, 3) * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + ) + ) + / ((-1.0 + n) * (3.0 + n) * (4.0 + n) * (5.0 + n)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + -136.76736320393604 + + 17.545963379714415 * S1 + + 1.1851851851851851 * np.power(S1, 3) + - 17.77777777777778 * S1 * S2 + + 42.666666666666664 * S21 + - 18.962962962962962 * S3 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 0.3333333333333333 + * ( + ( + 5.848654459904805 + * ( + 24.0 + + 124.0 * n + + 162.0 * np.power(n, 2) + + 193.0 * np.power(n, 3) + + 84.0 * np.power(n, 4) + + 29.0 * np.power(n, 5) + + 8.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + ( + 0.3950617283950617 + * ( + 864.0 + + 5616.0 * n + + 15984.0 * np.power(n, 2) + + 32344.0 * np.power(n, 3) + + 63406.0 * np.power(n, 4) + + 128195.0 * np.power(n, 5) + + 192416.0 * np.power(n, 6) + + 196942.0 * np.power(n, 7) + + 148026.0 * np.power(n, 8) + + 87182.0 * np.power(n, 9) + + 39593.0 * np.power(n, 10) + + 12793.0 * np.power(n, 11) + + 2599.0 * np.power(n, 12) + + 248.0 * np.power(n, 13) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + - ( + 1.1851851851851851 + * (2.0 + n + np.power(n, 2)) + * ( + 86.0 + + 230.0 * n + + 224.0 * np.power(n, 2) + + 105.0 * np.power(n, 3) + + 43.0 * np.power(n, 4) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 4) * (2.0 + n)) + + ( + 1.7777777777777777 + * (2.0 + n + np.power(n, 2)) + * (16.0 + 27.0 * n + 13.0 * np.power(n, 2) + 8.0 * np.power(n, 3)) + * np.power(S1, 2) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 1.7777777777777777 + * ( + 96.0 + + 400.0 * n + + 628.0 * np.power(n, 2) + + 796.0 * np.power(n, 3) + + 565.0 * np.power(n, 4) + + 158.0 * np.power(n, 5) + + 37.0 * np.power(n, 6) + + 8.0 * np.power(n, 7) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + 17.095920400492005 + - 17.545963379714415 * S1 + - 1.7777777777777777 * np.power(S1, 3) + - 5.333333333333333 * S1 * S2 + + 17.77777777777778 * S3 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 0.3333333333333333 + * nf + * ( + ( + -2.9243272299524024 + * ( + -48.0 + - 104.0 * n + - 56.0 * np.power(n, 2) + - 86.0 * np.power(n, 3) + - 11.0 * np.power(n, 4) + + 68.0 * np.power(n, 5) + + 37.0 * np.power(n, 6) + + 8.0 * np.power(n, 7) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 10.666666666666666 + * ( + -32.0 + - 208.0 * n + - 592.0 * np.power(n, 2) + - 904.0 * np.power(n, 3) + - 682.0 * np.power(n, 4) + - 473.0 * np.power(n, 5) + - 400.0 * np.power(n, 6) + + 38.0 * np.power(n, 7) + + 374.0 * np.power(n, 8) + + 252.0 * np.power(n, 9) + + 62.0 * np.power(n, 10) + + 5.0 * np.power(n, 11) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + + ( + 21.333333333333332 + * (2.0 + 5.0 * n + np.power(n, 2)) + * (4.0 + 4.0 * n + 7.0 * np.power(n, 2) + 5.0 * np.power(n, 3)) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * (4.273980100123001 + 8.772981689857207 * S1 + 21.333333333333332 * S3) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 0.8888888888888888 + * ( + ( + -1.6027425375461255 + * np.power(2.0 + n + np.power(n, 2), 2) + * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 3.2898681336964524 + * (2.0 + n + np.power(n, 2)) + * ( + -12.0 + - 28.0 * n + + 21.0 * np.power(n, 2) + + 106.0 * np.power(n, 3) + + 151.0 * np.power(n, 4) + + 108.0 * np.power(n, 5) + + 38.0 * np.power(n, 6) + ) + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + + ( + 4.0 + * ( + 32.0 + + 240.0 * n + + 496.0 * np.power(n, 2) + - 72.0 * np.power(n, 3) + - 1254.0 * np.power(n, 4) + + 339.0 * np.power(n, 5) + + 6106.0 * np.power(n, 6) + + 11692.0 * np.power(n, 7) + + 13272.0 * np.power(n, 8) + + 10762.0 * np.power(n, 9) + + 6049.0 * np.power(n, 10) + + 2139.0 * np.power(n, 11) + + 443.0 * np.power(n, 12) + + 56.0 * np.power(n, 13) + + 4.0 * np.power(n, 14) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 6) + * np.power(1.0 + n, 6) + * np.power(2.0 + n, 3) + ) + + ( + 6.579736267392905 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 + - 10.0 * n + + np.power(n, 2) + + 4.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 8.0 + * (2.0 + n + np.power(n, 2)) + * ( + -12.0 + - 44.0 * n + - 19.0 * np.power(n, 2) + - 11.0 * np.power(n, 3) + - 2.0 * np.power(n, 4) + + 2.0 * np.power(n, 5) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 4) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -4.0 + - 18.0 * n + - 32.0 * np.power(n, 2) + - 5.0 * np.power(n, 3) + + np.power(n, 4) + ) + * np.power(S1, 2) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 + - 20.0 * n + - 8.0 * np.power(n, 2) + + 56.0 * np.power(n, 3) + + 135.0 * np.power(n, 4) + + 102.0 * np.power(n, 5) + + 27.0 * np.power(n, 6) + ) + * S2 + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + + ( + (2.0 + 3.0 * n) + * (2.0 + n + np.power(n, 2)) + * (-2.6666666666666665 * np.power(S1, 3) - 8.0 * S1 * S2) + ) + / ((-1.0 + n) * np.power(n, 3) * (1.0 + n) * (2.0 + n)) + + ( + 32.0 + * (-2.0 - 3.0 * n + np.power(n, 2)) + * (2.0 + n + np.power(n, 2)) + * S21 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 2.6666666666666665 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 + - 22.0 * n + + 43.0 * np.power(n, 2) + + 48.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + * S3 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + 6.410970150184502 * S1 + + 0.6666666666666666 * np.power(S1, 4) + + 1.6449340668482262 * (4.0 * np.power(S1, 2) - 12.0 * S2) + + 4.0 * np.power(S1, 2) * S2 + + 2.0 * np.power(S2, 2) + - 64.0 * S211 + + S1 * (32.0 * S21 + 5.333333333333333 * S3) + + 32.0 * S31 + - 12.0 * S4 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 0.8888888888888888 + * ( + ( + 1.6027425375461255 + * ( + -1072.0 + - 1008.0 * n + - 4120.0 * np.power(n, 2) + - 7320.0 * np.power(n, 3) + - 3299.0 * np.power(n, 4) + - 1487.0 * np.power(n, 5) + - 1089.0 * np.power(n, 6) + - 45.0 * np.power(n, 7) + + 192.0 * np.power(n, 8) + + 48.0 * np.power(n, 9) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 1.3333333333333333 + * ( + -1728.0 + - 13504.0 * n + - 45232.0 * np.power(n, 2) + - 83504.0 * np.power(n, 3) + - 88676.0 * np.power(n, 4) + - 48500.0 * np.power(n, 5) + + 9415.0 * np.power(n, 6) + + 50675.0 * np.power(n, 7) + + 57974.0 * np.power(n, 8) + + 41400.0 * np.power(n, 9) + + 25694.0 * np.power(n, 10) + + 18236.0 * np.power(n, 11) + + 11443.0 * np.power(n, 12) + + 4569.0 * np.power(n, 13) + + 978.0 * np.power(n, 14) + + 88.0 * np.power(n, 15) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 6) + * np.power(1.0 + n, 6) + * np.power(2.0 + n, 4) + ) + - ( + 1.3333333333333333 + * ( + 192.0 + + 256.0 * n + + 176.0 * np.power(n, 2) + + 840.0 * np.power(n, 3) + + 944.0 * np.power(n, 4) + + 490.0 * np.power(n, 5) + + 662.0 * np.power(n, 6) + + 735.0 * np.power(n, 7) + + 363.0 * np.power(n, 8) + + 75.0 * np.power(n, 9) + + 3.0 * np.power(n, 10) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + ( + -0.4444444444444444 + * ( + -8.0 + - 10.0 * n + + np.power(n, 2) + + 4.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * np.power(S1, 3) + ) + / (n * (1.0 + n)) + + 1.6449340668482262 + * ( + ( + 2.0 + * ( + -12.0 + - 28.0 * n + + 21.0 * np.power(n, 2) + + 106.0 * np.power(n, 3) + + 151.0 * np.power(n, 4) + + 108.0 * np.power(n, 5) + + 38.0 * np.power(n, 6) + ) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + - ( + 4.0 + * ( + -8.0 + - 10.0 * n + + np.power(n, 2) + + 4.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * S1 + ) + / (n * (1.0 + n)) + ) + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 1.3333333333333333 + * ( + -1664.0 + - 6240.0 * n + - 12272.0 * np.power(n, 2) + - 16088.0 * np.power(n, 3) + - 11660.0 * np.power(n, 4) + - 3976.0 * np.power(n, 5) + + 1084.0 * np.power(n, 6) + + 3411.0 * np.power(n, 7) + + 2811.0 * np.power(n, 8) + + 1049.0 * np.power(n, 9) + + 153.0 * np.power(n, 10) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + S1 + * ( + ( + 2.6666666666666665 + * ( + 896.0 + + 4672.0 * n + + 10880.0 * np.power(n, 2) + + 16352.0 * np.power(n, 3) + + 16824.0 * np.power(n, 4) + + 16388.0 * np.power(n, 5) + + 15420.0 * np.power(n, 6) + + 11172.0 * np.power(n, 7) + + 7260.0 * np.power(n, 8) + + 4893.0 * np.power(n, 9) + + 2549.0 * np.power(n, 10) + + 819.0 * np.power(n, 11) + + 151.0 * np.power(n, 12) + + 12.0 * np.power(n, 13) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + - ( + 1.3333333333333333 + * ( + -288.0 + - 904.0 * n + - 844.0 * np.power(n, 2) + - 530.0 * np.power(n, 3) + - 159.0 * np.power(n, 4) + + 229.0 * np.power(n, 5) + + 271.0 * np.power(n, 6) + + 81.0 * np.power(n, 7) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + ) + + ( + 10.666666666666666 + * ( + 88.0 + + 180.0 * n + + 250.0 * np.power(n, 2) + + 283.0 * np.power(n, 3) + + 114.0 * np.power(n, 4) + + 59.0 * np.power(n, 5) + + 84.0 * np.power(n, 6) + + 40.0 * np.power(n, 7) + + 6.0 * np.power(n, 8) + ) + * S21 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 1.7777777777777777 + * ( + 56.0 + + 444.0 * n + - 1074.0 * np.power(n, 2) + - 2859.0 * np.power(n, 3) + - 2063.0 * np.power(n, 4) + - 663.0 * np.power(n, 5) + + 293.0 * np.power(n, 6) + + 478.0 * np.power(n, 7) + + 216.0 * np.power(n, 8) + + 36.0 * np.power(n, 9) + ) + * S3 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + # + ( + # np.power(2.0, 5.0 - 1.0 * n) + # * ( + # 4.0 + # - 2.0 * n + # + 10.0 * np.power(n, 2) + # - 1.0 * np.power(n, 3) + # + np.power(n, 5) + # ) + # * (8.41439832211716 + H1) + # ) + + np.power(2.0, 5.0) + * H1fit + * (4.0 - 2.0 * n + 10.0 * np.power(n, 2) - np.power(n, 3) + np.power(n, 5)) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 2)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + 212.26414844076453 + - 0.2222222222222222 * np.power(S1, 4) + + 1.2020569031595942 * 37.333333333333336 * S1 # - 448.0 * S1l05) + - 6.666666666666667 * np.power(S1, 2) * S2 + + 15.333333333333334 * np.power(S2, 2) + + 1.6449340668482262 * (-4.0 * np.power(S1, 2) + 12.0 * S2) + + 138.66666666666666 * S211 + + S1 * (-64.0 * S21 + 8.88888888888889 * S3) + # + 64.0 * (H2) + + 41.333333333333336 * S4 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + H3fit + ) + + 2.0 + * ( + ( + -1.0684950250307503 + * (2.0 + n + np.power(n, 2)) + * ( + -24.0 + - 80.0 * n + - 200.0 * np.power(n, 2) + + 68.0 * np.power(n, 3) + + 75.0 * np.power(n, 4) + + 6.0 * np.power(n, 5) + + 11.0 * np.power(n, 6) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 0.7310818074881006 + * ( + 864.0 + + 4656.0 * n + + 9680.0 * np.power(n, 2) + + 12552.0 * np.power(n, 3) + + 9334.0 * np.power(n, 4) + + 4491.0 * np.power(n, 5) + - 934.0 * np.power(n, 6) + - 1109.0 * np.power(n, 7) + + 2196.0 * np.power(n, 8) + + 2251.0 * np.power(n, 9) + + 820.0 * np.power(n, 10) + + 127.0 * np.power(n, 11) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 2.6666666666666665 + * ( + 384.0 + + 3584.0 * n + + 14816.0 * np.power(n, 2) + + 34528.0 * np.power(n, 3) + + 46456.0 * np.power(n, 4) + + 32640.0 * np.power(n, 5) + + 5554.0 * np.power(n, 6) + - 11770.0 * np.power(n, 7) + - 27469.0 * np.power(n, 8) + - 36527.0 * np.power(n, 9) + - 17182.0 * np.power(n, 10) + + 11176.0 * np.power(n, 11) + + 19051.0 * np.power(n, 12) + + 11527.0 * np.power(n, 13) + + 4188.0 * np.power(n, 14) + + 1030.0 * np.power(n, 15) + + 162.0 * np.power(n, 16) + + 12.0 * np.power(n, 17) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 6) + * np.power(1.0 + n, 6) + * np.power(2.0 + n, 5) + ) + - ( + 2.193245422464302 + * (2.0 + n + np.power(n, 2)) + * ( + -24.0 + - 80.0 * n + - 20.0 * np.power(n, 2) + + 149.0 * np.power(n, 3) + + 75.0 * np.power(n, 4) + + 27.0 * np.power(n, 5) + + 17.0 * np.power(n, 6) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 8.0 + * (2.0 + n + np.power(n, 2)) + * ( + 32.0 + + 72.0 * n + + 396.0 * np.power(n, 2) + + 810.0 * np.power(n, 3) + + 759.0 * np.power(n, 4) + + 386.0 * np.power(n, 5) + + 117.0 * np.power(n, 6) + + 22.0 * np.power(n, 7) + + 2.0 * np.power(n, 8) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + + ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 + + 16.0 * n + + 18.0 * np.power(n, 2) + + 4.0 * np.power(n, 3) + + 7.0 * np.power(n, 4) + + 6.0 * np.power(n, 5) + + np.power(n, 6) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 2.6666666666666665 + * (2.0 + n + np.power(n, 2)) + * (2.0 + 11.0 * n + 8.0 * np.power(n, 2) + np.power(n, 3)) + * np.power(S1, 3) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 1.3333333333333333 + * ( + 384.0 + + 2432.0 * n + + 6512.0 * np.power(n, 2) + + 9608.0 * np.power(n, 3) + + 8076.0 * np.power(n, 4) + + 3318.0 * np.power(n, 5) + - 2510.0 * np.power(n, 6) + - 3801.0 * np.power(n, 7) + - 1152.0 * np.power(n, 8) + + 104.0 * np.power(n, 9) + + 66.0 * np.power(n, 10) + + 3.0 * np.power(n, 11) + ) + * S2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 8.0 + * (2.0 + n + np.power(n, 2)) + * (-2.0 - 27.0 * n - 12.0 * np.power(n, 2) + 3.0 * np.power(n, 3)) + * S1 + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 5.333333333333333 + * (2.0 + n + np.power(n, 2)) + * ( + -24.0 + - 72.0 * n + - 56.0 * np.power(n, 2) + - 25.0 * np.power(n, 3) + - 7.0 * np.power(n, 4) + + 29.0 * np.power(n, 5) + + 11.0 * np.power(n, 6) + ) + * S3 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + 20.0 + + 22.0 * n + + 7.0 * np.power(n, 2) + + 2.0 * np.power(n, 3) + + np.power(n, 4) + ) + * (26.31894506957162 + 32.0 * Sm2) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + ( + (-4.0 - 1.0 * n + np.power(n, 2)) + * (2.0 + n + np.power(n, 2)) + * ( + -28.849365675830263 + - 52.63789013914324 * S1 + - 64.0 * S1 * Sm2 + + 64.0 * Sm21 + - 32.0 * Sm3 + ) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + -6.410970150184502 * S1 + - 0.6666666666666666 * np.power(S1, 4) + - 20.0 * np.power(S1, 2) * S2 + - 2.0 * np.power(S2, 2) + + 16.0 * S211 + + 16.0 * S31 + - 36.0 * S4 + + 1.6449340668482262 + * (-4.0 * np.power(S1, 2) - 12.0 * S2 - 24.0 * Sm2) + + (-32.0 * np.power(S1, 2) - 32.0 * S2) * Sm2 + + S1 * (-53.333333333333336 * S3 + 64.0 * Sm21) + - 64.0 * Sm211 + + 32.0 * Sm22 + - 32.0 * S1 * Sm3 + + 32.0 * Sm31 + - 16.0 * Sm4 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 2.0 + * ( + ( + -1.0684950250307503 + * ( + 1032.0 + + 260.0 * n + + 1098.0 * np.power(n, 2) + - 837.0 * np.power(n, 3) + - 5661.0 * np.power(n, 4) + - 472.0 * np.power(n, 5) + + 1135.0 * np.power(n, 6) + - 367.0 * np.power(n, 7) + - 229.0 * np.power(n, 8) + + 9.0 * np.power(n, 10) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 0.7310818074881006 + * ( + 864.0 + + 4656.0 * n + + 9680.0 * np.power(n, 2) + + 11112.0 * np.power(n, 3) + + 8470.0 * np.power(n, 4) + + 4779.0 * np.power(n, 5) + - 106.0 * np.power(n, 6) + - 317.0 * np.power(n, 7) + + 2484.0 * np.power(n, 8) + + 2323.0 * np.power(n, 9) + + 856.0 * np.power(n, 10) + + 127.0 * np.power(n, 11) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 0.03292181069958848 + * ( + 155520.0 + + 1.308096e6 * n + + 4.812768e6 * np.power(n, 2) + + 1.012152e7 * np.power(n, 3) + + 1.3312808e7 * np.power(n, 4) + + 1.2149124e7 * np.power(n, 5) + + 9.141018e6 * np.power(n, 6) + + 6.186057e6 * np.power(n, 7) + + 1.320584e6 * np.power(n, 8) + - 3.045065e6 * np.power(n, 9) + - 2.526162e6 * np.power(n, 10) + + 374900.0 * np.power(n, 11) + + 1.654143e6 * np.power(n, 12) + + 1.331937e6 * np.power(n, 13) + + 671488.0 * np.power(n, 14) + + 218915.0 * np.power(n, 15) + + 40465.0 * np.power(n, 16) + + 3244.0 * np.power(n, 17) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 6) + * np.power(1.0 + n, 6) + * np.power(2.0 + n, 5) + ) + - ( + 0.14814814814814814 + * ( + 1872.0 + + 4512.0 * n + + 3200.0 * np.power(n, 2) + - 6636.0 * np.power(n, 3) + - 14165.0 * np.power(n, 4) + - 12231.0 * np.power(n, 5) + - 4318.0 * np.power(n, 6) + + 1411.0 * np.power(n, 7) + + 1566.0 * np.power(n, 8) + + 406.0 * np.power(n, 9) + + 145.0 * np.power(n, 10) + + 46.0 * np.power(n, 11) + ) + * np.power(S1, 2) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 0.14814814814814814 + * ( + 12240.0 + + 55200.0 * n + + 106112.0 * np.power(n, 2) + + 114180.0 * np.power(n, 3) + + 81499.0 * np.power(n, 4) + + 62901.0 * np.power(n, 5) + + 17000.0 * np.power(n, 6) + - 773.0 * np.power(n, 7) + + 26208.0 * np.power(n, 8) + + 27688.0 * np.power(n, 9) + + 10993.0 * np.power(n, 10) + + 1696.0 * np.power(n, 11) + ) + * S2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + S1 + * ( + ( + 0.04938271604938271 + * ( + 1728.0 + - 22752.0 * n + - 61248.0 * np.power(n, 2) + + 113008.0 * np.power(n, 3) + + 571260.0 * np.power(n, 4) + + 528058.0 * np.power(n, 5) + + 1854.0 * np.power(n, 6) + - 144034.0 * np.power(n, 7) + + 15119.0 * np.power(n, 8) + + 66314.0 * np.power(n, 9) + + 47061.0 * np.power(n, 10) + + 29936.0 * np.power(n, 11) + + 12147.0 * np.power(n, 12) + + 2518.0 * np.power(n, 13) + + 247.0 * np.power(n, 14) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + + ( + 0.4444444444444444 + * ( + -864.0 + - 2560.0 * n + + 516.0 * np.power(n, 2) + + 1896.0 * np.power(n, 3) + + 3273.0 * np.power(n, 4) + + 2552.0 * np.power(n, 5) + + 1342.0 * np.power(n, 6) + + 1064.0 * np.power(n, 7) + + 269.0 * np.power(n, 8) + ) + * S2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + ) + - ( + 2.6666666666666665 + * ( + 152.0 + + 356.0 * n + + 626.0 * np.power(n, 2) + + 763.0 * np.power(n, 3) + + 194.0 * np.power(n, 4) + - 5.0 * np.power(n, 5) + + 100.0 * np.power(n, 6) + + 48.0 * np.power(n, 7) + + 6.0 * np.power(n, 8) + ) + * S21 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 0.2962962962962963 + * ( + -2136.0 + - 10516.0 * n + - 11598.0 * np.power(n, 2) + - 9939.0 * np.power(n, 3) + - 4923.0 * np.power(n, 4) + + 2618.0 * np.power(n, 5) + + 1345.0 * np.power(n, 6) + + 2039.0 * np.power(n, 7) + + 1745.0 * np.power(n, 8) + + 702.0 * np.power(n, 9) + + 135.0 * np.power(n, 10) + ) + * S3 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + # + ( + # np.power(2.0, 4.0 - 1.0 * n) + # * ( + # 4.0 + # - 2.0 * n + # + 10.0 * np.power(n, 2) + # - 1.0 * np.power(n, 3) + # + np.power(n, 5) + # ) + # * (-8.41439832211716 - H1) + # ) + - np.power(2.0, 4.0) + * H1fit + * (4.0 - 2.0 * n + 10.0 * np.power(n, 2) - np.power(n, 3) + np.power(n, 5)) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 2)) + + ( + ( + -2.6666666666666665 + * ( + -416.0 + - 1952.0 * n + - 3680.0 * np.power(n, 2) + - 2096.0 * np.power(n, 3) + - 346.0 * np.power(n, 4) + + 14.0 * np.power(n, 5) + + 259.0 * np.power(n, 6) + + 214.0 * np.power(n, 7) + + 82.0 * np.power(n, 8) + + 44.0 * np.power(n, 9) + + 5.0 * np.power(n, 10) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 10.666666666666666 + * ( + 32.0 + + 120.0 * n + + 104.0 * np.power(n, 2) + + 154.0 * np.power(n, 3) + + 122.0 * np.power(n, 4) + + 49.0 * np.power(n, 5) + + 24.0 * np.power(n, 6) + + 3.0 * np.power(n, 7) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + ) + * Sm2 + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + -184.0593470475842 + + 0.2222222222222222 * np.power(S1, 4) + # + 269.2607463077491 * S1l05 + + 22.666666666666668 * np.power(S1, 2) * S2 + - 26.666666666666668 * S211 + # + 32.0 * (-H2) + + 37.333333333333336 * np.power(S1, 2) * Sm2 + + 1.6449340668482262 + * (4.0 * np.power(S1, 2) + 12.0 * S2 + 24.0 * Sm2) + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + H2fit + + ( + 5.333333333333333 + * ( + -80.0 + - 264.0 * n + - 248.0 * np.power(n, 2) + - 338.0 * np.power(n, 3) + - 293.0 * np.power(n, 4) + - 91.0 * np.power(n, 5) + + 76.0 * np.power(n, 6) + + 105.0 * np.power(n, 7) + + 39.0 * np.power(n, 8) + + 6.0 * np.power(n, 9) + ) + * Sm21 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 2.6666666666666665 + * ( + 112.0 + + 440.0 * n + + 248.0 * np.power(n, 2) + + 286.0 * np.power(n, 3) + + 147.0 * np.power(n, 4) + + 85.0 * np.power(n, 5) + + 148.0 * np.power(n, 6) + + 89.0 * np.power(n, 7) + + 39.0 * np.power(n, 8) + + 6.0 * np.power(n, 9) + ) + * Sm3 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + -3.205485075092251 * (10.0 + 11.0 * n + 11.0 * np.power(n, 2)) * S1 + + ( + 2.193245422464302 + * ( + -24.0 + - 80.0 * n + + 76.0 * np.power(n, 2) + + 77.0 * np.power(n, 3) + + 27.0 * np.power(n, 4) + + 51.0 * np.power(n, 5) + + 17.0 * np.power(n, 6) + ) + * S1 + ) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + + ( + 0.14814814814814814 + * ( + -24.0 + - 80.0 * n + + 76.0 * np.power(n, 2) + + 77.0 * np.power(n, 3) + + 27.0 * np.power(n, 4) + + 51.0 * np.power(n, 5) + + 17.0 * np.power(n, 6) + ) + * np.power(S1, 3) + ) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + + 0.6666666666666666 + * (74.0 + 29.0 * n + 29.0 * np.power(n, 2)) + * np.power(S2, 2) + - 8.0 * (26.0 + 7.0 * n + 7.0 * np.power(n, 2)) * S31 + + 1.3333333333333333 + * (310.0 + 143.0 * n + 143.0 * np.power(n, 2)) + * S4 + + 21.333333333333332 + * (13.0 + 7.0 * n + 7.0 * np.power(n, 2)) + * S2 + * Sm2 + - 5.333333333333333 + * (-2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + * np.power(Sm2, 2) + + S1 + * ( + 0.8888888888888888 + * (334.0 + 137.0 * n + 137.0 * np.power(n, 2)) + * S3 + - 5.333333333333333 + * (18.0 + 35.0 * n + 35.0 * np.power(n, 2)) + * Sm21 + ) + + 21.333333333333332 + * (2.0 + 13.0 * n + 13.0 * np.power(n, 2)) + * Sm211 + - 64.0 * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) * Sm22 + + 2.6666666666666665 + * (94.0 + 69.0 * n + 69.0 * np.power(n, 2)) + * S1 + * Sm3 + - 10.666666666666666 + * (22.0 + 23.0 * n + 23.0 * np.power(n, 2)) + * Sm31 + + 5.333333333333333 + * (50.0 + 31.0 * n + 31.0 * np.power(n, 2)) + * Sm4 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + a_Hq_l3 = ( + (4.7407407407407405 * np.power(2.0 + n + np.power(n, 2), 2)) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + (1.1851851851851851 * np.power(2.0 + n + np.power(n, 2), 2) * nf) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - 0.8888888888888888 + * ( + ( + 1.3333333333333333 + * np.power(2.0 + n + np.power(n, 2), 2) + * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - (5.333333333333333 * np.power(2.0 + n + np.power(n, 2), 2) * S1) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - 2.0 + * ( + ( + 0.8888888888888888 + * np.power(2.0 + n + np.power(n, 2), 2) + * ( + -12.0 + - 34.0 * n + - 23.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + (5.333333333333333 * np.power(2.0 + n + np.power(n, 2), 2) * S1) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + a_Hq_l2 = ( + 0.3333333333333333 + * nf + * ( + ( + 3.5555555555555554 + * ( + -24.0 + - 20.0 * n + + 58.0 * np.power(n, 2) + + 61.0 * np.power(n, 3) + + 85.0 * np.power(n, 4) + + 83.0 * np.power(n, 5) + + 37.0 * np.power(n, 6) + + 8.0 * np.power(n, 7) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - (10.666666666666666 * np.power(2.0 + n + np.power(n, 2), 2) * S1) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 0.3333333333333333 + * ( + ( + -3.5555555555555554 + * ( + 24.0 + + 124.0 * n + + 162.0 * np.power(n, 2) + + 193.0 * np.power(n, 3) + + 84.0 * np.power(n, 4) + + 29.0 * np.power(n, 5) + + 8.0 * np.power(n, 6) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + (10.666666666666666 * np.power(2.0 + n + np.power(n, 2), 2) * S1) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 0.8888888888888888 + * ( + ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 + - 20.0 * n + - 26.0 * np.power(n, 2) + - 23.0 * np.power(n, 3) + + 7.0 * np.power(n, 4) + + 15.0 * np.power(n, 5) + + 7.0 * np.power(n, 6) + ) + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + - ( + 8.0 + * np.power(2.0 + n + np.power(n, 2), 2) + * (-2.0 + n + 5.0 * np.power(n, 2)) + * S1 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + (16.0 * np.power(2.0 + n + np.power(n, 2), 2) * S2) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 2.0 + * ( + ( + -0.8888888888888888 + * ( + 576.0 + + 2832.0 * n + + 4976.0 * np.power(n, 2) + + 4392.0 * np.power(n, 3) + + 2476.0 * np.power(n, 4) + + 1917.0 * np.power(n, 5) + + 1457.0 * np.power(n, 6) + + 2428.0 * np.power(n, 7) + + 3402.0 * np.power(n, 8) + + 2281.0 * np.power(n, 9) + + 793.0 * np.power(n, 10) + + 118.0 * np.power(n, 11) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 2.6666666666666665 + * (2.0 + n + np.power(n, 2)) + * ( + -24.0 + - 80.0 * n + + 40.0 * np.power(n, 2) + + 89.0 * np.power(n, 3) + + 51.0 * np.power(n, 4) + + 51.0 * np.power(n, 5) + + 17.0 * np.power(n, 6) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + (np.power(2.0 + n + np.power(n, 2), 2) * (16.0 * S2 + 32.0 * Sm2)) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + a_Hq_l1 = ( + 0.3333333333333333 + * ( + ( + 2.3703703703703702 + * ( + 144.0 + + 336.0 * n + + 352.0 * np.power(n, 2) + + 820.0 * np.power(n, 3) + + 2379.0 * np.power(n, 4) + + 2874.0 * np.power(n, 5) + + 2431.0 * np.power(n, 6) + + 1914.0 * np.power(n, 7) + + 1059.0 * np.power(n, 8) + + 320.0 * np.power(n, 9) + + 43.0 * np.power(n, 10) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 7.111111111111111 + * ( + -24.0 + - 20.0 * n + + 58.0 * np.power(n, 2) + + 61.0 * np.power(n, 3) + + 85.0 * np.power(n, 4) + + 83.0 * np.power(n, 5) + + 37.0 * np.power(n, 6) + + 8.0 * np.power(n, 7) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 1.0 + * np.power(2.0 + n + np.power(n, 2), 2) + * (-10.666666666666666 * np.power(S1, 2) - 32.0 * S2) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - 0.3333333333333333 + * nf + * ( + ( + -1.1851851851851851 + * ( + 288.0 + + 672.0 * n + + 16.0 * np.power(n, 2) + - 1232.0 * np.power(n, 3) + - 654.0 * np.power(n, 4) + - 510.0 * np.power(n, 5) + - 218.0 * np.power(n, 6) + + 912.0 * np.power(n, 7) + + 939.0 * np.power(n, 8) + + 320.0 * np.power(n, 9) + + 43.0 * np.power(n, 10) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 3.5555555555555554 + * ( + -48.0 + - 104.0 * n + - 56.0 * np.power(n, 2) + - 86.0 * np.power(n, 3) + - 11.0 * np.power(n, 4) + + 68.0 * np.power(n, 5) + + 37.0 * np.power(n, 6) + + 8.0 * np.power(n, 7) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * (-5.333333333333333 * np.power(S1, 2) - 26.666666666666668 * S2) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - 0.8888888888888888 + * ( + ( + -4.0 + * ( + 288.0 + + 1712.0 * n + + 4656.0 * np.power(n, 2) + + 8248.0 * np.power(n, 3) + + 10938.0 * np.power(n, 4) + + 10519.0 * np.power(n, 5) + + 7642.0 * np.power(n, 6) + + 5020.0 * np.power(n, 7) + + 3520.0 * np.power(n, 8) + + 2328.0 * np.power(n, 9) + + 1107.0 * np.power(n, 10) + + 305.0 * np.power(n, 11) + + 37.0 * np.power(n, 12) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 3) + ) + + ( + 8.0 + * ( + 192.0 + + 768.0 * n + + 1488.0 * np.power(n, 2) + + 1784.0 * np.power(n, 3) + + 1560.0 * np.power(n, 4) + + 822.0 * np.power(n, 5) + + 454.0 * np.power(n, 6) + + 567.0 * np.power(n, 7) + + 427.0 * np.power(n, 8) + + 143.0 * np.power(n, 9) + + 19.0 * np.power(n, 10) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * (6.0 + 9.0 * n + 4.0 * np.power(n, 2) + 5.0 * np.power(n, 3)) + * np.power(S1, 2) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 4.0 + * ( + -96.0 + - 296.0 * n + - 500.0 * np.power(n, 2) + - 658.0 * np.power(n, 3) + - 449.0 * np.power(n, 4) + - 133.0 * np.power(n, 5) + - 15.0 * np.power(n, 6) + + 3.0 * np.power(n, 7) + ) + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + 115.39746270332105 + + 2.6666666666666665 * np.power(S1, 3) + - 24.0 * S1 * S2 + + 32.0 * S21 + - 26.666666666666668 * S3 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - 2.0 + * ( + ( + 0.2962962962962963 + * ( + -8640.0 + - 56448.0 * n + - 150864.0 * np.power(n, 2) + - 225808.0 * np.power(n, 3) + - 250212.0 * np.power(n, 4) + - 241600.0 * np.power(n, 5) + - 206883.0 * np.power(n, 6) + - 156761.0 * np.power(n, 7) + - 125240.0 * np.power(n, 8) + - 72944.0 * np.power(n, 9) + + 9045.0 * np.power(n, 10) + + 43489.0 * np.power(n, 11) + + 25572.0 * np.power(n, 12) + + 6560.0 * np.power(n, 13) + + 686.0 * np.power(n, 14) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + - ( + 0.8888888888888888 + * ( + 72.0 + + 924.0 * n + + 418.0 * np.power(n, 2) + - 3167.0 * np.power(n, 3) + - 3105.0 * np.power(n, 4) + - 2106.0 * np.power(n, 5) + - 2555.0 * np.power(n, 6) + - 438.0 * np.power(n, 7) + + 1110.0 * np.power(n, 8) + + 647.0 * np.power(n, 9) + + 136.0 * np.power(n, 10) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 2) + ) + + ( + 1.3333333333333333 + * (2.0 + n + np.power(n, 2)) + * ( + -12.0 + - 16.0 * n + + 41.0 * np.power(n, 2) + - 6.0 * np.power(n, 3) + + 17.0 * np.power(n, 4) + ) + * np.power(S1, 2) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 2) + * (2.0 + n) + ) + + ( + 1.3333333333333333 + * (2.0 + n + np.power(n, 2)) + * ( + -120.0 + - 412.0 * n + - 238.0 * np.power(n, 2) + + 31.0 * np.power(n, 3) + + 45.0 * np.power(n, 4) + + 189.0 * np.power(n, 5) + + 73.0 * np.power(n, 6) + ) + * S2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 2.6666666666666665 + * (2.0 + n + np.power(n, 2)) + * (74.0 + 31.0 * n + 31.0 * np.power(n, 2)) + * S3 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 32.0 + * (-4.0 - 1.0 * n + np.power(n, 2)) + * (2.0 + n + np.power(n, 2)) + * Sm2 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + + ( + 16.0 + * ( + 40.0 + + 132.0 * n + + 158.0 * np.power(n, 2) + + 155.0 * np.power(n, 3) + + 102.0 * np.power(n, 4) + + 37.0 * np.power(n, 5) + + 14.0 * np.power(n, 6) + + 2.0 * np.power(n, 7) + ) + * Sm2 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - (128.0 * (1.0 + n + np.power(n, 2)) * (2.0 + n + np.power(n, 2)) * Sm21) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 16.0 + * (2.0 + n + np.power(n, 2)) + * (10.0 + 7.0 * n + 7.0 * np.power(n, 2)) + * Sm3 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + -115.39746270332105 + - 2.6666666666666665 * np.power(S1, 3) + + 40.0 * S1 * S2 + - 32.0 * S21 + + 64.0 * S1 * Sm2 + + 16.0 * Sm3 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + return a_Hq_l0 + a_Hq_l1 * L + a_Hq_l2 * L**2 + a_Hq_l3 * L**3 diff --git a/src/eko/matching_conditions/as3/agg.py b/src/eko/matching_conditions/as3/agg.py new file mode 100644 index 000000000..862c04f68 --- /dev/null +++ b/src/eko/matching_conditions/as3/agg.py @@ -0,0 +1,1550 @@ +# -*- coding: utf-8 -*- +# pylint: disable=too-many-lines +import numba as nb +import numpy as np + +from .aggTF2 import A_ggTF2 + + +@nb.njit(cache=True) +def A_gg(n, sx, nf, L): # pylint: disable=too-many-locals + r""" + Computes the |N3LO| singlet |OME| :math:`A_{gg}^{S,(3)}(N)`. + The experssion is presented in :cite:`Bierenbaum:2009mv`. + + When using the code, please cite the complete list of references + available in :mod:`eko.matching_conditions.as3`. + + Parameters + ---------- + n : complex + Mellin moment + sx : list + harmonic sums cache + nf : int + number of active flavor below the threshold + L : float + :math:`\ln(\mu_F^2 / m_h^2)` + + Returns + ------- + A_gg : complex + :math:`A_{gg}^{S,(3)}(N)` + + See Also + -------- + A_ggTF2: eko.matching_conditions.as3.aggTF2.A_ggTF2 + Incomplete part proportional to :math:`T_{F}^2`. + """ + S1, _ = sx[0] + S2, Sm2 = sx[1] + S3, S21, _, Sm21, _, Sm3 = sx[2] + S4, S31, S211, Sm22, Sm211, Sm31, Sm4 = sx[3] + a_gg_l0 = ( + -0.35616500834358344 + + A_ggTF2(n, sx) + + 0.75 + * ( + (-19.945240467240673 * (1.0 + n + np.power(n, 2))) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + - ( + 0.24369393582936685 + * ( + 168.0 + + 784.0 * n + + 1118.0 * np.power(n, 2) + + 767.0 * np.power(n, 3) + + 631.0 * np.power(n, 4) + + 297.0 * np.power(n, 5) + + 99.0 * np.power(n, 6) + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 0.09876543209876543 + * ( + 216.0 + + 288.0 * n + - 30.0 * np.power(n, 2) + + 3556.0 * np.power(n, 3) + + 14212.0 * np.power(n, 4) + + 23815.0 * np.power(n, 5) + + 22951.0 * np.power(n, 6) + + 12778.0 * np.power(n, 7) + + 3316.0 * np.power(n, 8) + + 15.0 * np.power(n, 9) + + 3.0 * np.power(n, 10) + ) + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + + 44.0897712497317 * S1 + + ( + 0.19753086419753085 + * ( + 54.0 + - 175.0 * n + - 247.0 * np.power(n, 2) + + 256.0 * np.power(n, 3) + + 328.0 * np.power(n, 4) + ) + * S1 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2)) + + (2.6666666666666665 * np.power(S1, 2)) / (1.0 + n) + - (2.6666666666666665 * (1.0 + 2.0 * n) * S2) / (1.0 + n) + + nf + * ( + (-5.698640133497335 * (1.0 + n + np.power(n, 2))) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + - ( + 0.24369393582936685 + * ( + 48.0 + + 224.0 * n + + 358.0 * np.power(n, 2) + + 277.0 * np.power(n, 3) + + 161.0 * np.power(n, 4) + + 27.0 * np.power(n, 5) + + 9.0 * np.power(n, 6) + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 0.13168724279835392 + * ( + -108.0 + - 144.0 * n + + 15.0 * np.power(n, 2) + - 1778.0 * np.power(n, 3) + - 7235.0 * np.power(n, 4) + - 12359.0 * np.power(n, 5) + - 11927.0 * np.power(n, 6) + - 6260.0 * np.power(n, 7) + - 1142.0 * np.power(n, 8) + + 315.0 * np.power(n, 9) + + 63.0 * np.power(n, 10) + ) + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + + 12.597077499923342 * S1 + + ( + 0.13168724279835392 + * ( + 54.0 + - 175.0 * n + - 247.0 * np.power(n, 2) + + 256.0 * np.power(n, 3) + + 328.0 * np.power(n, 4) + ) + * S1 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2)) + + (1.7777777777777777 * np.power(S1, 2)) / (1.0 + n) + - (1.7777777777777777 * (1.0 + 2.0 * n) * S2) / (1.0 + n) + ) + ) + + 0.3333333333333333 + * ( + ( + -1.4621636149762012 + * ( + -84.0 + - 148.0 * n + - 245.0 * np.power(n, 2) + - 378.0 * np.power(n, 3) + - 166.0 * np.power(n, 4) + + 12.0 * np.power(n, 5) + + 86.0 * np.power(n, 6) + + 60.0 * np.power(n, 7) + + 15.0 * np.power(n, 8) + ) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 0.2222222222222222 + * ( + 288.0 + + 864.0 * n + + 1224.0 * np.power(n, 2) + - 792.0 * np.power(n, 4) + + 4546.0 * np.power(n, 5) + + 7713.0 * np.power(n, 6) + + 1150.0 * np.power(n, 7) + - 2243.0 * np.power(n, 8) + + 2758.0 * np.power(n, 9) + + 4795.0 * np.power(n, 10) + + 2346.0 * np.power(n, 11) + + 391.0 * np.power(n, 12) + ) + ) + / ((-1.0 + n) * np.power(n, 5) * np.power(1.0 + n, 5) * (2.0 + n)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * (-10.684950250307505 - 8.772981689857207 * S1) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + nf + * ( + ( + 0.7310818074881006 + * ( + 48.0 + - 80.0 * n + - 220.0 * np.power(n, 2) + - 282.0 * np.power(n, 3) + - 551.0 * np.power(n, 4) + - 258.0 * np.power(n, 5) + + 196.0 * np.power(n, 6) + + 252.0 * np.power(n, 7) + + 63.0 * np.power(n, 8) + ) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 0.024691358024691357 + * ( + 1728.0 + + 5184.0 * n + + 7344.0 * np.power(n, 2) + - 15872.0 * np.power(n, 3) + - 70928.0 * np.power(n, 4) + - 90898.0 * np.power(n, 5) + - 79041.0 * np.power(n, 6) + - 82318.0 * np.power(n, 7) + - 62269.0 * np.power(n, 8) + - 8758.0 * np.power(n, 9) + + 15013.0 * np.power(n, 10) + + 9558.0 * np.power(n, 11) + + 1593.0 * np.power(n, 12) + ) + ) + / ((-1.0 + n) * np.power(n, 5) * np.power(1.0 + n, 5) * (2.0 + n)) + + ( + 1.1851851851851851 + * (2.0 + n + np.power(n, 2)) + * ( + 86.0 + + 230.0 * n + + 224.0 * np.power(n, 2) + + 105.0 * np.power(n, 3) + + 43.0 * np.power(n, 4) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 4) * (2.0 + n)) + - ( + 1.7777777777777777 + * (2.0 + n + np.power(n, 2)) + * (16.0 + 27.0 * n + 13.0 * np.power(n, 2) + 8.0 * np.power(n, 3)) + * (np.power(S1, 2) + S2) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + -8.547960200246003 + + 8.772981689857207 * S1 + + 1.7777777777777777 * np.power(S1, 3) + + 5.333333333333333 * S1 * S2 + + 3.5555555555555554 * S3 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + + 0.8888888888888888 + * ( + 145.94322056228512 + - ( + 1.6027425375461255 + * ( + -8.0 + - 20.0 * n + - 34.0 * np.power(n, 2) + - 79.0 * np.power(n, 3) + - 143.0 * np.power(n, 4) + - 57.0 * np.power(n, 5) + + 93.0 * np.power(n, 6) + + 96.0 * np.power(n, 7) + + 24.0 * np.power(n, 8) + ) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 3.2898681336964524 + * ( + 24.0 + + 68.0 * n + - 2.0 * np.power(n, 2) + - 205.0 * np.power(n, 3) + - 509.0 * np.power(n, 4) + - 753.0 * np.power(n, 5) + - 615.0 * np.power(n, 6) + - 66.0 * np.power(n, 7) + + 282.0 * np.power(n, 8) + + 200.0 * np.power(n, 9) + + 40.0 * np.power(n, 10) + ) + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + - ( + 1.0 + * ( + 32.0 + + 208.0 * n + + 280.0 * np.power(n, 2) + - 532.0 * np.power(n, 3) + - 1944.0 * np.power(n, 4) + - 1520.0 * np.power(n, 5) + + 2258.0 * np.power(n, 6) + + 6555.0 * np.power(n, 7) + + 6707.0 * np.power(n, 8) + + 3479.0 * np.power(n, 9) + + 1343.0 * np.power(n, 10) + + 1025.0 * np.power(n, 11) + + 741.0 * np.power(n, 12) + + 273.0 * np.power(n, 13) + + 39.0 * np.power(n, 14) + ) + ) + / ((-1.0 + n) * np.power(n, 6) * np.power(1.0 + n, 6) * (2.0 + n)) + - ( + 6.579736267392905 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 + - 10.0 * n + + np.power(n, 2) + + 4.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 8.0 + * (2.0 + n + np.power(n, 2)) + * ( + -12.0 + - 44.0 * n + - 19.0 * np.power(n, 2) + - 11.0 * np.power(n, 3) + - 2.0 * np.power(n, 4) + + 2.0 * np.power(n, 5) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 4) * (2.0 + n)) + + ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -4.0 + - 18.0 * n + - 32.0 * np.power(n, 2) + - 5.0 * np.power(n, 3) + + np.power(n, 4) + ) + * np.power(S1, 2) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 + - 20.0 * n + - 56.0 * np.power(n, 2) + - 64.0 * np.power(n, 3) + + 15.0 * np.power(n, 4) + + 30.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + ) + * S2 + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + + ( + (2.0 + 3.0 * n) + * (2.0 + n + np.power(n, 2)) + * (2.6666666666666665 * np.power(S1, 3) + 8.0 * S1 * S2) + ) + / ((-1.0 + n) * np.power(n, 3) * (1.0 + n) * (2.0 + n)) + - ( + 32.0 + * (-2.0 - 3.0 * n + np.power(n, 2)) + * (2.0 + n + np.power(n, 2)) + * S21 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 2.6666666666666665 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 + - 22.0 * n + + 43.0 * np.power(n, 2) + + 48.0 * np.power(n, 3) + + 3.0 * np.power(n, 4) + ) + * S3 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + -6.410970150184502 * S1 + - 0.6666666666666666 * np.power(S1, 4) + - 4.0 * np.power(S1, 2) * S2 + - 2.0 * np.power(S2, 2) + + 1.6449340668482262 * (-4.0 * np.power(S1, 2) + 12.0 * S2) + + 64.0 * S211 + + S1 * (-32.0 * S21 - 5.333333333333333 * S3) + - 32.0 * S31 + + 12.0 * S4 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 4.5 + * ( + ( + -0.03292181069958848 + * ( + -1188.0 + - 1584.0 * n + + 165.0 * np.power(n, 2) + - 18010.0 * np.power(n, 3) + - 73393.0 * np.power(n, 4) + - 125113.0 * np.power(n, 5) + - 120361.0 * np.power(n, 6) + - 62668.0 * np.power(n, 7) + - 11014.0 * np.power(n, 8) + + 3465.0 * np.power(n, 9) + + 693.0 * np.power(n, 10) + ) + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + + ( + 0.24369393582936685 + * ( + -576.0 + - 2544.0 * n + - 5824.0 * np.power(n, 2) + - 8400.0 * np.power(n, 3) + - 4984.0 * np.power(n, 4) + + 211.0 * np.power(n, 5) + + 2207.0 * np.power(n, 6) + + 2155.0 * np.power(n, 7) + + 1356.0 * np.power(n, 8) + + 631.0 * np.power(n, 9) + + 189.0 * np.power(n, 10) + + 27.0 * np.power(n, 11) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - 7.835630183558836 * S1 + - ( + 0.03292181069958848 + * ( + 594.0 + - 1151.0 * n + - 1943.0 * np.power(n, 2) + + 2042.0 * np.power(n, 3) + + 2834.0 * np.power(n, 4) + ) + * S1 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2)) + + ( + 0.9747757433174674 + * ( + -72.0 + - 72.0 * n + + 256.0 * np.power(n, 2) + + 292.0 * np.power(n, 3) + + 173.0 * np.power(n, 4) + + 64.0 * np.power(n, 5) + + 2.0 * np.power(n, 6) + + 4.0 * np.power(n, 7) + + np.power(n, 8) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + - (4.888888888888889 * np.power(S1, 2)) / (1.0 + n) + + (4.888888888888889 * (1.0 + 2.0 * n) * S2) / (1.0 + n) + + ( + (1.0 + n + np.power(n, 2)) + * ( + 15.671260367117672 + + 1.6449340668482262 + * (21.333333333333332 * S2 + 21.333333333333332 * Sm2) + ) + ) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + + 1.6449340668482262 + * ( + -10.666666666666666 * S1 * S2 + - 5.333333333333333 * S3 + - 10.666666666666666 * S1 * Sm2 + + 10.666666666666666 * Sm21 + - 5.333333333333333 * Sm3 + ) + ) + + 2.0 + * ( + -72.97161028114256 + + ( + 1.0684950250307503 + * ( + -48.0 + - 184.0 * n + - 504.0 * np.power(n, 2) + - 72.0 * np.power(n, 3) + + 162.0 * np.power(n, 4) + + 101.0 * np.power(n, 5) + - 167.0 * np.power(n, 6) + - 91.0 * np.power(n, 7) + + 119.0 * np.power(n, 8) + + 90.0 * np.power(n, 9) + + 18.0 * np.power(n, 10) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 0.7310818074881006 + * ( + -864.0 + - 2544.0 * n + - 3344.0 * np.power(n, 2) + - 5880.0 * np.power(n, 3) + - 5230.0 * np.power(n, 4) + - 7911.0 * np.power(n, 5) + - 12524.0 * np.power(n, 6) + - 9220.0 * np.power(n, 7) + - 1680.0 * np.power(n, 8) + + 2042.0 * np.power(n, 9) + + 1562.0 * np.power(n, 10) + + 530.0 * np.power(n, 11) + + 120.0 * np.power(n, 12) + + 15.0 * np.power(n, 13) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 0.05555555555555555 + * ( + 18432.0 + + 104448.0 * n + + 305664.0 * np.power(n, 2) + + 574464.0 * np.power(n, 3) + + 807552.0 * np.power(n, 4) + + 1.160704e6 * np.power(n, 5) + + 952768.0 * np.power(n, 6) + - 227344.0 * np.power(n, 7) + - 85568.0 * np.power(n, 8) + + 2.284064e6 * np.power(n, 9) + + 2.719198e6 * np.power(n, 10) + - 792201.0 * np.power(n, 11) + - 3.594388e6 * np.power(n, 12) + - 2.371724e6 * np.power(n, 13) + + 244448.0 * np.power(n, 14) + + 1.224418e6 * np.power(n, 15) + + 794084.0 * np.power(n, 16) + + 257636.0 * np.power(n, 17) + + 43890.0 * np.power(n, 18) + + 3135.0 * np.power(n, 19) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 6) + * np.power(1.0 + n, 6) + * np.power(2.0 + n, 5) + ) + - ( + 2.193245422464302 + * ( + 48.0 + + 184.0 * n + + 144.0 * np.power(n, 2) + - 78.0 * np.power(n, 3) + - 39.0 * np.power(n, 4) + - 368.0 * np.power(n, 5) + - 586.0 * np.power(n, 6) + - 224.0 * np.power(n, 7) + + 163.0 * np.power(n, 8) + + 150.0 * np.power(n, 9) + + 30.0 * np.power(n, 10) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 0.2222222222222222 + * ( + -2304.0 + - 6336.0 * n + - 34832.0 * np.power(n, 2) + - 91776.0 * np.power(n, 3) + - 141176.0 * np.power(n, 4) + - 137724.0 * np.power(n, 5) + - 69461.0 * np.power(n, 6) + + 12096.0 * np.power(n, 7) + + 46703.0 * np.power(n, 8) + + 34680.0 * np.power(n, 9) + + 13349.0 * np.power(n, 10) + + 2724.0 * np.power(n, 11) + + 233.0 * np.power(n, 12) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 + + 16.0 * n + + 18.0 * np.power(n, 2) + + 4.0 * np.power(n, 3) + + 7.0 * np.power(n, 4) + + 6.0 * np.power(n, 5) + + np.power(n, 6) + ) + * np.power(S1, 2) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 2.6666666666666665 + * (2.0 + n + np.power(n, 2)) + * (2.0 + 11.0 * n + 8.0 * np.power(n, 2) + np.power(n, 3)) + * np.power(S1, 3) + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + 64.0 + + 256.0 * n + + 456.0 * np.power(n, 2) + + 600.0 * np.power(n, 3) + + 290.0 * np.power(n, 4) + + 42.0 * np.power(n, 5) + + 105.0 * np.power(n, 6) + + 85.0 * np.power(n, 7) + + 21.0 * np.power(n, 8) + + np.power(n, 9) + ) + * S2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 8.0 + * (2.0 + n + np.power(n, 2)) + * (-2.0 - 27.0 * n - 12.0 * np.power(n, 2) + 3.0 * np.power(n, 3)) + * S1 + * S2 + ) + / ( + (-1.0 + n) + * np.power(n, 2) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 21.333333333333332 + * (2.0 + n + np.power(n, 2)) + * ( + 6.0 + + 7.0 * n + + 3.0 * np.power(n, 2) + + 9.0 * np.power(n, 3) + + 10.0 * np.power(n, 4) + + np.power(n, 5) + ) + * S3 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + 20.0 + + 22.0 * n + + 7.0 * np.power(n, 2) + + 2.0 * np.power(n, 3) + + np.power(n, 4) + ) + * (-26.31894506957162 - 32.0 * Sm2) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + ( + (-4.0 - 1.0 * n + np.power(n, 2)) + * (2.0 + n + np.power(n, 2)) + * ( + 28.849365675830263 + + 52.63789013914324 * S1 + + 64.0 * S1 * Sm2 + - 64.0 * Sm21 + + 32.0 * Sm3 + ) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + 6.410970150184502 * S1 + + 0.6666666666666666 * np.power(S1, 4) + + 20.0 * np.power(S1, 2) * S2 + + 2.0 * np.power(S2, 2) + - 16.0 * S211 + - 16.0 * S31 + + 36.0 * S4 + + (32.0 * np.power(S1, 2) + 32.0 * S2) * Sm2 + + 1.6449340668482262 + * (4.0 * np.power(S1, 2) + 12.0 * S2 + 24.0 * Sm2) + + S1 * (53.333333333333336 * S3 - 64.0 * Sm21) + + 64.0 * Sm211 + - 32.0 * Sm22 + + 32.0 * S1 * Sm3 + - 32.0 * Sm31 + + 16.0 * Sm4 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + a_gg_l3 = ( + -0.2962962962962963 + + 0.3333333333333333 + * ( + (-8.88888888888889 * np.power(2.0 + n + np.power(n, 2), 2)) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - (7.111111111111111 * np.power(2.0 + n + np.power(n, 2), 2) * nf) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - 4.5 + * ( + (-13.037037037037036 * (1.0 + n + np.power(n, 2))) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + + 6.518518518518518 * S1 + ) + + 0.75 + * ( + (-16.59259259259259 * (1.0 + n + np.power(n, 2))) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + - 1.0 + * nf + * ( + (4.7407407407407405 * (1.0 + n + np.power(n, 2))) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + - 2.3703703703703702 * S1 + ) + + 8.296296296296296 * S1 + ) + - 2.0 + * ( + ( + -0.8888888888888888 + * np.power(2.0 + n + np.power(n, 2), 2) + * ( + -12.0 + - 34.0 * n + - 23.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - (5.333333333333333 * np.power(2.0 + n + np.power(n, 2), 2) * S1) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - 0.8888888888888888 + * ( + ( + -1.3333333333333333 + * np.power(2.0 + n + np.power(n, 2), 2) + * (2.0 + 3.0 * n + 3.0 * np.power(n, 2)) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + (5.333333333333333 * np.power(2.0 + n + np.power(n, 2), 2) * S1) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + a_gg_l2 = ( + 0.75 + * ( + ( + 0.2962962962962963 + * ( + 96.0 + + 448.0 * n + + 626.0 * np.power(n, 2) + + 419.0 * np.power(n, 3) + + 367.0 * np.power(n, 4) + + 189.0 * np.power(n, 5) + + 63.0 * np.power(n, 6) + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - 23.703703703703702 * S1 + ) + + 0.3333333333333333 + * ( + ( + 0.8888888888888888 + * ( + -96.0 + - 224.0 * n + - 400.0 * np.power(n, 2) + - 546.0 * np.power(n, 3) + - 275.0 * np.power(n, 4) + - 18.0 * np.power(n, 5) + + 76.0 * np.power(n, 6) + + 60.0 * np.power(n, 7) + + 15.0 * np.power(n, 8) + ) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + (10.666666666666666 * np.power(2.0 + n + np.power(n, 2), 2) * S1) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 0.8888888888888888 + * ( + ( + -4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 + - 20.0 * n + - 26.0 * np.power(n, 2) + - 23.0 * np.power(n, 3) + + 7.0 * np.power(n, 4) + + 15.0 * np.power(n, 5) + + 7.0 * np.power(n, 6) + ) + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + + ( + 8.0 + * np.power(2.0 + n + np.power(n, 2), 2) + * (-2.0 + n + 5.0 * np.power(n, 2)) + * S1 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - (16.0 * np.power(2.0 + n + np.power(n, 2), 2) * S2) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 2.0 + * ( + ( + -0.2222222222222222 + * ( + -2304.0 + - 7104.0 * n + - 7232.0 * np.power(n, 2) + - 2496.0 * np.power(n, 3) + + 5240.0 * np.power(n, 4) + - 3624.0 * np.power(n, 5) + - 26198.0 * np.power(n, 6) + - 34351.0 * np.power(n, 7) + - 23124.0 * np.power(n, 8) + - 8809.0 * np.power(n, 9) + - 1366.0 * np.power(n, 10) + + 479.0 * np.power(n, 11) + + 264.0 * np.power(n, 12) + + 33.0 * np.power(n, 13) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 2.6666666666666665 + * ( + -48.0 + - 184.0 * n + - 24.0 * np.power(n, 2) + + 150.0 * np.power(n, 3) + + 255.0 * np.power(n, 4) + + 233.0 * np.power(n, 5) + + 91.0 * np.power(n, 6) + + 50.0 * np.power(n, 7) + + 35.0 * np.power(n, 8) + + 15.0 * np.power(n, 9) + + 3.0 * np.power(n, 10) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + (np.power(2.0 + n + np.power(n, 2), 2) * (-16.0 * S2 - 32.0 * Sm2)) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + + 4.5 + * ( + ( + -0.2222222222222222 + * ( + -768.0 + - 2688.0 * n + - 4256.0 * np.power(n, 2) + - 4632.0 * np.power(n, 3) + - 2060.0 * np.power(n, 4) + - 934.0 * np.power(n, 5) + - 2099.0 * np.power(n, 6) + - 2185.0 * np.power(n, 7) + - 1014.0 * np.power(n, 8) + - 124.0 * np.power(n, 9) + + 21.0 * np.power(n, 10) + + 3.0 * np.power(n, 11) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 3) + ) + - ( + 0.8888888888888888 + * ( + -96.0 + - 96.0 * n + + 428.0 * np.power(n, 2) + + 476.0 * np.power(n, 3) + + 79.0 * np.power(n, 4) + - 88.0 * np.power(n, 5) + + 46.0 * np.power(n, 6) + + 92.0 * np.power(n, 7) + + 23.0 * np.power(n, 8) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * np.power(2.0 + n, 2) + ) + + 21.333333333333332 * S1 * S2 + + 10.666666666666666 * S3 + + ( + (1.0 + n + np.power(n, 2)) + * (-42.666666666666664 * S2 - 42.666666666666664 * Sm2) + ) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + + 21.333333333333332 * S1 * Sm2 + - 21.333333333333332 * Sm21 + + 10.666666666666666 * Sm3 + ) + ) + a_gg_l1 = ( + 0.75 + * ( + ( + 0.07407407407407407 + * ( + 480.0 + + 1184.0 * n + - 256.0 * np.power(n, 2) + - 3762.0 * np.power(n, 3) + - 5931.0 * np.power(n, 4) + - 4554.0 * np.power(n, 5) + - 1440.0 * np.power(n, 6) + + 108.0 * np.power(n, 7) + + 27.0 * np.power(n, 8) + ) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 0.8888888888888888 + * ( + -32.0 + - 70.0 * n + - 147.0 * np.power(n, 2) + - 132.0 * np.power(n, 3) + + 19.0 * np.power(n, 4) + + 114.0 * np.power(n, 5) + + 40.0 * np.power(n, 6) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - 1.0 + * nf + * ( + ( + -0.04938271604938271 + * ( + 864.0 + + 3360.0 * n + + 5008.0 * np.power(n, 2) + + 2874.0 * np.power(n, 3) + - 1193.0 * np.power(n, 4) + - 2094.0 * np.power(n, 5) + + 640.0 * np.power(n, 6) + + 1188.0 * np.power(n, 7) + + 297.0 * np.power(n, 8) + ) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 0.19753086419753085 + * ( + -288.0 + - 630.0 * n + - 947.0 * np.power(n, 2) + - 552.0 * np.power(n, 3) + + 19.0 * np.power(n, 4) + + 390.0 * np.power(n, 5) + + 136.0 * np.power(n, 6) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + + 0.3333333333333333 + * ( + ( + 0.2962962962962963 + * ( + -360.0 + - 1488.0 * n + - 3466.0 * np.power(n, 2) + - 4326.0 * np.power(n, 3) + - 3242.0 * np.power(n, 4) + - 2947.0 * np.power(n, 5) + - 2467.0 * np.power(n, 6) + - 82.0 * np.power(n, 7) + + 1640.0 * np.power(n, 8) + + 1095.0 * np.power(n, 9) + + 219.0 * np.power(n, 10) + ) + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + - ( + 3.5555555555555554 + * ( + -24.0 + - 56.0 * n + - 100.0 * np.power(n, 2) + - 129.0 * np.power(n, 3) + - 50.0 * np.power(n, 4) + + 3.0 * np.power(n, 5) + + 4.0 * np.power(n, 6) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + - 1.0 + * nf + * ( + ( + -0.4444444444444444 + * ( + -288.0 + - 1600.0 * n + - 4648.0 * np.power(n, 2) + - 7656.0 * np.power(n, 3) + - 8310.0 * np.power(n, 4) + - 6669.0 * np.power(n, 5) + - 3349.0 * np.power(n, 6) + - 762.0 * np.power(n, 7) + + 368.0 * np.power(n, 8) + + 335.0 * np.power(n, 9) + + 67.0 * np.power(n, 10) + ) + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + - ( + 10.666666666666666 + * ( + 16.0 + + 48.0 * n + + 90.0 * np.power(n, 2) + + 109.0 * np.power(n, 3) + + 52.0 * np.power(n, 4) + + 5.0 * np.power(n, 5) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * (16.0 * np.power(S1, 2) - 26.666666666666668 * S2) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - ( + 1.0 + * np.power(2.0 + n + np.power(n, 2), 2) + * (5.333333333333333 * np.power(S1, 2) - 16.0 * S2) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - 0.8888888888888888 + * ( + (-115.39746270332105 * (2.0 + n + np.power(n, 2))) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + - ( + 2.0 + * ( + 48.0 + + 152.0 * n + + 324.0 * np.power(n, 2) + + 490.0 * np.power(n, 3) + + 84.0 * np.power(n, 4) + - 786.0 * np.power(n, 5) + - 1057.0 * np.power(n, 6) + - 846.0 * np.power(n, 7) + - 379.0 * np.power(n, 8) + - 80.0 * np.power(n, 9) + - 5.0 * np.power(n, 10) + + 6.0 * np.power(n, 11) + + np.power(n, 12) + ) + ) + / ((-1.0 + n) * np.power(n, 5) * np.power(1.0 + n, 5) * (2.0 + n)) + - ( + 8.0 + * ( + -16.0 + - 32.0 * n + + 56.0 * np.power(n, 2) + + 158.0 * np.power(n, 3) + + 142.0 * np.power(n, 4) + + 95.0 * np.power(n, 5) + + 51.0 * np.power(n, 6) + + 23.0 * np.power(n, 7) + + 3.0 * np.power(n, 8) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * (2.0 + n)) + + ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * (6.0 + 9.0 * n + 4.0 * np.power(n, 2) + 5.0 * np.power(n, 3)) + * np.power(S1, 2) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 3) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -8.0 + + 10.0 * n + + 69.0 * np.power(n, 2) + + 48.0 * np.power(n, 3) + + 17.0 * np.power(n, 4) + ) + * S2 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * (-2.6666666666666665 * np.power(S1, 3) + 24.0 * S1 * S2 - 32.0 * S21) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 5.333333333333333 + * (2.0 + n + np.power(n, 2)) + * (-14.0 + 5.0 * n + 5.0 * np.power(n, 2)) + * S3 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 32.0 + * ( + -16.0 + - 24.0 * n + - 26.0 * np.power(n, 2) + - 3.0 * np.power(n, 3) + + np.power(n, 4) + + 3.0 * np.power(n, 5) + + np.power(n, 6) + ) + * Sm2 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + (2.0 + n + np.power(n, 2)) + * (-256.0 * S1 * Sm2 + 256.0 * Sm21 - 128.0 * Sm3) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - 2.0 + * ( + ( + -4.808227612638377 + * (10.0 + n + np.power(n, 2)) + * (18.0 + 5.0 * n + 5.0 * np.power(n, 2)) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 0.2962962962962963 + * ( + -12096.0 + - 47232.0 * n + - 79152.0 * np.power(n, 2) + - 82640.0 * np.power(n, 3) + - 33372.0 * np.power(n, 4) + + 43144.0 * np.power(n, 5) + + 28263.0 * np.power(n, 6) + - 83791.0 * np.power(n, 7) + - 204934.0 * np.power(n, 8) + - 246412.0 * np.power(n, 9) + - 171627.0 * np.power(n, 10) + - 50653.0 * np.power(n, 11) + + 22446.0 * np.power(n, 12) + + 30172.0 * np.power(n, 13) + + 13660.0 * np.power(n, 14) + + 3036.0 * np.power(n, 15) + + 276.0 * np.power(n, 16) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + + 76.93164180221403 * S1 + - ( + 0.8888888888888888 + * ( + 864.0 + + 2400.0 * n + + 3464.0 * np.power(n, 2) + + 2960.0 * np.power(n, 3) + - 1116.0 * np.power(n, 4) + - 6516.0 * np.power(n, 5) + - 5002.0 * np.power(n, 6) + - 2298.0 * np.power(n, 7) + - 1401.0 * np.power(n, 8) + - 452.0 * np.power(n, 9) + + 80.0 * np.power(n, 10) + + 90.0 * np.power(n, 11) + + 15.0 * np.power(n, 12) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 2) + ) + - ( + 1.3333333333333333 + * (2.0 + n + np.power(n, 2)) + * ( + -12.0 + - 16.0 * n + + 41.0 * np.power(n, 2) + - 6.0 * np.power(n, 3) + + 17.0 * np.power(n, 4) + ) + * np.power(S1, 2) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 2) + * (2.0 + n) + ) + - ( + 4.0 + * ( + 48.0 + + 80.0 * n + - 112.0 * np.power(n, 2) + - 204.0 * np.power(n, 3) + - 527.0 * np.power(n, 4) + - 454.0 * np.power(n, 5) + - 164.0 * np.power(n, 6) + - 14.0 * np.power(n, 7) + + 3.0 * np.power(n, 8) + ) + * S2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 5.333333333333333 + * (2.0 + n + np.power(n, 2)) + * (-26.0 + 5.0 * n + 5.0 * np.power(n, 2)) + * S3 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 32.0 + * (-4.0 - 1.0 * n + np.power(n, 2)) + * (2.0 + n + np.power(n, 2)) + * Sm2 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + - ( + 32.0 + * ( + -32.0 + - 12.0 * n + + 4.0 * np.power(n, 2) + + 81.0 * np.power(n, 3) + + 28.0 * np.power(n, 4) + + np.power(n, 5) + + 13.0 * np.power(n, 6) + + 10.0 * np.power(n, 7) + + 3.0 * np.power(n, 8) + ) + * Sm2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 64.0 + * ( + 16.0 + + 6.0 * n + + 7.0 * np.power(n, 2) + + 2.0 * np.power(n, 3) + + np.power(n, 4) + ) + * S1 + * Sm2 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - (32.0 * (2.0 + n + np.power(n, 2)) * (14.0 + n + np.power(n, 2)) * Sm21) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + -14.424682837915132 + + 2.6666666666666665 * np.power(S1, 3) + - 40.0 * S1 * S2 + + 32.0 * S21 + - 32.0 * S1 * Sm2 + - 16.0 * Sm3 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + (96.0 * (2.0 + n + np.power(n, 2)) * (4.0 + n + np.power(n, 2)) * Sm3) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - 4.5 + * ( + ( + 76.93164180221403 + * ( + 6.0 + + 5.0 * n + + 7.0 * np.power(n, 2) + + 4.0 * np.power(n, 3) + + 2.0 * np.power(n, 4) + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 0.012345679012345678 + * ( + 41472.0 + + 222336.0 * n + + 559488.0 * np.power(n, 2) + + 895648.0 * np.power(n, 3) + + 1.047352e6 * np.power(n, 4) + + 963340.0 * np.power(n, 5) + + 733338.0 * np.power(n, 6) + + 623697.0 * np.power(n, 7) + + 531516.0 * np.power(n, 8) + + 375431.0 * np.power(n, 9) + + 208394.0 * np.power(n, 10) + + 79295.0 * np.power(n, 11) + + 19944.0 * np.power(n, 12) + + 2493.0 * np.power(n, 13) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - 76.93164180221403 * S1 + - ( + 0.04938271604938271 + * ( + -3888.0 + - 12312.0 * n + - 33372.0 * np.power(n, 2) + - 40374.0 * np.power(n, 3) + + 14578.0 * np.power(n, 4) + + 113169.0 * np.power(n, 5) + + 140861.0 * np.power(n, 6) + + 93240.0 * np.power(n, 7) + + 44700.0 * np.power(n, 8) + + 17235.0 * np.power(n, 9) + + 5939.0 * np.power(n, 10) + + 2058.0 * np.power(n, 11) + + 310.0 * np.power(n, 12) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 2) + ) + + ( + 1.7777777777777777 + * ( + -24.0 + - 152.0 * n + - 274.0 * np.power(n, 2) + - 241.0 * np.power(n, 3) + - 113.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + ) + * S2 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + S1 * (71.11111111111111 * S2 - 10.666666666666666 * S3) + + ( + 0.8888888888888888 + * ( + 54.0 + + 33.0 * n + + 73.0 * np.power(n, 2) + + 80.0 * np.power(n, 3) + + 40.0 * np.power(n, 4) + ) + * S3 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + - ( + 1.7777777777777777 + * ( + 360.0 + + 108.0 * n + - 586.0 * np.power(n, 2) + - 1483.0 * np.power(n, 3) + - 848.0 * np.power(n, 4) + + 239.0 * np.power(n, 5) + + 691.0 * np.power(n, 6) + + 524.0 * np.power(n, 7) + + 131.0 * np.power(n, 8) + ) + * Sm2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 3.5555555555555554 + * ( + -108.0 + - 36.0 * n + - 85.0 * np.power(n, 2) + - 78.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + + 60.0 * np.power(n, 5) + + 20.0 * np.power(n, 6) + ) + * S1 + * Sm2 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + 10.666666666666666 * np.power(Sm2, 2) + + ( + ( + -108.0 + - 72.0 * n + - 121.0 * np.power(n, 2) + - 78.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + + 60.0 * np.power(n, 5) + + 20.0 * np.power(n, 6) + ) + * (-3.5555555555555554 * Sm21 + 1.7777777777777777 * Sm3) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + return a_gg_l0 + a_gg_l1 * L + a_gg_l2 * L**2 + a_gg_l3 * L**3 diff --git a/src/eko/matching_conditions/as3/aggTF2.py b/src/eko/matching_conditions/as3/aggTF2.py new file mode 100644 index 000000000..707e14443 --- /dev/null +++ b/src/eko/matching_conditions/as3/aggTF2.py @@ -0,0 +1,332 @@ +# -*- coding: utf-8 -*- +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def A_ggTF2(n, sx): + r""" + Computes the approximate incomplete part of :math:`A_{gg}^{S,(3)}(N)` + proportional to :math:`T_{F}^2`. + The experssion is presented in :cite:`Ablinger:2014uka` (eq 4.2). + It contains a binomial factor which is given approximated. + + When using the code, please cite the complete list of references + available in :mod:`eko.matching_conditions.as3`. + + Parameters + ---------- + n : complex + Mellin moment + sx : list + harmonic sums cache + + Returns + ------- + A_ggTF2 : complex + :math:`A_{gg,T_{F}^2}^{S,(3)}(N)` + """ + S1 = sx[0][0] + S2 = sx[1][0] + S3 = sx[2][0] + S21 = sx[2][1] + # here we use an approximation at large N + # for binomial(2 * n, n) / np.power(4, n) + # faster than the exact result + binfact = ( + 0.00275483 / n ** (7 / 2) + + 0.00440773 / n ** (5 / 2) + - 0.0705237 / n ** (3 / 2) + + 0.56419 / np.sqrt(n) + ) + return 0.3333333333333333 * ( + ( + 0.1335618781288438 + * ( + -1472.0 + - 1472.0 * n + - 1714.0 * np.power(n, 2) + - 547.0 * np.power(n, 3) + - 431.0 * np.power(n, 4) + - 189.0 * np.power(n, 5) + - 63.0 * np.power(n, 6) + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - ( + 0.00823045267489712 + * ( + 18144.0 + - 21600.0 * n + - 167688.0 * np.power(n, 2) + - 407328.0 * np.power(n, 3) + - 325576.0 * np.power(n, 4) + + 89818.0 * np.power(n, 5) + - 807075.0 * np.power(n, 6) + - 1.672874e6 * np.power(n, 7) + - 379547.0 * np.power(n, 8) + + 593774.0 * np.power(n, 9) + + 61883.0 * np.power(n, 10) + - 152862.0 * np.power(n, 11) + - 9409.0 * np.power(n, 12) + + 35472.0 * np.power(n, 13) + + 8868.0 * np.power(n, 14) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * (2.0 + n) + * (-3.0 + 2.0 * n) + * (-1.0 + 2.0 * n) + ) + + ( + 0.5925925925925926 + * ( + -24.0 + - 56.0 * n + - 100.0 * np.power(n, 2) + - 129.0 * np.power(n, 3) + - 50.0 * np.power(n, 4) + + 3.0 * np.power(n, 5) + + 4.0 * np.power(n, 6) + ) + * np.power(S1, 2) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + (0.5925925925925926 * np.power(2.0 + n + np.power(n, 2), 2) * np.power(S1, 3)) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + 1.6449340668482262 + * ( + ( + -0.8888888888888888 + * ( + 84.0 + + 148.0 * n + + 245.0 * np.power(n, 2) + + 282.0 * np.power(n, 3) + - 74.0 * np.power(n, 4) + - 108.0 * np.power(n, 5) + + 106.0 * np.power(n, 6) + + 132.0 * np.power(n, 7) + + 33.0 * np.power(n, 8) + ) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + (5.333333333333333 * np.power(2.0 + n + np.power(n, 2), 2) * S1) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - ( + 1.7777777777777777 + * ( + -24.0 + - 56.0 * n + - 100.0 * np.power(n, 2) + - 129.0 * np.power(n, 3) + - 50.0 * np.power(n, 4) + + 3.0 * np.power(n, 5) + + 4.0 * np.power(n, 6) + ) + * S2 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * (2.0 + n)) + + S1 + * ( + ( + -0.3950617283950617 + * ( + 216.0 + + 1008.0 * n + + 2082.0 * np.power(n, 2) + + 2564.0 * np.power(n, 3) + + 2192.0 * np.power(n, 4) + + 2206.0 * np.power(n, 5) + + 1470.0 * np.power(n, 6) + + 388.0 * np.power(n, 7) + - 221.0 * np.power(n, 8) + + 136.0 * np.power(n, 9) + + 23.0 * np.power(n, 10) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * (2.0 + n) + * (-3.0 + 2.0 * n) + * (-1.0 + 2.0 * n) + ) + - (5.333333333333333 * np.power(2.0 + n + np.power(n, 2), 2) * S2) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + - ( + 1.0 + * np.power(2.0 + n + np.power(n, 2), 2) + * (-21.333333333333332 * S21 + 13.037037037037036 * S3) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 2.80479944070572 + * np.power(4.0, 2) + * ( + -80.0 + - 104.0 * n + + 44.0 * np.power(n, 2) + + 47.0 * np.power(n, 3) + - 53.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + + 9.0 * np.power(n, 6) + ) + * binfact + ) + / ( + (-1.0 + n) + * n + * np.power(1.0 + n, 2) + * (2.0 + n) + * (-3.0 + 2.0 * n) + * (-1.0 + 2.0 * n) + ) + ) + 0.75 * ( + ( + 0.00027434842249657066 + * ( + 181440.0 + - 518400.0 * n + - 1.22544e6 * np.power(n, 2) + + 2.452488e6 * np.power(n, 3) + + 2.36045e6 * np.power(n, 4) + - 1.1167685e7 * np.power(n, 5) + - 2.1164117e7 * np.power(n, 6) + - 1.4957774e7 * np.power(n, 7) + - 710852.0 * np.power(n, 8) + + 6.431215e6 * np.power(n, 9) + + 4.037555e6 * np.power(n, 10) + + 481788.0 * np.power(n, 11) + + 149796.0 * np.power(n, 12) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * (2.0 + n) + * (-3.0 + 2.0 * n) + * (-1.0 + 2.0 * n) + ) + + 1.2020569031595942 + * ( + ( + -0.025925925925925925 + * ( + -2624.0 + - 7214.0 * n + - 3047.0 * np.power(n, 2) + + 3726.0 * np.power(n, 3) + + 1287.0 * np.power(n, 4) + ) + ) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + - 41.48148148148148 * S1 + ) + + 1.6449340668482262 + * ( + ( + 0.14814814814814814 + * ( + 168.0 + + 784.0 * n + + 1118.0 * np.power(n, 2) + + 767.0 * np.power(n, 3) + + 631.0 * np.power(n, 4) + + 297.0 * np.power(n, 5) + + 99.0 * np.power(n, 6) + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - 20.74074074074074 * S1 + ) + - ( + 0.0021947873799725653 + * ( + -12960.0 + - 38880.0 * n + - 7470.0 * np.power(n, 2) + - 207066.0 * np.power(n, 3) + - 194200.0 * np.power(n, 4) + + 478087.0 * np.power(n, 5) + + 196513.0 * np.power(n, 6) + - 563492.0 * np.power(n, 7) + - 293651.0 * np.power(n, 8) + + 180403.0 * np.power(n, 9) + + 96020.0 * np.power(n, 10) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * (2.0 + n) + * (-3.0 + 2.0 * n) + * (-1.0 + 2.0 * n) + ) + - ( + 0.02962962962962963 + * ( + -142.0 + - 629.0 * n + - 751.0 * np.power(n, 2) + - 223.0 * np.power(n, 3) + + 95.0 * np.power(n, 4) + + 70.0 * np.power(n, 5) + ) + * np.power(S1, 2) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 0.02962962962962963 + * ( + -462.0 + - 1329.0 * n + - 1621.0 * np.power(n, 2) + - 883.0 * np.power(n, 3) + - 135.0 * np.power(n, 4) + + 550.0 * np.power(n, 5) + + 220.0 * np.power(n, 6) + ) + * S2 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 1.0666666666666667 + * (1.0 - 7.0 * n + 4.0 * np.power(n, 2) + 4.0 * np.power(n, 3)) + * (S21 - 1.0 * S3) + ) + / ((-1.0 + n) * n * (1.0 + n)) + + ( + 0.18698662938038133 + * np.power(4.0, 1) + * ( + 996.0 + + 712.0 * n + - 1495.0 * np.power(n, 2) + + 219.0 * np.power(n, 3) + + 452.0 * np.power(n, 4) + - 2094.0 * np.power(n, 5) + + 283.0 * np.power(n, 6) + + 539.0 * np.power(n, 7) + + 100.0 * np.power(n, 8) + ) + * binfact + ) + / ( + (-1.0 + n) + * n + * np.power(1.0 + n, 2) + * (2.0 + n) + * (-3.0 + 2.0 * n) + * (-1.0 + 2.0 * n) + ) + ) diff --git a/src/eko/matching_conditions/as3/agq.py b/src/eko/matching_conditions/as3/agq.py new file mode 100644 index 000000000..472389d55 --- /dev/null +++ b/src/eko/matching_conditions/as3/agq.py @@ -0,0 +1,984 @@ +# -*- coding: utf-8 -*- +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def A_gq(n, sx, nf, L): # pylint: disable=too-many-locals + r""" + Computes the |N3LO| singlet |OME| :math:`A_{gq}^{S,(3)}(N)`. + The experssion is presented in :cite:`Ablinger_2014` (eq 6.3). + + When using the code, please cite the complete list of references + available in :mod:`eko.matching_conditions.as3`. + + Parameters + ---------- + n : complex + Mellin moment + sx : list + harmonic sums cache + nf : int + number of active flavor below the threshold + L : float + :math:`\ln(\mu_F^2 / m_h^2)` + + Returns + ------- + A_gq : complex + :math:`A_{gq}^{S,(3)}(N)` + """ + S1, Sm1 = sx[0] + S2, Sm2 = sx[1] + S3, S21, S2m1, Sm21, Sm2m1, Sm3 = sx[2] + S4, S31, S211, Sm22, Sm211, Sm31, Sm4 = sx[3] + a_gq_l0 = ( + 0.3333333333333333 + * ( + ( + -0.06584362139917696 + * ( + 718.0 + + 2495.0 * n + + 3608.0 * np.power(n, 2) + + 2944.0 * np.power(n, 3) + + 1364.0 * np.power(n, 4) + + 359.0 * np.power(n, 5) + ) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 4)) + + ( + 1.1851851851851851 + * ( + 8.0 + + 25.0 * n + + 23.0 * np.power(n, 2) + + 4.0 * np.power(n, 3) + + 4.0 * np.power(n, 4) + ) + * S1 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 3)) + - ( + 0.5925925925925926 + * (16.0 + 27.0 * n + 13.0 * np.power(n, 2) + 8.0 * np.power(n, 3)) + * np.power(S1, 2) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2)) + - ( + 0.5925925925925926 + * (16.0 + 27.0 * n + 13.0 * np.power(n, 2) + 8.0 * np.power(n, 3)) + * S2 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2)) + + nf + * ( + ( + 0.26337448559670784 + * ( + 394.0 + + 1388.0 * n + + 1961.0 * np.power(n, 2) + + 1540.0 * np.power(n, 3) + + 824.0 * np.power(n, 4) + + 197.0 * np.power(n, 5) + ) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 4)) + + ( + 2.3703703703703702 + * ( + 8.0 + + 25.0 * n + + 23.0 * np.power(n, 2) + + 4.0 * np.power(n, 3) + + 4.0 * np.power(n, 4) + ) + * S1 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 3)) + - ( + 1.1851851851851851 + * (16.0 + 27.0 * n + 13.0 * np.power(n, 2) + 8.0 * np.power(n, 3)) + * np.power(S1, 2) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2)) + - ( + 1.1851851851851851 + * (16.0 + 27.0 * n + 13.0 * np.power(n, 2) + 8.0 * np.power(n, 3)) + * S2 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2)) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + 59.835721401722026 + + 0.5925925925925926 * np.power(S1, 3) + + 1.7777777777777777 * S1 * S2 + + 1.1851851851851851 * S3 + + nf + * ( + -34.19184080098401 + + 1.1851851851851851 * np.power(S1, 3) + + 3.5555555555555554 * S1 * S2 + + 2.3703703703703702 * S3 + ) + ) + ) + / ((-1.0 + n) * n * (1.0 + n)) + ) + + 0.8888888888888888 + * ( + ( + 1.0684950250307503 + * ( + 192.0 + + 608.0 * n + + 436.0 * np.power(n, 2) + - 280.0 * np.power(n, 3) + - 33.0 * np.power(n, 4) + + 436.0 * np.power(n, 5) + + 730.0 * np.power(n, 6) + + 484.0 * np.power(n, 7) + + 115.0 * np.power(n, 8) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * (2.0 + n) + ) + + ( + 0.00205761316872428 + * ( + 718848.0 + + 3.036672e6 * n + + 7.448064e6 * np.power(n, 2) + + 3.6681856e7 * np.power(n, 3) + + 9.6114752e7 * np.power(n, 4) + + 9.0199968e7 * np.power(n, 5) + - 3.1178992e7 * np.power(n, 6) + - 1.39149336e8 * np.power(n, 7) + - 1.06346044e8 * np.power(n, 8) + + 2.390668e7 * np.power(n, 9) + + 1.19019157e8 * np.power(n, 10) + + 1.13250363e8 * np.power(n, 11) + + 4.9867573e7 * np.power(n, 12) + + 794307.0 * np.power(n, 13) + - 1.1396201e7 * np.power(n, 14) + - 6.177407e6 * np.power(n, 15) + - 1.469301e6 * np.power(n, 16) + - 138495.0 * np.power(n, 17) + ) + ) + / ( + (-2.0 + n) + * np.power(-1.0 + n, 2) + * np.power(n, 5) + * np.power(1.0 + n, 6) + * np.power(2.0 + n, 4) + ) + - ( + 0.09876543209876543 + * ( + -72.0 + - 456.0 * n + - 847.0 * np.power(n, 2) + - 694.0 * np.power(n, 3) + - 343.0 * np.power(n, 4) + - 216.0 * np.power(n, 5) + + 4.0 * np.power(n, 6) + ) + * np.power(S1, 2) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3)) + + ( + 0.49382716049382713 + * (-6.0 + 11.0 * n + np.power(n, 2) + 4.0 * np.power(n, 3)) + * np.power(S1, 3) + ) + / ((-1.0 + n) * np.power(n, 2) * (1.0 + n)) + - ( + 0.09876543209876543 + * ( + -5184.0 + - 7776.0 * n + - 8496.0 * np.power(n, 2) + - 6172.0 * np.power(n, 3) + + 21932.0 * np.power(n, 4) + + 14047.0 * np.power(n, 5) + - 14788.0 * np.power(n, 6) + - 20968.0 * np.power(n, 7) + - 8170.0 * np.power(n, 8) + + 297.0 * np.power(n, 9) + + 3042.0 * np.power(n, 10) + + 1132.0 * np.power(n, 11) + ) + * S2 + ) + / ( + (-2.0 + n) + * np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * (2.0 + n) + ) + + S1 + * ( + ( + 0.06584362139917696 + * ( + -108.0 + - 1008.0 * n + - 4161.0 * np.power(n, 2) + - 6041.0 * np.power(n, 3) + - 1186.0 * np.power(n, 4) + + 5051.0 * np.power(n, 5) + + 5986.0 * np.power(n, 6) + + 3236.0 * np.power(n, 7) + + 1031.0 * np.power(n, 8) + ) + ) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4)) + + ( + 0.2962962962962963 + * ( + 18.0 + + 341.0 * n + + 546.0 * np.power(n, 2) + + 293.0 * np.power(n, 3) + + 166.0 * np.power(n, 4) + ) + * S2 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2)) + ) + - ( + 0.5925925925925926 + * (70.0 + 111.0 * n + 64.0 * np.power(n, 2) + 35.0 * np.power(n, 3)) + * S21 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2)) + + ( + 0.19753086419753085 + * ( + -876.0 + - 1532.0 * n + - 1631.0 * np.power(n, 2) + + 434.0 * np.power(n, 3) + + 828.0 * np.power(n, 4) + + 774.0 * np.power(n, 5) + + 275.0 * np.power(n, 6) + ) + * S3 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * (2.0 + n) + ) + - ( + 10.666666666666666 + * ( + 64.0 + + 120.0 * n + - 16.0 * np.power(n, 2) + - 2.0 * np.power(n, 3) + + 3.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + + 3.0 * np.power(n, 7) + + np.power(n, 8) + ) + * Sm2 + ) + / ( + (-2.0 + n) + * np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + -141.50943229384302 + + 0.37037037037037035 * np.power(S1, 4) + - 8.444444444444445 * np.power(S1, 2) * S2 + - 0.6666666666666666 * np.power(S2, 2) + - 3.5555555555555554 * S211 + - (128.0 * S2m1) / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + + S1 + * ( + 42.73980100123002 + + 3.5555555555555554 * S21 + - 11.25925925925926 * S3 + ) + + 10.666666666666666 * S31 + - 19.11111111111111 * S4 + + (128.0 * S2 * Sm1) / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + - (128.0 * Sm1 * Sm2) / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + + (128.0 * Sm2m1) / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + + (42.666666666666664 * Sm3) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + ) + ) + / ((-1.0 + n) * n * (1.0 + n)) + ) + + 2.0 + * ( + ( + -0.5342475125153752 + * ( + 1120.0 + - 172.0 * n + + 1084.0 * np.power(n, 2) + - 253.0 * np.power(n, 3) + + 65.0 * np.power(n, 4) + + 249.0 * np.power(n, 5) + + 19.0 * np.power(n, 6) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * (2.0 + n) + ) + + ( + 0.03292181069958848 + * ( + -6912.0 + - 47232.0 * n + - 441984.0 * np.power(n, 2) + - 1.844224e6 * np.power(n, 3) + - 3.89016e6 * np.power(n, 4) + - 4.766232e6 * np.power(n, 5) + - 3.300816e6 * np.power(n, 6) + - 574564.0 * np.power(n, 7) + + 1.086304e6 * np.power(n, 8) + + 625443.0 * np.power(n, 9) + - 386836.0 * np.power(n, 10) + - 504489.0 * np.power(n, 11) + - 121050.0 * np.power(n, 12) + + 88963.0 * np.power(n, 13) + + 76658.0 * np.power(n, 14) + + 23287.0 * np.power(n, 15) + + 2596.0 * np.power(n, 16) + ) + ) + / ( + (-2.0 + n) + * np.power(-1.0 + n, 2) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + + ( + 0.04938271604938271 + * ( + 1152.0 + - 4752.0 * n + - 17128.0 * np.power(n, 2) + - 7888.0 * np.power(n, 3) + + 16190.0 * np.power(n, 4) + + 22753.0 * np.power(n, 5) + + 12689.0 * np.power(n, 6) + + 5119.0 * np.power(n, 7) + + 1821.0 * np.power(n, 8) + + 284.0 * np.power(n, 9) + ) + * np.power(S1, 2) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 0.19753086419753085 + * ( + -150.0 + - 1.0 * n + + 165.0 * np.power(n, 2) + + 49.0 * np.power(n, 3) + + 23.0 * np.power(n, 4) + + 4.0 * np.power(n, 5) + ) + * np.power(S1, 3) + ) + / (np.power(-1.0 + n, 2) * np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - ( + 0.14814814814814814 + * ( + 4608.0 + + 5984.0 * n + + 2528.0 * np.power(n, 2) + + 10352.0 * np.power(n, 3) + + 10204.0 * np.power(n, 4) + + 434.0 * np.power(n, 5) + - 1853.0 * np.power(n, 6) + - 759.0 * np.power(n, 7) + - 265.0 * np.power(n, 8) + + 81.0 * np.power(n, 9) + + 78.0 * np.power(n, 10) + ) + * S2 + ) + / ( + (-2.0 + n) + * np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + S1 + * ( + ( + -0.03292181069958848 + * ( + 3456.0 + + 33984.0 * n + + 39648.0 * np.power(n, 2) + - 118240.0 * np.power(n, 3) + - 256840.0 * np.power(n, 4) + - 15780.0 * np.power(n, 5) + + 382214.0 * np.power(n, 6) + + 482244.0 * np.power(n, 7) + + 299724.0 * np.power(n, 8) + + 120121.0 * np.power(n, 9) + + 39379.0 * np.power(n, 10) + + 10131.0 * np.power(n, 11) + + 1207.0 * np.power(n, 12) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + 0.5925925925925926 + * ( + -66.0 + - 7.0 * n + - 283.0 * np.power(n, 2) + + 19.0 * np.power(n, 3) + + 72.0 * np.power(n, 4) + + 54.0 * np.power(n, 5) + + 31.0 * np.power(n, 6) + ) + * S2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * (2.0 + n) + ) + ) + + ( + 1.7777777777777777 + * ( + 88.0 + - 10.0 * n + + 81.0 * np.power(n, 2) + + 4.0 * np.power(n, 3) + + 15.0 * np.power(n, 4) + + 14.0 * np.power(n, 5) + ) + * S21 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * (2.0 + n) + ) + + ( + 0.09876543209876543 + * ( + 24.0 + - 356.0 * n + - 2066.0 * np.power(n, 2) + + 725.0 * np.power(n, 3) + + 981.0 * np.power(n, 4) + + 567.0 * np.power(n, 5) + + 269.0 * np.power(n, 6) + ) + * S3 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * (2.0 + n) + ) + + ( + ( + -0.5925925925925926 + * ( + -960.0 + - 1304.0 * n + + 3640.0 * np.power(n, 2) + + 5838.0 * np.power(n, 3) + + 1254.0 * np.power(n, 4) + - 5032.0 * np.power(n, 5) + - 4499.0 * np.power(n, 6) + - 1445.0 * np.power(n, 7) + + 285.0 * np.power(n, 8) + + 503.0 * np.power(n, 9) + + 136.0 * np.power(n, 10) + ) + ) + / ( + (-2.0 + n) + * np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 1.1851851851851851 + * ( + 36.0 + + 137.0 * n + + 210.0 * np.power(n, 2) + + 95.0 * np.power(n, 3) + + 52.0 * np.power(n, 4) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2)) + ) + * Sm2 + - ( + 1.1851851851851851 + * ( + 36.0 + + 85.0 * n + + 126.0 * np.power(n, 2) + + 49.0 * np.power(n, 3) + + 26.0 * np.power(n, 4) + ) + * Sm21 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2)) + + ( + 0.5925925925925926 + * ( + -192.0 + - 334.0 * n + - 373.0 * np.power(n, 2) + + 253.0 * np.power(n, 3) + + 291.0 * np.power(n, 4) + + 159.0 * np.power(n, 5) + + 52.0 * np.power(n, 6) + ) + * Sm3 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * (2.0 + n) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + 122.70623136505614 + - 0.37037037037037035 * np.power(S1, 4) + - 7.555555555555555 * np.power(S1, 2) * S2 + - 13.555555555555555 * np.power(S2, 2) + + 16.0 * S211 + + (64.0 * S2m1) / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + + 10.666666666666666 * S31 + - 39.55555555555556 * S4 + - (64.0 * S2 * Sm1) / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + + ( + -19.555555555555557 * np.power(S1, 2) + - 19.555555555555557 * S2 + + (64.0 * Sm1) / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + ) + * Sm2 + - 3.5555555555555554 * np.power(Sm2, 2) + + S1 + * ( + -17.095920400492005 + - 7.111111111111111 * S21 + - 27.85185185185185 * S3 + + 32.0 * Sm21 + ) + - 39.111111111111114 * Sm211 + + 24.88888888888889 * Sm22 + - (64.0 * Sm2m1) / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + - 33.77777777777778 * S1 * Sm3 + + 30.22222222222222 * Sm31 + - 35.55555555555556 * Sm4 + ) + ) + / ((-1.0 + n) * n * (1.0 + n)) + ) + ) + a_gq_l3 = ( + -1.0 + * (2.0 + n + np.power(n, 2)) + * ( + 1.1851851851851851 * (2.0 + nf) + + 0.8888888888888888 + * ( + ( + 0.4444444444444444 + * ( + 48.0 + + 44.0 * n + + 52.0 * np.power(n, 2) + + 19.0 * np.power(n, 3) + + 17.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + - 1.7777777777777777 * S1 + ) + + 2.0 + * ( + ( + -0.8888888888888888 + * ( + 4.0 + - 18.0 * n + - 7.0 * np.power(n, 2) + + 22.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + ) + ) + / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + + 1.7777777777777777 * S1 + ) + ) + ) / ((-1.0 + n) * n * (1.0 + n)) + a_gq_l2 = ( + 0.3333333333333333 + * ( + ( + 3.5555555555555554 + * (16.0 + 27.0 * n + 13.0 * np.power(n, 2) + 8.0 * np.power(n, 3)) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2)) + - (10.666666666666666 * (2.0 + n + np.power(n, 2)) * S1) + / ((-1.0 + n) * n * (1.0 + n)) + ) + + 0.8888888888888888 + * ( + ( + -0.2222222222222222 + * ( + -768.0 + + 112.0 * n + - 720.0 * np.power(n, 2) + - 1616.0 * np.power(n, 3) + - 3236.0 * np.power(n, 4) + - 2451.0 * np.power(n, 5) + - 526.0 * np.power(n, 6) + + 604.0 * np.power(n, 7) + + 450.0 * np.power(n, 8) + + 87.0 * np.power(n, 9) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 1.7777777777777777 + * (-6.0 + 17.0 * n + 4.0 * np.power(n, 2) + 7.0 * np.power(n, 3)) + * S1 + ) + / ((-1.0 + n) * np.power(n, 2) * (1.0 + n)) + + ( + 2.6666666666666665 + * (2.0 + n + np.power(n, 2)) + * (np.power(S1, 2) - 5.0 * S2) + ) + / ((-1.0 + n) * n * (1.0 + n)) + ) + + 2.0 + * ( + ( + 0.4444444444444444 + * ( + 384.0 + + 896.0 * n + + 528.0 * np.power(n, 2) + - 124.0 * np.power(n, 3) + - 820.0 * np.power(n, 4) + - 309.0 * np.power(n, 5) + + 694.0 * np.power(n, 6) + + 860.0 * np.power(n, 7) + + 414.0 * np.power(n, 8) + + 69.0 * np.power(n, 9) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 3.5555555555555554 + * ( + 30.0 + - 7.0 * n + - 33.0 * np.power(n, 2) + - 8.0 * np.power(n, 3) + - 1.0 * np.power(n, 4) + + np.power(n, 5) + ) + * S1 + ) + / (np.power(-1.0 + n, 2) * np.power(n, 2) * (1.0 + n) * (2.0 + n)) + + ( + (2.0 + n + np.power(n, 2)) + * (-2.6666666666666665 * np.power(S1, 2) - 8.0 * S2 - 16.0 * Sm2) + ) + / ((-1.0 + n) * n * (1.0 + n)) + ) + ) + a_gq_l1 = ( + (-12.246913580246913 * (2.0 + n + np.power(n, 2))) + / ((-1.0 + n) * n * (1.0 + n)) + - 0.3333333333333333 + * nf + * ( + ( + 1.1851851851851851 + * ( + 38.0 + + 80.0 * n + + 86.0 * np.power(n, 2) + + 81.0 * np.power(n, 3) + + 19.0 * np.power(n, 4) + ) + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 3)) + + ( + 3.5555555555555554 + * (16.0 + 27.0 * n + 13.0 * np.power(n, 2) + 8.0 * np.power(n, 3)) + * S1 + ) + / ((-1.0 + n) * n * np.power(1.0 + n, 2)) + + ( + (2.0 + n + np.power(n, 2)) + * (-5.333333333333333 * np.power(S1, 2) - 5.333333333333333 * S2) + ) + / ((-1.0 + n) * n * (1.0 + n)) + ) + - 0.8888888888888888 + * ( + ( + -0.07407407407407407 + * ( + 3456.0 + + 9504.0 * n + + 18240.0 * np.power(n, 2) + + 65344.0 * np.power(n, 3) + + 81160.0 * np.power(n, 4) + + 44386.0 * np.power(n, 5) + + 3704.0 * np.power(n, 6) + - 32981.0 * np.power(n, 7) + - 31663.0 * np.power(n, 8) + - 11406.0 * np.power(n, 9) + + 436.0 * np.power(n, 10) + + 1545.0 * np.power(n, 11) + + 339.0 * np.power(n, 12) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 5) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 2) + ) + + ( + 0.2962962962962963 + * ( + -72.0 + - 408.0 * n + - 446.0 * np.power(n, 2) + + 175.0 * np.power(n, 3) + + 472.0 * np.power(n, 4) + + 243.0 * np.power(n, 5) + + 164.0 * np.power(n, 6) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3)) + - ( + 0.4444444444444444 + * ( + -24.0 + + 74.0 * n + + 135.0 * np.power(n, 2) + + 68.0 * np.power(n, 3) + + 43.0 * np.power(n, 4) + ) + * np.power(S1, 2) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2)) + - ( + 0.4444444444444444 + * ( + -288.0 + - 480.0 * n + - 1444.0 * np.power(n, 2) + - 2036.0 * np.power(n, 3) + - 807.0 * np.power(n, 4) + + 802.0 * np.power(n, 5) + + 1056.0 * np.power(n, 6) + + 706.0 * np.power(n, 7) + + 187.0 * np.power(n, 8) + ) + * S2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * (2.0 + n) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + -76.93164180221403 + - 0.8888888888888888 * np.power(S1, 3) + + 29.333333333333332 * S1 * S2 + - 10.666666666666666 * S21 + + 19.555555555555557 * S3 + - (128.0 * Sm2) / ((-1.0 + n) * n * (1.0 + n) * (2.0 + n)) + ) + ) + / ((-1.0 + n) * n * (1.0 + n)) + ) + - 2.0 + * ( + ( + 0.2962962962962963 + * ( + 288.0 + + 7440.0 * n + + 28928.0 * np.power(n, 2) + + 49136.0 * np.power(n, 3) + + 44966.0 * np.power(n, 4) + + 23063.0 * np.power(n, 5) + + 5814.0 * np.power(n, 6) + + 8033.0 * np.power(n, 7) + + 14891.0 * np.power(n, 8) + + 13239.0 * np.power(n, 9) + + 7232.0 * np.power(n, 10) + + 2301.0 * np.power(n, 11) + + 301.0 * np.power(n, 12) + ) + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 0.2962962962962963 + * ( + 576.0 + - 1680.0 * n + - 8464.0 * np.power(n, 2) + - 7168.0 * np.power(n, 3) + + 4460.0 * np.power(n, 4) + + 11533.0 * np.power(n, 5) + + 9317.0 * np.power(n, 6) + + 5347.0 * np.power(n, 7) + + 2139.0 * np.power(n, 8) + + 356.0 * np.power(n, 9) + ) + * S1 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + 0.4444444444444444 + * ( + -264.0 + - 88.0 * n + + 324.0 * np.power(n, 2) + + 127.0 * np.power(n, 3) + + 86.0 * np.power(n, 4) + + 31.0 * np.power(n, 5) + ) + * np.power(S1, 2) + ) + / (np.power(-1.0 + n, 2) * np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - ( + 1.3333333333333333 + * ( + 56.0 + - 92.0 * np.power(n, 2) + - 1.0 * np.power(n, 3) + + 37.0 * np.power(n, 4) + + 33.0 * np.power(n, 5) + + 15.0 * np.power(n, 6) + ) + * S2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * (2.0 + n) + ) + - ( + 5.333333333333333 + * ( + -40.0 + - 72.0 * n + - 76.0 * np.power(n, 2) + + 39.0 * np.power(n, 3) + + 51.0 * np.power(n, 4) + + 37.0 * np.power(n, 5) + + 13.0 * np.power(n, 6) + ) + * Sm2 + ) + / ( + np.power(-1.0 + n, 2) + * np.power(n, 2) + * np.power(1.0 + n, 2) + * (2.0 + n) + ) + + ( + (2.0 + n + np.power(n, 2)) + * ( + 76.93164180221403 + + 0.8888888888888888 * np.power(S1, 3) + + 18.666666666666668 * S1 * S2 + + 28.444444444444443 * S3 + + 42.666666666666664 * S1 * Sm2 + - 21.333333333333332 * Sm21 + + 21.333333333333332 * Sm3 + ) + ) + / ((-1.0 + n) * n * (1.0 + n)) + ) + ) + return a_gq_l0 + a_gq_l1 * L + a_gq_l2 * L**2 + a_gq_l3 * L**3 diff --git a/src/eko/matching_conditions/as3/aqg.py b/src/eko/matching_conditions/as3/aqg.py new file mode 100644 index 000000000..5f6bd89ac --- /dev/null +++ b/src/eko/matching_conditions/as3/aqg.py @@ -0,0 +1,476 @@ +# -*- coding: utf-8 -*- +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def A_qg(n, sx, nf, L): + r""" + Computes the |N3LO| singlet |OME| :math:`A_{qg}^{S,(3)}(N)`. + The expression is presented in :cite:`Bierenbaum:2009mv`. + + When using the code, please cite the complete list of references + available in :mod:`eko.matching_conditions.as3`. + + Parameters + ---------- + n : complex + Mellin moment + sx : list + harmonic sums cache + nf : int + number of active flavor below the threshold + L : float + :math:`\ln(\mu_F^2 / m_h^2)` + + Returns + ------- + A_qg : complex + :math:`A_{qg}^{S,(3)}(N)` + """ + S1, _ = sx[0] + S2, Sm2 = sx[1] + S3, S21, _, _, _, Sm3 = sx[2] + S4, S31, S211, _, _, _, Sm4 = sx[3] + a_qg_l0 = 0.3333333333333333 * nf * ( + ( + -8.547960200246003 + * (2.0 + n + np.power(n, 2)) + * ( + -24.0 + - 28.0 * n + - 38.0 * np.power(n, 2) + - 17.0 * np.power(n, 3) + - 1.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + ) + ) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + + ( + 0.00411522633744856 + * ( + 995328.0 + + 5.612544e6 * n + + 1.5388416e7 * np.power(n, 2) + + 2.6395008e7 * np.power(n, 3) + + 2.9337472e7 * np.power(n, 4) + + 2.2643488e7 * np.power(n, 5) + + 1.6104128e7 * np.power(n, 6) + + 1.3846104e7 * np.power(n, 7) + + 1.1303496e7 * np.power(n, 8) + + 1.1536274e7 * np.power(n, 9) + + 1.7070917e7 * np.power(n, 10) + + 2.0248499e7 * np.power(n, 11) + + 1.6391845e7 * np.power(n, 12) + + 9.348807e6 * np.power(n, 13) + + 3.812487e6 * np.power(n, 14) + + 1.064857e6 * np.power(n, 15) + + 180999.0 * np.power(n, 16) + + 13923.0 * np.power(n, 17) + ) + ) + / ((-1.0 + n) * np.power(n, 6) * np.power(1.0 + n, 6) * np.power(2.0 + n, 5)) + - ( + 0.06584362139917696 + * ( + 1344.0 + + 7930.0 * n + + 14077.0 * np.power(n, 2) + + 11200.0 * np.power(n, 3) + + 5124.0 * np.power(n, 4) + + 1523.0 * np.power(n, 5) + ) + * S1 + ) + / (np.power(n, 2) * np.power(1.0 + n, 3) * (2.0 + n)) + + ( + 0.09876543209876543 + * ( + 120.0 + + 748.0 * n + + 930.0 * np.power(n, 2) + + 481.0 * np.power(n, 3) + + 215.0 * np.power(n, 4) + ) + * np.power(S1, 2) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + 0.2962962962962963 + * ( + 40.0 + + 324.0 * n + + 478.0 * np.power(n, 2) + + 291.0 * np.power(n, 3) + + 109.0 * np.power(n, 4) + ) + * S2 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + ( + (6.0 + 29.0 * n + 13.0 * np.power(n, 2) + 10.0 * np.power(n, 3)) + * (-0.19753086419753085 * np.power(S1, 3) - 0.5925925925925926 * S1 * S2) + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + + ( + 0.3950617283950617 + * (-6.0 + n - 16.0 * np.power(n, 2) + 5.0 * np.power(n, 3)) + * S3 + ) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + -8.547960200246003 * S1 + - 0.037037037037037035 * np.power(S1, 4) + - 0.2222222222222222 * np.power(S1, 2) * S2 + - 0.1111111111111111 * np.power(S2, 2) + - 0.2962962962962963 * S1 * S3 + + 1.5555555555555556 * S4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + 0.75 * nf * ( + (68.38368160196802 * (1.0 + n + np.power(n, 2)) * (2.0 + n + np.power(n, 2))) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + 0.03292181069958848 + * ( + -34560.0 + - 160128.0 * n + - 264192.0 * np.power(n, 2) + - 217952.0 * np.power(n, 3) + - 499824.0 * np.power(n, 4) + - 1.907512e6 * np.power(n, 5) + - 4.373672e6 * np.power(n, 6) + - 6.333994e6 * np.power(n, 7) + - 6.01512e6 * np.power(n, 8) + - 3.525799e6 * np.power(n, 9) + - 860568.0 * np.power(n, 10) + + 416251.0 * np.power(n, 11) + + 471164.0 * np.power(n, 12) + + 194011.0 * np.power(n, 13) + + 39780.0 * np.power(n, 14) + + 3315.0 * np.power(n, 15) + ) + ) + / ((-1.0 + n) * np.power(n, 5) * np.power(1.0 + n, 5) * np.power(2.0 + n, 5)) + + ( + 0.06584362139917696 + * ( + 864.0 + - 11264.0 * n + - 64352.0 * np.power(n, 2) + - 115200.0 * np.power(n, 3) + - 69902.0 * np.power(n, 4) + + 49344.0 * np.power(n, 5) + + 114495.0 * np.power(n, 6) + + 90323.0 * np.power(n, 7) + + 40547.0 * np.power(n, 8) + + 10557.0 * np.power(n, 9) + + 1244.0 * np.power(n, 10) + ) + * S1 + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + - ( + 0.19753086419753085 + * ( + 680.0 + + 2704.0 * n + + 4494.0 * np.power(n, 2) + + 3991.0 * np.power(n, 3) + + 2148.0 * np.power(n, 4) + + 694.0 * np.power(n, 5) + + 103.0 * np.power(n, 6) + ) + * np.power(S1, 2) + ) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - ( + 0.19753086419753085 + * ( + 752.0 + + 3220.0 * n + + 5724.0 * np.power(n, 2) + + 5776.0 * np.power(n, 3) + + 3438.0 * np.power(n, 4) + + 1093.0 * np.power(n, 5) + + 139.0 * np.power(n, 6) + ) + * S2 + ) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + ( + ( + 20.0 + + 49.0 * n + + 41.0 * np.power(n, 2) + + 20.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * ( + 0.3950617283950617 * np.power(S1, 3) + - 1.1851851851851851 * S1 * S2 + + 4.7407407407407405 * S21 + ) + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + ( + 0.7901234567901234 + * ( + 20.0 + + 31.0 * n + + 59.0 * np.power(n, 2) + + 38.0 * np.power(n, 3) + + 5.0 * np.power(n, 4) + ) + * S3 + ) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - ( + 0.3950617283950617 + * (224.0 + 414.0 * n + 293.0 * np.power(n, 2) + 121.0 * np.power(n, 3)) + * Sm2 + ) + / (n * np.power(1.0 + n, 2) * (2.0 + n)) + + (4.7407407407407405 * (10.0 + 8.0 * n + 5.0 * np.power(n, 2)) * Sm3) + / (n * (1.0 + n) * (2.0 + n)) + - ( + 4.0 + * (2.0 + n + np.power(n, 2)) + * ( + 8.547960200246003 * S1 + + 0.037037037037037035 * np.power(S1, 4) + - 0.2222222222222222 * np.power(S1, 2) * S2 + + 0.1111111111111111 * np.power(S2, 2) + - 1.7777777777777777 * S211 + + S1 * (1.7777777777777777 * S21 - 1.4814814814814814 * S3) + + 3.5555555555555554 * S31 + + 1.5555555555555556 * S4 + + 3.5555555555555554 * Sm4 + ) + ) + / (n * (1.0 + n) * (2.0 + n)) + ) + a_qg_l3 = ( + (29.62962962962963 * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + + (14.222222222222221 * nf) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + + (23.703703703703702 * nf) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + + (37.925925925925924 * nf) + / ((-1.0 + n) * n * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + + (16.88888888888889 * n * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + - (4.148148148148148 * np.power(n, 3) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + - (3.5555555555555554 * np.power(n, 4) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + - (0.8888888888888888 * np.power(n, 5) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 2)) + + (21.333333333333332 * nf) + / ((-1.0 + n) * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (10.666666666666666 * nf) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (16.0 * nf) / ((-1.0 + n) * n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (10.666666666666666 * n * nf) + / ((-1.0 + n) * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (5.333333333333333 * np.power(n, 2) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - (1.4814814814814814 * nf * S1) / ((1.0 + n) * (2.0 + n)) + - (2.962962962962963 * nf * S1) / (n * (1.0 + n) * (2.0 + n)) + - (1.4814814814814814 * n * nf * S1) / ((1.0 + n) * (2.0 + n)) + ) + a_qg_l2 = ( + (754.9629629629629 * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + (170.66666666666666 * nf) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + (512.0 * nf) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + (808.2962962962963 * nf) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + (1085.6296296296296 * nf) + / ((-1.0 + n) * n * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + (331.25925925925924 * n * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + (216.74074074074073 * np.power(n, 2) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + (224.14814814814815 * np.power(n, 3) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + (191.11111111111111 * np.power(n, 4) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + (103.4074074074074 * np.power(n, 5) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + (34.22222222222222 * np.power(n, 6) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + + (4.888888888888889 * np.power(n, 7) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 3)) + - (674.6666666666666 * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - (106.66666666666667 * nf) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - (448.0 * nf) / ((-1.0 + n) * n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - (746.6666666666666 * n * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - (478.0 * np.power(n, 2) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - (121.33333333333333 * np.power(n, 3) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + (37.333333333333336 * np.power(n, 4) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + (36.0 * np.power(n, 5) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + (6.0 * np.power(n, 6) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + (154.66666666666666 * nf * S1) / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (53.333333333333336 * nf * S1) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (125.33333333333333 * n * nf * S1) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (53.333333333333336 * np.power(n, 2) * nf * S1) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (13.333333333333334 * np.power(n, 3) * nf * S1) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - (9.481481481481481 * nf * S1) / ((1.0 + n) * (2.0 + n)) + - (7.111111111111111 * nf * S1) / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - (22.51851851851852 * nf * S1) / (n * (1.0 + n) * (2.0 + n)) + - (5.925925925925926 * n * nf * S1) / ((1.0 + n) * (2.0 + n)) + - (2.2222222222222223 * nf * np.power(S1, 2)) / ((1.0 + n) * (2.0 + n)) + - (4.444444444444445 * nf * np.power(S1, 2)) / (n * (1.0 + n) * (2.0 + n)) + - (2.2222222222222223 * n * nf * np.power(S1, 2)) / ((1.0 + n) * (2.0 + n)) + - (2.2222222222222223 * nf * S2) / ((1.0 + n) * (2.0 + n)) + - (4.444444444444445 * nf * S2) / (n * (1.0 + n) * (2.0 + n)) + - (2.2222222222222223 * n * nf * S2) / ((1.0 + n) * (2.0 + n)) + - (8.0 * nf * Sm2) / ((1.0 + n) * (2.0 + n)) + - (16.0 * nf * Sm2) / (n * (1.0 + n) * (2.0 + n)) + - (8.0 * n * nf * Sm2) / ((1.0 + n) * (2.0 + n)) + ) + a_qg_l1 = ( + (7208.2962962962965 * nf) + / ((-1.0 + n) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + + (853.3333333333334 * nf) + / ((-1.0 + n) * np.power(n, 5) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + + (3640.8888888888887 * nf) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + + (7808.0 * nf) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + + (11938.765432098766 * nf) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + + (12726.913580246914 * nf) + / ((-1.0 + n) * n * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + + (1396.8395061728395 * n * nf) + / ((-1.0 + n) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + - (1495.4074074074074 * np.power(n, 2) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + - (3089.037037037037 * np.power(n, 3) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + - (3217.8765432098767 * np.power(n, 4) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + - (2158.1728395061727 * np.power(n, 5) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + - (1036.148148148148 * np.power(n, 6) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + - (356.69135802469134 * np.power(n, 7) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + - (78.51851851851852 * np.power(n, 8) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + - (7.851851851851852 * np.power(n, 9) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 5) * np.power(2.0 + n, 4)) + + (5069.333333333333 * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + - (384.0 * nf) + / ((-1.0 + n) * np.power(n, 4) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + - (1856.0 * nf) + / ((-1.0 + n) * np.power(n, 3) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + - (3363.5555555555557 * nf) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + - (1706.6666666666667 * nf) + / ((-1.0 + n) * n * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + + (12603.111111111111 * n * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + + (14692.888888888889 * np.power(n, 2) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + + (9295.111111111111 * np.power(n, 3) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + + (1911.111111111111 * np.power(n, 4) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + - (1507.5555555555557 * np.power(n, 5) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + - (1289.7777777777778 * np.power(n, 6) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + - (396.0 * np.power(n, 7) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + - (44.0 * np.power(n, 8) * nf) + / ((-1.0 + n) * np.power(1.0 + n, 4) * np.power(2.0 + n, 4)) + - (1249.7777777777778 * nf * S1) / (np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - (302.22222222222223 * nf * S1) + / (n * np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - (2168.0 * n * nf * S1) / (np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - (1885.7777777777778 * np.power(n, 2) * nf * S1) + / (np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - (936.0 * np.power(n, 3) * nf * S1) + / (np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - (280.44444444444446 * np.power(n, 4) * nf * S1) + / (np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + - (41.77777777777778 * np.power(n, 5) * nf * S1) + / (np.power(1.0 + n, 3) * np.power(2.0 + n, 3)) + + (117.33333333333333 * nf * S1) / (np.power(1.0 + n, 2) * (2.0 + n)) + + (23.703703703703702 * nf * S1) + / (np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + + (103.50617283950618 * nf * S1) / (n * np.power(1.0 + n, 2) * (2.0 + n)) + + (50.76543209876543 * n * nf * S1) / (np.power(1.0 + n, 2) * (2.0 + n)) + + (20.34567901234568 * np.power(n, 2) * nf * S1) + / (np.power(1.0 + n, 2) * (2.0 + n)) + + (130.66666666666666 * nf * np.power(S1, 2)) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (53.333333333333336 * nf * np.power(S1, 2)) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (109.33333333333333 * n * nf * np.power(S1, 2)) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (53.333333333333336 * np.power(n, 2) * nf * np.power(S1, 2)) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (13.333333333333334 * np.power(n, 3) * nf * np.power(S1, 2)) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - (7.703703703703703 * nf * np.power(S1, 2)) / ((1.0 + n) * (2.0 + n)) + - (3.5555555555555554 * nf * np.power(S1, 2)) + / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - (17.185185185185187 * nf * np.power(S1, 2)) / (n * (1.0 + n) * (2.0 + n)) + - (5.925925925925926 * n * nf * np.power(S1, 2)) / ((1.0 + n) * (2.0 + n)) + - (0.7407407407407407 * nf * np.power(S1, 3)) / ((1.0 + n) * (2.0 + n)) + - (1.4814814814814814 * nf * np.power(S1, 3)) / (n * (1.0 + n) * (2.0 + n)) + - (0.7407407407407407 * n * nf * np.power(S1, 3)) / ((1.0 + n) * (2.0 + n)) + + (114.66666666666667 * nf * S2) / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (53.333333333333336 * nf * S2) + / (n * np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (125.33333333333333 * n * nf * S2) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (69.33333333333333 * np.power(n, 2) * nf * S2) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + + (13.333333333333334 * np.power(n, 3) * nf * S2) + / (np.power(1.0 + n, 2) * np.power(2.0 + n, 2)) + - (14.814814814814815 * nf * S2) / ((1.0 + n) * (2.0 + n)) + - (3.5555555555555554 * nf * S2) / (np.power(n, 2) * (1.0 + n) * (2.0 + n)) + - (17.185185185185187 * nf * S2) / (n * (1.0 + n) * (2.0 + n)) + - (5.925925925925926 * n * nf * S2) / ((1.0 + n) * (2.0 + n)) + + (5.777777777777778 * nf * S1 * S2) / ((1.0 + n) * (2.0 + n)) + + (11.555555555555555 * nf * S1 * S2) / (n * (1.0 + n) * (2.0 + n)) + + (5.777777777777778 * n * nf * S1 * S2) / ((1.0 + n) * (2.0 + n)) + - (16.0 * nf * S21) / ((1.0 + n) * (2.0 + n)) + - (32.0 * nf * S21) / (n * (1.0 + n) * (2.0 + n)) + - (16.0 * n * nf * S21) / ((1.0 + n) * (2.0 + n)) + - (5.037037037037037 * nf * S3) / ((1.0 + n) * (2.0 + n)) + - (10.074074074074074 * nf * S3) / (n * (1.0 + n) * (2.0 + n)) + - (5.037037037037037 * n * nf * S3) / ((1.0 + n) * (2.0 + n)) + + (42.666666666666664 * nf * Sm2) / ((1.0 + n) * (2.0 + n)) + + (53.333333333333336 * nf * Sm2) / (n * (1.0 + n) * (2.0 + n)) + + (26.666666666666668 * n * nf * Sm2) / ((1.0 + n) * (2.0 + n)) + - (16.0 * nf * Sm3) / ((1.0 + n) * (2.0 + n)) + - (32.0 * nf * Sm3) / (n * (1.0 + n) * (2.0 + n)) + - (16.0 * n * nf * Sm3) / ((1.0 + n) * (2.0 + n)) + ) + return a_qg_l0 + a_qg_l1 * L + a_qg_l2 * L**2 + a_qg_l3 * L**3 diff --git a/src/eko/matching_conditions/as3/aqqNS.py b/src/eko/matching_conditions/as3/aqqNS.py new file mode 100644 index 000000000..114949bd3 --- /dev/null +++ b/src/eko/matching_conditions/as3/aqqNS.py @@ -0,0 +1,754 @@ +# -*- coding: utf-8 -*- +import numba as nb +import numpy as np + +from ... import harmonics as sf + + +@nb.njit(cache=True) +def A_qqNS(n, sx, nf, L): # pylint: disable=too-many-locals + r""" + Computes the |N3LO| singlet |OME| :math:`A_{qq}^{NS,(3)}(N)`. + The experssion is presented in :cite:`Bierenbaum:2009mv` and + :cite:`Ablinger:2014vwa`. It contains some weight 5 harmonics sums. + + When using the code, please cite the complete list of references + available in :mod:`eko.matching_conditions.as3`. + + Parameters + ---------- + n : complex + Mellin moment + sx : list + harmonic sums cache + nf : int + number of active flavor below the threshold + L : float + :math:`\ln(\mu_F^2 / m_h^2)` + + Returns + ------- + A_qqNS : complex + :math:`A_{qq}^{NS,(3)}(N)` + """ + S1, Sm1 = sx[0] + S2, Sm2 = sx[1] + S3, S21, S2m1, Sm21, _, Sm3 = sx[2] + S4, S31, S211, Sm22, Sm211, _, Sm4 = sx[3] + S5, Sm5 = sx[4] + S41 = sf.S41(n, S1, S2, S3) + S311 = sf.S311(n, S1, S2) + S221 = sf.S221(n, S1, S2, S21) + Sm221 = sf.Sm221(n, S1, Sm1, S21, Sm21) + S21m2 = sf.S21m2(n, S1, S2, Sm1, Sm2, Sm3, S21, Sm21, S2m1) + S2111 = sf.S2111(n, S1, S2, S3) + Sm2111 = sf.Sm2111(n, S1, S2, S3, Sm1) + S23 = sf.S23(n, S1, S2, S3) + Sm23 = sf.Sm23(n, Sm1, Sm2, Sm3, False) + S2m3 = sf.S2m3(n, S2, Sm1, Sm2, Sm3) + a_qqNS_l0 = ( + 0.3333333333333333 + * nf + * ( + ( + 0.0054869684499314125 + * ( + 432.0 + + 144.0 * n + - 2016.0 * np.power(n, 2) + + 1712.0 * np.power(n, 3) + + 15165.0 * np.power(n, 4) + + 25380.0 * np.power(n, 5) + + 23870.0 * np.power(n, 6) + + 14196.0 * np.power(n, 7) + + 3549.0 * np.power(n, 8) + ) + ) + / (np.power(n, 4) * np.power(1.0 + n, 4)) + - 33.00960219478738 * S1 + + 11.39728026699467 + * ( + (-0.5 * (2.0 + 3.0 * n + 3.0 * np.power(n, 2))) / (n * (1.0 + n)) + + 2.0 * S1 + ) + + 1.5802469135802468 * S2 + + 7.901234567901234 * S3 + - 4.7407407407407405 * S4 + ) + + 0.3333333333333333 + * ( + ( + -0.0027434842249657062 + * ( + -432.0 + - 144.0 * n + + 2016.0 * np.power(n, 2) + + 4312.0 * np.power(n, 3) + + 11943.0 * np.power(n, 4) + + 28836.0 * np.power(n, 5) + + 36370.0 * np.power(n, 6) + + 21948.0 * np.power(n, 7) + + 5487.0 * np.power(n, 8) + ) + ) + / (np.power(n, 4) * np.power(1.0 + n, 4)) + + 16.54869684499314 * S1 + - 19.945240467240673 + * ( + (-0.5 * (2.0 + 3.0 * n + 3.0 * np.power(n, 2))) / (n * (1.0 + n)) + + 2.0 * S1 + ) + + 0.7901234567901234 * S2 + + 3.950617283950617 * S3 + - 2.3703703703703702 * S4 + ) + + 2.0 + * ( + ( + 0.09876543209876543 + * ( + 72.0 + + 132.0 * n + + 101.0 * np.power(n, 2) + + 485.0 * np.power(n, 3) + + 1283.0 * np.power(n, 4) + + 1371.0 * np.power(n, 5) + + 847.0 * np.power(n, 6) + + 138.0 * np.power(n, 7) + + 39.0 * np.power(n, 8) + ) + ) + / (np.power(n, 5) * np.power(1.0 + n, 5)) + + ( + 0.0013717421124828531 + * ( + 5184.0 + + 4752.0 * n + + 6336.0 * np.power(n, 2) + + 51804.0 * np.power(n, 3) + + 126914.0 * np.power(n, 4) + + 247433.0 * np.power(n, 5) + + 396657.0 * np.power(n, 6) + + 321746.0 * np.power(n, 7) + + 106856.0 * np.power(n, 8) + + 825.0 * np.power(n, 9) + + 165.0 * np.power(n, 10) + ) + ) + / (np.power(n, 5) * np.power(1.0 + n, 5)) + - ( + 0.5925925925925926 + * ( + -12.0 + - 10.0 * n + + 39.0 * np.power(n, 2) + + 77.0 * np.power(n, 3) + + 70.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + ) + * S1 + ) + / (np.power(n, 4) * np.power(1.0 + n, 4)) + + ( + 3.5555555555555554 + * (1.0 + 2.0 * n + 2.0 * np.power(n, 2)) + * np.power(S1, 2) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3)) + + (3.5555555555555554 * (1.0 + 2.0 * n + 2.0 * np.power(n, 2)) * S2) + / (np.power(n, 3) * np.power(1.0 + n, 3)) + - 2.3703703703703702 * np.power(S1, 3) * S2 + - ( + 0.4444444444444444 + * (14.0 + 15.0 * n + 15.0 * np.power(n, 2)) + * np.power(S2, 2) + ) + / (n * (1.0 + n)) + + 1.2020569031595942 + * ( + ( + 0.037037037037037035 + * ( + -432.0 + - 682.0 * n + - 3505.0 * np.power(n, 2) + - 4278.0 * np.power(n, 3) + - 2103.0 * np.power(n, 4) + + 648.0 * np.power(n, 5) + ) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + + ( + 0.14814814814814814 + * (108.0 + 593.0 * n + 593.0 * np.power(n, 2)) + * S1 + ) + / (n * (1.0 + n)) + - 16.0 * np.power(S1, 2) + + 16.0 * S2 + ) + - ( + 0.8888888888888888 + * ( + -8.0 + - 5.0 * n + - 15.0 * np.power(n, 2) + + 18.0 * np.power(n, 3) + + 16.0 * np.power(n, 4) + + 12.0 * np.power(n, 5) + ) + * S21 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + + 4.0 + * ( + (-0.5 * (2.0 + 3.0 * n + 3.0 * np.power(n, 2))) / (n * (1.0 + n)) + + 2.0 * S1 + ) + * (-15.338278920632018 - 4.0 * S211) + + 24.88888888888889 * S2111 + - 28.444444444444443 * S21m2 + + 21.333333333333332 * S221 + - 42.666666666666664 * S23 + + 28.444444444444443 * S2m3 + - ( + 0.09876543209876543 + * ( + -36.0 + + 144.0 * n + + 1151.0 * np.power(n, 2) + + 1573.0 * np.power(n, 3) + + 863.0 * np.power(n, 4) + + 27.0 * np.power(n, 5) + ) + * S3 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + - (0.2962962962962963 * (4.0 + 13.0 * n) * (9.0 + 13.0 * n) * S31) + / (n * (1.0 + n)) + - 28.444444444444443 * S311 + + (0.14814814814814814 * (78.0 + 443.0 * n + 443.0 * np.power(n, 2)) * S4) + / (n * (1.0 + n)) + + 28.444444444444443 * S41 + - 24.88888888888889 * S5 + + ( + ( + 0.3950617283950617 + * ( + 18.0 + - 3.0 * n + + 82.0 * np.power(n, 2) + + 266.0 * np.power(n, 3) + + 181.0 * np.power(n, 4) + ) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3)) + - ( + 0.7901234567901234 + * ( + 9.0 + + 9.0 * n + + 121.0 * np.power(n, 2) + + 224.0 * np.power(n, 3) + + 112.0 * np.power(n, 4) + ) + * S1 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + + (7.111111111111111 * np.power(S1, 2)) / (n * (1.0 + n)) + - 4.7407407407407405 * np.power(S1, 3) + + 23.703703703703702 * S2 + + 28.444444444444443 * S21 + - 9.481481481481481 * S3 + ) + * Sm2 + + S2 + * ( + ( + 0.04938271604938271 + * ( + 72.0 + + 63.0 * n + + 27.0 * np.power(n, 2) + + 940.0 * np.power(n, 3) + + 2487.0 * np.power(n, 4) + + 2469.0 * np.power(n, 5) + + 868.0 * np.power(n, 6) + ) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3)) + - 21.333333333333332 * S21 + + 18.37037037037037 * S3 + - 42.666666666666664 * Sm21 + ) + + ( + 0.7901234567901234 + * (18.0 - 39.0 * n + 112.0 * np.power(n, 2) + 112.0 * np.power(n, 3)) + * Sm21 + ) + / (np.power(n, 2) * (1.0 + n)) + + np.power(S1, 2) + * ( + ( + 0.4444444444444444 + * ( + 8.0 + + 7.0 * n + + 3.0 * np.power(n, 2) + + 10.0 * np.power(n, 3) + + 11.0 * np.power(n, 4) + + 3.0 * np.power(n, 5) + ) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3)) + + (3.5555555555555554 * S2) / (n * (1.0 + n)) + + 14.222222222222221 * S21 + - 8.88888888888889 * S3 + + 14.222222222222221 * Sm21 + ) + - (9.481481481481481 * (-3.0 + 10.0 * n + 10.0 * np.power(n, 2)) * Sm211) + / (n * (1.0 + n)) + + 113.77777777777777 * Sm2111 + + (2.3703703703703702 * (-3.0 + 10.0 * n + 10.0 * np.power(n, 2)) * Sm22) + / (n * (1.0 + n)) + + S1 + * ( + ( + -0.0054869684499314125 + * ( + 1620.0 + + 3456.0 * n + + 3240.0 * np.power(n, 2) + + 702.0 * np.power(n, 3) + + 7027.0 * np.power(n, 4) + + 39178.0 * np.power(n, 5) + + 62898.0 * np.power(n, 6) + + 43228.0 * np.power(n, 7) + + 10807.0 * np.power(n, 8) + ) + ) + / (np.power(n, 4) * np.power(1.0 + n, 4)) + - ( + 1.7777777777777777 + * (-1.0 + n) + * (-2.0 - 1.0 * n - 1.0 * np.power(n, 2) + 2.0 * np.power(n, 3)) + * S2 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + + 12.444444444444445 * np.power(S2, 2) + - (0.8888888888888888 * (16.0 + 9.0 * n + 9.0 * np.power(n, 2)) * S21) + / (n * (1.0 + n)) + + (8.88888888888889 * np.power(1.0 + 2.0 * n, 2) * S3) / (n * (1.0 + n)) + + 21.333333333333332 * S31 + - 23.11111111111111 * S4 + + ( + 4.7407407407407405 + * (-3.0 + 10.0 * n + 10.0 * np.power(n, 2)) + * Sm21 + ) + / (n * (1.0 + n)) + - 56.888888888888886 * Sm211 + + 14.222222222222221 * Sm22 + ) + - 28.444444444444443 * Sm221 + - 28.444444444444443 * Sm23 + + ( + ( + -0.3950617283950617 + * ( + 39.0 + + 169.0 * n + + 224.0 * np.power(n, 2) + + 112.0 * np.power(n, 3) + ) + ) + / (n * np.power(1.0 + n, 2)) + + (2.3703703703703702 * (3.0 + 10.0 * n + 10.0 * np.power(n, 2)) * S1) + / (n * (1.0 + n)) + - 7.111111111111111 * np.power(S1, 2) + - 7.111111111111111 * S2 + ) + * Sm3 + + ( + (2.3703703703703702 * (3.0 + 10.0 * n + 10.0 * np.power(n, 2))) + / (n * (1.0 + n)) + - 14.222222222222221 * S1 + ) + * Sm4 + - 14.222222222222221 * Sm5 + ) + + 0.8888888888888888 + * ( + ( + -0.19753086419753085 + * ( + 72.0 + + 132.0 * n + + 101.0 * np.power(n, 2) + + 485.0 * np.power(n, 3) + + 1283.0 * np.power(n, 4) + + 1371.0 * np.power(n, 5) + + 847.0 * np.power(n, 6) + + 138.0 * np.power(n, 7) + + 39.0 * np.power(n, 8) + ) + ) + / (np.power(n, 5) * np.power(1.0 + n, 5)) + + ( + 0.012345679012345678 + * ( + -144.0 + + 336.0 * n + + 1424.0 * np.power(n, 2) + + 3280.0 * np.power(n, 3) + - 2307.0 * np.power(n, 4) + - 32383.0 * np.power(n, 5) + - 79721.0 * np.power(n, 6) + - 95154.0 * np.power(n, 7) + - 72513.0 * np.power(n, 8) + - 31095.0 * np.power(n, 9) + - 6219.0 * np.power(n, 10) + ) + ) + / (np.power(n, 5) * np.power(1.0 + n, 5)) + + ( + 1.1851851851851851 + * ( + -12.0 + - 10.0 * n + + 39.0 * np.power(n, 2) + + 77.0 * np.power(n, 3) + + 70.0 * np.power(n, 4) + + 9.0 * np.power(n, 5) + + 3.0 * np.power(n, 6) + ) + * S1 + ) + / (np.power(n, 4) * np.power(1.0 + n, 4)) + - ( + 7.111111111111111 + * (1.0 + 2.0 * n + 2.0 * np.power(n, 2)) + * np.power(S1, 2) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3)) + + 1.2020569031595942 + * ( + ( + 0.2222222222222222 + * ( + 48.0 + + 302.0 * n + + 767.0 * np.power(n, 2) + + 1122.0 * np.power(n, 3) + + 561.0 * np.power(n, 4) + ) + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + - 134.22222222222223 * S1 + - 21.333333333333332 * S2 + ) + - (7.111111111111111 * (1.0 + 2.0 * n + 2.0 * np.power(n, 2)) * S2) + / (np.power(n, 3) * np.power(1.0 + n, 3)) + - ( + 0.5925925925925926 + * (-6.0 + 31.0 * n + 31.0 * np.power(n, 2)) + * np.power(S2, 2) + ) + / (n * (1.0 + n)) + + np.power(S1, 3) + * ( + (-0.5925925925925926 * (1.0 + 2.0 * n)) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + + 4.7407407407407405 * S2 + ) + + ( + 1.7777777777777777 + * ( + -4.0 + - 4.0 * n + + 3.0 * np.power(n, 2) + + 14.0 * np.power(n, 3) + + 7.0 * np.power(n, 4) + ) + * S21 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + + 4.0 + * ( + (-0.5 * (2.0 + 3.0 * n + 3.0 * np.power(n, 2))) / (n * (1.0 + n)) + + 2.0 * S1 + ) + * (17.688679036730377 + 2.6666666666666665 * S211) + + 56.888888888888886 * S21m2 + + 28.444444444444443 * S23 + - 56.888888888888886 * S2m3 + + ( + 0.09876543209876543 + * ( + -84.0 + + 492.0 * n + + 1853.0 * np.power(n, 2) + + 1954.0 * np.power(n, 3) + + 977.0 * np.power(n, 4) + ) + * S3 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + + (0.5925925925925926 * (30.0 + 89.0 * n + 89.0 * np.power(n, 2)) * S31) + / (n * (1.0 + n)) + + 28.444444444444443 * S311 + - (6.518518518518518 * (6.0 + 17.0 * n + 17.0 * np.power(n, 2)) * S4) + / (n * (1.0 + n)) + - 56.888888888888886 * S41 + + 56.888888888888886 * S5 + + ( + ( + -0.7901234567901234 + * ( + 18.0 + - 3.0 * n + + 82.0 * np.power(n, 2) + + 266.0 * np.power(n, 3) + + 181.0 * np.power(n, 4) + ) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3)) + + ( + 1.5802469135802468 + * ( + 9.0 + + 9.0 * n + + 121.0 * np.power(n, 2) + + 224.0 * np.power(n, 3) + + 112.0 * np.power(n, 4) + ) + * S1 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + - (14.222222222222221 * np.power(S1, 2)) / (n * (1.0 + n)) + + 9.481481481481481 * np.power(S1, 3) + - 47.407407407407405 * S2 + - 56.888888888888886 * S21 + + 18.962962962962962 * S3 + ) + * Sm2 + + np.power(S1, 2) + * ( + ( + -0.8888888888888888 + * ( + 2.0 + - 7.0 * n + - 9.0 * np.power(n, 2) + + 3.0 * np.power(n, 3) + + 7.0 * np.power(n, 4) + + 2.0 * np.power(n, 5) + ) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3)) + - (7.111111111111111 * S2) / (n * (1.0 + n)) + - 14.222222222222221 * S21 + + 21.333333333333332 * S3 + - 28.444444444444443 * Sm21 + ) + - ( + 1.5802469135802468 + * (18.0 - 39.0 * n + 112.0 * np.power(n, 2) + 112.0 * np.power(n, 3)) + * Sm21 + ) + / (np.power(n, 2) * (1.0 + n)) + + S2 + * ( + ( + -0.09876543209876543 + * ( + 162.0 + + 93.0 * n + + 31.0 * np.power(n, 2) + + 1595.0 * np.power(n, 3) + + 3433.0 * np.power(n, 4) + + 2718.0 * np.power(n, 5) + + 906.0 * np.power(n, 6) + ) + ) + / (np.power(n, 3) * np.power(1.0 + n, 3)) + + 9.481481481481481 * S3 + + 85.33333333333333 * Sm21 + ) + + (18.962962962962962 * (-3.0 + 10.0 * n + 10.0 * np.power(n, 2)) * Sm211) + / (n * (1.0 + n)) + - 227.55555555555554 * Sm2111 + + S1 + * ( + ( + 0.024691358024691357 + * ( + -432.0 + - 552.0 * n + - 424.0 * np.power(n, 2) + - 5824.0 * np.power(n, 3) + - 3497.0 * np.power(n, 4) + + 23272.0 * np.power(n, 5) + + 43326.0 * np.power(n, 6) + + 28632.0 * np.power(n, 7) + + 7131.0 * np.power(n, 8) + ) + ) + / (np.power(n, 4) * np.power(1.0 + n, 4)) + + ( + 0.19753086419753085 + * ( + 45.0 + + 54.0 * n + + 484.0 * np.power(n, 2) + + 896.0 * np.power(n, 3) + + 448.0 * np.power(n, 4) + ) + * S2 + ) + / (np.power(n, 2) * np.power(1.0 + n, 2)) + - 7.111111111111111 * np.power(S2, 2) + + (14.222222222222221 * S21) / (n * (1.0 + n)) + - (2.3703703703703702 * (9.0 + 40.0 * n + 40.0 * np.power(n, 2)) * S3) + / (n * (1.0 + n)) + - 35.55555555555556 * S31 + + 78.22222222222223 * S4 + - (9.481481481481481 * (-3.0 + 10.0 * n + 10.0 * np.power(n, 2)) * Sm21) + / (n * (1.0 + n)) + + 113.77777777777777 * Sm211 + - 28.444444444444443 * Sm22 + ) + - (4.7407407407407405 * (-3.0 + 10.0 * n + 10.0 * np.power(n, 2)) * Sm22) + / (n * (1.0 + n)) + + 56.888888888888886 * Sm221 + + 56.888888888888886 * Sm23 + + ( + ( + 0.7901234567901234 + * ( + 39.0 + + 169.0 * n + + 224.0 * np.power(n, 2) + + 112.0 * np.power(n, 3) + ) + ) + / (n * np.power(1.0 + n, 2)) + - (4.7407407407407405 * (3.0 + 10.0 * n + 10.0 * np.power(n, 2)) * S1) + / (n * (1.0 + n)) + + 14.222222222222221 * np.power(S1, 2) + + 14.222222222222221 * S2 + ) + * Sm3 + + ( + (-4.7407407407407405 * (3.0 + 10.0 * n + 10.0 * np.power(n, 2))) + / (n * (1.0 + n)) + + 28.444444444444443 * S1 + ) + * Sm4 + + 28.444444444444443 * Sm5 + ) + ) + a_qqNS_l3 = ( + 8.592592592592593 / (1.0 + n) + + 5.728395061728395 / (n * (1.0 + n)) + + (8.592592592592593 * n) / (1.0 + n) + - (0.5925925925925926 * nf) / (1.0 + n) + - (0.3950617283950617 * nf) / (n * (1.0 + n)) + - (0.5925925925925926 * n * nf) / (1.0 + n) + - 11.45679012345679 * S1 + + 0.7901234567901234 * nf * S1 + ) + a_qqNS_l2 = ( + 113.33333333333333 / np.power(1.0 + n, 3) + + 7.111111111111111 / (np.power(n, 3) * np.power(1.0 + n, 3)) + + 23.703703703703702 / (np.power(n, 2) * np.power(1.0 + n, 3)) + + 63.111111111111114 / (n * np.power(1.0 + n, 3)) + + (124.0 * n) / np.power(1.0 + n, 3) + + (89.33333333333333 * np.power(n, 2)) / np.power(1.0 + n, 3) + + (29.77777777777778 * np.power(n, 3)) / np.power(1.0 + n, 3) + + 4.6419753086419755 / np.power(1.0 + n, 2) + - 1.1851851851851851 / (np.power(n, 2) * np.power(1.0 + n, 2)) + + 1.9753086419753085 / (n * np.power(1.0 + n, 2)) + + (0.5925925925925926 * n) / np.power(1.0 + n, 2) + + (0.2962962962962963 * np.power(n, 2)) / np.power(1.0 + n, 2) + - 44.839506172839506 * S1 + - (7.111111111111111 * S1) / np.power(1.0 + n, 2) + - (9.481481481481481 * S1) / (np.power(n, 2) * np.power(1.0 + n, 2)) + - (18.962962962962962 * S1) / (n * np.power(1.0 + n, 2)) + - (14.222222222222221 * n * S1) / np.power(1.0 + n, 2) + - (7.111111111111111 * np.power(n, 2) * S1) / np.power(1.0 + n, 2) + + 2.3703703703703702 * S2 + - (14.222222222222221 * S2) / (1.0 + n) + - (9.481481481481481 * S2) / (n * (1.0 + n)) + - (14.222222222222221 * n * S2) / (1.0 + n) + + 18.962962962962962 * S1 * S2 + - 2.3703703703703702 * S3 + + (2.3703703703703702 * Sm2) / (n * (1.0 + n)) + - 4.7407407407407405 * S1 * Sm2 + + 4.7407407407407405 * Sm21 + - 2.3703703703703702 * Sm3 + ) + a_qqNS_l1 = ( + -211.92592592592592 / np.power(1.0 + n, 4) + + 18.962962962962962 / (np.power(n, 4) * np.power(1.0 + n, 4)) + + 16.0 / (np.power(n, 3) * np.power(1.0 + n, 4)) + + 24.098765432098766 / (np.power(n, 2) * np.power(1.0 + n, 4)) + + 18.864197530864196 / (n * np.power(1.0 + n, 4)) + - (115.55555555555556 * n) / np.power(1.0 + n, 4) + + (444.69135802469134 * np.power(n, 2)) / np.power(1.0 + n, 4) + + (469.037037037037 * np.power(n, 3)) / np.power(1.0 + n, 4) + + (117.25925925925925 * np.power(n, 4)) / np.power(1.0 + n, 4) + - 70.23315829196848 / (1.0 + n) + - 46.82210552797899 / (n * (1.0 + n)) + - (70.23315829196848 * n) / (1.0 + n) + - (16.016460905349795 * nf) / np.power(1.0 + n, 3) + + (1.1851851851851851 * nf) / (np.power(n, 3) * np.power(1.0 + n, 3)) + - (0.7901234567901234 * nf) / (np.power(n, 2) * np.power(1.0 + n, 3)) + - (8.823045267489713 * nf) / (n * np.power(1.0 + n, 3)) + - (25.267489711934157 * n * nf) / np.power(1.0 + n, 3) + - (25.925925925925927 * np.power(n, 2) * nf) / np.power(1.0 + n, 3) + - (8.641975308641975 * np.power(n, 3) * nf) / np.power(1.0 + n, 3) + + 93.64421105595798 * S1 + + (143.60493827160494 * S1) / np.power(1.0 + n, 3) + - (27.25925925925926 * S1) / (np.power(n, 3) * np.power(1.0 + n, 3)) + - (22.91358024691358 * S1) / (np.power(n, 2) * np.power(1.0 + n, 3)) + + (78.22222222222223 * S1) / (n * np.power(1.0 + n, 3)) + + (127.4074074074074 * n * S1) / np.power(1.0 + n, 3) + + (127.4074074074074 * np.power(n, 2) * S1) / np.power(1.0 + n, 3) + + (42.46913580246913 * np.power(n, 3) * S1) / np.power(1.0 + n, 3) + + 8.954732510288066 * nf * S1 + - 132.74074074074073 * S2 + + (62.41975308641975 * S2) / np.power(1.0 + n, 2) + - (18.962962962962962 * S2) / (np.power(n, 2) * np.power(1.0 + n, 2)) + + (12.641975308641975 * S2) / (n * np.power(1.0 + n, 2)) + + (23.703703703703702 * n * S2) / np.power(1.0 + n, 2) + + (11.851851851851851 * np.power(n, 2) * S2) / np.power(1.0 + n, 2) + + 3.950617283950617 * nf * S2 + - 63.20987654320987 * S1 * S2 + + 18.962962962962962 * np.power(S2, 2) + + (18.567901234567902 * S3) / (1.0 + n) + - (5.925925925925926 * S3) / (n * (1.0 + n)) + + (18.567901234567902 * n * S3) / (1.0 + n) + - 2.3703703703703702 * nf * S3 + + 11.851851851851851 * S1 * S3 + + 47.407407407407405 * S31 + - 30.814814814814813 * S4 + - (12.641975308641975 * Sm2) / np.power(1.0 + n, 2) + + (2.3703703703703702 * Sm2) / (np.power(n, 2) * np.power(1.0 + n, 2)) + - (7.901234567901234 * Sm2) / (n * np.power(1.0 + n, 2)) + + 15.802469135802468 * S1 * Sm2 + - 4.7407407407407405 * S2 * Sm2 + - (15.802469135802468 * Sm21) / (1.0 + n) + + (4.7407407407407405 * Sm21) / (n * (1.0 + n)) + - (15.802469135802468 * n * Sm21) / (1.0 + n) + - 9.481481481481481 * S1 * Sm21 + + 18.962962962962962 * Sm211 + - 4.7407407407407405 * Sm22 + + (7.901234567901234 * Sm3) / (1.0 + n) + + (2.3703703703703702 * Sm3) / (n * (1.0 + n)) + + (7.901234567901234 * n * Sm3) / (1.0 + n) + - 4.7407407407407405 * S1 * Sm3 + - 4.7407407407407405 * Sm4 + ) + return a_qqNS_l0 + a_qqNS_l1 * L + a_qqNS_l2 * L**2 + a_qqNS_l3 * L**3 diff --git a/src/eko/matching_conditions/as3/aqqPS.py b/src/eko/matching_conditions/as3/aqqPS.py new file mode 100644 index 000000000..df845cbf1 --- /dev/null +++ b/src/eko/matching_conditions/as3/aqqPS.py @@ -0,0 +1,202 @@ +# -*- coding: utf-8 -*- +import numba as nb +import numpy as np + + +@nb.njit(cache=True) +def A_qqPS(n, sx, nf, L): + r""" + Computes the |N3LO| singlet |OME| :math:`A_{qq}^{PS,(3)}(N)`. + The expression is presented in :cite:`Bierenbaum:2009mv`. + + When using the code, please cite the complete list of references + available in :mod:`eko.matching_conditions.as3`. + + Parameters + ---------- + n : complex + Mellin moment + sx : list + harmonic sums cache + nf : int + number of active flavor below the threshold + L : float + :math:`\ln(\mu_F^2 / m_h^2)` + + Returns + ------- + A_qqPS : complex + :math:`A_{qq}^{PS,(3)}(N)` + """ + S1 = sx[0][0] + S2 = sx[1][0] + S3 = sx[2][0] + + a_qqPS_l0 = ( + 0.3333333333333333 + * nf + * ( + ( + -0.13168724279835392 + * ( + -864.0 + - 1008.0 * n + - 3408.0 * np.power(n, 2) + - 11704.0 * np.power(n, 3) + + 34274.0 * np.power(n, 4) + + 204541.0 * np.power(n, 5) + + 423970.0 * np.power(n, 6) + + 532664.0 * np.power(n, 7) + + 492456.0 * np.power(n, 8) + + 354532.0 * np.power(n, 9) + + 187681.0 * np.power(n, 10) + + 66389.0 * np.power(n, 11) + + 13931.0 * np.power(n, 12) + + 1330.0 * np.power(n, 13) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 5) + * np.power(1.0 + n, 5) + * np.power(2.0 + n, 4) + ) + + ( + 0.3950617283950617 + * ( + 288.0 + - 96.0 * n + - 928.0 * np.power(n, 2) + + 3272.0 * np.power(n, 3) + + 12030.0 * np.power(n, 4) + + 15396.0 * np.power(n, 5) + + 14606.0 * np.power(n, 6) + + 11454.0 * np.power(n, 7) + + 5937.0 * np.power(n, 8) + + 1744.0 * np.power(n, 9) + + 233.0 * np.power(n, 10) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + + ( + ( + -96.0 + - 16.0 * n + + 404.0 * np.power(n, 2) + + 452.0 * np.power(n, 3) + + 521.0 * np.power(n, 4) + + 430.0 * np.power(n, 5) + + 185.0 * np.power(n, 6) + + 40.0 * np.power(n, 7) + ) + * (-0.5925925925925926 * np.power(S1, 2) - 0.5925925925925926 * S2) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + ( + np.power(2.0 + n + np.power(n, 2), 2) + * ( + 34.19184080098401 + + 2.962962962962963 * np.power(S1, 3) + + 8.88888888888889 * S1 * S2 + + 5.925925925925926 * S3 + ) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + a_qqPS_l3 = (1.1851851851851851 * np.power(2.0 + n + np.power(n, 2), 2) * nf) / ( + (-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n) + ) + a_qqPS_l2 = ( + 0.3333333333333333 + * nf + * ( + ( + -3.5555555555555554 + * ( + -24.0 + - 20.0 * n + + 58.0 * np.power(n, 2) + + 61.0 * np.power(n, 3) + + 85.0 * np.power(n, 4) + + 83.0 * np.power(n, 5) + + 37.0 * np.power(n, 6) + + 8.0 * np.power(n, 7) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + + (10.666666666666666 * np.power(2.0 + n + np.power(n, 2), 2) * S1) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + a_qqPS_l1 = ( + 0.3333333333333333 + * nf + * ( + ( + 1.1851851851851851 + * ( + 144.0 + - 48.0 * n + - 808.0 * np.power(n, 2) + + 200.0 * np.power(n, 3) + + 3309.0 * np.power(n, 4) + + 4569.0 * np.power(n, 5) + + 4763.0 * np.power(n, 6) + + 4269.0 * np.power(n, 7) + + 2379.0 * np.power(n, 8) + + 712.0 * np.power(n, 9) + + 95.0 * np.power(n, 10) + ) + ) + / ( + (-1.0 + n) + * np.power(n, 4) + * np.power(1.0 + n, 4) + * np.power(2.0 + n, 3) + ) + - ( + 7.111111111111111 + * ( + -24.0 + - 20.0 * n + + 58.0 * np.power(n, 2) + + 61.0 * np.power(n, 3) + + 85.0 * np.power(n, 4) + + 83.0 * np.power(n, 5) + + 37.0 * np.power(n, 6) + + 8.0 * np.power(n, 7) + ) + * S1 + ) + / ( + (-1.0 + n) + * np.power(n, 3) + * np.power(1.0 + n, 3) + * np.power(2.0 + n, 2) + ) + - ( + 1.0 + * np.power(2.0 + n + np.power(n, 2), 2) + * (-10.666666666666666 * np.power(S1, 2) - 10.666666666666666 * S2) + ) + / ((-1.0 + n) * np.power(n, 2) * np.power(1.0 + n, 2) * (2.0 + n)) + ) + ) + return a_qqPS_l0 + a_qqPS_l1 * L + a_qqPS_l2 * L**2 + a_qqPS_l3 * L**3 diff --git a/src/eko/matching_conditions/operator_matrix_element.py b/src/eko/matching_conditions/operator_matrix_element.py index 978401234..8b6df8784 100644 --- a/src/eko/matching_conditions/operator_matrix_element.py +++ b/src/eko/matching_conditions/operator_matrix_element.py @@ -4,24 +4,67 @@ |VFNS| evolution. """ +import functools import logging -import time import numba as nb import numpy as np -from scipy import integrate from .. import basis_rotation as br -from .. import interpolation, mellin -from ..anomalous_dimensions import harmonics -from ..member import OpMember -from . import nlo, nnlo +from .. import harmonics +from ..evolution_operator import Operator, QuadKerBase +from . import as1, as2, as3 logger = logging.getLogger(__name__) -@nb.njit("c16[:,:,:](u1,c16,c16[:],f8,b1)", cache=True) -def A_singlet(order, n, sx, L, is_msbar): +@nb.njit(cache=True) +def compute_harmonics_cache(n, order, is_singlet): + r""" + Get the harmonics sums cache + + Parameters + ---------- + n: complex + Mellin moment + order: int + perturbative order + is_singlet: bool + symmetry factor: True for singlet like quantities (:math:`\eta=(-1)^N = 1`), + False for non-singlet like quantities (:math:`\eta=(-1)^N=-1`) + + Returns + ------- + sx: list + harmonic sums cache. At |N3LO| it contains: + + .. math :: + [[S_1,S_{-1}], + [S_2,S_{-2}], + [S_{3}, S_{2,1}, S_{2,-1}, S_{-2,1}, S_{-2,-1}, S_{-3}], + [S_{4}, S_{3,1}, S_{2,1,1}, S_{-2,-2}, S_{-3, 1}, S_{-4}],] + + """ + # max harmonics sum weight for each qcd order + max_weight = {1: 2, 2: 3, 3: 5} + # max number of harmonics sum of a given weight for each qcd order + n_max_sums_weight = {1: 1, 2: 3, 3: 7} + sx = harmonics.base_harmonics_cache( + n, is_singlet, max_weight[order], n_max_sums_weight[order] + ) + if order == 2: + # Add Sm21 to cache + sx[2, 1] = harmonics.Sm21(n, sx[0, 0], sx[0, -1], is_singlet) + if order == 3: + # Add weight 3 and 4 to cache + sx[2, 1:-2] = harmonics.s3x(n, sx[:, 0], sx[:, -1], is_singlet) + sx[3, 1:-1] = harmonics.s4x(n, sx[:, 0], sx[:, -1], is_singlet) + # return list of list keeping the non zero values + return [[el for el in sx_list if el != 0] for sx_list in sx] + + +@nb.njit(cache=True) +def A_singlet(order, n, sx, nf, L, is_msbar, sx_ns=None): r""" Computes the tower of the singlet |OME|. @@ -31,12 +74,16 @@ def A_singlet(order, n, sx, L, is_msbar): perturbative order n : complex Mellin variable - sx : numpy.ndarray - List of harmonic sums + sx : list + singlet like harmonic sums cache + nf: int + number of active flavor below threshold L : float :math:`log(q^2/m_h^2)` is_msbar: bool add the |MSbar| contribution + sx_ns : list + non-singlet like harmonic sums cache Returns ------- @@ -50,18 +97,18 @@ def A_singlet(order, n, sx, L, is_msbar): eko.matching_conditions.nlo.A_gh_1 : :math:`A_{gH}^{(1)}(N)` eko.matching_conditions.nnlo.A_singlet_2 : :math:`A_{S,(2)}(N)` """ - if order == 0: - return np.zeros((1, 3, 3), np.complex_) - A_singlet = np.zeros((order, 3, 3), np.complex_) + A_s = np.zeros((order, 3, 3), np.complex_) if order >= 1: - A_singlet[0] = nlo.A_singlet_1(n, sx, L) + A_s[0] = as1.A_singlet(n, sx, L) if order >= 2: - A_singlet[1] = nnlo.A_singlet_2(n, sx, L, is_msbar) - return A_singlet + A_s[1] = as2.A_singlet(n, sx, L, is_msbar) + if order >= 3: + A_s[2] = as3.A_singlet(n, sx, sx_ns, nf, L) + return A_s -@nb.njit("c16[:,:,:](u1,c16,c16[:],f8)", cache=True) -def A_non_singlet(order, n, sx, L): +@nb.njit(cache=True) +def A_non_singlet(order, n, sx, nf, L): r""" Computes the tower of the non-singlet |OME| @@ -71,8 +118,10 @@ def A_non_singlet(order, n, sx, L): perturbative order n : complex Mellin variable - sx : numpy.ndarray - List of harmonic sums + sx : list + harmonic sums cache + nf: int + number of active flavor below threshold L : float :math:`log(q^2/m_h^2)` @@ -86,17 +135,17 @@ def A_non_singlet(order, n, sx, L): eko.matching_conditions.nlo.A_hh_1 : :math:`A_{HH}^{(1)}(N)` eko.matching_conditions.nnlo.A_ns_2 : :math:`A_{qq,H}^{NS,(2)}` """ - if order == 0: - return np.zeros((1, 2, 2), np.complex_) A_ns = np.zeros((order, 2, 2), np.complex_) if order >= 1: - A_ns[0] = nlo.A_ns_1(n, sx, L) + A_ns[0] = as1.A_ns(n, sx, L) if order >= 2: - A_ns[1] = nnlo.A_ns_2(n, sx, L) + A_ns[1] = as2.A_ns(n, sx, L) + if order >= 3: + A_ns[2] = as3.A_ns(n, sx, nf, L) return A_ns -@nb.njit("c16[:,:](c16[:,:,:],u4,f8,string)", cache=True) +@nb.njit(cache=True) def build_ome(A, order, a_s, backward_method): r""" Construct the matching expansion in :math:`a_s` with the appropriate method. @@ -110,7 +159,7 @@ def build_ome(A, order, a_s, backward_method): a_s : float strong coupling, needed only for the exact inverse backward_method : ["exact", "expanded" or ""] - empty or method for inverting the matching contidtion (exact or expanded) + empty or method for inverting the matching condition (exact or expanded) Returns ------- @@ -125,29 +174,32 @@ def build_ome(A, order, a_s, backward_method): # Print; # .end ome = np.eye(len(A[0]), dtype=np.complex_) + A = np.ascontiguousarray(A) if backward_method == "expanded": # expended inverse if order >= 1: ome -= a_s * A[0] if order >= 2: - ome += a_s**2 * ( - -A[1] + np.ascontiguousarray(A[0]) @ np.ascontiguousarray(A[0]) - ) + ome += a_s**2 * (-A[1] + A[0] @ A[0]) + if order >= 3: + ome += a_s**3 * (-A[2] + A[0] @ A[1] + A[1] @ A[0] - A[0] @ A[0] @ A[0]) else: # forward or exact inverse if order >= 1: ome += a_s * A[0] if order >= 2: ome += a_s**2 * A[1] + if order >= 3: + ome += a_s**3 * A[2] # need inverse exact ? so add the missing pieces if backward_method == "exact": ome = np.linalg.inv(ome) return ome -@nb.njit("f8(f8,u1,u2,u2,b1,f8,f8[:,:],f8,f8,string,b1)", cache=True) +@nb.njit(cache=True) def quad_ker( - u, order, mode0, mode1, is_log, logx, areas, a_s, L, backward_method, is_msbar + u, order, mode0, mode1, is_log, logx, areas, a_s, nf, L, backward_method, is_msbar ): """ Raw kernel inside quad @@ -170,10 +222,12 @@ def quad_ker( basis function configuration a_s : float strong coupling, needed only for the exact inverse + nf: int + number of active flavor below threshold L : float :math:`log(q^2/m_h^2)` backward_method : ["exact", "expanded" or ""] - empty or method for inverting the matching contidtion (exact or expanded) + empty or method for inverting the matching condition (exact or expanded) is_msbar: bool add the |MSbar| contribution Returns @@ -181,54 +235,51 @@ def quad_ker( ker : float evaluated integration kernel """ - is_singlet = mode0 in [100, 21, 90] - # get transformation to N integral - r = 0.4 * 16.0 / (1.0 - logx) - if is_singlet: - o = 1.0 - indices = {21: 0, 100: 1, 90: 2} - else: - o = 0.0 - indices = {200: 0, 91: 1} - n = mellin.Talbot_path(u, r, o) - jac = mellin.Talbot_jac(u, r, o) + ker_base = QuadKerBase(u, is_log, logx, mode0) + integrand = ker_base.integrand(areas) + if integrand == 0.0: + return 0.0 - # compute the harmonics - sx = np.zeros(3, np.complex_) - if order >= 1: - sx = np.array([harmonics.harmonic_S1(n), harmonics.harmonic_S2(n)]) - if order >= 2: - sx = np.append(sx, harmonics.harmonic_S3(n)) + sx = compute_harmonics_cache(ker_base.n, order, ker_base.is_singlet) + sx_ns = None + if order == 3 and ( + (backward_method != "" and ker_base.is_singlet) + or (mode0 == 100 and mode0 == 100) + ): + # At N3LO for A_qq singlet or backward you need to compute + # both the singlet and non-singlet like harmonics + # avoiding recomputing all of them ... + sx_ns = sx.copy() + smx_ns = harmonics.smx(ker_base.n, np.array([s[0] for s in sx]), False) + for w, sm in enumerate(smx_ns): + sx_ns[w][-1] = sm + sx_ns[2][2] = harmonics.S2m1(ker_base.n, sx[0][1], smx_ns[0], smx_ns[1], False) + sx_ns[2][3] = harmonics.Sm21(ker_base.n, sx[0][0], smx_ns[0], False) + sx_ns[3][5] = harmonics.Sm31(ker_base.n, sx[0][0], smx_ns[0], smx_ns[1], False) + sx_ns[3][4] = harmonics.Sm211(ker_base.n, sx[0][0], sx[0][1], smx_ns[0], False) + sx_ns[3][3] = harmonics.Sm22( + ker_base.n, sx[0][0], sx[0][1], smx_ns[1], sx_ns[3][5], False + ) # compute the ome - if is_singlet: - A = A_singlet(order, n, sx, L, is_msbar) - else: - A = A_non_singlet(order, n, sx, L) - - # check PDF is active - if is_log: - pj = interpolation.log_evaluate_Nx(n, logx, areas) + if ker_base.is_singlet: + indices = {21: 0, 100: 1, 90: 2} + A = A_singlet(order, ker_base.n, sx, nf, L, is_msbar, sx_ns) else: - pj = interpolation.evaluate_Nx(n, logx, areas) - - if pj == 0.0: - return 0.0 + indices = {200: 0, 91: 1} + A = A_non_singlet(order, ker_base.n, sx, nf, L) # build the expansion in alpha_s depending on the strategy ker = build_ome(A, order, a_s, backward_method) - # select the need matrix element + # select the needed matrix element ker = ker[indices[mode0], indices[mode1]] - if ker == 0.0: - return 0.0 # recombine everthing - mellin_prefactor = complex(0.0, -1.0 / np.pi) - return np.real(mellin_prefactor * ker * pj * jac) + return np.real(ker * integrand) -class OperatorMatrixElement: +class OperatorMatrixElement(Operator): """ Internal representation of a single |OME|. @@ -242,20 +293,42 @@ class OperatorMatrixElement: managers is_backward: bool True for backward evolution - mellin_cut : float - cut to the upper limit in the mellin inversion + q2: float + matching scale + nf: int + number of active flavor below threshold + L: float + log of K threshold squared + is_msbar: bool + add the |MSbar| contribution """ - def __init__(self, config, managers, is_backward, mellin_cut=1e-2): - + log_label = "Matching" + # complete list of possible matching operators labels + full_labels = [ + *br.singlet_labels, + (br.matching_hplus_pid, 21), + (br.matching_hplus_pid, 100), + (21, br.matching_hplus_pid), + (100, br.matching_hplus_pid), + (br.matching_hplus_pid, br.matching_hplus_pid), + (200, 200), + (200, br.matching_hminus_pid), + (br.matching_hminus_pid, 200), + (br.matching_hminus_pid, br.matching_hminus_pid), + ] + + def __init__(self, config, managers, nf, q2, is_backward, L, is_msbar): + super().__init__(config, managers, nf, q2) self.backward_method = config["backward_inversion"] if is_backward else "" - self.is_intrinsic = bool(len(config["intrinsic_range"]) != 0) - self.config = config - self.sc = managers["strong_coupling"] - self.int_disp = managers["interpol_dispatcher"] - self._mellin_cut = mellin_cut - self.ome_members = {} + if is_backward: + self.is_intrinsic = True + else: + self.is_intrinsic = bool(len(config["intrinsic_range"]) != 0) + self.L = L + self.is_msbar = is_msbar + @property def labels(self): """ Compute necessary sector labels to compute. @@ -267,21 +340,19 @@ def labels(self): """ labels = [] - # non singlet labels + # non-singlet labels if self.config["debug_skip_non_singlet"]: - logger.warning("Matching: skipping non-singlet sector") + logger.warning("%s: skipping non-singlet sector", self.log_label) else: - labels.extend([(200, 200), (br.matching_hminus_pid, 200)]) + labels.append((200, 200)) if self.is_intrinsic or self.backward_method != "": - # intrisic labels, which are not zero at NLO + # intrinsic labels, which are not zero at NLO labels.append((br.matching_hminus_pid, br.matching_hminus_pid)) - # if self.backward_method == "exact": - # # this contribution starts at NNLO, we don't have it for the moment - # labels.append("NS_qH") - + # These contributions are always 0 for the moment + # labels.extend([(200, br.matching_hminus_pid), (br.matching_hminus_pid, 200)]) # same for singlet if self.config["debug_skip_singlet"]: - logger.warning("Matching: skipping singlet sector") + logger.warning("%s: skipping singlet sector", self.log_label) else: labels.extend( [ @@ -294,126 +365,64 @@ def labels(self): labels.extend( [ (21, br.matching_hplus_pid), + (100, br.matching_hplus_pid), (br.matching_hplus_pid, br.matching_hplus_pid), ] ) - # if self.backward_method == "exact": - # labels.extend(["S_qH"]) return labels - def compute(self, q2, nf, L, is_msbar): + def quad_ker(self, label, logx, areas): """ - compute the actual operators (i.e. run the integrations) + Partially initialized integrand function Parameters ---------- - q2: float - threshold scale - nf: int - number of active flavor below threshold - L: float - log of K threshold squared - is_msbar: bool - add the |MSbar| contribution + label: tuple + operator element pids + logx: float + Mellin inversion point + areas : tuple + basis function configuration + + Returns + ------- + quad_ker : functools.partial + partially initialized intration kernel + """ + return functools.partial( + quad_ker, + order=self.config["order"], + mode0=label[0], + mode1=label[1], + is_log=self.int_disp.log, + logx=logx, + areas=areas, + a_s=self.a_s, + nf=self.nf, + L=self.L, + backward_method=self.backward_method, + is_msbar=self.is_msbar, + ) + + @property + def a_s(self): + """ + Returns the computed values for :math:`a_s`. + Note that here you need to use :math:`a_s^{n_f+1}` + """ + sc = self.managers["strong_coupling"] + return sc.a_s(self.q2_from / self.fact_to_ren, self.q2_from, nf_to=self.nf + 1) - # init all ops with zeros - grid_size = len(self.int_disp.xgrid) - labels = self.labels() - for n in labels: - if n[0] == n[1]: - self.ome_members[n] = OpMember( - np.eye(grid_size), np.zeros((grid_size, grid_size)) - ) - else: - self.ome_members[n] = OpMember( - np.zeros((grid_size, grid_size)), np.zeros((grid_size, grid_size)) - ) + def compute(self): + """ + compute the actual operators (i.e. run the integrations) + """ + self.initialize_op_members() # At LO you don't need anything else if self.config["order"] == 0: - logger.info("Matching: no need to compute matching at LO") - self.copy_ome() + logger.info("%s: no need to compute matching at LO", self.log_label) return - # Note that here you need to use a_s^{nf+1}(q2) - a_s = self.sc.a_s(q2 / self.config["fact_to_ren"], q2, nf + 1) - - tot_start_time = time.perf_counter() - logger.info("Matching: computing operators - 0/%d", grid_size) - # iterate output grid - for k, logx in enumerate(np.log(self.int_disp.xgrid_raw)): - start_time = time.perf_counter() - # iterate basis functions - for l, bf in enumerate(self.int_disp): - if k == l and l == grid_size - 1: - continue - # iterate sectors - for label in labels: - # compute and set - res = integrate.quad( - quad_ker, - 0.5, - 1.0 - self._mellin_cut, - args=( - self.config["order"], - label[0], - label[1], - self.int_disp.log, - logx, - bf.areas_representation, - a_s, - L, - self.backward_method, - is_msbar, - ), - epsabs=1e-12, - epsrel=1e-5, - limit=100, - full_output=1, - ) - val, err = res[:2] - self.ome_members[label].value[k][l] = val - self.ome_members[label].error[k][l] = err - - logger.info( - "Matching: computing operators - %d/%d took: %f s", - k + 1, - grid_size, - time.perf_counter() - start_time, - ) - - # closing comment - logger.info("Matching: Total time %f s", time.perf_counter() - tot_start_time) - self.copy_ome() - - def copy_ome(self): - """Add the missing |OME|, if necessary""" - grid_size = len(self.int_disp.xgrid) - # basic labels skipped with skip debug - for label in [ - (200, 200), - (br.matching_hplus_pid, 21), - (br.matching_hplus_pid, 100), - (br.matching_hminus_pid, 200), - *br.singlet_labels, - ]: - if label not in self.ome_members: - self.ome_members[label] = OpMember( - np.zeros((grid_size, grid_size)), np.zeros((grid_size, grid_size)) - ) - - # intrinsic labels not computed yet - if self.is_intrinsic: - for label in [ - (100, br.matching_hplus_pid), - (200, br.matching_hminus_pid), - (br.matching_hminus_pid, br.matching_hminus_pid), - (br.matching_hplus_pid, br.matching_hplus_pid), - (21, br.matching_hplus_pid), - ]: - if label not in self.ome_members: - self.ome_members[label] = OpMember( - np.zeros((grid_size, grid_size)), - np.zeros((grid_size, grid_size)), - ) + self.integrate() diff --git a/src/eko/mellin.py b/src/eko/mellin.py index c7a717590..e0b9c637a 100644 --- a/src/eko/mellin.py +++ b/src/eko/mellin.py @@ -22,7 +22,7 @@ import numpy as np -@nb.njit("c16(f8,f8,f8)", cache=True) +@nb.njit(cache=True) def Talbot_path(t, r, o): r""" Talbot path. @@ -56,7 +56,7 @@ def Talbot_path(t, r, o): return o + r * complex(re, im) -@nb.njit("c16(f8,f8,f8)", cache=True) +@nb.njit(cache=True) def Talbot_jac(t, r, o): # pylint: disable=unused-argument r""" Derivative of Talbot path. @@ -90,7 +90,7 @@ def Talbot_jac(t, r, o): # pylint: disable=unused-argument return r * np.pi * 2.0 * complex(re, im) -@nb.njit("c16(f8,f8,f8)", cache=True) +@nb.njit(cache=True) def line_path(t, m, c): r""" Textbook path, i.e. a straight line parallel to the imaginary axis. @@ -115,7 +115,7 @@ def line_path(t, m, c): return complex(c, m * (2 * t - 1)) -@nb.njit("c16(f8,f8,f8)", cache=True) +@nb.njit(cache=True) def line_jac(_t, m, _c): r""" Derivative of Textbook path. @@ -140,7 +140,7 @@ def line_jac(_t, m, _c): return complex(0, m * 2) -@nb.njit("c16(f8,f8,f8,f8)", cache=True) +@nb.njit(cache=True) def edge_path(t, m, c, phi): r""" Edged path with a given angle. @@ -169,7 +169,7 @@ def edge_path(t, m, c, phi): return c + (t - 0.5) * m * np.exp(complex(0, +phi)) -@nb.njit("c16(f8,f8,f8,f8)", cache=True) +@nb.njit(cache=True) def edge_jac(t, m, _c, phi): r""" Derivative of edged path @@ -222,8 +222,8 @@ class Path: def __init__(self, t, logx, axis_offset): self.t = t - # TODO: shall we use: 0.4 * 16.0 / (1.0 - logx) ? - self.r = 0.4 * 16.0 / (-logx) + # TODO: shall we use: 0.4 * 16.0 / ( - logx) ? + self.r = 0.4 * 16.0 / (1.0 - logx) if axis_offset: self.o = 1.0 else: diff --git a/src/eko/msbar_masses.py b/src/eko/msbar_masses.py index 9b984704d..c793010c9 100644 --- a/src/eko/msbar_masses.py +++ b/src/eko/msbar_masses.py @@ -69,7 +69,7 @@ def integrand(a, b_vec, g_vec): return np.exp(val) -@nb.njit("f8(f8,f8,u1,u1)", cache=True) +@nb.njit(cache=True) def ker_expanded(a0, a1, order, nf): r""" Expanded |MSbar| |RGE| kernel diff --git a/src/eko/scale_variations/__init__.py b/src/eko/scale_variations/__init__.py index 942988e77..853d95ce7 100644 --- a/src/eko/scale_variations/__init__.py +++ b/src/eko/scale_variations/__init__.py @@ -2,10 +2,14 @@ """ This module contain the possible scale variations integrals. """ +import enum from . import expanded, exponentiated -unvaried = 0 -mode_exponentiated = 1 -mode_expanded = 2 -"""Scale Variation modes""" + +class Modes(enum.IntEnum): + """Scale Variation modes""" + + unvaried = enum.auto() + exponentiated = enum.auto() + expanded = enum.auto() diff --git a/src/eko/scale_variations/expanded.py b/src/eko/scale_variations/expanded.py index 610f2f225..179e511aa 100644 --- a/src/eko/scale_variations/expanded.py +++ b/src/eko/scale_variations/expanded.py @@ -10,7 +10,7 @@ from .. import beta -@nb.njit(["c16(c16[:],f8)", "c16[:,:](c16[:,:,:],f8)"], cache=True) +@nb.njit(cache=True) def gamma_1_variation(gamma, L): r""" Computes the |NLO| anomalous dimension variation. @@ -30,7 +30,7 @@ def gamma_1_variation(gamma, L): return -L * gamma[0] -@nb.njit(["c16(c16[:],f8,f8,c16)", "c16[:,:](c16[:,:,:],f8,f8,c16[:,:])"], cache=True) +@nb.njit(cache=True) def gamma_2_variation(gamma, L, beta0, g0e2): r""" Computes the |NNLO| anomalous dimension variation. @@ -54,13 +54,7 @@ def gamma_2_variation(gamma, L, beta0, g0e2): return -gamma[1] * L + 1 / 2 * (beta0 * gamma[0] + g0e2) * L**2 -@nb.njit( - [ - "c16(c16[:],f8,f8,f8,c16,c16,c16)", - "c16[:,:](c16[:,:,:],f8,f8,f8,c16[:,:],c16[:,:],c16[:,:])", - ], - cache=True, -) +@nb.njit(cache=True) def gamma_3_variation(gamma, L, beta0, beta1, g0e2, g0e3, g1g0): r""" Computes the |N3LO| anomalous dimension variation. @@ -94,10 +88,10 @@ def gamma_3_variation(gamma, L, beta0, beta1, g0e2, g0e3, g1g0): ) -@nb.njit("c16(c16[:],f8,u1,u1,f8)", cache=True) +@nb.njit(cache=True) def non_singlet_variation(gamma, a_s, order, nf, L): """ - Scale Variation non singlet dispatcher + Scale Variation non-singlet dispatcher Parameters ---------- @@ -131,7 +125,7 @@ def non_singlet_variation(gamma, a_s, order, nf, L): return sv_ker -@nb.njit("c16[:,:](c16[:,:,:],f8,u1,u1,f8)", cache=True) +@nb.njit(cache=True) def singlet_variation(gamma, a_s, order, nf, L): """ Scale Variation singlet dispatcher diff --git a/src/eko/scale_variations/exponentiated.py b/src/eko/scale_variations/exponentiated.py index d0657de12..77608bbda 100644 --- a/src/eko/scale_variations/exponentiated.py +++ b/src/eko/scale_variations/exponentiated.py @@ -7,7 +7,7 @@ from .. import beta -@nb.njit(["c16[:,:,:](c16[:,:,:],u1,u1,f8)", "c16[:](c16[:],u1,u1,f8)"], cache=True) +@nb.njit(cache=True) def gamma_variation(gamma, order, nf, L): """ Adjust the anomalous dimensions with the scale variations. diff --git a/src/eko/strong_coupling.py b/src/eko/strong_coupling.py index 455a48b5d..29a56675d 100644 --- a/src/eko/strong_coupling.py +++ b/src/eko/strong_coupling.py @@ -36,7 +36,7 @@ def strong_coupling_mod_ev(mod_ev): raise ValueError(f"Unknown evolution mode {mod_ev}") -@nb.njit("f8(u1,f8,u1,f8,f8)", cache=True) +@nb.njit(cache=True) def as_expanded(order, as_ref, nf, scale_from, scale_to): """ Compute expanded expression. @@ -153,7 +153,7 @@ class StrongCoupling: masses : list(float) list with quark masses squared thresholds_ratios : list(float) - list with ratios between the mass and the thresholds squared + list with ratios between the mass and the matching scales squared order: int Evaluated order of the beta function: ``0`` = LO, ... method : ["expanded", "exact"] diff --git a/src/eko/thresholds.py b/src/eko/thresholds.py index f3f173cb0..3f40df426 100644 --- a/src/eko/thresholds.py +++ b/src/eko/thresholds.py @@ -44,7 +44,7 @@ def __repr__(self): class ThresholdsAtlas: r""" - Holds information about the thresholds any Q2 has to pass in order to get + Holds information about the matching scales any Q2 has to pass in order to get there from a given q2_ref. Parameters @@ -56,7 +56,7 @@ class ThresholdsAtlas: nf_ref: int number of active flavors at the reference scale thresholds_ratios: list(float) - list of ratios between masses and matching thresholds squared + list of ratios between masses and matching scales squared max_nf: int maximum number of active flavors """ diff --git a/src/ekomark/data/db.py b/src/ekomark/data/db.py index 02908c9a8..67328c522 100644 --- a/src/ekomark/data/db.py +++ b/src/ekomark/data/db.py @@ -22,3 +22,4 @@ class Operator(Base): # pylint: disable=too-few-public-methods ev_op_max_order = Column(Integer) ev_op_iterations = Column(Integer) Q2grid = Column(Text) + backward_inversion = Column(Text) diff --git a/src/ekomark/data/operators.py b/src/ekomark/data/operators.py index 12bd14309..1a532e5e5 100644 --- a/src/ekomark/data/operators.py +++ b/src/ekomark/data/operators.py @@ -2,7 +2,6 @@ """ Operator card configurations. """ - from banana.data import cartesian_product, sql from eko import interpolation @@ -18,6 +17,7 @@ ev_op_max_order=10, ev_op_iterations=10, backward_inversion="expanded", + n_integration_cores=0, Q2grid=[100], ) diff --git a/src/ekomark/plots.py b/src/ekomark/plots.py index 42d9ee3a5..d7612d014 100644 --- a/src/ekomark/plots.py +++ b/src/ekomark/plots.py @@ -258,7 +258,7 @@ def save_operators_to_pdf(path, theory, ops, me, skip_pdfs, change_lab=False): for label_in, val, val_err in zip(ops_names, res[j], res_err[j]): if label_in in skip_pdfs: continue - if label_in not in new_op.keys(): + if label_in not in new_op: new_op[label_in] = [] new_op_err[label_in] = [] new_op[label_in].append(val) diff --git a/tests/eko/conftest.py b/tests/eko/conftest.py deleted file mode 100644 index 8c610e3d4..000000000 --- a/tests/eko/conftest.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -import numpy as np -import pytest - -from eko.anomalous_dimensions import harmonics - - -@pytest.fixture -def get_sx(): - def wrapped(N): - """Collect the S-cache""" - sx = np.array( - [ - harmonics.harmonic_S1(N), - harmonics.harmonic_S2(N), - harmonics.harmonic_S3(N), - ] - ) - return sx - - return wrapped diff --git a/tests/eko/test_ad.py b/tests/eko/test_ad.py index 2627decd5..45947406f 100644 --- a/tests/eko/test_ad.py +++ b/tests/eko/test_ad.py @@ -13,7 +13,7 @@ def test_eigensystem_gamma_singlet_0_values(): n = 3 - s1 = harmonics.harmonic_S1(n) + s1 = harmonics.S1(n) gamma_S_0 = ad_as1.gamma_singlet(3, s1, NF) res = ad.exp_singlet(gamma_S_0) lambda_p = complex(12.273612971466964, 0) diff --git a/tests/eko/test_ad_lo.py b/tests/eko/test_ad_lo.py index d08e79e32..52779123a 100644 --- a/tests/eko/test_ad_lo.py +++ b/tests/eko/test_ad_lo.py @@ -4,7 +4,7 @@ import eko.anomalous_dimensions.aem1 as ad_aem1 import eko.anomalous_dimensions.as1 as ad_as1 -from eko.anomalous_dimensions import harmonics +from eko import harmonics NF = 5 @@ -12,14 +12,14 @@ def test_number_conservation(): # number N = complex(1.0, 0.0) - s1 = harmonics.harmonic_S1(N) + s1 = harmonics.S1(N) np.testing.assert_almost_equal(ad_as1.gamma_ns(N, s1), 0) def test_quark_momentum_conservation(): # quark momentum N = complex(2.0, 0.0) - s1 = harmonics.harmonic_S1(N) + s1 = harmonics.S1(N) np.testing.assert_almost_equal( ad_as1.gamma_ns(N, s1) + ad_as1.gamma_gq(N), 0, @@ -33,7 +33,7 @@ def test_quark_momentum_conservation(): def test_gluon_momentum_conservation(): # gluon momentum N = complex(2.0, 0.0) - s1 = harmonics.harmonic_S1(N) + s1 = harmonics.S1(N) np.testing.assert_almost_equal( ad_as1.gamma_qg(N, NF) + ad_as1.gamma_gg(N, s1, NF), 0 ) @@ -59,7 +59,7 @@ def test_gamma_gq_0(): def test_gamma_gg_0(): N = complex(0.0, 1.0) - s1 = harmonics.harmonic_S1(N) + s1 = harmonics.S1(N) res = complex(5.195725159621, 10.52008856962) np.testing.assert_almost_equal(ad_as1.gamma_gg(N, s1, NF), res) diff --git a/tests/eko/test_ad_nlo.py b/tests/eko/test_ad_nlo.py index 23a541fae..617b7cd48 100644 --- a/tests/eko/test_ad_nlo.py +++ b/tests/eko/test_ad_nlo.py @@ -3,7 +3,7 @@ import numpy as np import eko.anomalous_dimensions.as2 as ad_as2 -import eko.anomalous_dimensions.harmonics as h +import eko.harmonics as h from eko import constants as const NF = 5 @@ -11,9 +11,11 @@ def test_gamma_1(): # number conservation - np.testing.assert_allclose(ad_as2.gamma_nsm(1, NF), 0.0, atol=2e-6) + sx_n1 = h.sx(1, 2) + np.testing.assert_allclose(ad_as2.gamma_nsm(1, NF, sx_n1), 0.0, atol=2e-6) - gS1 = ad_as2.gamma_singlet(2, NF) + sx_n2 = h.sx(2, 2) + gS1 = ad_as2.gamma_singlet(2, NF, sx_n2) # gluon momentum conservation # the CA*NF term seems to be tough to compute, so raise the constraint ... np.testing.assert_allclose(gS1[0, 1] + gS1[1, 1], 0.0, atol=4e-5) @@ -23,9 +25,9 @@ def test_gamma_1(): assert gS1.shape == (2, 2) # reference values are obtained from MMa - # Non singlet sector + # non-singlet sector np.testing.assert_allclose( - ad_as2.gamma_nsp(2, NF), + ad_as2.gamma_nsp(2, NF, sx_n2), (-112.0 * const.CF + 376.0 * const.CA - 64.0 * NF) * const.CF / 27.0, ) # singlet sector @@ -39,25 +41,31 @@ def test_gamma_1(): # add additional point at (analytical) continuation point np.testing.assert_allclose( - ad_as2.gamma_nsm(2, NF), + ad_as2.gamma_nsm(2, NF, sx_n2), ( - (34.0 / 27.0 * (-47.0 + 6 * np.pi**2) - 16.0 * h.zeta3) * const.CF - + (373.0 / 9.0 - 34.0 * np.pi**2 / 9.0 + 8.0 * h.zeta3) * const.CA + (34.0 / 27.0 * (-47.0 + 6 * np.pi**2) - 16.0 * h.constants.zeta3) + * const.CF + + (373.0 / 9.0 - 34.0 * np.pi**2 / 9.0 + 8.0 * h.constants.zeta3) + * const.CA - 64.0 * NF / 27.0 ) * const.CF, ) + sx_n3 = h.sx(3, 2) + sx_n4 = h.sx(4, 2) np.testing.assert_allclose( - ad_as2.gamma_nsp(3, NF), + ad_as2.gamma_nsp(3, NF, sx_n3), ( - (-34487.0 / 432.0 + 86.0 * np.pi**2 / 9.0 - 16.0 * h.zeta3) * const.CF - + (459.0 / 8.0 - 43.0 * np.pi**2 / 9.0 + 8.0 * h.zeta3) * const.CA + (-34487.0 / 432.0 + 86.0 * np.pi**2 / 9.0 - 16.0 * h.constants.zeta3) + * const.CF + + (459.0 / 8.0 - 43.0 * np.pi**2 / 9.0 + 8.0 * h.constants.zeta3) + * const.CA - 415.0 * NF / 108.0 ) * const.CF, ) np.testing.assert_allclose(ad_as2.gamma_ps(3, NF), -1391.0 * const.CF * NF / 5400.0) - gS1 = ad_as2.gamma_singlet(3, NF) + gS1 = ad_as2.gamma_singlet(3, NF, sx_n3) np.testing.assert_allclose( gS1[1, 0], ( @@ -70,14 +78,14 @@ def test_gamma_1(): np.testing.assert_allclose( gS1[1, 1], ( - (-79909.0 / 3375.0 + 194.0 * np.pi**2 / 45.0 - 8.0 * h.zeta3) + (-79909.0 / 3375.0 + 194.0 * np.pi**2 / 45.0 - 8.0 * h.constants.zeta3) * const.CA**2 - 967.0 / 270.0 * const.CA * NF + 541.0 / 216.0 * const.CF * NF ), rtol=6e-7, ) # gg - gS1 = ad_as2.gamma_singlet(4, NF) + gS1 = ad_as2.gamma_singlet(4, NF, sx_n4) np.testing.assert_allclose( gS1[0, 1], (-56317.0 / 18000.0 * const.CF + 16387.0 / 9000.0 * const.CA) * NF ) # qg @@ -85,7 +93,7 @@ def test_gamma_1(): const.update_colors(4) np.testing.assert_allclose(const.CA, 4.0) - gS1 = ad_as2.gamma_singlet(3, NF) + gS1 = ad_as2.gamma_singlet(3, NF, sx_n3) np.testing.assert_allclose( gS1[1, 0], ( @@ -98,14 +106,14 @@ def test_gamma_1(): np.testing.assert_allclose( gS1[1, 1], ( - (-79909.0 / 3375.0 + 194.0 * np.pi**2 / 45.0 - 8.0 * h.zeta3) + (-79909.0 / 3375.0 + 194.0 * np.pi**2 / 45.0 - 8.0 * h.constants.zeta3) * const.CA**2 - 967.0 / 270.0 * const.CA * NF + 541.0 / 216.0 * const.CF * NF ), rtol=6e-7, ) # gg - gS1 = ad_as2.gamma_singlet(4, NF) + gS1 = ad_as2.gamma_singlet(4, NF, sx_n4) np.testing.assert_allclose( gS1[0, 1], (-56317.0 / 18000.0 * const.CF + 16387.0 / 9000.0 * const.CA) * NF ) # qg diff --git a/tests/eko/test_ad_nnlo.py b/tests/eko/test_ad_nnlo.py index 58381478a..8348712fa 100644 --- a/tests/eko/test_ad_nnlo.py +++ b/tests/eko/test_ad_nnlo.py @@ -3,36 +3,23 @@ import numpy as np import eko.anomalous_dimensions.as3 as ad_as3 -from eko.anomalous_dimensions import harmonics +from eko import harmonics as h NF = 5 -def get_sx(N): - """Collect the S-cache""" - sx = np.array( - [ - harmonics.harmonic_S1(N), - harmonics.harmonic_S2(N), - harmonics.harmonic_S3(N), - harmonics.harmonic_S4(N), - ] - ) - return sx - - # Reference numbers coming from Mathematica def test_gamma_2(): # number conservation - each is 0 on its own, see :cite:`Moch:2004pa` N = 1 - sx = get_sx(N) - np.testing.assert_allclose(ad_as3.gamma_nsv(N, NF, sx), 0.000960586, rtol=3e-7) - np.testing.assert_allclose(ad_as3.gamma_nsm(N, NF, sx), -0.000594225, rtol=6e-7) + sx_n1 = h.sx(N, max_weight=3) + np.testing.assert_allclose(ad_as3.gamma_nsv(N, NF, sx_n1), 0.000960586, rtol=3e-7) + np.testing.assert_allclose(ad_as3.gamma_nsm(N, NF, sx_n1), -0.000594225, rtol=6e-7) # get singlet sector N = 2 - sx = get_sx(N) - gS2 = ad_as3.gamma_singlet(N, NF, sx) + sx_n2 = h.sx(N, max_weight=4) + gS2 = ad_as3.gamma_singlet(N, NF, sx_n2) # gluon momentum conservation np.testing.assert_allclose(gS2[0, 1] + gS2[1, 1], 0.00388726, rtol=2e-6) @@ -42,4 +29,4 @@ def test_gamma_2(): assert gS2.shape == (2, 2) # test nsv_2 equal to referece value - np.testing.assert_allclose(ad_as3.gamma_nsv(N, NF, sx), -188.325593, rtol=3e-7) + np.testing.assert_allclose(ad_as3.gamma_nsv(N, NF, sx_n2), -188.325593, rtol=3e-7) diff --git a/tests/eko/test_beta.py b/tests/eko/test_beta.py index b6c61c167..45d9bd37f 100644 --- a/tests/eko/test_beta.py +++ b/tests/eko/test_beta.py @@ -7,7 +7,7 @@ import pytest from eko import beta -from eko.anomalous_dimensions.harmonics import zeta3 +from eko.harmonics.constants import zeta3 def _flav_test(function): diff --git a/tests/eko/test_ev_op_grid.py b/tests/eko/test_ev_op_grid.py index 4354346a7..d505bb033 100644 --- a/tests/eko/test_ev_op_grid.py +++ b/tests/eko/test_ev_op_grid.py @@ -48,6 +48,7 @@ def _get_setup(self, use_FFNS): "ev_op_max_order": 1, "ev_op_iterations": 1, "backward_inversion": "exact", + "n_integration_cores": 1, } if use_FFNS: theory_card["FNS"] = "FFNS" diff --git a/tests/eko/test_ev_operator.py b/tests/eko/test_ev_operator.py index 556856a63..a085442d3 100644 --- a/tests/eko/test_ev_operator.py +++ b/tests/eko/test_ev_operator.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +import copy +import os import numpy as np import scipy.integrate @@ -42,7 +44,7 @@ def test_quad_ker(monkeypatch): L=0, ev_op_iterations=0, ev_op_max_order=0, - sv_mode=0, + sv_mode=1, ) np.testing.assert_allclose(res_ns, 0.0) res_s = quad_ker( @@ -52,7 +54,7 @@ def test_quad_ker(monkeypatch): mode1=100, method="", is_log=is_log, - logx=1.0, + logx=0.123, areas=np.zeros(3), a1=1, a0=2, @@ -60,7 +62,7 @@ def test_quad_ker(monkeypatch): L=0, ev_op_iterations=0, ev_op_max_order=0, - sv_mode=0, + sv_mode=1, ) np.testing.assert_allclose(res_s, 1.0) res_s = quad_ker( @@ -78,11 +80,11 @@ def test_quad_ker(monkeypatch): L=0, ev_op_iterations=0, ev_op_max_order=0, - sv_mode=0, + sv_mode=1, ) np.testing.assert_allclose(res_s, 0.0) for label in [(br.non_singlet_pids_map["ns+"], 0), (100, 100)]: - for sv in [1, 2]: + for sv in [2, 3]: res_sv = quad_ker( u=0, order=0, @@ -90,7 +92,7 @@ def test_quad_ker(monkeypatch): mode1=label[1], method="", is_log=True, - logx=1.0, + logx=0.123, areas=np.zeros(3), a1=1, a0=2, @@ -118,15 +120,58 @@ def test_quad_ker(monkeypatch): L=0, ev_op_iterations=0, ev_op_max_order=0, - sv_mode=0, + sv_mode=1, ) np.testing.assert_allclose(res_ns, 0.0) +theory_card = { + "alphas": 0.35, + "PTO": 0, + "ModEv": "TRN", + "fact_to_ren_scale_ratio": 1.0, + "Qref": np.sqrt(2), + "nfref": None, + "Q0": np.sqrt(2), + "nf0": 3, + "FNS": "FFNS", + "NfFF": 3, + "IC": 0, + "IB": 0, + "mc": 1.0, + "mb": 4.75, + "mt": 173.0, + "kcThr": np.inf, + "kbThr": np.inf, + "ktThr": np.inf, + "MaxNfPdf": 6, + "MaxNfAs": 6, + "HQ": "POLE", + "ModSV": None, +} +operators_card = { + "Q2grid": [1, 10], + "interpolation_xgrid": [0.1, 1.0], + "interpolation_polynomial_degree": 1, + "interpolation_is_log": True, + "debug_skip_singlet": False, + "debug_skip_non_singlet": False, + "ev_op_max_order": 1, + "ev_op_iterations": 1, + "backward_inversion": "exact", + "n_integration_cores": 1, +} + + class TestOperator: def test_labels(self): o = Operator( - dict(order=2, debug_skip_non_singlet=False, debug_skip_singlet=False), + dict( + order=2, + debug_skip_non_singlet=False, + debug_skip_singlet=False, + n_integration_cores=1, + ), {}, 3, 1, @@ -134,7 +179,12 @@ def test_labels(self): ) assert sorted(o.labels) == sorted(br.full_labels) o = Operator( - dict(order=1, debug_skip_non_singlet=True, debug_skip_singlet=True), + dict( + order=1, + debug_skip_non_singlet=True, + debug_skip_singlet=True, + n_integration_cores=1, + ), {}, 3, 1, @@ -142,57 +192,43 @@ def test_labels(self): ) assert sorted(o.labels) == [] - def test_compute(self, monkeypatch): - # setup objs - theory_card = { - "alphas": 0.35, - "PTO": 0, - "ModEv": "TRN", - "fact_to_ren_scale_ratio": 1.0, - "Qref": np.sqrt(2), - "nfref": None, - "Q0": np.sqrt(2), - "nf0": 3, - "FNS": "FFNS", - "NfFF": 3, - "IC": 0, - "IB": 0, - "mc": 1.0, - "mb": 4.75, - "mt": 173.0, - "kcThr": np.inf, - "kbThr": np.inf, - "ktThr": np.inf, - "MaxNfPdf": 6, - "MaxNfAs": 6, - "HQ": "POLE", - "ModSV": None, - } - operators_card = { - "Q2grid": [1, 10], - "interpolation_xgrid": [0.1, 1.0], - "interpolation_polynomial_degree": 1, - "interpolation_is_log": True, - "debug_skip_singlet": False, - "debug_skip_non_singlet": False, - "ev_op_max_order": 1, - "ev_op_iterations": 1, - "backward_inversion": "exact", - } + def test_n_pools(self): + excluded_cores = 3 + o = Operator( + dict( + order=1, + debug_skip_non_singlet=True, + debug_skip_singlet=True, + n_integration_cores=-excluded_cores, + ), + {}, + 3, + 1, + ) + assert o.n_pools == os.cpu_count() - excluded_cores + + def test_compute_parallel(self, monkeypatch): + tcard = copy.deepcopy(theory_card) + ocard = copy.deepcopy(operators_card) + ocard["n_integration_cores"] = 2 g = OperatorGrid.from_dict( - theory_card, - operators_card, - ThresholdsAtlas.from_dict(theory_card), - StrongCoupling.from_dict(theory_card), - InterpolatorDispatcher.from_dict(operators_card), + tcard, + ocard, + ThresholdsAtlas.from_dict(tcard), + StrongCoupling.from_dict(tcard), + InterpolatorDispatcher.from_dict(ocard), ) - o = Operator(g.config, g.managers, 3, 2, 10) + # setup objs + o = Operator(g.config, g.managers, 3, 2.0, 10.0) # fake quad monkeypatch.setattr( scipy.integrate, "quad", lambda *args, **kwargs: np.random.rand(2) ) # LO o.compute() + self.check_lo(o) + + def check_lo(self, o): assert (br.non_singlet_pids_map["ns-"], 0) in o.op_members np.testing.assert_allclose( o.op_members[(br.non_singlet_pids_map["ns-"], 0)].value, @@ -202,6 +238,26 @@ def test_compute(self, monkeypatch): o.op_members[(br.non_singlet_pids_map["nsV"], 0)].value, o.op_members[(br.non_singlet_pids_map["ns+"], 0)].value, ) + + def test_compute(self, monkeypatch): + tcard = copy.deepcopy(theory_card) + ocard = copy.deepcopy(operators_card) + g = OperatorGrid.from_dict( + tcard, + ocard, + ThresholdsAtlas.from_dict(tcard), + StrongCoupling.from_dict(tcard), + InterpolatorDispatcher.from_dict(ocard), + ) + # setup objs + o = Operator(g.config, g.managers, 3, 2.0, 10.0) + # fake quad + monkeypatch.setattr( + scipy.integrate, "quad", lambda *args, **kwargs: np.random.rand(2) + ) + # LO + o.compute() + self.check_lo(o) # NLO o.config["order"] = 1 o.compute() @@ -216,7 +272,7 @@ def test_compute(self, monkeypatch): # unity operators for n in range(0, 2 + 1): - o1 = Operator(g.config, g.managers, 3, 2, 2) + o1 = Operator(g.config, g.managers, 3, 2.0, 2.0) o1.config["order"] = n o1.compute() for k in br.non_singlet_labels: diff --git a/tests/eko/test_f_functions.py b/tests/eko/test_f_functions.py new file mode 100644 index 000000000..13ae057f9 --- /dev/null +++ b/tests/eko/test_f_functions.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- +# Test F functions implementing w5 harmonics sums + +import numpy as np + +from eko import harmonics + +zeta2 = harmonics.constants.zeta2 +zeta3 = harmonics.constants.zeta3 +zeta4 = harmonics.constants.zeta4 +zeta5 = harmonics.constants.zeta5 +log2 = np.log(2) + +# reference values coming fom Mathematica: +# they are computed inverting the harmonics to x-space +# and then doing numerical integration. + +testN = [1, 2, 2 + 2j, 10 + 5j, 100] +refvals = { + "S41": [1.0, 1.09375, 1.13674 + 0.0223259j, 1.13322 + 0.000675408j, 1.13348], + "S21m2": [ + -1.0 + 2.32792e-17, + -1.34375 - 5.19668e-18j, + -1.55003 - 0.349276j, + -1.96639 - 0.100789j, + -2.19769, + ], + "S221": [1, 1.34375, 1.5542 + 0.326975j, 1.89896 + 0.0770909j, 2.05026], + "Sm221": [ + -1.0, + -0.65625, + -0.767023 - 0.000133792j, + -0.767089 - 8.56713e-10j, + -0.766973, + ], + "S311": [1.0, 1.21875, 1.35078 + 0.142143j, 1.43773 + 0.0168713j, 1.45799], + "S2111": [1.0, 1.46875, 1.71628 + 0.591696j, 2.70015 + 0.291842j, 3.66588], + "Sm2111": [ + -1.0, + -0.53125, + -0.705997 - 0.000177561j, + -0.706186 - 2.32698e-9j, + -0.704801, + ], + "Sm21": [ + -1.0, + -0.625, + -0.751192 - 0.000147181j, + -0.751286 - 1.17067e-9j, + -0.751029, + ], + "S23": [1.0, 1.28125, 1.45296 + 0.227775j, 1.65521 + 0.0442804j, 1.73653], + "S2m3": [-1.0, -1.21875, -1.35491 - 0.173841j, -1.50575 - 0.0332824j, -1.56676], + "Sm23": [-1.0, -0.71875, -0.802462 - 0.000100325j, -0.802494, -0.802435], +} + + +# copare the exact values of some harmonics +# All the harmonics definition are coming from :cite`:Bl_mlein_2009` section 9. +# F19, F20,F21 are not present in that paper. +def test_F9(): + for N, vals in zip(testN, refvals["S41"]): + S1 = harmonics.S1(N) + S2 = harmonics.S2(N) + S3 = harmonics.S3(N) + S41 = harmonics.S41(N, S1, S2, S3) + np.testing.assert_allclose(S41, vals, atol=1e-05) + + +def test_F11(): + for N, vals in zip(testN, refvals["S311"]): + S1 = harmonics.S1(N) + S2 = harmonics.S2(N) + S311 = harmonics.S311(N, S1, S2) + np.testing.assert_allclose(S311, vals, atol=1e-05) + + +def test_F13(): + for N, vals in zip(testN, refvals["S221"]): + S1 = harmonics.S1(N) + S2 = harmonics.S2(N) + S21 = harmonics.S21(N, S1, S2) + S221 = harmonics.S221(N, S1, S2, S21) + np.testing.assert_allclose(S221, vals, atol=1e-05) + + +def test_F12_F14(): + # here there is a typo in eq (9.25) of Bl_mlein_2009 + for N, vals in zip(testN, refvals["Sm221"]): + S1 = harmonics.S1(N) + S2 = harmonics.S2(N) + Sm1 = harmonics.Sm1(N, S1) + S21 = harmonics.S21(N, S1, S2) + Sm21 = harmonics.Sm21(N, S1, Sm1) + Sm221 = harmonics.Sm221(N, S1, Sm1, S21, Sm21) + np.testing.assert_allclose(Sm221, vals, atol=1e-05) + + +def test_F16(): + for N, vals in zip(testN, refvals["S21m2"]): + S1 = harmonics.S1(N) + S2 = harmonics.S2(N) + S3 = harmonics.S3(N) + Sm1 = harmonics.Sm1(N, S1) + Sm2 = harmonics.Sm2(N, S2) + Sm3 = harmonics.Sm3(N, S3) + S21 = harmonics.S21(N, S1, S2) + S2m1 = harmonics.S2m1(N, S2, Sm1, Sm2) + Sm21 = harmonics.Sm21(N, S1, Sm1) + S21m2 = harmonics.S21m2(N, S1, S2, Sm1, Sm2, Sm3, S21, Sm21, S2m1) + np.testing.assert_allclose(S21m2, vals, atol=1e-04) + + +def test_F17(): + for N, vals in zip(testN, refvals["S2111"]): + S1 = harmonics.S1(N) + S2 = harmonics.S2(N) + S3 = harmonics.S3(N) + S2111 = harmonics.S2111(N, S1, S2, S3) + np.testing.assert_allclose(S2111, vals, atol=1e-05) + + +def test_F18(): + for N, vals in zip(testN, refvals["Sm2111"]): + S1 = harmonics.S1(N) + S2 = harmonics.S2(N) + S3 = harmonics.S3(N) + Sm1 = harmonics.Sm1(N, S1) + Sm2111 = harmonics.Sm2111(N, S1, S2, S3, Sm1) + np.testing.assert_allclose(Sm2111, vals, atol=1e-05) + + +# different parametrization, less accurate +def test_F19(): + for N, vals in zip(testN, refvals["S23"]): + S1 = harmonics.S1(N) + S2 = harmonics.S2(N) + S3 = harmonics.S3(N) + S23 = harmonics.S23(N, S1, S2, S3) + np.testing.assert_allclose(S23, vals, rtol=2e-03) + + +# different parametrization, less accurate +def test_F20(): + for N, vals in zip(testN, refvals["Sm23"]): + S1 = harmonics.S1(N) + S2 = harmonics.S2(N) + S3 = harmonics.S3(N) + Sm3 = harmonics.Sm3(N, S3) + Sm2 = harmonics.Sm2(N, S2) + Sm1 = harmonics.Sm1(N, S1) + Sm23 = harmonics.Sm23(N, Sm1, Sm2, Sm3) + np.testing.assert_allclose(Sm23, vals, rtol=1e-03) + + +# different parametrization, less accurate +def test_F21(): + for N, vals in zip(testN, refvals["S2m3"]): + S1 = harmonics.S1(N) + S2 = harmonics.S2(N) + S3 = harmonics.S3(N) + Sm3 = harmonics.Sm3(N, S3) + Sm2 = harmonics.Sm2(N, S2) + Sm1 = harmonics.Sm1(N, S1) + S2m3 = harmonics.S2m3(N, S2, Sm1, Sm2, Sm3) + np.testing.assert_allclose(S2m3, vals, rtol=1e-03) diff --git a/tests/eko/test_g_functions.py b/tests/eko/test_g_functions.py new file mode 100644 index 000000000..2971db8b5 --- /dev/null +++ b/tests/eko/test_g_functions.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- +# Test G functions implemented by Muselli PhD + +import numpy as np + +from eko.anomalous_dimensions import harmonics as h + +zeta3 = h.constants.zeta3 +log2 = h.constants.log2 + + +# Reference values comes form Mathematica, and are +# obtained using the function S of HarmonicSums package + +testN = [1, 10, 100] + +# compare the exact values of some harmonics with Muselli parametrization +def test_g3(): + ns = [1.0, 2.0, 1 + 1j] + # NIntegrate[x^({1, 2, 1 + I} - 1) PolyLog[2, x]/(1 + x), {x, 0, 1}] + refvals = [0.3888958462, 0.2560382207, 0.3049381491 - 0.1589060625j] + for n, r in zip(ns, refvals): + S1 = h.S1(n) + np.testing.assert_almost_equal(h.g_functions.mellin_g3(n, S1), r, decimal=6) + + +def test_g4(): + refvals = [-1, -1.34359, -1.40286] + for N, vals in zip(testN, refvals): + is_singlet = (-1) ** N == 1 + S1 = h.S1(N) + S2 = h.S2(N) + Sm1 = h.Sm1(N, S1, is_singlet) + Sm2 = h.Sm2(N, S2, is_singlet) + S2m1 = h.S2m1(N, S2, Sm1, Sm2, is_singlet) + np.testing.assert_allclose(S2m1, vals, atol=1e-05) + + +def test_g6(): + refvals = [-1, -0.857976, -0.859245] + for N, vals in zip(testN, refvals): + is_singlet = (-1) ** N == 1 + S1 = h.S1(N) + S2 = h.S2(N) + Sm1 = h.Sm1(N, S1, is_singlet) + Sm2 = h.Sm2(N, S2, is_singlet) + Sm31 = h.Sm31(N, S1, Sm1, Sm2, is_singlet) + np.testing.assert_allclose(Sm31, vals, atol=1e-05) + + +def test_g5(): + refvals = [-1, -0.777375, -0.784297] + for N, vals in zip(testN, refvals): + is_singlet = (-1) ** N == 1 + S1 = h.S1(N) + S2 = h.S2(N) + Sm1 = h.Sm1(N, S1, is_singlet) + Sm2 = h.Sm2(N, S2, is_singlet) + Sm31 = h.Sm31(N, S1, Sm1, Sm2, is_singlet) + Sm22 = h.Sm22(N, S1, S2, Sm2, Sm31, is_singlet) + np.testing.assert_allclose(Sm22, vals, atol=1e-05) + + +def test_g8(): + refvals = [-1, -0.696836, -0.719637] + for N, vals in zip(testN, refvals): + is_singlet = (-1) ** N == 1 + S1 = h.S1(N) + S2 = h.S2(N) + Sm1 = h.Sm1(N, S1, is_singlet) + Sm211 = h.Sm211(N, S1, S2, Sm1, is_singlet) + np.testing.assert_allclose(Sm211, vals, atol=1e-05) + + +def test_g18(): + testN = [1, 2, 3, 10, 100] + refvals = [1, 1.375, 1.5787, 2.0279, 2.34252] + for N, vals in zip(testN, refvals): + S1 = h.S1(N) + S2 = h.S2(N) + S21 = h.S21(N, S1, S2) + np.testing.assert_allclose(S21, vals, atol=1e-05) + + +def test_g19(): + refvals = [1, 0.953673, 0.958928] + for N, vals in zip(testN, refvals): + is_singlet = (-1) ** N == 1 + S1 = h.S1(N) + S2 = h.S2(N) + Sm2 = h.Sm2(N, S2, is_singlet) + Sm2m1 = h.Sm2m1(N, S1, S2, Sm2) + np.testing.assert_allclose(Sm2m1, vals, atol=1e-05) + + +def test_g21(): + testN = [1, 2, 3, 10, 100] + refvals = [1, 1.4375, 1.69985, 2.38081, 3.04323] + for N, vals in zip(testN, refvals): + S1 = h.S1(N) + S2 = h.S2(N) + S3 = h.S3(N) + S211 = h.S211(N, S1, S2, S3) + np.testing.assert_allclose(S211, vals, atol=1e-05) + + +def test_g22(): + testN = [1, 2, 3, 10, 100] + refvals = [1, 1.1875, 1.2554, 1.33724, 1.35262] + for N, vals in zip(testN, refvals): + S1 = h.S1(N) + S2 = h.S2(N) + S3 = h.S3(N) + S4 = h.S4(N) + S31 = h.S31(N, S1, S2, S3, S4) + np.testing.assert_allclose(S31, vals, atol=1e-05) diff --git a/tests/eko/test_harmonics.py b/tests/eko/test_harmonics.py new file mode 100644 index 000000000..46ddbe320 --- /dev/null +++ b/tests/eko/test_harmonics.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- +import numpy as np + +from eko import harmonics as h + + +def test_spm1(): + for k in range(1, 5 + 1): + f = np.sum([1.0 / j for j in range(1, k + 1)]) + S1 = h.S1(k) + np.testing.assert_allclose(f, S1) + g = np.sum([(-1.0) ** j / j for j in range(1, k + 1)]) + np.testing.assert_allclose(g, h.Sm1(k, S1, (-1) ** k == 1)) + + +def test_spm2(): + for k in range(1, 5 + 1): + f = np.sum([1.0 / j**2 for j in range(1, k + 1)]) + S2 = h.S2(k) + np.testing.assert_allclose(f, S2) + g = np.sum([(-1.0) ** j / j**2 for j in range(1, k + 1)]) + np.testing.assert_allclose(g, h.Sm2(k, S2, (-1) ** k == 1)) + + +def test_harmonics_cache(): + N = np.random.randint(100) + is_singlet = (-1) ** N == 1 + S1 = h.S1(N) + S2 = h.S2(N) + S3 = h.S3(N) + S4 = h.S4(N) + S5 = h.S5(N) + Sm1 = h.Sm1(N, S1, is_singlet) + Sm2 = h.Sm2(N, S2, is_singlet) + sx = np.array([S1, S2, S3, S4, S5]) + smx_test = np.array( + [ + Sm1, + Sm2, + h.Sm3(N, S3, is_singlet), + h.Sm4(N, S4, is_singlet), + h.Sm5(N, S5, is_singlet), + ] + ) + np.testing.assert_allclose(h.smx(N, sx, is_singlet), smx_test) + s3x_test = np.array( + [ + h.S21(N, S1, S2), + h.S2m1(N, S2, Sm1, Sm2, is_singlet), + h.Sm21(N, S1, Sm1, is_singlet), + h.Sm2m1(N, S1, S2, Sm2), + ] + ) + np.testing.assert_allclose(h.s3x(N, sx, smx_test, is_singlet), s3x_test) + Sm31 = h.Sm31(N, S1, Sm1, Sm2, is_singlet) + s4x_test = np.array( + [ + h.S31(N, S1, S2, S3, S4), + h.S211(N, S1, S2, S3), + h.Sm22(N, S1, S2, Sm2, Sm31, is_singlet), + h.Sm211(N, S1, S2, Sm1, is_singlet), + Sm31, + ] + ) + np.testing.assert_allclose(h.s4x(N, sx, smx_test, is_singlet), s4x_test) + + +# reference values coming fom mathematica +# and are computed doing an inverse mellin +# transformation +testN = [1, 2, 2 + 2j, 10 + 5j, 100] +refvals = { + "Sm1": [-1.0, -0.5, -0.692917 - 0.000175788j, -0.693147 - 2.77406e-9j, -0.688172], + "Sm2": [ + -1.0, + -0.75, + -0.822442 - 0.0000853585j, + -0.822467 - 4.29516e-10j, + -0.822418, + ], + "Sm3": [ + -1.0, + -0.875, + -0.901551 - 0.0000255879j, + -0.901543 - 4.61382e-11j, + -0.901542, + ], + "Sm4": [ + -1.0, + -0.9375, + -0.947039 - 4.84597e-6j, + -0.947033 - 3.99567e-12j, + -0.947033, + ], + "Sm5": [-1.0, -0.96875, -0.972122 - 1.13162e-7j, -0.97212 - 2.81097e-13j, -0.97212], + "Sm21": [ + -1.0, + -0.625, + -0.751192 - 0.000147181j, + -0.751286 - 1.17067e-9j, + -0.751029, + ], +} + + +def test_Sm21(): + for N, vals in zip(testN, refvals["Sm21"]): + S1 = h.S1(N) + Sm1 = h.Sm1(N, S1) + np.testing.assert_allclose(h.Sm21(N, S1, Sm1), vals, atol=1e-06) + + +def test_Smx(): + for j, N in enumerate(testN): + sx = h.sx(N) + smx = [ + h.Sm1(N, sx[0]), + h.Sm2(N, sx[1]), + h.Sm3(N, sx[2]), + h.Sm4(N, sx[3]), + h.Sm5(N, sx[4]), + ] + for i, sm in enumerate(smx): + np.testing.assert_allclose(sm, refvals[f"Sm{i+1}"][j], atol=1e-06) + + +def test_smx_continuation(): + # test s_{-m} against a different analytic continuation + N = np.random.rand() + 1j * np.random.rand() + sx = h.sx(N) + + def dm(m): + zeta_list = [ + h.constants.zeta2, + h.constants.zeta3, + h.constants.zeta4, + h.constants.zeta5, + ] + if m == 1: + return h.constants.log2 + return (2 ** (m - 1) - 1) / (2 ** (m - 1)) * zeta_list[m - 2] + + def sm_complex(m, N): + return ((-1) ** N) / 2**m * (s(m, N / 2) - s(m, (N - 1) / 2)) - dm(m) + + def s(m, N): + if m == 1: + return h.S1(N) + if m == 2: + return h.S2(N) + if m == 3: + return h.S3(N) + if m == 4: + return h.S4(N) + return h.S5(N) + + def sm(m, N, hs): + if m == 1: + return h.Sm1(N, hs) + if m == 2: + return h.Sm2(N, hs) + if m == 3: + return h.Sm3(N, hs) + if m == 4: + return h.Sm4(N, hs) + return h.Sm5(N, hs) + + for j, hs in enumerate(sx): + np.testing.assert_allclose(sm_complex(j + 1, N), sm(j + 1, N, hs)) diff --git a/tests/eko/test_matching.py b/tests/eko/test_matching.py index 6aecbc3e8..7a1bf7608 100644 --- a/tests/eko/test_matching.py +++ b/tests/eko/test_matching.py @@ -56,7 +56,7 @@ def test_split_ad_to_evol_map(self): keys3 = [ "c+.S", "c+.g", - "c-.V", + # "c-.V", ] assert sorted(str(k) for k in a.op_members.keys()) == sorted( [*triv_keys, *keys3] @@ -78,7 +78,7 @@ def test_split_ad_to_evol_map(self): self.update_intrinsic_OME(ome) c = MatchingCondition.split_ad_to_evol_map(ome, 3, 1, [4]) assert sorted(str(k) for k in c.op_members.keys()) == sorted( - [*triv_keys, *keys3, "g.c+", "c+.c+", "c-.c-"] + [*triv_keys, *keys3, "S.c+", "g.c+", "c+.c+", "c-.c-"] ) assert_almost_equal( c.op_members[member.MemberName("V.V")].value, @@ -100,13 +100,13 @@ def test_split_ad_to_evol_map(self): *triv_keys, "T15.T15", "V15.V15", - # "S.b+", + "S.b+", "g.b+", # "V.b-", "b+.S", "b+.g", "b+.b+", - "b-.V", + # "b-.V", "b-.b-", ] ) @@ -114,10 +114,10 @@ def test_split_ad_to_evol_map(self): d.op_members[member.MemberName("V.V")].value, a.op_members[member.MemberName("V.V")].value, ) - assert_almost_equal( - d.op_members[member.MemberName("b-.V")].value, - ome[(br.matching_hminus_pid, 200)].value, - ) + # assert_almost_equal( + # d.op_members[member.MemberName("b-.V")].value, + # ome[(br.matching_hminus_pid, 200)].value, + # ) assert_almost_equal( d.op_members[member.MemberName("b+.S")].value, ome[(br.matching_hplus_pid, 100)].value, diff --git a/tests/eko/test_matching_n3lo.py b/tests/eko/test_matching_n3lo.py new file mode 100644 index 000000000..753d52ebc --- /dev/null +++ b/tests/eko/test_matching_n3lo.py @@ -0,0 +1,236 @@ +# -*- coding: utf-8 -*- +# Test N3LO OME +import numpy as np + +from eko.matching_conditions import as3 +from eko.matching_conditions.as3 import A_ns, A_qqNS, A_singlet +from eko.matching_conditions.operator_matrix_element import compute_harmonics_cache + + +def test_A_3(): + logs = [0, 10] + nf = 3 + + for L in logs: + N = 1.0 + sx_cache = compute_harmonics_cache(N, 3, False) + aNSqq3 = A_qqNS(N, sx_cache, nf, L) + # quark number conservation + # the accuracy of this test depends directly on the precision of the + # F functions, thus is dominated by F19,F20,F21 accuracy are the worst ones + # If needed, these Fs can be improved. + np.testing.assert_allclose(aNSqq3, 0.0, atol=5e-3) + + N = 2.0 + sx_cache = compute_harmonics_cache(N, 3, True) + # reference value comes form Mathematica, gg is not fullycomplete + # thus the reference value is not 0.0 + # Here the accuracy of this test depends on the approximation of AggTF2 + np.testing.assert_allclose( + as3.A_gg(N, sx_cache, nf, L) + + as3.A_qg(N, sx_cache, nf, L) + + as3.A_Hg(N, sx_cache, nf, L), + 145.148, + rtol=32e-3, + ) + + # here you can't test the quark momentum conservation + # since you get division by 0 as in Mathematica + # due to a factor 1/(N-2) which should cancel when + # doing a proper limit. + + N = 3 + 2j + sx_cache = compute_harmonics_cache(np.random.rand(), 3, True) + ns_sx_cache = compute_harmonics_cache(np.random.rand(), 3, False) + aS3 = A_singlet(N, sx_cache, ns_sx_cache, nf, L) + aNS3 = A_ns(N, ns_sx_cache, nf, L) + assert aNS3.shape == (2, 2) + assert aS3.shape == (3, 3) + + np.testing.assert_allclose(aS3[:, 2], np.zeros(3)) + np.testing.assert_allclose(aNS3[1, 1], 0) + np.testing.assert_allclose(aNS3[0, 0], as3.A_qqNS(N, ns_sx_cache, nf, L)) + + +def test_Blumlein_3(): + # Test against Blumlein OME implementation :cite:`Bierenbaum:2009mv`. + # For singlet OME only even moments are available in that code. + # Note there is a minus sign in the definition of L. + + # pylint: disable=too-many-locals + # reference N are 2,4,6,10,100 + ref_val_gg = { + 0: [ + -440.1036857039252, + -1377.491100682841, + -1683.3145211964718, + -2006.179382743264, + -3293.80836498399, + ], + 10: [-18344.3, -41742.6, -50808.5, -61319.1, -108626.0], + } + # Mathematica not able to evaluate for N=100 + ref_val_ggTF2 = { + 0: [-33.4281, -187.903, -239.019, -294.571], + 10: [-33.4281, -187.903, -239.019, -294.571], + } + # diverging for N=2 + ref_val_gq = { + 0: [0, 22.7356, 16.4025, 10.5142, 0.98988], + 10: [0, 4408.98, 2488.62, 1281.9650, 53.907], + } + ref_val_Hg = { + 0: [461.219, 682.728, 676.549, 626.857, 294.313], + 10: [ + 18487.47133439009, + 23433.42707514685, + 20705.71711303489, + 16377.933296134988, + 3386.8649353946803, + ], + } + ref_val_Hgstfac = { + 0: [109.766, 64.7224, 25.1745, -11.5071, -37.9846], + 10: [109.766, 64.7224, 25.1745, -11.5071, -37.9846], + } + ref_val_Hq = { + 0: [ + 15.680876575375834, + 1.827951379087708, + 1.0171574688383518, + 0.5952046986637233, + 0.006576376037629228, + ], + 10: [ + -9092.772439750246, + -1952.147452952931, + -856.1538615259986, + -314.27582798540243, + -3.467260112052196, + ], + } + ref_val_qg = { + 0: [47.695, 44.8523, 32.6934, 19.8899, 0.397559], + 10: [-74.4038, -1347.17, -1278.72, -1080.31, -291.084], + } + ref_val_qqNS = { + 0: [-36.5531, -40.1257, -36.0358, -28.3555, 6.83735], + 10: [-7562.97, -14129.7, -17928.6, -22768.1, -45326.9], + } + ref_val_qqPS = { + 0: [-8.65731, -0.766936, -0.0365199, 0.147675, 0.0155598], + 10: [1672.99, 260.601, 112.651, 43.5204, 0.756621], + } + nf = 3 + for i, N in enumerate([4.0, 6.0, 10.0, 100.0]): + idx = i + 1 + for L in [0, 10]: + sx_cache = compute_harmonics_cache(N, 3, True) + ns_sx_cache = compute_harmonics_cache(N, 3, False) + aS3 = A_singlet(N, sx_cache, ns_sx_cache, nf, L) + + # here we have a different approximation for AggTF2, + # some terms are neglected + if N != 100: + np.testing.assert_allclose( + aS3[0, 0], ref_val_gg[L][idx] + ref_val_ggTF2[L][idx], rtol=6e-3 + ) + + np.testing.assert_allclose(aS3[0, 1], ref_val_gq[L][idx], rtol=2e-6) + np.testing.assert_allclose(aS3[1, 0], ref_val_qg[L][idx], rtol=2e-6) + np.testing.assert_allclose( + aS3[2, 0], ref_val_Hg[L][idx] + ref_val_Hgstfac[L][idx], rtol=2e-6 + ) + + np.testing.assert_allclose( + aS3[2, 1], ref_val_Hq[L][idx], rtol=2e-5, atol=3e-6 + ) + + # here we have a different convention for (-1)^N, + # for even values qqNS is analytically continued + # as non-singlet. The accuracy is worst for large N + # due to the approximations of F functions. + np.testing.assert_allclose( + aS3[1, 1], ref_val_qqNS[L][idx] + ref_val_qqPS[L][idx], rtol=8e-2 + ) + + # Here we test the critical parts + nf = 3 + ref_ggTF_app = [-28.9075, -180.659, -229.537, -281.337, -467.164] + for idx, N in enumerate([2.0, 4.0, 6.0, 10.0, 100.0]): + sx_cache = compute_harmonics_cache(N, 3, True) + Aggtf2 = as3.aggTF2.A_ggTF2(N, sx_cache) + if N != 100: + # Limited in the small N region + np.testing.assert_allclose(Aggtf2, ref_val_ggTF2[0][idx], rtol=15e-2) + np.testing.assert_allclose(Aggtf2, ref_ggTF_app[idx], rtol=2e-4) + + np.testing.assert_allclose( + as3.agg.A_gg(N, sx_cache, nf, L=0) - Aggtf2, + ref_val_gg[0][idx], + rtol=3e-6, + ) + + # odd numbers of qqNS + # Limited accuracy due to F functions + ref_qqNS_odd = [-40.94998646588999, -21.598793547423504, 6.966325573931755] + rtols = [4e-4, 3e-3, 2.1e-2] + for N, ref, rtol in zip([3.0, 15.0, 101.0], ref_qqNS_odd, rtols): + sx_cache = compute_harmonics_cache(N, 3, False) + np.testing.assert_allclose( + as3.aqqNS.A_qqNS(N, sx_cache, nf, L=0), ref, rtol=rtol + ) + + +def test_AHq_asymptotic(): + # Odd moments can't be not tested, since in the + # reference values coming from mathematica, some + # harmonics still contains some (-1)**N factors which + # should be continued with 1, but this is not doable. + refs = [ + # -1.06712, + 0.476901, + # -0.771605, + 0.388789, + 0.228768, + 0.114067, + 0.0654939, + 0.0409271, + 0.0270083, + 0.01848, + 0.0129479, + 0.00920106, + 0.00657638, + -0.000672589, + -0.00106298, + -0.000560666, + ] + Ns = [ + # 11.0, + 12.0, + # 13.0, + 14.0, + 20.0, + 30.0, + 40.0, + 50.0, + 60.0, + 70.0, + 80.0, + 90.0, + 100.0, + 200.0, + 500.0, + 1000.0, + ] + # refs = [ + # -0.159229, 0.101182, -0.143408, 0.0901927, + # -0.130103, 0.0807537, -0.11879, 0.0725926, -0.109075 + # ] + # Ns = [31.,32.,33.,34.,35.,36.,37.,38.,39.] + nf = 3 + for N, r in zip(Ns, refs): + sx_cache = compute_harmonics_cache(N, 3, True) + np.testing.assert_allclose( + as3.aHq.A_Hq(N, sx_cache, nf, L=0), r, rtol=1e-5, atol=1e-5 + ) diff --git a/tests/eko/test_matching_nlo.py b/tests/eko/test_matching_nlo.py index 05258783e..bf99faf3f 100644 --- a/tests/eko/test_matching_nlo.py +++ b/tests/eko/test_matching_nlo.py @@ -2,15 +2,16 @@ # Test NLO OME import numpy as np -from eko.matching_conditions.nlo import A_ns_1, A_singlet_1 +from eko.matching_conditions.as1 import A_ns, A_singlet +from eko.matching_conditions.operator_matrix_element import compute_harmonics_cache -def test_A_1_intrinsic(get_sx): +def test_A_1_intrinsic(): L = 100.0 N = 2 - sx = get_sx(N) - aS1 = A_singlet_1(N, sx, L) + sx = compute_harmonics_cache(N, 1, True) + aS1 = A_singlet(N, sx, L) # heavy quark momentum conservation np.testing.assert_allclose(aS1[0, 2] + aS1[1, 2] + aS1[2, 2], 0.0, atol=1e-10) @@ -18,23 +19,23 @@ def test_A_1_intrinsic(get_sx): np.testing.assert_allclose(aS1[0, 0] + aS1[1, 0] + aS1[2, 0], 0.0) -def test_A_1_shape(get_sx): +def test_A_1_shape(): N = 2 L = 3.0 - sx = get_sx(N) - aNS1i = A_ns_1(N, sx, L) - aS1i = A_singlet_1(N, sx, L) + sx = compute_harmonics_cache(N, 1, (-1) ** N == 1) + aNS1i = A_ns(N, sx, L) + aS1i = A_singlet(N, sx, L) assert aNS1i.shape == (2, 2) assert aS1i.shape == (3, 3) - # check intrisic hh is the same + # check intrinsic hh is the same assert aNS1i[1, 1] == aS1i[2, 2] -def test_Bluemlein_1(get_sx): - # Test against Blumlein OME implementation :cite:`Bierenbaum_2009`. +def test_Blumlein_1(): + # Test against Blumlein OME implementation :cite:`Bierenbaum:2009mv`. # Only even moments are available in that code. # Note there is a minus sign in the definition of L. @@ -46,8 +47,8 @@ def test_Bluemlein_1(get_sx): for n in range(N_vals): N = 2 * n + 2 - sx = get_sx(N) + sx = compute_harmonics_cache(N, 1, True) for L, ref_gg in ref_val_gg.items(): - aS1 = A_singlet_1(N, sx, L) + aS1 = A_singlet(N, sx, L) np.testing.assert_allclose(aS1[0, 0], ref_gg[n], rtol=1e-6) np.testing.assert_allclose(aS1[2, 0], ref_val_Hg[L][n], rtol=3e-6) diff --git a/tests/eko/test_matching_nnlo.py b/tests/eko/test_matching_nnlo.py index 62d404a6a..90e373ae7 100644 --- a/tests/eko/test_matching_nnlo.py +++ b/tests/eko/test_matching_nnlo.py @@ -3,30 +3,31 @@ import numpy as np -from eko.anomalous_dimensions import harmonics -from eko.matching_conditions.nnlo import A_ns_2, A_qq_2_ns, A_singlet_2 +from eko.harmonics import constants +from eko.matching_conditions.as2 import A_ns, A_qq_ns, A_singlet +from eko.matching_conditions.operator_matrix_element import compute_harmonics_cache -def test_A_2(get_sx): +def test_A_2(): logs = [0, 100] for L in logs: N = 1 - sx = get_sx(N) - aNSqq2 = A_qq_2_ns(N, sx, L) + sx = compute_harmonics_cache(N, 2, False) + aNSqq2 = A_qq_ns(N, sx, L) # quark number conservation np.testing.assert_allclose(aNSqq2, 0.0, atol=2e-11) N = 2 - sx = get_sx(N) - aS2 = A_singlet_2(N, sx, L) + sx = compute_harmonics_cache(N, 2, True) + aS2 = A_singlet(N, sx, L) # gluon momentum conservation np.testing.assert_allclose(aS2[0, 0] + aS2[1, 0] + aS2[2, 0], 0.0, atol=2e-6) # quark momentum conservation np.testing.assert_allclose(aS2[0, 1] + aS2[1, 1] + aS2[2, 1], 0.0, atol=1e-11) - aNS2 = A_ns_2(N, sx, L) + aNS2 = A_ns(N, sx, L) assert aNS2.shape == (2, 2) assert aS2.shape == (3, 3) @@ -36,11 +37,11 @@ def test_A_2(get_sx): def test_A_2_shape(): - N = 2 + N = np.random.rand() L = 3 - sx = np.zeros(3, np.complex_) - aNS2 = A_ns_2(N, sx, L) - aS2 = A_singlet_2(N, sx, L) + sx = compute_harmonics_cache(N, 2, (-1) ** N == 1) + aNS2 = A_ns(N, sx, L) + aS2 = A_singlet(N, sx, L) assert aNS2.shape == (2, 2) assert aS2.shape == (3, 3) @@ -50,20 +51,20 @@ def test_A_2_shape(): assert aNS2[0].all() == aNS2[1].all() -def test_pegasus_sign(get_sx): +def test_pegasus_sign(): # reference value come from Pegasus code transalted Mathematica ref_val = -21133.9 N = 2 - sx = get_sx(N) + sx = compute_harmonics_cache(N, 2, True) L = 100.0 - aS2 = A_singlet_2(N, sx, L) + aS2 = A_singlet(N, sx, L) np.testing.assert_allclose(aS2[0, 0], ref_val, rtol=4e-5) -def test_Bluemlein_2(get_sx): - # Test against Blumlein OME implementation :cite:`Bierenbaum_2009`. - # For some OME only even moments are available in that code. +def test_Blumlein_2(): + # Test against Blumlein OME implementation :cite:`Bierenbaum:2009zt`. + # For singlet OME only even moments are available in that code. # Note there is a minus sign in the definition of L. ref_val_gg = { 0: [-9.96091, -30.0093, -36.5914, -40.6765, -43.6823], @@ -119,8 +120,8 @@ def test_Bluemlein_2(get_sx): } for N in range(2, 11): for L, ref_Hg in ref_val_Hg.items(): - sx = get_sx(N) - aS2 = A_singlet_2(N, sx, L) + sx = compute_harmonics_cache(N, 2, True) + aS2 = A_singlet(N, sx, L) if N % 2 == 0: idx = int(N / 2 - 1) np.testing.assert_allclose(aS2[0, 0], ref_val_gg[L][idx], rtol=2e-6) @@ -130,24 +131,24 @@ def test_Bluemlein_2(get_sx): np.testing.assert_allclose(aS2[1, 1], ref_val_qq[L][N - 2], rtol=4e-6) -def test_Hg2_pegasus(get_sx): - # Test againnt the parametrized expession for A_Hg_2 +def test_Hg2_pegasus(): + # Test against the parametrized expression for A_Hg # coming from Pegasus code - # This expession is less accurate. + # This parametrization is less accurate. L = 0 for N in range(3, 20): - sx = get_sx(N) - S1 = sx[0] - S2 = sx[1] - S3 = sx[2] - aS2 = A_singlet_2(N, sx, L) + sx = compute_harmonics_cache(N, 2, True) + S1 = sx[0][0] + S2 = sx[1][0] + S3 = sx[2][0] + aS2 = A_singlet(N, sx, L) E2 = ( - 2.0 / N * (harmonics.zeta3 - S3 + 1.0 / N * (harmonics.zeta2 - S2 - S1 / N)) + 2.0 / N * (constants.zeta3 - S3 + 1.0 / N * (constants.zeta2 - S2 - S1 / N)) ) - a_hg_2_param = ( + a_hg_param = ( -0.006 + 1.111 * (S1**3 + 3.0 * S1 * S2 + 2.0 * S3) / N - 0.400 * (S1**2 + S2) / N @@ -161,15 +162,15 @@ def test_Hg2_pegasus(get_sx): - 146.8 * E2 ) - np.testing.assert_allclose(aS2[2, 0], a_hg_2_param, rtol=7e-4) + np.testing.assert_allclose(aS2[2, 0], a_hg_param, rtol=7e-4) -def test_msbar_matching(get_sx): +def test_msbar_matching(): logs = [0, 100] for L in logs: N = 2 - sx = get_sx(N) - aS2 = A_singlet_2(N, sx, L, True) + sx = compute_harmonics_cache(N, 2, True) + aS2 = A_singlet(N, sx, L, True) # gluon momentum conservation np.testing.assert_allclose(aS2[0, 0] + aS2[1, 0] + aS2[2, 0], 0.0, atol=2e-6) diff --git a/tests/eko/test_ome.py b/tests/eko/test_ome.py index 1ded8b602..593bed230 100644 --- a/tests/eko/test_ome.py +++ b/tests/eko/test_ome.py @@ -13,6 +13,7 @@ A_singlet, OperatorMatrixElement, build_ome, + compute_harmonics_cache, quad_ker, ) from eko.strong_coupling import StrongCoupling @@ -21,14 +22,19 @@ def test_build_ome_as(): # test that if as = 0 ome is and identity - N = 2 + N = complex(2.123) L = 0.0 a_s = 0.0 - sx = np.zeros(3, np.complex_) + nf = 3 is_msbar = False - for o in [0, 1, 2]: - aNS = A_non_singlet(o, N, sx, L) - aS = A_singlet(o, N, sx, L, is_msbar) + for o in [1, 2, 3]: + sx_singlet = compute_harmonics_cache(N, o, True) + sx_ns = sx_singlet + if o == 3: + sx_ns = compute_harmonics_cache(N, o, False) + + aNS = A_non_singlet(o, N, sx_ns, nf, L) + aS = A_singlet(o, N, sx_singlet, nf, L, is_msbar, sx_ns) for a in [aNS, aS]: for method in ["", "expanded", "exact"]: @@ -48,10 +54,10 @@ def test_build_ome_nlo(): a_s = 20 is_msbar = False - sx = np.array([1, 1, 1], np.complex_) - - aNSi = A_non_singlet(1, N, sx, L) - aSi = A_singlet(1, N, sx, L, is_msbar) + sx = [[1], [1], [1]] + nf = 4 + aNSi = A_non_singlet(1, N, sx, nf, L) + aSi = A_singlet(1, N, sx, nf, L, is_msbar) for a in [aNSi, aSi]: for method in ["", "expanded", "exact"]: dim = len(a[0]) @@ -81,46 +87,50 @@ def test_quad_ker(monkeypatch): ) # negate mellin prefactor monkeypatch.setattr(interpolation, "log_evaluate_Nx", lambda *args: 1) monkeypatch.setattr(interpolation, "evaluate_Nx", lambda *args: 1) + zeros = np.zeros((2, 2)) monkeypatch.setattr( "eko.matching_conditions.operator_matrix_element.A_non_singlet", - lambda *args: np.identity(2), + lambda *args: np.array([zeros, zeros, zeros]), ) + zeros = np.zeros((3, 3)) monkeypatch.setattr( "eko.matching_conditions.operator_matrix_element.A_singlet", - lambda *args: np.identity(3), + lambda *args: np.array([zeros, zeros, zeros]), ) for is_log in [True, False]: res_ns = quad_ker( u=0, - order=2, + order=3, mode0=200, mode1=200, is_log=is_log, - logx=0.0, + logx=0.123, areas=np.zeros(3), backward_method=None, a_s=0.0, + nf=3, L=0.0, is_msbar=False, ) np.testing.assert_allclose(res_ns, 1.0) res_s = quad_ker( u=0, - order=2, + order=3, mode0=100, mode1=100, is_log=is_log, - logx=0.0, + logx=0.123, areas=np.zeros(3), backward_method=None, a_s=0.0, + nf=3, L=0.0, is_msbar=False, ) np.testing.assert_allclose(res_s, 1.0) res_s = quad_ker( u=0, - order=2, + order=3, mode0=100, mode1=21, is_log=is_log, @@ -128,6 +138,7 @@ def test_quad_ker(monkeypatch): areas=np.zeros(3), backward_method=None, a_s=0.0, + nf=3, L=0.0, is_msbar=False, ) @@ -138,14 +149,15 @@ def test_quad_ker(monkeypatch): for label in labels: res_ns = quad_ker( u=0, - order=2, + order=3, mode0=label[0], mode1=label[1], is_log=True, - logx=0.0, + logx=0.123, areas=np.zeros(3), backward_method="expanded", a_s=0.0, + nf=3, L=0.0, is_msbar=False, ) @@ -170,14 +182,15 @@ def test_quad_ker(monkeypatch): for label in labels: res_ns = quad_ker( u=0, - order=2, + order=3, mode0=label[0], mode1=label[1], is_log=True, - logx=0.0, + logx=0.123, areas=np.zeros(3), backward_method="exact", a_s=0.0, + nf=3, L=0.0, is_msbar=False, ) @@ -189,7 +202,7 @@ def test_quad_ker(monkeypatch): monkeypatch.setattr(interpolation, "log_evaluate_Nx", lambda *args: 0) res_ns = quad_ker( u=0, - order=2, + order=3, mode0=200, mode1=200, is_log=True, @@ -197,17 +210,86 @@ def test_quad_ker(monkeypatch): areas=np.array([0.01, 0.1, 1.0]), backward_method=None, a_s=0.0, + nf=3, L=0.0, is_msbar=False, ) np.testing.assert_allclose(res_ns, 0.0) +# def test_run_integration(): +# # setup objs +# theory_card = { +# "alphas": 0.35, +# "PTO": 2, +# "ModEv": "TRN", +# "fact_to_ren_scale_ratio": 1.0, +# "Qref": np.sqrt(2), +# "nfref": None, +# "Q0": np.sqrt(2), +# "nf0": 4, +# "NfFF": 3, +# "IC": 1, +# "IB": 0, +# "mc": 1.0, +# "mb": 4.75, +# "mt": 173.0, +# "kcThr": 0.0, +# "kbThr": np.inf, +# "ktThr": np.inf, +# "MaxNfPdf": 6, +# "MaxNfAs": 6, +# "HQ": "POLE", +# "ModSV": None, +# } + +# operators_card = { +# "Q2grid": [1, 10], +# "interpolation_xgrid": [0.1, 1.0], +# "interpolation_polynomial_degree": 1, +# "interpolation_is_log": True, +# "debug_skip_singlet": True, +# "debug_skip_non_singlet": False, +# "ev_op_max_order": 1, +# "ev_op_iterations": 1, +# "backward_inversion": "", +# } +# g = OperatorGrid.from_dict( +# theory_card, +# operators_card, +# ThresholdsAtlas.from_dict(theory_card), +# StrongCoupling.from_dict(theory_card), +# InterpolatorDispatcher.from_dict(operators_card), +# ) +# o = OperatorMatrixElement(g.config, g.managers, is_backward=False) +# log_grid = np.log(o.int_disp.xgrid_raw) +# res = run_op_integration( +# log_grid=(len(log_grid) - 1, log_grid[-1]), +# int_disp=o.int_disp, +# labels=[(200, 200)], +# is_log=True, +# grid_size=len(log_grid), +# a_s=0.333, +# order=theory_card["PTO"], +# L=0, +# nf=4, +# backward_method="", +# is_msbar=False, +# ) + +# # here the last point is a zero, by default +# np.testing.assert_allclose(res[0][(200, 200)], (0.0, 0.0)) + +# # test that copy ome does not change anything +# o.copy_ome() +# np.testing.assert_allclose(0.0, o.op_members[(100, 100)].value) + + class TestOperatorMatrixElement: # setup objs theory_card = { "alphas": 0.35, - "PTO": 0, + "PTO": 3, "ModEv": "TRN", "fact_to_ren_scale_ratio": 1.0, "Qref": np.sqrt(2), @@ -217,17 +299,29 @@ class TestOperatorMatrixElement: "NfFF": 3, "IC": 1, "IB": 0, - "mc": 1.0, + "mc": 1.51, "mb": 4.75, "mt": 173.0, - "kcThr": 1.0, - "kbThr": 1.0, + "kcThr": 1, + "kbThr": 1, "ktThr": np.inf, "MaxNfPdf": 6, "MaxNfAs": 6, "HQ": "POLE", "ModSV": None, } + operators_card = { + "Q2grid": [20], + "interpolation_xgrid": [0.1, 1.0], + "interpolation_polynomial_degree": 1, + "interpolation_is_log": True, + "debug_skip_singlet": True, + "debug_skip_non_singlet": False, + "ev_op_max_order": 1, + "ev_op_iterations": 1, + "backward_inversion": "exact", + "n_integration_cores": 1, + } def test_labels(self): for skip_singlet in [True, False]: @@ -242,6 +336,7 @@ def test_labels(self): "ev_op_max_order": 1, "ev_op_iterations": 1, "backward_inversion": "exact", + "n_integration_cores": 1, } g = OperatorGrid.from_dict( self.theory_card, @@ -250,20 +345,35 @@ def test_labels(self): StrongCoupling.from_dict(self.theory_card), InterpolatorDispatcher.from_dict(operators_card), ) - o = OperatorMatrixElement(g.config, g.managers, is_backward=False) - labels = o.labels() - test_labels = [(200, 200), (br.matching_hminus_pid, 200)] + o = OperatorMatrixElement( + g.config, + g.managers, + is_backward=True, + q2=None, + nf=None, + L=None, + is_msbar=False, + ) + labels = o.labels + test_labels = [ + (200, 200), + (br.matching_hminus_pid, br.matching_hminus_pid), + ] for l in test_labels: if skip_ns: assert l not in labels else: assert l in labels test_labels = [ - (100, 100), - (br.matching_hplus_pid, 100), (21, 21), - (br.matching_hplus_pid, 21), + (21, 100), (21, br.matching_hplus_pid), + (100, 21), + (100, 100), + (100, br.matching_hplus_pid), + (br.matching_hplus_pid, 21), + (br.matching_hplus_pid, 100), + (br.matching_hplus_pid, br.matching_hplus_pid), ] for l in test_labels: if skip_singlet: @@ -271,51 +381,81 @@ def test_labels(self): else: assert l in labels + def test_compute_n3lo(self): + g = OperatorGrid.from_dict( + self.theory_card, + self.operators_card, + ThresholdsAtlas.from_dict(self.theory_card), + StrongCoupling.from_dict(self.theory_card), + InterpolatorDispatcher.from_dict(self.operators_card), + ) + o = OperatorMatrixElement( + g.config, + g.managers, + is_backward=True, + q2=self.theory_card["mb"] ** 2, + nf=4, + L=0, + is_msbar=False, + ) + o.compute() + + dim = o.op_members[(200, 200)].value.shape + np.testing.assert_allclose( + o.op_members[(200, br.matching_hminus_pid)].value, np.zeros(dim) + ) + np.testing.assert_allclose( + o.op_members[(br.matching_hminus_pid, 200)].value, np.zeros(dim) + ) + + for label in [(200, 200), (br.matching_hminus_pid, br.matching_hminus_pid)]: + mat = o.op_members[label].value + np.testing.assert_allclose(mat, np.triu(mat)) + def test_compute_lo(self): - operators_card = { - "Q2grid": [20], - "interpolation_xgrid": [0.001, 0.01, 0.1, 1.0], - "interpolation_polynomial_degree": 1, - "interpolation_is_log": True, - "debug_skip_singlet": False, - "debug_skip_non_singlet": False, - "ev_op_max_order": 1, - "ev_op_iterations": 1, - "backward_inversion": "exact", - } + self.theory_card.update({"PTO": 0}) + self.operators_card.update({"debug_skip_singlet": False}) g = OperatorGrid.from_dict( self.theory_card, - operators_card, + self.operators_card, ThresholdsAtlas.from_dict(self.theory_card), StrongCoupling.from_dict(self.theory_card), - InterpolatorDispatcher.from_dict(operators_card), + InterpolatorDispatcher.from_dict(self.operators_card), + ) + o = OperatorMatrixElement( + g.config, + g.managers, + is_backward=False, + q2=self.theory_card["mb"] ** 2, + nf=4, + L=0, + is_msbar=False, ) - o = OperatorMatrixElement(g.config, g.managers, is_backward=False) - o.compute(self.theory_card["mb"] ** 2, nf=4, L=0, is_msbar=False) + o.compute() - dim = o.ome_members[(200, 200)].value.shape + dim = o.op_members[(200, 200)].value.shape for indices in [(100, br.matching_hplus_pid), (200, br.matching_hminus_pid)]: np.testing.assert_allclose( - o.ome_members[(indices[0], indices[0])].value, np.eye(dim[0]), atol=1e-8 + o.op_members[(indices[0], indices[0])].value, np.eye(dim[0]), atol=1e-8 ) np.testing.assert_allclose( - o.ome_members[(indices[1], indices[1])].value, np.eye(dim[0]), atol=1e-8 + o.op_members[(indices[1], indices[1])].value, np.eye(dim[0]), atol=1e-8 ) np.testing.assert_allclose( - o.ome_members[(indices[0], indices[1])].value, np.zeros(dim) + o.op_members[(indices[0], indices[1])].value, np.zeros(dim) ) np.testing.assert_allclose( - o.ome_members[(indices[1], indices[0])].value, np.zeros(dim) + o.op_members[(indices[1], indices[0])].value, np.zeros(dim) ) np.testing.assert_allclose( - o.ome_members[(21, 21)].value, np.eye(dim[0]), atol=1e-8 + o.op_members[(21, 21)].value, np.eye(dim[0]), atol=1e-8 ) np.testing.assert_allclose( - o.ome_members[100, 21].value, o.ome_members[(21, 100)].value + o.op_members[100, 21].value, o.op_members[(21, 100)].value ) np.testing.assert_allclose( - o.ome_members[(br.matching_hplus_pid, 21)].value, - o.ome_members[(21, br.matching_hplus_pid)].value, + o.op_members[(br.matching_hplus_pid, 21)].value, + o.op_members[(21, br.matching_hplus_pid)].value, ) def test_compute_nlo(self): @@ -329,6 +469,7 @@ def test_compute_nlo(self): "ev_op_max_order": 1, "ev_op_iterations": 1, "backward_inversion": "exact", + "n_integration_cores": 1, } t = copy.deepcopy(self.theory_card) t["PTO"] = 1 @@ -339,25 +480,33 @@ def test_compute_nlo(self): StrongCoupling.from_dict(t), InterpolatorDispatcher.from_dict(operators_card), ) - o = OperatorMatrixElement(g.config, g.managers, is_backward=False) - o.compute(t["mb"] ** 2, nf=4, L=0, is_msbar=False) + o = OperatorMatrixElement( + g.config, + g.managers, + is_backward=False, + q2=t["mb"] ** 2, + nf=4, + L=0, + is_msbar=False, + ) + o.compute() dim = len(operators_card["interpolation_xgrid"]) shape = (dim, dim) for indices in [(100, br.matching_hplus_pid), (200, br.matching_hminus_pid)]: - assert o.ome_members[(indices[0], indices[0])].value.shape == shape - assert o.ome_members[(indices[1], indices[1])].value.shape == shape - assert o.ome_members[(indices[0], indices[1])].value.shape == shape - assert o.ome_members[(indices[1], indices[0])].value.shape == shape + assert o.op_members[(indices[0], indices[0])].value.shape == shape + assert o.op_members[(indices[1], indices[1])].value.shape == shape + assert o.op_members[(indices[0], indices[1])].value.shape == shape + assert o.op_members[(indices[1], indices[0])].value.shape == shape np.testing.assert_allclose( - o.ome_members[(indices[0], indices[1])].value, np.zeros(shape) + o.op_members[(indices[0], indices[1])].value, np.zeros(shape) ) np.testing.assert_allclose( - o.ome_members[(indices[1], indices[0])].value, np.zeros(shape) + o.op_members[(indices[1], indices[0])].value, np.zeros(shape) ) - assert o.ome_members[(21, 21)].value.shape == shape + assert o.op_members[(21, 21)].value.shape == shape np.testing.assert_allclose( - o.ome_members[(100, 21)].value, o.ome_members[(21, 100)].value + o.op_members[(100, 21)].value, o.op_members[(21, 100)].value ) - assert o.ome_members[(br.matching_hplus_pid, 21)].value.shape == shape - assert o.ome_members[(21, br.matching_hplus_pid)].value.shape == shape + assert o.op_members[(br.matching_hplus_pid, 21)].value.shape == shape + assert o.op_members[(21, br.matching_hplus_pid)].value.shape == shape diff --git a/tests/eko/test_ad_harmonics.py b/tests/eko/test_polygamma.py similarity index 77% rename from tests/eko/test_ad_harmonics.py rename to tests/eko/test_polygamma.py index 6e48ebf05..1db9a8fd4 100644 --- a/tests/eko/test_ad_harmonics.py +++ b/tests/eko/test_polygamma.py @@ -2,7 +2,7 @@ import numpy as np import pytest -from eko.anomalous_dimensions import harmonics +from eko import harmonics # until https://github.com/numba/numba/pull/5660 is confirmed # we need to deactivate numba prior running @@ -70,31 +70,27 @@ def test_cern_polygamma(): ] for nk, k in enumerate(ks): for nz, z in enumerate(zs): - me = harmonics.cern_polygamma(z, k) + me = harmonics.polygamma.cern_polygamma(z, k) ref = fortran_ref[nk][nz] np.testing.assert_almost_equal(me, ref) # errors with pytest.raises(NotImplementedError): - _ = harmonics.cern_polygamma(1, 5) + _ = harmonics.polygamma.cern_polygamma(1, 5) with pytest.raises(ValueError): - _ = harmonics.cern_polygamma(0, 0) + _ = harmonics.polygamma.cern_polygamma(0, 0) -def test_harmonic_Sx(): - """test harmonic sums S_x on real axis""" - # test on real axis - def sx(n, m): - return np.sum([1 / k**m for k in range(1, n + 1)]) +def test_recursive_harmonic_sum(): - ls = [harmonics.harmonic_S1, harmonics.harmonic_S2, harmonics.harmonic_S3] - for k in range(1, 3 + 1): - for n in range(1, 4 + 1): - np.testing.assert_almost_equal(ls[k - 1](n), sx(n, k)) + n = np.random.rand() + iterations = 1 + sx_base = harmonics.sx(n) + sx_test = harmonics.sx(n + iterations) + sx_final = [] + for w in range(1, 6): + sx_final.append( + harmonics.polygamma.recursive_harmonic_sum(sx_base[w - 1], n, iterations, w) + ) -def test_melling_g3(): - ns = [1.0, 2.0, 1 + 1j] - # NIntegrate[x^({1, 2, 1 + I} - 1) PolyLog[2, x]/(1 + x), {x, 0, 1}] - mma_ref_values = [0.3888958462, 0.2560382207, 0.3049381491 - 0.1589060625j] - for n, r in zip(ns, mma_ref_values): - np.testing.assert_almost_equal(harmonics.mellin_g3(n), r, decimal=6) + np.testing.assert_allclose(sx_final, sx_test) diff --git a/tests/eko/test_runner.py b/tests/eko/test_runner.py index e74cae619..75a871095 100644 --- a/tests/eko/test_runner.py +++ b/tests/eko/test_runner.py @@ -42,6 +42,7 @@ "ev_op_max_order": 1, "ev_op_iterations": 1, "backward_inversion": "exact", + "n_integration_cores": 1, } diff --git a/tests/eko/test_sv_expanded.py b/tests/eko/test_sv_expanded.py index df3cf6f2b..f0828f6f9 100644 --- a/tests/eko/test_sv_expanded.py +++ b/tests/eko/test_sv_expanded.py @@ -6,7 +6,16 @@ from eko.anomalous_dimensions import gamma_ns, gamma_singlet from eko.beta import beta_0 from eko.kernels import non_singlet, singlet -from eko.scale_variations import expanded, exponentiated +from eko.scale_variations import Modes, expanded, exponentiated + + +def test_modes(): + assert Modes.expanded.name == "expanded" + assert Modes.exponentiated.name == "exponentiated" + assert Modes.unvaried.name == "unvaried" + assert Modes.expanded.value == 3 + assert Modes.exponentiated.value == 2 + assert Modes.unvaried.value == 1 def test_ns_sv_dispacher(): @@ -71,7 +80,7 @@ def scheme_diff(g, k, pto, is_singlet): for L in [np.log(0.5), np.log(2)]: for order in [1, 2]: - # Non singlet kernels + # non-singlet kernels gns = gamma_ns(order, br.non_singlet_pids_map["ns+"], n, nf) ker = non_singlet.dispatcher( order, method, gns, a1, a0, nf, ev_op_iterations=1