# The Awkward World of Python and C++

Manasvi Goyal1 Ianna Osborne2 Jim Pivarski2 1 Delhi Technological University,
Delhi, India  2 Princeton University, Princeton, NJ 08544, USA
<EMAIL_ADDRESS>
###### Abstract

There are undeniable benefits of binding Python and C++ to take advantage of
the best features of both languages. This is especially relevant to the HEP
and other scientific communities that have invested heavily in the C++
frameworks and are rapidly moving their data analyses to Python. Version 2 of
Awkward Array, a Scikit-HEP Python library, introduces a set of header-only
C++ libraries that do not depend on any application binary interface. Users
can directly include these libraries in their compilation rather than linking
against platform-specific libraries. This new development makes the
integration of Awkward Arrays into other projects easier and more portable as
the implementation is easily separable from the rest of the Awkward Array
codebase. The code is minimal, it does not include all of the code needed to
use Awkward Arrays in Python, nor does it include references to Python or
pybind11. The C++ users can use it to make arrays and then copy them to Python
without any specialized data types - only raw buffers, strings, and integers.
This C++ code also simplifies the process of just-in-time (JIT) compilation in
ROOT. This implementation approach solves some of the drawbacks, like
packaging projects where native dependencies can be challenging. In this
paper, we demonstrate the technique to integrate C++ and Python by using a
header-only approach. We also describe the implementation of a new
LayoutBuilder and a GrowableBuffer. Furthermore, examples of wrapping the C++
data into Awkward Arrays and exposing Awkward Arrays to C++ without copying
them are discussed.

##  1 Introduction

Awkward Array [1] is an important tool for physics analysis in Python for High
Energy Physics (HEP) community. It is a part of the Scikit-HEP [2] ecosystem.
Nested, variable-length lists (”ragged” or ”jagged” arrays), records with
differently typed fields, missing data, and other heterogeneous data
(union/variant types) can be defined as a set of primitives using NumPy-like
[3] phrases in Python [4]. In Awkward arrays, a single, user-facing `ak.Array`
consists of one small tree with large, contiguous data buffers attached to
each node [5], as shown in Figure 1. Compiled operations are performed on
these data buffers, not the objects they represent.

Figure 1: Structure of an Awkward Array with nested variable-length lists and
records, color-coded with an array example.

In this work, we present new tools for creating Awkward Arrays in C++.
Previously, the main codebase was written in C++ [6] with the idea that
downstream code would link to libawkward.so, but that route is full of hidden
issues [7]. The method of a small, header-only library that only fills array
buffers for downstream code to pass from C++ to Python using C-types only has
considerably more promise.

##  2 Python-C++ Integration

Nowadays, more front-end users use Python [8], but large-scale processing
still needs to have high performance of C++ [7]. That is why we combine Python
and C++ to take advantage of the best features of both languages so that we
can have a Python user interface and, at the same time, take advantage of the
performance and memory management of C++. HEP and other scientific communities
have extensively invested in the C++ frameworks and are swiftly migrating
their data analyses to Python. These communities are particularly interested
in bridging the gap between the two languages [8]. This raises an important
question: ’How to do Python-C++ integration the right way?’, which is
addressed in the following sections.

##  3 The ’Header-Only’ Approach

A set of header-only C++ libraries has been introduced to address the issues
in the Python-C++ integration in Awkward Arrays [7]. These templated C++
libraries are not dependent on any application binary interface (ABI). They
can be directly included in a project’s compilation without the need to link
against platform-specific libraries. This ’header-only’ approach not only
simplifies the production of Awkward Arrays in a project but also enhances the
portability of the Awkward Arrays. The code is minimal and does not constitute
all of the code required to use Awkward Arrays in Python. It contains no
references to Python or Python bindings. The header files can be used by C++
users to create Awkward Arrays, which can then be copied into Python without
any specialized data types - only raw buffers, strings, and integers. This
approach addresses the issue of packaging projects with native dependencies.

##  4 LayoutBuilder

A ’layout’ consists of composable elements that determine how an array is
structured. It can only build a specific view determined by the layout Form.
LayoutBuilder [9] is a set of compile time, templated static C++ classes
implemented entirely in a header-only library. It uses a header-only
GrowableBuffer (Figure 2), which is implemented as a linked list with smart
pointers. `awkward::LayoutBuilder` specializes an Awkward data structure using
C++ templates, which can be filled and converted to a Python Awkward Array
through `ak.from_buffers`. The data comes out of LayoutBuilder as a set of
named buffers and a JSON [10] Form. The Form is a unique description of an
Awkward Array and returns a `std::string` that tells Awkward Array how to put
everything together. LayoutBuilder is part of an awkward-cpp package that is
separate from an awkward package. Both packages are individually pip-
installable. The code doesn’t have helper methods to pass the data to Python,
so different projects can use different binding generators. The code relies on
generalized lambda expressions to deduce parameter type during compile time
that is available from the C++14 standard.

Figure 2: Awkward Array GrowableBuffer implemented as a linked list with
multiple panels, each of size = 5, that are allocated as needed, i.e., when
the GrowableBuffer runs out of space.

ArrayBuilder [11] and LayoutBuilder are both used to create Awkward Arrays.
The main difference between a LayoutBuilder and an ArrayBuilder is that the
data types that can be appended to the LayoutBuilder are defined in advance,
while any data types can be appended to an ArrayBuilder. LayoutBuilder is
designed to build Awkward Arrays faster. The flexibility of ArrayBuilder comes
with performance limitations since it needs to discover the data type, while
LayoutBuilder knows it in advance.

##  5 User Interface of LayoutBuilder

This section explains the user interface of LayoutBuilder with the help of an
example of an Awkward Array with nested records and variable-length lists.

###  5.1 Phases of LayoutBuilder

There are three phases of using LayoutBuilder:

  1. 1.

Constructing a LayoutBuilder: from variadic templates (It is an implicit
template instantiation).

  2. 2.

Filling the LayoutBuilder: while repeatedly walking over the raw pointers.

  3. 3.

Taking the data out to user-allocated buffers: then, the user can pass them to
Python.

###  5.2 Illustrative Example

⬇

#include ”awkward/LayoutBuilder.h”

\parenum Field : std::size_t {x, y};

UserDefinedMap fields_map({

{Field::x, ”x”},

{Field::y, ”y”}});

\par// Constructing a LayoutBuilder from variadic templates!

RecordBuilder<

RecordField<Field::x, NumpyBuilder<double>>,

RecordField<Field::y, ListOffsetBuilder<int64_t, NumpyBuilder<int32_t>>>

> builder(fields_map);

\parauto& x_builder = builder.field<Field::x>();

auto& y_builder = builder.field<Field::y>();

\par// Filling the LayoutBuilder

x_builder.append(1.1);

auto& y_subbuilder = y_builder.begin_list();

y_subbuilder.append(1);

y_builder.end_list();

\parx_builder.append(2.2);

y_builder.begin_list();

y_builder.end_list();

\parx_builder.append(3.3);

y_builder.begin_list();

y_subbuilder.append(1);

y_subbuilder.append(2);

y_builder.end_list();

Figure 3: Example of a LayoutBuilder with nested records and variable-length
lists.

