ebook img

The Ehrhart polynomial of the Birkhoff polytope PDF

0.18 MB·English
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview The Ehrhart polynomial of the Birkhoff polytope

The Ehrhart polynomial of the Birkhoff polytope 1 Matthias Beck and Dennis Pixton 2 All means (even continuous) sanctify the discrete end. Doron Zeilberger Abstract: The nth Birkhoff polytope is the set of all doubly stochastic n×n matrices, that is, those matrices with 5 nonnegativerealcoefficientsinwhicheveryrowandcolumnsumstoone. Awideopenproblemconcernsthevolumes 0 0 of these polytopes, which have been known for n ≤ 8. We present a new, complex-analytic way to compute the 2 EhrhartpolynomialoftheBirkhoffpolytope,thatis,thefunctioncountingtheintegerpointsinthedilatedpolytope. n Onereason tobeinterested in this countingfunction is thattheleading term of theEhrhart polynomial is—up to a a J trivialfactor—the volumeof thepolytope. Weimplementedourmethodsintheform ofacomputerprogram, which 2 yielded theEhrhart polynomial (and hencethevolume) of the ninth and thevolumeof thetenth Birkhoff polytope. ] O C 1 Introduction . h t a One of the most intriguing objects of combinatorial geometry is the nth Birkhoff polytope m [ x11 ··· x1n 7v2 Bn =  xn...1 ... xn...n  ∈ Rn2 : xjk ≥ 0, Pkjxxjjkk ==11ffoorraallll11≤≤kj ≤≤nn  ,   6   P 2 often describedas the set of all n× n doubly stochastic matrices. B is a convex polytope with n 2 integer vertices. It possesses fascinating combinatorial properties [4, 5, 6, 8, 23] and relates to 0 2 many mathematical areas [10, 14]. A long-standing open problem is the determination of the 0 relative volume of B , which had been known only up to n = 8 [7, 17]. In this paper, we propose a n / h new method of calculating this volume and use it to compute volB9 and volB10. t a m One of the recent attempts to compute volB relies on the theory of counting functions for the n : integer points in polytopes. Ehrhart proved [11] that for a polytope P ⊂ Rd with integral vertices, v the number i X L (t) := # tP ∩Zd P r a (cid:16) (cid:17) is a polynomial in the positive integer variable t. He showed various other properties for this counting function (in fact, in the more general setting of P having rational vertices), of which we mention three here: • The degree of L is the dimension of P. P • The leading term of L is the relative volume of P, normalized with respect to the sublattice P of Zd on the affine subspace spanned by P. 1Appeared in Discrete & Computational Geometry 30, no. 4 (2003), 623–637. 2E-mail to thefirst author on Wed, 14 Aug 2002 16:29:35 -0400 (EDT) 1 • Since L is a polynomial, we can evaluate it at nonpositive integers. These evaluations yield P L (0) = χ(P) , (1) P LP(−t)= (−1)dimPLP◦(t) . (2) Here χ(P) denotes the Euler characteristic, P◦ the relative interior of P. The reciprocity law (2) was in its full generality proved by Macdonald [15]. The application of this theory to the Birkhoff polytope B incorporates the nice interpretation of n the number of integral points in tB as the number of semi-magic squares, namely, square matrices n whose nonnegative integral coefficients sum up to the same integer t along each row and column. We will denote the Ehrhart polynomial of B by n H (t) := L (t) . n Bn It is not hard to see that dimB = (n−1)2, hence H is a polynomial in t of degree (n−1)2. The n n first two of these polynomials are trivial: H1(t) = 1 , H2(t) = t+1 , the first nontrivial case was computed by MacMahon [16] as t+3 t+2 H3(t) = 3 + . (3) 4 2 (cid:18) (cid:19) (cid:18) (cid:19) The structural properties of H were first studied in [12, 18, 20]. It is a nice exercise to deduce n from (2) that H (−n−t) = (−1)n−1 H (t) (4) n n and H (−1) = H (−2) = ··· = H (−n+1) = 0 . n n n This allows the following strategy of computing H , and therefore, the volume of B : compute n n the first n−1 values of H , use the above symmetry and trivial values of H , and calculate the 2 n n polynomial Hn by interpolation. In fact, as far as we are aware of, the volume of B8 was computed (cid:0) (cid:1) using essentially this method, combined with some nice computational tricks [7, 17]. We propose a new, completely different approach of computing H (and hence volB ). It is based n n on an analytic method by the first author of computing the Ehrhart polynomial of a polytope [2]. We will introduce the application of this method to the Birkhoff polytope in the following section. Some recent refreshing approaches—of a more algebraic-geometric/topological flavor—to the prob- lem of computing volB and H can be found in [1, 9, 22]. n n 2 2 An integral counting integers A convex polytope P ⊂ Rd is an intersection of halfspaces. This allows the compact description P = x∈ Rd : Ax ≤ b , n o for some (m×d)-matrix A and m-dimensional vector b. Here the inequality is understood compo- nentwise. In fact, we may convert these inequalities into equalities by introducing ‘slack variables.’ If P has rational vertices (those polytopes are called rational), we can choose A and b in such a way that all their entries are integers. In summary, we may assume that a convex rational polytope P is given by P = x∈ Rd : Ax= b , (5) ≥0 whereA ∈M (Z) and b∈ Zm. (If wenare interested in couonting the integer points in P, we may m×d assume that P is in the nonnegative orthant, i.e., the points in P have nonnegative coordinates, as translation by an integer vector does not change the lattice-point count.) The following straight- forward theorem can be found in [2]. We use the standard multivariate notation vw := vw1···vwn. 1 n Theorem 1 [2, Theorem 8] Suppose the convex rational polytope P is given by (5), and denote the columns of A by c1,...,cd. Then 1 z−tb1−1···z−tbm−1 L (t) = ··· 1 m dz . P (2πi)m Z|z1|=ǫ1 Z|zm|=ǫm (1−zc1)···(1−zcd) Here 0 < ǫ1,...,ǫm < 1 are distinct real numbers. It should be mentioned that L is in general not a polynomial if the vertices of P are not integral, P but a quasipolynomial, that is, an expression of the form cd(t)td+···+c1(t)t+c0(t) , wherec0,...,cd areperiodicfunctionsint. (See, forexample, [19, Section 4.4]formoreinformation about quasipolynomials.) Theorem 1 applies to these slightly more general counting functions; however, in this article we will only deal with polytopes with integer vertices, for which L is a P polynomial. We also note here that Theorem 1 can be used to quickly compute by hand formulas for certain classes of polytopes (see, for example, [2]). In this project, we take a slightly different approach and use this theorem to efficiently derive formulas with the help of a computer. We can view the Birkhoff polytope B as given in the form of (5), where n 1 ··· 1 1 ··· 1  ...  A =  1 ··· 1     1 1 1   ... ... ··· ...     1 1 1      3 is a (2n×n2)-matrix and b= (1,...,1) ∈ Z2n. Hence Theorem 1 gives for this special case H (t) = 1 ··· (z1···z2n)−t−1 dz . n (2πi)2n (1−z1zn+1)(1−z1zn+2)···(1−znz2n) Z Z Here it is understood that each integral is over a circle with radius < 1 centered at 0; all appearing radii should be different. We can separate, say, the last n variables and obtain 1 1 z−t−1 n Hn(t) = (2πi)n Z ···Z (z1···zn)−t−1(cid:18)2πi Z (1−z1z)···(1−znz) dz(cid:19) dzn···dz1 . We may choose the radius of the integration circle of the innermost integral to be smaller than the radii of the other integration paths. Then this innermost integral is easy to compute: It is equal to the residue at 0 of 1 zt+1(1−z1z)···(1−znz) and, by the residuetheorem, equal to the negative of thesumof theresidues at z−1,...,z−1. (Note 1 n that here we use the fact that t > 0.) The residues at these simple poles are easily computed: the one, say, at 1/z1 can be calculated as 1 1 1 z− 1 lim z− = lim z1 z→1/z1(cid:18) z1(cid:19) zt+1(1−z1z)···(1−znz) z→1/z1 1−z1z zt+1(1−z2z)···(1−znz) 1 zt+1 zt+n−1 1 1 = − = − . z1 (1−z2/z1)···(1−zn/z1) (z1−z2)···(z1−zn) This yields the starting point for our computations. Theorem 2 For any distinct 0 < ǫ1,...,ǫn < 1, 1 n zt+n−1 n Hn(t)= (2πi)n ··· (z1···zn)−t−1 k(z −z ) dzn···dz1 . Z|z1|=ǫ1 Z|zn|=ǫn k=1 j6=k k j ! X Q Remark. It can be proved from the form of the integrand that H is indeed a polynomial in t: To n compute the integral, one has to execute a (huge) number of limit computations, which yield “at worst” powers of t (as a consequence of L’Hospital’s Rule). In fact, one can make this property more apparent by noticing that the expression in parenthesis is actually a polynomial; namely n 1 Hn(t) = (2πi)n ··· (z1···zn)−t−1 z1m1···znmn dzn···dz1 , Z|z1|=ǫ1 Z|zn|=ǫn m1+·X··+mn=t ! where the sum is over all ordered partitions of t. This formula can also be proved “more directly” combinatorially.3 3The authors thank Sinai Robins and Frank Sottile for their help in the proof of this equivalence and its combi- natorial interpretation. 4 3 Small n do not require a computer We will now illustrate the computation of H (and hence volB ) by means of Theorem 2 for n = 3 n n and 4. These calculations “by hand” give an idea what computational tricks one might use in tackling larger n with the aid of a computer. By the theorem, 1 zt+2 zt+2 zt+2 3 H3(t) = (2πi)3 (z1z2z3)−t−1 (z1−z21)(z1 −z3) + (z2−z12)(z2−z3) + (z3−z13)(z3 −z2) dz. Z (cid:18) (cid:19) Wehavetoordertheradiioftheintegration pathsforeachvariable; wechoose0 < ǫ3 < ǫ2 < ǫ1 < 1. We heavily use this fact after multiplying out the cubic: integrating, for example, the term z−t−1z−t−1z2t+5 1 2 3 (z3 −z2)3(z3−z1)3 with respect to z3 gives 0, as this function is analytic at the z3-origin and |z1|,|z2| > ǫ3. After exploiting this observation for all the terms stemming from the cubic, the only integrals surviving are 1 z2t+5z−t−1z−t−1 1 2 3 dz (2πi)3 (z1−z2)3(z1−z3)3 Z and − 3 z1t+3z2z3−t−1 dz . (2πi)3 (z1−z2)3(z1 −z3)2(z2−z3) Z The first integral factors and yields, again by residue calculus, 1 z2t+5z−t−1z−t−1 1 z−t−1 2 (2πi)3 (z11−z22)3(z1−3 z3)3 dz = (2πi)3 z12t+5 (z1 −z)3 dz dz1 Z Z (cid:18)Z (cid:19) 2 2 1 1 t+2 = z12t+5 − (−t−1)(−t−2)z1−t−3 dz1 = . 2πi 2 2 Z (cid:18) (cid:19) (cid:18) (cid:19) For the second integral, it is most efficient to integrate with respect to z2 first: − (2π3i)3 (z1−z2)z31t(+z31z−2z3z−3t)−21(z2−z3) dz = −(2π3i)2 (zz11t+−3zz3−3)t5 dz3 dz1 Z Z 3 1 t+3 = − z1t+3 (−t)(−t−1)(−t−2)(−t−3)z1−t−4 dz1 =−3 . 2πi 4! 4 Z (cid:18) (cid:19) Adding up the last two lines gives finally 2 t+2 t+3 1 3 15 9 4 3 2 H3(t) = −3 = t + t + t + t+1 , 2 4 8 4 8 4 (cid:18) (cid:19) (cid:18) (cid:19) which is equal to (3). To obtain the volume of B3, the leading term of H3 has to be multiplied by the relative volume of the fundamental domain of the sublattice of Z9 in the affine space spanned by B3. This volume is 9; hence 9 volB3 = . 8 5 In general, it is not hard to prove (see, for example, the appendix of [7]) that the relative volume of the fundamental domain of the sublattice of Zn2 in the affine space spanned by B is nn−1. n The number of integrals we have to evaluate to compute H4 is only slightly higher. By Theorem 2, 1 4 zt+3 4 H4(t) = (2πi)4 (z1z2z3z4)−t−1 (kz −z ) dz . Z|z1|=ǫ1Z|z2|=ǫ2Z|z3|=ǫ3Z|z4|=ǫ4 k=1 j6=k k j ! X Q Again we have a choice of ordering the radii; we use 0 < ǫ4 < ǫ3 < ǫ2 < ǫ1 < 1. After multiplying outthequartic,wehavetocalculatefiveintegrals; theirevaluation—againstraightforwardbymeans of the residue theorem—is as follows. As before, we can ‘save’ computation effort by choosing a particular order with which we integrate and by factoring an integral if possible. 1 z3t+11z−t−1z−t−1z−t−1 1 z−t−1 3 (2πi)4 (z1−1z2)4(2z1−z33)4(z14−z4)4 dz = (2πi)4 z13t+11 (z1 −z)4 dz dz1 Z Z (cid:18)Z (cid:19) 3 t+3 = , 3 (cid:18) (cid:19) 4 z2t+8z2z−t−1z−t−1 − 1 2 3 4 dz (2πi)4 (z1−z2)4(z1−z3)3(z1−z4)3(z2 −z3)(z2 −z4) Z 4 z2t+8z2 z−t−1 2 1 2 = −(2πi)4 (z1−z2)4 (z1−z)3(z2−z) dz dz1 dz2 Z (cid:18)Z (cid:19) 4 z2t+8z−t+1 t+2 z−t−3 z−t−2 z−t−1 z−t−1 = 1 2 2 1 +2(t+1) 1 +2 1 − 2 dz (2πi)2 (z1−z2)7 2 z1−z2 (z1 −z2)2 (z1 −z2)3 (z1−z2)3 Z (cid:18) (cid:18) (cid:19) (cid:19) t+2 t+5 t+6 t+7 2t+8 = 8 +8(t+1) +8 −4 , 2 7 8 9 9 (cid:18) (cid:19)(cid:18) (cid:19) (cid:18) (cid:19) (cid:18) (cid:19) (cid:18) (cid:19) 4 z2t+8z−t−1z2z−t−1 1 2 3 4 dz (2πi)4 (z1−z2)3(z1−z3)4(z1 −z4)3(z2−z3)(z3 −z4) Z 4 z2t+8z−t+1z−t−1 = 1 2 4 dz (2πi)3 (z1−z2)3(z1−z4)7(z2 −z4) Z 4 z2t+8z−t−1 t+2 z−t−3 z−t−2 z−t−1 = 1 4 1 +(t+1) 1 + 1 dz (2πi)2 (z1−z4)7 2 z1−z4 (z1 −z4)2 (z1−z4)3 Z (cid:18)(cid:18) (cid:19) (cid:19) t+2 t+5 t+6 t+7 = 4 +(t+1) + , 2 7 8 9 (cid:18)(cid:18) (cid:19)(cid:18) (cid:19) (cid:18) (cid:19) (cid:18) (cid:19)(cid:19) 6 zt+5zt+5z−t−1z−t−1 1 2 3 4 dz (2πi)4 (z1−z2)4(z1−z3)2(z1 −z4)2(z2−z3)2(z2−z4)2 Z 6 zt+5zt+5 z−t−1 2 1 2 = (2πi)4 (z1−z2)4 (z1−z)2(z2−z)2 dz dz1 dz2 Z (cid:18)Z (cid:19) 6 zt+5zt+5 z−2t−4 z−2t−3 z−2t−2 = 1 2 (t+1)2 2 −4(t+1) 2 +4 2 dz (2πi)2 (z1−z2)4 (z1 −z2)4 (z1 −z2)5 (z1 −z2)6 Z (cid:18) (cid:19) t+5 t+5 t+5 2 = 6(t+1) −24(t+1) +24 , 7 8 9 (cid:18) (cid:19) (cid:18) (cid:19) (cid:18) (cid:19) 6 12 zt+5z2z2z−t−1 − 1 2 3 4 dz (2πi)4 (z1−z2)3(z1−z3)3(z1−z4)2(z2 −z3)2(z2−z4)(z3−z4) Z 12 zt+5z2z−t+1 = − 1 2 4 dz (2πi)3 (z1−z2)3(z1−z4)5(z2−z4)3 Z = − 12 z1t+5z4−t+1 1 +6 z4 +6 z42 dz (2πi)2 (z1−z4)5 (z1−z4)3 (z1−z4)4 (z1−z4)5 Z (cid:18) (cid:19) t+5 t+5 t+5 = −12 −72 −72 . 7 8 9 (cid:18) (cid:19) (cid:18) (cid:19) (cid:18) (cid:19) Adding them all up gives 11 11 19 2 1109 43 35117 379 65 9 8 7 6 5 4 3 2 H4(t) = t + t + t + t + t + t + t + t + t+1 11340 630 135 3 540 10 5670 63 18 and hence 11 176 3 volB4 = 4 · = . 11340 2835 4 Larger n do As we have seen in the examples, after multiplying out the integrand of Theorem 2, many of the terms do not contribute to the integral. The following proposition will provide us with a general statement to that effect. For a rational function f in n variables z we use the notation d (f) for the degree of f in the j r variables z1,...,zr. Proposition 3 Suppose p1,...,pn are integers, qjk are nonnegative integers (1 ≤ j < k ≤ n), 1 > ǫ1 > ··· >ǫn > 0, and zpj 1≤j≤n j f(z1,...,zn)= 1≤jQ<k≤n(zj −zk)qjk . Q If 1 ≤ r ≤ n and d (f)< −r then r ··· f(z) dz = 0 . Z|z1|=ǫ1 Z|zn|=ǫn Proof. We need only show that ··· f(z)dz = 0 , (∗) Z|z1|=ǫ1 Z|zr|=ǫr for then we can integrate over all n variables by first integrating over z1...zr. 7 If r = 1 then f, considered as a function of z1, is analytic outside the circle |z1| = ǫ1 and has zero residue at infinity since its degree is less than −1, so (∗) follows. We continue by induction, so supposer > 1 and (∗) is true for smaller r. Supposethat d (f) < −r; r we may assume dr−1(f) ≥ −(r − 1). Note that dr(f) ≥ dr−1(f) + d where d is the degree of f in the single variable z (the discrepancy is the sum of the exponents q for j < r). Hence r jr d ≤ dr(f)−dr−1(f) < −1. We consider f as a function of zr and apply the residue theorem to the region outside the circle |z | = ǫ . As above f has zero residue at infinity, so we only need to r r consider the residues at the poles z for j < r. Evaluating these residues converts the integral of f j into a (possibly huge) linear combination of integrals of functions of the same form as f, but in the n−1 variables z1,...,zr−1,zr+1,...,zn. If g is any one of these functions then we easily calculate dr−1(g) = dr(f)+1 < −(r−1), and, by the induction hypothesis, the integral of g is zero. (cid:3) From this proposition we obtain the starting point for our ‘algorithm.’ Corollary 4 For 1> ǫ1 > ··· > ǫn > 0 and t ≥ 0, Hn(t) = 1 n n zt+n−1 mk (2πi)n Z|z1|=ǫ1···Z|zn|=ǫn(z1···zn)−t−1m1+·X··+m∗n=n (cid:18)m1,...,mn(cid:19)kY=1 j6=kk(zk −zj)! dz , where ∗ denotes that we only sum over those n-tuples of non-negative iQntegers satisfying m1 + ···+mn = n and m1+···+mr > r if 1≤ r < n. P Remark. The condition on m1,...,mn can be visualized through lattice paths from (0,0) to (n,n) using the steps (1,m1),(1,m2),...,(1,mn). The condition means that these paths stay strictly above the diagonal (except at the start and end).4 Proof. By Theorem 2, 1 n zt+n−1 n Hn(t) = (2πi)n ··· (z1···zn)−t−1 k(z −z ) dz Z Z k=1 j6=k k j ! X 1 Q n n zt+n−1 mk = (2πi)n Z ···Z (z1···zn)−t−1m1+·X··+mn=n(cid:18)m1,...,mn(cid:19)kY=1 j6=kk(zk −zj)! dz . We select a partition m1+···+mn = n and rewrite the corresponding inQtegrand in the language of Proposition 3: p = (n−1)m +t(m −1)−1 , q = m +m . j j j jk j k Now suppose 1 ≤ r < n. The degree of the denominator in z1,...,zr is r n r n r r (m +m )= (n−1) m +r m = (n−1) m +nr−r m j k j j j j j=1k=j+1 j=1 j=r+1 j=1 j=1 X X X X X X r r 2 = (n−1) m +nr−r (m −1)−r . j j j=1 j=1 X X 4The authors thank Lou Billera for pointing out this lattice-path interpretation. 8 We subtract this from r p to get j=1 j P r d (f)= (t+r) (m −1)−r(n−r)−r . r j j=1 X Here t is non-negative and r(n−r) is positive, so Proposition 3 implies that the integral is zero unless r (m −1) > 0. (cid:3) j=1 j P Theoretically, Corollary 4 tells us what we have to do to compute H . Thus the integrals we n computed in our calculations of H3 and H4 are exactly the non-zero integrals according to this result. For practical purposes, however, the statement is almost worthless for larger values of n. The first problem is that the number of terms in the sum equals the (n−1)th Catalan number 1 2(n−1) (2n−2)! = , n n−1 n!(n−1)! (cid:18) (cid:19) which grows exponentially with n. Another slippery point is the evaluation of each integral. As we have seen in the examples, and as can be easily seen for the general case, we can compute each integral step by step one variable at a time. However, this means at each step we convert a rational function into a sum of rational functions (of one variable less) by means of the residue theorem. Again,thismeansthatthenumberof(single-variable)integralswehavetocomputegrows immensely as n increases. Infact, if we just‘feed’ thestatement of Corollary 4 into a computer and tell it to integrate each summand, say, starting with z1, then z2, and so on, the computation time explodes once one tries n = 7 or 8. We feel that computationally this is as involved as calculating a sufficient number of values of H and then interpolating this polynomial. However, complex n analysis allows us some shortcuts which turn out to speed up the computation by a huge factor and which make Corollary 4 valuable, even from a computational perspective. These ‘tricks’ all showed up already in the examples and include 1. realizing when a function is analytic at the z -origin, k 2. trying to choose the most efficient order of variables to integrate (based on estimating how many terms will be generated by the residue calculations, for each available variable), and 3. factoring the integral if some of the variables appear in a symmetric fashion. Finally, if we are only interested in the volume of B , we may also be n 4. suppressing a particular integral if it does not contribute to the leading term of H . n It is worth noting that each of these computational ‘speed-ups’ decreases the total computation time substantially. By applying them to Corollary 4, we implemented a C++ program for the specific functions we have to integrate to compute H . We were able to verify all previously known n polynomials (n ≤ 8) and to compute volB9, volB10, and H9. The results of our calculations, including the polynomials H for n ≤ 9, and the source code for our program are available at n www.math.binghamton.edu/dennis/Birkhoff. The following table gives the volumes together withtherespectivecomputingtime(ona1GHzPCrunningunderLinux). Notethatcomputingthe 9 fullpolynomial H takes longer, as we cannot make useof shortcut#4. In fact, thecomputation of n H9 tookabout325daysofcomputertime,althoughtheelapsedtimewasonlyabouttwoweekssince we distributed the calculations among a number of machines (8 – 40, depending on availability). n volB time n 1 1 < .01 sec 2 2 < .01 sec 9 3 < .01 sec 8 176 4 < .01 sec 2835 23590375 5 < .01 sec 167382319104 9700106723 6 .18 sec 1319281996032·106 77436678274508929033 7 15 sec 137302963682235238399868928·108 5562533838576105333259507434329 8 54 min 12589036260095477950081480942693339803308928·1010 559498129702796022246895686372766052475496691 9 317 hr 92692623409952636498965146712806984296051951329202419606108477153345536·1014 Afterthisarticlewassubmittedforpublication,weusedtheidletimeonourdepartmentalmachines to compute the volume of B10. After a computation time of 6160 days, or almost 17 years (again scaled to a 1GHz processor), we obtained volB10 = 727291284016786420977508457990121862548823260052557333386607889 . 828160860106766855125676318796872729344622463533089422677980721388055739956270293750883504892820848640000000 We hope that the reader will take this immense computing time as a challenge to improve our algorithms, and work towards n = 11. 5 An outlook towards transportation polytopes The Birkhoff polytopes are special cases of transportation polytopes, which are defined below. The studyofthisclassofpolytopes,whicharenaturallyatleastasfascinatingastheBirkhoffpolytopes, was motivated by problems in linear programming; for combinatorial properties see, for example, [10, 13]. The goal of this section is to show how our methods can be applied in this more general setting. Fix positive real numbers a1,...,am,b1,...,bn such that a1 + ··· + am = b1 + ··· + bn. Let 10

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.