ABSTRACT (original article): This paper provides a novel rationale for the regulation of market size when heterogeneous firms compete. A regulator seeks to maximize total welfare by choosing the number of firms allowed to enter the market, e.g. by issuing a certain number of licenses. Opening up the market for more firms has a two-fold effect: it increases competition and thus welfare, but at the same time, it also attracts more cost-intensive firms, driving down average production efficiency. The regulator hence faces a trade-off between raising beneficial competition and detrimental costs. If goods are sufficiently substitutable, the latter effect can outweigh the former. It is then optimal to restrict the market size, rationalizing a limit to competition. This possibility result holds even in the absence of entry costs, search costs or increasing returns to scale, which previous literature required. CITATION (original article): von Negenborn, C. The more the merrier? On the optimality of market size restrictions. Rev Econ Design 27, 603–634 (2023). https://doi.org/10.1007/s10058-022-00313-7
Additional information: this notebook accompanies the published paper by providing detailed steps for the proofs and code for the numerical analysis

0
.
1
. Market parameters


0
.
2
. Equilibrium prices and quantities


1
. Setup (welfare)

1
.
1
. Arbitrary prices & quantities

1
.
1
.
1
. Definitions

Welfare functions (for firms, consumers and total) depend on linear, squared and mixed terms of prices, quantities and costs.
Since equilibrium prices & quantities differ in baseline model and extensions, we define general functions computing the welfare given arbitrary prices & quantities.
Specify input notation for different summations and create printed output using sumName[sum]
mySums={qi,"
n
∑
i=1
q
i
"},qi2,"
n
∑
i=1
2
q
i
",qiqj,"
n
∑
i=1
∑
j≠i
q
i
q
j
",{ciqi,"
n
∑
i=1
c
i
q
i
"},{qipi,"
n
∑
i=1
q
i
p
i
"};​​MapThread[Set[sumName[#1],#2]&,Transpose@mySums];​​(*printthenotation*)​​Print@Grid[{​​{"Sum","input notation"},​​{"---","------------"},​​Sequence@@Reverse/@mySums​​},AlignmentLeft]
Sum
input notation
---
------------
"
n
∑
i=1
q
i
qi
"
n
∑
i=1
2
q
i
qi2
"
n
∑
i=1
∑
j≠​i
q
i
q
j
​
qiqj
"
n
∑
i=1
c
i
q
i
ciqi
"
n
∑
i=1
q
i
p
i
qipi
Each of the summations above depends on the specific cost profile
(
c
1
,...,
c
n
)
. Different (linear, quadratic, mixed) combinations of the cost profile can arise, see list below (next output). We therefore write each summation above as a function of these terms.
In[]:=
(*inputnotationfordifferentterms*)​​termIn={1,ci,ci2,cicj};​​(*createprintedouputofeachtermusingtermName[rv][term]*)​​termOut:="1","
n
∑
i=1
c","
n
∑
i=1
2
c
i
","
n
∑
i=1
∑
j≠i
c
i
c
j
"​​MapThread[Set[termName[Unevaluated@#1],termOut[[#2]]]&,{termIn,Range[4]}];​​(*printthenotation*)​​Module[{row,list,grid},​​row[term_]:={termName[term],"["<>ToString@term<>"]"};​​list:=row[#]&/@termIn;​​grid:=Grid[{​​{"Term","input notation"},​​{"----","------------"},​​Sequence@@list​​},AlignmentLeft];​​Print@grid;​​]
Term
input notation
----
------------
1
[1]
"
n
∑
i=1
c
[ci]
"
n
∑
i=1
2
c
i
[ci2]
"
n
∑
i=1
∑
j≠i
c
i
c
j
[cicj]
For a general equilibrium
q
i
=
μ
1
+
μ
2
c
i
+
μ
3
∑
j≠i
c
j
,
p
i
=
ν
1
+
ν
2
c
i
+
ν
3
∑
j≠i
c
j
​given a cost profile
(
c
1
,...,
c
n
)
, we want to compute the sums above, i.e. we want to compute the general form of e.g.
n
∑
i=1
2
q
i
=
ξ
1
(
μ
1
,
μ
2
,
μ
3
)+
ξ
2
(
μ
1
,
μ
2
,
μ
3
)
n
∑
i=1
c
i
+
ξ
3
(
μ
1
,
μ
2
,
μ
3
)
n
∑
i=1
2
c
i
+
ξ
4
(
μ
1
,
μ
2
,
μ
3
)
n
∑
i=1
∑
j≠i
c
i
c
j
.For each sum, we want to compute the generic factors of the terms
"1",
n
∑
i=1
c
i
,
...Note that for the sum
n
∑
i=1
q
i
p
i
, the factors
ξ
1
,... additionally depend on
ν
1
,...
notation:
fGen[sum name][term name]
usage:
setGenericF[sum name,
all factors of term “1”,
all factors of term
n
∑
i=1
c
i
,
etc.]
 this defines fGen[sum][term] for all terms and prints the output
In[]:=
setGenericF[sum_,set1_,setci_,setci2_,setcicj_]:=​​(*forthesumqipi,weneedadditionalarguments
ν
1,2,3
*)​​(MapThread[Set[fGen[sum][#1][μ1_,μ2_,μ3_,ν1_,ν2_,ν3_],do[#2]]&,{termIn,{set1,setci,setci2,setcicj}}];​​Module[{row},​​row[term_]:=Delete[{Row[{"[",fGen[sum][term][
μ
1
,
μ
2
,
μ
3
,
ν
1
,
ν
2
,
ν
3
],"]"}],"*"<>termName[term]},0];​​Print[Grid[{​​{sumName[sum]<>" = "," ",row[1]},​​Delete[{"","+",row[#]}&/@{ci,ci2,cicj},0]​​},AlignmentLeft]]​​])
Using the summations just computed, we set up a general expression for welfare (of consumers, firms, total) given arbitrary prices & quantities
In[]:=
setGenericW:=​​(*arbitraryequlibriumvalues*)​​aeq={μ1,μ2,μ3,ν1,ν2,ν3};​​(*generalformulaforconsumersurplus*)​​Set[wFactorGen[cs][#][μ1_,μ2_,μ3_,ν1_,ν2_,ν3_],do[​​αfGen[qi][#]@@aeq-1/2fGen[qi2][#]@@aeq-γ/2fGen[qiqj][#]@@aeq-fGen[qipi][#]@@aeq​​]]&/@termIn;​​(*generalformulaforfirmprofits*)​​Set[wFactorGen[fi][#][μ1_,μ2_,μ3_,ν1_,ν2_,ν3_],do[​​fGen[qipi][#]@@aeq-fGen[ciqi][#]@@aeq​​]]&/@termIn;​​(*generalformulafortotalwelfare*)​​Set[wFactorGen[tot][#][μ1_,μ2_,μ3_,ν1_,ν2_,ν3_],do[​​αfGen[qi][#]@@aeq-1/2fGen[qi2][#]@@aeq-γ/2fGen[qiqj][#]@@aeq-fGen[ciqi][#]@@aeq​​]]&/@termIn;​​Module{row,grid},​​row[who_,term_]:=Sequence[Row[{"[",wFactorGen[who][term][
μ
1
,
μ
2
,
μ
3
,
ν
1
,
ν
2
,
ν
3
],"]"}],"*"<>termName[term]];​​grid[who_]:={{ToString[Subscript["",ToString@whoName[who]],StandardForm],"= "," ",row[who,1],""},Delete[{"","","+ ",row[who,#]}&/@{ci,ci2},0],{"","","+ ",row[who,cicj]}};​​PrintColumn"Welfare for arbitrary equilibrium quantities and prices given by\n
q
i
=
µ
1
+
μ
2
c
i
+
μ
3
∑
j≠i
c
j
​,
p
i
=
ν
1
+
ν
2
c
i
+
ν
3
∑
j≠i
c
j
\n",Grid[Flatten[Table[grid[whose],{whose,{cs,fi,tot}}],1],AlignmentLeft];​​

1
.
1
.
2
. Computations


1
.
1
.
3
. Welfare


1
.
2
. Equilibrium prices & quantities

1
.
2
.
1
. Definitions

we now compute the factors explicitly for each term in each sum using the specific values for the generic factors
μ
1
,
μ
2
,
μ
3
notation:
factor
[sum name: qi, piqi, ...]
[term name: 1, ci, ci2, cicj]
usage:
setF[
μ
1
,
μ
2
,
μ
3
,
ν
1
,
ν
2
,
ν
3
]
 this defines factor[sum][term] for all terms and prints the output
In[]:=
showfactors:=​​Module[{sums,exponent,row,grid},​​sums=First/@mySums;​​Outer[Set[factor[#1][#2],do[fGen[#1][#2]@@eqm]]&,sums,termIn];​​exponent[sum_]:=If[MemberQ[{qi2,qiqj,qipi},sum],2,1];​​row[sum_,term_]:=Sequence[Row[{"[",do[λ^(-exponent[sum])*factor[sum][term]],"]"}],"*"<>termName[term]];​​grid[sum_]:={{sumName[sum],"= "<>ToString[Superscript["λ",exponent[sum]]//StandardForm]<>"("," ",row[sum,1],""},Delete[{"","","+ ",row[sum,#],""}&/@{ci,ci2},0],{"","","+ ",row[sum,cicj],")"}};​​Print[Column[{"","Summations with λ = "<>ToString[λ//StandardForm],"",Grid[Flatten[Table[grid[sum],{sum,sums}],1],AlignmentLeft]}]];​​]
given these factors, we compute the welfare of consumers, firms, total
notation:
wFactor(welfare)[who: consumers (cs), firms (fi), total (tot)]
In[]:=
showWelfare:=​​Module{all,row,grid},​​all={cs,fi,tot};​​Outer[Set[wFactor[#1][#2],do[wFactorGen[#1][#2]@@eqm]]&,all,termIn];​​row[who_,term_]:=Sequence[Row[{"[",do[2/λ^2*wFactor[who][term]],"]"}],"*"<>termName[term]];​​grid[who_]:=ToString[Subscript["",ToString@whoName[who]],StandardForm],"= "<>"
2
λ
2
"<>"("," ",row[who,1],""},Delete[{"","","+ ",row[who,#],""}&/@{ci,ci2},0],{"","","+ ",row[who,cicj],")";​​Print[Column[{"","Welfare with λ = "<>ToString[λ//StandardForm],"",Grid[Flatten[Table[grid[whose],{whose,all}],1],AlignmentLeft]}]];​​
Define PDFs
compute expectations via integration
We use the following notation for the welfare levels, depending on scenario (b1, b2, mod) and party (firms, consumers, total)
w (welfare) [scenario (b1, b2, mod)] [who: consumers (cs), firms (fi), total (tot)]
Total welfare always increases in market size
Total welfare always increases in market size
Verify notation from paper
We find that interior solutions exist (i.e. restricting the market size can be optimal)
Change of exp . total welfare in γ
Change of exp . total welfare in m
Change of exp . total welfare in α

CITE THIS NOTEBOOK

The more the merrier? On the optimality of market size restrictions​
by Colin von Negenborn​
Wolfram Community, STAFF PICKS, May 2, 2024
​https://community.wolfram.com/groups/-/m/t/3168773