An example of RecordBuilder is illustrated in Listing 3. The first step is to
include the LayoutBuilder header file (see [9] for the installation
instructions). Next, the RecordBuilder is constructed with variadic templates.
The contents of a RecordBuilder are heterogeneous type containers
(`std::tuple`) that take the other Builders as the template parameters. The
field names are non-type template parameters defined by the user. Currently,
it is not possible to template on strings as this functionality comes only
from C++20 and onwards. Therefore, for passing the field names as template
parameters to the RecordBuilder, a user-defined `field_map`, with enumerated
type field ID as keys and the field names as value, has to be provided. In the
case of multiple RecordBuilder, a user-defined map has to be specified for
each of the RecordBuilder used.

After that, the LayoutBuilder buffers are filled with the required data as
shown in Listing 3. To make sure there are no errors while filling these
buffers, the user can check their validity by using the `is_valid()` method,
which can be called on every entry if they want to trade safety for speed. The
example translates into the following Awkward Array in Python:

⬇

[{”x”: 1.1, ”y”: [1]}, {”x”: 2.2, ”y”: []}, {”x”: 3.3, ”y”: [1, 2]},]

We want NumPy to own the array buffers so that they get deleted when the
Awkward Array goes out of Python scope, not when the LayoutBuilder goes out of
C++ scope. The hand-off, therefore, needs a few steps:

  1. 1.

Retrieve the set of buffer names and their sizes (as a number of bytes).

⬇

std::map<std::string, size_t> names_nbytes = {};

builder.buffer_nbytes(names_nbytes);

  2. 2.

Allocate memory for these buffers in Python with `np.empty(nbytes, type =
np.uint8)` and get `void*` pointers to these buffers by casting the output of
`numpy_array.ctypes.data`.

  3. 3.

Let the LayoutBuilder fill these buffers.

⬇

std::map<std::string, void*> buffers;

builder.to_buffers(buffers);

  4. 4.

Finally, JSON Form is generated with:

⬇

std::string form = builder.form();

The Form generated for the example in Listing 3 is shown in Listing 4. Now,
everything can be passed over the border from C++ to Python using pybind11’s
[12] `py::buffer_protocol` for the buffers, as well as an integer for the
length and a string for the Form. If the user ever needs to make a change in
the format of the records (add, remove, rename, or change the field type),
there is no need to change anything in the Python-C++ interface. All of that
is contained in the specialization of the C++ template and the filling
procedure, which are both in the C++ code.

                        {"class": "RecordArray",
                         "contents": {
                             "x": {"class": "NumpyArray",
                                   "primitive": "float64",
                                   "form_key": "node1"},
                             "y": {"class": "ListOffsetArray",
                                   "offsets": "i64",
                                   "content": {
                                       "class": "NumpyArray",
                                       "primitive": "int32",
                                       "form_key": "node3"},
                                  "form_key": "node2"}" },
                         "form_key": "node0"}

Figure 4: Awkward Array Form for the example in Listing 3.

##  6 Applications

The header-only approach allows for multiple applications in both static and
dynamic projects. Awkward RDataFrame [13] uses the C++ header-only libraries
to simplify the process of just-in-time (JIT) compilation in ROOT [14]. The
`ak.from_rdataframe` [15] function converts the selected ROOT RDataFrame [16]
columns as native Awkward Arrays. The templated header-only implementation
constructs the Form from the primitive data types [17]. The generation of all
the types via templates makes it easier to dynamically generate LayoutBuilder
from strings in Python and then compile it with Cling [18].

Another application of header-only LayoutBuilder could be in the ctapipe [19]
project, which is currently in the planning stage. ctapipe is a framework for
prototyping the low-level data processing algorithms for the Cherenkov
Telescope Array [20]. It does some processing on structured (“awkward”) event
data, and the developers want to refactor their implementation to use Awkward
Array. They already have C++ code that iterates over the custom file format,
which has array types that are known at compile-time. The easiest way to
Awkward Arrays in this project is to use a LayoutBuilder to fill the buffers
and then send them to Python through pybind11.

##  7 Conclusion

The header-only approach presented in this paper facilitates Awkward Arrays
Python-C++ integration and enhances their portability. A set of templated
header-only libraries use only C-types (integers, strings, and raw buffers) to
build Awkward Arrays and send them to Python by generating a JSON Form. A
standalone awkward header-only C++ package opens up the doors for users to
analyze their data in Python. Awkward Arrays can be seamlessly integrated with
external projects without linking against platform-specific libraries or
worrying about native dependencies. This new development also allows the
extension of the use cases of Awkward Arrays to scientific communities beyond
HEP.

##  8 Acknowledgment

This work is supported by NSF cooperative agreement OAC-1836650 (IRIS-HEP) and
NSF cooperative agreement PHY-2121686 (US-CMS LHC Ops).

## References

## References

  * [1] Pivarski J, Osborne I, Ifrim I, Schreiner H, Hollands A, Biswas A, Das P, Roy Choudhury S, Smith N and Goyal M 2018 Awkward Array [Computer software] Zenodo `https://doi.org/10.5281/zenodo.4341376`
  * [2] Rodrigues E 2019 The Scikit-HEP Project EPJ Web Conf. 214 06005 `DOI:10.1051/epjconf/201921406005`
  * [3] Harris C R, Millman K J, van der Walt S J et al. 2020 Array programming with NumPy Nature 585 357–362. `DOI: 10.1038/s41586-020-2649-2`
  * [4] Pivarski J, Nandi J, Lange D and Elmer P, 2019 Columnar data processing for HEP analysis EPJ Web Conf. 214 06026 `DOI: 10.1051/epjconf/201921406026`
  * [5] Pivarski J, Elmer P and Lange D 2020 Awkward Arrays in Python, C++, and Numba EPJ Web Conf. 245 05023 `DOI: 10.1051/epjconf/202024505023`
  * [6] Pivarski J, Osborne I, Das P, Biswas A and Elmer P 2020 Awkward Array: JSON-like data, NumPy-like idioms Proc. of the 19th Python in Science Conf. (SCIPY 2020) 78-84
  * [7] Pivarski J 2021 Lessons learned in Python-C++ integration 20th International Workshop on Advanced Computing and Analysis Techniques in Physics Research `https://indi.to/N69ds`
  * [8] Pivarski J, Rodrigues E, Pedro K, Shadura O, Krikler B and Stewart G A 2022 HL-LHC Computing Review Stage 2, Common Software Projects: Data Science Tools for Analysis [arXiv 2202.02194] `DOI: 10.48550/arXiv.2202.02194`
  * [9] User Guide: How to Use Header-Only LayoutBuilder in C++ Awkward Array Documentation `https://awkward-array.org/doc/main/user-guide/how-to-use-header-only-layoutbuilder.html`
  * [10] JSON `https://www.json.org/`
  * [11] ArrayBuilder `https://awkward-array.org/doc/main/reference/generated/ak.ArrayBuilder.html`
  * [12] Jakob W, Rhinelander J and Moldovan D 2016 pybind11 - Seamless operability between C++11 and Python. `https://github.com/pybind/pybind11`
  * [13] Osborne I and Pivarski J 2022 Awkward RDataFrame Tutorial PyHEP 2022 (virtual) Workshop `https://doi.org/10.5281/zenodo.7081586`
  * [14] Brun R, Rademakers F, Canal P, Naumann A, Couet O, Moneta L, Vassilev V, Linev S, Piparo D, GANIS G, Bellenot B, Guiraud E, Amadio G, wverkerke, Mato P, TimurP, Tadel M, wlav, Tejedor E, Blomer J, Gheata A, Hageboeck S, Roiser S, marsupial, Wunsch S, Shadura O, Bose A, CristinaCristescu, Valls X and Isemann R 2019 root-project/root: v6.18/02 (v6-18-02) Zenodo `https://doi.org/10.5281/zenodo.3895860`
  * [15] from_rdataframe `https://awkward-array.org/doc/main/reference/generated/ak.from_rdataframe.html`
  * [16] Piparo D, Canal P, Guiraud E, Pla X V, Ganis G, Amadio G, Naumann A and Tejedor E 2018 RDataFrame: Easy Parallel ROOT Analysis at 100 Threads EPJ Web Conf. 214 06029 `DOI: 10.1051/epjconf/201921406029`
  * [17] Osborne I and Pivarski J 2022 Awkward to RDataFrame and back [arXiv 2302.09860] `DOI: 10.48550/arXiv.2302.09860`
  * [18] Cling [Online]. `https://root.cern.ch/cling`
  * [19] ctapipe documentation `https://ctapipe.readthedocs.io/en/latest/`
  * [20] ctapipe observatory `https://www.cta-observatory.org/`


E\left({\varphi},{\mathcal{P}}_{n,m},L_{p}\left(nV^{*}\right)\right)>\|{\varphi}-f_{n,{\varepsilon}}\|_{L_{p}\left(nV^{*}\right)}-{\varepsilon}.$

Then using the ${\beta}_{2}$-triangle inequality, we see that
$f_{n,{\varepsilon}}\in B_{n}^{\prime}$, and, in addition,

$\displaystyle
E\left({\varphi},{\mathcal{P}}_{n,m},L_{p}\left(nV^{*}\right)\right)=\inf_{{\varepsilon}\in\left(0,\|{\varphi}\|_{L_{p}({\mathbb{R}}^{m})}\right)}\|{\varphi}-f_{n,{\varepsilon}}\|_{L_{p}\left(nV^{*}\right)}\geq
E\left({\varphi},B_{n}^{\prime},L_{p}\left(nV^{*}\right)\right).$

Therefore, (7.38) holds true.

The compactness property of $\cup_{n=1}^{\infty}B_{n}^{\prime}$, stated in
C12.2), was verified by Bernstein [11] for $m=1$ and by the author [43, Lemma
2.2] for $m>1$.

So (7.33) for $p\in(0,{\infty}]$ follows from Corollary 7.6 (iv).

######  Example 7.10.

(Limit theorems for univariate polynomial approximations with exponential
weight). Let $Q:{\mathbb{R}}^{1}\to[0,{\infty})$ be an even differentiable
convex function and let ${\beta}_{2}$-norms
$\|\cdot\|_{L_{p}(W_{p},{\mathbb{R}}^{1})},\,p\in(0,{\infty}],\,{\beta}_{2}=\min\\{1,p\\}$,
be defined by (6.4) and (6.5).

In addition, let $a_{n}=a_{n}(Q)$ be the $n$th Mhaskar-Rakhmanov-Saff number
defined as the positive root of the equation

$\displaystyle
n=\frac{2}{\pi}\int_{0}^{1}\frac{a_{n}x\,Q^{\prime}(a_{n}x)}{\sqrt{1-x^{2}}}dx$

and let

$\displaystyle
b_{n}=b_{n}(Q):=\frac{2}{\pi}\int_{0}^{1}\frac{Q^{\prime}(a_{n}x)\sqrt{1-x^{2}}}{x}dx+n/a_{n}.$

Next, let
$F^{(2)}_{*}=L_{p}({\mathbb{R}}^{1}),\,B=B_{[-{\sigma},{\sigma}]}\cap
L_{p}({\mathbb{R}}^{1}),\,F^{(2)}_{*n}=L_{p}\left(W_{p}(({\sigma}/b_{n})\cdot),{\mathbb{R}}^{1}\right),\,{\sigma}>0,\,\Omega_{n}=\Omega_{n}^{*}={\mathbb{R}}^{1},\,B_{n}={\mathcal{P}}_{n,1},\,B_{n}^{*}={\mathcal{P}}_{\lfloor
n/\tau\rfloor,1},\,\tau\in(0,1),\,n\in{\mathbb{N}},\,p\in(0,{\infty}]$.

Relations like (7.33) were proved in [36]. The following result is a corollary
of these relations: let $W_{p}$ satisfy some additional conditions (see [36,
Definition 1.4.6]); if ${\varphi}\in L_{\infty}({\mathbb{R}}^{1})$, then

$\displaystyle E\left({\varphi},B_{[-{\sigma},{\sigma}]}\cap
L_{\infty}({\mathbb{R}}^{1}),L_{\infty}({\mathbb{R}}^{1})\right)$
$\displaystyle\leq\liminf_{n\to{\infty}}E\left({\varphi}((b_{n}/{\sigma})\cdot),{\mathcal{P}}_{n,1},L_{\infty}\left(W_{\infty},{\mathbb{R}}^{1}\right)\right)$
$\displaystyle\leq\limsup_{n\to{\infty}}E\left({\varphi}((b_{n}/{\sigma})\cdot),{\mathcal{P}}_{n,1},L_{\infty}\left(W_{\infty},{\mathbb{R}}^{1}\right)\right)$
$\displaystyle\leq\lim_{\tau\to
1^{-}}E\left({\varphi},B_{[-\tau{\sigma},\tau{\sigma}]}\cap
L_{\infty}({\mathbb{R}}^{1}),L_{\infty}({\mathbb{R}}^{1})\right),$ (7.39)

and if ${\varphi}\in L_{p}({\mathbb{R}}^{1}),\,p\in(0,{\infty})$, then

$\lim_{n\to{\infty}}(b_{n}/{\sigma})^{1/p}E\left({\varphi}((b_{n}/{\sigma})\cdot),{\mathcal{P}}_{n,1},L_{p}\left(W_{p},{\mathbb{R}}^{1}\right)\right)=E\left({\varphi},B_{[-{\sigma},{\sigma}]}\cap
L_{p}({\mathbb{R}}^{1}),L_{p}({\mathbb{R}}^{1})\right).$ (7.40)

For $p\in(0,{\infty})$ equality (7.40) was proved in [36, Theorem 2.1.2],
while a stronger version of relations (7.10) for $p={\infty}$ was established
in [36, Theorem 2.1.1]. For the Hermite weight similar results were obtained
in [34].

Condition C3.2*) of polynomial approximation with exponential weights of
entire functions of exponential type follows from [36, Theorem 2.2.1]. The
sets $B_{n}^{\prime},\,n\in{\mathbb{N}}$, can be chosen like in Example 7.9.
The compactness property of $\cup_{n=1}^{\infty}B_{n}^{\prime}$, stated in
C12.2), is based on [36, Theorem 2.3.2] and verified in [36, Sect. 7.1].

So (7.33) for $p\in(0,{\infty}]$ follows from Corollary 7.6 (iv).

######  Remark 7.11.

Special cases of relations (7.33) that are discussed in Examples 7.8, 7.9, and
7.10 and published in [11, 66, 29, 32, 36] follow from statement (iv) of
Corollary 7.6. In other words, the relations presented in the aforementioned
publications can be proved by verifying the validity of the corresponding
conditions C3.2*) or/and C12.2). Despite the fact that these conditions were
not formulated explicitly in these papers, the proofs of special cases of
(7.33) were actually based on the verification of these conditions. This
observation was the major motivation for general approach developed in [31,
32].

###  7.3. Approximation on Classes of Elements (Problem C)

Here, we discuss a special case of Corollary 5.5 and two examples.
General result. We assume that all assumptions of Section 5.3 are held in the
following special cases. First, we assume that
$F^{(1)}_{*}=F({\mathbb{R}}^{m})=F({\mathbb{R}}^{m},\mu)$ is a
${\beta}_{1}$-normed functional space with the monotone and
$\boldsymbol{{\omega}}$-continuous ${\beta}_{1}$-norm (see Definitions 6.1 and
6.2), ${\beta}_{1}\in(0,1]$, and $F^{(1)}_{*n}=F({\Omega}_{n})$ or
$F^{(1)}_{*n}=F({\Omega}_{n}^{*}),\,n\in{\mathbb{N}}$. Next, we define the
restriction operators
$L_{n}^{(1)}=R({\mathbb{R}}^{m},{\Omega}_{n}^{*}),\,l_{n}^{(1)}=R({\mathbb{R}}^{m},{\Omega}_{n}),\,n\in{\mathbb{N}}$,
and

$\displaystyle
l_{n,s}^{(1)}=\left\\{\begin{array}[]{ll}R({\Omega}_{n},{\Omega}_{s}),&n\geq
s,\\\ R({\Omega}_{s},{\Omega}_{n}),&n<s,\end{array}\right.\quad
n\in{\mathbb{N}},\quad s\in{\mathbb{N}}.$

We also assume that $B,\,B_{n}$, and $B_{n}^{*}$ are nontrivial subspaces of
$F({\mathbb{R}}^{m}),\,F({\Omega}_{n})$, and $F({\Omega}_{n}^{*})$,
respectively, $n\in{\mathbb{N}}$. In addition, let $G$ be a subspace of
$F({\mathbb{R}}^{m}),\,G_{n}$ be a subspace of $F({\Omega}_{n})$, and
$G_{n}^{*}$ be a subspace of $F({\Omega}_{n}^{*}),\,n\in{\mathbb{N}}$. Next,
for $f\in B,\,f_{n}\in B_{n}$, and $f_{n}^{*}\in B_{n}^{*}$ we consider the
errors of best approximation
$E(f,G,F({\mathbb{R}}^{m})),\,E(f_{n},G_{n},F({\Omega}_{n}))$, and
$E(f_{n}^{*},G_{n}^{*},F({\Omega}_{n}^{*})),\,n\in{\mathbb{N}}$ (see (2.9) or
(6.7) for the definition). Note that each of these errors of best
approximation are ${\beta}_{1}$-seminorms on the corresponding spaces.

The ”norms” are defined by (5.15) and (5.16) as follows.

$\|h\|_{F^{(1)}}=E(h,G,F({\mathbb{R}}^{m})),\quad h\in
F({\mathbb{R}}^{m}),\quad\|h_{n}\|_{F^{(1)}_{n}}=E(h_{n},\tilde{G},F(\Omega)),\quad
h_{n}\in F(\Omega),$ (7.42)

where $\Omega=\Omega_{n}$ or $\Omega=\Omega_{n}^{*}$ and $\tilde{G}=G_{n}$ or
$\tilde{G}=G_{n}^{*},\,n\in{\mathbb{N}}$. Note that $\tilde{G}$ in (7.42) can
depend on $h_{n}$.

Finally, let $B_{n}^{\prime}\subseteq B_{n}\setminus\\{0\\}$ be a set from
Condition C8) such that the following relation holds:

$\displaystyle\sup_{f_{n}\in
B_{n}}E(f_{n},G_{n},F({\Omega}_{n}))=\sup_{f_{n}\in
B_{n}^{\prime}}E(f_{n},G_{n},F({\Omega}_{n})).$

Below we introduce some conditions on families
$\left\\{B,F({\mathbb{R}}^{m})\right\\},\left\\{B_{n},F({\Omega}_{n})\right\\}$,
and $\left\\{B_{n}^{*},F({\Omega}_{n}^{*})\right\\},\linebreak
n\in{\mathbb{N}}$, that are needed for the validity of relations (5.20) and/or
(5.21) in function spaces.
_Condition C3.3)._ For every $f\in B\setminus\\{0\\}$ there exists a sequence
$f_{n}^{*}\in B_{n}^{*},\,n\in{\mathbb{N}}$, such that

$\lim_{n\to{\infty}}\left\|f-f_{n}^{*}\right\|_{F({\Omega}_{n}^{*})}=0.$
(7.43)

_Condition C4.3)._ For every $h\in B$,

$\liminf_{n\to{\infty}}E\left(h\left|{}_{\Omega_{n}^{*}}\right.,G_{n}^{*},F({\Omega}^{*}_{n})\right)=\liminf_{n\to{\infty}}E\left(h,G_{n}^{*},F({\Omega}^{*}_{n}))\geq
E(h,G,F({\mathbb{R}}^{m})\right).$ (7.44)

_Condition C6.3*a)._ For every $h\in F({\mathbb{R}}^{m})$,

$\limsup_{n\to{\infty}}E\left(h\left|{}_{\Omega_{n}}\right.,G_{n},F({\Omega}_{n})\right)=\limsup_{n\to{\infty}}E\left(h,G_{n},F({\Omega}_{n}))\leq
E(h,G,F({\mathbb{R}}^{m})\right).$ (7.45)

######  Remark 7.12.

Condition C4.3) can be verified by using statements (ii) or (iii) of Corollary
7.6, while Condition C6.3*a) can be verified by using statement (i) of
Corollary 7.6.

_Condition C10.3*a)._ (Compactness condition) For any sequence
$\\{f_{n}\\}_{n=1}^{\infty}$ such that $f_{n}\in
B_{n}^{\prime},\,n\in{\mathbb{N}}$, there exist a sequence
$\\{n_{k}\\}_{k=1}^{\infty}$ of natural numbers and an element $f\in B$ such
that

$\lim_{k\to{\infty}}\left\|f_{n_{k}}-f\right\|_{F\left({\Omega}_{n_{k}}\right)}=0.$
(7.46)

The following corollary holds true.

######  Corollary 7.13.

(i) If Conditions C3.3) and C4.3) are satisfied, then

$\liminf_{n\to{\infty}}\sup_{f_{n}\in
B_{n}^{*}}E\left(f_{n},G_{n}^{*},F({\Omega}_{n}^{*})\right)\geq\sup_{f\in
B}E\left(f,B,F({\mathbb{R}}^{m})\right).$ (7.47)

(ii) Let $\sup_{f_{n}\in B_{n}}E\left(f_{n},G_{n},F({\Omega}_{n})\right)$ be a
finite number for every $n\in{\mathbb{N}}$. If Conditions C6.3*a) and C10.3*a)
are satisfied, then

$\limsup_{n\to{\infty}}\sup_{f_{n}\in
B_{n}}E\left(f_{n},G_{n},F({\Omega}_{n})\right)\leq\sup_{f\in
B}E\left(f,B,F({\mathbb{R}}^{m})\right).$ (7.48)

(iii) Let $\sup_{f_{n}\in B_{n}}E\left(f_{n},G_{n},F({\Omega}_{n})\right)$ be
a finite number for every $n\in{\mathbb{N}}$. If Conditions C3.3), C4.3),
C6.3*a), and C10.3*a) are satisfied, then

$\liminf_{n\to{\infty}}\sup_{f_{n}\in
B_{n}^{*}}E\left(f_{n},G_{n}^{*},F({\Omega}_{n}^{*})\right)\geq\sup_{f\in
B}E\left(f,B,F({\mathbb{R}}^{m})\right)\geq\limsup_{n\to{\infty}}\sup_{f_{n}\in
B_{n}}E\left(f_{n},G_{n},F({\Omega}_{n})\right).$ (7.49)

###### Proof.

Note first that in this proof all elements in discussed Conditions C1) through
C13) and C10*a) are replaced without further notice by the corresponding
elements that are used in Conditions C3.3), C4.3), C6.3a), C10.3*a) and
relations (7.47), (7.48), (7.49). For example, in Condition C3) $B_{n}$ is
replaced by $B_{n}^{*}$.

Next, Conditions C6) and C11) of Section 3.2 are satisfied by the direct
definitions of the operators whose existence is required in these conditions.
Further, Conditions C3.3), C4.3), C6.3*a), and C10.3*a) of this section are
equivalent to Conditions C3), C4), C6*a) and C10*a) of Section 3.2,
respectively. Therefore, statements (i) and (ii) of Corollary 7.13 follow
immediately from Corollary 5.5, while statement (iii) is a direct corollary of
(i) and (ii). $\Box$

######  Remark 7.14.

Statements (i) and (ii) of Corollary 7.13 with slightly different conditions
were obtained in [31, Corollary 3.1] for normed spaces and in [32, Sect.
1.4.3] for ${\beta}_{1}$-normed spaces.

Examples. There is a number of publications [9, 12, 74, 31, 32, 35] about
special cases of Corollary 7.6 and their modifications; here, we call them
relations between constants of approximation theory (see also Section 2.3 C).
Examples 7.15 and 7.16 below discuss relations like (7.47) proved in these
papers in various situations.

######  Example 7.15.

(Periodic approximation on
$H_{\omega}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},n,m})$). Let
$F({\mathbb{R}}^{m})=L_{\infty}({\mathbb{R}}^{m}),\,{\beta}_{1}=1,\,B=H_{{\omega},0}({\mathbb{R}}^{m})\cap
L_{\infty}(R^{m}),\,B_{n}^{*}=H_{{\omega},0}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi
n,m},\,G=B_{V}\cap
L_{\infty}({\mathbb{R}}^{m}),\,G_{n}^{*}={\mathcal{T}}_{n,V}\cap
M_{C_{9}{\omega}(2),3},\,{\Omega}_{n}^{*}=Q_{\pi n/2}^{m},\,n\in{\mathbb{N}}.$

Let us choose $M=M(n)=\pi n/2,\,n\in{\mathbb{N}}$, and let $f\in
H_{{\omega},0}({\mathbb{R}}^{m})\cap L_{\infty}(R^{m})$. Then by Lemma 6.6,
there exists a function
$f_{n}^{*}=\tilde{f}:{\mathbb{R}}^{m}\to{\mathbb{R}}^{m}$ such that
$f_{n}^{*}=f$ on $Q_{\pi n/2}^{m}$ and $f_{n}^{*}\in
H_{{\omega},0}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi n,m}$. Since
$f-f_{n}^{*}=0$ on $Q_{\pi n/2}^{m}$, Condition C3.3) is satisfied.

Next, Condition C4.3) is satisfied as well. Indeed, let a number sequence
$\\{{\gamma}(n)\\}_{n=1}^{\infty}$ satisfy (7.34). Then for all large enough
$n,\,{\gamma}(n)\leq\pi n/2$, since by (7.34), ${\gamma}(n)=o(n)$ as
$n\to{\infty}$. In addition, for any $h\in
H_{{\omega},0}({\mathbb{R}}^{m})\cap L_{\infty}({\mathbb{R}}^{m})$, we have
$h\in M_{{\omega}(2),1}\cap L_{\infty}({\mathbb{R}}^{m})$, by (6.6). Then
using relation (7.35) for $p={\infty},\,C={\omega}(2)$, and $N=1$, we obtain

$\displaystyle\liminf_{n\to{\infty}}E\left(h,{\mathcal{T}}_{n,V}\cap
M_{C_{9}{\omega}(2),3},L_{\infty}\left(Q_{\pi n/2)}^{m}\right)\right)$
$\displaystyle\geq\lim_{n\to{\infty}}E\left(h,{\mathcal{T}}_{n,V}\cap
M_{C_{9}{\omega}(2),3},L_{\infty}\left(Q_{{\gamma}(n))}^{m}\right)\right)$
$\displaystyle=E\left(h,B_{V}\cap
L_{\infty}({\mathbb{R}}^{m}),L_{\infty}({\mathbb{R}}^{m})\right),\qquad h\in
H_{{\omega},0}({\mathbb{R}}^{m})\cap L_{\infty}({\mathbb{R}}^{m}).$

Thus Condition C4.3) is satisfied. We recall that $C_{9}$ is the same constant
as in Example 7.8, i.e., $C_{9}$ is any constant such that $C_{9}\geq
C_{10}>0$, and $C_{9}$ and $C_{10}$ are independent of $n$ and $h$.

Therefore using Corollary 7.13 (i), we obtain

$\displaystyle\liminf_{n\to{\infty}}\sup_{f_{n}\in
H_{{\omega},0}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi
n,m}}E\left(f_{n},{\mathcal{T}}_{n,V}\cap
M_{C_{9}{\omega}(2),3},L_{\infty}\left(Q_{\pi n}^{m}\right)\right)$
$\displaystyle\geq\sup_{f_{n}\in
H_{{\omega},0}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi
n,m}}E\left(f_{n},{\mathcal{T}}_{n,V}\cap
M_{C_{9}{\omega}(2),3},L_{\infty}\left(Q_{\pi n/2}^{m}\right)\right)$
$\displaystyle\geq\sup_{f\in H_{{\omega},0}({\mathbb{R}}^{m})\cap
L_{\infty}({\mathbb{R}}^{m})}E\left(f,B_{V}\cap
L_{\infty}({\mathbb{R}}^{m}),L_{\infty}\left({\mathbb{R}}^{m}\right)\right).$
(7.50)

Furthermore, we prove that for any $f_{n}\in
H_{{\omega},0}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi
n,m},\,n\in{\mathbb{N}}$, and for large enough $C_{9}\geq C_{10}$, the
following equality holds true:

$E\left(f_{n},{\mathcal{T}}_{n,V}\cap
M_{C_{9}{\omega}(2),3},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)=E\left(f_{n},{\mathcal{T}}_{n,V},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right).$ (7.51)

Indeed, let us set

$\displaystyle{\mathcal{T}}_{n,V,1}:=\left\\{g_{n}\in{\mathcal{T}}_{n,V}:E\left(f_{n},{\mathcal{T}}_{n,V},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)\geq\|f_{n}-g_{n}\|_{L_{\infty}\left(Q_{\pi
n}^{m}\right)}-1\right\\}.$

If $g_{n}\in{\mathcal{T}}_{n,V,1}$, then by (6.6),

$\displaystyle|g_{n}(x)|$ $\displaystyle\leq$ $\displaystyle
E\left(f_{n},{\mathcal{T}}_{n,V},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)+1+|f_{n}(x)|$ (7.52) $\displaystyle\leq$ $\displaystyle
E\left(f_{n},{\mathcal{T}}_{n,V},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)+1+{\omega}(2)(1+|x|),\qquad x\in{\mathbb{R}}^{m}.$

Since by Jackson’s theorem (see [65, Theorem 5.3.2]),

$\displaystyle\sup_{n\in{\mathbb{N}}}\sup_{f_{n}\in
H_{{\omega},0}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi
n,m}}E\left(f_{n},{\mathcal{T}}_{n,V},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)$ $\displaystyle=\sup_{n\in{\mathbb{N}}}\sup_{f_{n}\in
H_{{\omega},0}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi
n,m}}E\left(f_{n}(n\cdot),{\mathcal{T}}_{nV},L_{\infty}\left(Q_{\pi}^{m}\right)\right)<{\infty},$
(7.53)

we see from (7.52) and (7.15) that ${\mathcal{T}}_{n,V,1}\subseteq
M_{C_{11},1}$, where $C_{11}$ is independent of $n$.

Then setting $C_{9}=\max\\{C_{10},C_{11}/{\omega}(2)\\}$, we obtain

$\displaystyle E\left(f_{n},{\mathcal{T}}_{n,V}\cap
M_{C_{9}{\omega}(2),3},L_{\infty}\left(Q_{\pi n}^{m}\right)\right)\leq
E\left(f_{n},{\mathcal{T}}_{n,V}\cap M_{C_{11},1},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)$ $\displaystyle\leq
E\left(f_{n},{\mathcal{T}}_{n,V,1},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)=E\left(f_{n},{\mathcal{T}}_{n,V},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right).$ (7.54)

Thus (7.51) follows from (7.15).

Finally combining (7.15) and (7.51), we obtain

$\displaystyle\liminf_{n\to{\infty}}\sup_{f_{n}\in
H_{{\omega}}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi
n,m}}E\left(f_{n},{\mathcal{T}}_{n,V},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)$ $\displaystyle=\liminf_{n\to{\infty}}\sup_{f_{n}\in
H_{{\omega},0}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi
n,m}}E\left(f_{n},{\mathcal{T}}_{n,V},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)$ $\displaystyle\geq\sup_{f\in
H_{{\omega},0}({\mathbb{R}}^{m})\cap
L_{\infty}({\mathbb{R}}^{m})}E\left(f,B_{V}\cap
L_{\infty}({\mathbb{R}}^{m}),L_{\infty}\left({\mathbb{R}}^{m}\right)\right)$
$\displaystyle=\sup_{f\in H_{{\omega}}({\mathbb{R}}^{m})\cap
L_{\infty}({\mathbb{R}}^{m})}E\left(f,B_{V}\cap
L_{\infty}({\mathbb{R}}^{m}),L_{\infty}\left({\mathbb{R}}^{m}\right)\right).$
(7.55)

Next, by Lemma 6.5, for any $f_{n}\in
H_{\omega}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi n,m}$,

$E\left(f_{n},{\mathcal{T}}_{n,V},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)=E\left(f_{n},B_{V}\cap
L_{\infty}({\mathbb{R}}^{m}),L_{\infty}\left({\mathbb{R}}^{m}\right)\right),\qquad
n\in{\mathbb{N}}.$ (7.56)

Taking into account a trivial inclusion
$H_{\omega}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi n,m}\subseteq
H_{\omega}({\mathbb{R}}^{m})\cap L_{\infty}({\mathbb{R}}^{m})$, we obtain from
(7.56)

$\displaystyle\limsup_{n\to{\infty}}\sup_{f_{n}\in
H_{\omega}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi
n,m}}E\left(f_{n},{\mathcal{T}}_{n,V},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)$ $\displaystyle\leq\sup_{f\in
H_{\omega}({\mathbb{R}}^{m})\cap
L_{\infty}({\mathbb{R}}^{m})}E\left(f,B_{V}\cap
L_{\infty}({\mathbb{R}}^{m}),L_{\infty}\left({\mathbb{R}}^{m}\right)\right).$
(7.57)

Combining (7.15) and (7.15), we arrive at

$\displaystyle\lim_{n\to{\infty}}\sup_{f_{n}\in
H_{\omega}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi
n,m}}E\left(f_{n},{\mathcal{T}}_{n,V},L_{\infty}\left(Q_{\pi
n}^{m}\right)\right)$ $\displaystyle=\sup_{f\in
H_{\omega}({\mathbb{R}}^{m})\cap
L_{\infty}({\mathbb{R}}^{m})}E\left(f,B_{V}\cap
L_{\infty}({\mathbb{R}}^{m}),L_{\infty}\left({\mathbb{R}}^{m}\right)\right).$
(7.58)

The corresponding values of the sharp constants in (7.15) were found only for
$m=1$ and for a concave modulus of continuity ${\omega}$ (see [52, 26]). For
the Hölder class $H^{\lambda}({\mathbb{R}}^{m})=H_{\omega}({\mathbb{R}}^{m})$
with ${\omega}(\tau)=\tau^{\lambda},\,\tau\in(0,{\infty}),\,0<{\lambda}\leq
1$, (7.15) immediately implies the relation

$\displaystyle\lim_{n\to{\infty}}n^{\lambda}\sup_{f\in
H^{\lambda}({\mathbb{R}}^{m})\cap\tilde{L}_{{\infty},2\pi,m}}E\left(f,{\mathcal{T}}_{nV},L_{\infty}\left(Q_{\pi}^{m}\right)\right)$
$\displaystyle=\sup_{f\in H^{\lambda}({\mathbb{R}}^{m})\cap
L_{\infty}({\mathbb{R}}^{m})}E\left(f,B_{V}\cap
L_{\infty}({\mathbb{R}}^{m}),L_{\infty}\left({\mathbb{R}}^{m}\right)\right).$

A more precise result with $H^{\lambda}({\mathbb{R}}^{m})\cap
L_{\infty}({\mathbb{R}}^{m})$ replaced by $H^{\lambda}({\mathbb{R}}^{m})$ was
obtained in [31, Theorem 5.2]. The corresponding univariate result was proved
by Bernstein [9]. Bernstein [12] attempted to extend this result to the class
$W^{s}H^{\lambda}({\mathbb{R}}^{1})$ but his proof was incomplete (see also
Example 7.16).

######  Example 7.16.

(Periodic approximation on $W^{s}H_{\omega}({\mathbb{R}}^{1})$).

The author [35, Theorem 1] solved a relatively long-standing problem of
finding the exact value of $\sup_{f\in
W^{s}H_{\omega}({\mathbb{R}}^{1})}E(f,B_{[-{\sigma},{\sigma}]},L_{\infty}({\mathbb{R}}^{1})),\,s\in
Z_{+}^{1}$, where ${\omega}$ is a concave modulus of continuity. The proof is
based on a solution of the corresponding periodic problem (see Korneichuk
[51], [52, Theorem 7.2.2]) and on a limit relation between periodic and
nonperiodic approximations like (7.15) (see [35, Theorem 2]). Note that for
$s=0$ the problem was solved by Dzyadyk [26]. More references can be found in
[35].

## References

  * [1] N. I. Akhiezer, Lectures on the Theory of Approximation, second ed., Nauka, Moscow, 1965 (in Russian).
  * [2] N. I. Akhiezer, M. G. Krein, On the best approximation of periodic functions, Dokl. Akad. Nauk SSSR 15 (1937), 107–112 (in Russian).
  * [3] T. Aoki, Locally bounded linear topological spaces, Proc. Imp. Acad. Tokyo 18(10) (1942), 588–594.
  * [4] V. Arestov, M. Deikalova, Nikol’skii inequality between the uniform norm and $L_{q}$-norm with ultraspherical weight of algebraic polynomials on an interval, Comput. Methods Funct. Theory 15 (2015), 689–708.
  * [5] V. Arestov, A. Babenko, M. Deikalova, A. Horvath, Nikolśkii inequality between the uniform norm and integral norm with Bessel weight for entire functions of exponential type on the half-line, Anal. Math. 44 (2018), no. 1, 21–42.
  * [6] V. F. Babenko, N. P. Korneichuk, V. A. Kofanov, S. A. Pichugov, Inequalities for Derivatives and their Applications, Naukova Dumka, Kiev, 2003 (in Russian).
  * [7] S. Bernstein, Sur la meilleure approximation de $|x|$ par des polynômes des degrés donnés, Acta Math. 37 (1913), 1–57.
  * [8] S. Bernstein, Sur la meilleure approximation de $|x|^{p}$ par des polynômes des degrés trés élevés, Bull Acad. Sci. USSR Ser. Math. 2 (1938), 181–190.
  * [9] S. N. Bernstein, Generalization of a result of S. M. Nikolskii, Dokl. Akad. Nauk SSSR 53 (1946), 587–590 (in Russian).
  * [10] S. N. Bernstein, On the best approximation of continuous functions on the whole real axis by entire functions of given degree IV, Dokl. Akad. Nauk SSSR 54 (1946), 103–108 (in Russian).
  * [11] S. N. Bernstein, On the best approximation of continuous functions on the whole real axis by entire functions of given degree V, Dokl. Akad. Nauk SSSR 54 (1946), 479–482 (in Russian).
  * [12] S. N. Bernstein, On limit relations between the constants of the theory of best approximation, Dokl. Akad. Nauk SSSR 57 (1947), 3–5 (in Russian).
  * [13] S. N. Bernstein, Limit laws of the theory of best approximations, Dokl. Akad. Nauk SSSR 58 (1947), 525–528 (in Russian).
  * [14] S. N. Bernstein, On entire functions of finite degree of several variables, Dokl. Akad. Nauk SSSR 60 (1948), 949–952 (in Russian).
  * [15] P. Borwein, T. Erdélyi, Polynomials and Polynomial Inequalities, Springer-Verlag, New York, 1995.
  * [16] N. Bourbaki, Topologie Générale, Herman, Paris, 1947.
  * [17] A. Brudnyi, Yu. Brudnyi, Methods of Geometric Analysis in Extension and Trace Problems, Vols. 1 and 2, Springer, Basel, 2012.
  * [18] V. I. Burenkov, M. L. Goldman, On intercommunication of norms of operators in periodic and nonperiodic functional spaces, Trudy Mat. Inst. Steklov 161 (1983), 47–105 (in Russian); English transl. in Proc. Steklov Inst. Math. 161 (1984), 53–112.
  * [19] E. Carneiro, F. Littmann, Entire approximations for a class of truncated and odd functions, J. Fourier Anal. Appl. 19 (2013), 967–996.
  * [20] E. Carneiro, J. D. Vaaler, Some extremal functions in Fourier analysis, III, Constr. Approx. 31 (2010), 259–288.
  * [21] F. Dai, D. Gorbachev, S. Tikhonov, Nikolskii constants for polynomials on the unit sphere, J. d’Analyse Math., in press; arXiv:1708.09837.
  * [22] F. Dai, D. Gorbachev, S. Tikhonov, Estimates of the asymptotic Nikolskii constants for spherical polynomials, Constr. Approx., in press; arXiv:190703832.
  * [23] R. A. DeVore, G. G. Lorentz, Constructive Approximation. New York: Springer-Verlag, 1993.
  * [24] Z. Ditzian, A. Prymak, Nikolskii inequalities for Lorentz spaces, Rocky Mountain Journal of Mathematics 40 (2010), no. 1, 209–223.
  * [25] Z. Ditzian, A. Prymak, Nikolskii inequalities for domains in ${\mathbb{R}}^{d}$, Constr. Approx. 44 (2016), no. 1, 23–51.
  * [26] V. K. Dzyadyk, The least upper bounds of best approximations on certain classes of continuous functions that are defined on the real line, Dopovidi Akad. Nauk URSR Ser. A (1975), no. 7, 589–593 (in Ukrainian).
  * [27] T. Erdélyi, M. I. Ganzburg, P. Nevai, M. Riesz-Schur-type inequality for entire functions of exponential type, Mat. Sbornik 206 (2015), no. 1, 29–38 (in Russian); English transl. in Sbornik Math. 206 (2015), no. 1 , 24–32.
  * [28] M. I. Ganzburg, Multidimensional Jackson theorems, Sibirsk. Mat. Zh. 22 (1981), no. 2, 74–83 (in Russian); English transl. in Siberian Math. J. 22 (1981), no. 2, 223–231.
  * [29] M. I. Ganzburg, Multidimensional limit theorems of the theory of best polynomial approximations, Sibirsk. Mat. Zh. 23 (1982), no. 3, 30–47 (in Russian); English transl. in Siberian Math. J. 23 (1983), no. 3, 316–331.
  * [30] M. I. Ganzburg, Limit theorems for the best polynomial approximation in the $L_{\infty}$-metric, Ukrain. Mat. Zh. 23, 336–342 (in Russian); English transl. in Ukrainian Math. J. 23 (1991), 299–305.
  * [31] M. I. Ganzburg, Limit theorems in approximation theory, Anal. Math. 18 (1992), 37–57.
  * [32] M. I. Ganzburg, Limit theorems and best constants in approximation theory, in Handbook on Analytic-Computational Methods in Applied Mathematics (G. A. Anastassiou, ed.), pp. 507–569, Chapman & Hall/CRC Press, London/Boca Raton, FL, 2000.
  * [33] M. I. Ganzburg, Polynomial inequalities on measurable sets and their applications, Constr. Approx. 17 (2001), 275–306.
  * [34] M. I. Ganzburg, Limit theorems for polynomial approximation with Hermite and Freud weights, in Approximation Theory X: Abstract and Classical Analysis (C. K. Chui, et al, eds.), pp. 211–221, Vanderbilt University Press, Nashville, TN, 2002.
  * [35] M. I. Ganzburg, Best constants of harmonic approximation on certain classes of differentiable functions, Bull. London Math. Soc. 35 (2003), 355–361.
  * [36] M. I. Ganzburg, Limit Theorems of Polynomial Approximation with Exponential Weights, Mem. Amer. Math. Soc. 192 (2008), no. 897, 161 pp.
  * [37] M. I. Ganzburg, $L$-approximation to non-periodic functions, J. Concr. Appl. Math. 8 (2010), no. 2, 208–215.
  * [38] M. I. Ganzburg, Sharp constants in V. A. Markov-Bernstein type inequalities of different metrics, J. Approx. Theory 215 (2017), 92–105.
  * [39] M. I. Ganzburg, Exact errors of best approximation for complex-valued periodic functions, Mat. Sbornik 209 (2018), no. 3, 138–149 (in Russian); English transl. in Sbornik Math. 209 (2018), no. 3 , 421–431.
  * [40] M. I. Ganzburg, Exact errors of best approximation for complex-valued nonperiodic functions, J. Approx. Theory 229 (2018), 1–12.
  * [41] M. I. Ganzburg, Sharp constants of approximation theory. I. Multivariate Bernstein-Nikolskii type inequalities, J. Fourier Anal. Appl. 26, 11 (2020), doi:10.1007/s00041-019-09720-x.
  * [42] M. I. Ganzburg, Sharp constants of approximation theory. II. Invariance theorems and certain multivariate inequalities of different metrics, Constr. Approx. 50 (2019), 543–577.
  * [43] M. I. Ganzburg, Sharp constants of approximation theory. III. Certain polynomial inequalities of different metrics on convex sets, J. Approx. Theory 252 (2020), doi:10.1016/j.jat.2019.105351.
  * [44] M. I. Ganzburg, S. Yu. Tikhonov, On sharp constants in Bernstein-Nikolskii inequalities, Constr. Approx. 45 (2017), 449–466.
  * [45] J, B. Garnett, Bounded Analytic Functions, Academic Press, New York, 1987.
  * [46] A. Garsia, E. Rodemich & H. Rumsey, On some extremal positive definite functions, Journal of Mathematics and Mechanics 18 (1969), no. 9, 805–834.
  * [47] D. V. Gorbachev, An integral problem of Konyagin and the $(C,L)$-constants of Nikolskii, Teor. Funk., Trudy IMM UrO RAN 11, no. 2 (2005), 72–91 (in Russian); English transl. in Proc. Steklov Inst. Math., Function Theory, Suppl. 2 (2005), S117–S138.
  * [48] D. V. Gorbachev, Nikolskii-Bernstein constants for nonnegative entire functions of exponential type on the axis, Trudy Inst. Mat. Mekh. UrO RAN, 24 (2018), no. 4, 92–103 (in Russian).
  * [49] N. Kalton, Quasi-Banach spaces, in Handbook of the Geometry of Banach Spaces, Vol. 2 (W. B. Johnson, J. Lindenstrauss, eds.), pp. 1099–1130, Elsevier, Amsterdam, 2003.
  * [50] L. V. Kantorovich, G. P. Akilov, Functional Analysis, Second Edition, Pergamon Press, New York, 1982.
  * [51] N. P. Korneichuk, Extremal values of functionals and best approximation on classes of periodic functions, Izv. Akad. Nauk SSSR, ser. matem. 35 (1971), 93–124 (in Russian); English transl. in Math. USSR-Izv. 5 (1971), 97–129.
  * [52] N. P. Korneichuk, Exact Constants in Approximation Theory, Cambridge University Press, Cambridge, 1991.
  * [53] N. P. Korneichuk, A. A. Ligun, V. F. Babenko, Extremal Properties of Polynomials and Splines, Nova Science Publishers Inc., Hauppauge, NY, 1996.
  * [54] M. G. Krein, On the best approximation of continuous differentiable functions on the whole real axis, Dokl. Akad. Nauk SSSR 18 (1938), 615–624.
  * [55] A. Kroó, D. Schmidt, Some extremal problems for multivariate polynomials on convex bodies, J. Approx. Theory 90 (1997), 415–434.
  * [56] E. Levin, D. Lubinsky, Orthogonal Polynomials for Exponential Weights, Springer, New York, 2001.
  * [57] E. Levin, D. Lubinsky, $L_{p}$ Christoffel functions, $L_{p}$ universality, and Paley-Wiener spaces, J. D’Analyse Math. 125 (2015), 243–283.
  * [58] E. Levin, D. Lubinsky, Asymptotic behavior of Nikolskii constants for polynomials on the unit circle, Comput. Methods Funct. Theory 15 (2015), 459–468.
  * [59] E. R. Liflyand, Lebesgue constants of multiple Fourier series, Online J. Anal. Combin. no. 1 (2006), Art. 5, 112 pp.
  * [60] G. V. Milovanović, D. S. Mitrinović, Th. M. Rassias, Topics in Polynomials: Extremal Problems, Inequalities, Zeros, World Scientific, Singapore, 1994.
  * [61] R. J. Nessel, G. Wilmes, Nikolskii-type inequalities for trigonometric polynomials and entire functions of exponential type, J. Austral. Math. Soc., Ser. A 25 (1978), 7–18.
  * [62] S. M. Nikolskii, Approximation of functions by trigonometric polynomials in the mean, Izv. Akad. Nauk SSSR, ser. matem. 10 (1946), 207–256 (in Russian).
  * [63] S. M. Nikolskii, On the best mean approximation by polynomials of the functions $|x-c|^{s}$, Izv. Akad. Nauk SSSR, ser. matem. 11 (1947), 139–180 (in Russian).
  * [64] S. M. Nikolskii, Inequalities for entire functions of finite degree and their application to the theory of differentiable functions of several variables, Trudy Mat. Inst. Steklov 38 (1951), 244–278 (in Russian); English transl. in Amer. Math. Soc. Transl. Ser. 2 80 (1969), 1–38.
  * [65] S. M. Nikolskii, Approximation of Functions of Several Variables and Imbedding Theorems, Nauka, Moscow, 1969 (in Russian); English edition: Die Grundlehren der Mathematischen Wissenschaften, Band 205, Springer-Verlag, New York-Heidelberg, 1975.
  * [66] R. A. Raitsin, S. N. Benstein’s limit theorem for the best approximations in the mean and some of its applications, Izv. Vyssh. Uchebn. Zaved., Mat. no. 10 (1968), 81–86 (in Russian).
  * [67] R. T. Rockafellar, Convex Analysis, Princeton University Press, Princeton, 1970.
  * [68] S. Rolewicz, On a certain class of linear metric spaces, Bull. Polon. Acad. Sci. 5 (1957), 471–473.
  * [69] A. C. Shvedov, Approximation of functions of several variables by polynomials and diameters of certain function classes, Anal. Math. 8 (1982), 135–150 (in Russian).
  * [70] H. R. Stahl, Best uniform rational approximation of $x^{\alpha}$ on $[0,1]$, Acta Math. 190 (2003), no. 2, 241–306.
  * [71] E. Stein, G. Weiss, Introduction to Fourier Analysis on Euclidean Spaces, Princeton Univ. Press, Princeton, 1971.
  * [72] L. V. Taikov, A group of extremal problems for trigonometric polynomials, Uspekhi Mat. Nauk 20 (1965), no. 3, 205–211 (in Russian).
  * [73] L. V. Taikov, On the best approximation of Dirichlet kernels, Mat. Zametki 53 (1993), no. 6 , 116–121 (in Russian); English transl. in Math. Notes 53 (1993), no. 6, 640–643.
  * [74] A. F. Timan, Theory of Approximation of Functions of a Real Variable, Pergamon Press, New York, 1963.
  * [75] R. Trigub, E. S. Belinsky, Fourier Analysis and Approximation of Functions, Kluwer Acad. Publ., Dordrecht, The Netherlands, 2004.
  * [76] D. R. Wilhelmsen, A Markov inequality in several dimensions, J. Approx. Theory 11 (1974), 216–220.
  * [77] A. Zygmund, Trigonometric Series: Vols. I, II, Second edition, reprinted with corrections and some additions, Cambridge University Press, London, 1968.