Problems / erdos-1050 / erdos-1050--h1-v2--h4
Borwein's remainder bound (with the denominator hypothesis)
erdos-1050--h1-v2--h4
proved
Hole hrem of erdos-1050--h1-v2 (split by 20260924T123718Z-h0924-1050-http-partial.lean).
$\displaystyle \forall n\in\mathbb{N}:\qquad R_n>0\quad\wedge\quad R_n^{2}\,2^{4n^2}\le 2^{2n+4},\qquad R_n=3T\,Q_x(n)-A_q(n),\quad T=\sum_{m=0}^{\infty}\frac{1}{2^{m+3}-3}$
For every natural number $n$ the real number $R_n$ is positive and $R_n^2\cdot 2^{4n\cdot n}\le 2^{2n+4}$ (that is, $R_n\le 2^{\,n+2-2n^2}$), where $T$ is Lean's ∑' over all $m\in\mathbb{N}$ in $\mathbb{R}$ (which would be $0$ for a non-summable family; this one converges) and $Q_x(n)$, $A_q(n)$ are read as reals. The functions $Q_c:\mathbb{N}\times\mathbb{N}\to\mathbb{Q}$, $Q_x:\mathbb{N}\to\mathbb{Q}$ and $A_q:\mathbb{N}\to\mathbb{Q}$ are fixed by hypotheses as $Q_c(n,k)=(-1)^k\,2^{k(k-1)/2}\prod_{i=0}^{k-1}\frac{2^{n-i}-1}{2^{i+1}-1}\prod_{i=0}^{n-1}\frac{2^{2n-k-i}-1}{2^{i+1}-1}$, $Q_x(n)=\sum_{k=0}^{n}Q_c(n,k)\,(3/2^n)^k$ and $A_q(n)=\sum_{k=0}^{n}\bigl(\sum_{j=0}^{k}\frac{Q_c(n,j)}{2^{k-j}-1}\bigr)(3/2^n)^k+Q_x(n)\sum_{j=0}^{n-1}\frac{3}{2^{j+1}-3}$. The statement carries one further hypothesis, which the conclusion does not use: for every $n$ there is a natural number $d>0$ with $d^2\le 2^{3n^2}$ such that $d\,Q_x(n)$ and $d\,A_q(n)$ are integers. Exponents are natural numbers (subtraction in them stops at $0$, $k(k-1)/2$ is natural-number division), division is in $\mathbb{Q}$ with $x/0=0$ so the $j=k$ term of the inner sum of $A_q$ is $0$, and where these functions are used $k\le n$, so no other exponent is truncated.
Lean
theorem erdos_1050__h1_v2__h4 : ∀ (Qc : ℕ → ℕ → ℚ),
(Qc = fun (n k : ℕ) =>
((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) →
∀ (Qx : ℕ → ℚ),
(Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) →
∀ (Aq : ℕ → ℚ),
(Aq = fun (n : ℕ) =>
∑ k ∈ Finset.range (n + (1 : ℕ)),
(∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) *
((3 : ℚ) / (2 : ℚ) ^ n) ^ k +
Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) →
(∀ (n : ℕ),
∃ (d : ℕ),
(0 : ℕ) < d ∧
(↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧
(∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) →
∀ (n : ℕ),
(0 : ℝ) <
(↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) -
(↑(Aq n) : ℝ) ∧
((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) -
(↑(Aq n) : ℝ)) ^
(2 : ℕ) *
(2 : ℝ) ^ ((4 : ℕ) * n * n) ≤
(2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)) := by
sorryWhy does it end in sorry?
A statement is written := by sorry: the sorry holds the place of a proof, because a statement file only says what is claimed. A proof the gate checked is its own file, Proof.lean. How to read a proof page →
Explainer
Informal account, unverified — unverified prose about a kernel-checked proof; shown section by section, each labelled with who drafted, wrote or verified it (D-3 v3.31).
Unverified: explainer, its words from explainer/d4f1735e26c2….md, written by t1006-w3, drafted with Claude Opus 5.5 (claude-opus-5-5) in a Claude Code agent session, 2026-10-06.
How the proof goes
Draft · drafted, by the model named above
Write $T=\sum_{m\ge0}1/(2^{m+3}-3)$, $x_n=3/2^n$ and $R_n=3T\,Q_x(n)-A_q(n)$, as in the statement. The proof never uses the statement's hypothesis about the denominators $d$: it introduces it and discards it (the _ in intro Qc hQc Qx hQx Aq hAq _ n).
The idea is that $R_n$ is the sum of a convergent series in $x_n$ whose first $2n+1$ coefficients vanish: $$R_n=\sum_{K>2n}\frac{\prod_{n<L\le 2n}(2^K-2^L)}{\prod_{i=0}^{n}(2^K-2^i)}\,x_n^K\qquad(n\ge1).$$ The vanishing comes from Lagrange interpolation: the numbers $2^jQ_c(n,j)$ are the interpolation weights of $N(X)=\prod_{n<L\le 2n}(X-2^L)$ at the nodes $2^0,\dots,2^n$, and $N(2^K)=0$ for $n<K\le 2n$. Each remaining coefficient lies in $(0,\,2\cdot2^{-K}]$, so $R_n$ is positive and at most a geometric tail, $R_n\le 8\,(x_n/2)^{2n+1}$ for $n\ge2$; the stated bound is then an inequality between powers of $2$ and $3$. The cases $n=0$ and $n=1$ are computed directly, using $0<T\le 2/5$.
Read it step by step (7 more sections)
The four identities for products of $2^a-2^b$
Draft · drafted, by the model named above
These five steps have the same statements and proofs as the first five steps of the proof of erdos-1050--h1-v2--h3, where they are explained in more detail. Write $P_m=\prod_{s<m}(2^{s+1}-1)$.
id1_test: for $j\le n$, $\big(\prod_{i<j}(2^{n-i}-1)\big)P_{n-j}=P_n$ (induction on $j$).lower_test: $\prod_{i<j}(2^j-2^i)=2^{j(j-1)/2}P_j$.upper_test: for $j\le n$, $\prod_{j<i\le n}(2^j-2^i)=(-1)^{n-j}2^{j(n-j)}P_{n-j}$.rhs_test: for $j\le n$, $\big(\prod_{n<K\le 2n}(2^j-2^K)\big)P_{n-j}=(-1)^n2^{jn}P_{2n-j}$.id1_fullcombines them: for $j\le n$,
$$Q_c(n,j)\,2^j\prod_{i\le n,\ i\ne j}(2^j-2^i)=\prod_{n<K\le 2n}(2^j-2^K),$$ with $Q_c(n,j)$ written out as in the statement.
In other words, the numbers $2^jQ_c(n,j)$ are the Lagrange interpolation weights of the polynomial $N(X)=\prod_{n<L\le 2n}(X-2^L)$ at the nodes $2^0,2^1,\dots,2^n$.
Interpolation, and the coefficients beyond $n$
Draft · drafted, by the model named above
lagr_eval is Lagrange interpolation over $\mathbb Q$: if $x_0,\dots,x_n$ are distinct, $\deg N\le n$, and $r_j\prod_{i\ne j}(x_j-x_i)=N(x_j)$ for every $j\le n$, then $N=\sum_{j\le n}r_j\prod_{i\le n,\,i\ne j}(X-x_i)$. It is proved by showing the difference has degree at most $n$ and vanishes at the $n+1$ nodes.
tail_coeff is the identity the rest of the proof is built on. For $K>n$ and any $Q_c$ satisfying the conclusion of id1_full for all $j\le n$: $$\sum_{j=0}^{n}\frac{Q_c(n,j)}{2^{K-j}-1}=\frac{\prod_{n<L\le 2n}(2^K-2^L)}{\prod_{i=0}^{n}(2^K-2^i)}.$$ The proof takes the nodes $x_i=2^i$ and the polynomial $N$ above, checks that $\deg N\le n$ (tail_coeff.hNdeg) and the weight condition (tail_coeff.hr), applies lagr_eval, and evaluates both sides at $X=2^K$ (tail_coeff.hev). Dividing by $\prod_{i\le n}(2^K-2^i)$, which is nonzero because $K>n$, the $j$-th term becomes $Q_c(n,j)\,2^j/(2^K-2^j)=Q_c(n,j)/(2^{K-j}-1)$.
Splitting the constant $3T$
Draft · drafted, by the model named above
Let $T=\sum_{m\ge 0}1/(2^{m+3}-3)$ as in the statement.
split3T states that for every $n$ $$3T=\sum_{j<n}\frac{3}{2^{j+1}-3}+\sum_{m\ge 0}\frac{3}{2^{m+n+1}-3}.$$ With $g(m)=3/(2^{m+1}-3)$, $3T=\sum_{m\ge0}g(m+2)$, and $g(0)+g(1)=-3+3=0$ (split3T.hfirst), so $3T=\sum_{m\ge 0}g(m)$; this sum is then split after its first $n$ terms.
tail3 states that for $n\ge 1$ $$\sum_{m\ge0}\frac{3}{2^{m+n+1}-3}=\sum_{s\ge0}\frac{(3/2^n)^{s+1}}{2^{s+1}-1}.$$ Both sides are the double sum of the nonnegative numbers $f(m,s)=\big(3/2^{m+n+1}\big)^{s+1}$: summing over $s$ first gives the geometric series $3/(2^{m+n+1}-3)$ (tail3.inner1), and summing over $m$ first gives $(3/2^n)^{s+1}/(2^{s+1}-1)$ (tail3.inner2). The order of summation is exchanged because all terms are nonnegative and the double series converges (tail3.hU, tail3.hcomm).
The remainder as a power series
Draft · drafted, by the model named above
cauchy_fin is the product of a polynomial with a power series: if $\sum_{s\ge0}a_s x^{s+1}=A$, then the series over $K$ of $\sum_{j\le n,\ j<K}q_j\,a_{K-j-1}\,x^K$ has sum $\big(\sum_{j\le n}q_jx^j\big)A$.
h4_series states that for $n\ge 1$, with $x=3/2^n$, the remainder $R_n=3T\,Q_x(n)-A_q(n)$ is the sum of the series $$R_n=\sum_{K>2n}\frac{\prod_{n<L\le 2n}(2^K-2^L)}{\prod_{i=0}^{n}(2^K-2^i)}\,x^K .$$ The steps are these.
- Put $a_s=1/(2^{s+1}-1)$ and $A=\sum_{s\ge0}a_sx^{s+1}$, which converges because $x/2<1$ (
h4_series.hx2,h4_series.hAsum). - By
split3Tandtail3, $3T=c_n+A$ with $c_n=\sum_{j<n}3/(2^{j+1}-3)$ (h4_series.h3T). - The term $Q_x(n)\,c_n$ in $A_q(n)$ then cancels, leaving $R_n=Q_x(n)\,A-P$, where $P=\sum_{k\le n}\big(\sum_{j\le k}\frac{Q_c(n,j)}{2^{k-j}-1}\big)x^k$ (
h4_series.hval). cauchy_finwith $q_j=Q_c(n,j)$ expands $Q_x(n)\,A$ as a series in $K$, and $P$ is a finite series (h4_series.hP); their difference is computed coefficient by coefficient (h4_series.hfun):- for $K\le n$ the two coefficients are equal, because the term $j=K$ of $P$'s inner sum is $Q_c(n,K)/0=0$;
- for $K>n$ the coefficient is $\sum_{j\le n}Q_c(n,j)/(2^{K-j}-1)$, which
tail_coeffturns into the quotient of products, usingid1_fullfor the concrete $Q_c$ (h4_series.hid1); - for $n<K\le 2n$ that quotient is $0$, because the numerator contains the factor $2^K-2^K$.
Bounding each term
Draft · drafted, by the model named above
prod_one_sub_ge is the inequality $1-\sum_{i\in s}a_i\le\prod_{i\in s}(1-a_i)$ for $0\le a_i\le 1$, by induction on the finite set $s$.
nd_bound states that for $n\ge 1$ and $K\ge 2n+1$ the coefficient in h4_series satisfies $$0<\frac{\prod_{n<L\le 2n}(2^K-2^L)}{\prod_{i=0}^{n}(2^K-2^i)}\le 2\cdot 2^{-K}.$$ Every factor is positive since $L,i<K$. The numerator is at most $(2^K)^n$ (nd_bound.hN). The denominator is at least $(2^K)^{n+1}/2$ (nd_bound.hD): each factor is $2^K(1-2^{-(K-i)})$, the numbers $2^{-(K-i)}$ for $i\le n$ sum to at most $1/2$ because $K-n\ge 2$, and prod_one_sub_ge applies.
The bound for $n\ge 2$
Draft · drafted, by the model named above
ineq_pow states $9\cdot 81^n\le 256^n$ for $n\ge 2$ (induction on $n$).
h4_big is the conclusion of the statement for $n\ge 2$. Write $x=3/2^n$, so $x/2\le 3/8$ (h4_big.hx2), and let $G_K$ be the $K$-th term of the series in h4_series.
- Positivity. Every $G_K$ is $\ge 0$ and $G_{2n+1}>0$ (
h4_big.hGnn,h4_big.hGpos, both fromnd_bound), so the sum $R_n$ is positive. - Upper bound. By
nd_bound, $G_K\le 2(x/2)^K$ for $K>2n$. Summing the geometric series, $R_n\le 2(x/2)^{2n+1}/(1-x/2)\le 8(x/2)^{2n+1}$, using $1/(1-x/2)\le 4$. Squaring, $R_n^2\le 64\,(x/2)^{4n+2}$, and $x/2=3/2^{n+1}$. - Arithmetic. It remains that $64\cdot 3^{4n+2}\cdot 2^{4n^2}\le 2^{2n+4}\,(2^{n+1})^{4n+2}$. The right side is $2^{4n^2}\cdot 64\cdot 256^n$ and the left side is $2^{4n^2}\cdot 64\cdot 9\cdot 81^n$, so this is
ineq_pow. It is proved in $\mathbb N$ and cast to $\mathbb R$.
The constant $T$, and the cases $n=0$ and $n=1$
Draft · drafted, by the model named above
T_facts states that the series defining $T$ converges, $T>0$ and $T\le 2/5$, from $2^{m+3}-3\ge 5\cdot 2^m$, which bounds the $m$-th term by $\frac15 2^{-m}$. The step s17 takes $T>0$ and $T\le 2/5$ out of it.
The proof then introduces the hypotheses of the statement and splits on $n$.
- $n=0$: $Q_x(0)=1$ (
hQx0) and $A_q(0)=0$ (hAq0), so $R_0=3T>0$, and $R_0^2\cdot 2^0=9T^2$ (e), which is at most $2^4$ since $T\le 2/5$. - $n=1$: $Q_x(1)=3/2$ (
hQx1) and $A_q(1)=0$ (hAq1), so $R_1=\frac92T>0$, and $R_1^2\cdot 2^4\le 2^6$ again follows from $T\le 2/5$. - $n\ge 2$:
h4_big.
History: 1 version on record
2026-10-06 · written by t1006-w3, drafted with Claude Opus 5.5 (claude-opus-5-5) in a Claude Code agent session · not signed · current · explainer/d4f1735e26c2….md · the first version of its chain
Read this version
How the proof goes
Write $T=\sum_{m\ge0}1/(2^{m+3}-3)$, $x_n=3/2^n$ and $R_n=3T\,Q_x(n)-A_q(n)$, as in the statement. The proof never uses the statement's hypothesis about the denominators $d$: it introduces it and discards it (the
_inintro Qc hQc Qx hQx Aq hAq _ n).The idea is that $R_n$ is the sum of a convergent series in $x_n$ whose first $2n+1$ coefficients vanish: $$R_n=\sum_{K>2n}\frac{\prod_{n<L\le 2n}(2^K-2^L)}{\prod_{i=0}^{n}(2^K-2^i)}\,x_n^K\qquad(n\ge1).$$ The vanishing comes from Lagrange interpolation: the numbers $2^jQ_c(n,j)$ are the interpolation weights of $N(X)=\prod_{n<L\le 2n}(X-2^L)$ at the nodes $2^0,\dots,2^n$, and $N(2^K)=0$ for $n<K\le 2n$. Each remaining coefficient lies in $(0,\,2\cdot2^{-K}]$, so $R_n$ is positive and at most a geometric tail, $R_n\le 8\,(x_n/2)^{2n+1}$ for $n\ge2$; the stated bound is then an inequality between powers of $2$ and $3$. The cases $n=0$ and $n=1$ are computed directly, using $0<T\le 2/5$.
The four identities for products of $2^a-2^b$ (id1_test lower_test upper_test rhs_test id1_full)
These five steps have the same statements and proofs as the first five steps of the proof of
erdos-1050--h1-v2--h3, where they are explained in more detail. Write $P_m=\prod_{s<m}(2^{s+1}-1)$.id1_test: for $j\le n$, $\big(\prod_{i<j}(2^{n-i}-1)\big)P_{n-j}=P_n$ (induction on $j$).lower_test: $\prod_{i<j}(2^j-2^i)=2^{j(j-1)/2}P_j$.upper_test: for $j\le n$, $\prod_{j<i\le n}(2^j-2^i)=(-1)^{n-j}2^{j(n-j)}P_{n-j}$.rhs_test: for $j\le n$, $\big(\prod_{n<K\le 2n}(2^j-2^K)\big)P_{n-j}=(-1)^n2^{jn}P_{2n-j}$.id1_fullcombines them: for $j\le n$,
$$Q_c(n,j)\,2^j\prod_{i\le n,\ i\ne j}(2^j-2^i)=\prod_{n<K\le 2n}(2^j-2^K),$$ with $Q_c(n,j)$ written out as in the statement.
In other words, the numbers $2^jQ_c(n,j)$ are the Lagrange interpolation weights of the polynomial $N(X)=\prod_{n<L\le 2n}(X-2^L)$ at the nodes $2^0,2^1,\dots,2^n$.
Interpolation, and the coefficients beyond $n$ (lagr_eval tail_coeff)
lagr_evalis Lagrange interpolation over $\mathbb Q$: if $x_0,\dots,x_n$ are distinct, $\deg N\le n$, and $r_j\prod_{i\ne j}(x_j-x_i)=N(x_j)$ for every $j\le n$, then $N=\sum_{j\le n}r_j\prod_{i\le n,\,i\ne j}(X-x_i)$. It is proved by showing the difference has degree at most $n$ and vanishes at the $n+1$ nodes.tail_coeffis the identity the rest of the proof is built on. For $K>n$ and any $Q_c$ satisfying the conclusion ofid1_fullfor all $j\le n$: $$\sum_{j=0}^{n}\frac{Q_c(n,j)}{2^{K-j}-1}=\frac{\prod_{n<L\le 2n}(2^K-2^L)}{\prod_{i=0}^{n}(2^K-2^i)}.$$ The proof takes the nodes $x_i=2^i$ and the polynomial $N$ above, checks that $\deg N\le n$ (tail_coeff.hNdeg) and the weight condition (tail_coeff.hr), applieslagr_eval, and evaluates both sides at $X=2^K$ (tail_coeff.hev). Dividing by $\prod_{i\le n}(2^K-2^i)$, which is nonzero because $K>n$, the $j$-th term becomes $Q_c(n,j)\,2^j/(2^K-2^j)=Q_c(n,j)/(2^{K-j}-1)$.Splitting the constant $3T$ (tail3 split3T)
Let $T=\sum_{m\ge 0}1/(2^{m+3}-3)$ as in the statement.
split3Tstates that for every $n$ $$3T=\sum_{j<n}\frac{3}{2^{j+1}-3}+\sum_{m\ge 0}\frac{3}{2^{m+n+1}-3}.$$ With $g(m)=3/(2^{m+1}-3)$, $3T=\sum_{m\ge0}g(m+2)$, and $g(0)+g(1)=-3+3=0$ (split3T.hfirst), so $3T=\sum_{m\ge 0}g(m)$; this sum is then split after its first $n$ terms.tail3states that for $n\ge 1$ $$\sum_{m\ge0}\frac{3}{2^{m+n+1}-3}=\sum_{s\ge0}\frac{(3/2^n)^{s+1}}{2^{s+1}-1}.$$ Both sides are the double sum of the nonnegative numbers $f(m,s)=\big(3/2^{m+n+1}\big)^{s+1}$: summing over $s$ first gives the geometric series $3/(2^{m+n+1}-3)$ (tail3.inner1), and summing over $m$ first gives $(3/2^n)^{s+1}/(2^{s+1}-1)$ (tail3.inner2). The order of summation is exchanged because all terms are nonnegative and the double series converges (tail3.hU,tail3.hcomm).The remainder as a power series (cauchy_fin h4_series)
cauchy_finis the product of a polynomial with a power series: if $\sum_{s\ge0}a_s x^{s+1}=A$, then the series over $K$ of $\sum_{j\le n,\ j<K}q_j\,a_{K-j-1}\,x^K$ has sum $\big(\sum_{j\le n}q_jx^j\big)A$.h4_seriesstates that for $n\ge 1$, with $x=3/2^n$, the remainder $R_n=3T\,Q_x(n)-A_q(n)$ is the sum of the series $$R_n=\sum_{K>2n}\frac{\prod_{n<L\le 2n}(2^K-2^L)}{\prod_{i=0}^{n}(2^K-2^i)}\,x^K .$$ The steps are these.- Put $a_s=1/(2^{s+1}-1)$ and $A=\sum_{s\ge0}a_sx^{s+1}$, which converges because $x/2<1$ (
h4_series.hx2,h4_series.hAsum). - By
split3Tandtail3, $3T=c_n+A$ with $c_n=\sum_{j<n}3/(2^{j+1}-3)$ (h4_series.h3T). - The term $Q_x(n)\,c_n$ in $A_q(n)$ then cancels, leaving $R_n=Q_x(n)\,A-P$, where $P=\sum_{k\le n}\big(\sum_{j\le k}\frac{Q_c(n,j)}{2^{k-j}-1}\big)x^k$ (
h4_series.hval). cauchy_finwith $q_j=Q_c(n,j)$ expands $Q_x(n)\,A$ as a series in $K$, and $P$ is a finite series (h4_series.hP); their difference is computed coefficient by coefficient (h4_series.hfun):- for $K\le n$ the two coefficients are equal, because the term $j=K$ of $P$'s inner sum is $Q_c(n,K)/0=0$;
- for $K>n$ the coefficient is $\sum_{j\le n}Q_c(n,j)/(2^{K-j}-1)$, which
tail_coeffturns into the quotient of products, usingid1_fullfor the concrete $Q_c$ (h4_series.hid1); - for $n<K\le 2n$ that quotient is $0$, because the numerator contains the factor $2^K-2^K$.
Bounding each term (prod_one_sub_ge nd_bound)
prod_one_sub_geis the inequality $1-\sum_{i\in s}a_i\le\prod_{i\in s}(1-a_i)$ for $0\le a_i\le 1$, by induction on the finite set $s$.nd_boundstates that for $n\ge 1$ and $K\ge 2n+1$ the coefficient inh4_seriessatisfies $$0<\frac{\prod_{n<L\le 2n}(2^K-2^L)}{\prod_{i=0}^{n}(2^K-2^i)}\le 2\cdot 2^{-K}.$$ Every factor is positive since $L,i<K$. The numerator is at most $(2^K)^n$ (nd_bound.hN). The denominator is at least $(2^K)^{n+1}/2$ (nd_bound.hD): each factor is $2^K(1-2^{-(K-i)})$, the numbers $2^{-(K-i)}$ for $i\le n$ sum to at most $1/2$ because $K-n\ge 2$, andprod_one_sub_geapplies.The bound for $n\ge 2$ (ineq_pow h4_big)
ineq_powstates $9\cdot 81^n\le 256^n$ for $n\ge 2$ (induction on $n$).h4_bigis the conclusion of the statement for $n\ge 2$. Write $x=3/2^n$, so $x/2\le 3/8$ (h4_big.hx2), and let $G_K$ be the $K$-th term of the series inh4_series.- Positivity. Every $G_K$ is $\ge 0$ and $G_{2n+1}>0$ (
h4_big.hGnn,h4_big.hGpos, both fromnd_bound), so the sum $R_n$ is positive. - Upper bound. By
nd_bound, $G_K\le 2(x/2)^K$ for $K>2n$. Summing the geometric series, $R_n\le 2(x/2)^{2n+1}/(1-x/2)\le 8(x/2)^{2n+1}$, using $1/(1-x/2)\le 4$. Squaring, $R_n^2\le 64\,(x/2)^{4n+2}$, and $x/2=3/2^{n+1}$. - Arithmetic. It remains that $64\cdot 3^{4n+2}\cdot 2^{4n^2}\le 2^{2n+4}\,(2^{n+1})^{4n+2}$. The right side is $2^{4n^2}\cdot 64\cdot 256^n$ and the left side is $2^{4n^2}\cdot 64\cdot 9\cdot 81^n$, so this is
ineq_pow. It is proved in $\mathbb N$ and cast to $\mathbb R$.
The constant $T$, and the cases $n=0$ and $n=1$ (T_facts s17 hQx0 hAq0 e hQx1 hAq1)
T_factsstates that the series defining $T$ converges, $T>0$ and $T\le 2/5$, from $2^{m+3}-3\ge 5\cdot 2^m$, which bounds the $m$-th term by $\frac15 2^{-m}$. The steps17takes $T>0$ and $T\le 2/5$ out of it.The proof then introduces the hypotheses of the statement and splits on $n$.
- $n=0$: $Q_x(0)=1$ (
hQx0) and $A_q(0)=0$ (hAq0), so $R_0=3T>0$, and $R_0^2\cdot 2^0=9T^2$ (e), which is at most $2^4$ since $T\le 2/5$. - $n=1$: $Q_x(1)=3/2$ (
hQx1) and $A_q(1)=0$ (hAq1), so $R_1=\frac92T>0$, and $R_1^2\cdot 2^4\le 2^6$ again follows from $T\le 2/5$. - $n\ge 2$:
h4_big.
Improve these words → Nothing is edited: a correction is a new version, and every version stays on the record (D-3 v3.30).
How it was proved
Proved by Proof.lean, checked by the kernel. Its attestation, 000320, records the gate’s run.
The proof step by step (outline)
Checked by the kernel — an outline of the attested proof below: attestations/000320.json, merge commit df09144aaebf.
Outline of Proof.lean, extracted by the gate at 82834c4684b8 from the proof’s elaboration: each step is a claim the proof establishes and the goal it leaves. Open a step for what it uses and its Lean lines.
id1_testhave∀ (n j : ℕ), j ≤ n → (∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ))) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withid1_test : ∀ (n j : ℕ), j ≤ n → (∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ))) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)).Uses library
Finset.rangerange nis the set of natural numbers less thann. .Lean, lines 35–46
have id1_test : ∀ (n j : ℕ) (hj : j ≤ n), (∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - 1)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1) = ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + 1) - 1) := by intro n j hj induction j with | zero => simp | succ j ih => have ih' := ih (by omega) rw [Finset.prod_range_succ, ← ih'] obtain ⟨m, hm⟩ : ∃ m, n - j = m + 1 := ⟨n - j - 1, by omega⟩ rw [hm, Finset.prod_range_succ, show n - (j + 1) = m by omega] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 35–46 at
df09144aaebf↗id1_test.s1case routine: simpLeaves
(∏ i ∈ Finset.range (0 : ℕ), ((2 : ℚ) ^ (n - i) - (1 : ℚ))) * ∏ s ∈ Finset.range (n - (0 : ℕ)), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)), withhj : (0 : ℕ) ≤ n.Uses library
Nat.zeroZero, the smallest natural number. .Lean, line 40
| zero => simp
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 40 at
df09144aaebf↗id1_test.s2caseLeaves
(∏ i ∈ Finset.range (j + (1 : ℕ)), ((2 : ℚ) ^ (n - i) - (1 : ℚ))) * ∏ s ∈ Finset.range (n - (j + (1 : ℕ))), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)), withj : ℕ,ih : j ≤ n → (∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ))) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)),hj : j + (1 : ℕ) ≤ n.Uses library
Nat.succThe successor of a natural numbern. ,Finset.prod_range_succ.Lean, lines 41–46
| succ j ih => have ih' := ih (by omega) rw [Finset.prod_range_succ, ← ih'] obtain ⟨m, hm⟩ : ∃ m, n - j = m + 1 := ⟨n - j - 1, by omega⟩ rw [hm, Finset.prod_range_succ, show n - (j + 1) = m by omega] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 41–46 at
df09144aaebf↗id1_test.s2.ih'have(∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ))) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))Leaves
(∏ i ∈ Finset.range (j + (1 : ℕ)), ((2 : ℚ) ^ (n - i) - (1 : ℚ))) * ∏ s ∈ Finset.range (n - (j + (1 : ℕ))), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)), withih' : (∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ))) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)).Lean, line 42
have ih' := ih (by omega)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 42 at
df09144aaebf↗id1_test.s2.s2obtain∃ (m : ℕ), n - j = m + (1 : ℕ)Leaves
(∏ x ∈ Finset.range j, ((2 : ℚ) ^ (n - x) - (1 : ℚ))) * ((2 : ℚ) ^ (n - j) - (1 : ℚ)) * ∏ s ∈ Finset.range (n - (j + (1 : ℕ))), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = (∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ))) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)), withm : ℕ,hm : n - j = m + (1 : ℕ).Uses library
Exists.introExistential introduction. .Lean, line 44
obtain ⟨m, hm⟩ : ∃ m, n - j = m + 1 := ⟨n - j - 1, by omega⟩
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 44 at
df09144aaebf↗
lower_testhave∀ (j : ℕ), ∏ i ∈ Finset.range j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withlower_test : ∀ (j : ℕ), ∏ i ∈ Finset.range j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.prod_congr,rflrfl : a = ais the unique constructor of the equality type. ,Finset.prod_mul_distrib,Finset.prod_pow_eq_pow_sum,Finset.prod_range_reflect.Lean, lines 48–62
have lower_test : ∀ (j : ℕ), ∏ i ∈ Finset.range j, ((2 : ℚ) ^ j - 2 ^ i) = 2 ^ (j * (j - 1) / 2) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + 1) - 1) := by intro j have h1 : ∀ i ∈ Finset.range j, ((2 : ℚ) ^ j - 2 ^ i) = 2 ^ i * (2 ^ (j - 1 - i + 1) - 1) := by intro i hi have hi' := Finset.mem_range.mp hi rw [mul_sub, ← pow_add, show i + (j - 1 - i + 1) = j by omega] ring rw [Finset.prod_congr rfl h1, Finset.prod_mul_distrib, Finset.prod_pow_eq_pow_sum, Finset.prod_range_reflect (fun s => ((2 : ℚ) ^ (s + 1) - 1)) j] congr 1 congr 1 have := Finset.sum_range_id_mul_two j omegatargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 48–62 at
df09144aaebf↗lower_test.h1have∀ i ∈ Finset.range j, (2 : ℚ) ^ j - (2 : ℚ) ^ i = (2 : ℚ) ^ i * ((2 : ℚ) ^ (j - (1 : ℕ) - i + (1 : ℕ)) - (1 : ℚ))Leaves
∏ i ∈ Finset.range j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)), withh1 : ∀ i ∈ Finset.range j, (2 : ℚ) ^ j - (2 : ℚ) ^ i = (2 : ℚ) ^ i * ((2 : ℚ) ^ (j - (1 : ℕ) - i + (1 : ℕ)) - (1 : ℚ)).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,mul_subAlias ofmul_sub_left_distrib. ,pow_add.Lean, lines 52–56
have h1 : ∀ i ∈ Finset.range j, ((2 : ℚ) ^ j - 2 ^ i) = 2 ^ i * (2 ^ (j - 1 - i + 1) - 1) := by intro i hi have hi' := Finset.mem_range.mp hi rw [mul_sub, ← pow_add, show i + (j - 1 - i + 1) = j by omega] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 52–56 at
df09144aaebf↗lower_test.h1.hi'havei < jLeaves
(2 : ℚ) ^ j - (2 : ℚ) ^ i = (2 : ℚ) ^ i * ((2 : ℚ) ^ (j - (1 : ℕ) - i + (1 : ℕ)) - (1 : ℚ)), withhi' : i < j.Uses library
Finset.mem_range.Lean, line 54
have hi' := Finset.mem_range.mp hi
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 54 at
df09144aaebf↗
lower_test.thishave(∑ i ∈ Finset.range j, i) * (2 : ℕ) = j * (j - (1 : ℕ))Leaves
∑ i ∈ Finset.range j, i = j * (j - (1 : ℕ)) / (2 : ℕ), withthis : (∑ i ∈ Finset.range j, i) * (2 : ℕ) = j * (j - (1 : ℕ)).Uses library
Finset.sum_range_id_mul_twoGauss' summation formula .Lean, line 61
have := Finset.sum_range_id_mul_two j
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 61 at
df09144aaebf↗
upper_testhave∀ (j n : ℕ), j ≤ n → ∏ i ∈ Finset.Ioc j n, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = (-1 : ℚ) ^ (n - j) * (2 : ℚ) ^ (j * (n - j)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withupper_test : ∀ (j n : ℕ), j ≤ n → ∏ i ∈ Finset.Ioc j n, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = (-1 : ℚ) ^ (n - j) * (2 : ℚ) ^ (j * (n - j)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)).Uses library
Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.rangerange nis the set of natural numbers less thann. ,Finset.prod_Ico_eq_prod_range,Finset.prod_congr,rflrfl : a = ais the unique constructor of the equality type. ,Finset.prod_mul_distrib,Finset.prod_const,Finset.card_range,pow_mul.Lean, lines 64–76
have upper_test : ∀ (j n : ℕ) (hj : j ≤ n), ∏ i ∈ Finset.Ioc j n, ((2 : ℚ) ^ j - 2 ^ i) = (-1) ^ (n - j) * 2 ^ (j * (n - j)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1) := by intro j n hj have e : Finset.Ioc j n = Finset.Ico (j + 1) (n + 1) := by ext x; simp only [Finset.mem_Ioc, Finset.mem_Ico]; omega rw [e, Finset.prod_Ico_eq_prod_range, show n + 1 - (j + 1) = n - j by omega] have h1 : ∀ t ∈ Finset.range (n - j), ((2 : ℚ) ^ j - 2 ^ (j + 1 + t)) = (-1) * 2 ^ j * (2 ^ (t + 1) - 1) := by intro t _ rw [show j + 1 + t = j + (t + 1) by ring, pow_add] ring rw [Finset.prod_congr rfl h1, Finset.prod_mul_distrib, Finset.prod_mul_distrib, Finset.prod_const, Finset.prod_const, Finset.card_range, ← pow_mul]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 64–76 at
df09144aaebf↗upper_test.ehaveFinset.Ioc j n = Finset.Ico (j + (1 : ℕ)) (n + (1 : ℕ))Leaves
∏ i ∈ Finset.Ioc j n, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = (-1 : ℚ) ^ (n - j) * (2 : ℚ) ^ (j * (n - j)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)), withe : Finset.Ioc j n = Finset.Ico (j + (1 : ℕ)) (n + (1 : ℕ)).Uses library
Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.IcoThe finset $[a, b)$ of elementsxsuch thata ≤ xandx < b. ,Finset.mem_Ioc,Finset.mem_Ico.Lean, lines 68–69
have e : Finset.Ioc j n = Finset.Ico (j + 1) (n + 1) := by ext x; simp only [Finset.mem_Ioc, Finset.mem_Ico]; omegatargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 68–69 at
df09144aaebf↗upper_test.h1have∀ t ∈ Finset.range (n - j), (2 : ℚ) ^ j - (2 : ℚ) ^ (j + (1 : ℕ) + t) = (-1 : ℚ) * (2 : ℚ) ^ j * ((2 : ℚ) ^ (t + (1 : ℕ)) - (1 : ℚ))Leaves
∏ k ∈ Finset.range (n - j), ((2 : ℚ) ^ j - (2 : ℚ) ^ (j + (1 : ℕ) + k)) = (-1 : ℚ) ^ (n - j) * (2 : ℚ) ^ (j * (n - j)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)), withh1 : ∀ t ∈ Finset.range (n - j), (2 : ℚ) ^ j - (2 : ℚ) ^ (j + (1 : ℕ) + t) = (-1 : ℚ) * (2 : ℚ) ^ j * ((2 : ℚ) ^ (t + (1 : ℕ)) - (1 : ℚ)).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,pow_add.Lean, lines 71–74
have h1 : ∀ t ∈ Finset.range (n - j), ((2 : ℚ) ^ j - 2 ^ (j + 1 + t)) = (-1) * 2 ^ j * (2 ^ (t + 1) - 1) := by intro t _ rw [show j + 1 + t = j + (t + 1) by ring, pow_add] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 71–74 at
df09144aaebf↗
rhs_testhave∀ (j n : ℕ), j ≤ n → (∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = (-1 : ℚ) ^ n * (2 : ℚ) ^ (j * n) * ∏ s ∈ Finset.range ((2 : ℕ) * n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withrhs_test : ∀ (j n : ℕ), j ≤ n → (∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = (-1 : ℚ) ^ n * (2 : ℚ) ^ (j * n) * ∏ s ∈ Finset.range ((2 : ℕ) * n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)).Uses library
Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.rangerange nis the set of natural numbers less thann. ,Finset.prod_Ico_eq_prod_range,Finset.prod_congr,rflrfl : a = ais the unique constructor of the equality type. ,Finset.prod_mul_distrib,Finset.prod_const,Finset.card_range,pow_mul,Finset.prod_range_add.Lean, lines 78–94
have rhs_test : ∀ (j n : ℕ) (hj : j ≤ n), (∏ K ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ K)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1) = (-1) ^ n * 2 ^ (j * n) * ∏ s ∈ Finset.range (2 * n - j), ((2 : ℚ) ^ (s + 1) - 1) := by intro j n hj have e : Finset.Ioc n (2 * n) = Finset.Ico (n + 1) (2 * n + 1) := by ext x; simp only [Finset.mem_Ioc, Finset.mem_Ico]; omega rw [e, Finset.prod_Ico_eq_prod_range, show 2 * n + 1 - (n + 1) = n by omega] have h1 : ∀ t ∈ Finset.range n, ((2 : ℚ) ^ j - 2 ^ (n + 1 + t)) = (-1) * 2 ^ j * (2 ^ ((n - j) + t + 1) - 1) := by intro t _ rw [show n + 1 + t = j + ((n - j) + t + 1) by omega, pow_add] ring rw [Finset.prod_congr rfl h1, Finset.prod_mul_distrib, Finset.prod_mul_distrib, Finset.prod_const, Finset.prod_const, Finset.card_range, ← pow_mul, show 2 * n - j = (n - j) + n by omega, Finset.prod_range_add] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 78–94 at
df09144aaebf↗rhs_test.ehaveFinset.Ioc n ((2 : ℕ) * n) = Finset.Ico (n + (1 : ℕ)) ((2 : ℕ) * n + (1 : ℕ))Leaves
(∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = (-1 : ℚ) ^ n * (2 : ℚ) ^ (j * n) * ∏ s ∈ Finset.range ((2 : ℕ) * n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)), withe : Finset.Ioc n ((2 : ℕ) * n) = Finset.Ico (n + (1 : ℕ)) ((2 : ℕ) * n + (1 : ℕ)).Uses library
Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.IcoThe finset $[a, b)$ of elementsxsuch thata ≤ xandx < b. ,Finset.mem_Ioc,Finset.mem_Ico.Lean, lines 83–84
have e : Finset.Ioc n (2 * n) = Finset.Ico (n + 1) (2 * n + 1) := by ext x; simp only [Finset.mem_Ioc, Finset.mem_Ico]; omegatargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 83–84 at
df09144aaebf↗rhs_test.h1have∀ t ∈ Finset.range n, (2 : ℚ) ^ j - (2 : ℚ) ^ (n + (1 : ℕ) + t) = (-1 : ℚ) * (2 : ℚ) ^ j * ((2 : ℚ) ^ (n - j + t + (1 : ℕ)) - (1 : ℚ))Leaves
(∏ k ∈ Finset.range n, ((2 : ℚ) ^ j - (2 : ℚ) ^ (n + (1 : ℕ) + k))) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = (-1 : ℚ) ^ n * (2 : ℚ) ^ (j * n) * ∏ s ∈ Finset.range ((2 : ℕ) * n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)), withh1 : ∀ t ∈ Finset.range n, (2 : ℚ) ^ j - (2 : ℚ) ^ (n + (1 : ℕ) + t) = (-1 : ℚ) * (2 : ℚ) ^ j * ((2 : ℚ) ^ (n - j + t + (1 : ℕ)) - (1 : ℚ)).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,pow_add.Lean, lines 86–90
have h1 : ∀ t ∈ Finset.range n, ((2 : ℚ) ^ j - 2 ^ (n + 1 + t)) = (-1) * 2 ^ j * (2 ^ ((n - j) + t + 1) - 1) := by intro t _ rw [show n + 1 + t = j + ((n - j) + t + 1) by omega, pow_add] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 86–90 at
df09144aaebf↗
id1_fullhave∀ (n j : ℕ), j ≤ n → (((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K)Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withid1_full : ∀ (n j : ℕ), j ≤ n → (((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.prod_union,mul_right_cancel₀,pow_add.Lean, lines 96–139
have id1_full : ∀ (n j : ℕ) (hj : j ≤ n), (((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * 2 ^ j * ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ j - 2 ^ i) = ∏ K ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ K) := by intro n j hj have hPne : ∀ m : ℕ, ∏ s ∈ Finset.range m, ((2 : ℚ) ^ (s + 1) - 1) ≠ 0 := by intro m refine Finset.prod_ne_zero_iff.mpr (fun s _ => ?_) have : (1 : ℚ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega) linarith have hG1 : ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) = (∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + 1) - 1)) / ((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1)) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + 1) - 1)) := by rw [Finset.prod_div_distrib, ← id1_test n j hj] field_simp [hPne] have hG2 : ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) = (∏ s ∈ Finset.range (2 * n - j), ((2 : ℚ) ^ (s + 1) - 1)) / ((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1)) * ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + 1) - 1)) := by rw [Finset.prod_div_distrib, ← id1_test (2 * n - j) n (by omega), show 2 * n - j - n = n - j by omega] field_simp [hPne] have hsplit : (Finset.range (n + 1)).erase j = Finset.range j ∪ Finset.Ioc j n := by ext x; simp only [Finset.mem_erase, Finset.mem_range, Finset.mem_union, Finset.mem_Ioc]; omega have hdisj : Disjoint (Finset.range j) (Finset.Ioc j n) := by rw [Finset.disjoint_left] intro x hx hx' simp only [Finset.mem_range, Finset.mem_Ioc] at hx hx' omega have hR := rhs_test j n hj obtain ⟨m, rfl⟩ := Nat.exists_eq_add_of_le hj have hsign : (-1 : ℚ) ^ (j + m) = (-1) ^ j * (-1) ^ (j + m - j) := by rw [← pow_add]; congr 1; omega have ha : 2 * (j * (j - 1) / 2) = j * (j - 1) := Nat.two_mul_div_two_of_even (Nat.even_mul_pred_self _) have hexp : j * (j + m) = j * (j - (1 : ℕ)) / (2 : ℕ) + j + j * (j - (1 : ℕ)) / (2 : ℕ) + j * (j + m - j) := by rw [show j + m - j = m by omega] rcases j with _ | i · simp · simp only [Nat.add_sub_cancel] at ha ⊢ nlinarith [ha] rw [hG1, hG2, hsplit, Finset.prod_union hdisj, lower_test, upper_test j (j + m) hj] apply mul_right_cancel₀ (hPne (j + m - j)) rw [hR, hsign, hexp, pow_add, pow_add, pow_add] field_simp [hPne]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 96–139 at
df09144aaebf↗id1_full.hPnehave∀ (m : ℕ), ∏ s ∈ Finset.range m, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) ≠ (0 : ℚ)Leaves
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K), withhPne : ∀ (m : ℕ), ∏ s ∈ Finset.range m, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) ≠ (0 : ℚ).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.prod_ne_zero_iff.Lean, lines 103–107
have hPne : ∀ m : ℕ, ∏ s ∈ Finset.range m, ((2 : ℚ) ^ (s + 1) - 1) ≠ 0 := by intro m refine Finset.prod_ne_zero_iff.mpr (fun s _ => ?_) have : (1 : ℚ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega) linarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 103–107 at
df09144aaebf↗id1_full.hPne.thishave(1 : ℚ) < (2 : ℚ) ^ (s + (1 : ℕ))Leaves
(2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ) ≠ (0 : ℚ), withthis : (1 : ℚ) < (2 : ℚ) ^ (s + (1 : ℕ)).Uses library
one_lt_pow₀.Lean, line 106
have : (1 : ℚ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 106 at
df09144aaebf↗
id1_full.hG1have∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) = (∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) / ((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)))Leaves
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K), withhG1 : ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) = (∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) / ((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.prod_div_distrib.Lean, lines 108–112
have hG1 : ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) = (∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + 1) - 1)) / ((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1)) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + 1) - 1)) := by rw [Finset.prod_div_distrib, ← id1_test n j hj] field_simp [hPne]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 108–112 at
df09144aaebf↗id1_full.hG2have∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) = (∏ s ∈ Finset.range ((2 : ℕ) * n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) / ((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) * ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)))Leaves
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K), withhG2 : ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) = (∏ s ∈ Finset.range ((2 : ℕ) * n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) / ((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) * ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.prod_div_distrib.Lean, lines 113–117
have hG2 : ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) = (∏ s ∈ Finset.range (2 * n - j), ((2 : ℚ) ^ (s + 1) - 1)) / ((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1)) * ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + 1) - 1)) := by rw [Finset.prod_div_distrib, ← id1_test (2 * n - j) n (by omega), show 2 * n - j - n = n - j by omega] field_simp [hPne]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 113–117 at
df09144aaebf↗id1_full.hsplithave(Finset.range (n + (1 : ℕ))).erase j = Finset.range j ∪ Finset.Ioc j nLeaves
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K), withhsplit : (Finset.range (n + (1 : ℕ))).erase j = Finset.range j ∪ Finset.Ioc j n.Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.mem_erase,Finset.mem_range,Finset.mem_union,Finset.mem_Ioc.Lean, lines 118–119
have hsplit : (Finset.range (n + 1)).erase j = Finset.range j ∪ Finset.Ioc j n := by ext x; simp only [Finset.mem_erase, Finset.mem_range, Finset.mem_union, Finset.mem_Ioc]; omegatargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 118–119 at
df09144aaebf↗id1_full.hdisjhaveDisjoint (Finset.range j) (Finset.Ioc j n)Leaves
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K), withhdisj : Disjoint (Finset.range j) (Finset.Ioc j n).Uses library
DisjointTwo elements of a lattice are disjoint if their inf is the bottom element. ,Finset.rangerange nis the set of natural numbers less thann. ,Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.disjoint_left,Finset.mem_range,Finset.mem_Ioc.Lean, lines 120–124
have hdisj : Disjoint (Finset.range j) (Finset.Ioc j n) := by rw [Finset.disjoint_left] intro x hx hx' simp only [Finset.mem_range, Finset.mem_Ioc] at hx hx' omegatargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 120–124 at
df09144aaebf↗id1_full.hRhave(∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = (-1 : ℚ) ^ n * (2 : ℚ) ^ (j * n) * ∏ s ∈ Finset.range ((2 : ℕ) * n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))Leaves
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K), withhR : (∏ K ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ K)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = (-1 : ℚ) ^ n * (2 : ℚ) ^ (j * n) * ∏ s ∈ Finset.range ((2 : ℕ) * n - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)).Lean, line 125
have hR := rhs_test j n hj
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 125 at
df09144aaebf↗id1_full.s7obtain∃ (k : ℕ), n = j + kLeaves
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (j + m - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range (j + m), ((2 : ℚ) ^ ((2 : ℕ) * (j + m) - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (j + m + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc (j + m) ((2 : ℕ) * (j + m)), ((2 : ℚ) ^ j - (2 : ℚ) ^ K), withm : ℕ,hj : j ≤ j + m,hG1 : ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (j + m - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) = (∏ s ∈ Finset.range (j + m), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) / ((∏ s ∈ Finset.range (j + m - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))),hG2 : ∏ i ∈ Finset.range (j + m), ((2 : ℚ) ^ ((2 : ℕ) * (j + m) - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) = (∏ s ∈ Finset.range ((2 : ℕ) * (j + m) - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) / ((∏ s ∈ Finset.range (j + m - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))) * ∏ s ∈ Finset.range (j + m), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ))),hsplit : (Finset.range (j + m + (1 : ℕ))).erase j = Finset.range j ∪ Finset.Ioc j (j + m),hdisj : Disjoint (Finset.range j) (Finset.Ioc j (j + m)),hR : (∏ K ∈ Finset.Ioc (j + m) ((2 : ℕ) * (j + m)), ((2 : ℚ) ^ j - (2 : ℚ) ^ K)) * ∏ s ∈ Finset.range (j + m - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) = (-1 : ℚ) ^ (j + m) * (2 : ℚ) ^ (j * (j + m)) * ∏ s ∈ Finset.range ((2 : ℕ) * (j + m) - j), ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)).Uses library
Nat.exists_eq_add_of_le.Lean, line 126
obtain ⟨m, rfl⟩ := Nat.exists_eq_add_of_le hj
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 126 at
df09144aaebf↗id1_full.hsignhave(-1 : ℚ) ^ (j + m) = (-1 : ℚ) ^ j * (-1 : ℚ) ^ (j + m - j)Leaves
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (j + m - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range (j + m), ((2 : ℚ) ^ ((2 : ℕ) * (j + m) - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (j + m + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc (j + m) ((2 : ℕ) * (j + m)), ((2 : ℚ) ^ j - (2 : ℚ) ^ K), withhsign : (-1 : ℚ) ^ (j + m) = (-1 : ℚ) ^ j * (-1 : ℚ) ^ (j + m - j).Uses library
pow_add.Lean, lines 127–128
have hsign : (-1 : ℚ) ^ (j + m) = (-1) ^ j * (-1) ^ (j + m - j) := by rw [← pow_add]; congr 1; omegatargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 127–128 at
df09144aaebf↗id1_full.hahave(2 : ℕ) * (j * (j - (1 : ℕ)) / (2 : ℕ)) = j * (j - (1 : ℕ))Leaves
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (j + m - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range (j + m), ((2 : ℚ) ^ ((2 : ℕ) * (j + m) - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (j + m + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc (j + m) ((2 : ℕ) * (j + m)), ((2 : ℚ) ^ j - (2 : ℚ) ^ K), withha : (2 : ℕ) * (j * (j - (1 : ℕ)) / (2 : ℕ)) = j * (j - (1 : ℕ)).Uses library
Nat.two_mul_div_two_of_even,Nat.even_mul_pred_self.Lean, line 129
have ha : 2 * (j * (j - 1) / 2) = j * (j - 1) := Nat.two_mul_div_two_of_even (Nat.even_mul_pred_self _)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 129 at
df09144aaebf↗id1_full.hexphavej * (j + m) = j * (j - (1 : ℕ)) / (2 : ℕ) + j + j * (j - (1 : ℕ)) / (2 : ℕ) + j * (j + m - j)Leaves
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (j + m - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range (j + m), ((2 : ℚ) ^ ((2 : ℕ) * (j + m) - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (j + m + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ K ∈ Finset.Ioc (j + m) ((2 : ℕ) * (j + m)), ((2 : ℚ) ^ j - (2 : ℚ) ^ K), withhexp : j * (j + m) = j * (j - (1 : ℕ)) / (2 : ℕ) + j + j * (j - (1 : ℕ)) / (2 : ℕ) + j * (j + m - j).Lean, lines 130–135
have hexp : j * (j + m) = j * (j - (1 : ℕ)) / (2 : ℕ) + j + j * (j - (1 : ℕ)) / (2 : ℕ) + j * (j + m - j) := by rw [show j + m - j = m by omega] rcases j with _ | i · simp · simp only [Nat.add_sub_cancel] at ha ⊢ nlinarith [ha]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 130–135 at
df09144aaebf↗id1_full.hexp.s1case routine: simpLeaves
(0 : ℕ) * ((0 : ℕ) + m) = (0 : ℕ) * ((0 : ℕ) - (1 : ℕ)) / (2 : ℕ) + (0 : ℕ) + (0 : ℕ) * ((0 : ℕ) - (1 : ℕ)) / (2 : ℕ) + (0 : ℕ) * m.id1_full.hexp.s2case routine: simp, nlinarithLeaves
(i + (1 : ℕ)) * (i + (1 : ℕ) + m) = (i + (1 : ℕ)) * (i + (1 : ℕ) - (1 : ℕ)) / (2 : ℕ) + (i + (1 : ℕ)) + (i + (1 : ℕ)) * (i + (1 : ℕ) - (1 : ℕ)) / (2 : ℕ) + (i + (1 : ℕ)) * m.Uses library
Nat.add_sub_cancel.Lean, lines 134–135
· simp only [Nat.add_sub_cancel] at ha ⊢ nlinarith [ha]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 134–135 at
df09144aaebf↗
lagr_evalhave∀ (n : ℕ) (x : ℕ → ℚ), (∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j) → ∀ (N : Polynomial ℚ), N.degree ≤ (↑n : WithBot ℕ) → ∀ (r : ℕ → ℚ), (∀ j ≤ n, r j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (x j - x i) = Polynomial.eval (x j) N) → N = ∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (r j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withlagr_eval : ∀ (n : ℕ) (x : ℕ → ℚ), (∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j) → ∀ (N : Polynomial ℚ), N.degree ≤ (↑n : WithBot ℕ) → ∀ (r : ℕ → ℚ), (∀ j ≤ n, r j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (x j - x i) = Polynomial.eval (x j) N) → N = ∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (r j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i)).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Polynomial.CC ais the constant polynomiala. ,Polynomial.XXis the polynomial variable (aka indeterminate). ,Polynomial.eq_of_degree_sub_lt_of_eval_finset_eq.Lean, lines 142–175
have lagr_eval : ∀ (n : ℕ) (x : ℕ → ℚ) (hx : ∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j) (N : ℚ[X]) (hNdeg : N.degree ≤ n) (r : ℕ → ℚ) (hr : ∀ j ≤ n, r j * ∏ i ∈ (Finset.range (n + 1)).erase j, (x j - x i) = N.eval (x j)), N = ∑ j ∈ Finset.range (n + 1), C (r j) * ∏ i ∈ (Finset.range (n + 1)).erase j, (X - C (x i)) := by intro n x hx N hNdeg r hr have hinj : Set.InjOn x (Finset.range (n + 1) : Set ℕ) := by intro i hi j hj h simp only [Finset.coe_range, Set.mem_Iio] at hi hj exact hx i (by omega) j (by omega) h apply Polynomial.eq_of_degree_sub_lt_of_eval_finset_eq ((Finset.range (n + 1)).image x) · rw [Finset.card_image_of_injOn hinj, Finset.card_range] refine lt_of_le_of_lt (Polynomial.degree_sub_le _ _) (max_lt ?_ ?_) · exact lt_of_le_of_lt hNdeg (by exact_mod_cast Nat.lt_succ_self n) · refine lt_of_le_of_lt (Polynomial.degree_sum_le _ _) ?_ rw [Finset.sup_lt_iff (by exact WithBot.bot_lt_coe _)] intro j hj refine lt_of_le_of_lt (Polynomial.degree_mul_le _ _) ?_ refine lt_of_le_of_lt (add_le_add (Polynomial.degree_C_le) (Polynomial.degree_prod_le _ _)) ?_ have : ∑ i ∈ (Finset.range (n + 1)).erase j, (X - C (x i)).degree = ((n : ℕ) : WithBot ℕ) := by rw [Finset.sum_congr rfl (fun i _ => Polynomial.degree_X_sub_C (x i)), Finset.sum_const, Finset.card_erase_of_mem hj, Finset.card_range, Nat.add_sub_cancel] simp rw [this, zero_add] exact_mod_cast Nat.lt_succ_self n · intro y hy obtain ⟨k, hk, rfl⟩ := Finset.mem_image.mp hy have hk' : k ≤ n := by have := Finset.mem_range.mp hk; omega rw [← hr k hk', Polynomial.eval_finset_sum, Finset.sum_eq_single k] · simp [Polynomial.eval_prod] · intro j hj hjk simp only [Polynomial.eval_mul, Polynomial.eval_C, Polynomial.eval_prod, Polynomial.eval_sub, Polynomial.eval_X] rw [Finset.prod_eq_zero (i := k) (Finset.mem_erase.mpr ⟨Ne.symm hjk, hk⟩) (by ring), mul_zero] · intro h; exact absurd hk htargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 142–175 at
df09144aaebf↗lagr_eval.hinjhaveSet.InjOn x (↑(Finset.range (n + (1 : ℕ))) : Set ℕ)Leaves
N = ∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (r j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i)), withhinj : Set.InjOn x (↑(Finset.range (n + (1 : ℕ))) : Set ℕ).Uses library
Set.InjOnfis injective onsif the restriction offtosis injective. ,Finset.rangerange nis the set of natural numbers less thann. ,SetA set is a collection of elements of some typeα. ,Finset.coe_range,Set.mem_Iio.Lean, lines 147–150
have hinj : Set.InjOn x (Finset.range (n + 1) : Set ℕ) := by intro i hi j hj h simp only [Finset.coe_range, Set.mem_Iio] at hi hj exact hx i (by omega) j (by omega) htargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 147–150 at
df09144aaebf↗lagr_eval.s2caseLeaves
(N - ∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (r j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))).degree < (↑(Finset.image x (Finset.range (n + (1 : ℕ)))).card : WithBot ℕ).Uses library
Finset.card_image_of_injOn,Finset.card_range,lt_of_le_of_lt,Polynomial.degree_sub_le,max_lt.Lean, lines 152–165
· rw [Finset.card_image_of_injOn hinj, Finset.card_range] refine lt_of_le_of_lt (Polynomial.degree_sub_le _ _) (max_lt ?_ ?_) · exact lt_of_le_of_lt hNdeg (by exact_mod_cast Nat.lt_succ_self n) · refine lt_of_le_of_lt (Polynomial.degree_sum_le _ _) ?_ rw [Finset.sup_lt_iff (by exact WithBot.bot_lt_coe _)] intro j hj refine lt_of_le_of_lt (Polynomial.degree_mul_le _ _) ?_ refine lt_of_le_of_lt (add_le_add (Polynomial.degree_C_le) (Polynomial.degree_prod_le _ _)) ?_ have : ∑ i ∈ (Finset.range (n + 1)).erase j, (X - C (x i)).degree = ((n : ℕ) : WithBot ℕ) := by rw [Finset.sum_congr rfl (fun i _ => Polynomial.degree_X_sub_C (x i)), Finset.sum_const, Finset.card_erase_of_mem hj, Finset.card_range, Nat.add_sub_cancel] simp rw [this, zero_add] exact_mod_cast Nat.lt_succ_self ntargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 152–165 at
df09144aaebf↗lagr_eval.s2.s1caseLeaves
N.degree < (↑(n + (1 : ℕ)) : WithBot ℕ).Uses library
lt_of_le_of_lt,Nat.lt_succ_self.Lean, line 154
· exact lt_of_le_of_lt hNdeg (by exact_mod_cast Nat.lt_succ_self n)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 154 at
df09144aaebf↗lagr_eval.s2.s2caseLeaves
(∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (r j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))).degree < (↑(n + (1 : ℕ)) : WithBot ℕ).Uses library
lt_of_le_of_lt,Polynomial.degree_sum_le,Finset.sup_lt_iff,WithBot.bot_lt_coe,Polynomial.degree_mul_le,add_le_add,Polynomial.degree_C_le,Polynomial.degree_prod_le,zero_add,Nat.lt_succ_self.Lean, lines 155–165
· refine lt_of_le_of_lt (Polynomial.degree_sum_le _ _) ?_ rw [Finset.sup_lt_iff (by exact WithBot.bot_lt_coe _)] intro j hj refine lt_of_le_of_lt (Polynomial.degree_mul_le _ _) ?_ refine lt_of_le_of_lt (add_le_add (Polynomial.degree_C_le) (Polynomial.degree_prod_le _ _)) ?_ have : ∑ i ∈ (Finset.range (n + 1)).erase j, (X - C (x i)).degree = ((n : ℕ) : WithBot ℕ) := by rw [Finset.sum_congr rfl (fun i _ => Polynomial.degree_X_sub_C (x i)), Finset.sum_const, Finset.card_erase_of_mem hj, Finset.card_range, Nat.add_sub_cancel] simp rw [this, zero_add] exact_mod_cast Nat.lt_succ_self ntargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 155–165 at
df09144aaebf↗lagr_eval.s2.s2.thishave∑ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i)).degree = (↑n : WithBot ℕ)Leaves
(0 : WithBot ℕ) + ∑ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i)).degree < (↑(n + (1 : ℕ)) : WithBot ℕ), withthis : ∑ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i)).degree = (↑n : WithBot ℕ).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Polynomial.XXis the polynomial variable (aka indeterminate). ,Polynomial.CC ais the constant polynomiala. ,WithBotAttach⊥to a type. ,Finset.sum_congr,rflrfl : a = ais the unique constructor of the equality type. ,Polynomial.degree_X_sub_C,Finset.sum_const,Finset.card_erase_of_mem$\#(s \setminus \{a\}) = \#s - 1$ if $a \in s$. ,Finset.card_range,Nat.add_sub_cancel.Lean, lines 160–163
have : ∑ i ∈ (Finset.range (n + 1)).erase j, (X - C (x i)).degree = ((n : ℕ) : WithBot ℕ) := by rw [Finset.sum_congr rfl (fun i _ => Polynomial.degree_X_sub_C (x i)), Finset.sum_const, Finset.card_erase_of_mem hj, Finset.card_range, Nat.add_sub_cancel] simptargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 160–163 at
df09144aaebf↗
lagr_eval.s3caseLeaves
∀ x_1 ∈ Finset.image x (Finset.range (n + (1 : ℕ))), Polynomial.eval x_1 N = Polynomial.eval x_1 (∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (r j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))).Uses library
Polynomial.eval_finset_sumAlias ofPolynomial.eval_finsetSum. ,Finset.sum_eq_single.Lean, lines 166–175
· intro y hy obtain ⟨k, hk, rfl⟩ := Finset.mem_image.mp hy have hk' : k ≤ n := by have := Finset.mem_range.mp hk; omega rw [← hr k hk', Polynomial.eval_finset_sum, Finset.sum_eq_single k] · simp [Polynomial.eval_prod] · intro j hj hjk simp only [Polynomial.eval_mul, Polynomial.eval_C, Polynomial.eval_prod, Polynomial.eval_sub, Polynomial.eval_X] rw [Finset.prod_eq_zero (i := k) (Finset.mem_erase.mpr ⟨Ne.symm hjk, hk⟩) (by ring), mul_zero] · intro h; exact absurd hk htargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 166–175 at
df09144aaebf↗lagr_eval.s3.s1obtain∃ a ∈ Finset.range (n + (1 : ℕ)), x a = yLeaves
Polynomial.eval (x k) N = Polynomial.eval (x k) (∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (r j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))), withk : ℕ,hk : k ∈ Finset.range (n + (1 : ℕ)),hy : x k ∈ Finset.image x (Finset.range (n + (1 : ℕ))).Uses library
Finset.mem_image.Lean, line 167
obtain ⟨k, hk, rfl⟩ := Finset.mem_image.mp hy
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 167 at
df09144aaebf↗lagr_eval.s3.hk'havek ≤ nLeaves
Polynomial.eval (x k) N = Polynomial.eval (x k) (∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (r j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))), withhk' : k ≤ n.Lean, line 168
have hk' : k ≤ n := by have := Finset.mem_range.mp hk; omega
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 168 at
df09144aaebf↗lagr_eval.s3.hk'.thishavek < n + (1 : ℕ)Leaves
k ≤ n, withthis : k < n + (1 : ℕ).Uses library
Finset.mem_range.Lean, line 168
have hk' : k ≤ n := by have := Finset.mem_range.mp hk; omega
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 168 at
df09144aaebf↗
lagr_eval.s3.s3case routine: simpLeaves
r k * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase k, (x k - x i) = Polynomial.eval (x k) ((Polynomial.C : ℚ → Polynomial ℚ) (r k) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase k, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))).Uses library
Polynomial.eval_prodPolynomial evaluation commutes withFinset.prod.Lean, line 170
· simp [Polynomial.eval_prod]
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 170 at
df09144aaebf↗lagr_eval.s3.s4caseLeaves
∀ b ∈ Finset.range (n + (1 : ℕ)), b ≠ k → Polynomial.eval (x k) ((Polynomial.C : ℚ → Polynomial ℚ) (r b) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase b, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))) = (0 : ℚ).Uses library
Polynomial.eval_mul,Polynomial.eval_C,Polynomial.eval_prodPolynomial evaluation commutes withFinset.prod,Polynomial.eval_sub,Polynomial.eval_X,Finset.prod_eq_zero,Finset.mem_erase,And.introAnd.intro : a → b → a ∧ bis the constructor for the And operation. ,Ne.symm,MulZeroClass.mul_zeroZero is a right absorbing element for multiplication .Lean, lines 171–174
· intro j hj hjk simp only [Polynomial.eval_mul, Polynomial.eval_C, Polynomial.eval_prod, Polynomial.eval_sub, Polynomial.eval_X] rw [Finset.prod_eq_zero (i := k) (Finset.mem_erase.mpr ⟨Ne.symm hjk, hk⟩) (by ring), mul_zero]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 171–174 at
df09144aaebf↗lagr_eval.s3.s5caseLeaves
k ∉ Finset.range (n + (1 : ℕ)) → Polynomial.eval (x k) ((Polynomial.C : ℚ → Polynomial ℚ) (r k) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase k, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))) = (0 : ℚ).Uses library
absurdAnything follows from two contradictory hypotheses. .Lean, line 175
· intro h; exact absurd hk h
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 175 at
df09144aaebf↗
tail_coeffhave∀ (n K : ℕ), n < K → ∀ (Qc : ℕ → ℕ → ℚ), (∀ j ≤ n, Qc n j * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ L)) → ∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i)Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withtail_coeff : ∀ (n K : ℕ), n < K → ∀ (Qc : ℕ → ℕ → ℚ), (∀ j ≤ n, Qc n j * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ L)) → ∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Polynomial.XXis the polynomial variable (aka indeterminate). ,Polynomial.CC ais the constant polynomiala. ,Polynomial.eval_finset_sumAlias ofPolynomial.eval_finsetSum. ,Finset.sum_div,Finset.sum_congr,rflrfl : a = ais the unique constructor of the equality type. ,Polynomial.eval_mul,Polynomial.eval_C,Polynomial.eval_prodPolynomial evaluation commutes withFinset.prod,Polynomial.eval_sub,Polynomial.eval_X,Finset.mul_prod_eraseTaking a product overs : Finset ιis the same as multiplying the value on a single elementf aby the product ofs.erase a. .Lean, lines 177–229
have tail_coeff : ∀ (n K : ℕ) (hK : n < K) (Qc : ℕ → ℕ → ℚ) (hQc : ∀ j ≤ n, Qc n j * 2 ^ j * ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ j - 2 ^ i) = ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ L)), ∑ j ∈ Finset.range (n + 1), Qc n j / ((2 : ℚ) ^ (K - j) - 1) = (∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℚ) ^ K - 2 ^ i) := by intro n K hK Qc hQc set x : ℕ → ℚ := fun i => (2 : ℚ) ^ i with hxdef have hxinj : ∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j := by intro i _ j _ h have h' : (2 : ℚ) ^ i = 2 ^ j := h exact Nat.pow_right_injective (le_refl 2) (by exact_mod_cast h') have hxne : ∀ a b : ℕ, a ≠ b → (2 : ℚ) ^ a - 2 ^ b ≠ 0 := by intro a b hab h apply hab exact Nat.pow_right_injective (le_refl 2) (by exact_mod_cast (sub_eq_zero.mp h)) set N : ℚ[X] := ∏ L ∈ Finset.Ioc n (2 * n), (X - C ((2 : ℚ) ^ L)) with hN have hNdeg : N.degree ≤ n := by rw [hN, Polynomial.degree_prod] rw [Finset.sum_congr rfl (fun L _ => Polynomial.degree_X_sub_C ((2 : ℚ) ^ L)), Finset.sum_const, Nat.card_Ioc] simp omega have hr : ∀ j ≤ n, (Qc n j * 2 ^ j) * ∏ i ∈ (Finset.range (n + 1)).erase j, (x j - x i) = N.eval (x j) := by intro j hj rw [hN, Polynomial.eval_prod] simp only [Polynomial.eval_sub, Polynomial.eval_X, Polynomial.eval_C, hxdef] exact hQc j hj have hL := lagr_eval n x hxinj N hNdeg (fun j => Qc n j * 2 ^ j) hr have hev := congrArg (Polynomial.eval ((2 : ℚ) ^ K)) hL rw [Polynomial.eval_finset_sum] at hev have hNK : N.eval ((2 : ℚ) ^ K) = ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ K - 2 ^ L) := by rw [hN, Polynomial.eval_prod] simp only [Polynomial.eval_sub, Polynomial.eval_X, Polynomial.eval_C] have hD : ∏ i ∈ Finset.range (n + 1), ((2 : ℚ) ^ K - 2 ^ i) ≠ 0 := Finset.prod_ne_zero_iff.mpr (fun i hi => hxne K i (by have := Finset.mem_range.mp hi; omega)) rw [hNK] at hev rw [hev, Finset.sum_div] refine Finset.sum_congr rfl (fun j hj => ?_) have hjn : j < n + 1 := Finset.mem_range.mp hj have hne1 : (2 : ℚ) ^ K - 2 ^ j ≠ 0 := hxne K j (by omega) have hne2 : (2 : ℚ) ^ (K - j) - 1 ≠ 0 := by have : (1 : ℚ) < 2 ^ (K - j) := one_lt_pow₀ (by norm_num) (by omega) linarith simp only [Polynomial.eval_mul, Polynomial.eval_C, Polynomial.eval_prod, Polynomial.eval_sub, Polynomial.eval_X, hxdef] rw [← Finset.mul_prod_erase (Finset.range (n + 1)) (fun i => (2 : ℚ) ^ K - 2 ^ i) hj] have hE : ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ K - 2 ^ i) ≠ 0 := Finset.prod_ne_zero_iff.mpr (fun i hi => hxne K i (by have := Finset.mem_range.mp (Finset.mem_of_mem_erase hi); omega)) have hpow : (2 : ℚ) ^ K = 2 ^ j * 2 ^ (K - j) := by rw [← pow_add]; congr 1; omega field_simp rw [hpow] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 177–229 at
df09144aaebf↗tail_coeff.hxinjhave∀ i ≤ n, ∀ j ≤ n, x i = x j → i = jLeaves
∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i), withhxinj : ∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j.Uses library
Nat.pow_right_injective,le_reflThe relation≤on a preorder is reflexive. .Lean, lines 184–187
have hxinj : ∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j := by intro i _ j _ h have h' : (2 : ℚ) ^ i = 2 ^ j := h exact Nat.pow_right_injective (le_refl 2) (by exact_mod_cast h')targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 184–187 at
df09144aaebf↗tail_coeff.hxinj.h'have(2 : ℚ) ^ i = (2 : ℚ) ^ jLeaves
i = j, withh' : (2 : ℚ) ^ i = (2 : ℚ) ^ j.Lean, line 186
have h' : (2 : ℚ) ^ i = 2 ^ j := h
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 186 at
df09144aaebf↗
tail_coeff.hxnehave∀ (a b : ℕ), a ≠ b → (2 : ℚ) ^ a - (2 : ℚ) ^ b ≠ (0 : ℚ)Leaves
∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i), withhxne : ∀ (a b : ℕ), a ≠ b → (2 : ℚ) ^ a - (2 : ℚ) ^ b ≠ (0 : ℚ).Uses library
Nat.pow_right_injective,le_reflThe relation≤on a preorder is reflexive. ,sub_eq_zero.Lean, lines 188–191
have hxne : ∀ a b : ℕ, a ≠ b → (2 : ℚ) ^ a - 2 ^ b ≠ 0 := by intro a b hab h apply hab exact Nat.pow_right_injective (le_refl 2) (by exact_mod_cast (sub_eq_zero.mp h))targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 188–191 at
df09144aaebf↗tail_coeff.hNdeghaveN.degree ≤ (↑n : WithBot ℕ)Leaves
∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i), withhNdeg : N.degree ≤ (↑n : WithBot ℕ).Uses library
Polynomial.degree_prodThe degree of a product of polynomials is equal to the sum of the degrees, where the degree of the zero polynomial is ⊥. ,Finset.sum_congr,rflrfl : a = ais the unique constructor of the equality type. ,Polynomial.degree_X_sub_C,Finset.sum_const,Nat.card_Ioc.Lean, lines 193–198
have hNdeg : N.degree ≤ n := by rw [hN, Polynomial.degree_prod] rw [Finset.sum_congr rfl (fun L _ => Polynomial.degree_X_sub_C ((2 : ℚ) ^ L)), Finset.sum_const, Nat.card_Ioc] simp omegatargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 193–198 at
df09144aaebf↗tail_coeff.hrhave∀ j ≤ n, Qc n j * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (x j - x i) = Polynomial.eval (x j) NLeaves
∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i), withhr : ∀ j ≤ n, Qc n j * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (x j - x i) = Polynomial.eval (x j) N.Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Polynomial.eval_prodPolynomial evaluation commutes withFinset.prod,Polynomial.eval_sub,Polynomial.eval_X,Polynomial.eval_C.Lean, lines 199–203
have hr : ∀ j ≤ n, (Qc n j * 2 ^ j) * ∏ i ∈ (Finset.range (n + 1)).erase j, (x j - x i) = N.eval (x j) := by intro j hj rw [hN, Polynomial.eval_prod] simp only [Polynomial.eval_sub, Polynomial.eval_X, Polynomial.eval_C, hxdef] exact hQc j hjtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 199–203 at
df09144aaebf↗tail_coeff.hLhaveN = ∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (Qc n j * (2 : ℚ) ^ j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))Leaves
∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i), withhL : N = ∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (Qc n j * (2 : ℚ) ^ j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i)).Lean, line 204
have hL := lagr_eval n x hxinj N hNdeg (fun j => Qc n j * 2 ^ j) hr
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 204 at
df09144aaebf↗tail_coeff.hevhavePolynomial.eval ((2 : ℚ) ^ K) N = Polynomial.eval ((2 : ℚ) ^ K) (∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (Qc n j * (2 : ℚ) ^ j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i)))Leaves
∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i), withhev : Polynomial.eval ((2 : ℚ) ^ K) N = Polynomial.eval ((2 : ℚ) ^ K) (∑ j ∈ Finset.range (n + (1 : ℕ)), (Polynomial.C : ℚ → Polynomial ℚ) (Qc n j * (2 : ℚ) ^ j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))).Uses library
congrArgCongruence in the function argument: ifa₁ = a₂thenf a₁ = f a₂for any (nondependent) functionf. ,Polynomial.evaleval x pis the evaluation of the polynomialpatx.Lean, line 205
have hev := congrArg (Polynomial.eval ((2 : ℚ) ^ K)) hL
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 205 at
df09144aaebf↗tail_coeff.hNKhavePolynomial.eval ((2 : ℚ) ^ K) N = ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L)Leaves
∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i), withhNK : Polynomial.eval ((2 : ℚ) ^ K) N = ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L).Uses library
Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Polynomial.eval_prodPolynomial evaluation commutes withFinset.prod,Polynomial.eval_sub,Polynomial.eval_X,Polynomial.eval_C.Lean, lines 207–209
have hNK : N.eval ((2 : ℚ) ^ K) = ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ K - 2 ^ L) := by rw [hN, Polynomial.eval_prod] simp only [Polynomial.eval_sub, Polynomial.eval_X, Polynomial.eval_C]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 207–209 at
df09144aaebf↗tail_coeff.hDhave∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i) ≠ (0 : ℚ)Leaves
∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i), withhD : ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i) ≠ (0 : ℚ).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.prod_ne_zero_iff.Lean, lines 210–211
have hD : ∏ i ∈ Finset.range (n + 1), ((2 : ℚ) ^ K - 2 ^ i) ≠ 0 := Finset.prod_ne_zero_iff.mpr (fun i hi => hxne K i (by have := Finset.mem_range.mp hi; omega))targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 210–211 at
df09144aaebf↗tail_coeff.hD.thishavei < n + (1 : ℕ)Leaves
K ≠ i, withthis : i < n + (1 : ℕ).Uses library
Finset.mem_range.Lean, line 211
Finset.prod_ne_zero_iff.mpr (fun i hi => hxne K i (by have := Finset.mem_range.mp hi; omega))
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 211 at
df09144aaebf↗
tail_coeff.hjnhavej < n + (1 : ℕ)Leaves
Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = Polynomial.eval ((2 : ℚ) ^ K) ((Polynomial.C : ℚ → Polynomial ℚ) (Qc n j * (2 : ℚ) ^ j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i), withhjn : j < n + (1 : ℕ).Uses library
Finset.mem_range.Lean, line 215
have hjn : j < n + 1 := Finset.mem_range.mp hj
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 215 at
df09144aaebf↗tail_coeff.hne1have(2 : ℚ) ^ K - (2 : ℚ) ^ j ≠ (0 : ℚ)Leaves
Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = Polynomial.eval ((2 : ℚ) ^ K) ((Polynomial.C : ℚ → Polynomial ℚ) (Qc n j * (2 : ℚ) ^ j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i), withhne1 : (2 : ℚ) ^ K - (2 : ℚ) ^ j ≠ (0 : ℚ).Lean, line 216
have hne1 : (2 : ℚ) ^ K - 2 ^ j ≠ 0 := hxne K j (by omega)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 216 at
df09144aaebf↗tail_coeff.hne2have(2 : ℚ) ^ (K - j) - (1 : ℚ) ≠ (0 : ℚ)Leaves
Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = Polynomial.eval ((2 : ℚ) ^ K) ((Polynomial.C : ℚ → Polynomial ℚ) (Qc n j * (2 : ℚ) ^ j) * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i))) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i), withhne2 : (2 : ℚ) ^ (K - j) - (1 : ℚ) ≠ (0 : ℚ).Lean, lines 217–219
have hne2 : (2 : ℚ) ^ (K - j) - 1 ≠ 0 := by have : (1 : ℚ) < 2 ^ (K - j) := one_lt_pow₀ (by norm_num) (by omega) linarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 217–219 at
df09144aaebf↗tail_coeff.hne2.thishave(1 : ℚ) < (2 : ℚ) ^ (K - j)Leaves
(2 : ℚ) ^ (K - j) - (1 : ℚ) ≠ (0 : ℚ), withthis : (1 : ℚ) < (2 : ℚ) ^ (K - j).Uses library
one_lt_pow₀.Lean, line 218
have : (1 : ℚ) < 2 ^ (K - j) := one_lt_pow₀ (by norm_num) (by omega)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 218 at
df09144aaebf↗
tail_coeff.hEhave∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ K - (2 : ℚ) ^ i) ≠ (0 : ℚ)Leaves
Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (Qc n j * (2 : ℚ) ^ j * ∏ x ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ K - (2 : ℚ) ^ x)) / (((2 : ℚ) ^ K - (2 : ℚ) ^ j) * ∏ x ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ K - (2 : ℚ) ^ x)), withhE : ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ K - (2 : ℚ) ^ i) ≠ (0 : ℚ).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.prod_ne_zero_iff.Lean, lines 223–225
have hE : ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ K - 2 ^ i) ≠ 0 := Finset.prod_ne_zero_iff.mpr (fun i hi => hxne K i (by have := Finset.mem_range.mp (Finset.mem_of_mem_erase hi); omega))targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 223–225 at
df09144aaebf↗tail_coeff.hE.thishavei < n + (1 : ℕ)Leaves
K ≠ i, withthis : i < n + (1 : ℕ).Uses library
Finset.mem_range,Finset.mem_of_mem_erase.Lean, line 225
have := Finset.mem_range.mp (Finset.mem_of_mem_erase hi); omega))
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 225 at
df09144aaebf↗
tail_coeff.hpowhave(2 : ℚ) ^ K = (2 : ℚ) ^ j * (2 : ℚ) ^ (K - j)Leaves
Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ)) = (Qc n j * (2 : ℚ) ^ j * ∏ x ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ K - (2 : ℚ) ^ x)) / (((2 : ℚ) ^ K - (2 : ℚ) ^ j) * ∏ x ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ K - (2 : ℚ) ^ x)), withhpow : (2 : ℚ) ^ K = (2 : ℚ) ^ j * (2 : ℚ) ^ (K - j).Uses library
pow_add.Lean, line 226
have hpow : (2 : ℚ) ^ K = 2 ^ j * 2 ^ (K - j) := by rw [← pow_add]; congr 1; omega
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 226 at
df09144aaebf↗
tail3have∀ (n : ℕ), (1 : ℕ) ≤ n → ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withtail3 : ∀ (n : ℕ), (1 : ℕ) ≤ n → ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)).Uses library
tsum_congr.Lean, lines 232–296
have tail3 : ∀ (n : ℕ) (hn : 1 ≤ n), ∑' m : ℕ, (3 : ℝ) / (2 ^ (m + n + 1) - 3) = ∑' s : ℕ, ((3 : ℝ) / 2 ^ n) ^ (s + 1) / (2 ^ (s + 1) - 1) := by intro n hn set f : ℕ → ℕ → ℝ := fun m s => ((3 : ℝ) / 2 ^ (n + 1)) ^ (s + 1) * ((1 : ℝ) / 2 ^ (s + 1)) ^ m with hf have key : ∀ m s, f m s = ((3 : ℝ) / 2 ^ (m + n + 1)) ^ (s + 1) := by intro m s simp only [hf] rw [div_pow, div_pow, div_pow, one_pow, ← pow_mul, ← pow_mul, ← pow_mul, show (m + n + 1) * (s + 1) = (n + 1) * (s + 1) + (s + 1) * m by ring, pow_add] field_simp exact pow_add _ _ _ have hpos : ∀ m s, 0 ≤ f m s := fun m s => by rw [key]; positivity have h4 : ∀ m : ℕ, (4 : ℝ) ≤ 2 ^ (m + n + 1) := by intro m calc (4 : ℝ) = 2 ^ 2 := by norm_num _ ≤ 2 ^ (m + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega) have inner1 : ∀ m, HasSum (f m) ((3 : ℝ) / (2 ^ (m + n + 1) - 3)) := by intro m have hr0 : 0 ≤ (3 : ℝ) / 2 ^ (m + n + 1) := by positivity have hr1 : (3 : ℝ) / 2 ^ (m + n + 1) < 1 := by rw [div_lt_one (by positivity)]; linarith [h4 m] have hg := (hasSum_geometric_of_lt_one hr0 hr1).mul_left ((3 : ℝ) / 2 ^ (m + n + 1)) have hfun : f m = fun s => (3 : ℝ) / 2 ^ (m + n + 1) * ((3 : ℝ) / 2 ^ (m + n + 1)) ^ s := by funext s; rw [key]; ring have hne : (2 : ℝ) ^ (m + n + 1) - 3 ≠ 0 := by linarith [h4 m] have hne2 : (2 : ℝ) ^ (m + n + 1) ≠ 0 := by positivity have hval : (3 : ℝ) / (2 ^ (m + n + 1) - 3) = 3 / 2 ^ (m + n + 1) * (1 - 3 / 2 ^ (m + n + 1))⁻¹ := by field_simp rw [hfun, hval] exact hg have inner2 : ∀ s, HasSum (fun m => f m s) (((3 : ℝ) / 2 ^ n) ^ (s + 1) / (2 ^ (s + 1) - 1)) := by intro s have hr0 : 0 ≤ (1 : ℝ) / 2 ^ (s + 1) := by positivity have hr1 : (1 : ℝ) / 2 ^ (s + 1) < 1 := by rw [div_lt_one (by positivity)] exact one_lt_pow₀ (by norm_num) (by omega) have hg := (hasSum_geometric_of_lt_one hr0 hr1).mul_left (((3 : ℝ) / 2 ^ (n + 1)) ^ (s + 1)) have hne : (2 : ℝ) ^ (s + 1) - 1 ≠ 0 := by have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega) linarith have hval : ((3 : ℝ) / 2 ^ n) ^ (s + 1) / (2 ^ (s + 1) - 1) = ((3 : ℝ) / 2 ^ (n + 1)) ^ (s + 1) * (1 - 1 / 2 ^ (s + 1))⁻¹ := by rw [div_pow, div_pow, ← pow_mul, ← pow_mul, show (n + 1) * (s + 1) = n * (s + 1) + (s + 1) by ring, pow_add] field_simp exact pow_add _ _ _ rw [hval] exact hg have hsum1 : Summable (fun m : ℕ => (3 : ℝ) / (2 ^ (m + n + 1) - 3)) := by refine Summable.of_nonneg_of_le (fun m => ?_) (fun m => ?_) ((summable_geometric_two).mul_left 3) · have := h4 m; exact div_nonneg (by norm_num) (by linarith) · have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega) have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num) have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring calc (3 : ℝ) / (2 ^ (m + n + 1) - 3) ≤ 3 / 2 ^ m := div_le_div_of_nonneg_left (by norm_num) (by positivity) (by linarith) _ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ring have hU : Summable (Function.uncurry f) := by refine (summable_prod_of_nonneg (fun p => hpos p.1 p.2)).mpr ⟨fun m => (inner1 m).summable, ?_⟩ exact hsum1.congr (fun m => ((inner1 m).tsum_eq).symm) have hcomm := hU.tsum_comm' (fun m => (inner1 m).summable) (fun s => (inner2 s).summable) rw [show (∑' m : ℕ, (3 : ℝ) / (2 ^ (m + n + 1) - 3)) = ∑' m, ∑' s, f m s from tsum_congr (fun m => ((inner1 m).tsum_eq).symm)] rw [← hcomm] exact tsum_congr (fun s => (inner2 s).tsum_eq)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 232–296 at
df09144aaebf↗tail3.keyhave∀ (m s : ℕ), f m s = ((3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ))) ^ (s + (1 : ℕ))Leaves
∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), withkey : ∀ (m s : ℕ), f m s = ((3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ))) ^ (s + (1 : ℕ)).Uses library
div_pow,one_pow,pow_mul,pow_add.Lean, lines 236–242
have key : ∀ m s, f m s = ((3 : ℝ) / 2 ^ (m + n + 1)) ^ (s + 1) := by intro m s simp only [hf] rw [div_pow, div_pow, div_pow, one_pow, ← pow_mul, ← pow_mul, ← pow_mul, show (m + n + 1) * (s + 1) = (n + 1) * (s + 1) + (s + 1) * m by ring, pow_add] field_simp exact pow_add _ _ _targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 236–242 at
df09144aaebf↗tail3.hposhave∀ (m s : ℕ), (0 : ℝ) ≤ f m sLeaves
∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), withhpos : ∀ (m s : ℕ), (0 : ℝ) ≤ f m s.Lean, line 243
have hpos : ∀ m s, 0 ≤ f m s := fun m s => by rw [key]; positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 243 at
df09144aaebf↗tail3.h4have∀ (m : ℕ), (4 : ℝ) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ))Leaves
∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), withh4 : ∀ (m : ℕ), (4 : ℝ) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ)).Lean, lines 244–247
have h4 : ∀ m : ℕ, (4 : ℝ) ≤ 2 ^ (m + n + 1) := by intro m calc (4 : ℝ) = 2 ^ 2 := by norm_num _ ≤ 2 ^ (m + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 244–247 at
df09144aaebf↗tail3.h4.s1calc(4 : ℝ) = (2 : ℝ) ^ (2 : ℕ)routine: norm_numCloses the goal.
Lean, line 246
calc (4 : ℝ) = 2 ^ 2 := by norm_num
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 246 at
df09144aaebf↗tail3.h4.s2calc(2 : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ))Closes the goal.
Uses library
pow_le_pow_right₀.Lean, line 247
_ ≤ 2 ^ (m + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 247 at
df09144aaebf↗
tail3.inner1have∀ (m : ℕ), HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)))Leaves
∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), withinner1 : ∀ (m : ℕ), HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))).Uses library
HasSumHasSum f a Lmeans that the (potentially infinite) sum of thef bforb : βconverges toaalong the SummationFilterL. .Lean, lines 248–262
have inner1 : ∀ m, HasSum (f m) ((3 : ℝ) / (2 ^ (m + n + 1) - 3)) := by intro m have hr0 : 0 ≤ (3 : ℝ) / 2 ^ (m + n + 1) := by positivity have hr1 : (3 : ℝ) / 2 ^ (m + n + 1) < 1 := by rw [div_lt_one (by positivity)]; linarith [h4 m] have hg := (hasSum_geometric_of_lt_one hr0 hr1).mul_left ((3 : ℝ) / 2 ^ (m + n + 1)) have hfun : f m = fun s => (3 : ℝ) / 2 ^ (m + n + 1) * ((3 : ℝ) / 2 ^ (m + n + 1)) ^ s := by funext s; rw [key]; ring have hne : (2 : ℝ) ^ (m + n + 1) - 3 ≠ 0 := by linarith [h4 m] have hne2 : (2 : ℝ) ^ (m + n + 1) ≠ 0 := by positivity have hval : (3 : ℝ) / (2 ^ (m + n + 1) - 3) = 3 / 2 ^ (m + n + 1) * (1 - 3 / 2 ^ (m + n + 1))⁻¹ := by field_simp rw [hfun, hval] exact hgtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 248–262 at
df09144aaebf↗tail3.inner1.hr0have(0 : ℝ) ≤ (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ))routine: positivityLeaves
HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), withhr0 : (0 : ℝ) ≤ (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)).Lean, line 250
have hr0 : 0 ≤ (3 : ℝ) / 2 ^ (m + n + 1) := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 250 at
df09144aaebf↗tail3.inner1.hr1have(3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) < (1 : ℝ)Leaves
HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), withhr1 : (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) < (1 : ℝ).Uses library
div_lt_one.Lean, lines 251–252
have hr1 : (3 : ℝ) / 2 ^ (m + n + 1) < 1 := by rw [div_lt_one (by positivity)]; linarith [h4 m]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 251–252 at
df09144aaebf↗tail3.inner1.hghaveHasSum (fun (i : ℕ) => (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ))) ^ i) ((3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((1 : ℝ) - (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)))⁻¹)Leaves
HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), withhg : HasSum (fun (i : ℕ) => (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ))) ^ i) ((3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((1 : ℝ) - (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)))⁻¹).Uses library
hasSum_geometric_of_lt_one.Lean, line 253
have hg := (hasSum_geometric_of_lt_one hr0 hr1).mul_left ((3 : ℝ) / 2 ^ (m + n + 1))
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 253 at
df09144aaebf↗tail3.inner1.hfunhavef m = fun (s : ℕ) => (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ))) ^ sLeaves
HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), withhfun : f m = fun (s : ℕ) => (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ))) ^ s.Lean, lines 254–255
have hfun : f m = fun s => (3 : ℝ) / 2 ^ (m + n + 1) * ((3 : ℝ) / 2 ^ (m + n + 1)) ^ s := by funext s; rw [key]; ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 254–255 at
df09144aaebf↗tail3.inner1.hnehave(2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ) ≠ (0 : ℝ)routine: linarithLeaves
HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), withhne : (2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ) ≠ (0 : ℝ).Lean, line 256
have hne : (2 : ℝ) ^ (m + n + 1) - 3 ≠ 0 := by linarith [h4 m]
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 256 at
df09144aaebf↗tail3.inner1.hne2have(2 : ℝ) ^ (m + n + (1 : ℕ)) ≠ (0 : ℝ)routine: positivityLeaves
HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), withhne2 : (2 : ℝ) ^ (m + n + (1 : ℕ)) ≠ (0 : ℝ).Lean, line 257
have hne2 : (2 : ℝ) ^ (m + n + 1) ≠ 0 := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 257 at
df09144aaebf↗tail3.inner1.hvalhave(3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((1 : ℝ) - (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)))⁻¹routine: field_simpLeaves
HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), withhval : (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((1 : ℝ) - (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)))⁻¹.Lean, lines 258–260
have hval : (3 : ℝ) / (2 ^ (m + n + 1) - 3) = 3 / 2 ^ (m + n + 1) * (1 - 3 / 2 ^ (m + n + 1))⁻¹ := by field_simptargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 258–260 at
df09144aaebf↗
tail3.inner2have∀ (s : ℕ), HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)))Leaves
∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), withinner2 : ∀ (s : ℕ), HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))).Uses library
HasSumHasSum f a Lmeans that the (potentially infinite) sum of thef bforb : βconverges toaalong the SummationFilterL. .Lean, lines 263–279
have inner2 : ∀ s, HasSum (fun m => f m s) (((3 : ℝ) / 2 ^ n) ^ (s + 1) / (2 ^ (s + 1) - 1)) := by intro s have hr0 : 0 ≤ (1 : ℝ) / 2 ^ (s + 1) := by positivity have hr1 : (1 : ℝ) / 2 ^ (s + 1) < 1 := by rw [div_lt_one (by positivity)] exact one_lt_pow₀ (by norm_num) (by omega) have hg := (hasSum_geometric_of_lt_one hr0 hr1).mul_left (((3 : ℝ) / 2 ^ (n + 1)) ^ (s + 1)) have hne : (2 : ℝ) ^ (s + 1) - 1 ≠ 0 := by have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega) linarith have hval : ((3 : ℝ) / 2 ^ n) ^ (s + 1) / (2 ^ (s + 1) - 1) = ((3 : ℝ) / 2 ^ (n + 1)) ^ (s + 1) * (1 - 1 / 2 ^ (s + 1))⁻¹ := by rw [div_pow, div_pow, ← pow_mul, ← pow_mul, show (n + 1) * (s + 1) = n * (s + 1) + (s + 1) by ring, pow_add] field_simp exact pow_add _ _ _ rw [hval] exact hgtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 263–279 at
df09144aaebf↗tail3.inner2.hr0have(0 : ℝ) ≤ (1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ))routine: positivityLeaves
HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))), withhr0 : (0 : ℝ) ≤ (1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ)).Lean, line 265
have hr0 : 0 ≤ (1 : ℝ) / 2 ^ (s + 1) := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 265 at
df09144aaebf↗tail3.inner2.hr1have(1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ)) < (1 : ℝ)Leaves
HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))), withhr1 : (1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ)) < (1 : ℝ).Uses library
div_lt_one,one_lt_pow₀.Lean, lines 266–268
have hr1 : (1 : ℝ) / 2 ^ (s + 1) < 1 := by rw [div_lt_one (by positivity)] exact one_lt_pow₀ (by norm_num) (by omega)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 266–268 at
df09144aaebf↗tail3.inner2.hghaveHasSum (fun (i : ℕ) => ((3 : ℝ) / (2 : ℝ) ^ (n + (1 : ℕ))) ^ (s + (1 : ℕ)) * ((1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ))) ^ i) (((3 : ℝ) / (2 : ℝ) ^ (n + (1 : ℕ))) ^ (s + (1 : ℕ)) * ((1 : ℝ) - (1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ)))⁻¹)Leaves
HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))), withhg : HasSum (fun (i : ℕ) => ((3 : ℝ) / (2 : ℝ) ^ (n + (1 : ℕ))) ^ (s + (1 : ℕ)) * ((1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ))) ^ i) (((3 : ℝ) / (2 : ℝ) ^ (n + (1 : ℕ))) ^ (s + (1 : ℕ)) * ((1 : ℝ) - (1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ)))⁻¹).Uses library
hasSum_geometric_of_lt_one.Lean, line 269
have hg := (hasSum_geometric_of_lt_one hr0 hr1).mul_left (((3 : ℝ) / 2 ^ (n + 1)) ^ (s + 1))
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 269 at
df09144aaebf↗tail3.inner2.hnehave(2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ) ≠ (0 : ℝ)Leaves
HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))), withhne : (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ) ≠ (0 : ℝ).Lean, lines 270–272
have hne : (2 : ℝ) ^ (s + 1) - 1 ≠ 0 := by have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega) linarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 270–272 at
df09144aaebf↗tail3.inner2.hne.thishave(1 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ))Leaves
(2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ) ≠ (0 : ℝ), withthis : (1 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ)).Uses library
one_lt_pow₀.Lean, line 271
have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 271 at
df09144aaebf↗
tail3.inner2.hvalhave((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)) = ((3 : ℝ) / (2 : ℝ) ^ (n + (1 : ℕ))) ^ (s + (1 : ℕ)) * ((1 : ℝ) - (1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ)))⁻¹Leaves
HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))), withhval : ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)) = ((3 : ℝ) / (2 : ℝ) ^ (n + (1 : ℕ))) ^ (s + (1 : ℕ)) * ((1 : ℝ) - (1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ)))⁻¹.Uses library
div_pow,pow_mul,pow_add.Lean, lines 273–277
have hval : ((3 : ℝ) / 2 ^ n) ^ (s + 1) / (2 ^ (s + 1) - 1) = ((3 : ℝ) / 2 ^ (n + 1)) ^ (s + 1) * (1 - 1 / 2 ^ (s + 1))⁻¹ := by rw [div_pow, div_pow, ← pow_mul, ← pow_mul, show (n + 1) * (s + 1) = n * (s + 1) + (s + 1) by ring, pow_add] field_simp exact pow_add _ _ _targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 273–277 at
df09144aaebf↗
tail3.hsum1haveSummable fun (m : ℕ) => (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))Leaves
∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), withhsum1 : Summable fun (m : ℕ) => (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)).Uses library
SummableSummable fmeans thatfhas some (infinite) sum with respect toL. ,Summable.of_nonneg_of_leComparison test of convergence of series of non-negative real numbers. ,summable_geometric_two.Lean, lines 280–288
have hsum1 : Summable (fun m : ℕ => (3 : ℝ) / (2 ^ (m + n + 1) - 3)) := by refine Summable.of_nonneg_of_le (fun m => ?_) (fun m => ?_) ((summable_geometric_two).mul_left 3) · have := h4 m; exact div_nonneg (by norm_num) (by linarith) · have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega) have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num) have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring calc (3 : ℝ) / (2 ^ (m + n + 1) - 3) ≤ 3 / 2 ^ m := div_le_div_of_nonneg_left (by norm_num) (by positivity) (by linarith) _ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 280–288 at
df09144aaebf↗tail3.hsum1.s1caseLeaves
(0 : ℝ) ≤ (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)).Uses library
div_nonneg.Lean, line 282
· have := h4 m; exact div_nonneg (by norm_num) (by linarith)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 282 at
df09144aaebf↗tail3.hsum1.s1.thishave(4 : ℝ) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ))Leaves
(0 : ℝ) ≤ (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), withthis : (4 : ℝ) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ)).Lean, line 282
· have := h4 m; exact div_nonneg (by norm_num) (by linarith)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 282 at
df09144aaebf↗
tail3.hsum1.s2caseLeaves
(3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m.Lean, lines 283–288
· have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega) have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num) have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring calc (3 : ℝ) / (2 ^ (m + n + 1) - 3) ≤ 3 / 2 ^ m := div_le_div_of_nonneg_left (by norm_num) (by positivity) (by linarith) _ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 283–288 at
df09144aaebf↗tail3.hsum1.s2.hpowhave(2 : ℝ) ^ (m + (2 : ℕ)) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ))Leaves
(3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, withhpow : (2 : ℝ) ^ (m + (2 : ℕ)) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ)).Uses library
pow_le_pow_right₀.Lean, line 283
· have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 283 at
df09144aaebf↗tail3.hsum1.s2.h1have(1 : ℝ) ≤ (2 : ℝ) ^ mLeaves
(3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, withh1 : (1 : ℝ) ≤ (2 : ℝ) ^ m.Uses library
one_le_pow₀.Lean, line 284
have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 284 at
df09144aaebf↗tail3.hsum1.s2.h2have(2 : ℝ) ^ (m + (2 : ℕ)) = (4 : ℝ) * (2 : ℝ) ^ mLeaves
(3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, withh2 : (2 : ℝ) ^ (m + (2 : ℕ)) = (4 : ℝ) * (2 : ℝ) ^ m.Uses library
pow_add.Lean, line 285
have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 285 at
df09144aaebf↗tail3.hsum1.s2.s4calc(3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) / (2 : ℝ) ^ mCloses the goal.
Uses library
div_le_div_of_nonneg_left.Lean, lines 286–287
calc (3 : ℝ) / (2 ^ (m + n + 1) - 3) ≤ 3 / 2 ^ m := div_le_div_of_nonneg_left (by norm_num) (by positivity) (by linarith)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 286–287 at
df09144aaebf↗tail3.hsum1.s2.s5calcCloses the goal.
Uses library
one_div_pow.Lean, line 288
_ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ring
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 288 at
df09144aaebf↗
tail3.hUhaveSummable (Function.uncurry f)Leaves
∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), withhU : Summable (Function.uncurry f).Uses library
SummableSummable fmeans thatfhas some (infinite) sum with respect toL. ,Function.uncurryTransforms a two-parameter function into an equivalent function from pairs. ,summable_prod_of_nonneg,And.introAnd.intro : a → b → a ∧ bis the constructor for the And operation. .Lean, lines 289–291
have hU : Summable (Function.uncurry f) := by refine (summable_prod_of_nonneg (fun p => hpos p.1 p.2)).mpr ⟨fun m => (inner1 m).summable, ?_⟩ exact hsum1.congr (fun m => ((inner1 m).tsum_eq).symm)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 289–291 at
df09144aaebf↗tail3.hcommhave∑' (c : ℕ) (b : ℕ), f b c = ∑' (b : ℕ) (c : ℕ), f b cLeaves
∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), withhcomm : ∑' (c : ℕ) (b : ℕ), f b c = ∑' (b : ℕ) (c : ℕ), f b c.Lean, line 292
have hcomm := hU.tsum_comm' (fun m => (inner1 m).summable) (fun s => (inner2 s).summable)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 292 at
df09144aaebf↗
split3Thave∀ (n : ℕ), (3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ)) + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withsplit3T : ∀ (n : ℕ), (3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ)) + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,zero_add.Lean, lines 298–336
have split3T : ∀ (n : ℕ), 3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) = ∑ j ∈ Finset.range n, (3 : ℝ) / (2 ^ (j + 1) - 3) + ∑' m : ℕ, (3 : ℝ) / (2 ^ (m + n + 1) - 3) := by intro n set g : ℕ → ℝ := fun m => (3 : ℝ) / (2 ^ (m + 1) - 3) with hg have hsum : Summable (fun m => g (m + 1)) := by refine Summable.of_nonneg_of_le (fun m => ?_) (fun m => ?_) ((summable_geometric_two).mul_left 3) · have : (4 : ℝ) ≤ 2 ^ (m + 1 + 1) := by calc (4 : ℝ) = 2 ^ 2 := by norm_num _ ≤ 2 ^ (m + 1 + 1) := pow_le_pow_right₀ (by norm_num) (by omega) simp only [hg]; exact div_nonneg (by norm_num) (by linarith) · have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + 1 + 1) := le_of_eq (by ring_nf) have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num) have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring simp only [hg] calc (3 : ℝ) / (2 ^ (m + 1 + 1) - 3) ≤ 3 / 2 ^ m := div_le_div_of_nonneg_left (by norm_num) (by positivity) (by linarith) _ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ring have hs : Summable g := (summable_nat_add_iff 1).mp hsum have e1 := hs.sum_add_tsum_nat_add n have e2 := hs.sum_add_tsum_nat_add 2 have h3T : 3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) = ∑' m, g (m + 2) := by rw [← tsum_mul_left] refine tsum_congr (fun m => ?_) simp only [hg] rw [show m + 2 + 1 = m + 3 by ring] ring have hfirst : ∑ i ∈ Finset.range 2, g i = 0 := by simp only [hg, Finset.sum_range_succ, Finset.sum_range_zero] norm_num rw [h3T] have htail : ∑' m : ℕ, (3 : ℝ) / (2 ^ (m + n + 1) - 3) = ∑' m, g (m + n) := by refine tsum_congr (fun m => ?_) simp only [hg] rw [htail] have hrange : ∑ j ∈ Finset.range n, (3 : ℝ) / (2 ^ (j + 1) - 3) = ∑ i ∈ Finset.range n, g i := by simp only [hg] rw [hrange, e1] rw [← e2, hfirst, zero_add]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 298–336 at
df09144aaebf↗split3T.hsumhaveSummable fun (m : ℕ) => g (m + (1 : ℕ))Leaves
(3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = (Finset.range n).sum g + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), withhsum : Summable fun (m : ℕ) => g (m + (1 : ℕ)).Uses library
SummableSummable fmeans thatfhas some (infinite) sum with respect toL. ,Summable.of_nonneg_of_leComparison test of convergence of series of non-negative real numbers. ,summable_geometric_two.Lean, lines 303–315
have hsum : Summable (fun m => g (m + 1)) := by refine Summable.of_nonneg_of_le (fun m => ?_) (fun m => ?_) ((summable_geometric_two).mul_left 3) · have : (4 : ℝ) ≤ 2 ^ (m + 1 + 1) := by calc (4 : ℝ) = 2 ^ 2 := by norm_num _ ≤ 2 ^ (m + 1 + 1) := pow_le_pow_right₀ (by norm_num) (by omega) simp only [hg]; exact div_nonneg (by norm_num) (by linarith) · have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + 1 + 1) := le_of_eq (by ring_nf) have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num) have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring simp only [hg] calc (3 : ℝ) / (2 ^ (m + 1 + 1) - 3) ≤ 3 / 2 ^ m := div_le_div_of_nonneg_left (by norm_num) (by positivity) (by linarith) _ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 303–315 at
df09144aaebf↗split3T.hsum.s1caseLeaves
(0 : ℝ) ≤ g (m + (1 : ℕ)).Uses library
div_nonneg.Lean, lines 305–308
· have : (4 : ℝ) ≤ 2 ^ (m + 1 + 1) := by calc (4 : ℝ) = 2 ^ 2 := by norm_num _ ≤ 2 ^ (m + 1 + 1) := pow_le_pow_right₀ (by norm_num) (by omega) simp only [hg]; exact div_nonneg (by norm_num) (by linarith)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 305–308 at
df09144aaebf↗split3T.hsum.s1.thishave(4 : ℝ) ≤ (2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ))Leaves
(0 : ℝ) ≤ g (m + (1 : ℕ)), withthis : (4 : ℝ) ≤ (2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ)).Lean, lines 305–307
· have : (4 : ℝ) ≤ 2 ^ (m + 1 + 1) := by calc (4 : ℝ) = 2 ^ 2 := by norm_num _ ≤ 2 ^ (m + 1 + 1) := pow_le_pow_right₀ (by norm_num) (by omega)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 305–307 at
df09144aaebf↗split3T.hsum.s1.this.s1calc(4 : ℝ) = (2 : ℝ) ^ (2 : ℕ)routine: norm_numCloses the goal.
Lean, line 306
calc (4 : ℝ) = 2 ^ 2 := by norm_num
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 306 at
df09144aaebf↗split3T.hsum.s1.this.s2calc(2 : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ))Closes the goal.
Uses library
pow_le_pow_right₀.Lean, line 307
_ ≤ 2 ^ (m + 1 + 1) := pow_le_pow_right₀ (by norm_num) (by omega)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 307 at
df09144aaebf↗
split3T.hsum.s2caseLeaves
g (m + (1 : ℕ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m.Lean, lines 309–315
· have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + 1 + 1) := le_of_eq (by ring_nf) have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num) have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring simp only [hg] calc (3 : ℝ) / (2 ^ (m + 1 + 1) - 3) ≤ 3 / 2 ^ m := div_le_div_of_nonneg_left (by norm_num) (by positivity) (by linarith) _ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 309–315 at
df09144aaebf↗split3T.hsum.s2.hpowhave(2 : ℝ) ^ (m + (2 : ℕ)) ≤ (2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ))Leaves
g (m + (1 : ℕ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, withhpow : (2 : ℝ) ^ (m + (2 : ℕ)) ≤ (2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ)).Uses library
le_of_eq.Lean, line 309
· have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + 1 + 1) := le_of_eq (by ring_nf)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 309 at
df09144aaebf↗split3T.hsum.s2.h1have(1 : ℝ) ≤ (2 : ℝ) ^ mLeaves
g (m + (1 : ℕ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, withh1 : (1 : ℝ) ≤ (2 : ℝ) ^ m.Uses library
one_le_pow₀.Lean, line 310
have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 310 at
df09144aaebf↗split3T.hsum.s2.h2have(2 : ℝ) ^ (m + (2 : ℕ)) = (4 : ℝ) * (2 : ℝ) ^ mLeaves
g (m + (1 : ℕ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, withh2 : (2 : ℝ) ^ (m + (2 : ℕ)) = (4 : ℝ) * (2 : ℝ) ^ m.Uses library
pow_add.Lean, line 311
have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 311 at
df09144aaebf↗split3T.hsum.s2.s4calc(3 : ℝ) / ((2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) / (2 : ℝ) ^ mCloses the goal.
Uses library
div_le_div_of_nonneg_left.Lean, lines 313–314
calc (3 : ℝ) / (2 ^ (m + 1 + 1) - 3) ≤ 3 / 2 ^ m := div_le_div_of_nonneg_left (by norm_num) (by positivity) (by linarith)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 313–314 at
df09144aaebf↗split3T.hsum.s2.s5calcCloses the goal.
Uses library
one_div_pow.Lean, line 315
_ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ring
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 315 at
df09144aaebf↗
split3T.hshaveSummable gLeaves
(3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = (Finset.range n).sum g + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), withhs : Summable g.Uses library
SummableSummable fmeans thatfhas some (infinite) sum with respect toL. ,summable_nat_add_iff.Lean, line 316
have hs : Summable g := (summable_nat_add_iff 1).mp hsum
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 316 at
df09144aaebf↗split3T.e1have∑ i ∈ Finset.range n, g i + ∑' (i : ℕ), g (i + n) = ∑' (i : ℕ), g iLeaves
(3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = (Finset.range n).sum g + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), withe1 : ∑ i ∈ Finset.range n, g i + ∑' (i : ℕ), g (i + n) = ∑' (i : ℕ), g i.Lean, line 317
have e1 := hs.sum_add_tsum_nat_add n
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 317 at
df09144aaebf↗split3T.e2have∑ i ∈ Finset.range (2 : ℕ), g i + ∑' (i : ℕ), g (i + (2 : ℕ)) = ∑' (i : ℕ), g iLeaves
(3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = (Finset.range n).sum g + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), withe2 : ∑ i ∈ Finset.range (2 : ℕ), g i + ∑' (i : ℕ), g (i + (2 : ℕ)) = ∑' (i : ℕ), g i.Lean, line 318
have e2 := hs.sum_add_tsum_nat_add 2
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 318 at
df09144aaebf↗split3T.h3Thave(3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = ∑' (m : ℕ), g (m + (2 : ℕ))Leaves
(3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = (Finset.range n).sum g + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), withh3T : (3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = ∑' (m : ℕ), g (m + (2 : ℕ)).Uses library
tsum_mul_left,tsum_congr.Lean, lines 319–324
have h3T : 3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) = ∑' m, g (m + 2) := by rw [← tsum_mul_left] refine tsum_congr (fun m => ?_) simp only [hg] rw [show m + 2 + 1 = m + 3 by ring] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 319–324 at
df09144aaebf↗split3T.hfirsthave∑ i ∈ Finset.range (2 : ℕ), g i = (0 : ℝ)routine: simp, norm_numLeaves
(3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = (Finset.range n).sum g + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), withhfirst : ∑ i ∈ Finset.range (2 : ℕ), g i = (0 : ℝ).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.sum_range_succ,Finset.sum_range_zero.Lean, lines 325–327
have hfirst : ∑ i ∈ Finset.range 2, g i = 0 := by simp only [hg, Finset.sum_range_succ, Finset.sum_range_zero] norm_numtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 325–327 at
df09144aaebf↗split3T.htailhave∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (m : ℕ), g (m + n)Leaves
∑' (m : ℕ), g (m + (2 : ℕ)) = (Finset.range n).sum g + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), withhtail : ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (m : ℕ), g (m + n).Uses library
tsum_congr.Lean, lines 329–331
have htail : ∑' m : ℕ, (3 : ℝ) / (2 ^ (m + n + 1) - 3) = ∑' m, g (m + n) := by refine tsum_congr (fun m => ?_) simp only [hg]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 329–331 at
df09144aaebf↗split3T.hrangehave∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ)) = ∑ i ∈ Finset.range n, g iroutine: simpLeaves
∑' (m : ℕ), g (m + (2 : ℕ)) = (Finset.range n).sum g + ∑' (m : ℕ), g (m + n), withhrange : ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ)) = ∑ i ∈ Finset.range n, g i.Uses library
Finset.rangerange nis the set of natural numbers less thann. .Lean, lines 333–334
have hrange : ∑ j ∈ Finset.range n, (3 : ℝ) / (2 ^ (j + 1) - 3) = ∑ i ∈ Finset.range n, g i := by simp only [hg]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 333–334 at
df09144aaebf↗
cauchy_finhave∀ (n : ℕ) (q a : ℕ → ℝ) (x A : ℝ), HasSum (fun (s : ℕ) => a s * x ^ (s + (1 : ℕ))) A → HasSum (fun (K : ℕ) => ∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then q j * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) ((∑ j ∈ Finset.range (n + (1 : ℕ)), q j * x ^ j) * A)Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withcauchy_fin : ∀ (n : ℕ) (q a : ℕ → ℝ) (x A : ℝ), HasSum (fun (s : ℕ) => a s * x ^ (s + (1 : ℕ))) A → HasSum (fun (K : ℕ) => ∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then q j * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) ((∑ j ∈ Finset.range (n + (1 : ℕ)), q j * x ^ j) * A).Uses library
HasSumHasSum f a Lmeans that the (potentially infinite) sum of thef bforb : βconverges toaalong the SummationFilterL. ,Finset.rangerange nis the set of natural numbers less thann. ,Finset.sum_mul,hasSum_sum,hasSum_nat_add_iff',sub_zero.Lean, lines 338–358
have cauchy_fin : ∀ (n : ℕ) (q a : ℕ → ℝ) (x A : ℝ) (hA : HasSum (fun s => a s * x ^ (s + 1)) A), HasSum (fun K => ∑ j ∈ Finset.range (n + 1), if j < K then q j * a (K - j - 1) * x ^ K else 0) ((∑ j ∈ Finset.range (n + 1), q j * x ^ j) * A) := by intro n q a x A hA rw [Finset.sum_mul] apply hasSum_sum intro j _ have h := hA.mul_left (q j * x ^ j) rw [← hasSum_nat_add_iff' (j + 1)] have hz : ∑ i ∈ Finset.range (j + 1), (if j < i then q j * a (i - j - 1) * x ^ i else 0) = 0 := Finset.sum_eq_zero (fun i hi => by have := Finset.mem_range.mp hi rw [if_neg (by omega)]) rw [hz, sub_zero] have hfun : (fun s => if j < s + (j + 1) then q j * a (s + (j + 1) - j - 1) * x ^ (s + (j + 1)) else 0) = fun s => q j * x ^ j * (a s * x ^ (s + 1)) := by funext s rw [if_pos (by omega), show s + (j + 1) - j - 1 = s by omega, show s + (j + 1) = j + (s + 1) by ring, pow_add] ring rw [hfun] exact htargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 338–358 at
df09144aaebf↗cauchy_fin.hhaveHasSum (fun (i : ℕ) => q j * x ^ j * (a i * x ^ (i + (1 : ℕ)))) (q j * x ^ j * A)Leaves
HasSum (fun (b : ℕ) => if j < b then q j * a (b - j - (1 : ℕ)) * x ^ b else (0 : ℝ)) (q j * x ^ j * A), withh : HasSum (fun (i : ℕ) => q j * x ^ j * (a i * x ^ (i + (1 : ℕ)))) (q j * x ^ j * A).Lean, line 345
have h := hA.mul_left (q j * x ^ j)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 345 at
df09144aaebf↗cauchy_fin.hzhave(∑ i ∈ Finset.range (j + (1 : ℕ)), if j < i then q j * a (i - j - (1 : ℕ)) * x ^ i else (0 : ℝ)) = (0 : ℝ)Leaves
HasSum (fun (n : ℕ) => if j < n + (j + (1 : ℕ)) then q j * a (n + (j + (1 : ℕ)) - j - (1 : ℕ)) * x ^ (n + (j + (1 : ℕ))) else (0 : ℝ)) (q j * x ^ j * A - ∑ i ∈ Finset.range (j + (1 : ℕ)), if j < i then q j * a (i - j - (1 : ℕ)) * x ^ i else (0 : ℝ)), withhz : (∑ i ∈ Finset.range (j + (1 : ℕ)), if j < i then q j * a (i - j - (1 : ℕ)) * x ^ i else (0 : ℝ)) = (0 : ℝ).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.sum_eq_zero,if_neg.Lean, lines 347–350
have hz : ∑ i ∈ Finset.range (j + 1), (if j < i then q j * a (i - j - 1) * x ^ i else 0) = 0 := Finset.sum_eq_zero (fun i hi => by have := Finset.mem_range.mp hi rw [if_neg (by omega)])targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 347–350 at
df09144aaebf↗cauchy_fin.hz.thishavei < j + (1 : ℕ)Leaves
(if j < i then q j * a (i - j - (1 : ℕ)) * x ^ i else (0 : ℝ)) = (0 : ℝ), withthis : i < j + (1 : ℕ).Uses library
Finset.mem_range.Lean, line 349
have := Finset.mem_range.mp hi
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 349 at
df09144aaebf↗
cauchy_fin.hfunhave(fun (s : ℕ) => if j < s + (j + (1 : ℕ)) then q j * a (s + (j + (1 : ℕ)) - j - (1 : ℕ)) * x ^ (s + (j + (1 : ℕ))) else (0 : ℝ)) = fun (s : ℕ) => q j * x ^ j * (a s * x ^ (s + (1 : ℕ)))Leaves
HasSum (fun (n : ℕ) => if j < n + (j + (1 : ℕ)) then q j * a (n + (j + (1 : ℕ)) - j - (1 : ℕ)) * x ^ (n + (j + (1 : ℕ))) else (0 : ℝ)) (q j * x ^ j * A), withhfun : (fun (s : ℕ) => if j < s + (j + (1 : ℕ)) then q j * a (s + (j + (1 : ℕ)) - j - (1 : ℕ)) * x ^ (s + (j + (1 : ℕ))) else (0 : ℝ)) = fun (s : ℕ) => q j * x ^ j * (a s * x ^ (s + (1 : ℕ))).Uses library
if_pos,pow_add.Lean, lines 352–356
have hfun : (fun s => if j < s + (j + 1) then q j * a (s + (j + 1) - j - 1) * x ^ (s + (j + 1)) else 0) = fun s => q j * x ^ j * (a s * x ^ (s + 1)) := by funext s rw [if_pos (by omega), show s + (j + 1) - j - 1 = s by omega, show s + (j + 1) = j + (s + 1) by ring, pow_add] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 352–356 at
df09144aaebf↗
h4_serieshave∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → ∀ (n : ℕ), (1 : ℕ) ≤ n → HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ))Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withh4_series : ∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → ∀ (n : ℕ), (1 : ℕ) ≤ n → HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,HasSumHasSum f a Lmeans that the (potentially infinite) sum of thef bforb : βconverges toaalong the SummationFilterL. ,Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. .Lean, lines 360–479
have h4_series : ∀ (Qc : ℕ → ℕ → ℚ) (hQc : (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)))) (Qx : ℕ → ℚ) (hQx : (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k)) (Aq : ℕ → ℚ) (hAq : (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ)))) (n : ℕ) (hn : 1 ≤ n), HasSum (fun K : ℕ => if 2 * n < K then ((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) * ((3 : ℝ) / 2 ^ n) ^ K else 0) ((Qx n : ℝ) * (3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3)) - (Aq n : ℝ)) := by intro Qc hQc Qx hQx Aq hAq n hn set x : ℝ := (3 : ℝ) / 2 ^ n with hxdef have hx0 : 0 ≤ x := by positivity have hx2 : x / 2 < 1 := by have : (2 : ℝ) ≤ 2 ^ n := by calc (2 : ℝ) = 2 ^ 1 := by norm_num _ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn rw [hxdef, div_div, div_lt_one (by positivity)]; linarith set a : ℕ → ℝ := fun s => (1 : ℝ) / (2 ^ (s + 1) - 1) with hadef have hapos : ∀ s, 0 < (2 : ℝ) ^ (s + 1) - 1 := fun s => by have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega) linarith have hAsum : Summable (fun s => a s * x ^ (s + 1)) := by refine Summable.of_nonneg_of_le (fun s => ?_) (fun s => ?_) ((summable_geometric_of_lt_one (by positivity) hx2).mul_left x) · simp only [hadef]; exact mul_nonneg (div_nonneg (by norm_num) (le_of_lt (hapos s))) (by positivity) · simp only [hadef] have h1 : (2 : ℝ) ^ s ≤ 2 ^ (s + 1) - 1 := by have : (1 : ℝ) ≤ 2 ^ s := one_le_pow₀ (by norm_num) rw [pow_succ]; linarith have hxs : 0 ≤ x ^ (s + 1) := by positivity calc 1 / (2 ^ (s + 1) - 1) * x ^ (s + 1) ≤ 1 / 2 ^ s * x ^ (s + 1) := by gcongr _ = x * (x / 2) ^ s := by have e : ∀ y : ℝ, 1 / 2 ^ s * y ^ (s + 1) = y * (y / 2) ^ s := by intro y; rw [div_pow, pow_succ]; field_simp exact e x set A := ∑' s, a s * x ^ (s + 1) with hAdef have hA : HasSum (fun s => a s * x ^ (s + 1)) A := hAsum.hasSum -- 3T = c + A have h3T : 3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) = ∑ j ∈ Finset.range n, (3 : ℝ) / (2 ^ (j + 1) - 3) + A := by rw [split3T n, tail3 n hn, hAdef] congr 1 refine tsum_congr (fun s => ?_) simp only [hadef, hxdef] ring have hQxR : (Qx n : ℝ) = ∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) * x ^ j := by rw [hQx]; push_cast; rfl have hAqR : (Aq n : ℝ) = ∑ k ∈ Finset.range (n + 1), (∑ j ∈ Finset.range (k + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (k - j) - 1)) * x ^ k + (Qx n : ℝ) * ∑ j ∈ Finset.range n, (3 : ℝ) / (2 ^ (j + 1) - 3) := by rw [hAq]; push_cast; rfl have hC := cauchy_fin n (fun j => (Qc n j : ℝ)) a x A hA set P : ℝ := ∑ k ∈ Finset.range (n + 1), (∑ j ∈ Finset.range (k + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (k - j) - 1)) * x ^ k with hPdef have hP : HasSum (fun K => if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) P := by have h0 : HasSum (fun K => if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) (∑ K ∈ Finset.range (n + 1), if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) := hasSum_sum_of_ne_finset_zero (fun b hb => by rw [if_neg (by simpa using hb)]) have h1 : (∑ K ∈ Finset.range (n + 1), if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) = P := by rw [hPdef] exact Finset.sum_congr rfl (fun K hK => by rw [if_pos (Finset.mem_range.mp hK)]) rw [h1] at h0 exact h0 have hD := hC.sub hP have hval : (Qx n : ℝ) * (3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3)) - (Aq n : ℝ) = (∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) * x ^ j) * A - P := by rw [h3T, hAqR, hQxR]; ring rw [hval] have hid1 : ∀ j ≤ n, Qc n j * 2 ^ j * ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ j - 2 ^ i) = ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ L) := fun j hj => by subst hQc; exact id1_full n j hj have hfun : (fun K : ℕ => if 2 * n < K then ((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) * ((3 : ℝ) / 2 ^ n) ^ K else 0) = fun K => (∑ j ∈ Finset.range (n + 1), if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) - (if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) := by funext K symm by_cases hK : K < n + 1 · rw [if_pos hK, if_neg (by omega)] rw [Finset.sum_range_succ (fun j => (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) K, Nat.sub_self, pow_zero, sub_self, div_zero, add_zero] have hsplit : ∑ j ∈ Finset.range (n + 1), (if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) = ∑ j ∈ Finset.range K, (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1) * x ^ K := by rw [← Finset.sum_range_add_sum_Ico _ (show K ≤ n + 1 by omega)] rw [Finset.sum_eq_zero (s := Finset.Ico K (n + 1)) (fun j hj => by rw [if_neg (by have := Finset.mem_Ico.mp hj; omega)]), add_zero] refine Finset.sum_congr rfl (fun j hj => ?_) have hjK := Finset.mem_range.mp hj rw [if_pos hjK] simp only [hadef] rw [show K - j - 1 + 1 = K - j by omega] ring rw [hsplit, Finset.sum_mul, sub_self] · rw [if_neg hK, sub_zero] have hS : ∑ j ∈ Finset.range (n + 1), (if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) = ((∑ j ∈ Finset.range (n + 1), Qc n j / ((2 : ℚ) ^ (K - j) - 1) : ℚ) : ℝ) * x ^ K := by push_cast rw [Finset.sum_mul] refine Finset.sum_congr rfl (fun j hj => ?_) have hjK : j < K := by have := Finset.mem_range.mp hj; omega rw [if_pos hjK] simp only [hadef] rw [show K - j - 1 + 1 = K - j by omega] ring rw [hS, tail_coeff n K (by omega) Qc hid1] push_cast by_cases h2 : 2 * n < K · rw [if_pos h2] · rw [if_neg h2] rw [Finset.prod_eq_zero (i := K) (Finset.mem_Ioc.mpr ⟨by omega, by omega⟩) (sub_self _)] simp rw [hfun] exact hDtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 360–479 at
df09144aaebf↗h4_series.hx0have(0 : ℝ) ≤ xroutine: positivityLeaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withhx0 : (0 : ℝ) ≤ x.Lean, line 375
have hx0 : 0 ≤ x := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 375 at
df09144aaebf↗h4_series.hx2havex / (2 : ℝ) < (1 : ℝ)Leaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withhx2 : x / (2 : ℝ) < (1 : ℝ).Uses library
div_div,div_lt_one.Lean, lines 376–380
have hx2 : x / 2 < 1 := by have : (2 : ℝ) ≤ 2 ^ n := by calc (2 : ℝ) = 2 ^ 1 := by norm_num _ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn rw [hxdef, div_div, div_lt_one (by positivity)]; linarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 376–380 at
df09144aaebf↗h4_series.hx2.thishave(2 : ℝ) ≤ (2 : ℝ) ^ nLeaves
x / (2 : ℝ) < (1 : ℝ), withthis : (2 : ℝ) ≤ (2 : ℝ) ^ n.Lean, lines 377–379
have : (2 : ℝ) ≤ 2 ^ n := by calc (2 : ℝ) = 2 ^ 1 := by norm_num _ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hntargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 377–379 at
df09144aaebf↗h4_series.hx2.this.s1calc(2 : ℝ) = (2 : ℝ) ^ (1 : ℕ)routine: norm_numCloses the goal.
Lean, line 378
calc (2 : ℝ) = 2 ^ 1 := by norm_num
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 378 at
df09144aaebf↗h4_series.hx2.this.s2calc(2 : ℝ) ^ (1 : ℕ) ≤ (2 : ℝ) ^ nCloses the goal.
Uses library
pow_le_pow_right₀.Lean, line 379
_ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 379 at
df09144aaebf↗
h4_series.haposhave∀ (s : ℕ), (0 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)Leaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withhapos : ∀ (s : ℕ), (0 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ).Lean, lines 382–384
have hapos : ∀ s, 0 < (2 : ℝ) ^ (s + 1) - 1 := fun s => by have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega) linarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 382–384 at
df09144aaebf↗h4_series.hapos.thishave(1 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ))Leaves
(0 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ), withthis : (1 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ)).Uses library
one_lt_pow₀.Lean, line 383
have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 383 at
df09144aaebf↗
h4_series.hAsumhaveSummable fun (s : ℕ) => a s * x ^ (s + (1 : ℕ))Leaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withhAsum : Summable fun (s : ℕ) => a s * x ^ (s + (1 : ℕ)).Uses library
SummableSummable fmeans thatfhas some (infinite) sum with respect toL. ,Summable.of_nonneg_of_leComparison test of convergence of series of non-negative real numbers. ,summable_geometric_of_lt_one.Lean, lines 385–398
have hAsum : Summable (fun s => a s * x ^ (s + 1)) := by refine Summable.of_nonneg_of_le (fun s => ?_) (fun s => ?_) ((summable_geometric_of_lt_one (by positivity) hx2).mul_left x) · simp only [hadef]; exact mul_nonneg (div_nonneg (by norm_num) (le_of_lt (hapos s))) (by positivity) · simp only [hadef] have h1 : (2 : ℝ) ^ s ≤ 2 ^ (s + 1) - 1 := by have : (1 : ℝ) ≤ 2 ^ s := one_le_pow₀ (by norm_num) rw [pow_succ]; linarith have hxs : 0 ≤ x ^ (s + 1) := by positivity calc 1 / (2 ^ (s + 1) - 1) * x ^ (s + 1) ≤ 1 / 2 ^ s * x ^ (s + 1) := by gcongr _ = x * (x / 2) ^ s := by have e : ∀ y : ℝ, 1 / 2 ^ s * y ^ (s + 1) = y * (y / 2) ^ s := by intro y; rw [div_pow, pow_succ]; field_simp exact e xtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 385–398 at
df09144aaebf↗h4_series.hAsum.s1caseLeaves
(0 : ℝ) ≤ a s * x ^ (s + (1 : ℕ)).Uses library
mul_nonnegAlias ofLeft.mul_nonneg. ,div_nonneg,le_of_lt.Lean, line 387
· simp only [hadef]; exact mul_nonneg (div_nonneg (by norm_num) (le_of_lt (hapos s))) (by positivity)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 387 at
df09144aaebf↗h4_series.hAsum.s2caseLeaves
a s * x ^ (s + (1 : ℕ)) ≤ x * (x / (2 : ℝ)) ^ s.Lean, lines 388–398
· simp only [hadef] have h1 : (2 : ℝ) ^ s ≤ 2 ^ (s + 1) - 1 := by have : (1 : ℝ) ≤ 2 ^ s := one_le_pow₀ (by norm_num) rw [pow_succ]; linarith have hxs : 0 ≤ x ^ (s + 1) := by positivity calc 1 / (2 ^ (s + 1) - 1) * x ^ (s + 1) ≤ 1 / 2 ^ s * x ^ (s + 1) := by gcongr _ = x * (x / 2) ^ s := by have e : ∀ y : ℝ, 1 / 2 ^ s * y ^ (s + 1) = y * (y / 2) ^ s := by intro y; rw [div_pow, pow_succ]; field_simp exact e xtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 388–398 at
df09144aaebf↗h4_series.hAsum.s2.h1have(2 : ℝ) ^ s ≤ (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)Leaves
(1 : ℝ) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)) * x ^ (s + (1 : ℕ)) ≤ x * (x / (2 : ℝ)) ^ s, withh1 : (2 : ℝ) ^ s ≤ (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ).Uses library
pow_succ.Lean, lines 389–391
have h1 : (2 : ℝ) ^ s ≤ 2 ^ (s + 1) - 1 := by have : (1 : ℝ) ≤ 2 ^ s := one_le_pow₀ (by norm_num) rw [pow_succ]; linarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 389–391 at
df09144aaebf↗h4_series.hAsum.s2.h1.thishave(1 : ℝ) ≤ (2 : ℝ) ^ sLeaves
(2 : ℝ) ^ s ≤ (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ), withthis : (1 : ℝ) ≤ (2 : ℝ) ^ s.Uses library
one_le_pow₀.Lean, line 390
have : (1 : ℝ) ≤ 2 ^ s := one_le_pow₀ (by norm_num)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 390 at
df09144aaebf↗
h4_series.hAsum.s2.hxshave(0 : ℝ) ≤ x ^ (s + (1 : ℕ))routine: positivityLeaves
(1 : ℝ) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)) * x ^ (s + (1 : ℕ)) ≤ x * (x / (2 : ℝ)) ^ s, withhxs : (0 : ℝ) ≤ x ^ (s + (1 : ℕ)).Lean, line 392
have hxs : 0 ≤ x ^ (s + 1) := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 392 at
df09144aaebf↗h4_series.hAsum.s2.s3calc(1 : ℝ) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)) * x ^ (s + (1 : ℕ)) ≤ (1 : ℝ) / (2 : ℝ) ^ s * x ^ (s + (1 : ℕ))Closes the goal.
Lean, lines 393–394
calc 1 / (2 ^ (s + 1) - 1) * x ^ (s + 1) ≤ 1 / 2 ^ s * x ^ (s + 1) := by gcongrtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 393–394 at
df09144aaebf↗h4_series.hAsum.s2.s4calcCloses the goal.
Lean, lines 395–398
_ = x * (x / 2) ^ s := by have e : ∀ y : ℝ, 1 / 2 ^ s * y ^ (s + 1) = y * (y / 2) ^ s := by intro y; rw [div_pow, pow_succ]; field_simp exact e xtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 395–398 at
df09144aaebf↗h4_series.hAsum.s2.s4.ehave∀ (y : ℝ), (1 : ℝ) / (2 : ℝ) ^ s * y ^ (s + (1 : ℕ)) = y * (y / (2 : ℝ)) ^ sLeaves
(1 : ℝ) / (2 : ℝ) ^ s * x ^ (s + (1 : ℕ)) = x * (x / (2 : ℝ)) ^ s, withe : ∀ (y : ℝ), (1 : ℝ) / (2 : ℝ) ^ s * y ^ (s + (1 : ℕ)) = y * (y / (2 : ℝ)) ^ s.Uses library
div_pow,pow_succ.Lean, lines 396–397
have e : ∀ y : ℝ, 1 / 2 ^ s * y ^ (s + 1) = y * (y / 2) ^ s := by intro y; rw [div_pow, pow_succ]; field_simptargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 396–397 at
df09144aaebf↗
h4_series.hAhaveHasSum (fun (s : ℕ) => a s * x ^ (s + (1 : ℕ))) ALeaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withhA : HasSum (fun (s : ℕ) => a s * x ^ (s + (1 : ℕ))) A.Uses library
HasSumHasSum f a Lmeans that the (potentially infinite) sum of thef bforb : βconverges toaalong the SummationFilterL. .Lean, line 400
have hA : HasSum (fun s => a s * x ^ (s + 1)) A := hAsum.hasSum
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 400 at
df09144aaebf↗h4_series.h3Thave(3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ)) + ALeaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withh3T : (3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ)) + A.Uses library
Finset.rangerange nis the set of natural numbers less thann. ,tsum_congr.Lean, lines 402–407
have h3T : 3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) = ∑ j ∈ Finset.range n, (3 : ℝ) / (2 ^ (j + 1) - 3) + A := by rw [split3T n, tail3 n hn, hAdef] congr 1 refine tsum_congr (fun s => ?_) simp only [hadef, hxdef] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 402–407 at
df09144aaebf↗h4_series.hQxRhave(↑(Qx n) : ℝ) = ∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ jLeaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withhQxR : (↑(Qx n) : ℝ) = ∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ j.Uses library
Finset.rangerange nis the set of natural numbers less thann. .Lean, lines 408–409
have hQxR : (Qx n : ℝ) = ∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) * x ^ j := by rw [hQx]; push_cast; rfltargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 408–409 at
df09144aaebf↗h4_series.hAqRhave(↑(Aq n) : ℝ) = ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (k - j) - (1 : ℝ))) * x ^ k + (↑(Qx n) : ℝ) * ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ))Leaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withhAqR : (↑(Aq n) : ℝ) = ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (k - j) - (1 : ℝ))) * x ^ k + (↑(Qx n) : ℝ) * ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ)).Uses library
Finset.rangerange nis the set of natural numbers less thann. .Lean, lines 410–413
have hAqR : (Aq n : ℝ) = ∑ k ∈ Finset.range (n + 1), (∑ j ∈ Finset.range (k + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (k - j) - 1)) * x ^ k + (Qx n : ℝ) * ∑ j ∈ Finset.range n, (3 : ℝ) / (2 ^ (j + 1) - 3) := by rw [hAq]; push_cast; rfltargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 410–413 at
df09144aaebf↗h4_series.hChaveHasSum (fun (K : ℕ) => ∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) ((∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ j) * A)Leaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withhC : HasSum (fun (K : ℕ) => ∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) ((∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ j) * A).Lean, line 414
have hC := cauchy_fin n (fun j => (Qc n j : ℝ)) a x A hA
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 414 at
df09144aaebf↗h4_series.hPhaveHasSum (fun (K : ℕ) => if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)) PLeaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withhP : HasSum (fun (K : ℕ) => if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)) P.Uses library
HasSumHasSum f a Lmeans that the (potentially infinite) sum of thef bforb : βconverges toaalong the SummationFilterL. ,Finset.rangerange nis the set of natural numbers less thann. .Lean, lines 417–429
have hP : HasSum (fun K => if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) P := by have h0 : HasSum (fun K => if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) (∑ K ∈ Finset.range (n + 1), if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) := hasSum_sum_of_ne_finset_zero (fun b hb => by rw [if_neg (by simpa using hb)]) have h1 : (∑ K ∈ Finset.range (n + 1), if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) = P := by rw [hPdef] exact Finset.sum_congr rfl (fun K hK => by rw [if_pos (Finset.mem_range.mp hK)]) rw [h1] at h0 exact h0targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 417–429 at
df09144aaebf↗h4_series.hP.h0haveHasSum (fun (K : ℕ) => if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)) (∑ K ∈ Finset.range (n + (1 : ℕ)), if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ))Leaves
HasSum (fun (K : ℕ) => if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)) P, withh0 : HasSum (fun (K : ℕ) => if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)) (∑ K ∈ Finset.range (n + (1 : ℕ)), if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)).Uses library
HasSumHasSum f a Lmeans that the (potentially infinite) sum of thef bforb : βconverges toaalong the SummationFilterL. ,Finset.rangerange nis the set of natural numbers less thann. ,hasSum_sum_of_ne_finset_zeroIf a functionfvanishes outside of a finite sets, then itHasSum∑ b ∈ s, f b. ,if_neg.Lean, lines 419–423
have h0 : HasSum (fun K => if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) (∑ K ∈ Finset.range (n + 1), if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) := hasSum_sum_of_ne_finset_zero (fun b hb => by rw [if_neg (by simpa using hb)])targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 419–423 at
df09144aaebf↗h4_series.hP.h1have(∑ K ∈ Finset.range (n + (1 : ℕ)), if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)) = PLeaves
HasSum (fun (K : ℕ) => if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)) P, withh1 : (∑ K ∈ Finset.range (n + (1 : ℕ)), if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)) = P.Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.sum_congr,rflrfl : a = ais the unique constructor of the equality type. ,if_pos,Finset.mem_range.Lean, lines 424–427
have h1 : (∑ K ∈ Finset.range (n + 1), if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) = P := by rw [hPdef] exact Finset.sum_congr rfl (fun K hK => by rw [if_pos (Finset.mem_range.mp hK)])targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 424–427 at
df09144aaebf↗
h4_series.hDhaveHasSum (fun (b : ℕ) => (∑ j ∈ Finset.range (n + (1 : ℕ)), if j < b then (↑(Qc n j) : ℝ) * a (b - j - (1 : ℕ)) * x ^ b else (0 : ℝ)) - if b < n + (1 : ℕ) then (∑ j ∈ Finset.range (b + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (b - j) - (1 : ℝ))) * x ^ b else (0 : ℝ)) ((∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ j) * A - P)Leaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withhD : HasSum (fun (b : ℕ) => (∑ j ∈ Finset.range (n + (1 : ℕ)), if j < b then (↑(Qc n j) : ℝ) * a (b - j - (1 : ℕ)) * x ^ b else (0 : ℝ)) - if b < n + (1 : ℕ) then (∑ j ∈ Finset.range (b + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (b - j) - (1 : ℝ))) * x ^ b else (0 : ℝ)) ((∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ j) * A - P).Lean, line 430
have hD := hC.sub hP
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 430 at
df09144aaebf↗h4_series.hvalhave(↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) = (∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ j) * A - PLeaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)), withhval : (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) = (∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ j) * A - P.Uses library
Finset.rangerange nis the set of natural numbers less thann. .Lean, lines 431–433
have hval : (Qx n : ℝ) * (3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3)) - (Aq n : ℝ) = (∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) * x ^ j) * A - P := by rw [h3T, hAqR, hQxR]; ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 431–433 at
df09144aaebf↗h4_series.hid1have∀ j ≤ n, Qc n j * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ L)Leaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ j) * A - P), withhid1 : ∀ j ≤ n, Qc n j * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ i) = ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ j - (2 : ℚ) ^ L).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. .Lean, lines 435–436
have hid1 : ∀ j ≤ n, Qc n j * 2 ^ j * ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ j - 2 ^ i) = ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ L) := fun j hj => by subst hQc; exact id1_full n j hjtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 435–436 at
df09144aaebf↗h4_series.hfunhave(fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ K else (0 : ℝ)) = fun (K : ℕ) => (∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) - if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)Leaves
HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K else (0 : ℝ)) ((∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ j) * A - P), withhfun : (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ K else (0 : ℝ)) = fun (K : ℕ) => (∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) - if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ).Uses library
Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.rangerange nis the set of natural numbers less thann. .Lean, lines 437–477
have hfun : (fun K : ℕ => if 2 * n < K then ((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) * ((3 : ℝ) / 2 ^ n) ^ K else 0) = fun K => (∑ j ∈ Finset.range (n + 1), if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) - (if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) := by funext K symm by_cases hK : K < n + 1 · rw [if_pos hK, if_neg (by omega)] rw [Finset.sum_range_succ (fun j => (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) K, Nat.sub_self, pow_zero, sub_self, div_zero, add_zero] have hsplit : ∑ j ∈ Finset.range (n + 1), (if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) = ∑ j ∈ Finset.range K, (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1) * x ^ K := by rw [← Finset.sum_range_add_sum_Ico _ (show K ≤ n + 1 by omega)] rw [Finset.sum_eq_zero (s := Finset.Ico K (n + 1)) (fun j hj => by rw [if_neg (by have := Finset.mem_Ico.mp hj; omega)]), add_zero] refine Finset.sum_congr rfl (fun j hj => ?_) have hjK := Finset.mem_range.mp hj rw [if_pos hjK] simp only [hadef] rw [show K - j - 1 + 1 = K - j by omega] ring rw [hsplit, Finset.sum_mul, sub_self] · rw [if_neg hK, sub_zero] have hS : ∑ j ∈ Finset.range (n + 1), (if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) = ((∑ j ∈ Finset.range (n + 1), Qc n j / ((2 : ℚ) ^ (K - j) - 1) : ℚ) : ℝ) * x ^ K := by push_cast rw [Finset.sum_mul] refine Finset.sum_congr rfl (fun j hj => ?_) have hjK : j < K := by have := Finset.mem_range.mp hj; omega rw [if_pos hjK] simp only [hadef] rw [show K - j - 1 + 1 = K - j by omega] ring rw [hS, tail_coeff n K (by omega) Qc hid1] push_cast by_cases h2 : 2 * n < K · rw [if_pos h2] · rw [if_neg h2] rw [Finset.prod_eq_zero (i := K) (Finset.mem_Ioc.mpr ⟨by omega, by omega⟩) (sub_self _)] simptargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 437–477 at
df09144aaebf↗h4_series.hfun.s1caseLeaves
((∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) - if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)) = if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ K else (0 : ℝ).Uses library
if_pos,if_neg,Finset.sum_range_succ,Nat.sub_self,pow_zero,sub_self,div_zero,add_zero,Finset.sum_mul.Lean, lines 445–459
· rw [if_pos hK, if_neg (by omega)] rw [Finset.sum_range_succ (fun j => (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) K, Nat.sub_self, pow_zero, sub_self, div_zero, add_zero] have hsplit : ∑ j ∈ Finset.range (n + 1), (if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) = ∑ j ∈ Finset.range K, (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1) * x ^ K := by rw [← Finset.sum_range_add_sum_Ico _ (show K ≤ n + 1 by omega)] rw [Finset.sum_eq_zero (s := Finset.Ico K (n + 1)) (fun j hj => by rw [if_neg (by have := Finset.mem_Ico.mp hj; omega)]), add_zero] refine Finset.sum_congr rfl (fun j hj => ?_) have hjK := Finset.mem_range.mp hj rw [if_pos hjK] simp only [hadef] rw [show K - j - 1 + 1 = K - j by omega] ring rw [hsplit, Finset.sum_mul, sub_self]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 445–459 at
df09144aaebf↗h4_series.hfun.s1.hsplithave(∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) = ∑ j ∈ Finset.range K, (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ)) * x ^ KLeaves
(∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) - (∑ x ∈ Finset.range K, (↑(Qc n x) : ℝ) / ((2 : ℝ) ^ (K - x) - (1 : ℝ))) * x ^ K = (0 : ℝ), withhsplit : (∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) = ∑ j ∈ Finset.range K, (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ)) * x ^ K.Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.sum_range_add_sum_Ico,Finset.sum_eq_zero,Finset.IcoThe finset $[a, b)$ of elementsxsuch thata ≤ xandx < b. ,if_neg,add_zero,Finset.sum_congr,rflrfl : a = ais the unique constructor of the equality type. ,if_pos.Lean, lines 448–458
have hsplit : ∑ j ∈ Finset.range (n + 1), (if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) = ∑ j ∈ Finset.range K, (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1) * x ^ K := by rw [← Finset.sum_range_add_sum_Ico _ (show K ≤ n + 1 by omega)] rw [Finset.sum_eq_zero (s := Finset.Ico K (n + 1)) (fun j hj => by rw [if_neg (by have := Finset.mem_Ico.mp hj; omega)]), add_zero] refine Finset.sum_congr rfl (fun j hj => ?_) have hjK := Finset.mem_range.mp hj rw [if_pos hjK] simp only [hadef] rw [show K - j - 1 + 1 = K - j by omega] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 448–458 at
df09144aaebf↗h4_series.hfun.s1.hsplit.thishaveK ≤ j ∧ j < n + (1 : ℕ)Leaves
¬j < K, withthis : K ≤ j ∧ j < n + (1 : ℕ).Uses library
Finset.mem_Ico.Lean, line 452
rw [if_neg (by have := Finset.mem_Ico.mp hj; omega)]), add_zero]
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 452 at
df09144aaebf↗h4_series.hfun.s1.hsplit.hjKhavej < KLeaves
(if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) = (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ)) * x ^ K, withhjK : j < K.Uses library
Finset.mem_range.Lean, line 454
have hjK := Finset.mem_range.mp hj
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 454 at
df09144aaebf↗
h4_series.hfun.s2caseLeaves
((∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) - if K < n + (1 : ℕ) then (∑ j ∈ Finset.range (K + (1 : ℕ)), (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ))) * x ^ K else (0 : ℝ)) = if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ K else (0 : ℝ).Uses library
if_neg,sub_zero.Lean, lines 460–477
· rw [if_neg hK, sub_zero] have hS : ∑ j ∈ Finset.range (n + 1), (if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) = ((∑ j ∈ Finset.range (n + 1), Qc n j / ((2 : ℚ) ^ (K - j) - 1) : ℚ) : ℝ) * x ^ K := by push_cast rw [Finset.sum_mul] refine Finset.sum_congr rfl (fun j hj => ?_) have hjK : j < K := by have := Finset.mem_range.mp hj; omega rw [if_pos hjK] simp only [hadef] rw [show K - j - 1 + 1 = K - j by omega] ring rw [hS, tail_coeff n K (by omega) Qc hid1] push_cast by_cases h2 : 2 * n < K · rw [if_pos h2] · rw [if_neg h2] rw [Finset.prod_eq_zero (i := K) (Finset.mem_Ioc.mpr ⟨by omega, by omega⟩) (sub_self _)] simptargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 460–477 at
df09144aaebf↗h4_series.hfun.s2.hShave(∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) = (↑(∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ))) : ℝ) * x ^ KLeaves
(∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) = if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ K else (0 : ℝ), withhS : (∑ j ∈ Finset.range (n + (1 : ℕ)), if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) = (↑(∑ j ∈ Finset.range (n + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (K - j) - (1 : ℚ))) : ℝ) * x ^ K.Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.sum_mul,Finset.sum_congr,rflrfl : a = ais the unique constructor of the equality type. ,if_pos.Lean, lines 461–470
have hS : ∑ j ∈ Finset.range (n + 1), (if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) = ((∑ j ∈ Finset.range (n + 1), Qc n j / ((2 : ℚ) ^ (K - j) - 1) : ℚ) : ℝ) * x ^ K := by push_cast rw [Finset.sum_mul] refine Finset.sum_congr rfl (fun j hj => ?_) have hjK : j < K := by have := Finset.mem_range.mp hj; omega rw [if_pos hjK] simp only [hadef] rw [show K - j - 1 + 1 = K - j by omega] ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 461–470 at
df09144aaebf↗h4_series.hfun.s2.hS.hjKhavej < KLeaves
(if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) = (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ)) * x ^ K, withhjK : j < K.Lean, line 466
have hjK : j < K := by have := Finset.mem_range.mp hj; omega
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 466 at
df09144aaebf↗h4_series.hfun.s2.hS.hjK.thishavej < n + (1 : ℕ)Leaves
j < K, withthis : j < n + (1 : ℕ).Uses library
Finset.mem_range.Lean, line 466
have hjK : j < K := by have := Finset.mem_range.mp hj; omega
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 466 at
df09144aaebf↗
h4_series.hfun.s2.s2caseLeaves
((∏ x ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ x)) / ∏ x ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ x)) * x ^ K = if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ K else (0 : ℝ).Uses library
if_pos.Lean, line 474
· rw [if_pos h2]
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 474 at
df09144aaebf↗h4_series.hfun.s2.s3caseLeaves
((∏ x ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ x)) / ∏ x ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ x)) * x ^ K = if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ K else (0 : ℝ).Uses library
if_neg,Finset.prod_eq_zero,Finset.mem_Ioc,And.introAnd.intro : a → b → a ∧ bis the constructor for the And operation. ,sub_self.Lean, lines 475–477
· rw [if_neg h2] rw [Finset.prod_eq_zero (i := K) (Finset.mem_Ioc.mpr ⟨by omega, by omega⟩) (sub_self _)] simptargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 475–477 at
df09144aaebf↗
prod_one_sub_gehave∀ (s : Finset ℕ) (a : ℕ → ℝ), (∀ i ∈ s, (0 : ℝ) ≤ a i) → (∀ i ∈ s, a i ≤ (1 : ℝ)) → (1 : ℝ) - ∑ i ∈ s, a i ≤ ∏ i ∈ s, ((1 : ℝ) - a i)Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withprod_one_sub_ge : ∀ (s : Finset ℕ) (a : ℕ → ℝ), (∀ i ∈ s, (0 : ℝ) ≤ a i) → (∀ i ∈ s, a i ≤ (1 : ℝ)) → (1 : ℝ) - ∑ i ∈ s, a i ≤ ∏ i ∈ s, ((1 : ℝ) - a i).Uses library
FinsetFinset αis the type of finite sets of elements ofα. ,Finset.induction_onTo prove a proposition about an arbitraryFinset α, it suffices to prove it for the emptyFinset, and to show that if it holds for someFinset α, then it holds for theFinsetobtained by inserting a new element. .Lean, lines 482–497
have prod_one_sub_ge : ∀ (s : Finset ℕ) (a : ℕ → ℝ) (h0 : ∀ i ∈ s, 0 ≤ a i) (h1 : ∀ i ∈ s, a i ≤ 1), 1 - ∑ i ∈ s, a i ≤ ∏ i ∈ s, (1 - a i) := by intro s a h0 h1 induction s using Finset.induction_on with | empty => simp | insert j s hj ih => rw [Finset.sum_insert hj, Finset.prod_insert hj] have ih' := ih (fun i hi => h0 i (Finset.mem_insert_of_mem hi)) (fun i hi => h1 i (Finset.mem_insert_of_mem hi)) have haj0 := h0 j (Finset.mem_insert_self j s) have haj1 := h1 j (Finset.mem_insert_self j s) have hP : 0 ≤ ∏ i ∈ s, (1 - a i) := Finset.prod_nonneg (fun i hi => by linarith [h1 i (Finset.mem_insert_of_mem hi)]) have hP1 : ∏ i ∈ s, (1 - a i) ≤ 1 := Finset.prod_le_one (fun i hi => by linarith [h1 i (Finset.mem_insert_of_mem hi)]) (fun i hi => by linarith [h0 i (Finset.mem_insert_of_mem hi)]) nlinarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 482–497 at
df09144aaebf↗prod_one_sub_ge.s1case printed form did not read back: shown as its Lean lines onlyprod_one_sub_ge.s2caseLeaves
(1 : ℝ) - ∑ i ∈ insert j s, a i ≤ ∏ i ∈ insert j s, ((1 : ℝ) - a i), withj : ℕ,s : Finset ℕ,hj : j ∉ s,ih : (∀ i ∈ s, (0 : ℝ) ≤ a i) → (∀ i ∈ s, a i ≤ (1 : ℝ)) → (1 : ℝ) - ∑ i ∈ s, a i ≤ ∏ i ∈ s, ((1 : ℝ) - a i),h0 : ∀ i ∈ insert j s, (0 : ℝ) ≤ a i,h1 : ∀ i ∈ insert j s, a i ≤ (1 : ℝ).Uses library
Finset.sum_insert,Finset.prod_insert.Lean, lines 487–497
| insert j s hj ih => rw [Finset.sum_insert hj, Finset.prod_insert hj] have ih' := ih (fun i hi => h0 i (Finset.mem_insert_of_mem hi)) (fun i hi => h1 i (Finset.mem_insert_of_mem hi)) have haj0 := h0 j (Finset.mem_insert_self j s) have haj1 := h1 j (Finset.mem_insert_self j s) have hP : 0 ≤ ∏ i ∈ s, (1 - a i) := Finset.prod_nonneg (fun i hi => by linarith [h1 i (Finset.mem_insert_of_mem hi)]) have hP1 : ∏ i ∈ s, (1 - a i) ≤ 1 := Finset.prod_le_one (fun i hi => by linarith [h1 i (Finset.mem_insert_of_mem hi)]) (fun i hi => by linarith [h0 i (Finset.mem_insert_of_mem hi)]) nlinarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 487–497 at
df09144aaebf↗prod_one_sub_ge.s2.ih'have(1 : ℝ) - ∑ i ∈ s, a i ≤ ∏ i ∈ s, ((1 : ℝ) - a i)Leaves
(1 : ℝ) - (a j + ∑ x ∈ s, a x) ≤ ((1 : ℝ) - a j) * ∏ x ∈ s, ((1 : ℝ) - a x), withih' : (1 : ℝ) - ∑ i ∈ s, a i ≤ ∏ i ∈ s, ((1 : ℝ) - a i).Uses library
Finset.mem_insert_of_mem.Lean, line 489
have ih' := ih (fun i hi => h0 i (Finset.mem_insert_of_mem hi)) (fun i hi => h1 i (Finset.mem_insert_of_mem hi))
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 489 at
df09144aaebf↗prod_one_sub_ge.s2.haj0have(0 : ℝ) ≤ a jLeaves
(1 : ℝ) - (a j + ∑ x ∈ s, a x) ≤ ((1 : ℝ) - a j) * ∏ x ∈ s, ((1 : ℝ) - a x), withhaj0 : (0 : ℝ) ≤ a j.Uses library
Finset.mem_insert_self.Lean, line 490
have haj0 := h0 j (Finset.mem_insert_self j s)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 490 at
df09144aaebf↗prod_one_sub_ge.s2.haj1havea j ≤ (1 : ℝ)Leaves
(1 : ℝ) - (a j + ∑ x ∈ s, a x) ≤ ((1 : ℝ) - a j) * ∏ x ∈ s, ((1 : ℝ) - a x), withhaj1 : a j ≤ (1 : ℝ).Uses library
Finset.mem_insert_self.Lean, line 491
have haj1 := h1 j (Finset.mem_insert_self j s)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 491 at
df09144aaebf↗prod_one_sub_ge.s2.hPhave(0 : ℝ) ≤ ∏ i ∈ s, ((1 : ℝ) - a i)Leaves
(1 : ℝ) - (a j + ∑ x ∈ s, a x) ≤ ((1 : ℝ) - a j) * ∏ x ∈ s, ((1 : ℝ) - a x), withhP : (0 : ℝ) ≤ ∏ i ∈ s, ((1 : ℝ) - a i).Uses library
Finset.prod_nonneg,Finset.mem_insert_of_mem.Lean, lines 492–493
have hP : 0 ≤ ∏ i ∈ s, (1 - a i) := Finset.prod_nonneg (fun i hi => by linarith [h1 i (Finset.mem_insert_of_mem hi)])targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 492–493 at
df09144aaebf↗prod_one_sub_ge.s2.hP1have∏ i ∈ s, ((1 : ℝ) - a i) ≤ (1 : ℝ)Leaves
(1 : ℝ) - (a j + ∑ x ∈ s, a x) ≤ ((1 : ℝ) - a j) * ∏ x ∈ s, ((1 : ℝ) - a x), withhP1 : ∏ i ∈ s, ((1 : ℝ) - a i) ≤ (1 : ℝ).Uses library
Finset.prod_le_oneIf eachf i,i ∈ sbelongs to[0, 1], then their product is less than or equal to one. ,Finset.mem_insert_of_mem.Lean, lines 494–496
have hP1 : ∏ i ∈ s, (1 - a i) ≤ 1 := Finset.prod_le_one (fun i hi => by linarith [h1 i (Finset.mem_insert_of_mem hi)]) (fun i hi => by linarith [h0 i (Finset.mem_insert_of_mem hi)])targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 494–496 at
df09144aaebf↗
nd_boundhave∀ (n K : ℕ), (1 : ℕ) ≤ n → (2 : ℕ) * n + (1 : ℕ) ≤ K → (0 : ℝ) < (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ∧ (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ KLeaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withnd_bound : ∀ (n K : ℕ), (1 : ℕ) ≤ n → (2 : ℕ) * n + (1 : ℕ) ≤ K → (0 : ℝ) < (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ∧ (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K.Uses library
Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.rangerange nis the set of natural numbers less thann. ,And.introAnd.intro : a → b → a ∧ bis the constructor for the And operation. ,div_pos,div_le_iff₀Seediv_le_iff₀'for a version with multiplication on the other side. .Lean, lines 499–554
have nd_bound : ∀ (n K : ℕ) (hn : 1 ≤ n) (hK : 2 * n + 1 ≤ K), 0 < (∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) ∧ (∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) ≤ 2 * (1 / 2) ^ K := by intro n K hn hK have hlt : ∀ i, i < K → (0 : ℝ) < 2 ^ K - 2 ^ i := fun i hi => by have : (2 : ℝ) ^ i < 2 ^ K := pow_lt_pow_right₀ (by norm_num) hi linarith have hNpos : 0 < ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L) := Finset.prod_pos (fun L hL => hlt L (by have := Finset.mem_Ioc.mp hL; omega)) have hDpos : 0 < ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) := Finset.prod_pos (fun i hi => hlt i (by have := Finset.mem_range.mp hi; omega)) refine ⟨div_pos hNpos hDpos, ?_⟩ have hN : ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L) ≤ (2 ^ K) ^ n := by have := Finset.prod_le_prod (s := Finset.Ioc n (2 * n)) (f := fun L => (2 : ℝ) ^ K - 2 ^ L) (g := fun _ => (2 : ℝ) ^ K) (fun L hL => le_of_lt (hlt L (by have := Finset.mem_Ioc.mp hL; omega))) (fun L _ => by have : (0 : ℝ) < 2 ^ L := by positivity linarith) rw [Finset.prod_const, Nat.card_Ioc, show 2 * n - n = n by omega] at this exact this have hD : (2 ^ K) ^ (n + 1) / 2 ≤ ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) := by have hfac : ∀ i ∈ Finset.range (n + 1), (2 : ℝ) ^ K - 2 ^ i = 2 ^ K * (1 - (1 / 2) ^ (K - i)) := by intro i hi have hiK : i ≤ K := by have := Finset.mem_range.mp hi; omega have e : (2 : ℝ) ^ K = 2 ^ i * 2 ^ (K - i) := by rw [← pow_add]; congr 1; omega rw [mul_sub, mul_one, one_div_pow, mul_one_div, e] field_simp rw [Finset.prod_congr rfl hfac, Finset.prod_mul_distrib, Finset.prod_const, Finset.card_range] have hsum : ∑ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (K - i) ≤ 1 / 2 := by have e : ∀ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (K - i) = (1 / 2) ^ (K - n) * (1 / 2) ^ (n - i) := by intro i hi have := Finset.mem_range.mp hi rw [← pow_add]; congr 1; omega rw [Finset.sum_congr rfl e, ← Finset.mul_sum] have hg : ∑ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (n - i) ≤ 2 := by have hr := Finset.sum_range_reflect (fun i => ((1 : ℝ) / 2) ^ i) (n + 1) simp only [Nat.add_sub_cancel] at hr rw [hr] exact sum_geometric_two_le (n + 1) have hk : ((1 : ℝ) / 2) ^ (K - n) ≤ (1 / 2) ^ 2 := pow_le_pow_of_le_one (by norm_num) (by norm_num) (by omega) have hpos : 0 ≤ ((1 : ℝ) / 2) ^ (K - n) := by positivity nlinarith have hprod := prod_one_sub_ge (Finset.range (n + 1)) (fun i => ((1 : ℝ) / 2) ^ (K - i)) (fun i _ => by positivity) (fun i _ => pow_le_one₀ (by norm_num) (by norm_num)) have h2K : (0 : ℝ) < (2 ^ K) ^ (n + 1) := by positivity nlinarith rw [div_le_iff₀ hDpos] have h2K : (2 : ℝ) ^ K * (1 / 2) ^ K = 1 := by rw [← mul_pow]; norm_num have e2 : 2 * (1 / 2 : ℝ) ^ K * ((2 ^ K) ^ (n + 1) / 2) = (2 ^ K) ^ n := by rw [pow_succ] calc 2 * (1 / 2 : ℝ) ^ K * ((2 ^ K) ^ n * 2 ^ K / 2) = (2 ^ K * (1 / 2) ^ K) * (2 ^ K) ^ n := by ring _ = (2 ^ K) ^ n := by rw [h2K, one_mul] calc ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L) ≤ (2 ^ K) ^ n := hN _ = 2 * (1 / 2) ^ K * ((2 ^ K) ^ (n + 1) / 2) := e2.symm _ ≤ 2 * (1 / 2) ^ K * ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) := by gcongrtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 499–554 at
df09144aaebf↗nd_bound.hlthave∀ i < K, (0 : ℝ) < (2 : ℝ) ^ K - (2 : ℝ) ^ iLeaves
(0 : ℝ) < (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ∧ (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K, withhlt : ∀ i < K, (0 : ℝ) < (2 : ℝ) ^ K - (2 : ℝ) ^ i.Lean, lines 504–506
have hlt : ∀ i, i < K → (0 : ℝ) < 2 ^ K - 2 ^ i := fun i hi => by have : (2 : ℝ) ^ i < 2 ^ K := pow_lt_pow_right₀ (by norm_num) hi linarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 504–506 at
df09144aaebf↗nd_bound.hlt.thishave(2 : ℝ) ^ i < (2 : ℝ) ^ KLeaves
(0 : ℝ) < (2 : ℝ) ^ K - (2 : ℝ) ^ i, withthis : (2 : ℝ) ^ i < (2 : ℝ) ^ K.Uses library
pow_lt_pow_right₀.Lean, line 505
have : (2 : ℝ) ^ i < 2 ^ K := pow_lt_pow_right₀ (by norm_num) hi
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 505 at
df09144aaebf↗
nd_bound.hNposhave(0 : ℝ) < ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)Leaves
(0 : ℝ) < (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ∧ (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K, withhNpos : (0 : ℝ) < ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L).Uses library
Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.prod_pos.Lean, lines 507–508
have hNpos : 0 < ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L) := Finset.prod_pos (fun L hL => hlt L (by have := Finset.mem_Ioc.mp hL; omega))targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 507–508 at
df09144aaebf↗nd_bound.hNpos.thishaven < L ∧ L ≤ (2 : ℕ) * nLeaves
L < K, withthis : n < L ∧ L ≤ (2 : ℕ) * n.Uses library
Finset.mem_Ioc.Lean, line 508
Finset.prod_pos (fun L hL => hlt L (by have := Finset.mem_Ioc.mp hL; omega))
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 508 at
df09144aaebf↗
nd_bound.hDposhave(0 : ℝ) < ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)Leaves
(0 : ℝ) < (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ∧ (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K, withhDpos : (0 : ℝ) < ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.prod_pos.Lean, lines 509–510
have hDpos : 0 < ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) := Finset.prod_pos (fun i hi => hlt i (by have := Finset.mem_range.mp hi; omega))targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 509–510 at
df09144aaebf↗nd_bound.hDpos.thishavei < n + (1 : ℕ)Leaves
i < K, withthis : i < n + (1 : ℕ).Uses library
Finset.mem_range.Lean, line 510
Finset.prod_pos (fun i hi => hlt i (by have := Finset.mem_range.mp hi; omega))
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 510 at
df09144aaebf↗
nd_bound.hNhave∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L) ≤ ((2 : ℝ) ^ K) ^ nLeaves
(∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K, withhN : ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L) ≤ ((2 : ℝ) ^ K) ^ n.Uses library
Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.prod_const,Nat.card_Ioc.Lean, lines 512–518
have hN : ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L) ≤ (2 ^ K) ^ n := by have := Finset.prod_le_prod (s := Finset.Ioc n (2 * n)) (f := fun L => (2 : ℝ) ^ K - 2 ^ L) (g := fun _ => (2 : ℝ) ^ K) (fun L hL => le_of_lt (hlt L (by have := Finset.mem_Ioc.mp hL; omega))) (fun L _ => by have : (0 : ℝ) < 2 ^ L := by positivity linarith) rw [Finset.prod_const, Nat.card_Ioc, show 2 * n - n = n by omega] at this exact thistargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 512–518 at
df09144aaebf↗nd_bound.hN.thishave∏ i ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ ∏ i ∈ Finset.Ioc n ((2 : ℕ) * n), (2 : ℝ) ^ KLeaves
∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L) ≤ ((2 : ℝ) ^ K) ^ n, withthis : ∏ i ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ ∏ i ∈ Finset.Ioc n ((2 : ℕ) * n), (2 : ℝ) ^ K.Uses library
Finset.prod_le_prodIf allf i,i ∈ s, are nonnegative and eachf iis less than or equal tog i, then the product off iis less than or equal to the product ofg i. ,Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,le_of_lt.Lean, lines 513–516
have := Finset.prod_le_prod (s := Finset.Ioc n (2 * n)) (f := fun L => (2 : ℝ) ^ K - 2 ^ L) (g := fun _ => (2 : ℝ) ^ K) (fun L hL => le_of_lt (hlt L (by have := Finset.mem_Ioc.mp hL; omega))) (fun L _ => by have : (0 : ℝ) < 2 ^ L := by positivity linarith)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 513–516 at
df09144aaebf↗nd_bound.hN.this.s1haven < L ∧ L ≤ (2 : ℕ) * nLeaves
L < K, withthis : n < L ∧ L ≤ (2 : ℕ) * n.Uses library
Finset.mem_Ioc.Lean, line 514
(fun L hL => le_of_lt (hlt L (by have := Finset.mem_Ioc.mp hL; omega))) (fun L _ => by
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 514 at
df09144aaebf↗nd_bound.hN.this.s2have(0 : ℝ) < (2 : ℝ) ^ Lroutine: positivityLeaves
(2 : ℝ) ^ K - (2 : ℝ) ^ L ≤ (2 : ℝ) ^ K, withthis : (0 : ℝ) < (2 : ℝ) ^ L.Lean, line 515
have : (0 : ℝ) < 2 ^ L := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 515 at
df09144aaebf↗
nd_bound.hDhave((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ) ≤ ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)Leaves
(∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K, withhD : ((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ) ≤ ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.prod_congr,rflrfl : a = ais the unique constructor of the equality type. ,Finset.prod_mul_distrib,Finset.prod_const,Finset.card_range.Lean, lines 519–545
have hD : (2 ^ K) ^ (n + 1) / 2 ≤ ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) := by have hfac : ∀ i ∈ Finset.range (n + 1), (2 : ℝ) ^ K - 2 ^ i = 2 ^ K * (1 - (1 / 2) ^ (K - i)) := by intro i hi have hiK : i ≤ K := by have := Finset.mem_range.mp hi; omega have e : (2 : ℝ) ^ K = 2 ^ i * 2 ^ (K - i) := by rw [← pow_add]; congr 1; omega rw [mul_sub, mul_one, one_div_pow, mul_one_div, e] field_simp rw [Finset.prod_congr rfl hfac, Finset.prod_mul_distrib, Finset.prod_const, Finset.card_range] have hsum : ∑ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (K - i) ≤ 1 / 2 := by have e : ∀ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (K - i) = (1 / 2) ^ (K - n) * (1 / 2) ^ (n - i) := by intro i hi have := Finset.mem_range.mp hi rw [← pow_add]; congr 1; omega rw [Finset.sum_congr rfl e, ← Finset.mul_sum] have hg : ∑ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (n - i) ≤ 2 := by have hr := Finset.sum_range_reflect (fun i => ((1 : ℝ) / 2) ^ i) (n + 1) simp only [Nat.add_sub_cancel] at hr rw [hr] exact sum_geometric_two_le (n + 1) have hk : ((1 : ℝ) / 2) ^ (K - n) ≤ (1 / 2) ^ 2 := pow_le_pow_of_le_one (by norm_num) (by norm_num) (by omega) have hpos : 0 ≤ ((1 : ℝ) / 2) ^ (K - n) := by positivity nlinarith have hprod := prod_one_sub_ge (Finset.range (n + 1)) (fun i => ((1 : ℝ) / 2) ^ (K - i)) (fun i _ => by positivity) (fun i _ => pow_le_one₀ (by norm_num) (by norm_num)) have h2K : (0 : ℝ) < (2 ^ K) ^ (n + 1) := by positivity nlinarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 519–545 at
df09144aaebf↗nd_bound.hD.hfachave∀ i ∈ Finset.range (n + (1 : ℕ)), (2 : ℝ) ^ K - (2 : ℝ) ^ i = (2 : ℝ) ^ K * ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - i))Leaves
((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ) ≤ ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i), withhfac : ∀ i ∈ Finset.range (n + (1 : ℕ)), (2 : ℝ) ^ K - (2 : ℝ) ^ i = (2 : ℝ) ^ K * ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - i)).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,mul_subAlias ofmul_sub_left_distrib. ,mul_one,one_div_pow,mul_one_div.Lean, lines 520–525
have hfac : ∀ i ∈ Finset.range (n + 1), (2 : ℝ) ^ K - 2 ^ i = 2 ^ K * (1 - (1 / 2) ^ (K - i)) := by intro i hi have hiK : i ≤ K := by have := Finset.mem_range.mp hi; omega have e : (2 : ℝ) ^ K = 2 ^ i * 2 ^ (K - i) := by rw [← pow_add]; congr 1; omega rw [mul_sub, mul_one, one_div_pow, mul_one_div, e] field_simptargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 520–525 at
df09144aaebf↗nd_bound.hD.hfac.hiKhavei ≤ KLeaves
(2 : ℝ) ^ K - (2 : ℝ) ^ i = (2 : ℝ) ^ K * ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - i)), withhiK : i ≤ K.Lean, line 522
have hiK : i ≤ K := by have := Finset.mem_range.mp hi; omega
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 522 at
df09144aaebf↗nd_bound.hD.hfac.hiK.thishavei < n + (1 : ℕ)Leaves
i ≤ K, withthis : i < n + (1 : ℕ).Uses library
Finset.mem_range.Lean, line 522
have hiK : i ≤ K := by have := Finset.mem_range.mp hi; omega
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 522 at
df09144aaebf↗
nd_bound.hD.hfac.ehave(2 : ℝ) ^ K = (2 : ℝ) ^ i * (2 : ℝ) ^ (K - i)Leaves
(2 : ℝ) ^ K - (2 : ℝ) ^ i = (2 : ℝ) ^ K * ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - i)), withe : (2 : ℝ) ^ K = (2 : ℝ) ^ i * (2 : ℝ) ^ (K - i).Uses library
pow_add.Lean, line 523
have e : (2 : ℝ) ^ K = 2 ^ i * 2 ^ (K - i) := by rw [← pow_add]; congr 1; omega
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 523 at
df09144aaebf↗
nd_bound.hD.hsumhave∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (K - i) ≤ (1 / 2 : ℝ)Leaves
((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ) ≤ ((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) * ∏ x ∈ Finset.range (n + (1 : ℕ)), ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - x)), withhsum : ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (K - i) ≤ (1 / 2 : ℝ).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.sum_congr,rflrfl : a = ais the unique constructor of the equality type. ,Finset.mul_sum.Lean, lines 527–541
have hsum : ∑ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (K - i) ≤ 1 / 2 := by have e : ∀ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (K - i) = (1 / 2) ^ (K - n) * (1 / 2) ^ (n - i) := by intro i hi have := Finset.mem_range.mp hi rw [← pow_add]; congr 1; omega rw [Finset.sum_congr rfl e, ← Finset.mul_sum] have hg : ∑ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (n - i) ≤ 2 := by have hr := Finset.sum_range_reflect (fun i => ((1 : ℝ) / 2) ^ i) (n + 1) simp only [Nat.add_sub_cancel] at hr rw [hr] exact sum_geometric_two_le (n + 1) have hk : ((1 : ℝ) / 2) ^ (K - n) ≤ (1 / 2) ^ 2 := pow_le_pow_of_le_one (by norm_num) (by norm_num) (by omega) have hpos : 0 ≤ ((1 : ℝ) / 2) ^ (K - n) := by positivity nlinarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 527–541 at
df09144aaebf↗nd_bound.hD.hsum.ehave∀ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (K - i) = (1 / 2 : ℝ) ^ (K - n) * (1 / 2 : ℝ) ^ (n - i)Leaves
∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (K - i) ≤ (1 / 2 : ℝ), withe : ∀ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (K - i) = (1 / 2 : ℝ) ^ (K - n) * (1 / 2 : ℝ) ^ (n - i).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,pow_add.Lean, lines 528–531
have e : ∀ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (K - i) = (1 / 2) ^ (K - n) * (1 / 2) ^ (n - i) := by intro i hi have := Finset.mem_range.mp hi rw [← pow_add]; congr 1; omegatargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 528–531 at
df09144aaebf↗nd_bound.hD.hsum.e.thishavei < n + (1 : ℕ)Leaves
(1 / 2 : ℝ) ^ (K - i) = (1 / 2 : ℝ) ^ (K - n) * (1 / 2 : ℝ) ^ (n - i), withthis : i < n + (1 : ℕ).Uses library
Finset.mem_range.Lean, line 530
have := Finset.mem_range.mp hi
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 530 at
df09144aaebf↗
nd_bound.hD.hsum.hghave∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n - i) ≤ (2 : ℝ)Leaves
(1 / 2 : ℝ) ^ (K - n) * ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n - i) ≤ (1 / 2 : ℝ), withhg : ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n - i) ≤ (2 : ℝ).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Nat.add_sub_cancel,sum_geometric_two_le.Lean, lines 533–537
have hg : ∑ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (n - i) ≤ 2 := by have hr := Finset.sum_range_reflect (fun i => ((1 : ℝ) / 2) ^ i) (n + 1) simp only [Nat.add_sub_cancel] at hr rw [hr] exact sum_geometric_two_le (n + 1)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 533–537 at
df09144aaebf↗nd_bound.hD.hsum.hg.hrhave∑ j ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n + (1 : ℕ) - (1 : ℕ) - j) = ∑ j ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ jLeaves
∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n - i) ≤ (2 : ℝ), withhr : ∑ j ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n + (1 : ℕ) - (1 : ℕ) - j) = ∑ j ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ j.Uses library
Finset.sum_range_reflect.Lean, line 534
have hr := Finset.sum_range_reflect (fun i => ((1 : ℝ) / 2) ^ i) (n + 1)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 534 at
df09144aaebf↗
nd_bound.hD.hsum.hkhave(1 / 2 : ℝ) ^ (K - n) ≤ (1 / 2 : ℝ) ^ (2 : ℕ)Leaves
(1 / 2 : ℝ) ^ (K - n) * ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n - i) ≤ (1 / 2 : ℝ), withhk : (1 / 2 : ℝ) ^ (K - n) ≤ (1 / 2 : ℝ) ^ (2 : ℕ).Uses library
pow_le_pow_of_le_one.Lean, lines 538–539
have hk : ((1 : ℝ) / 2) ^ (K - n) ≤ (1 / 2) ^ 2 := pow_le_pow_of_le_one (by norm_num) (by norm_num) (by omega)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 538–539 at
df09144aaebf↗nd_bound.hD.hsum.hposhave(0 : ℝ) ≤ (1 / 2 : ℝ) ^ (K - n)routine: positivityLeaves
(1 / 2 : ℝ) ^ (K - n) * ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n - i) ≤ (1 / 2 : ℝ), withhpos : (0 : ℝ) ≤ (1 / 2 : ℝ) ^ (K - n).Lean, line 540
have hpos : 0 ≤ ((1 : ℝ) / 2) ^ (K - n) := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 540 at
df09144aaebf↗
nd_bound.hD.hprodhave(1 : ℝ) - ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (K - i) ≤ ∏ i ∈ Finset.range (n + (1 : ℕ)), ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - i))Leaves
((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ) ≤ ((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) * ∏ x ∈ Finset.range (n + (1 : ℕ)), ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - x)), withhprod : (1 : ℝ) - ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (K - i) ≤ ∏ i ∈ Finset.range (n + (1 : ℕ)), ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - i)).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,pow_le_one₀.Lean, lines 542–543
have hprod := prod_one_sub_ge (Finset.range (n + 1)) (fun i => ((1 : ℝ) / 2) ^ (K - i)) (fun i _ => by positivity) (fun i _ => pow_le_one₀ (by norm_num) (by norm_num))targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 542–543 at
df09144aaebf↗nd_bound.hD.h2Khave(0 : ℝ) < ((2 : ℝ) ^ K) ^ (n + (1 : ℕ))routine: positivityLeaves
((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ) ≤ ((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) * ∏ x ∈ Finset.range (n + (1 : ℕ)), ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - x)), withh2K : (0 : ℝ) < ((2 : ℝ) ^ K) ^ (n + (1 : ℕ)).Lean, line 544
have h2K : (0 : ℝ) < (2 ^ K) ^ (n + 1) := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 544 at
df09144aaebf↗
nd_bound.h2Khave(2 : ℝ) ^ K * (1 / 2 : ℝ) ^ K = (1 : ℝ)Leaves
∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K * ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i), withh2K : (2 : ℝ) ^ K * (1 / 2 : ℝ) ^ K = (1 : ℝ).Uses library
mul_pow.Lean, line 547
have h2K : (2 : ℝ) ^ K * (1 / 2) ^ K = 1 := by rw [← mul_pow]; norm_num
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 547 at
df09144aaebf↗nd_bound.e2have(2 : ℝ) * (1 / 2 : ℝ) ^ K * (((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ)) = ((2 : ℝ) ^ K) ^ nLeaves
∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K * ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i), withe2 : (2 : ℝ) * (1 / 2 : ℝ) ^ K * (((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ)) = ((2 : ℝ) ^ K) ^ n.Uses library
pow_succ.Lean, lines 548–551
have e2 : 2 * (1 / 2 : ℝ) ^ K * ((2 ^ K) ^ (n + 1) / 2) = (2 ^ K) ^ n := by rw [pow_succ] calc 2 * (1 / 2 : ℝ) ^ K * ((2 ^ K) ^ n * 2 ^ K / 2) = (2 ^ K * (1 / 2) ^ K) * (2 ^ K) ^ n := by ring _ = (2 ^ K) ^ n := by rw [h2K, one_mul]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 548–551 at
df09144aaebf↗nd_bound.e2.s1calc(2 : ℝ) * (1 / 2 : ℝ) ^ K * (((2 : ℝ) ^ K) ^ n * (2 : ℝ) ^ K / (2 : ℝ)) = (2 : ℝ) ^ K * (1 / 2 : ℝ) ^ K * ((2 : ℝ) ^ K) ^ nroutine: ringCloses the goal.
Lean, line 550
calc 2 * (1 / 2 : ℝ) ^ K * ((2 ^ K) ^ n * 2 ^ K / 2) = (2 ^ K * (1 / 2) ^ K) * (2 ^ K) ^ n := by ring
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 550 at
df09144aaebf↗nd_bound.e2.s2calcCloses the goal.
Uses library
one_mul.Lean, line 551
_ = (2 ^ K) ^ n := by rw [h2K, one_mul]
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 551 at
df09144aaebf↗
nd_bound.s8calc∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L) ≤ ((2 : ℝ) ^ K) ^ nCloses the goal.
Uses library
Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. .Lean, line 552
calc ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L) ≤ (2 ^ K) ^ n := hN
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 552 at
df09144aaebf↗nd_bound.s9calc((2 : ℝ) ^ K) ^ n = (2 : ℝ) * (1 / 2 : ℝ) ^ K * (((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ))Closes the goal.
Lean, line 553
_ = 2 * (1 / 2) ^ K * ((2 ^ K) ^ (n + 1) / 2) := e2.symm
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 553 at
df09144aaebf↗nd_bound.s10calcCloses the goal.
Uses library
Finset.rangerange nis the set of natural numbers less thann. .Lean, line 554
_ ≤ 2 * (1 / 2) ^ K * ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) := by gcongr
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 554 at
df09144aaebf↗
ineq_powhave∀ (n : ℕ), (2 : ℕ) ≤ n → (9 : ℕ) * (81 : ℕ) ^ n ≤ (256 : ℕ) ^ nLeaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withineq_pow : ∀ (n : ℕ), (2 : ℕ) ≤ n → (9 : ℕ) * (81 : ℕ) ^ n ≤ (256 : ℕ) ^ n.Lean, lines 557–567
have ineq_pow : ∀ (n : ℕ) (hn : 2 ≤ n), 9 * 81 ^ n ≤ 256 ^ n := by intro n hn induction n with | zero => omega | succ m ih => rcases (show m = 1 ∨ 2 ≤ m by omega) with rfl | hm · norm_num · have := ih hm rw [pow_succ, pow_succ] omegatargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 557–567 at
df09144aaebf↗ineq_pow.s1case routine: omegaLeaves
(9 : ℕ) * (81 : ℕ) ^ (0 : ℕ) ≤ (256 : ℕ) ^ (0 : ℕ), withhn : (2 : ℕ) ≤ (0 : ℕ).Uses library
Nat.zeroZero, the smallest natural number. .Lean, line 561
| zero => omega
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 561 at
df09144aaebf↗ineq_pow.s2caseLeaves
(9 : ℕ) * (81 : ℕ) ^ (m + (1 : ℕ)) ≤ (256 : ℕ) ^ (m + (1 : ℕ)), withm : ℕ,ih : (2 : ℕ) ≤ m → (9 : ℕ) * (81 : ℕ) ^ m ≤ (256 : ℕ) ^ m,hn : (2 : ℕ) ≤ m + (1 : ℕ).Uses library
Nat.succThe successor of a natural numbern. .Lean, lines 562–567
| succ m ih => rcases (show m = 1 ∨ 2 ≤ m by omega) with rfl | hm · norm_num · have := ih hm rw [pow_succ, pow_succ] omegatargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 562–567 at
df09144aaebf↗ineq_pow.s2.s1case routine: norm_numLeaves
(9 : ℕ) * (81 : ℕ) ^ ((1 : ℕ) + (1 : ℕ)) ≤ (256 : ℕ) ^ ((1 : ℕ) + (1 : ℕ)).Lean, line 564
· norm_num
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 564 at
df09144aaebf↗ineq_pow.s2.s2caseLeaves
(9 : ℕ) * (81 : ℕ) ^ (m + (1 : ℕ)) ≤ (256 : ℕ) ^ (m + (1 : ℕ)).Uses library
pow_succ.Lean, lines 565–567
· have := ih hm rw [pow_succ, pow_succ] omegatargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 565–567 at
df09144aaebf↗ineq_pow.s2.s2.thishave(9 : ℕ) * (81 : ℕ) ^ m ≤ (256 : ℕ) ^ mLeaves
(9 : ℕ) * (81 : ℕ) ^ (m + (1 : ℕ)) ≤ (256 : ℕ) ^ (m + (1 : ℕ)), withthis : (9 : ℕ) * (81 : ℕ) ^ m ≤ (256 : ℕ) ^ m.Lean, line 565
· have := ih hm
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 565 at
df09144aaebf↗
h4_bighave∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → ∀ (n : ℕ), (2 : ℕ) ≤ n → (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ))Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withh4_big : ∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → ∀ (n : ℕ), (2 : ℕ) ≤ n → (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,And.introAnd.intro : a → b → a ∧ bis the constructor for the And operation. .Lean, lines 569–662
have h4_big : ∀ (Qc : ℕ → ℕ → ℚ) (hQc : (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)))) (Qx : ℕ → ℚ) (hQx : (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k)) (Aq : ℕ → ℚ) (hAq : (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ)))) (n : ℕ) (hn : 2 ≤ n), (0 : ℝ) < (Qx n : ℝ) * (3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3)) - (Aq n : ℝ) ∧ ((Qx n : ℝ) * (3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3)) - (Aq n : ℝ)) ^ 2 * (2 : ℝ) ^ (4 * n * n) ≤ (2 : ℝ) ^ (2 * n + 4) := by intro Qc hQc Qx hQx Aq hAq n hn have hS := h4_series Qc hQc Qx hQx Aq hAq n (by omega) set r := (Qx n : ℝ) * (3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3)) - (Aq n : ℝ) with hr set x : ℝ := (3 : ℝ) / 2 ^ n with hxdef have hx0 : 0 < x := by positivity have hx2 : x / 2 ≤ 3 / 8 := by have : (4 : ℝ) ≤ 2 ^ n := by calc (4 : ℝ) = 2 ^ 2 := by norm_num _ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn rw [hxdef, div_div, div_le_div_iff₀ (by positivity) (by norm_num)]; linarith set G : ℕ → ℝ := fun K => if 2 * n < K then ((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) * x ^ K else 0 with hG have hGnn : ∀ K, 0 ≤ G K := by intro K; simp only [hG] split_ifs with h · exact mul_nonneg (le_of_lt (nd_bound n K (by omega) (by omega)).1) (by positivity) · exact le_refl 0 have hGpos : 0 < G (2 * n + 1) := by simp only [hG]; rw [if_pos (by omega)] exact mul_pos (nd_bound n (2 * n + 1) (by omega) (by omega)).1 (by positivity) refine ⟨?_, ?_⟩ · exact hasSum_lt (f := fun _ => (0 : ℝ)) (g := G) (i := 2 * n + 1) (fun K => hGnn K) hGpos hasSum_zero hS · set H : ℕ → ℝ := fun K => if 2 * n < K then 2 * (x / 2) ^ K else 0 with hH have hGH : ∀ K, G K ≤ H K := by intro K; simp only [hG, hH] split_ifs with h · have hb := (nd_bound n K (by omega) (by omega)).2 calc ((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) * x ^ K ≤ 2 * (1 / 2) ^ K * x ^ K := by gcongr _ = 2 * (x / 2) ^ K := by ring · exact le_refl 0 have hq : x / 2 < 1 := by linarith have hHsum : HasSum H (2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹) := by rw [← hasSum_nat_add_iff' (2 * n + 1)] have hz : ∑ i ∈ Finset.range (2 * n + 1), H i = 0 := Finset.sum_eq_zero (fun i hi => by simp only [hH]; rw [if_neg (by have := Finset.mem_range.mp hi; omega)]) rw [hz, sub_zero] have hgeo := (hasSum_geometric_of_lt_one (by positivity) hq).mul_left (2 * (x / 2) ^ (2 * n + 1)) have hfun : (fun s => H (s + (2 * n + 1))) = fun s => 2 * (x / 2) ^ (2 * n + 1) * (x / 2) ^ s := by funext s; simp only [hH]; rw [if_pos (by omega), pow_add]; ring rw [hfun] exact hgeo have hrle : r ≤ 2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹ := hasSum_le hGH hS hHsum have hr0 : 0 ≤ r := le_of_lt (hasSum_lt (f := fun _ => (0 : ℝ)) (g := G) (i := 2 * n + 1) (fun K => hGnn K) hGpos hasSum_zero hS) have hr8 : r ≤ 8 * (x / 2) ^ (2 * n + 1) := by have hinv : (1 - x / 2)⁻¹ ≤ 4 := by rw [inv_le_comm₀ (by linarith) (by norm_num)]; linarith have hp : 0 ≤ 2 * (x / 2) ^ (2 * n + 1) := by positivity calc r ≤ 2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹ := hrle _ ≤ 2 * (x / 2) ^ (2 * n + 1) * 4 := by gcongr _ = 8 * (x / 2) ^ (2 * n + 1) := by ring have hsq : r ^ 2 ≤ (8 * (x / 2) ^ (2 * n + 1)) ^ 2 := pow_le_pow_left₀ hr0 hr8 2 have hnat : 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) := by have e1 : (2 : ℕ) ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) = 2 ^ (4 * n * n) * (64 * 256 ^ n) := by rw [← pow_mul, ← pow_add, show (256 : ℕ) = 2 ^ 8 by norm_num, ← pow_mul, show (64 : ℕ) = 2 ^ 6 by norm_num, ← pow_add, ← pow_add] congr 1; ring have e2 : 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) = 2 ^ (4 * n * n) * (64 * (9 * 81 ^ n)) := by rw [show (81 : ℕ) = 3 ^ 4 by norm_num, ← pow_mul, pow_add]; ring rw [e1, e2] have := ineq_pow n hn gcongr have hreal : (64 : ℝ) * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) := by exact_mod_cast hnat have hx2' : x / 2 = 3 / 2 ^ (n + 1) := by rw [hxdef, pow_succ]; field_simp have hsq' : r ^ 2 ≤ 64 * (x / 2) ^ (4 * n + 2) := by calc r ^ 2 ≤ (8 * (x / 2) ^ (2 * n + 1)) ^ 2 := hsq _ = 64 * (x / 2) ^ (4 * n + 2) := by ring have hkey : (x / 2) ^ (4 * n + 2) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) = 3 ^ (4 * n + 2) := by rw [← mul_pow, hx2', div_mul_cancel₀ _ (by positivity)] have hP : (0 : ℝ) < ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) := by positivity have hmain : 64 * (x / 2) ^ (4 * n + 2) * (2 : ℝ) ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) := by refine le_of_mul_le_mul_right ?_ hP calc 64 * (x / 2) ^ (4 * n + 2) * (2 : ℝ) ^ (4 * n * n) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) = 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) := by rw [← hkey]; ring _ ≤ 2 ^ (2 * n + 4) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) := hreal calc r ^ 2 * (2 : ℝ) ^ (4 * n * n) ≤ 64 * (x / 2) ^ (4 * n + 2) * 2 ^ (4 * n * n) := by gcongr _ ≤ 2 ^ (2 * n + 4) := hmaintargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 569–662 at
df09144aaebf↗h4_big.hShaveHasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ))Leaves
(0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhS : HasSum (fun (K : ℕ) => if (2 : ℕ) * n < K then ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ K else (0 : ℝ)) ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)).Lean, line 582
have hS := h4_series Qc hQc Qx hQx Aq hAq n (by omega)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 582 at
df09144aaebf↗h4_big.hx0have(0 : ℝ) < xroutine: positivityLeaves
(0 : ℝ) < r ∧ r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhx0 : (0 : ℝ) < x.Lean, line 585
have hx0 : 0 < x := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 585 at
df09144aaebf↗h4_big.hx2havex / (2 : ℝ) ≤ (3 / 8 : ℝ)Leaves
(0 : ℝ) < r ∧ r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhx2 : x / (2 : ℝ) ≤ (3 / 8 : ℝ).Uses library
div_div,div_le_div_iff₀.Lean, lines 586–590
have hx2 : x / 2 ≤ 3 / 8 := by have : (4 : ℝ) ≤ 2 ^ n := by calc (4 : ℝ) = 2 ^ 2 := by norm_num _ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn rw [hxdef, div_div, div_le_div_iff₀ (by positivity) (by norm_num)]; linarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 586–590 at
df09144aaebf↗h4_big.hx2.thishave(4 : ℝ) ≤ (2 : ℝ) ^ nLeaves
x / (2 : ℝ) ≤ (3 / 8 : ℝ), withthis : (4 : ℝ) ≤ (2 : ℝ) ^ n.Lean, lines 587–589
have : (4 : ℝ) ≤ 2 ^ n := by calc (4 : ℝ) = 2 ^ 2 := by norm_num _ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hntargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 587–589 at
df09144aaebf↗h4_big.hx2.this.s1calc(4 : ℝ) = (2 : ℝ) ^ (2 : ℕ)routine: norm_numCloses the goal.
Lean, line 588
calc (4 : ℝ) = 2 ^ 2 := by norm_num
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 588 at
df09144aaebf↗h4_big.hx2.this.s2calc(2 : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ nCloses the goal.
Uses library
pow_le_pow_right₀.Lean, line 589
_ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 589 at
df09144aaebf↗
h4_big.hGnnhave∀ (K : ℕ), (0 : ℝ) ≤ G KLeaves
(0 : ℝ) < r ∧ r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhGnn : ∀ (K : ℕ), (0 : ℝ) ≤ G K.Lean, lines 594–598
have hGnn : ∀ K, 0 ≤ G K := by intro K; simp only [hG] split_ifs with h · exact mul_nonneg (le_of_lt (nd_bound n K (by omega) (by omega)).1) (by positivity) · exact le_refl 0targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 594–598 at
df09144aaebf↗h4_big.hGnn.s1caseLeaves
(0 : ℝ) ≤ ((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ L ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) * x ^ K.Uses library
mul_nonnegAlias ofLeft.mul_nonneg. ,le_of_lt.Lean, line 597
· exact mul_nonneg (le_of_lt (nd_bound n K (by omega) (by omega)).1) (by positivity)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 597 at
df09144aaebf↗h4_big.hGnn.s2caseLeaves
(0 : ℝ) ≤ (0 : ℝ).Uses library
le_reflThe relation≤on a preorder is reflexive. .Lean, line 598
· exact le_refl 0
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 598 at
df09144aaebf↗
h4_big.hGposhave(0 : ℝ) < G ((2 : ℕ) * n + (1 : ℕ))Leaves
(0 : ℝ) < r ∧ r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhGpos : (0 : ℝ) < G ((2 : ℕ) * n + (1 : ℕ)).Uses library
if_pos,mul_posAlias ofLeft.mul_pos. .Lean, lines 599–601
have hGpos : 0 < G (2 * n + 1) := by simp only [hG]; rw [if_pos (by omega)] exact mul_pos (nd_bound n (2 * n + 1) (by omega) (by omega)).1 (by positivity)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 599–601 at
df09144aaebf↗h4_big.s6caseLeaves
(0 : ℝ) < r.Uses library
hasSum_lt,hasSum_zeroConstant zero function has sum0.Lean, line 603
· exact hasSum_lt (f := fun _ => (0 : ℝ)) (g := G) (i := 2 * n + 1) (fun K => hGnn K) hGpos hasSum_zero hS
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 603 at
df09144aaebf↗h4_big.s7caseLeaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)).Lean, lines 604–662
· set H : ℕ → ℝ := fun K => if 2 * n < K then 2 * (x / 2) ^ K else 0 with hH have hGH : ∀ K, G K ≤ H K := by intro K; simp only [hG, hH] split_ifs with h · have hb := (nd_bound n K (by omega) (by omega)).2 calc ((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) * x ^ K ≤ 2 * (1 / 2) ^ K * x ^ K := by gcongr _ = 2 * (x / 2) ^ K := by ring · exact le_refl 0 have hq : x / 2 < 1 := by linarith have hHsum : HasSum H (2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹) := by rw [← hasSum_nat_add_iff' (2 * n + 1)] have hz : ∑ i ∈ Finset.range (2 * n + 1), H i = 0 := Finset.sum_eq_zero (fun i hi => by simp only [hH]; rw [if_neg (by have := Finset.mem_range.mp hi; omega)]) rw [hz, sub_zero] have hgeo := (hasSum_geometric_of_lt_one (by positivity) hq).mul_left (2 * (x / 2) ^ (2 * n + 1)) have hfun : (fun s => H (s + (2 * n + 1))) = fun s => 2 * (x / 2) ^ (2 * n + 1) * (x / 2) ^ s := by funext s; simp only [hH]; rw [if_pos (by omega), pow_add]; ring rw [hfun] exact hgeo have hrle : r ≤ 2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹ := hasSum_le hGH hS hHsum have hr0 : 0 ≤ r := le_of_lt (hasSum_lt (f := fun _ => (0 : ℝ)) (g := G) (i := 2 * n + 1) (fun K => hGnn K) hGpos hasSum_zero hS) have hr8 : r ≤ 8 * (x / 2) ^ (2 * n + 1) := by have hinv : (1 - x / 2)⁻¹ ≤ 4 := by rw [inv_le_comm₀ (by linarith) (by norm_num)]; linarith have hp : 0 ≤ 2 * (x / 2) ^ (2 * n + 1) := by positivity calc r ≤ 2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹ := hrle _ ≤ 2 * (x / 2) ^ (2 * n + 1) * 4 := by gcongr _ = 8 * (x / 2) ^ (2 * n + 1) := by ring have hsq : r ^ 2 ≤ (8 * (x / 2) ^ (2 * n + 1)) ^ 2 := pow_le_pow_left₀ hr0 hr8 2 have hnat : 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) := by have e1 : (2 : ℕ) ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) = 2 ^ (4 * n * n) * (64 * 256 ^ n) := by rw [← pow_mul, ← pow_add, show (256 : ℕ) = 2 ^ 8 by norm_num, ← pow_mul, show (64 : ℕ) = 2 ^ 6 by norm_num, ← pow_add, ← pow_add] congr 1; ring have e2 : 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) = 2 ^ (4 * n * n) * (64 * (9 * 81 ^ n)) := by rw [show (81 : ℕ) = 3 ^ 4 by norm_num, ← pow_mul, pow_add]; ring rw [e1, e2] have := ineq_pow n hn gcongr have hreal : (64 : ℝ) * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) := by exact_mod_cast hnat have hx2' : x / 2 = 3 / 2 ^ (n + 1) := by rw [hxdef, pow_succ]; field_simp have hsq' : r ^ 2 ≤ 64 * (x / 2) ^ (4 * n + 2) := by calc r ^ 2 ≤ (8 * (x / 2) ^ (2 * n + 1)) ^ 2 := hsq _ = 64 * (x / 2) ^ (4 * n + 2) := by ring have hkey : (x / 2) ^ (4 * n + 2) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) = 3 ^ (4 * n + 2) := by rw [← mul_pow, hx2', div_mul_cancel₀ _ (by positivity)] have hP : (0 : ℝ) < ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) := by positivity have hmain : 64 * (x / 2) ^ (4 * n + 2) * (2 : ℝ) ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) := by refine le_of_mul_le_mul_right ?_ hP calc 64 * (x / 2) ^ (4 * n + 2) * (2 : ℝ) ^ (4 * n * n) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) = 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) := by rw [← hkey]; ring _ ≤ 2 ^ (2 * n + 4) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) := hreal calc r ^ 2 * (2 : ℝ) ^ (4 * n * n) ≤ 64 * (x / 2) ^ (4 * n + 2) * 2 ^ (4 * n * n) := by gcongr _ ≤ 2 ^ (2 * n + 4) := hmaintargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 604–662 at
df09144aaebf↗h4_big.s7.hGHhave∀ (K : ℕ), G K ≤ H KLeaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhGH : ∀ (K : ℕ), G K ≤ H K.Lean, lines 605–613
have hGH : ∀ K, G K ≤ H K := by intro K; simp only [hG, hH] split_ifs with h · have hb := (nd_bound n K (by omega) (by omega)).2 calc ((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) * x ^ K ≤ 2 * (1 / 2) ^ K * x ^ K := by gcongr _ = 2 * (x / 2) ^ K := by ring · exact le_refl 0targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 605–613 at
df09144aaebf↗h4_big.s7.hGH.s1caseLeaves
((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ L ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) * x ^ K ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ K.Lean, lines 608–612
· have hb := (nd_bound n K (by omega) (by omega)).2 calc ((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) * x ^ K ≤ 2 * (1 / 2) ^ K * x ^ K := by gcongr _ = 2 * (x / 2) ^ K := by ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 608–612 at
df09144aaebf↗h4_big.s7.hGH.s1.hbhave(∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ KLeaves
((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ L ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) * x ^ K ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ K, withhb : (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K.Lean, line 608
· have hb := (nd_bound n K (by omega) (by omega)).2
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 608 at
df09144aaebf↗h4_big.s7.hGH.s1.s2calc((∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i)) * x ^ K ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K * x ^ KCloses the goal.
Uses library
Finset.IocThe finset $(a, b]$ of elementsxsuch thata < xandx ≤ b. ,Finset.rangerange nis the set of natural numbers less thann. .Lean, lines 609–611
calc ((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) * x ^ K ≤ 2 * (1 / 2) ^ K * x ^ K := by gcongrtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 609–611 at
df09144aaebf↗h4_big.s7.hGH.s1.s3calc routine: ringCloses the goal.
Lean, line 612
_ = 2 * (x / 2) ^ K := by ring
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 612 at
df09144aaebf↗
h4_big.s7.hGH.s2caseLeaves
(0 : ℝ) ≤ (0 : ℝ).Uses library
le_reflThe relation≤on a preorder is reflexive. .Lean, line 613
· exact le_refl 0
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 613 at
df09144aaebf↗
h4_big.s7.hqhavex / (2 : ℝ) < (1 : ℝ)routine: linarithLeaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhq : x / (2 : ℝ) < (1 : ℝ).Lean, line 614
have hq : x / 2 < 1 := by linarith
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 614 at
df09144aaebf↗h4_big.s7.hHsumhaveHasSum H ((2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹)Leaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhHsum : HasSum H ((2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹).Uses library
HasSumHasSum f a Lmeans that the (potentially infinite) sum of thef bforb : βconverges toaalong the SummationFilterL. ,hasSum_nat_add_iff',sub_zero.Lean, lines 615–625
have hHsum : HasSum H (2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹) := by rw [← hasSum_nat_add_iff' (2 * n + 1)] have hz : ∑ i ∈ Finset.range (2 * n + 1), H i = 0 := Finset.sum_eq_zero (fun i hi => by simp only [hH]; rw [if_neg (by have := Finset.mem_range.mp hi; omega)]) rw [hz, sub_zero] have hgeo := (hasSum_geometric_of_lt_one (by positivity) hq).mul_left (2 * (x / 2) ^ (2 * n + 1)) have hfun : (fun s => H (s + (2 * n + 1))) = fun s => 2 * (x / 2) ^ (2 * n + 1) * (x / 2) ^ s := by funext s; simp only [hH]; rw [if_pos (by omega), pow_add]; ring rw [hfun] exact hgeotargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 615–625 at
df09144aaebf↗h4_big.s7.hHsum.hzhave∑ i ∈ Finset.range ((2 : ℕ) * n + (1 : ℕ)), H i = (0 : ℝ)Leaves
HasSum (fun (n_1 : ℕ) => H (n_1 + ((2 : ℕ) * n + (1 : ℕ)))) ((2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹ - ∑ i ∈ Finset.range ((2 : ℕ) * n + (1 : ℕ)), H i), withhz : ∑ i ∈ Finset.range ((2 : ℕ) * n + (1 : ℕ)), H i = (0 : ℝ).Uses library
Finset.rangerange nis the set of natural numbers less thann. ,Finset.sum_eq_zero,if_neg.Lean, lines 617–619
have hz : ∑ i ∈ Finset.range (2 * n + 1), H i = 0 := Finset.sum_eq_zero (fun i hi => by simp only [hH]; rw [if_neg (by have := Finset.mem_range.mp hi; omega)])targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 617–619 at
df09144aaebf↗h4_big.s7.hHsum.hz.thishavei < (2 : ℕ) * n + (1 : ℕ)Leaves
¬(2 : ℕ) * n < i, withthis : i < (2 : ℕ) * n + (1 : ℕ).Uses library
Finset.mem_range.Lean, line 619
simp only [hH]; rw [if_neg (by have := Finset.mem_range.mp hi; omega)])
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 619 at
df09144aaebf↗
h4_big.s7.hHsum.hgeohaveHasSum (fun (i : ℕ) => (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * (x / (2 : ℝ)) ^ i) ((2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹)Leaves
HasSum (fun (n_1 : ℕ) => H (n_1 + ((2 : ℕ) * n + (1 : ℕ)))) ((2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹), withhgeo : HasSum (fun (i : ℕ) => (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * (x / (2 : ℝ)) ^ i) ((2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹).Uses library
hasSum_geometric_of_lt_one.Lean, line 621
have hgeo := (hasSum_geometric_of_lt_one (by positivity) hq).mul_left (2 * (x / 2) ^ (2 * n + 1))
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 621 at
df09144aaebf↗h4_big.s7.hHsum.hfunhave(fun (s : ℕ) => H (s + ((2 : ℕ) * n + (1 : ℕ)))) = fun (s : ℕ) => (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * (x / (2 : ℝ)) ^ sLeaves
HasSum (fun (n_1 : ℕ) => H (n_1 + ((2 : ℕ) * n + (1 : ℕ)))) ((2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹), withhfun : (fun (s : ℕ) => H (s + ((2 : ℕ) * n + (1 : ℕ)))) = fun (s : ℕ) => (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * (x / (2 : ℝ)) ^ s.Uses library
if_pos,pow_add.Lean, lines 622–623
have hfun : (fun s => H (s + (2 * n + 1))) = fun s => 2 * (x / 2) ^ (2 * n + 1) * (x / 2) ^ s := by funext s; simp only [hH]; rw [if_pos (by omega), pow_add]; ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 622–623 at
df09144aaebf↗
h4_big.s7.hrlehaver ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹Leaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhrle : r ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹.Uses library
hasSum_le.Lean, line 626
have hrle : r ≤ 2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹ := hasSum_le hGH hS hHsum
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 626 at
df09144aaebf↗h4_big.s7.hr0have(0 : ℝ) ≤ rLeaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhr0 : (0 : ℝ) ≤ r.Uses library
le_of_lt,hasSum_lt,hasSum_zeroConstant zero function has sum0.Lean, lines 627–628
have hr0 : 0 ≤ r := le_of_lt (hasSum_lt (f := fun _ => (0 : ℝ)) (g := G) (i := 2 * n + 1) (fun K => hGnn K) hGpos hasSum_zero hS)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 627–628 at
df09144aaebf↗h4_big.s7.hr8haver ≤ (8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ))Leaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhr8 : r ≤ (8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)).Lean, lines 629–635
have hr8 : r ≤ 8 * (x / 2) ^ (2 * n + 1) := by have hinv : (1 - x / 2)⁻¹ ≤ 4 := by rw [inv_le_comm₀ (by linarith) (by norm_num)]; linarith have hp : 0 ≤ 2 * (x / 2) ^ (2 * n + 1) := by positivity calc r ≤ 2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹ := hrle _ ≤ 2 * (x / 2) ^ (2 * n + 1) * 4 := by gcongr _ = 8 * (x / 2) ^ (2 * n + 1) := by ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 629–635 at
df09144aaebf↗h4_big.s7.hr8.hinvhave((1 : ℝ) - x / (2 : ℝ))⁻¹ ≤ (4 : ℝ)Leaves
r ≤ (8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)), withhinv : ((1 : ℝ) - x / (2 : ℝ))⁻¹ ≤ (4 : ℝ).Uses library
inv_le_comm₀See alsoinv_le_of_inv_le₀for a one-sided implication with one fewer assumption. .Lean, lines 630–631
have hinv : (1 - x / 2)⁻¹ ≤ 4 := by rw [inv_le_comm₀ (by linarith) (by norm_num)]; linarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 630–631 at
df09144aaebf↗h4_big.s7.hr8.hphave(0 : ℝ) ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ))routine: positivityLeaves
r ≤ (8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)), withhp : (0 : ℝ) ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)).Lean, line 632
have hp : 0 ≤ 2 * (x / 2) ^ (2 * n + 1) := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 632 at
df09144aaebf↗h4_big.s7.hr8.s3calcr ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹Closes the goal.
Lean, line 633
calc r ≤ 2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹ := hrle
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 633 at
df09144aaebf↗h4_big.s7.hr8.s4calcCloses the goal.
Lean, line 634
_ ≤ 2 * (x / 2) ^ (2 * n + 1) * 4 := by gcongr
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 634 at
df09144aaebf↗h4_big.s7.hr8.s5calc routine: ringCloses the goal.
Lean, line 635
_ = 8 * (x / 2) ^ (2 * n + 1) := by ring
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 635 at
df09144aaebf↗
h4_big.s7.hsqhaver ^ (2 : ℕ) ≤ ((8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ))) ^ (2 : ℕ)Leaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhsq : r ^ (2 : ℕ) ≤ ((8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ))) ^ (2 : ℕ).Uses library
pow_le_pow_left₀.Lean, line 636
have hsq : r ^ 2 ≤ (8 * (x / 2) ^ (2 * n + 1)) ^ 2 := pow_le_pow_left₀ hr0 hr8 2
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 636 at
df09144aaebf↗h4_big.s7.hnathave(64 : ℕ) * (3 : ℕ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℕ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℕ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℕ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ))Leaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhnat : (64 : ℕ) * (3 : ℕ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℕ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℕ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℕ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)).Lean, lines 637–646
have hnat : 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) := by have e1 : (2 : ℕ) ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) = 2 ^ (4 * n * n) * (64 * 256 ^ n) := by rw [← pow_mul, ← pow_add, show (256 : ℕ) = 2 ^ 8 by norm_num, ← pow_mul, show (64 : ℕ) = 2 ^ 6 by norm_num, ← pow_add, ← pow_add] congr 1; ring have e2 : 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) = 2 ^ (4 * n * n) * (64 * (9 * 81 ^ n)) := by rw [show (81 : ℕ) = 3 ^ 4 by norm_num, ← pow_mul, pow_add]; ring rw [e1, e2] have := ineq_pow n hn gcongrtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 637–646 at
df09144aaebf↗h4_big.s7.hnat.e1have(2 : ℕ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℕ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)) = (2 : ℕ) ^ ((4 : ℕ) * n * n) * ((64 : ℕ) * (256 : ℕ) ^ n)Leaves
(64 : ℕ) * (3 : ℕ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℕ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℕ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℕ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)), withe1 : (2 : ℕ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℕ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)) = (2 : ℕ) ^ ((4 : ℕ) * n * n) * ((64 : ℕ) * (256 : ℕ) ^ n).Uses library
pow_mul,pow_add.Lean, lines 638–641
have e1 : (2 : ℕ) ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) = 2 ^ (4 * n * n) * (64 * 256 ^ n) := by rw [← pow_mul, ← pow_add, show (256 : ℕ) = 2 ^ 8 by norm_num, ← pow_mul, show (64 : ℕ) = 2 ^ 6 by norm_num, ← pow_add, ← pow_add] congr 1; ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 638–641 at
df09144aaebf↗h4_big.s7.hnat.e2have(64 : ℕ) * (3 : ℕ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℕ) ^ ((4 : ℕ) * n * n) = (2 : ℕ) ^ ((4 : ℕ) * n * n) * ((64 : ℕ) * ((9 : ℕ) * (81 : ℕ) ^ n))Leaves
(64 : ℕ) * (3 : ℕ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℕ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℕ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℕ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)), withe2 : (64 : ℕ) * (3 : ℕ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℕ) ^ ((4 : ℕ) * n * n) = (2 : ℕ) ^ ((4 : ℕ) * n * n) * ((64 : ℕ) * ((9 : ℕ) * (81 : ℕ) ^ n)).Uses library
pow_mul,pow_add.Lean, lines 642–643
have e2 : 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) = 2 ^ (4 * n * n) * (64 * (9 * 81 ^ n)) := by rw [show (81 : ℕ) = 3 ^ 4 by norm_num, ← pow_mul, pow_add]; ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 642–643 at
df09144aaebf↗h4_big.s7.hnat.thishave(9 : ℕ) * (81 : ℕ) ^ n ≤ (256 : ℕ) ^ nLeaves
(2 : ℕ) ^ ((4 : ℕ) * n * n) * ((64 : ℕ) * ((9 : ℕ) * (81 : ℕ) ^ n)) ≤ (2 : ℕ) ^ ((4 : ℕ) * n * n) * ((64 : ℕ) * (256 : ℕ) ^ n), withthis : (9 : ℕ) * (81 : ℕ) ^ n ≤ (256 : ℕ) ^ n.Lean, line 645
have := ineq_pow n hn
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 645 at
df09144aaebf↗
h4_big.s7.hrealhave(64 : ℝ) * (3 : ℝ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ))Leaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhreal : (64 : ℝ) * (3 : ℝ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)).Lean, lines 647–648
have hreal : (64 : ℝ) * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) := by exact_mod_cast hnattargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 647–648 at
df09144aaebf↗h4_big.s7.hx2'havex / (2 : ℝ) = (3 : ℝ) / (2 : ℝ) ^ (n + (1 : ℕ))Leaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhx2' : x / (2 : ℝ) = (3 : ℝ) / (2 : ℝ) ^ (n + (1 : ℕ)).Uses library
pow_succ.Lean, line 649
have hx2' : x / 2 = 3 / 2 ^ (n + 1) := by rw [hxdef, pow_succ]; field_simp
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 649 at
df09144aaebf↗h4_big.s7.hsq'haver ^ (2 : ℕ) ≤ (64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ))Leaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhsq' : r ^ (2 : ℕ) ≤ (64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)).Lean, lines 650–652
have hsq' : r ^ 2 ≤ 64 * (x / 2) ^ (4 * n + 2) := by calc r ^ 2 ≤ (8 * (x / 2) ^ (2 * n + 1)) ^ 2 := hsq _ = 64 * (x / 2) ^ (4 * n + 2) := by ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 650–652 at
df09144aaebf↗h4_big.s7.hsq'.s1calcr ^ (2 : ℕ) ≤ ((8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ))) ^ (2 : ℕ)Closes the goal.
Lean, line 651
calc r ^ 2 ≤ (8 * (x / 2) ^ (2 * n + 1)) ^ 2 := hsq
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 651 at
df09144aaebf↗h4_big.s7.hsq'.s2calc routine: ringCloses the goal.
Lean, line 652
_ = 64 * (x / 2) ^ (4 * n + 2) := by ring
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 652 at
df09144aaebf↗
h4_big.s7.hkeyhave(x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)) * ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)) = (3 : ℝ) ^ ((4 : ℕ) * n + (2 : ℕ))Leaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhkey : (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)) * ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)) = (3 : ℝ) ^ ((4 : ℕ) * n + (2 : ℕ)).Uses library
mul_pow,div_mul_cancel₀.Lean, lines 653–654
have hkey : (x / 2) ^ (4 * n + 2) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) = 3 ^ (4 * n + 2) := by rw [← mul_pow, hx2', div_mul_cancel₀ _ (by positivity)]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 653–654 at
df09144aaebf↗h4_big.s7.hPhave(0 : ℝ) < ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ))routine: positivityLeaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhP : (0 : ℝ) < ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)).Lean, line 655
have hP : (0 : ℝ) < ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 655 at
df09144aaebf↗h4_big.s7.hmainhave(64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ))Leaves
r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withhmain : (64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)).Uses library
le_of_mul_le_mul_right.Lean, lines 656–660
have hmain : 64 * (x / 2) ^ (4 * n + 2) * (2 : ℝ) ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) := by refine le_of_mul_le_mul_right ?_ hP calc 64 * (x / 2) ^ (4 * n + 2) * (2 : ℝ) ^ (4 * n * n) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) = 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) := by rw [← hkey]; ring _ ≤ 2 ^ (2 * n + 4) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) := hrealtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 656–660 at
df09144aaebf↗h4_big.s7.hmain.s1calc(64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n) * ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)) = (64 : ℝ) * (3 : ℝ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n)Closes the goal.
Lean, lines 658–659
calc 64 * (x / 2) ^ (4 * n + 2) * (2 : ℝ) ^ (4 * n * n) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) = 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) := by rw [← hkey]; ringtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 658–659 at
df09144aaebf↗h4_big.s7.hmain.s2calc(64 : ℝ) * (3 : ℝ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ))Closes the goal.
Lean, line 660
_ ≤ 2 ^ (2 * n + 4) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) := hreal
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 660 at
df09144aaebf↗
h4_big.s7.s15calcr ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n)Closes the goal.
Lean, line 661
calc r ^ 2 * (2 : ℝ) ^ (4 * n * n) ≤ 64 * (x / 2) ^ (4 * n + 2) * 2 ^ (4 * n * n) := by gcongr
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 661 at
df09144aaebf↗h4_big.s7.s16calc(64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ))Closes the goal.
Lean, line 662
_ ≤ 2 ^ (2 * n + 4) := hmain
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 662 at
df09144aaebf↗
T_factshave(Summable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) ∧ (0 : ℝ) < ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ∧ ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (2 / 5 : ℝ)Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withT_facts : (Summable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) ∧ (0 : ℝ) < ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ∧ ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (2 / 5 : ℝ).Uses library
SummableSummable fmeans thatfhas some (infinite) sum with respect toL. ,And.introAnd.intro : a → b → a ∧ bis the constructor for the And operation. .Lean, lines 665–688
have T_facts : Summable (fun m : ℕ => (1 : ℝ) / (2 ^ (m + 3) - 3)) ∧ 0 < ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) ∧ ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) ≤ 2 / 5 := by have h5 : ∀ m : ℕ, 5 * (2 : ℝ) ^ m ≤ 2 ^ (m + 3) - 3 := by intro m have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num) have e : (2 : ℝ) ^ (m + 3) = 8 * 2 ^ m := by rw [pow_add]; norm_num; ring rw [e]; linarith have hpos : ∀ m : ℕ, 0 < (2 : ℝ) ^ (m + 3) - 3 := fun m => by have := h5 m; have : (0 : ℝ) < 2 ^ m := by positivity linarith have hle : ∀ m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) ≤ (1 / 5) * (1 / 2) ^ m := by intro m have e : (1 / 5 : ℝ) * (1 / 2) ^ m = 1 / (5 * 2 ^ m) := by rw [one_div_pow]; field_simp rw [e] exact one_div_le_one_div_of_le (by positivity) (h5 m) have hs : Summable (fun m : ℕ => (1 : ℝ) / (2 ^ (m + 3) - 3)) := Summable.of_nonneg_of_le (fun m => le_of_lt (one_div_pos.mpr (hpos m))) hle (summable_geometric_two.mul_left (1 / 5)) refine ⟨hs, ?_, ?_⟩ · exact hs.tsum_pos (fun m => le_of_lt (one_div_pos.mpr (hpos m))) 0 (one_div_pos.mpr (hpos 0)) · calc ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) ≤ ∑' m : ℕ, (1 / 5 : ℝ) * (1 / 2) ^ m := hs.tsum_le_tsum hle (summable_geometric_two.mul_left (1 / 5)) _ = 2 / 5 := by rw [tsum_mul_left, tsum_geometric_two]; norm_numtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 665–688 at
df09144aaebf↗T_facts.h5have∀ (m : ℕ), (5 : ℝ) * (2 : ℝ) ^ m ≤ (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)Leaves
(Summable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) ∧ (0 : ℝ) < ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ∧ ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (2 / 5 : ℝ), withh5 : ∀ (m : ℕ), (5 : ℝ) * (2 : ℝ) ^ m ≤ (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ).Lean, lines 667–671
have h5 : ∀ m : ℕ, 5 * (2 : ℝ) ^ m ≤ 2 ^ (m + 3) - 3 := by intro m have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num) have e : (2 : ℝ) ^ (m + 3) = 8 * 2 ^ m := by rw [pow_add]; norm_num; ring rw [e]; linarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 667–671 at
df09144aaebf↗T_facts.h5.h1have(1 : ℝ) ≤ (2 : ℝ) ^ mLeaves
(5 : ℝ) * (2 : ℝ) ^ m ≤ (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ), withh1 : (1 : ℝ) ≤ (2 : ℝ) ^ m.Uses library
one_le_pow₀.Lean, line 669
have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num)
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 669 at
df09144aaebf↗T_facts.h5.ehave(2 : ℝ) ^ (m + (3 : ℕ)) = (8 : ℝ) * (2 : ℝ) ^ mLeaves
(5 : ℝ) * (2 : ℝ) ^ m ≤ (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ), withe : (2 : ℝ) ^ (m + (3 : ℕ)) = (8 : ℝ) * (2 : ℝ) ^ m.Uses library
pow_add.Lean, line 670
have e : (2 : ℝ) ^ (m + 3) = 8 * 2 ^ m := by rw [pow_add]; norm_num; ring
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 670 at
df09144aaebf↗
T_facts.hposhave∀ (m : ℕ), (0 : ℝ) < (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)Leaves
(Summable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) ∧ (0 : ℝ) < ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ∧ ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (2 / 5 : ℝ), withhpos : ∀ (m : ℕ), (0 : ℝ) < (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ).Lean, lines 672–674
have hpos : ∀ m : ℕ, 0 < (2 : ℝ) ^ (m + 3) - 3 := fun m => by have := h5 m; have : (0 : ℝ) < 2 ^ m := by positivity linarithtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 672–674 at
df09144aaebf↗T_facts.hpos.s1have(5 : ℝ) * (2 : ℝ) ^ m ≤ (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)Leaves
(0 : ℝ) < (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ), withthis : (5 : ℝ) * (2 : ℝ) ^ m ≤ (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ).Lean, line 673
have := h5 m; have : (0 : ℝ) < 2 ^ m := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 673 at
df09144aaebf↗T_facts.hpos.s2have(0 : ℝ) < (2 : ℝ) ^ mroutine: positivityLeaves
(0 : ℝ) < (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ), withthis : (0 : ℝ) < (2 : ℝ) ^ m.Lean, line 673
have := h5 m; have : (0 : ℝ) < 2 ^ m := by positivity
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 673 at
df09144aaebf↗
T_facts.hlehave∀ (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ mLeaves
(Summable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) ∧ (0 : ℝ) < ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ∧ ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (2 / 5 : ℝ), withhle : ∀ (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m.Uses library
one_div_le_one_div_of_le.Lean, lines 675–680
have hle : ∀ m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) ≤ (1 / 5) * (1 / 2) ^ m := by intro m have e : (1 / 5 : ℝ) * (1 / 2) ^ m = 1 / (5 * 2 ^ m) := by rw [one_div_pow]; field_simp rw [e] exact one_div_le_one_div_of_le (by positivity) (h5 m)targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 675–680 at
df09144aaebf↗T_facts.hle.ehave(1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m = (1 : ℝ) / ((5 : ℝ) * (2 : ℝ) ^ m)Leaves
(1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m, withe : (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m = (1 : ℝ) / ((5 : ℝ) * (2 : ℝ) ^ m).Uses library
one_div_pow.Lean, lines 677–678
have e : (1 / 5 : ℝ) * (1 / 2) ^ m = 1 / (5 * 2 ^ m) := by rw [one_div_pow]; field_simptargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 677–678 at
df09144aaebf↗
T_facts.hshaveSummable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))Leaves
(Summable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) ∧ (0 : ℝ) < ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ∧ ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (2 / 5 : ℝ), withhs : Summable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)).Uses library
SummableSummable fmeans thatfhas some (infinite) sum with respect toL. ,Summable.of_nonneg_of_leComparison test of convergence of series of non-negative real numbers. ,le_of_lt,one_div_pos,summable_geometric_two.Lean, lines 681–683
have hs : Summable (fun m : ℕ => (1 : ℝ) / (2 ^ (m + 3) - 3)) := Summable.of_nonneg_of_le (fun m => le_of_lt (one_div_pos.mpr (hpos m))) hle (summable_geometric_two.mul_left (1 / 5))targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 681–683 at
df09144aaebf↗T_facts.s5caseLeaves
(0 : ℝ) < ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)).Uses library
le_of_lt,one_div_pos.Lean, line 685
· exact hs.tsum_pos (fun m => le_of_lt (one_div_pos.mpr (hpos m))) 0 (one_div_pos.mpr (hpos 0))
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 685 at
df09144aaebf↗T_facts.s6caseLeaves
∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (2 / 5 : ℝ).Lean, lines 686–688
· calc ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) ≤ ∑' m : ℕ, (1 / 5 : ℝ) * (1 / 2) ^ m := hs.tsum_le_tsum hle (summable_geometric_two.mul_left (1 / 5)) _ = 2 / 5 := by rw [tsum_mul_left, tsum_geometric_two]; norm_numtargets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 686–688 at
df09144aaebf↗T_facts.s6.s1calc∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ ∑' (m : ℕ), (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ mCloses the goal.
Uses library
summable_geometric_two.Lean, lines 686–687
· calc ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) ≤ ∑' m : ℕ, (1 / 5 : ℝ) * (1 / 2) ^ m := hs.tsum_le_tsum hle (summable_geometric_two.mul_left (1 / 5))targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 686–687 at
df09144aaebf↗T_facts.s6.s2calcCloses the goal.
Uses library
tsum_mul_left,tsum_geometric_two.Lean, line 688
_ = 2 / 5 := by rw [tsum_mul_left, tsum_geometric_two]; norm_num
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 688 at
df09144aaebf↗
s17obtain(Summable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) ∧ (0 : ℝ) < ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ∧ ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (2 / 5 : ℝ)Leaves
∀ (Qc : ℕ → ℕ → ℚ), (Qc = fun (n k : ℕ) => ((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) * ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) * ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) → ∀ (Qx : ℕ → ℚ), (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) → ∀ (Aq : ℕ → ℚ), (Aq = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), (∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k + Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) → (∀ (n : ℕ), ∃ (d : ℕ), (0 : ℕ) < d ∧ (↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧ (∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) → ∀ (n : ℕ), (0 : ℝ) < (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) ∧ ((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), withleft✝ : Summable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)),hTpos : (0 : ℝ) < ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)),hTle : ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (2 / 5 : ℝ).Lean, line 689
obtain ⟨_, hTpos, hTle⟩ := T_facts
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 689 at
df09144aaebf↗hQx0haveQx (0 : ℕ) = (1 : ℚ)Leaves
(0 : ℝ) < (↑(Qx (0 : ℕ)) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq (0 : ℕ)) : ℝ) ∧ ((↑(Qx (0 : ℕ)) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq (0 : ℕ)) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * (0 : ℕ) * (0 : ℕ)) ≤ (2 : ℝ) ^ ((2 : ℕ) * (0 : ℕ) + (4 : ℕ)), withhQx0 : Qx (0 : ℕ) = (1 : ℚ).Lean, line 693
have hQx0 : Qx 0 = 1 := by rw [hQx, hQc]; simp
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 693 at
df09144aaebf↗hAq0haveAq (0 : ℕ) = (0 : ℚ)Leaves
(0 : ℝ) < (↑(Qx (0 : ℕ)) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq (0 : ℕ)) : ℝ) ∧ ((↑(Qx (0 : ℕ)) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq (0 : ℕ)) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * (0 : ℕ) * (0 : ℕ)) ≤ (2 : ℝ) ^ ((2 : ℕ) * (0 : ℕ) + (4 : ℕ)), withhAq0 : Aq (0 : ℕ) = (0 : ℚ).Lean, line 694
have hAq0 : Aq 0 = 0 := by rw [hAq]; simp
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 694 at
df09144aaebf↗ehave((1 : ℝ) * ((3 : ℝ) * T) - (0 : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * (0 : ℕ) * (0 : ℕ)) = (9 : ℝ) * (T * T)routine: ringLeaves
((1 : ℝ) * ((3 : ℝ) * T) - (0 : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ (0 : ℕ) ≤ (2 : ℝ) ^ (4 : ℕ), withe : ((1 : ℝ) * ((3 : ℝ) * T) - (0 : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * (0 : ℕ) * (0 : ℕ)) = (9 : ℝ) * (T * T).Lean, line 699
have e : ((1 : ℝ) * (3 * T) - 0) ^ 2 * (2 : ℝ) ^ (4 * 0 * 0) = 9 * (T * T) := by ring
targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, line 699 at
df09144aaebf↗hQx1haveQx (1 : ℕ) = (3 / 2 : ℚ)Leaves
(0 : ℝ) < (↑(Qx (1 : ℕ)) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq (1 : ℕ)) : ℝ) ∧ ((↑(Qx (1 : ℕ)) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq (1 : ℕ)) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * (1 : ℕ) * (1 : ℕ)) ≤ (2 : ℝ) ^ ((2 : ℕ) * (1 : ℕ) + (4 : ℕ)), withhQx1 : Qx (1 : ℕ) = (3 / 2 : ℚ).Uses library
Finset.sum_range_succ,Finset.prod_range_succ.Lean, lines 705–706
have hQx1 : Qx 1 = 3 / 2 := by rw [hQx, hQc]; norm_num [Finset.sum_range_succ, Finset.prod_range_succ]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 705–706 at
df09144aaebf↗hAq1haveAq (1 : ℕ) = (0 : ℚ)Leaves
(0 : ℝ) < (↑(Qx (1 : ℕ)) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq (1 : ℕ)) : ℝ) ∧ ((↑(Qx (1 : ℕ)) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq (1 : ℕ)) : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * (1 : ℕ) * (1 : ℕ)) ≤ (2 : ℝ) ^ ((2 : ℕ) * (1 : ℕ) + (4 : ℕ)), withhAq1 : Aq (1 : ℕ) = (0 : ℚ).Uses library
Finset.sum_range_succ,Finset.prod_range_succ.Lean, lines 707–709
have hAq1 : Aq 1 = 0 := by rw [hAq]; simp only [hQx1]; rw [hQc] norm_num [Finset.sum_range_succ, Finset.prod_range_succ]targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, lines 707–709 at
df09144aaebf↗
The proof in Lean (Proof.lean)
Checked by the kernel — these bytes are the ones its attestation names: attestations/000320.json, merge commit df09144aaebf.
artifact_hash of the attestation below, so these are the bytes the gate checked. Rendered from targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Proof.lean, sha256 88ecdb43be99.import Mathlib
import Nodes.«erdos-1050--h1-v2--h4».Context
/-! Hole `hrem` of a merged partial proof, as a node (D-12 #5, D-29).
Statement generated by the gate from the assembly; immutable (D-3). -/
theorem erdos_1050__h1_v2__h4 : ∀ (Qc : ℕ → ℕ → ℚ),
(Qc = fun (n k : ℕ) =>
((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) →
∀ (Qx : ℕ → ℚ),
(Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) →
∀ (Aq : ℕ → ℚ),
(Aq = fun (n : ℕ) =>
∑ k ∈ Finset.range (n + (1 : ℕ)),
(∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) *
((3 : ℚ) / (2 : ℚ) ^ n) ^ k +
Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) →
(∀ (n : ℕ),
∃ (d : ℕ),
(0 : ℕ) < d ∧
(↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧
(∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) →
∀ (n : ℕ),
(0 : ℝ) <
(↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) -
(↑(Aq n) : ℝ) ∧
((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) -
(↑(Aq n) : ℝ)) ^
(2 : ℕ) *
(2 : ℝ) ^ ((4 : ℕ) * n * n) ≤
(2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)) := by
open Polynomial in
have id1_test : ∀ (n j : ℕ) (hj : j ≤ n),
(∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - 1)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1) =
∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + 1) - 1) := by
intro n j hj
induction j with
| zero => simp
| succ j ih =>
have ih' := ih (by omega)
rw [Finset.prod_range_succ, ← ih']
obtain ⟨m, hm⟩ : ∃ m, n - j = m + 1 := ⟨n - j - 1, by omega⟩
rw [hm, Finset.prod_range_succ, show n - (j + 1) = m by omega]
ring
open Polynomial in
have lower_test : ∀ (j : ℕ),
∏ i ∈ Finset.range j, ((2 : ℚ) ^ j - 2 ^ i) =
2 ^ (j * (j - 1) / 2) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + 1) - 1) := by
intro j
have h1 : ∀ i ∈ Finset.range j, ((2 : ℚ) ^ j - 2 ^ i) = 2 ^ i * (2 ^ (j - 1 - i + 1) - 1) := by
intro i hi
have hi' := Finset.mem_range.mp hi
rw [mul_sub, ← pow_add, show i + (j - 1 - i + 1) = j by omega]
ring
rw [Finset.prod_congr rfl h1, Finset.prod_mul_distrib, Finset.prod_pow_eq_pow_sum,
Finset.prod_range_reflect (fun s => ((2 : ℚ) ^ (s + 1) - 1)) j]
congr 1
congr 1
have := Finset.sum_range_id_mul_two j
omega
open Polynomial in
have upper_test : ∀ (j n : ℕ) (hj : j ≤ n),
∏ i ∈ Finset.Ioc j n, ((2 : ℚ) ^ j - 2 ^ i) =
(-1) ^ (n - j) * 2 ^ (j * (n - j)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1) := by
intro j n hj
have e : Finset.Ioc j n = Finset.Ico (j + 1) (n + 1) := by
ext x; simp only [Finset.mem_Ioc, Finset.mem_Ico]; omega
rw [e, Finset.prod_Ico_eq_prod_range, show n + 1 - (j + 1) = n - j by omega]
have h1 : ∀ t ∈ Finset.range (n - j), ((2 : ℚ) ^ j - 2 ^ (j + 1 + t)) = (-1) * 2 ^ j * (2 ^ (t + 1) - 1) := by
intro t _
rw [show j + 1 + t = j + (t + 1) by ring, pow_add]
ring
rw [Finset.prod_congr rfl h1, Finset.prod_mul_distrib, Finset.prod_mul_distrib, Finset.prod_const,
Finset.prod_const, Finset.card_range, ← pow_mul]
open Polynomial in
have rhs_test : ∀ (j n : ℕ) (hj : j ≤ n),
(∏ K ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ K)) *
∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1) =
(-1) ^ n * 2 ^ (j * n) * ∏ s ∈ Finset.range (2 * n - j), ((2 : ℚ) ^ (s + 1) - 1) := by
intro j n hj
have e : Finset.Ioc n (2 * n) = Finset.Ico (n + 1) (2 * n + 1) := by
ext x; simp only [Finset.mem_Ioc, Finset.mem_Ico]; omega
rw [e, Finset.prod_Ico_eq_prod_range, show 2 * n + 1 - (n + 1) = n by omega]
have h1 : ∀ t ∈ Finset.range n, ((2 : ℚ) ^ j - 2 ^ (n + 1 + t)) =
(-1) * 2 ^ j * (2 ^ ((n - j) + t + 1) - 1) := by
intro t _
rw [show n + 1 + t = j + ((n - j) + t + 1) by omega, pow_add]
ring
rw [Finset.prod_congr rfl h1, Finset.prod_mul_distrib, Finset.prod_mul_distrib, Finset.prod_const,
Finset.prod_const, Finset.card_range, ← pow_mul,
show 2 * n - j = (n - j) + n by omega, Finset.prod_range_add]
ring
open Polynomial in
have id1_full : ∀ (n j : ℕ) (hj : j ≤ n),
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
2 ^ j * ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ j - 2 ^ i) =
∏ K ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ K) := by
intro n j hj
have hPne : ∀ m : ℕ, ∏ s ∈ Finset.range m, ((2 : ℚ) ^ (s + 1) - 1) ≠ 0 := by
intro m
refine Finset.prod_ne_zero_iff.mpr (fun s _ => ?_)
have : (1 : ℚ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hG1 : ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) =
(∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + 1) - 1)) /
((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1)) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + 1) - 1)) := by
rw [Finset.prod_div_distrib, ← id1_test n j hj]
field_simp [hPne]
have hG2 : ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) =
(∏ s ∈ Finset.range (2 * n - j), ((2 : ℚ) ^ (s + 1) - 1)) /
((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1)) * ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + 1) - 1)) := by
rw [Finset.prod_div_distrib, ← id1_test (2 * n - j) n (by omega), show 2 * n - j - n = n - j by omega]
field_simp [hPne]
have hsplit : (Finset.range (n + 1)).erase j = Finset.range j ∪ Finset.Ioc j n := by
ext x; simp only [Finset.mem_erase, Finset.mem_range, Finset.mem_union, Finset.mem_Ioc]; omega
have hdisj : Disjoint (Finset.range j) (Finset.Ioc j n) := by
rw [Finset.disjoint_left]
intro x hx hx'
simp only [Finset.mem_range, Finset.mem_Ioc] at hx hx'
omega
have hR := rhs_test j n hj
obtain ⟨m, rfl⟩ := Nat.exists_eq_add_of_le hj
have hsign : (-1 : ℚ) ^ (j + m) = (-1) ^ j * (-1) ^ (j + m - j) := by
rw [← pow_add]; congr 1; omega
have ha : 2 * (j * (j - 1) / 2) = j * (j - 1) := Nat.two_mul_div_two_of_even (Nat.even_mul_pred_self _)
have hexp : j * (j + m) = j * (j - (1 : ℕ)) / (2 : ℕ) + j + j * (j - (1 : ℕ)) / (2 : ℕ) + j * (j + m - j) := by
rw [show j + m - j = m by omega]
rcases j with _ | i
· simp
· simp only [Nat.add_sub_cancel] at ha ⊢
nlinarith [ha]
rw [hG1, hG2, hsplit, Finset.prod_union hdisj, lower_test, upper_test j (j + m) hj]
apply mul_right_cancel₀ (hPne (j + m - j))
rw [hR, hsign, hexp, pow_add, pow_add, pow_add]
field_simp [hPne]
clear id1_test lower_test upper_test rhs_test
open Polynomial in
have lagr_eval : ∀ (n : ℕ) (x : ℕ → ℚ) (hx : ∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j)
(N : ℚ[X]) (hNdeg : N.degree ≤ n) (r : ℕ → ℚ)
(hr : ∀ j ≤ n, r j * ∏ i ∈ (Finset.range (n + 1)).erase j, (x j - x i) = N.eval (x j)),
N = ∑ j ∈ Finset.range (n + 1), C (r j) * ∏ i ∈ (Finset.range (n + 1)).erase j, (X - C (x i)) := by
intro n x hx N hNdeg r hr
have hinj : Set.InjOn x (Finset.range (n + 1) : Set ℕ) := by
intro i hi j hj h
simp only [Finset.coe_range, Set.mem_Iio] at hi hj
exact hx i (by omega) j (by omega) h
apply Polynomial.eq_of_degree_sub_lt_of_eval_finset_eq ((Finset.range (n + 1)).image x)
· rw [Finset.card_image_of_injOn hinj, Finset.card_range]
refine lt_of_le_of_lt (Polynomial.degree_sub_le _ _) (max_lt ?_ ?_)
· exact lt_of_le_of_lt hNdeg (by exact_mod_cast Nat.lt_succ_self n)
· refine lt_of_le_of_lt (Polynomial.degree_sum_le _ _) ?_
rw [Finset.sup_lt_iff (by exact WithBot.bot_lt_coe _)]
intro j hj
refine lt_of_le_of_lt (Polynomial.degree_mul_le _ _) ?_
refine lt_of_le_of_lt (add_le_add (Polynomial.degree_C_le) (Polynomial.degree_prod_le _ _)) ?_
have : ∑ i ∈ (Finset.range (n + 1)).erase j, (X - C (x i)).degree = ((n : ℕ) : WithBot ℕ) := by
rw [Finset.sum_congr rfl (fun i _ => Polynomial.degree_X_sub_C (x i)), Finset.sum_const,
Finset.card_erase_of_mem hj, Finset.card_range, Nat.add_sub_cancel]
simp
rw [this, zero_add]
exact_mod_cast Nat.lt_succ_self n
· intro y hy
obtain ⟨k, hk, rfl⟩ := Finset.mem_image.mp hy
have hk' : k ≤ n := by have := Finset.mem_range.mp hk; omega
rw [← hr k hk', Polynomial.eval_finset_sum, Finset.sum_eq_single k]
· simp [Polynomial.eval_prod]
· intro j hj hjk
simp only [Polynomial.eval_mul, Polynomial.eval_C, Polynomial.eval_prod, Polynomial.eval_sub,
Polynomial.eval_X]
rw [Finset.prod_eq_zero (i := k) (Finset.mem_erase.mpr ⟨Ne.symm hjk, hk⟩) (by ring), mul_zero]
· intro h; exact absurd hk h
open Polynomial in
have tail_coeff : ∀ (n K : ℕ) (hK : n < K) (Qc : ℕ → ℕ → ℚ)
(hQc : ∀ j ≤ n, Qc n j * 2 ^ j * ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ j - 2 ^ i) =
∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ L)),
∑ j ∈ Finset.range (n + 1), Qc n j / ((2 : ℚ) ^ (K - j) - 1) =
(∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℚ) ^ K - 2 ^ i) := by
intro n K hK Qc hQc
set x : ℕ → ℚ := fun i => (2 : ℚ) ^ i with hxdef
have hxinj : ∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j := by
intro i _ j _ h
have h' : (2 : ℚ) ^ i = 2 ^ j := h
exact Nat.pow_right_injective (le_refl 2) (by exact_mod_cast h')
have hxne : ∀ a b : ℕ, a ≠ b → (2 : ℚ) ^ a - 2 ^ b ≠ 0 := by
intro a b hab h
apply hab
exact Nat.pow_right_injective (le_refl 2) (by exact_mod_cast (sub_eq_zero.mp h))
set N : ℚ[X] := ∏ L ∈ Finset.Ioc n (2 * n), (X - C ((2 : ℚ) ^ L)) with hN
have hNdeg : N.degree ≤ n := by
rw [hN, Polynomial.degree_prod]
rw [Finset.sum_congr rfl (fun L _ => Polynomial.degree_X_sub_C ((2 : ℚ) ^ L)), Finset.sum_const,
Nat.card_Ioc]
simp
omega
have hr : ∀ j ≤ n, (Qc n j * 2 ^ j) * ∏ i ∈ (Finset.range (n + 1)).erase j, (x j - x i) = N.eval (x j) := by
intro j hj
rw [hN, Polynomial.eval_prod]
simp only [Polynomial.eval_sub, Polynomial.eval_X, Polynomial.eval_C, hxdef]
exact hQc j hj
have hL := lagr_eval n x hxinj N hNdeg (fun j => Qc n j * 2 ^ j) hr
have hev := congrArg (Polynomial.eval ((2 : ℚ) ^ K)) hL
rw [Polynomial.eval_finset_sum] at hev
have hNK : N.eval ((2 : ℚ) ^ K) = ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ K - 2 ^ L) := by
rw [hN, Polynomial.eval_prod]
simp only [Polynomial.eval_sub, Polynomial.eval_X, Polynomial.eval_C]
have hD : ∏ i ∈ Finset.range (n + 1), ((2 : ℚ) ^ K - 2 ^ i) ≠ 0 :=
Finset.prod_ne_zero_iff.mpr (fun i hi => hxne K i (by have := Finset.mem_range.mp hi; omega))
rw [hNK] at hev
rw [hev, Finset.sum_div]
refine Finset.sum_congr rfl (fun j hj => ?_)
have hjn : j < n + 1 := Finset.mem_range.mp hj
have hne1 : (2 : ℚ) ^ K - 2 ^ j ≠ 0 := hxne K j (by omega)
have hne2 : (2 : ℚ) ^ (K - j) - 1 ≠ 0 := by
have : (1 : ℚ) < 2 ^ (K - j) := one_lt_pow₀ (by norm_num) (by omega)
linarith
simp only [Polynomial.eval_mul, Polynomial.eval_C, Polynomial.eval_prod, Polynomial.eval_sub,
Polynomial.eval_X, hxdef]
rw [← Finset.mul_prod_erase (Finset.range (n + 1)) (fun i => (2 : ℚ) ^ K - 2 ^ i) hj]
have hE : ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ K - 2 ^ i) ≠ 0 :=
Finset.prod_ne_zero_iff.mpr (fun i hi => hxne K i (by
have := Finset.mem_range.mp (Finset.mem_of_mem_erase hi); omega))
have hpow : (2 : ℚ) ^ K = 2 ^ j * 2 ^ (K - j) := by rw [← pow_add]; congr 1; omega
field_simp
rw [hpow]
ring
clear lagr_eval
open Polynomial in
have tail3 : ∀ (n : ℕ) (hn : 1 ≤ n),
∑' m : ℕ, (3 : ℝ) / (2 ^ (m + n + 1) - 3) = ∑' s : ℕ, ((3 : ℝ) / 2 ^ n) ^ (s + 1) / (2 ^ (s + 1) - 1) := by
intro n hn
set f : ℕ → ℕ → ℝ := fun m s => ((3 : ℝ) / 2 ^ (n + 1)) ^ (s + 1) * ((1 : ℝ) / 2 ^ (s + 1)) ^ m with hf
have key : ∀ m s, f m s = ((3 : ℝ) / 2 ^ (m + n + 1)) ^ (s + 1) := by
intro m s
simp only [hf]
rw [div_pow, div_pow, div_pow, one_pow, ← pow_mul, ← pow_mul, ← pow_mul,
show (m + n + 1) * (s + 1) = (n + 1) * (s + 1) + (s + 1) * m by ring, pow_add]
field_simp
exact pow_add _ _ _
have hpos : ∀ m s, 0 ≤ f m s := fun m s => by rw [key]; positivity
have h4 : ∀ m : ℕ, (4 : ℝ) ≤ 2 ^ (m + n + 1) := by
intro m
calc (4 : ℝ) = 2 ^ 2 := by norm_num
_ ≤ 2 ^ (m + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega)
have inner1 : ∀ m, HasSum (f m) ((3 : ℝ) / (2 ^ (m + n + 1) - 3)) := by
intro m
have hr0 : 0 ≤ (3 : ℝ) / 2 ^ (m + n + 1) := by positivity
have hr1 : (3 : ℝ) / 2 ^ (m + n + 1) < 1 := by
rw [div_lt_one (by positivity)]; linarith [h4 m]
have hg := (hasSum_geometric_of_lt_one hr0 hr1).mul_left ((3 : ℝ) / 2 ^ (m + n + 1))
have hfun : f m = fun s => (3 : ℝ) / 2 ^ (m + n + 1) * ((3 : ℝ) / 2 ^ (m + n + 1)) ^ s := by
funext s; rw [key]; ring
have hne : (2 : ℝ) ^ (m + n + 1) - 3 ≠ 0 := by linarith [h4 m]
have hne2 : (2 : ℝ) ^ (m + n + 1) ≠ 0 := by positivity
have hval : (3 : ℝ) / (2 ^ (m + n + 1) - 3) =
3 / 2 ^ (m + n + 1) * (1 - 3 / 2 ^ (m + n + 1))⁻¹ := by
field_simp
rw [hfun, hval]
exact hg
have inner2 : ∀ s, HasSum (fun m => f m s) (((3 : ℝ) / 2 ^ n) ^ (s + 1) / (2 ^ (s + 1) - 1)) := by
intro s
have hr0 : 0 ≤ (1 : ℝ) / 2 ^ (s + 1) := by positivity
have hr1 : (1 : ℝ) / 2 ^ (s + 1) < 1 := by
rw [div_lt_one (by positivity)]
exact one_lt_pow₀ (by norm_num) (by omega)
have hg := (hasSum_geometric_of_lt_one hr0 hr1).mul_left (((3 : ℝ) / 2 ^ (n + 1)) ^ (s + 1))
have hne : (2 : ℝ) ^ (s + 1) - 1 ≠ 0 := by
have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hval : ((3 : ℝ) / 2 ^ n) ^ (s + 1) / (2 ^ (s + 1) - 1) =
((3 : ℝ) / 2 ^ (n + 1)) ^ (s + 1) * (1 - 1 / 2 ^ (s + 1))⁻¹ := by
rw [div_pow, div_pow, ← pow_mul, ← pow_mul, show (n + 1) * (s + 1) = n * (s + 1) + (s + 1) by ring, pow_add]
field_simp
exact pow_add _ _ _
rw [hval]
exact hg
have hsum1 : Summable (fun m : ℕ => (3 : ℝ) / (2 ^ (m + n + 1) - 3)) := by
refine Summable.of_nonneg_of_le (fun m => ?_) (fun m => ?_) ((summable_geometric_two).mul_left 3)
· have := h4 m; exact div_nonneg (by norm_num) (by linarith)
· have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega)
have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num)
have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring
calc (3 : ℝ) / (2 ^ (m + n + 1) - 3) ≤ 3 / 2 ^ m :=
div_le_div_of_nonneg_left (by norm_num) (by positivity) (by linarith)
_ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ring
have hU : Summable (Function.uncurry f) := by
refine (summable_prod_of_nonneg (fun p => hpos p.1 p.2)).mpr ⟨fun m => (inner1 m).summable, ?_⟩
exact hsum1.congr (fun m => ((inner1 m).tsum_eq).symm)
have hcomm := hU.tsum_comm' (fun m => (inner1 m).summable) (fun s => (inner2 s).summable)
rw [show (∑' m : ℕ, (3 : ℝ) / (2 ^ (m + n + 1) - 3)) = ∑' m, ∑' s, f m s from
tsum_congr (fun m => ((inner1 m).tsum_eq).symm)]
rw [← hcomm]
exact tsum_congr (fun s => (inner2 s).tsum_eq)
open Polynomial in
have split3T : ∀ (n : ℕ),
3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) =
∑ j ∈ Finset.range n, (3 : ℝ) / (2 ^ (j + 1) - 3) + ∑' m : ℕ, (3 : ℝ) / (2 ^ (m + n + 1) - 3) := by
intro n
set g : ℕ → ℝ := fun m => (3 : ℝ) / (2 ^ (m + 1) - 3) with hg
have hsum : Summable (fun m => g (m + 1)) := by
refine Summable.of_nonneg_of_le (fun m => ?_) (fun m => ?_) ((summable_geometric_two).mul_left 3)
· have : (4 : ℝ) ≤ 2 ^ (m + 1 + 1) := by
calc (4 : ℝ) = 2 ^ 2 := by norm_num
_ ≤ 2 ^ (m + 1 + 1) := pow_le_pow_right₀ (by norm_num) (by omega)
simp only [hg]; exact div_nonneg (by norm_num) (by linarith)
· have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + 1 + 1) := le_of_eq (by ring_nf)
have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num)
have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring
simp only [hg]
calc (3 : ℝ) / (2 ^ (m + 1 + 1) - 3) ≤ 3 / 2 ^ m :=
div_le_div_of_nonneg_left (by norm_num) (by positivity) (by linarith)
_ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ring
have hs : Summable g := (summable_nat_add_iff 1).mp hsum
have e1 := hs.sum_add_tsum_nat_add n
have e2 := hs.sum_add_tsum_nat_add 2
have h3T : 3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) = ∑' m, g (m + 2) := by
rw [← tsum_mul_left]
refine tsum_congr (fun m => ?_)
simp only [hg]
rw [show m + 2 + 1 = m + 3 by ring]
ring
have hfirst : ∑ i ∈ Finset.range 2, g i = 0 := by
simp only [hg, Finset.sum_range_succ, Finset.sum_range_zero]
norm_num
rw [h3T]
have htail : ∑' m : ℕ, (3 : ℝ) / (2 ^ (m + n + 1) - 3) = ∑' m, g (m + n) := by
refine tsum_congr (fun m => ?_)
simp only [hg]
rw [htail]
have hrange : ∑ j ∈ Finset.range n, (3 : ℝ) / (2 ^ (j + 1) - 3) = ∑ i ∈ Finset.range n, g i := by
simp only [hg]
rw [hrange, e1]
rw [← e2, hfirst, zero_add]
open Polynomial in
have cauchy_fin : ∀ (n : ℕ) (q a : ℕ → ℝ) (x A : ℝ) (hA : HasSum (fun s => a s * x ^ (s + 1)) A),
HasSum (fun K => ∑ j ∈ Finset.range (n + 1), if j < K then q j * a (K - j - 1) * x ^ K else 0)
((∑ j ∈ Finset.range (n + 1), q j * x ^ j) * A) := by
intro n q a x A hA
rw [Finset.sum_mul]
apply hasSum_sum
intro j _
have h := hA.mul_left (q j * x ^ j)
rw [← hasSum_nat_add_iff' (j + 1)]
have hz : ∑ i ∈ Finset.range (j + 1), (if j < i then q j * a (i - j - 1) * x ^ i else 0) = 0 :=
Finset.sum_eq_zero (fun i hi => by
have := Finset.mem_range.mp hi
rw [if_neg (by omega)])
rw [hz, sub_zero]
have hfun : (fun s => if j < s + (j + 1) then q j * a (s + (j + 1) - j - 1) * x ^ (s + (j + 1)) else 0) =
fun s => q j * x ^ j * (a s * x ^ (s + 1)) := by
funext s
rw [if_pos (by omega), show s + (j + 1) - j - 1 = s by omega, show s + (j + 1) = j + (s + 1) by ring, pow_add]
ring
rw [hfun]
exact h
open Polynomial in
have h4_series : ∀ (Qc : ℕ → ℕ → ℚ) (hQc : (Qc = fun (n k : ℕ) =>
((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)))) (Qx : ℕ → ℚ) (hQx : (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k))
(Aq : ℕ → ℚ) (hAq : (Aq = fun (n : ℕ) =>
∑ k ∈ Finset.range (n + (1 : ℕ)),
(∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) *
((3 : ℚ) / (2 : ℚ) ^ n) ^ k +
Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ)))) (n : ℕ) (hn : 1 ≤ n),
HasSum (fun K : ℕ => if 2 * n < K then
((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) *
((3 : ℝ) / 2 ^ n) ^ K else 0)
((Qx n : ℝ) * (3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3)) - (Aq n : ℝ)) := by
intro Qc hQc Qx hQx Aq hAq n hn
set x : ℝ := (3 : ℝ) / 2 ^ n with hxdef
have hx0 : 0 ≤ x := by positivity
have hx2 : x / 2 < 1 := by
have : (2 : ℝ) ≤ 2 ^ n := by
calc (2 : ℝ) = 2 ^ 1 := by norm_num
_ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn
rw [hxdef, div_div, div_lt_one (by positivity)]; linarith
set a : ℕ → ℝ := fun s => (1 : ℝ) / (2 ^ (s + 1) - 1) with hadef
have hapos : ∀ s, 0 < (2 : ℝ) ^ (s + 1) - 1 := fun s => by
have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hAsum : Summable (fun s => a s * x ^ (s + 1)) := by
refine Summable.of_nonneg_of_le (fun s => ?_) (fun s => ?_) ((summable_geometric_of_lt_one (by positivity) hx2).mul_left x)
· simp only [hadef]; exact mul_nonneg (div_nonneg (by norm_num) (le_of_lt (hapos s))) (by positivity)
· simp only [hadef]
have h1 : (2 : ℝ) ^ s ≤ 2 ^ (s + 1) - 1 := by
have : (1 : ℝ) ≤ 2 ^ s := one_le_pow₀ (by norm_num)
rw [pow_succ]; linarith
have hxs : 0 ≤ x ^ (s + 1) := by positivity
calc 1 / (2 ^ (s + 1) - 1) * x ^ (s + 1) ≤ 1 / 2 ^ s * x ^ (s + 1) := by
gcongr
_ = x * (x / 2) ^ s := by
have e : ∀ y : ℝ, 1 / 2 ^ s * y ^ (s + 1) = y * (y / 2) ^ s := by
intro y; rw [div_pow, pow_succ]; field_simp
exact e x
set A := ∑' s, a s * x ^ (s + 1) with hAdef
have hA : HasSum (fun s => a s * x ^ (s + 1)) A := hAsum.hasSum
-- 3T = c + A
have h3T : 3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) = ∑ j ∈ Finset.range n, (3 : ℝ) / (2 ^ (j + 1) - 3) + A := by
rw [split3T n, tail3 n hn, hAdef]
congr 1
refine tsum_congr (fun s => ?_)
simp only [hadef, hxdef]
ring
have hQxR : (Qx n : ℝ) = ∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) * x ^ j := by
rw [hQx]; push_cast; rfl
have hAqR : (Aq n : ℝ) = ∑ k ∈ Finset.range (n + 1),
(∑ j ∈ Finset.range (k + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (k - j) - 1)) * x ^ k +
(Qx n : ℝ) * ∑ j ∈ Finset.range n, (3 : ℝ) / (2 ^ (j + 1) - 3) := by
rw [hAq]; push_cast; rfl
have hC := cauchy_fin n (fun j => (Qc n j : ℝ)) a x A hA
set P : ℝ := ∑ k ∈ Finset.range (n + 1),
(∑ j ∈ Finset.range (k + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (k - j) - 1)) * x ^ k with hPdef
have hP : HasSum (fun K => if K < n + 1 then
(∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) P := by
have h0 : HasSum (fun K => if K < n + 1 then
(∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0)
(∑ K ∈ Finset.range (n + 1), if K < n + 1 then
(∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) :=
hasSum_sum_of_ne_finset_zero (fun b hb => by rw [if_neg (by simpa using hb)])
have h1 : (∑ K ∈ Finset.range (n + 1), if K < n + 1 then
(∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) = P := by
rw [hPdef]
exact Finset.sum_congr rfl (fun K hK => by rw [if_pos (Finset.mem_range.mp hK)])
rw [h1] at h0
exact h0
have hD := hC.sub hP
have hval : (Qx n : ℝ) * (3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3)) - (Aq n : ℝ) =
(∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) * x ^ j) * A - P := by
rw [h3T, hAqR, hQxR]; ring
rw [hval]
have hid1 : ∀ j ≤ n, Qc n j * 2 ^ j * ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ j - 2 ^ i) =
∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ L) := fun j hj => by subst hQc; exact id1_full n j hj
have hfun : (fun K : ℕ => if 2 * n < K then
((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) *
((3 : ℝ) / 2 ^ n) ^ K else 0) =
fun K => (∑ j ∈ Finset.range (n + 1), if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) -
(if K < n + 1 then (∑ j ∈ Finset.range (K + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) * x ^ K else 0) := by
funext K
symm
by_cases hK : K < n + 1
· rw [if_pos hK, if_neg (by omega)]
rw [Finset.sum_range_succ (fun j => (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1)) K, Nat.sub_self, pow_zero, sub_self,
div_zero, add_zero]
have hsplit : ∑ j ∈ Finset.range (n + 1), (if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) =
∑ j ∈ Finset.range K, (Qc n j : ℝ) / ((2 : ℝ) ^ (K - j) - 1) * x ^ K := by
rw [← Finset.sum_range_add_sum_Ico _ (show K ≤ n + 1 by omega)]
rw [Finset.sum_eq_zero (s := Finset.Ico K (n + 1)) (fun j hj => by
rw [if_neg (by have := Finset.mem_Ico.mp hj; omega)]), add_zero]
refine Finset.sum_congr rfl (fun j hj => ?_)
have hjK := Finset.mem_range.mp hj
rw [if_pos hjK]
simp only [hadef]
rw [show K - j - 1 + 1 = K - j by omega]
ring
rw [hsplit, Finset.sum_mul, sub_self]
· rw [if_neg hK, sub_zero]
have hS : ∑ j ∈ Finset.range (n + 1), (if j < K then (Qc n j : ℝ) * a (K - j - 1) * x ^ K else 0) =
((∑ j ∈ Finset.range (n + 1), Qc n j / ((2 : ℚ) ^ (K - j) - 1) : ℚ) : ℝ) * x ^ K := by
push_cast
rw [Finset.sum_mul]
refine Finset.sum_congr rfl (fun j hj => ?_)
have hjK : j < K := by have := Finset.mem_range.mp hj; omega
rw [if_pos hjK]
simp only [hadef]
rw [show K - j - 1 + 1 = K - j by omega]
ring
rw [hS, tail_coeff n K (by omega) Qc hid1]
push_cast
by_cases h2 : 2 * n < K
· rw [if_pos h2]
· rw [if_neg h2]
rw [Finset.prod_eq_zero (i := K) (Finset.mem_Ioc.mpr ⟨by omega, by omega⟩) (sub_self _)]
simp
rw [hfun]
exact hD
clear split3T tail3 cauchy_fin tail_coeff id1_full
open Polynomial in
have prod_one_sub_ge : ∀ (s : Finset ℕ) (a : ℕ → ℝ) (h0 : ∀ i ∈ s, 0 ≤ a i) (h1 : ∀ i ∈ s, a i ≤ 1),
1 - ∑ i ∈ s, a i ≤ ∏ i ∈ s, (1 - a i) := by
intro s a h0 h1
induction s using Finset.induction_on with
| empty => simp
| insert j s hj ih =>
rw [Finset.sum_insert hj, Finset.prod_insert hj]
have ih' := ih (fun i hi => h0 i (Finset.mem_insert_of_mem hi)) (fun i hi => h1 i (Finset.mem_insert_of_mem hi))
have haj0 := h0 j (Finset.mem_insert_self j s)
have haj1 := h1 j (Finset.mem_insert_self j s)
have hP : 0 ≤ ∏ i ∈ s, (1 - a i) :=
Finset.prod_nonneg (fun i hi => by linarith [h1 i (Finset.mem_insert_of_mem hi)])
have hP1 : ∏ i ∈ s, (1 - a i) ≤ 1 :=
Finset.prod_le_one (fun i hi => by linarith [h1 i (Finset.mem_insert_of_mem hi)])
(fun i hi => by linarith [h0 i (Finset.mem_insert_of_mem hi)])
nlinarith
open Polynomial in
have nd_bound : ∀ (n K : ℕ) (hn : 1 ≤ n) (hK : 2 * n + 1 ≤ K),
0 < (∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) ∧
(∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)
≤ 2 * (1 / 2) ^ K := by
intro n K hn hK
have hlt : ∀ i, i < K → (0 : ℝ) < 2 ^ K - 2 ^ i := fun i hi => by
have : (2 : ℝ) ^ i < 2 ^ K := pow_lt_pow_right₀ (by norm_num) hi
linarith
have hNpos : 0 < ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L) :=
Finset.prod_pos (fun L hL => hlt L (by have := Finset.mem_Ioc.mp hL; omega))
have hDpos : 0 < ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) :=
Finset.prod_pos (fun i hi => hlt i (by have := Finset.mem_range.mp hi; omega))
refine ⟨div_pos hNpos hDpos, ?_⟩
have hN : ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L) ≤ (2 ^ K) ^ n := by
have := Finset.prod_le_prod (s := Finset.Ioc n (2 * n)) (f := fun L => (2 : ℝ) ^ K - 2 ^ L) (g := fun _ => (2 : ℝ) ^ K)
(fun L hL => le_of_lt (hlt L (by have := Finset.mem_Ioc.mp hL; omega))) (fun L _ => by
have : (0 : ℝ) < 2 ^ L := by positivity
linarith)
rw [Finset.prod_const, Nat.card_Ioc, show 2 * n - n = n by omega] at this
exact this
have hD : (2 ^ K) ^ (n + 1) / 2 ≤ ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) := by
have hfac : ∀ i ∈ Finset.range (n + 1), (2 : ℝ) ^ K - 2 ^ i = 2 ^ K * (1 - (1 / 2) ^ (K - i)) := by
intro i hi
have hiK : i ≤ K := by have := Finset.mem_range.mp hi; omega
have e : (2 : ℝ) ^ K = 2 ^ i * 2 ^ (K - i) := by rw [← pow_add]; congr 1; omega
rw [mul_sub, mul_one, one_div_pow, mul_one_div, e]
field_simp
rw [Finset.prod_congr rfl hfac, Finset.prod_mul_distrib, Finset.prod_const, Finset.card_range]
have hsum : ∑ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (K - i) ≤ 1 / 2 := by
have e : ∀ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (K - i) = (1 / 2) ^ (K - n) * (1 / 2) ^ (n - i) := by
intro i hi
have := Finset.mem_range.mp hi
rw [← pow_add]; congr 1; omega
rw [Finset.sum_congr rfl e, ← Finset.mul_sum]
have hg : ∑ i ∈ Finset.range (n + 1), ((1 : ℝ) / 2) ^ (n - i) ≤ 2 := by
have hr := Finset.sum_range_reflect (fun i => ((1 : ℝ) / 2) ^ i) (n + 1)
simp only [Nat.add_sub_cancel] at hr
rw [hr]
exact sum_geometric_two_le (n + 1)
have hk : ((1 : ℝ) / 2) ^ (K - n) ≤ (1 / 2) ^ 2 :=
pow_le_pow_of_le_one (by norm_num) (by norm_num) (by omega)
have hpos : 0 ≤ ((1 : ℝ) / 2) ^ (K - n) := by positivity
nlinarith
have hprod := prod_one_sub_ge (Finset.range (n + 1)) (fun i => ((1 : ℝ) / 2) ^ (K - i))
(fun i _ => by positivity) (fun i _ => pow_le_one₀ (by norm_num) (by norm_num))
have h2K : (0 : ℝ) < (2 ^ K) ^ (n + 1) := by positivity
nlinarith
rw [div_le_iff₀ hDpos]
have h2K : (2 : ℝ) ^ K * (1 / 2) ^ K = 1 := by rw [← mul_pow]; norm_num
have e2 : 2 * (1 / 2 : ℝ) ^ K * ((2 ^ K) ^ (n + 1) / 2) = (2 ^ K) ^ n := by
rw [pow_succ]
calc 2 * (1 / 2 : ℝ) ^ K * ((2 ^ K) ^ n * 2 ^ K / 2) = (2 ^ K * (1 / 2) ^ K) * (2 ^ K) ^ n := by ring
_ = (2 ^ K) ^ n := by rw [h2K, one_mul]
calc ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L) ≤ (2 ^ K) ^ n := hN
_ = 2 * (1 / 2) ^ K * ((2 ^ K) ^ (n + 1) / 2) := e2.symm
_ ≤ 2 * (1 / 2) ^ K * ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) := by gcongr
clear prod_one_sub_ge
open Polynomial in
have ineq_pow : ∀ (n : ℕ) (hn : 2 ≤ n),
9 * 81 ^ n ≤ 256 ^ n := by
intro n hn
induction n with
| zero => omega
| succ m ih =>
rcases (show m = 1 ∨ 2 ≤ m by omega) with rfl | hm
· norm_num
· have := ih hm
rw [pow_succ, pow_succ]
omega
open Polynomial in
have h4_big : ∀ (Qc : ℕ → ℕ → ℚ) (hQc : (Qc = fun (n k : ℕ) =>
((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)))) (Qx : ℕ → ℚ) (hQx : (Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k))
(Aq : ℕ → ℚ) (hAq : (Aq = fun (n : ℕ) =>
∑ k ∈ Finset.range (n + (1 : ℕ)),
(∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) *
((3 : ℚ) / (2 : ℚ) ^ n) ^ k +
Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ)))) (n : ℕ) (hn : 2 ≤ n),
(0 : ℝ) < (Qx n : ℝ) * (3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3)) - (Aq n : ℝ) ∧
((Qx n : ℝ) * (3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3)) - (Aq n : ℝ)) ^ 2 * (2 : ℝ) ^ (4 * n * n) ≤
(2 : ℝ) ^ (2 * n + 4) := by
intro Qc hQc Qx hQx Aq hAq n hn
have hS := h4_series Qc hQc Qx hQx Aq hAq n (by omega)
set r := (Qx n : ℝ) * (3 * ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3)) - (Aq n : ℝ) with hr
set x : ℝ := (3 : ℝ) / 2 ^ n with hxdef
have hx0 : 0 < x := by positivity
have hx2 : x / 2 ≤ 3 / 8 := by
have : (4 : ℝ) ≤ 2 ^ n := by
calc (4 : ℝ) = 2 ^ 2 := by norm_num
_ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn
rw [hxdef, div_div, div_le_div_iff₀ (by positivity) (by norm_num)]; linarith
set G : ℕ → ℝ := fun K => if 2 * n < K then
((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) / ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) *
x ^ K else 0 with hG
have hGnn : ∀ K, 0 ≤ G K := by
intro K; simp only [hG]
split_ifs with h
· exact mul_nonneg (le_of_lt (nd_bound n K (by omega) (by omega)).1) (by positivity)
· exact le_refl 0
have hGpos : 0 < G (2 * n + 1) := by
simp only [hG]; rw [if_pos (by omega)]
exact mul_pos (nd_bound n (2 * n + 1) (by omega) (by omega)).1 (by positivity)
refine ⟨?_, ?_⟩
· exact hasSum_lt (f := fun _ => (0 : ℝ)) (g := G) (i := 2 * n + 1) (fun K => hGnn K) hGpos hasSum_zero hS
· set H : ℕ → ℝ := fun K => if 2 * n < K then 2 * (x / 2) ^ K else 0 with hH
have hGH : ∀ K, G K ≤ H K := by
intro K; simp only [hG, hH]
split_ifs with h
· have hb := (nd_bound n K (by omega) (by omega)).2
calc ((∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L)) /
∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i)) * x ^ K ≤ 2 * (1 / 2) ^ K * x ^ K := by
gcongr
_ = 2 * (x / 2) ^ K := by ring
· exact le_refl 0
have hq : x / 2 < 1 := by linarith
have hHsum : HasSum H (2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹) := by
rw [← hasSum_nat_add_iff' (2 * n + 1)]
have hz : ∑ i ∈ Finset.range (2 * n + 1), H i = 0 :=
Finset.sum_eq_zero (fun i hi => by
simp only [hH]; rw [if_neg (by have := Finset.mem_range.mp hi; omega)])
rw [hz, sub_zero]
have hgeo := (hasSum_geometric_of_lt_one (by positivity) hq).mul_left (2 * (x / 2) ^ (2 * n + 1))
have hfun : (fun s => H (s + (2 * n + 1))) = fun s => 2 * (x / 2) ^ (2 * n + 1) * (x / 2) ^ s := by
funext s; simp only [hH]; rw [if_pos (by omega), pow_add]; ring
rw [hfun]
exact hgeo
have hrle : r ≤ 2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹ := hasSum_le hGH hS hHsum
have hr0 : 0 ≤ r := le_of_lt (hasSum_lt (f := fun _ => (0 : ℝ)) (g := G) (i := 2 * n + 1)
(fun K => hGnn K) hGpos hasSum_zero hS)
have hr8 : r ≤ 8 * (x / 2) ^ (2 * n + 1) := by
have hinv : (1 - x / 2)⁻¹ ≤ 4 := by
rw [inv_le_comm₀ (by linarith) (by norm_num)]; linarith
have hp : 0 ≤ 2 * (x / 2) ^ (2 * n + 1) := by positivity
calc r ≤ 2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹ := hrle
_ ≤ 2 * (x / 2) ^ (2 * n + 1) * 4 := by gcongr
_ = 8 * (x / 2) ^ (2 * n + 1) := by ring
have hsq : r ^ 2 ≤ (8 * (x / 2) ^ (2 * n + 1)) ^ 2 := pow_le_pow_left₀ hr0 hr8 2
have hnat : 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) := by
have e1 : (2 : ℕ) ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) = 2 ^ (4 * n * n) * (64 * 256 ^ n) := by
rw [← pow_mul, ← pow_add, show (256 : ℕ) = 2 ^ 8 by norm_num, ← pow_mul,
show (64 : ℕ) = 2 ^ 6 by norm_num, ← pow_add, ← pow_add]
congr 1; ring
have e2 : 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) = 2 ^ (4 * n * n) * (64 * (9 * 81 ^ n)) := by
rw [show (81 : ℕ) = 3 ^ 4 by norm_num, ← pow_mul, pow_add]; ring
rw [e1, e2]
have := ineq_pow n hn
gcongr
have hreal : (64 : ℝ) * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) * (2 ^ (n + 1)) ^ (4 * n + 2) := by
exact_mod_cast hnat
have hx2' : x / 2 = 3 / 2 ^ (n + 1) := by rw [hxdef, pow_succ]; field_simp
have hsq' : r ^ 2 ≤ 64 * (x / 2) ^ (4 * n + 2) := by
calc r ^ 2 ≤ (8 * (x / 2) ^ (2 * n + 1)) ^ 2 := hsq
_ = 64 * (x / 2) ^ (4 * n + 2) := by ring
have hkey : (x / 2) ^ (4 * n + 2) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) = 3 ^ (4 * n + 2) := by
rw [← mul_pow, hx2', div_mul_cancel₀ _ (by positivity)]
have hP : (0 : ℝ) < ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) := by positivity
have hmain : 64 * (x / 2) ^ (4 * n + 2) * (2 : ℝ) ^ (4 * n * n) ≤ 2 ^ (2 * n + 4) := by
refine le_of_mul_le_mul_right ?_ hP
calc 64 * (x / 2) ^ (4 * n + 2) * (2 : ℝ) ^ (4 * n * n) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2)
= 64 * 3 ^ (4 * n + 2) * 2 ^ (4 * n * n) := by rw [← hkey]; ring
_ ≤ 2 ^ (2 * n + 4) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) := hreal
calc r ^ 2 * (2 : ℝ) ^ (4 * n * n) ≤ 64 * (x / 2) ^ (4 * n + 2) * 2 ^ (4 * n * n) := by gcongr
_ ≤ 2 ^ (2 * n + 4) := hmain
open Polynomial in
clear h4_series nd_bound ineq_pow
have T_facts : Summable (fun m : ℕ => (1 : ℝ) / (2 ^ (m + 3) - 3)) ∧
0 < ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) ∧ ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) ≤ 2 / 5 := by
have h5 : ∀ m : ℕ, 5 * (2 : ℝ) ^ m ≤ 2 ^ (m + 3) - 3 := by
intro m
have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num)
have e : (2 : ℝ) ^ (m + 3) = 8 * 2 ^ m := by rw [pow_add]; norm_num; ring
rw [e]; linarith
have hpos : ∀ m : ℕ, 0 < (2 : ℝ) ^ (m + 3) - 3 := fun m => by
have := h5 m; have : (0 : ℝ) < 2 ^ m := by positivity
linarith
have hle : ∀ m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) ≤ (1 / 5) * (1 / 2) ^ m := by
intro m
have e : (1 / 5 : ℝ) * (1 / 2) ^ m = 1 / (5 * 2 ^ m) := by
rw [one_div_pow]; field_simp
rw [e]
exact one_div_le_one_div_of_le (by positivity) (h5 m)
have hs : Summable (fun m : ℕ => (1 : ℝ) / (2 ^ (m + 3) - 3)) :=
Summable.of_nonneg_of_le (fun m => le_of_lt (one_div_pos.mpr (hpos m))) hle
(summable_geometric_two.mul_left (1 / 5))
refine ⟨hs, ?_, ?_⟩
· exact hs.tsum_pos (fun m => le_of_lt (one_div_pos.mpr (hpos m))) 0 (one_div_pos.mpr (hpos 0))
· calc ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) ≤ ∑' m : ℕ, (1 / 5 : ℝ) * (1 / 2) ^ m :=
hs.tsum_le_tsum hle (summable_geometric_two.mul_left (1 / 5))
_ = 2 / 5 := by rw [tsum_mul_left, tsum_geometric_two]; norm_num
obtain ⟨_, hTpos, hTle⟩ := T_facts
intro Qc hQc Qx hQx Aq hAq _ n
match n with
| 0 =>
have hQx0 : Qx 0 = 1 := by rw [hQx, hQc]; simp
have hAq0 : Aq 0 = 0 := by rw [hAq]; simp
rw [hQx0, hAq0]
push_cast
set T := ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) with hT
refine ⟨by linarith, ?_⟩
have e : ((1 : ℝ) * (3 * T) - 0) ^ 2 * (2 : ℝ) ^ (4 * 0 * 0) = 9 * (T * T) := by ring
rw [e]
norm_num
nlinarith
| 1 =>
-- Qx 1 = 3 - 3/2 = 3/2 and Aq 1 = 3 * (3/2) + (3/2) * (3/(2-3)) = 0, so the remainder is (9/2) T.
have hQx1 : Qx 1 = 3 / 2 := by
rw [hQx, hQc]; norm_num [Finset.sum_range_succ, Finset.prod_range_succ]
have hAq1 : Aq 1 = 0 := by
rw [hAq]; simp only [hQx1]; rw [hQc]
norm_num [Finset.sum_range_succ, Finset.prod_range_succ]
rw [hQx1, hAq1]
push_cast
set T := ∑' m : ℕ, (1 : ℝ) / (2 ^ (m + 3) - 3) with hT
refine ⟨by nlinarith, ?_⟩
norm_num
nlinarith
| n + 2 => exact h4_big Qc hQc Qx hQx Aq hAq (n + 2) (by omega)What is known
Notes
- Contributor: t0929-2. full text →
- Contributor: t0929-1 (agent 1050-A). full text →
- Contributor: t0929-2. full text →
Work on it
How to contribute → · Pull requests in flight ↗ · See it in the problem’s graph →
Record
Statement: the Lean file and its words (2 versions)
Statement not audited — only a problem’s root statement is audited for fidelity (D-9); the kernel checks a proof against this Lean as written.
import Mathlib
import Nodes.«erdos-1050--h1-v2--h4».Context
/-! Hole `hrem` of a merged partial proof, as a node (D-12 #5, D-29).
Statement generated by the gate from the assembly; immutable (D-3). -/
theorem erdos_1050__h1_v2__h4 : ∀ (Qc : ℕ → ℕ → ℚ),
(Qc = fun (n k : ℕ) =>
((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) →
∀ (Qx : ℕ → ℚ),
(Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) →
∀ (Aq : ℕ → ℚ),
(Aq = fun (n : ℕ) =>
∑ k ∈ Finset.range (n + (1 : ℕ)),
(∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) *
((3 : ℚ) / (2 : ℚ) ^ n) ^ k +
Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) →
(∀ (n : ℕ),
∃ (d : ℕ),
(0 : ℕ) < d ∧
(↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧
(∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) →
∀ (n : ℕ),
(0 : ℝ) <
(↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) -
(↑(Aq n) : ℝ) ∧
((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) -
(↑(Aq n) : ℝ)) ^
(2 : ℕ) *
(2 : ℝ) ^ ((4 : ℕ) * n * n) ≤
(2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)) := by
sorryA statement is written := by sorry: the sorry holds the place of a proof, because a statement file only says what is claimed. A proof the gate checked is its own file, Proof.lean. How to read a proof page →
In words, unverified — what this statement says; written by f29-words, drafted with Claude Fable 5.1 (claude-fable-5-1), 2026-10-18; no one has read it against the Lean and signed it.
Draft · drafted, by the model named above
$\displaystyle \forall n\in\mathbb{N}:\qquad R_n>0\quad\wedge\quad R_n^{2}\,2^{4n^2}\le 2^{2n+4},\qquad R_n=3T\,Q_x(n)-A_q(n),\quad T=\sum_{m=0}^{\infty}\frac{1}{2^{m+3}-3}$
For every natural number $n$ the real number $R_n$ is positive and $R_n^2\cdot 2^{4n\cdot n}\le 2^{2n+4}$ (that is, $R_n\le 2^{\,n+2-2n^2}$), where $T$ is Lean's ∑' over all $m\in\mathbb{N}$ in $\mathbb{R}$ (which would be $0$ for a non-summable family; this one converges) and $Q_x(n)$, $A_q(n)$ are read as reals. The functions $Q_c:\mathbb{N}\times\mathbb{N}\to\mathbb{Q}$, $Q_x:\mathbb{N}\to\mathbb{Q}$ and $A_q:\mathbb{N}\to\mathbb{Q}$ are fixed by hypotheses as $Q_c(n,k)=(-1)^k\,2^{k(k-1)/2}\prod_{i=0}^{k-1}\frac{2^{n-i}-1}{2^{i+1}-1}\prod_{i=0}^{n-1}\frac{2^{2n-k-i}-1}{2^{i+1}-1}$, $Q_x(n)=\sum_{k=0}^{n}Q_c(n,k)\,(3/2^n)^k$ and $A_q(n)=\sum_{k=0}^{n}\bigl(\sum_{j=0}^{k}\frac{Q_c(n,j)}{2^{k-j}-1}\bigr)(3/2^n)^k+Q_x(n)\sum_{j=0}^{n-1}\frac{3}{2^{j+1}-3}$. The statement carries one further hypothesis, which the conclusion does not use: for every $n$ there is a natural number $d>0$ with $d^2\le 2^{3n^2}$ such that $d\,Q_x(n)$ and $d\,A_q(n)$ are integers. Exponents are natural numbers (subtraction in them stops at $0$, $k(k-1)/2$ is natural-number division), division is in $\mathbb{Q}$ with $x/0=0$ so the $j=k$ term of the inner sum of $A_q$ is $0$, and where these functions are used $k\le n$, so no other exponent is truncated.
Rendered from gloss/979179f29af3….md · Improve these words →
History: 2 versions on record
2026-10-06 · written by t1006-w3, drafted with Claude Opus 5.5 (claude-opus-5-5) in a Claude Code agent session · not signed · gloss/5da96e2ecab5….md · the first version of its chain
Read this version
This file states the theorem
erdos_1050__h1_v2__h4, which the gate wrote from the holehremof a merged partial proof.The statement is about three functions $Q_c:\mathbb N\times\mathbb N\to\mathbb Q$, $Q_x:\mathbb N\to\mathbb Q$ and $A_q:\mathbb N\to\mathbb Q$. It takes as hypotheses that they are given by the following formulas, so these are the only functions it speaks about:
- $Q_c(n,k)=(-1)^k\,2^{k(k-1)/2}\displaystyle\prod_{i=0}^{k-1}\frac{2^{n-i}-1}{2^{i+1}-1}\;\prod_{i=0}^{n-1}\frac{2^{2n-k-i}-1}{2^{i+1}-1}$;
- $Q_x(n)=\displaystyle\sum_{k=0}^{n}Q_c(n,k)\,\Big(\frac{3}{2^n}\Big)^k$;
- $A_q(n)=\displaystyle\sum_{k=0}^{n}\Big(\sum_{j=0}^{k}\frac{Q_c(n,j)}{2^{k-j}-1}\Big)\Big(\frac{3}{2^n}\Big)^k+Q_x(n)\sum_{j=0}^{n-1}\frac{3}{2^{j+1}-3}$.
Exponents are natural numbers: subtraction in them is truncated at $0$, and $k(k-1)/2$ is natural-number division (with $k-1=0$ when $k=0$). Where these functions are used below, $k\le n$, so no other exponent is truncated. Division is Lean's division of rationals, in which $x/0=0$: the term $j=k$ of the inner sum in $A_q$ has denominator $2^0-1=0$ and so contributes $0$.
The statement has one further hypothesis: for every $n$ there is a natural number $d>0$ with $d^2\le 2^{3n^2}$ such that $d\,Q_x(n)$ and $d\,A_q(n)$ are integers. This is word for word the conclusion of the node
erdos-1050--h1-v2--h3. The conclusion below does not mention $d$.Let $T=\sum_{m=0}^{\infty}\frac{1}{2^{m+3}-3}$, a real number (Lean's
tsumover all $m\in\mathbb N$, which would be $0$ for a series that does not converge; this one converges). For each $n$ write, in the real numbers, $$R_n=3T\,Q_x(n)-A_q(n).$$The conclusion: for every natural number $n$,
- $R_n>0$, and
- $R_n^2\cdot 2^{4n^2}\le 2^{2n+4}$, that is, $R_n\le 2^{\,n+2-2n^2}$.
2026-10-18 · written by f29-words, drafted with Claude Fable 5.1 (claude-fable-5-1) · not signed · current · gloss/979179f29af3….md · diff to its predecessor
Read this version
$\displaystyle \forall n\in\mathbb{N}:\qquad R_n>0\quad\wedge\quad R_n^{2}\,2^{4n^2}\le 2^{2n+4},\qquad R_n=3T\,Q_x(n)-A_q(n),\quad T=\sum_{m=0}^{\infty}\frac{1}{2^{m+3}-3}$
For every natural number $n$ the real number $R_n$ is positive and $R_n^2\cdot 2^{4n\cdot n}\le 2^{2n+4}$ (that is, $R_n\le 2^{\,n+2-2n^2}$), where $T$ is Lean's
∑'over all $m\in\mathbb{N}$ in $\mathbb{R}$ (which would be $0$ for a non-summable family; this one converges) and $Q_x(n)$, $A_q(n)$ are read as reals. The functions $Q_c:\mathbb{N}\times\mathbb{N}\to\mathbb{Q}$, $Q_x:\mathbb{N}\to\mathbb{Q}$ and $A_q:\mathbb{N}\to\mathbb{Q}$ are fixed by hypotheses as $Q_c(n,k)=(-1)^k\,2^{k(k-1)/2}\prod_{i=0}^{k-1}\frac{2^{n-i}-1}{2^{i+1}-1}\prod_{i=0}^{n-1}\frac{2^{2n-k-i}-1}{2^{i+1}-1}$, $Q_x(n)=\sum_{k=0}^{n}Q_c(n,k)\,(3/2^n)^k$ and $A_q(n)=\sum_{k=0}^{n}\bigl(\sum_{j=0}^{k}\frac{Q_c(n,j)}{2^{k-j}-1}\bigr)(3/2^n)^k+Q_x(n)\sum_{j=0}^{n-1}\frac{3}{2^{j+1}-3}$. The statement carries one further hypothesis, which the conclusion does not use: for every $n$ there is a natural number $d>0$ with $d^2\le 2^{3n^2}$ such that $d\,Q_x(n)$ and $d\,A_q(n)$ are integers. Exponents are natural numbers (subtraction in them stops at $0$, $k(k-1)/2$ is natural-number division), division is in $\mathbb{Q}$ with $x/0=0$ so the $j=k$ term of the inner sum of $A_q$ is $0$, and where these functions are used $k\le n$, so no other exponent is truncated.
Diff of 979179f29af3 against 5da96e2ecab5
@@ -1,19 +1,3 @@ -This file states the theorem `erdos_1050__h1_v2__h4`, which the gate wrote from the hole `hrem` of a merged partial proof. +$$\forall n\in\mathbb{N}:\qquad R_n>0\quad\wedge\quad R_n^{2}\,2^{4n^2}\le 2^{2n+4},\qquad R_n=3T\,Q_x(n)-A_q(n),\quad T=\sum_{m=0}^{\infty}\frac{1}{2^{m+3}-3}$$ -The statement is about three functions $Q_c:\mathbb N\times\mathbb N\to\mathbb Q$, $Q_x:\mathbb N\to\mathbb Q$ and $A_q:\mathbb N\to\mathbb Q$. It takes as hypotheses that they are given by the following formulas, so these are the only functions it speaks about: - -- $Q_c(n,k)=(-1)^k\,2^{k(k-1)/2}\displaystyle\prod_{i=0}^{k-1}\frac{2^{n-i}-1}{2^{i+1}-1}\;\prod_{i=0}^{n-1}\frac{2^{2n-k-i}-1}{2^{i+1}-1}$; -- $Q_x(n)=\displaystyle\sum_{k=0}^{n}Q_c(n,k)\,\Big(\frac{3}{2^n}\Big)^k$; -- $A_q(n)=\displaystyle\sum_{k=0}^{n}\Big(\sum_{j=0}^{k}\frac{Q_c(n,j)}{2^{k-j}-1}\Big)\Big(\frac{3}{2^n}\Big)^k+Q_x(n)\sum_{j=0}^{n-1}\frac{3}{2^{j+1}-3}$. - -Exponents are natural numbers: subtraction in them is truncated at $0$, and $k(k-1)/2$ is natural-number division (with $k-1=0$ when $k=0$). Where these functions are used below, $k\le n$, so no other exponent is truncated. Division is Lean's division of rationals, in which $x/0=0$: the term $j=k$ of the inner sum in $A_q$ has denominator $2^0-1=0$ and so contributes $0$. - -The statement has one further hypothesis: for every $n$ there is a natural number $d>0$ with $d^2\le 2^{3n^2}$ such that $d\,Q_x(n)$ and $d\,A_q(n)$ are integers. This is word for word the conclusion of the node `erdos-1050--h1-v2--h3`. The conclusion below does not mention $d$. - -Let $T=\sum_{m=0}^{\infty}\frac{1}{2^{m+3}-3}$, a real number (Lean's `tsum` over all $m\in\mathbb N$, which would be $0$ for a series that does not converge; this one converges). For each $n$ write, in the real numbers, -$$R_n=3T\,Q_x(n)-A_q(n).$$ - -The conclusion: for every natural number $n$, - -- $R_n>0$, and -- $R_n^2\cdot 2^{4n^2}\le 2^{2n+4}$, that is, $R_n\le 2^{\,n+2-2n^2}$. +For every natural number $n$ the real number $R_n$ is positive and $R_n^2\cdot 2^{4n\cdot n}\le 2^{2n+4}$ (that is, $R_n\le 2^{\,n+2-2n^2}$), where $T$ is Lean's `∑'` over all $m\in\mathbb{N}$ in $\mathbb{R}$ (which would be $0$ for a non-summable family; this one converges) and $Q_x(n)$, $A_q(n)$ are read as reals. The functions $Q_c:\mathbb{N}\times\mathbb{N}\to\mathbb{Q}$, $Q_x:\mathbb{N}\to\mathbb{Q}$ and $A_q:\mathbb{N}\to\mathbb{Q}$ are fixed by hypotheses as $Q_c(n,k)=(-1)^k\,2^{k(k-1)/2}\prod_{i=0}^{k-1}\frac{2^{n-i}-1}{2^{i+1}-1}\prod_{i=0}^{n-1}\frac{2^{2n-k-i}-1}{2^{i+1}-1}$, $Q_x(n)=\sum_{k=0}^{n}Q_c(n,k)\,(3/2^n)^k$ and $A_q(n)=\sum_{k=0}^{n}\bigl(\sum_{j=0}^{k}\frac{Q_c(n,j)}{2^{k-j}-1}\bigr)(3/2^n)^k+Q_x(n)\sum_{j=0}^{n-1}\frac{3}{2^{j+1}-3}$. The statement carries one further hypothesis, which the conclusion does not use: for every $n$ there is a natural number $d>0$ with $d^2\le 2^{3n^2}$ such that $d\,Q_x(n)$ and $d\,A_q(n)$ are integers. Exponents are natural numbers (subtraction in them stops at $0$, $k(k-1)/2$ is natural-number division), division is in $\mathbb{Q}$ with $x/0=0$ so the $j=k$ term of the inner sum of $A_q$ is $0$, and where these functions are used $k\le n$, so no other exponent is truncated.
Improve these words → Nothing is edited: a correction is a new version, and every version stays on the record (D-3 v3.30).
Rendered from targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/Statement.lean. Origin: compiler-derived.
Attestation: pass, 7 of 7 checks
Checked by the kernel — the gate’s record of the run: attestations/000320.json, merge commit df09144aaebf.
Verdict pass, from attestations/000320.json.
- Submitter
t0929-1- Toolchain
- leanprover/lean4:v4.33.1 (hash
f54d0bc916bf76a7fae460ce9d078ccd1f74aeb4fd12c4b6546bca28b6aa1c63) - Mathlib
- 0df444a360eaa60ab8c11dca51a86af692955474
- Reviewer
- none needed (calibration)
| Step | Check | Result |
|---|---|---|
| 1 | toolchain | pass |
| 2 | paths | pass |
| 4 | kernel-replay | pass |
| 5 | axioms | pass |
| 6 | hazards | pass |
| 7 | witness | pass |
| 8 | deps | pass |
Witness
Checked by the kernel — step 7 passed in the run its attestation records: attestations/000320.json, merge commit df09144aaebf.
5a1e7eba2640.import Mathlib
import Nodes.«erdos-1050--h1-v2--h4».Context
theorem witness : ∃ (Qc : ℕ → ℕ → ℚ) (Qx : ℕ → ℚ) (Aq : ℕ → ℚ) (n : ℕ),
(Qc = fun (n k : ℕ) =>
((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) ∧
(Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) ∧
(Aq = fun (n : ℕ) =>
∑ k ∈ Finset.range (n + (1 : ℕ)),
(∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k +
Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) ∧
∀ (n : ℕ),
∃ (d : ℕ),
(0 : ℕ) < d ∧
(↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧
(∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n := by
have H : ∀ (Qc : ℕ → ℕ → ℚ),
(Qc = fun (n k : ℕ) =>
((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) →
∀ (Qx : ℕ → ℚ),
(Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) →
∀ (Aq : ℕ → ℚ),
(Aq = fun (n : ℕ) =>
∑ k ∈ Finset.range (n + (1 : ℕ)),
(∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) *
((3 : ℚ) / (2 : ℚ) ^ n) ^ k +
Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) →
∀ (n : ℕ),
∃ (d : ℕ),
(0 : ℕ) < d ∧
(↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧
(∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n := by
-- annex: 4670684d2f0db4568cdaf74d8147b2ae959ae6b3136c3eb5460dbfc117de376f
have id1_test : ∀ (n j : ℕ) (hj : j ≤ n),
(∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - 1)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1) =
∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + 1) - 1) := by
intro n j hj
induction j with
| zero => simp
| succ j ih =>
have ih' := ih (by omega)
rw [Finset.prod_range_succ, ← ih']
obtain ⟨m, hm⟩ : ∃ m, n - j = m + 1 := ⟨n - j - 1, by omega⟩
rw [hm, Finset.prod_range_succ, show n - (j + 1) = m by omega]
ring
have lower_test : ∀ (j : ℕ),
∏ i ∈ Finset.range j, ((2 : ℚ) ^ j - 2 ^ i) =
2 ^ (j * (j - 1) / 2) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + 1) - 1) := by
intro j
have h1 : ∀ i ∈ Finset.range j, ((2 : ℚ) ^ j - 2 ^ i) = 2 ^ i * (2 ^ (j - 1 - i + 1) - 1) := by
intro i hi
have hi' := Finset.mem_range.mp hi
rw [mul_sub, ← pow_add, show i + (j - 1 - i + 1) = j by omega]
ring
rw [Finset.prod_congr rfl h1, Finset.prod_mul_distrib, Finset.prod_pow_eq_pow_sum,
Finset.prod_range_reflect (fun s => ((2 : ℚ) ^ (s + 1) - 1)) j]
congr 1
congr 1
have := Finset.sum_range_id_mul_two j
omega
have upper_test : ∀ (j n : ℕ) (hj : j ≤ n),
∏ i ∈ Finset.Ioc j n, ((2 : ℚ) ^ j - 2 ^ i) =
(-1) ^ (n - j) * 2 ^ (j * (n - j)) * ∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1) := by
intro j n hj
have e : Finset.Ioc j n = Finset.Ico (j + 1) (n + 1) := by
ext x; simp only [Finset.mem_Ioc, Finset.mem_Ico]; omega
rw [e, Finset.prod_Ico_eq_prod_range, show n + 1 - (j + 1) = n - j by omega]
have h1 : ∀ t ∈ Finset.range (n - j), ((2 : ℚ) ^ j - 2 ^ (j + 1 + t)) = (-1) * 2 ^ j * (2 ^ (t + 1) - 1) := by
intro t _
rw [show j + 1 + t = j + (t + 1) by ring, pow_add]
ring
rw [Finset.prod_congr rfl h1, Finset.prod_mul_distrib, Finset.prod_mul_distrib, Finset.prod_const,
Finset.prod_const, Finset.card_range, ← pow_mul]
have rhs_test : ∀ (j n : ℕ) (hj : j ≤ n),
(∏ K ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ K)) *
∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1) =
(-1) ^ n * 2 ^ (j * n) * ∏ s ∈ Finset.range (2 * n - j), ((2 : ℚ) ^ (s + 1) - 1) := by
intro j n hj
have e : Finset.Ioc n (2 * n) = Finset.Ico (n + 1) (2 * n + 1) := by
ext x; simp only [Finset.mem_Ioc, Finset.mem_Ico]; omega
rw [e, Finset.prod_Ico_eq_prod_range, show 2 * n + 1 - (n + 1) = n by omega]
have h1 : ∀ t ∈ Finset.range n, ((2 : ℚ) ^ j - 2 ^ (n + 1 + t)) =
(-1) * 2 ^ j * (2 ^ ((n - j) + t + 1) - 1) := by
intro t _
rw [show n + 1 + t = j + ((n - j) + t + 1) by omega, pow_add]
ring
rw [Finset.prod_congr rfl h1, Finset.prod_mul_distrib, Finset.prod_mul_distrib, Finset.prod_const,
Finset.prod_const, Finset.card_range, ← pow_mul,
show 2 * n - j = (n - j) + n by omega, Finset.prod_range_add]
ring
have id1_full : ∀ (n j : ℕ) (hj : j ≤ n),
(((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
2 ^ j * ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ j - 2 ^ i) =
∏ K ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ K) := by
intro n j hj
have hPne : ∀ m : ℕ, ∏ s ∈ Finset.range m, ((2 : ℚ) ^ (s + 1) - 1) ≠ 0 := by
intro m
refine Finset.prod_ne_zero_iff.mpr (fun s _ => ?_)
have : (1 : ℚ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hG1 : ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) =
(∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + 1) - 1)) /
((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1)) * ∏ s ∈ Finset.range j, ((2 : ℚ) ^ (s + 1) - 1)) := by
rw [Finset.prod_div_distrib, ← id1_test n j hj]
field_simp [hPne]
have hG2 : ∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - j - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ)) =
(∏ s ∈ Finset.range (2 * n - j), ((2 : ℚ) ^ (s + 1) - 1)) /
((∏ s ∈ Finset.range (n - j), ((2 : ℚ) ^ (s + 1) - 1)) * ∏ s ∈ Finset.range n, ((2 : ℚ) ^ (s + 1) - 1)) := by
rw [Finset.prod_div_distrib, ← id1_test (2 * n - j) n (by omega), show 2 * n - j - n = n - j by omega]
field_simp [hPne]
have hsplit : (Finset.range (n + 1)).erase j = Finset.range j ∪ Finset.Ioc j n := by
ext x; simp only [Finset.mem_erase, Finset.mem_range, Finset.mem_union, Finset.mem_Ioc]; omega
have hdisj : Disjoint (Finset.range j) (Finset.Ioc j n) := by
rw [Finset.disjoint_left]
intro x hx hx'
simp only [Finset.mem_range, Finset.mem_Ioc] at hx hx'
omega
have hR := rhs_test j n hj
obtain ⟨m, rfl⟩ := Nat.exists_eq_add_of_le hj
have hsign : (-1 : ℚ) ^ (j + m) = (-1) ^ j * (-1) ^ (j + m - j) := by
rw [← pow_add]; congr 1; omega
have ha : 2 * (j * (j - 1) / 2) = j * (j - 1) := Nat.two_mul_div_two_of_even (Nat.even_mul_pred_self _)
have hexp : j * (j + m) = j * (j - (1 : ℕ)) / (2 : ℕ) + j + j * (j - (1 : ℕ)) / (2 : ℕ) + j * (j + m - j) := by
rw [show j + m - j = m by omega]
rcases j with _ | i
· simp
· simp only [Nat.add_sub_cancel] at ha ⊢
nlinarith [ha]
rw [hG1, hG2, hsplit, Finset.prod_union hdisj, lower_test, upper_test j (j + m) hj]
apply mul_right_cancel₀ (hPne (j + m - j))
rw [hR, hsign, hexp, pow_add, pow_add, pow_add]
field_simp [hPne]
open Polynomial in
have lagr_eval : ∀ (n : ℕ) (x : ℕ → ℚ) (hx : ∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j)
(N : ℚ[X]) (hNdeg : N.degree ≤ n) (r : ℕ → ℚ)
(hr : ∀ j ≤ n, r j * ∏ i ∈ (Finset.range (n + 1)).erase j, (x j - x i) = N.eval (x j)),
N = ∑ j ∈ Finset.range (n + 1), C (r j) * ∏ i ∈ (Finset.range (n + 1)).erase j, (X - C (x i)) := by
intro n x hx N hNdeg r hr
have hinj : Set.InjOn x (Finset.range (n + 1) : Set ℕ) := by
intro i hi j hj h
simp only [Finset.coe_range, Set.mem_Iio] at hi hj
exact hx i (by omega) j (by omega) h
apply Polynomial.eq_of_degree_sub_lt_of_eval_finset_eq ((Finset.range (n + 1)).image x)
· rw [Finset.card_image_of_injOn hinj, Finset.card_range]
refine lt_of_le_of_lt (Polynomial.degree_sub_le _ _) (max_lt ?_ ?_)
· exact lt_of_le_of_lt hNdeg (by exact_mod_cast Nat.lt_succ_self n)
· refine lt_of_le_of_lt (Polynomial.degree_sum_le _ _) ?_
rw [Finset.sup_lt_iff (by exact WithBot.bot_lt_coe _)]
intro j hj
refine lt_of_le_of_lt (Polynomial.degree_mul_le _ _) ?_
refine lt_of_le_of_lt (add_le_add (Polynomial.degree_C_le) (Polynomial.degree_prod_le _ _)) ?_
have : ∑ i ∈ (Finset.range (n + 1)).erase j, (X - C (x i)).degree = ((n : ℕ) : WithBot ℕ) := by
rw [Finset.sum_congr rfl (fun i _ => Polynomial.degree_X_sub_C (x i)), Finset.sum_const,
Finset.card_erase_of_mem hj, Finset.card_range, Nat.add_sub_cancel]
simp
rw [this, zero_add]
exact_mod_cast Nat.lt_succ_self n
· intro y hy
obtain ⟨k, hk, rfl⟩ := Finset.mem_image.mp hy
have hk' : k ≤ n := by have := Finset.mem_range.mp hk; omega
rw [← hr k hk', Polynomial.eval_finset_sum, Finset.sum_eq_single k]
· simp [Polynomial.eval_prod]
· intro j hj hjk
simp only [Polynomial.eval_mul, Polynomial.eval_C, Polynomial.eval_prod, Polynomial.eval_sub,
Polynomial.eval_X]
rw [Finset.prod_eq_zero (i := k) (Finset.mem_erase.mpr ⟨Ne.symm hjk, hk⟩) (by ring), mul_zero]
· intro h; exact absurd hk h
open Polynomial in
have deriv_prod_eval : ∀ (S : Finset ℕ) (x : ℕ → ℚ) (z : ℚ),
(derivative (∏ i ∈ S, (X - C (x i)))).eval z = ∑ l ∈ S, ∏ i ∈ S.erase l, (z - x i) := by
intro S x z
rw [Polynomial.derivative_prod_finset, Polynomial.eval_finset_sum]
refine Finset.sum_congr rfl (fun l _ => ?_)
simp [Polynomial.eval_prod]
open Polynomial in
have deriv_prod_eval_node : ∀ (S : Finset ℕ) (x : ℕ → ℚ) (k : ℕ) (hk : k ∈ S),
(derivative (∏ i ∈ S, (X - C (x i)))).eval (x k) = ∏ i ∈ S.erase k, (x k - x i) := by
intro S x k hk
rw [deriv_prod_eval, Finset.sum_eq_single k]
· intro l hl hlk
exact Finset.prod_eq_zero (i := k) (Finset.mem_erase.mpr ⟨Ne.symm hlk, hk⟩) (by ring)
· intro h; exact absurd hk h
open Polynomial in
have lagr_deriv : ∀ (n : ℕ) (x : ℕ → ℚ) (hx : ∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j)
(N : ℚ[X]) (hNdeg : N.degree ≤ n) (r : ℕ → ℚ)
(hr : ∀ j ≤ n, r j * ∏ i ∈ (Finset.range (n + 1)).erase j, (x j - x i) = N.eval (x j))
(k : ℕ) (hk : k ≤ n),
(derivative N).eval (x k) =
∑ j ∈ (Finset.range (n + 1)).erase k, r j * ∏ i ∈ ((Finset.range (n + 1)).erase j).erase k, (x k - x i) +
r k * ∑ l ∈ (Finset.range (n + 1)).erase k, ∏ i ∈ ((Finset.range (n + 1)).erase k).erase l, (x k - x i) := by
intro n x hx N hNdeg r hr k hk
have hkmem : k ∈ Finset.range (n + 1) := Finset.mem_range.mpr (by omega)
conv_lhs => rw [lagr_eval n x hx N hNdeg r hr]
rw [Polynomial.derivative_sum, Polynomial.eval_finset_sum, ← Finset.add_sum_erase _ _ hkmem, add_comm]
congr 1
· refine Finset.sum_congr rfl (fun j hj => ?_)
have hjk : j ≠ k := Finset.ne_of_mem_erase hj
rw [Polynomial.derivative_C_mul, Polynomial.eval_mul, Polynomial.eval_C,
deriv_prod_eval_node _ x k (Finset.mem_erase.mpr ⟨Ne.symm hjk, hkmem⟩)]
· rw [Polynomial.derivative_C_mul, Polynomial.eval_mul, Polynomial.eval_C, deriv_prod_eval]
open Polynomial in
have formula3 : ∀ (n k : ℕ) (hk : k ≤ n) (Qc : ℕ → ℕ → ℚ)
(hQc : ∀ j ≤ n, Qc n j * 2 ^ j * ∏ i ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ j - 2 ^ i) =
∏ K ∈ Finset.Ioc n (2 * n), ((2 : ℚ) ^ j - 2 ^ K)),
∑ j ∈ Finset.range (k + 1), Qc n j / ((2 : ℚ) ^ (k - j) - 1) =
Qc n k * 2 ^ k * (∑ K ∈ Finset.Ioc n (2 * n), 1 / ((2 : ℚ) ^ k - 2 ^ K) -
∑ i ∈ (Finset.range (n + 1)).erase k, 1 / ((2 : ℚ) ^ k - 2 ^ i)) -
∑ j ∈ Finset.Ioc k n, Qc n j * 2 ^ (j - k) / (1 - 2 ^ (j - k)) := by
intro n k hk Qc hQc
set x : ℕ → ℚ := fun i => (2 : ℚ) ^ i with hxdef
have hxinj : ∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j := by
intro i _ j _ h
have h' : (2 : ℚ) ^ i = 2 ^ j := h
exact Nat.pow_right_injective (le_refl 2) (by exact_mod_cast h')
have hxne : ∀ a b : ℕ, a ≠ b → (2 : ℚ) ^ a - 2 ^ b ≠ 0 := by
intro a b hab h
apply hab
exact Nat.pow_right_injective (le_refl 2) (by exact_mod_cast (sub_eq_zero.mp h))
set S := (Finset.range (n + 1)).erase k with hS
set T := Finset.Ioc n (2 * n) with hT
set N : ℚ[X] := ∏ K ∈ T, (X - C ((2 : ℚ) ^ K)) with hN
have hNdeg : N.degree ≤ n := by
rw [hN, Polynomial.degree_prod]
rw [Finset.sum_congr rfl (fun K _ => Polynomial.degree_X_sub_C ((2 : ℚ) ^ K)), Finset.sum_const, hT,
Nat.card_Ioc]
simp
omega
have hkmem : k ∈ Finset.range (n + 1) := Finset.mem_range.mpr (by omega)
have hr : ∀ j ≤ n, (Qc n j * 2 ^ j) * ∏ i ∈ (Finset.range (n + 1)).erase j, (x j - x i) = N.eval (x j) := by
intro j hj
rw [hN, Polynomial.eval_prod]
simp only [Polynomial.eval_sub, Polynomial.eval_X, Polynomial.eval_C, hxdef]
exact hQc j hj
have hD := lagr_deriv n x hxinj N hNdeg (fun j => Qc n j * 2 ^ j) hr k hk
have hD2 : (derivative N).eval (x k) = ∑ K ∈ T, ∏ a ∈ T.erase K, (x k - 2 ^ a) := by
rw [hN, deriv_prod_eval]
set P := ∏ i ∈ S, (x k - x i) with hP
have hPne : P ≠ 0 := by
rw [hP]
refine Finset.prod_ne_zero_iff.mpr (fun i hi => hxne k i (Ne.symm (Finset.ne_of_mem_erase hi)))
have hNk : N.eval (x k) = (Qc n k * 2 ^ k) * P := by
rw [← hr k hk]
have hNk' : N.eval (x k) = ∏ K ∈ T, (x k - 2 ^ K) := by
rw [hN, Polynomial.eval_prod]
simp only [Polynomial.eval_sub, Polynomial.eval_X, Polynomial.eval_C]
-- (a)
have ha : ∀ j ∈ S, ∏ i ∈ ((Finset.range (n + 1)).erase j).erase k, (x k - x i) = P / (x k - x j) := by
intro j hj
have hne : x k - x j ≠ 0 := hxne k j (Ne.symm (Finset.ne_of_mem_erase hj))
rw [Finset.erase_right_comm, eq_div_iff hne, mul_comm, hP, Finset.mul_prod_erase S (fun i => x k - x i) hj]
have hb : ∀ l ∈ S, ∏ i ∈ S.erase l, (x k - x i) = P / (x k - x l) := by
intro l hl
have hne : x k - x l ≠ 0 := hxne k l (Ne.symm (Finset.ne_of_mem_erase hl))
rw [eq_div_iff hne, mul_comm, hP, Finset.mul_prod_erase S (fun i => x k - x i) hl]
have hc : ∀ K ∈ T, ∏ a ∈ T.erase K, (x k - 2 ^ a) = N.eval (x k) / (x k - 2 ^ K) := by
intro K hK
have hKn : n < K := (Finset.mem_Ioc.mp hK).1
have hne : x k - 2 ^ K ≠ 0 := hxne k K (by omega)
rw [eq_div_iff hne, mul_comm, hNk', Finset.mul_prod_erase T (fun a => x k - 2 ^ a) hK]
rw [← hS] at hD
rw [hD2, Finset.sum_congr rfl hc] at hD
have hD3 : ∑ j ∈ S, Qc n j * 2 ^ j * ∏ i ∈ ((Finset.range (n + 1)).erase j).erase k, (x k - x i) =
∑ j ∈ S, Qc n j * 2 ^ j * (P / (x k - x j)) :=
Finset.sum_congr rfl (fun j hj => by rw [ha j hj])
have hD4 : ∑ l ∈ S, ∏ i ∈ S.erase l, (x k - x i) = ∑ l ∈ S, P / (x k - x l) :=
Finset.sum_congr rfl hb
rw [hD3, hD4, hNk] at hD
-- key: sum over S of r_j / (x k - x j) = r_k * beta
have key : ∑ j ∈ S, (Qc n j * 2 ^ j) / (x k - x j) =
(Qc n k * 2 ^ k) * (∑ K ∈ T, 1 / (x k - 2 ^ K) - ∑ i ∈ S, 1 / (x k - x i)) := by
have e1 : ∑ K ∈ T, Qc n k * 2 ^ k * P / (x k - 2 ^ K) = P * ((Qc n k * 2 ^ k) * ∑ K ∈ T, 1 / (x k - 2 ^ K)) := by
rw [Finset.mul_sum, Finset.mul_sum]; refine Finset.sum_congr rfl (fun K _ => by ring)
have e2 : ∑ j ∈ S, Qc n j * 2 ^ j * (P / (x k - x j)) = P * ∑ j ∈ S, (Qc n j * 2 ^ j) / (x k - x j) := by
rw [Finset.mul_sum]; refine Finset.sum_congr rfl (fun j _ => by ring)
have e3 : ∑ l ∈ S, P / (x k - x l) = P * ∑ i ∈ S, 1 / (x k - x i) := by
rw [Finset.mul_sum]; refine Finset.sum_congr rfl (fun j _ => by ring)
rw [e1, e2, e3] at hD
apply mul_left_cancel₀ hPne
linear_combination -hD
-- split S into range k and Ioc k n
have hsplit : S = Finset.range k ∪ Finset.Ioc k n := by
rw [hS]; ext x; simp only [Finset.mem_erase, Finset.mem_range, Finset.mem_union, Finset.mem_Ioc]; omega
have hdisj : Disjoint (Finset.range k) (Finset.Ioc k n) := by
rw [Finset.disjoint_left]; intro a ha ha'
simp only [Finset.mem_range, Finset.mem_Ioc] at ha ha'; omega
rw [hsplit, Finset.sum_union hdisj] at key
have hlow : ∀ j ∈ Finset.range k, (Qc n j * 2 ^ j) / (x k - x j) = Qc n j / ((2 : ℚ) ^ (k - j) - 1) := by
intro j hj
have hjk : j < k := Finset.mem_range.mp hj
have hne : (2 : ℚ) ^ (k - j) - 1 ≠ 0 := by
have : (1 : ℚ) < 2 ^ (k - j) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hne2 : (2 : ℚ) ^ k - 2 ^ j ≠ 0 := hxne k j (by omega)
simp only [hxdef]
rw [div_eq_div_iff hne2 hne, show k = j + (k - j) by omega, pow_add]
simp only [show j + (k - j) - j = k - j by omega]
ring
have hhigh : ∀ j ∈ Finset.Ioc k n, (Qc n j * 2 ^ j) / (x k - x j) = Qc n j * 2 ^ (j - k) / (1 - 2 ^ (j - k)) := by
intro j hj
have hkj : k < j := (Finset.mem_Ioc.mp hj).1
have hne : (1 : ℚ) - 2 ^ (j - k) ≠ 0 := by
have : (1 : ℚ) < 2 ^ (j - k) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hne2 : (2 : ℚ) ^ k - 2 ^ j ≠ 0 := hxne k j (by omega)
simp only [hxdef]
rw [div_eq_div_iff hne2 hne, show j = k + (j - k) by omega, pow_add]
simp only [show k + (j - k) - k = j - k by omega]
ring
rw [Finset.sum_congr rfl hlow, Finset.sum_congr rfl hhigh] at key
rw [Finset.sum_range_succ, Nat.sub_self, pow_zero, sub_self, div_zero, add_zero]
simp only [hxdef] at key
rw [← hsplit] at key
linear_combination key
have hform : ∀ (Qc : ℕ → ℕ → ℚ),
(Qc = fun (n k : ℕ) =>
((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) →
∀ (n k : ℕ), k ≤ n →
∑ j ∈ Finset.range (k + 1), Qc n j / ((2 : ℚ) ^ (k - j) - 1) =
Qc n k * 2 ^ k * (∑ K ∈ Finset.Ioc n (2 * n), 1 / ((2 : ℚ) ^ k - 2 ^ K) -
∑ i ∈ (Finset.range (n + 1)).erase k, 1 / ((2 : ℚ) ^ k - 2 ^ i)) -
∑ j ∈ Finset.Ioc k n, Qc n j * 2 ^ (j - k) / (1 - 2 ^ (j - k)) := by
intro Qc hQc n k hk
exact formula3 n k hk Qc (fun j hj => by subst hQc; exact id1_full n j hj)
clear id1_test lower_test upper_test rhs_test id1_full lagr_eval deriv_prod_eval deriv_prod_eval_node lagr_deriv formula3
have gauss : ∀ n k : ℕ,
∃ z : ℤ, (z : ℚ) = ∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1) := by
intro n k
have hD : ∀ j : ℕ, ((2 : ℚ) ^ (j + 1) - 1) ≠ 0 := by
intro j
have h1 : (1 : ℚ) < 2 ^ (j + 1) := one_lt_pow₀ (by norm_num) (by omega)
exact ne_of_gt (sub_pos.mpr h1)
have hDk : ∀ k : ℕ, (∏ i ∈ Finset.range k, ((2 : ℚ) ^ (i + 1) - 1)) ≠ 0 := by
intro k
exact Finset.prod_ne_zero_iff.mpr (fun i _ => hD i)
have key : ∀ m j : ℕ,
(∏ i ∈ Finset.range (j + 1), ((2 : ℚ) ^ (m + 1 - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1)) =
(∏ i ∈ Finset.range j, ((2 : ℚ) ^ (m - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1)) +
2 ^ (j + 1) *
∏ i ∈ Finset.range (j + 1), ((2 : ℚ) ^ (m - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1) := by
intro m j
simp only [Finset.prod_div_distrib]
rw [Finset.prod_range_succ' (fun i => (2 : ℚ) ^ (m + 1 - i) - 1)]
have hshift : ∀ i : ℕ, m + 1 - (i + 1) = m - i := fun i => by omega
simp only [hshift, Nat.sub_zero]
rw [Finset.prod_range_succ (fun i => (2 : ℚ) ^ (m - i) - 1),
Finset.prod_range_succ (fun i => (2 : ℚ) ^ (i + 1) - 1)]
have hDj := hDk j
have hj := hD j
by_cases hjm : j ≤ m
· have e : (2 : ℚ) ^ (m + 1) = 2 ^ (m - j) * 2 ^ (j + 1) := by
rw [← pow_add]
congr 1
omega
rw [e]
field_simp
ring
· have hz : (∏ i ∈ Finset.range j, ((2 : ℚ) ^ (m - i) - 1)) = 0 :=
Finset.prod_eq_zero (i := m) (Finset.mem_range.mpr (by omega)) (by simp)
rw [hz]
simp
have main : ∀ m j : ℕ, ∃ z : ℤ,
(z : ℚ) = ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (m - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1) := by
intro m
induction m with
| zero =>
intro j
cases j with
| zero => exact ⟨1, by simp⟩
| succ j =>
refine ⟨0, ?_⟩
rw [Finset.prod_eq_zero (i := 0) (by simp) (by simp)]
simp
| succ m ih =>
intro j
cases j with
| zero => exact ⟨1, by simp⟩
| succ j =>
obtain ⟨a, ha⟩ := ih j
obtain ⟨b, hb⟩ := ih (j + 1)
refine ⟨a + 2 ^ (j + 1) * b, ?_⟩
rw [key, ← ha, ← hb]
push_cast
ring
exact main n k
have hodd : ∀ (n k : ℕ), k ≤ n → ∀ (c : ℕ → ℤ),
∃ z : ℤ, (z : ℚ) = (∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℚ) ^ m - 1)) *
∑ j ∈ Finset.range (k + 1), (c j : ℚ) / ((2 : ℚ) ^ (k - j) - 1) := by
intro n k hk c
have hint : ∀ j ∈ Finset.range (k + 1), ∃ z : ℤ,
(z : ℚ) = (∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℚ) ^ m - 1)) *
((c j : ℚ) / ((2 : ℚ) ^ (k - j) - 1)) := by
intro j hj
have hjk : j ≤ k := Nat.lt_succ_iff.mp (Finset.mem_range.mp hj)
by_cases hjeq : j = k
· subst hjeq
exact ⟨0, by simp⟩
· obtain ⟨d, hd⟩ : ∃ d, k - j = d + 1 := ⟨k - j - 1, by omega⟩
rw [hd]
have hdn : d + 1 ≤ n := by omega
have ht : 1 ≤ n / (d + 1) := (Nat.one_le_div_iff (by omega)).mpr hdn
have hP1 : (d + 1) * (n / (d + 1)) ≤ n := Nat.mul_div_le n (d + 1)
have hP2 : n < (d + 1) * (n / (d + 1)) + (d + 1) := by
have := Nat.lt_mul_div_succ n (show 0 < d + 1 by omega)
rw [Nat.mul_succ] at this
exact this
have hP3 : (d + 1) ≤ (d + 1) * (n / (d + 1)) := Nat.le_mul_of_pos_right _ ht
have hmem : (d + 1) * (n / (d + 1)) ∈ Finset.Ioc (n / 2) n := by
rw [Finset.mem_Ioc]
generalize (d + 1) * (n / (d + 1)) = P at hP1 hP2 hP3 ⊢
omega
have hdvd : ((2 : ℤ) ^ (d + 1) - 1) ∣ ∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℤ) ^ m - 1) := by
refine dvd_trans ?_ (Finset.dvd_prod_of_mem _ hmem)
have := sub_dvd_pow_sub_pow ((2 : ℤ) ^ (d + 1)) 1 (n / (d + 1))
rw [one_pow, ← pow_mul] at this
exact this
obtain ⟨q, hq⟩ := hdvd
have hne : ((2 : ℚ) ^ (d + 1) - 1) ≠ 0 := by
have : (1 : ℚ) < 2 ^ (d + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
refine ⟨c j * q, ?_⟩
have hcast : (∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℚ) ^ m - 1)) =
(((2 : ℤ) ^ (d + 1) - 1 : ℤ) : ℚ) * (q : ℚ) := by
rw [← Int.cast_mul, ← hq]
push_cast
rfl
rw [hcast]
push_cast
field_simp
choose! g hg using hint
refine ⟨∑ j ∈ Finset.range (k + 1), g j, ?_⟩
push_cast
rw [Finset.mul_sum]
exact Finset.sum_congr rfl hg
have combine : ∀ (p M : ℚ) (a : ℕ) (Ω A B m : ℤ), Odd Ω →
(Ω : ℚ) * p = 2 ^ a * A → (B : ℚ) = M * p → (m : ℚ) = M →
∃ z : ℤ, (z : ℚ) * 2 ^ a = M * p := by
intro p M a Ω A B m hΩ h1 h2 hm
have hint : Ω * B = 2 ^ a * (m * A) := by
have : ((Ω * B : ℤ) : ℚ) = ((2 ^ a * (m * A) : ℤ) : ℚ) := by
push_cast
rw [h2, ← hm]
linear_combination (m : ℚ) * h1
exact_mod_cast this
obtain ⟨t, ht⟩ := hΩ
have hcop : IsCoprime ((2 : ℤ) ^ a) Ω := by
apply IsCoprime.pow_left
exact ⟨-t, 1, by rw [ht]; ring⟩
have hdvd : (2 : ℤ) ^ a ∣ B * Ω := ⟨m * A, by rw [mul_comm, hint]⟩
obtain ⟨c, hc⟩ := hcop.dvd_of_dvd_mul_right hdvd
refine ⟨c, ?_⟩
rw [← h2, hc]
push_cast
ring
have hcore : ∀ (Qc : ℕ → ℕ → ℚ),
(Qc = fun (n k : ℕ) =>
((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) →
∀ (n k : ℕ), k ≤ n →
∃ z : ℤ, (z : ℚ) * (2 : ℚ) ^ (k * (k - 1) / 2) =
(∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℚ) ^ m - 1)) *
∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ)) := by
intro Qc hQc n k hk
have hQcint : ∀ j : ℕ, ∃ g : ℤ, Qc n j = 2 ^ (j * (j - 1) / 2) * g := by
intro j
obtain ⟨a, ha⟩ := gauss n j
obtain ⟨b, hb⟩ := gauss (2 * n - j) n
refine ⟨(-1) ^ j * a * b, ?_⟩
rw [hQc]
simp only []
rw [← ha, ← hb]
push_cast
ring
choose g hg using hQcint
-- the odd product
have hΩdiv : ∀ s : ℕ, 1 ≤ s → s ≤ 2 * n → ∃ w : ℤ,
(w : ℚ) * ((2 : ℚ) ^ s - 1) = ((∏ t ∈ Finset.Icc 1 (2 * n), ((2 : ℤ) ^ t - 1) : ℤ) : ℚ) := by
intro s h1 h2
refine ⟨∏ t ∈ (Finset.Icc 1 (2 * n)).erase s, ((2 : ℤ) ^ t - 1), ?_⟩
rw [← Finset.prod_erase_mul _ _ (Finset.mem_Icc.mpr ⟨h1, h2⟩)]
push_cast
ring
have hΩodd : Odd (∏ t ∈ Finset.Icc 1 (2 * n), ((2 : ℤ) ^ t - 1)) := by
apply Finset.prod_induction _ (fun x : ℤ => Odd x)
· intro x y hx hy
exact hx.mul hy
· exact odd_one
· intro t ht
have ht1 : t ≠ 0 := by
have := (Finset.mem_Icc.mp ht).1
omega
exact Even.sub_odd ((Int.even_pow).mpr ⟨even_two, ht1⟩) odd_one
-- one term 2^a / (2^a - 2^b), times the odd product, is an integer
have key1 : ∀ a b : ℕ, a ≠ b → a ≤ 2 * n → b ≤ 2 * n → ∃ w : ℤ,
(w : ℚ) = ((∏ t ∈ Finset.Icc 1 (2 * n), ((2 : ℤ) ^ t - 1) : ℤ) : ℚ) * 2 ^ a * (1 / ((2 : ℚ) ^ a - 2 ^ b)) := by
intro a b hab ha hb
rcases Nat.lt_or_gt_of_ne hab with hlt | hgt
· obtain ⟨d, rfl⟩ := Nat.exists_eq_add_of_lt hlt
obtain ⟨w, hw⟩ := hΩdiv (d + 1) (by omega) (by omega)
refine ⟨-w, ?_⟩
have hne : (2 : ℚ) ^ (d + 1) - 1 ≠ 0 := by
have : (1 : ℚ) < 2 ^ (d + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have h2a : (2 : ℚ) ^ a ≠ 0 := by positivity
rw [← hw, show a + d + 1 = a + (d + 1) by ring, show (2 : ℚ) ^ (a + (d + 1)) = 2 ^ a * 2 ^ (d + 1) from pow_add _ _ _]
have : (2 : ℚ) ^ a - 2 ^ a * 2 ^ (d + 1) = -(2 ^ a * (2 ^ (d + 1) - 1)) := by ring
rw [this]
field_simp
push_cast
ring
· obtain ⟨d, rfl⟩ := Nat.exists_eq_add_of_lt hgt
obtain ⟨w, hw⟩ := hΩdiv (d + 1) (by omega) (by omega)
refine ⟨w * 2 ^ (d + 1), ?_⟩
have hne : (2 : ℚ) ^ (d + 1) - 1 ≠ 0 := by
have : (1 : ℚ) < 2 ^ (d + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have h2b : (2 : ℚ) ^ b ≠ 0 := by positivity
rw [← hw, show b + d + 1 = b + (d + 1) by ring, show (2 : ℚ) ^ (b + (d + 1)) = 2 ^ b * 2 ^ (d + 1) from pow_add _ _ _]
have : (2 : ℚ) ^ b * 2 ^ (d + 1) - 2 ^ b = 2 ^ b * (2 ^ (d + 1) - 1) := by ring
rw [this]
field_simp
push_cast
ring
set Ω : ℤ := ∏ t ∈ Finset.Icc 1 (2 * n), ((2 : ℤ) ^ t - 1) with hΩ
have hK : ∀ K ∈ Finset.Ioc n (2 * n), ∃ w : ℤ,
(w : ℚ) = (Ω : ℚ) * 2 ^ k * (1 / ((2 : ℚ) ^ k - 2 ^ K)) := by
intro K hK'
have := Finset.mem_Ioc.mp hK'
exact key1 k K (by omega) (by omega) (by omega)
have hI : ∀ i ∈ (Finset.range (n + 1)).erase k, ∃ w : ℤ,
(w : ℚ) = (Ω : ℚ) * 2 ^ k * (1 / ((2 : ℚ) ^ k - 2 ^ i)) := by
intro i hi
have h1 := Finset.ne_of_mem_erase hi
have h2 := Finset.mem_range.mp (Finset.mem_of_mem_erase hi)
exact key1 k i (Ne.symm h1) (by omega) (by omega)
have hT : ∀ j ∈ Finset.Ioc k n, ∃ w : ℤ,
(w : ℚ) * 2 ^ (k * (k - 1) / 2) = (Ω : ℚ) * (Qc n j * 2 ^ (j - k) / (1 - 2 ^ (j - k))) := by
intro j hj
have hj' := Finset.mem_Ioc.mp hj
obtain ⟨d, hd⟩ : ∃ d, j - k = d + 1 := ⟨j - k - 1, by omega⟩
obtain ⟨w, hw⟩ := hΩdiv (d + 1) (by omega) (by omega)
have hmono : k * (k - 1) / 2 ≤ j * (j - 1) / 2 :=
Nat.div_le_div_right (Nat.mul_le_mul (by omega) (by omega))
obtain ⟨e, he⟩ := Nat.exists_eq_add_of_le hmono
refine ⟨-(w * g j * 2 ^ e * 2 ^ (d + 1)), ?_⟩
have hne : (2 : ℚ) ^ (d + 1) - 1 ≠ 0 := by
have : (1 : ℚ) < 2 ^ (d + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hne' : (1 : ℚ) - 2 ^ (d + 1) ≠ 0 := by
intro h
apply hne
linarith
rw [hd, hg j, he, ← hw, show (2 : ℚ) ^ (k * (k - 1) / 2 + e) = 2 ^ (k * (k - 1) / 2) * 2 ^ e from pow_add _ _ _]
field_simp
push_cast
ring
choose! fK hfK using hK
choose! fI hfI using hI
choose! fT hfT using hT
have h2adic : (Ω : ℚ) * ∑ j ∈ Finset.range (k + 1), Qc n j / ((2 : ℚ) ^ (k - j) - 1) =
2 ^ (k * (k - 1) / 2) * ((g k * (∑ K ∈ Finset.Ioc n (2 * n), fK K -
∑ i ∈ (Finset.range (n + 1)).erase k, fI i) - ∑ j ∈ Finset.Ioc k n, fT j : ℤ) : ℚ) := by
rw [hform Qc hQc n k hk]
push_cast
rw [Finset.sum_congr rfl hfK, Finset.sum_congr rfl hfI, ← Finset.mul_sum, ← Finset.mul_sum]
have htail : (2 : ℚ) ^ (k * (k - 1) / 2) * ∑ j ∈ Finset.Ioc k n, (fT j : ℚ) =
(Ω : ℚ) * ∑ j ∈ Finset.Ioc k n, Qc n j * 2 ^ (j - k) / (1 - 2 ^ (j - k)) := by
rw [Finset.mul_sum, Finset.mul_sum]
refine Finset.sum_congr rfl (fun j hj => ?_)
rw [mul_comm]
exact hfT j hj
rw [hg k]
simp only [one_div] at htail ⊢
linear_combination htail
-- the odd half
obtain ⟨B, hB⟩ := hodd n k hk (fun j => 2 ^ (j * (j - 1) / 2) * g j)
have hB' : (B : ℚ) = (∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℚ) ^ m - 1)) *
∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ)) := by
rw [hB]
congr 1
refine Finset.sum_congr rfl (fun j _ => ?_)
rw [hg j]
push_cast
ring
exact combine _ _ _ Ω _ B (∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℤ) ^ m - 1)) hΩodd h2adic hB'
(by push_cast; rfl)
clear hform hodd combine
have hcnall : ∀ n : ℕ, ∃ z : ℤ, (z : ℚ) = (∏ j ∈ Finset.Ico 2 n, ((2 : ℚ) ^ (j + 1) - 3)) *
∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + 1) - 3) := by
intro n
have hint : ∀ j ∈ Finset.range n, ∃ z : ℤ,
(z : ℚ) = (∏ i ∈ Finset.Ico 2 n, ((2 : ℚ) ^ (i + 1) - 3)) * ((3 : ℚ) / ((2 : ℚ) ^ (j + 1) - 3)) := by
intro j hj
by_cases h2 : j < 2
· have hj' : j = 0 ∨ j = 1 := by omega
rcases hj' with rfl | rfl
· refine ⟨-3 * ∏ i ∈ Finset.Ico 2 n, ((2 : ℤ) ^ (i + 1) - 3), ?_⟩
have e : (3 : ℚ) / ((2 : ℚ) ^ (0 + 1) - 3) = -3 := by norm_num
rw [e]
push_cast
ring
· refine ⟨3 * ∏ i ∈ Finset.Ico 2 n, ((2 : ℤ) ^ (i + 1) - 3), ?_⟩
have e : (3 : ℚ) / ((2 : ℚ) ^ (1 + 1) - 3) = 3 := by norm_num
rw [e]
push_cast
ring
· have hmem : j ∈ Finset.Ico 2 n := Finset.mem_Ico.mpr ⟨by omega, Finset.mem_range.mp hj⟩
have hne : ((2 : ℚ) ^ (j + 1) - 3) ≠ 0 := by
have h8 : (8 : ℚ) ≤ 2 ^ (j + 1) := by
calc (8 : ℚ) = 2 ^ 3 := by norm_num
_ ≤ 2 ^ (j + 1) := pow_le_pow_right₀ (by norm_num) (by omega)
linarith
refine ⟨3 * ∏ i ∈ (Finset.Ico 2 n).erase j, ((2 : ℤ) ^ (i + 1) - 3), ?_⟩
rw [← Finset.mul_prod_erase _ _ hmem]
push_cast
field_simp
choose! g hg using hint
refine ⟨∑ j ∈ Finset.range n, g j, ?_⟩
push_cast
rw [Finset.mul_sum]
exact Finset.sum_congr rfl hg
intro Qc hQc Qx hQx Aq hAq n
have hb :
((2 ^ (n * (n + 1) / 2) * (if n = 5 then 409045 else if n = 7 then 1298717875 else
(∏ m ∈ Finset.Ioc (n / 2) n, (2 ^ m - 1)) * ∏ j ∈ Finset.Ico 2 n, (2 ^ (j + 1) - 3) : ℕ) : ℕ) : ℝ) ^ 2 ≤
(2 : ℝ) ^ (3 * n * n) := by
have key : (2 ^ (n * (n + 1) / 2) * (if n = 5 then 409045 else if n = 7 then 1298717875 else
(∏ m ∈ Finset.Ioc (n / 2) n, (2 ^ m - 1)) * ∏ j ∈ Finset.Ico 2 n, (2 ^ (j + 1) - 3) : ℕ)) ^ 2 ≤
2 ^ (3 * n * n) := by
rcases (show n ≤ 9 ∨ 10 ≤ n by omega) with hn | hn
· revert n
decide +kernel
· rw [if_neg (by omega), if_neg (by omega)]
have hP1 : ∏ m ∈ Finset.Ioc (n / 2) n, (2 ^ m - 1) ≤ 2 ^ (∑ m ∈ Finset.Ioc (n / 2) n, m) := by
rw [← Finset.prod_pow_eq_pow_sum]
exact Finset.prod_le_prod' (fun m _ => Nat.sub_le _ _)
have hP2 : ∏ j ∈ Finset.Ico 2 n, (2 ^ (j + 1) - 3) ≤ 2 ^ (∑ j ∈ Finset.Ico 2 n, (j + 1)) := by
rw [← Finset.prod_pow_eq_pow_sum]
exact Finset.prod_le_prod' (fun m _ => Nat.sub_le _ _)
obtain ⟨c, hc⟩ : ∃ c, n = n / 2 + c + 1 := ⟨n - n / 2 - 1, by omega⟩
obtain ⟨d, hd⟩ : ∃ d, n = d + 3 := ⟨n - 3, by omega⟩
have hS1 : (∑ m ∈ Finset.Ioc (n / 2) n, m) * 2 = 2 * (c + 1) * (n / 2 + 1) + (c + 1) * c := by
have e : Finset.Ioc (n / 2) n = Finset.Ico (n / 2 + 1) (n + 1) := by
ext x; simp only [Finset.mem_Ioc, Finset.mem_Ico]; omega
rw [e, Finset.sum_Ico_eq_sum_range, show n + 1 - (n / 2 + 1) = c + 1 by omega,
Finset.sum_add_distrib, Finset.sum_const, Finset.card_range, smul_eq_mul, add_mul,
Finset.sum_range_id_mul_two]
simp only [Nat.add_sub_cancel]
ring
have hS2 : (∑ j ∈ Finset.Ico 2 n, (j + 1)) * 2 = 6 * (d + 1) + (d + 1) * d := by
rw [Finset.sum_Ico_eq_sum_range, show n - 2 = d + 1 by omega]
have : ∀ k ∈ Finset.range (d + 1), 2 + k + 1 = 3 + k := fun k _ => by omega
rw [Finset.sum_congr rfl this, Finset.sum_add_distrib, Finset.sum_const, Finset.card_range,
smul_eq_mul, add_mul, Finset.sum_range_id_mul_two]
simp only [Nat.add_sub_cancel]
ring
have hT : n * (n + 1) / 2 * 2 = n * (n + 1) :=
Nat.div_mul_cancel (Nat.even_mul_succ_self n).two_dvd
have hexp : 2 * (n * (n + 1) / 2) + 2 * (∑ m ∈ Finset.Ioc (n / 2) n, m) +
2 * (∑ j ∈ Finset.Ico 2 n, (j + 1)) ≤ 3 * n * n := by
have arith : ∀ e r A B T : ℕ, r ≤ 1 → 3 ≤ e →
A * 2 = 2 * (e + 1 + r + 1) * (e + 2 + 1) + (e + 1 + r + 1) * (e + 1 + r) →
B * 2 = 6 * (2 * e + 1 + r + 1) + (2 * e + 1 + r + 1) * (2 * e + 1 + r) →
T * 2 = (2 * e + 4 + r) * (2 * e + 4 + r + 1) →
2 * T + 2 * A + 2 * B ≤ 3 * (2 * e + 4 + r) * (2 * e + 4 + r) := by
intro e r A B T hr he hA hB hT
have hsq : 3 * e ≤ e * e := Nat.mul_le_mul_right e he
rcases (show r = 0 ∨ r = 1 by omega) with rfl | rfl
· ring_nf at hA hB hT hsq ⊢
omega
· ring_nf at hA hB hT hsq ⊢
omega
obtain ⟨e, he⟩ : ∃ e, n / 2 = e + 2 := ⟨n / 2 - 2, by omega⟩
obtain ⟨r, hr1, hr⟩ : ∃ r, r ≤ 1 ∧ n = 2 * e + 4 + r := ⟨n - (2 * e + 4), by omega, by omega⟩
have hc' : c = e + 1 + r := by omega
have hd' : d = 2 * e + 1 + r := by omega
rw [he, hc'] at hS1
rw [hd'] at hS2
have hT' : n * (n + 1) / 2 * 2 = (2 * e + 4 + r) * (2 * e + 4 + r + 1) := by rw [hT, hr]
have := arith e r _ _ _ hr1 (by omega) hS1 hS2 hT'
rw [he]
rw [hr] at this ⊢
exact this
calc (2 ^ (n * (n + 1) / 2) * ((∏ m ∈ Finset.Ioc (n / 2) n, (2 ^ m - 1)) *
∏ j ∈ Finset.Ico 2 n, (2 ^ (j + 1) - 3))) ^ 2
≤ (2 ^ (n * (n + 1) / 2) * (2 ^ (∑ m ∈ Finset.Ioc (n / 2) n, m) *
2 ^ (∑ j ∈ Finset.Ico 2 n, (j + 1)))) ^ 2 := by gcongr
_ = 2 ^ (2 * (n * (n + 1) / 2) + 2 * (∑ m ∈ Finset.Ioc (n / 2) n, m) +
2 * (∑ j ∈ Finset.Ico 2 n, (j + 1))) := by
rw [← pow_add, ← pow_add, ← pow_mul]; congr 1; ring
_ ≤ 2 ^ (3 * n * n) := Nat.pow_le_pow_right (by norm_num) hexp
exact_mod_cast key
have hqx : ∃ z : ℤ, (z : ℚ) = (2 : ℚ) ^ (n * (n + 1) / 2) *
∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k := by
have hterm : ∀ k ∈ Finset.range (n + 1), ∃ z : ℤ,
(z : ℚ) = (2 : ℚ) ^ (n * (n + 1) / 2) * (Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) := by
intro k hk
have hkn : k ≤ n := Nat.lt_succ_iff.mp (Finset.mem_range.mp hk)
obtain ⟨a, ha⟩ := gauss n k
obtain ⟨b, hb⟩ := gauss (2 * n - k) n
obtain ⟨m, rfl⟩ := Nat.exists_eq_add_of_le hkn
have hexp : (k + m) * (k + m + 1) / 2 + k * (k - 1) / 2 = m * (m + 1) / 2 + (k + m) * k := by
have e1 : 2 * ((k + m) * (k + m + 1) / 2) = (k + m) * (k + m + 1) :=
Nat.two_mul_div_two_of_even (Nat.even_mul_succ_self _)
have e2 : 2 * (k * (k - 1) / 2) = k * (k - 1) :=
Nat.two_mul_div_two_of_even (Nat.even_mul_pred_self _)
have e3 : 2 * (m * (m + 1) / 2) = m * (m + 1) :=
Nat.two_mul_div_two_of_even (Nat.even_mul_succ_self _)
rcases k with _ | j
· simp
· simp only [Nat.add_sub_cancel] at e2 ⊢
ring_nf at e1 e2 e3 ⊢
omega
refine ⟨(-1) ^ k * 3 ^ k * 2 ^ (m * (m + 1) / 2) * a * b, ?_⟩
have hpow : (2 : ℚ) ^ ((k + m) * (k + m + 1) / 2) * (2 : ℚ) ^ (k * (k - 1) / 2) =
(2 : ℚ) ^ (m * (m + 1) / 2) * ((2 : ℚ) ^ (k + m)) ^ k := by
rw [← pow_add, ← pow_mul, ← pow_add, hexp]
have h2 : ((2 : ℚ) ^ (k + m)) ≠ 0 := by positivity
rw [hQc]
simp only []
rw [← ha, ← hb]
push_cast
rw [div_pow, mul_div_assoc']
field_simp
linear_combination -(a : ℚ) * b * hpow
choose! g hg using hterm
refine ⟨∑ k ∈ Finset.range (n + 1), g k, ?_⟩
push_cast
rw [Finset.mul_sum]
exact Finset.sum_congr rfl (fun k hk => hg k hk)
have hE : 0 < (if n = 5 then 409045 else if n = 7 then 1298717875 else
(∏ m ∈ Finset.Ioc (n / 2) n, (2 ^ m - 1)) * ∏ j ∈ Finset.Ico 2 n, (2 ^ (j + 1) - 3) : ℕ) := by
split_ifs
· norm_num
· norm_num
· refine Nat.mul_pos (Finset.prod_pos fun m hm => ?_) (Finset.prod_pos fun j hj => ?_)
· have hm1 : 1 ≤ m := by
have := (Finset.mem_Ioc.mp hm).1
omega
have : 2 ≤ 2 ^ m := by
calc 2 = 2 ^ 1 := by norm_num
_ ≤ 2 ^ m := Nat.pow_le_pow_right (by norm_num) hm1
omega
· have hj2 : 2 ≤ j := (Finset.mem_Ico.mp hj).1
have : 8 ≤ 2 ^ (j + 1) := by
calc 8 = 2 ^ 3 := by norm_num
_ ≤ 2 ^ (j + 1) := Nat.pow_le_pow_right (by norm_num) (by omega)
omega
have hAqint : ∃ z : ℤ, (z : ℚ) = ((2 ^ (n * (n + 1) / 2) * (if n = 5 then 409045 else if n = 7 then 1298717875 else
(∏ m ∈ Finset.Ioc (n / 2) n, (2 ^ m - 1)) * ∏ j ∈ Finset.Ico 2 n, (2 ^ (j + 1) - 3) : ℕ) : ℕ) : ℚ) * Aq n := by
by_cases h5 : n = 5
· subst h5
refine ⟨1380067124193819576, ?_⟩
rw [if_pos rfl]
subst hQc hQx hAq
decide +kernel
· by_cases h7 : n = 7
· subst h7
refine ⟨674036225808261890798679141926088, ?_⟩
rw [if_neg (by norm_num), if_pos rfl]
subst hQc hQx hAq
decide +kernel
· rw [if_neg h5, if_neg h7]
have hM : ((∏ m ∈ Finset.Ioc (n / 2) n, (2 ^ m - 1) : ℕ) : ℚ) =
∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℚ) ^ m - 1) := by
rw [Nat.cast_prod]
refine Finset.prod_congr rfl (fun m _ => ?_)
rw [Nat.cast_sub Nat.one_le_two_pow]
push_cast
ring
have hC : ((∏ j ∈ Finset.Ico 2 n, (2 ^ (j + 1) - 3) : ℕ) : ℚ) =
∏ j ∈ Finset.Ico 2 n, ((2 : ℚ) ^ (j + 1) - 3) := by
rw [Nat.cast_prod]
refine Finset.prod_congr rfl (fun j hj => ?_)
have hj2 : 2 ≤ j := (Finset.mem_Ico.mp hj).1
have h3 : 3 ≤ 2 ^ (j + 1) := by
calc 3 ≤ 2 ^ 2 := by norm_num
_ ≤ 2 ^ (j + 1) := Nat.pow_le_pow_right (by norm_num) (by omega)
rw [Nat.cast_sub h3]
push_cast
ring
have hd : ((2 ^ (n * (n + 1) / 2) * ((∏ m ∈ Finset.Ioc (n / 2) n, (2 ^ m - 1)) *
∏ j ∈ Finset.Ico 2 n, (2 ^ (j + 1) - 3)) : ℕ) : ℚ) =
(2 : ℚ) ^ (n * (n + 1) / 2) * ((∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℚ) ^ m - 1)) *
∏ j ∈ Finset.Ico 2 n, ((2 : ℚ) ^ (j + 1) - 3)) := by
rw [Nat.cast_mul, Nat.cast_mul, hM, hC]
push_cast
ring
obtain ⟨zcn, hzcn⟩ := hcnall n
obtain ⟨zq', hzq'⟩ := hqx
have hQxn : Qx n = ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k := by
rw [hQx]
have hterm : ∀ k ∈ Finset.range (n + 1), ∃ z : ℤ,
(z : ℚ) = (2 : ℚ) ^ (n * (n + 1) / 2) * ((∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℚ) ^ m - 1)) *
∏ j ∈ Finset.Ico 2 n, ((2 : ℚ) ^ (j + 1) - 3)) *
((∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) *
((3 : ℚ) / (2 : ℚ) ^ n) ^ k) := by
intro k hk
have hkn : k ≤ n := Nat.lt_succ_iff.mp (Finset.mem_range.mp hk)
obtain ⟨w, hw⟩ := hcore Qc hQc n k hkn
obtain ⟨m, hm⟩ := Nat.exists_eq_add_of_le hkn
have hexp : n * (n + 1) / 2 + k * (k - 1) / 2 = m * (m + 1) / 2 + n * k := by
rw [hm]
have e1 : 2 * ((k + m) * (k + m + 1) / 2) = (k + m) * (k + m + 1) :=
Nat.two_mul_div_two_of_even (Nat.even_mul_succ_self _)
have e2 : 2 * (k * (k - 1) / 2) = k * (k - 1) :=
Nat.two_mul_div_two_of_even (Nat.even_mul_pred_self _)
have e3 : 2 * (m * (m + 1) / 2) = m * (m + 1) :=
Nat.two_mul_div_two_of_even (Nat.even_mul_succ_self _)
rcases k with _ | j
· simp
· simp only [Nat.add_sub_cancel] at e2 ⊢
ring_nf at e1 e2 e3 ⊢
omega
have hpow : (2 : ℚ) ^ (n * (n + 1) / 2) * (2 : ℚ) ^ (k * (k - 1) / 2) =
(2 : ℚ) ^ (m * (m + 1) / 2) * ((2 : ℚ) ^ n) ^ k := by
rw [← pow_add, ← pow_mul, ← pow_add, hexp]
have h2n : ((2 : ℚ) ^ n) ^ k ≠ 0 := by positivity
refine ⟨(∏ j ∈ Finset.Ico 2 n, ((2 : ℤ) ^ (j + 1) - 3)) * w * 3 ^ k * 2 ^ (m * (m + 1) / 2), ?_⟩
have e1 : (2 : ℚ) ^ (n * (n + 1) / 2) * ((∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℚ) ^ m - 1)) *
∏ j ∈ Finset.Ico 2 n, ((2 : ℚ) ^ (j + 1) - 3)) *
((∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) *
((3 : ℚ) / (2 : ℚ) ^ n) ^ k) =
(∏ j ∈ Finset.Ico 2 n, ((2 : ℚ) ^ (j + 1) - 3)) * 3 ^ k *
(((∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℚ) ^ m - 1)) *
∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) *
(2 : ℚ) ^ (n * (n + 1) / 2)) / ((2 : ℚ) ^ n) ^ k := by
rw [div_pow]
ring
rw [e1, ← hw, show (w : ℚ) * (2 : ℚ) ^ (k * (k - 1) / 2) * (2 : ℚ) ^ (n * (n + 1) / 2) =
(w : ℚ) * ((2 : ℚ) ^ (n * (n + 1) / 2) * (2 : ℚ) ^ (k * (k - 1) / 2)) by ring, hpow]
push_cast
field_simp
choose! g hg using hterm
refine ⟨∑ k ∈ Finset.range (n + 1), g k +
(∏ m ∈ Finset.Ioc (n / 2) n, ((2 : ℤ) ^ m - 1)) * zq' * zcn, ?_⟩
rw [hd, hAq]
beta_reduce
push_cast
rw [mul_add, Finset.mul_sum, Finset.sum_congr rfl hg, hzcn, hzq', ← hQxn]
ring
obtain ⟨zq, hzq⟩ := hqx
refine ⟨2 ^ (n * (n + 1) / 2) * (if n = 5 then 409045 else if n = 7 then 1298717875 else
(∏ m ∈ Finset.Ioc (n / 2) n, (2 ^ m - 1)) * ∏ j ∈ Finset.Ico 2 n, (2 ^ (j + 1) - 3) : ℕ), by positivity, hb, ⟨(if n = 5 then 409045 else if n = 7 then 1298717875 else
(∏ m ∈ Finset.Ioc (n / 2) n, (2 ^ m - 1)) * ∏ j ∈ Finset.Ico 2 n, (2 ^ (j + 1) - 3) : ℕ) * zq, ?_⟩, hAqint⟩
rw [hQx]
push_cast
rw [hzq]
ring
exact ⟨_, _, _, 0, rfl, rfl, rfl, H _ rfl _ rfl _ rfl⟩In words, unverified — what this witness says; written by t1006-w3, drafted with Claude Opus 5.5 (claude-opus-5-5) in a Claude Code agent session, 2026-10-06; no one has read it against the Lean and signed it.
Draft · drafted, by the model named above
This file states and proves a theorem named witness: there exist functions $Q_c:\mathbb N\times\mathbb N\to\mathbb Q$, $Q_x:\mathbb N\to\mathbb Q$, $A_q:\mathbb N\to\mathbb Q$ and a natural number $n$ such that all four hypotheses of the statement of this node hold, written exactly as there:
- $Q_c(n,k)=(-1)^k\,2^{k(k-1)/2}\prod_{i<k}\frac{2^{n-i}-1}{2^{i+1}-1}\prod_{i<n}\frac{2^{2n-k-i}-1}{2^{i+1}-1}$ for all $n,k$;
- $Q_x(n)=\sum_{k=0}^{n}Q_c(n,k)(3/2^n)^k$ for all $n$;
- $A_q(n)=\sum_{k=0}^{n}\big(\sum_{j=0}^{k}\frac{Q_c(n,j)}{2^{k-j}-1}\big)(3/2^n)^k+Q_x(n)\sum_{j<n}\frac{3}{2^{j+1}-3}$ for all $n$;
- for every $n$ there is a natural number $d>0$ with $d^2\le 2^{3n^2}$ such that $d\,Q_x(n)$ and $d\,A_q(n)$ are integers.
The existentially quantified $n$ appears in none of the four conditions. So the theorem says the hypotheses are not contradictory.
The first three conditions hold by definition (rfl) for the functions the formulas define. The fourth is a real theorem, and this file proves it in full: the step H is the statement of erdos-1050--h1-v2--h3, and its proof is the same tactic script, line for line apart from indentation, as that node's merged Proof.lean. The witness is then those three functions, $n=0$, and H applied to them.
Rendered from gloss/cb005d070c9d….md · Improve these words →
Annexes (3), in full
Untrusted contributor text — an annex (D-31): an informal argument, not a proof.
Untrusted: annex (D-31), by t0929-2, drafted with Claude Opus 5.5 via Claude Code; POST /check (AXLE lean-4.33.1), 2026-09-29T20:00:13Z, licence CC-BY-4.0. Rendered from targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/annex/b7ce465ec8dc9c8677118e56ea453c9bc67accbcc51e996be6347a1a6150fbd9.md.
A complete Lean proof of hrem (erdos-1050--h1-v2--h4), waiting for the node to open
Contributor: t0929-2. Status: the file below is a complete, sorry-free proof of this node's statement that passes the network's fast check in verify mode against this node (POST /check, lean-4.33.1, okay true, lint [], failed_declarations [], log 01M3QAAZ8GAJWZ9FY8R5VCE63K; axioms propext, Classical.choice, Quot.sound). It has not been through the gate: the node is blocked (witness-missing), so a precheck answers 409 node-blocked, and its witness is a proof of sibling h3 (see graph PR #229, a revision request to drop that unused hypothesis).
Structure (completes annex e484fc1b… on this node): the bound for n = 0, 1 directly from 0 < T ≤ 2/5; for n ≥ 2 the remainder is the series Σ_t E(n,t)·x_n^(2n+1+t) of positive terms with E(n,t) ≤ 2^(−(2n+t)). That series identity (hser) is proved from three haves: htail (3T − c_n = Σ_k x_n^k/(2^k − 1), a tail split and a geometric double series summed both ways), hcauchy (a polynomial times that series, coefficientwise) and hid, the coefficient identity, whose proof is the merged proof of spec-f2b55478 pasted verbatim (a hole cannot declare that node as a dependency). Unused hypotheses are cleared inside each have so that the declaration stays within the 200000-heartbeat cap; the fast check takes about 13 s. The same body, without the hden binder in the first intro and without the clear hden line, proves the statement with that hypothesis removed (proposed as spec-180d8b72, graph PR #274).
import Mathlib
import Nodes.«erdos-1050--h1-v2--h4».Context
/-! Hole `hrem` of a merged partial proof, as a node (D-12 #5, D-29).
Statement generated by the gate from the assembly; immutable (D-3). -/
theorem erdos_1050__h1_v2__h4 : ∀ (Qc : ℕ → ℕ → ℚ),
(Qc = fun (n k : ℕ) =>
((-1 : ℚ) ^ k * (2 : ℚ) ^ (k * (k - (1 : ℕ)) / (2 : ℕ)) *
∏ i ∈ Finset.range k, ((2 : ℚ) ^ (n - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) *
∏ i ∈ Finset.range n, ((2 : ℚ) ^ ((2 : ℕ) * n - k - i) - (1 : ℚ)) / ((2 : ℚ) ^ (i + (1 : ℕ)) - (1 : ℚ))) →
∀ (Qx : ℕ → ℚ),
(Qx = fun (n : ℕ) => ∑ k ∈ Finset.range (n + (1 : ℕ)), Qc n k * ((3 : ℚ) / (2 : ℚ) ^ n) ^ k) →
∀ (Aq : ℕ → ℚ),
(Aq = fun (n : ℕ) =>
∑ k ∈ Finset.range (n + (1 : ℕ)),
(∑ j ∈ Finset.range (k + (1 : ℕ)), Qc n j / ((2 : ℚ) ^ (k - j) - (1 : ℚ))) *
((3 : ℚ) / (2 : ℚ) ^ n) ^ k +
Qx n * ∑ j ∈ Finset.range n, (3 : ℚ) / ((2 : ℚ) ^ (j + (1 : ℕ)) - (3 : ℚ))) →
(∀ (n : ℕ),
∃ (d : ℕ),
(0 : ℕ) < d ∧
(↑d : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ ((3 : ℕ) * n * n) ∧
(∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Qx n) ∧ ∃ (z : ℤ), (↑z : ℚ) = (↑d : ℚ) * Aq n) →
∀ (n : ℕ),
(0 : ℝ) <
(↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) -
(↑(Aq n) : ℝ) ∧
((↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))) -
(↑(Aq n) : ℝ)) ^
(2 : ℕ) *
(2 : ℝ) ^ ((4 : ℕ) * n * n) ≤
(2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)) := by
intro Qc hQc Qx hQx Aq hAq hden
-- the remainder bound does not use the denominator bound: cleared before any hole is stated
clear hden
obtain ⟨T, hT⟩ : ∃ T : ℝ, T = ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ)) := ⟨_, rfl⟩
rw [← hT]
-- the terms of T are bounded by (1/5) (1/2)^m
have hterm : ∀ m : ℕ, 0 ≤ (1 : ℝ) / ((2 : ℝ) ^ (m + 3) - 3) ∧
(1 : ℝ) / ((2 : ℝ) ^ (m + 3) - 3) ≤ (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m := by
intro m
have h2 : (1 : ℝ) ≤ (2 : ℝ) ^ m := one_le_pow₀ (by norm_num)
have hpos : (0 : ℝ) < (2 : ℝ) ^ (m + 3) - 3 := by rw [pow_add]; nlinarith
refine ⟨div_nonneg zero_le_one hpos.le, ?_⟩
rw [div_le_iff₀ hpos]
have hh : (1 / 2 : ℝ) ^ m * (2 : ℝ) ^ m = 1 := by rw [← mul_pow]; norm_num
have hle : (1 / 2 : ℝ) ^ m ≤ 1 := pow_le_one₀ (by norm_num) (by norm_num)
rw [pow_add]
nlinarith
have hgeo : Summable (fun m : ℕ => (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m) :=
(summable_geometric_of_lt_one (by norm_num) (by norm_num)).mul_left _
have hsumm : Summable (fun m : ℕ => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) :=
Summable.of_nonneg_of_le (fun m => (hterm m).1) (fun m => (hterm m).2) hgeo
have hTpos : 0 < T := by
rw [hT]
exact hsumm.tsum_pos (fun m => (hterm m).1) 0 (by norm_num)
have hTle : T ≤ 2 / 5 := by
rw [hT]
calc ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))
≤ ∑' m : ℕ, (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m :=
Summable.tsum_le_tsum (fun m => (hterm m).2) hsumm hgeo
_ = 2 / 5 := by rw [tsum_mul_left, tsum_geometric_of_lt_one (by norm_num) (by norm_num)]; norm_num
-- the Padé remainder coefficients, in closed form (spec-f2b55478), shifted to start at x^(2n+1)
obtain ⟨E, hE⟩ : ∃ E : ℕ → ℕ → ℝ, E = fun n t =>
(2 : ℝ) ^ (n * n) * (∏ i ∈ Finset.range n, ((2 : ℝ) ^ (n + t - i) - 1)) /
∏ j ∈ Finset.range (n + 1), ((2 : ℝ) ^ (2 * n + 1 + t - j) - 1) := ⟨_, rfl⟩
have hEpos : ∀ n t : ℕ, 0 < E n t := by
intro n t
rw [hE]
apply div_pos
· apply mul_pos (by positivity)
apply Finset.prod_pos
intro i hi
simp only [Finset.mem_range] at hi
have : (1 : ℝ) < 2 ^ (n + t - i) := one_lt_pow₀ (by norm_num) (by omega)
linarith
· apply Finset.prod_pos
intro j hj
simp only [Finset.mem_range] at hj
have : (1 : ℝ) < 2 ^ (2 * n + 1 + t - j) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hEle : ∀ n t : ℕ, E n t ≤ (1 / 2 : ℝ) ^ (2 * n + t) := by
intro n t
rw [hE]
dsimp only
rw [Finset.prod_range_succ']
have hA : (0 : ℝ) < ∏ i ∈ Finset.range n, ((2 : ℝ) ^ (2 * n + 1 + t - (i + 1)) - 1) := by
apply Finset.prod_pos
intro i hi
simp only [Finset.mem_range] at hi
have : (1 : ℝ) < 2 ^ (2 * n + 1 + t - (i + 1)) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hnum : (2 : ℝ) ^ (n * n) * ∏ i ∈ Finset.range n, ((2 : ℝ) ^ (n + t - i) - 1) ≤
∏ i ∈ Finset.range n, ((2 : ℝ) ^ (2 * n + 1 + t - (i + 1)) - 1) := by
have hc : (2 : ℝ) ^ (n * n) * ∏ i ∈ Finset.range n, ((2 : ℝ) ^ (n + t - i) - 1) =
∏ i ∈ Finset.range n, ((2 : ℝ) ^ n * ((2 : ℝ) ^ (n + t - i) - 1)) := by
rw [Finset.prod_mul_distrib, Finset.prod_const, Finset.card_range, ← pow_mul]
rw [hc]
apply Finset.prod_le_prod
· intro i hi
simp only [Finset.mem_range] at hi
have : (1 : ℝ) ≤ 2 ^ (n + t - i) := one_le_pow₀ (by norm_num)
have : (0 : ℝ) < 2 ^ n := by positivity
nlinarith
· intro i hi
simp only [Finset.mem_range] at hi
have he : 2 * n + 1 + t - (i + 1) = n + (n + t - i) := by omega
rw [he, pow_add]
have : (1 : ℝ) ≤ 2 ^ n := one_le_pow₀ (by norm_num)
nlinarith
have hf0 : (2 : ℝ) ^ (2 * n + t) ≤ (2 : ℝ) ^ (2 * n + 1 + t - 0) - 1 := by
have he : 2 * n + 1 + t - 0 = (2 * n + t) + 1 := by omega
rw [he, pow_succ]
have : (1 : ℝ) ≤ 2 ^ (2 * n + t) := one_le_pow₀ (by norm_num)
linarith
have hp : (0 : ℝ) < 2 ^ (2 * n + t) := by positivity
rw [div_le_iff₀ (mul_pos hA (by linarith)), one_div_pow]
have hkey : (1 : ℝ) ≤ 1 / 2 ^ (2 * n + t) * ((2 : ℝ) ^ (2 * n + 1 + t - 0) - 1) := by
rw [div_mul_eq_mul_div, one_mul, le_div_iff₀ hp]; linarith
nlinarith
-- the tail of 3T as a power series in x_n = 3/2^n
have htail : ∀ n : ℕ, 1 ≤ n → HasSum (fun k : ℕ => ((3 : ℝ) / 2 ^ n) ^ k / ((2 : ℝ) ^ k - 1))
(3 * T - ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + 1) - 3)) := by
intro n hn
rw [hT]
clear hterm hgeo hsumm hTpos hTle hEpos hEle hE hT hAq hQx hQc
have h2n : (2 : ℝ) ≤ 2 ^ n := by
calc (2 : ℝ) = 2 ^ 1 := by norm_num
_ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn
set x : ℝ := (3 : ℝ) / 2 ^ n with hxdef
have hx0 : 0 < x := by positivity
have hx2 : x < 2 := by
rw [hxdef, div_lt_iff₀ (by positivity)]; nlinarith
-- the double family
set f : ℕ → ℕ → ℝ := fun j k => x ^ (k + 1) * ((1 : ℝ) / 2 ^ (j + 1)) ^ (k + 1) with hfdef
have hf0 : ∀ j k, 0 ≤ f j k := fun j k => by positivity
-- rows (fixed j): a geometric series
have hrow : ∀ j : ℕ, HasSum (f j) (3 / ((2 : ℝ) ^ (j + n + 1) - 3)) := by
intro j
have hr0 : 0 ≤ x * (1 / 2 ^ (j + 1)) := by positivity
have hr1 : x * (1 / 2 ^ (j + 1)) < 1 := by
have : (2 : ℝ) ≤ 2 ^ (j + 1) := by
calc (2 : ℝ) = 2 ^ 1 := by norm_num
_ ≤ 2 ^ (j + 1) := pow_le_pow_right₀ (by norm_num) (by omega)
rw [mul_one_div, div_lt_one (by positivity)]; linarith
have h := (hasSum_geometric_of_lt_one hr0 hr1).mul_left (x * (1 / 2 ^ (j + 1)))
have hpos : (0 : ℝ) < 2 ^ (j + n + 1) - 3 := by
have : (4 : ℝ) ≤ 2 ^ (j + n + 1) := by
calc (4 : ℝ) = 2 ^ 2 := by norm_num
_ ≤ 2 ^ (j + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega)
linarith
have e : (2 : ℝ) ^ (j + n + 1) = 2 ^ n * 2 ^ (j + 1) := by rw [← pow_add]; congr 1; omega
have hfun : f j = fun i => x * (1 / 2 ^ (j + 1)) * (x * (1 / 2 ^ (j + 1))) ^ i := by
funext k; simp only [hfdef]; rw [← mul_pow, pow_succ]; ring
have hval : 3 / ((2 : ℝ) ^ (j + n + 1) - 3) = x * (1 / 2 ^ (j + 1)) * (1 - x * (1 / 2 ^ (j + 1)))⁻¹ := by
rw [e] at hpos ⊢
have h1 : (1 : ℝ) - x * (1 / 2 ^ (j + 1)) ≠ 0 := by linarith
rw [hxdef] at h1 ⊢
field_simp
rw [hfun, hval]; exact h
-- columns (fixed k): a geometric series in j
have hcol : ∀ k : ℕ, HasSum (fun j => f j k) (x ^ (k + 1) / ((2 : ℝ) ^ (k + 1) - 1)) := by
intro k
have hq0 : (0 : ℝ) ≤ 1 / 2 ^ (k + 1) := by positivity
have hq1 : (1 : ℝ) / 2 ^ (k + 1) < 1 := by
rw [div_lt_one (by positivity)]; exact one_lt_pow₀ (by norm_num) (by omega)
have h := ((hasSum_geometric_of_lt_one hq0 hq1).mul_left (1 / 2 ^ (k + 1))).mul_left (x ^ (k + 1))
have hpos : (0 : ℝ) < 2 ^ (k + 1) - 1 := by
have : (1 : ℝ) < 2 ^ (k + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hfun : (fun j => f j k) = fun i => x ^ (k + 1) * (1 / 2 ^ (k + 1) * (1 / 2 ^ (k + 1)) ^ i) := by
funext j; simp only [hfdef]
rw [← one_div_pow, ← one_div_pow, ← pow_mul, ← pow_mul, ← pow_add]
congr 2; ring
have hval : x ^ (k + 1) / ((2 : ℝ) ^ (k + 1) - 1) =
x ^ (k + 1) * (1 / 2 ^ (k + 1) * (1 - 1 / 2 ^ (k + 1))⁻¹) := by
have h1 : (1 : ℝ) - 1 / 2 ^ (k + 1) ≠ 0 := by linarith
field_simp
rw [hfun, hval]; exact h
-- the double sum, both ways
have hsum2' : Summable (fun p : ℕ × ℕ => f p.1 p.2) := by
rw [summable_prod_of_nonneg (fun p => hf0 p.1 p.2)]
refine ⟨fun j => (hrow j).summable, ?_⟩
have hts : (fun j => ∑' k, f j k) = fun j => 3 / ((2 : ℝ) ^ (j + n + 1) - 3) :=
funext fun j => (hrow j).tsum_eq
show Summable (fun j => ∑' k, f j k)
rw [hts]
refine Summable.of_nonneg_of_le (fun j => ?_) (fun j => ?_) (summable_geometric_two.mul_left 3)
· have : (4 : ℝ) ≤ 2 ^ (j + n + 1) := by
calc (4 : ℝ) = 2 ^ 2 := by norm_num
_ ≤ 2 ^ (j + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega)
exact div_nonneg (by norm_num) (by linarith)
· have hj : (1 : ℝ) ≤ 2 ^ j := one_le_pow₀ (by norm_num)
have e : (2 : ℝ) ^ (j + n + 1) = 2 ^ j * 2 ^ (n + 1) := by rw [← pow_add]; ring_nf
have h4 : (4 : ℝ) ≤ 2 ^ (n + 1) := by
calc (4 : ℝ) = 2 ^ 2 := by norm_num
_ ≤ 2 ^ (n + 1) := pow_le_pow_right₀ (by norm_num) (by omega)
have hp : (0 : ℝ) < 2 ^ (j + n + 1) - 3 := by rw [e]; nlinarith
rw [div_le_iff₀ hp, one_div_pow, e]
have hh : (1 / 2 : ℝ) ^ j * 2 ^ j = 1 := by rw [← mul_pow]; norm_num
rw [one_div_pow] at hh
field_simp
nlinarith
have hsum2 : Summable (Function.uncurry f) := hsum2'
have hS := hsum2.hasSum
have hA := hS.prod_fiberwise (fun j => hrow j)
have hB := ((Equiv.prodComm ℕ ℕ).hasSum_iff.mpr hS).prod_fiberwise (fun k => hcol k)
-- the row sums are the tail of 3T
have hg : Summable (fun j : ℕ => (3 : ℝ) / ((2 : ℝ) ^ (j + 1) - 3)) :=
(summable_nat_add_iff n).mp hA.summable
have hsplit_n := hg.sum_add_tsum_nat_add n
have hsplit_2 := hg.sum_add_tsum_nat_add 2
have h01 : ∑ i ∈ Finset.range 2, (3 : ℝ) / ((2 : ℝ) ^ (i + 1) - 3) = 0 := by
norm_num [Finset.sum_range_succ]
have h3T : ∑' i : ℕ, (3 : ℝ) / ((2 : ℝ) ^ (i + 2 + 1) - 3) =
3 * ∑' m : ℕ, (1 : ℝ) / ((2 : ℝ) ^ (m + 3) - 3) := by
rw [← tsum_mul_left]
congr 1; funext i
rw [show i + 2 + 1 = i + 3 by ring]; ring
have hval : ∑' p, Function.uncurry f p = 3 * ∑' m : ℕ, (1 : ℝ) / ((2 : ℝ) ^ (m + 3) - 3) -
∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + 1) - 3) := by
rw [← hA.tsum_eq]
rw [h01, zero_add, h3T] at hsplit_2
linarith
have h0 : ∑ i ∈ Finset.range 1, x ^ i / ((2 : ℝ) ^ i - 1) = 0 := by simp
rw [← hval]
refine (hasSum_nat_add_iff' 1).mp ?_
rw [h0, sub_zero]
exact hB
-- a polynomial times that series
have hcauchy : ∀ (n : ℕ) (c : ℕ → ℝ) (x V : ℝ),
HasSum (fun k : ℕ => x ^ k / ((2 : ℝ) ^ k - 1)) V →
HasSum (fun m : ℕ => (∑ j ∈ Finset.range (n + 1), c j / ((2 : ℝ) ^ (m - j) - 1)) * x ^ m)
((∑ j ∈ Finset.range (n + 1), c j * x ^ j) * V) := by
intro n c x V hV
clear htail hterm hgeo hsumm hTpos hTle hEpos hEle hE hT hAq hQx hQc
have hj : ∀ j ∈ Finset.range (n + 1),
HasSum (fun m : ℕ => c j / ((2 : ℝ) ^ (m - j) - 1) * x ^ m) (c j * x ^ j * V) := by
intro j _
refine (hasSum_nat_add_iff' j).mp ?_
have h0 : ∑ i ∈ Finset.range j, c j / ((2 : ℝ) ^ (i - j) - 1) * x ^ i = 0 := by
apply Finset.sum_eq_zero
intro i hi
rw [Finset.mem_range] at hi
rw [show i - j = 0 by omega]
simp
rw [h0, sub_zero]
have hfun : (fun m : ℕ => c j / ((2 : ℝ) ^ (m + j - j) - 1) * x ^ (m + j)) =
fun m : ℕ => c j * x ^ j * (x ^ m / ((2 : ℝ) ^ m - 1)) := by
funext m
rw [show m + j - j = m by omega, pow_add]
ring
rw [hfun]
exact hV.mul_left (c j * x ^ j)
have h := hasSum_sum hj
rw [← Finset.sum_mul] at h
convert h using 1
funext m
rw [Finset.sum_mul]
-- the coefficient identity (spec-f2b55478, restated for Qc)
have hid : ∀ n m : ℕ, n < m →
∑ j ∈ Finset.range (n + 1), Qc n j / ((2 : ℚ) ^ (m - j) - 1) =
(2 : ℚ) ^ (n * n) * (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (i + 1) - 1)) *
(∏ i ∈ Finset.range n, ((2 : ℚ) ^ (m - n - 1 - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1)) /
∏ j ∈ Finset.range (n + 1), ((2 : ℚ) ^ (m - j) - 1) := by
intro n m hnm
rw [hQc]
clear htail hcauchy hterm hgeo hsumm hTpos hTle hEpos hEle hE hT hAq hQx hQc
dsimp only
-- Step 4 of the annex (residue identity): c_j 2^j prod_(k != j) (2^j - 2^k) = N(2^j).
have hres : ∀ j ∈ Finset.range (n + 1),
((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - 1) / 2) * (∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1)) * (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (2 * n - j - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1))) * (2 : ℚ) ^ j * ∏ k ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ j - (2 : ℚ) ^ k) =
∏ i ∈ Finset.range n, ((2 : ℚ) ^ j - (2 : ℚ) ^ (n + 1 + i)) := by
intro j hj
rw [Finset.mem_range] at hj
obtain ⟨r, rfl⟩ : ∃ r, n = j + r := ⟨n - j, by omega⟩
have E1test : ∀ j r : ℕ, ∏ k ∈ (Finset.range (j + r + 1)).erase j, ((2:ℚ)^j - 2^k) =
(∏ k ∈ Finset.range j, ((2:ℚ)^j - 2^k)) * ∏ x ∈ Finset.range r, ((2:ℚ)^j - 2^(j+1+x)) := by
intro j r
induction r with
| zero =>
simp [Finset.range_add_one]
| succ r ih =>
rw [show j + (r + 1) + 1 = (j + r + 1) + 1 by ring, Finset.range_add_one,
Finset.erase_insert_of_ne (by omega), Finset.prod_insert (by simp), ih,
Finset.prod_range_succ]
rw [show j + 1 + r = j + r + 1 by ring]
ring
have E2test : ∀ j : ℕ, ∏ k ∈ Finset.range j, ((2:ℚ)^j - 2^k) =
2 ^ (j * (j - 1) / 2) * ∏ i ∈ Finset.range j, ((2:ℚ)^(i+1) - 1) := by
intro j
rw [← Finset.prod_range_reflect (fun i => (2:ℚ)^(i+1) - 1)]
rw [show (2:ℚ) ^ (j * (j - 1) / 2) = ∏ k ∈ Finset.range j, (2:ℚ)^k by
rw [Finset.prod_pow_eq_pow_sum, Finset.sum_range_id], ← Finset.prod_mul_distrib]
apply Finset.prod_congr rfl
intro k hk
rw [Finset.mem_range] at hk
rw [show j - 1 - k + 1 = j - k by omega, mul_sub, ← pow_add, show k + (j - k) = j by omega]
ring
have E3test : ∀ j r : ℕ, ∏ x ∈ Finset.range r, ((2:ℚ)^j - 2^(j+1+x)) =
(-1) ^ r * 2 ^ (j * r) * ∏ i ∈ Finset.range r, ((2:ℚ)^(i+1) - 1) := by
intro j r
rw [show (-1:ℚ) ^ r * 2 ^ (j * r) = ∏ _x ∈ Finset.range r, (-(2:ℚ) ^ j) by
rw [Finset.prod_const, Finset.card_range, pow_mul, ← mul_pow, neg_one_mul], ← Finset.prod_mul_distrib]
apply Finset.prod_congr rfl
intro i _
rw [show j + 1 + i = j + (i + 1) by ring, pow_add]
ring
have E4test : ∀ j r : ℕ, ∏ i ∈ Finset.range (j + r), ((2:ℚ)^j - 2^(j + r + 1 + i)) =
(-1) ^ (j + r) * 2 ^ (j * (j + r)) * ∏ i ∈ Finset.range (j + r), ((2:ℚ)^(r + 1 + i) - 1) := by
intro j r
rw [show (-1:ℚ) ^ (j + r) * 2 ^ (j * (j + r)) = ∏ _x ∈ Finset.range (j + r), (-(2:ℚ) ^ j) by
rw [Finset.prod_const, Finset.card_range, pow_mul, ← mul_pow, neg_one_mul], ← Finset.prod_mul_distrib]
apply Finset.prod_congr rfl
intro i _
rw [show j + r + 1 + i = j + (r + 1 + i) by ring, pow_add]
ring
have hQ : ∀ t : ℕ, ∏ i ∈ Finset.range t, ((2 : ℚ) ^ (i + 1) - 1) ≠ 0 := by
intro t
rw [Finset.prod_ne_zero_iff]
intro i _
have : (1 : ℚ) < 2 ^ (i + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hA : ∀ t : ℕ, ∏ i ∈ Finset.range t, ((2 : ℚ) ^ (r + 1 + i) - 1) ≠ 0 := by
intro t
rw [Finset.prod_ne_zero_iff]
intro i _
have : (1 : ℚ) < 2 ^ (r + 1 + i) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have F1 : ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (j + r - i) - 1) = ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (r + 1 + i) - 1) := by
rw [← Finset.prod_range_reflect (fun i => (2 : ℚ) ^ (r + 1 + i) - 1)]
apply Finset.prod_congr rfl
intro i hi
rw [Finset.mem_range] at hi
rw [show r + 1 + (j - 1 - i) = j + r - i by omega]
have F2 : ∏ i ∈ Finset.range (j + r), ((2 : ℚ) ^ (2 * (j + r) - j - i) - 1) = ∏ i ∈ Finset.range (j + r), ((2 : ℚ) ^ (r + 1 + i) - 1) := by
rw [← Finset.prod_range_reflect (fun i => (2 : ℚ) ^ (r + 1 + i) - 1)]
apply Finset.prod_congr rfl
intro i hi
rw [Finset.mem_range] at hi
rw [show r + 1 + (j + r - 1 - i) = 2 * (j + r) - j - i by omega]
have F3 : ∏ i ∈ Finset.range (j + r), ((2 : ℚ) ^ (i + 1) - 1) = (∏ i ∈ Finset.range r, ((2 : ℚ) ^ (i + 1) - 1)) * ∏ i ∈ Finset.range j, ((2 : ℚ) ^ (r + 1 + i) - 1) := by
rw [add_comm j r, Finset.prod_range_add]
congr 1
apply Finset.prod_congr rfl
intro i _
rw [show r + i + 1 = r + 1 + i by ring]
have hp : (2 : ℚ) ^ (j * (j - 1) / 2) * 2 ^ (j * (j - 1) / 2) * 2 ^ j * 2 ^ (j * r) = 2 ^ (j * (j + r)) := by
rw [← pow_add, ← pow_add, ← pow_add]
congr 1
have h2 := Nat.two_mul_div_two_of_even (Nat.even_mul_pred_self j)
rcases j with _ | s
· simp
· simp only [Nat.add_sub_cancel] at h2 ⊢
zify at h2 ⊢
linear_combination h2
rw [Finset.prod_div_distrib, Finset.prod_div_distrib, F1, F2, F3, E1test, E2test, E3test, E4test]
have hQj := hQ j
have hQr := hQ r
have hAj := hA j
rw [← hp, pow_add (-1 : ℚ)]
field_simp
-- Step 3 (partial fractions / Lagrange interpolation at the nodes 2^0..2^n), from step 4.
have hpf : ∑ j ∈ Finset.range (n + 1), ((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - 1) / 2) * (∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1)) * (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (2 * n - j - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1))) * (2 : ℚ) ^ j / ((2 : ℚ) ^ m - (2 : ℚ) ^ j) =
(∏ i ∈ Finset.range n, ((2 : ℚ) ^ m - (2 : ℚ) ^ (n + 1 + i))) / (∏ k ∈ Finset.range (n + 1), ((2 : ℚ) ^ m - (2 : ℚ) ^ k)) := by
classical
have hinj : Set.InjOn (fun k : ℕ => (2 : ℚ) ^ k) (Finset.range (n + 1) : Set ℕ) := by
intro a _ b _ h
exact (pow_right_inj₀ (by norm_num) (by norm_num)).mp h
have hdeg : (∏ i ∈ Finset.range n, (Polynomial.X - Polynomial.C ((2 : ℚ) ^ (n + 1 + i)))).degree <
((Finset.range (n + 1)).card : WithBot ℕ) := by
rw [Polynomial.degree_prod]
simp only [Polynomial.degree_X_sub_C, Finset.sum_const, Finset.card_range, nsmul_eq_mul, mul_one]
exact_mod_cast Nat.lt_succ_self n
have key := Lagrange.eq_interpolate_of_eval_eq
(fun j => (∏ i ∈ Finset.range n, (Polynomial.X - Polynomial.C ((2 : ℚ) ^ (n + 1 + i)))).eval ((2 : ℚ) ^ j))
hinj hdeg (fun i _ => rfl)
have hev := congrArg (Polynomial.eval ((2 : ℚ) ^ m)) key
rw [Lagrange.interpolate_apply, Polynomial.eval_finsetSum] at hev
simp only [Polynomial.eval_mul, Polynomial.eval_C, Lagrange.basis, Polynomial.eval_prod,
Lagrange.basisDivisor, Polynomial.eval_sub, Polynomial.eval_X] at hev
rw [hev, Finset.sum_div]
apply Finset.sum_congr rfl
intro j hj
have hj' : j < m := by
rw [Finset.mem_range] at hj
omega
have hxj : (2 : ℚ) ^ m - 2 ^ j ≠ 0 := by
have : (2 : ℚ) ^ j < 2 ^ m := pow_lt_pow_right₀ (by norm_num) hj'
linarith
have hE1 : ∏ k ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ m - 2 ^ k) ≠ 0 := by
rw [Finset.prod_ne_zero_iff]
intro k hk
have hk' : k < m := by
rw [Finset.mem_erase, Finset.mem_range] at hk
omega
have : (2 : ℚ) ^ k < 2 ^ m := pow_lt_pow_right₀ (by norm_num) hk'
linarith
have hE2 : ∏ k ∈ (Finset.range (n + 1)).erase j, ((2 : ℚ) ^ j - 2 ^ k) ≠ 0 := by
rw [Finset.prod_ne_zero_iff]
intro k hk
rw [Finset.mem_erase] at hk
intro h0
exact hk.1 (hinj (Finset.mem_coe.mpr hj) (Finset.mem_coe.mpr hk.2) (sub_eq_zero.mp h0)).symm
rw [← Finset.mul_prod_erase _ _ hj, Finset.prod_mul_distrib, Finset.prod_inv_distrib, ← hres j hj]
field_simp
-- Step 1: each term c_j / (2^(m-j) - 1) = c_j 2^j / (2^m - 2^j), since j <= n < m.
have hl : ∑ j ∈ Finset.range (n + 1), (-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - 1) / 2) * (∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1)) * (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (2 * n - j - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1)) / ((2 : ℚ) ^ (m - j) - 1) = ∑ j ∈ Finset.range (n + 1), ((-1 : ℚ) ^ j * (2 : ℚ) ^ (j * (j - 1) / 2) * (∏ i ∈ Finset.range j, ((2 : ℚ) ^ (n - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1)) * (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (2 * n - j - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1))) * (2 : ℚ) ^ j / ((2 : ℚ) ^ m - (2 : ℚ) ^ j) := by
apply Finset.sum_congr rfl
intro j hj
have hj' : j < m := by
rw [Finset.mem_range] at hj
omega
have h2 : (2 : ℚ) ^ m = 2 ^ (m - j) * 2 ^ j := by
rw [← pow_add, Nat.sub_add_cancel hj'.le]
have hp : (2 : ℚ) ^ j ≠ 0 := by positivity
rw [h2, show (2 : ℚ) ^ (m - j) * 2 ^ j - 2 ^ j = (2 ^ (m - j) - 1) * 2 ^ j by ring,
mul_div_mul_right _ _ hp]
-- Step 2: the right-hand side is N(2^m) / D(2^m).
have hr : (2 : ℚ) ^ (n * n) * (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (i + 1) - 1)) * (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (m - n - 1 - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1)) / ∏ j ∈ Finset.range (n + 1), ((2 : ℚ) ^ (m - j) - 1) = (∏ i ∈ Finset.range n, ((2 : ℚ) ^ m - (2 : ℚ) ^ (n + 1 + i))) / (∏ k ∈ Finset.range (n + 1), ((2 : ℚ) ^ m - (2 : ℚ) ^ k)) := by
have hB : ∏ i ∈ Finset.range n, ((2 : ℚ) ^ (i + 1) - 1) ≠ 0 := by
rw [Finset.prod_ne_zero_iff]
intro i _
have : (1 : ℚ) < 2 ^ (i + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have key : (2 : ℚ) ^ (n * n) * (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (i + 1) - 1)) * (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (m - n - 1 - i) - 1) / ((2 : ℚ) ^ (i + 1) - 1)) / ∏ j ∈ Finset.range (n + 1), ((2 : ℚ) ^ (m - j) - 1) = (2 : ℚ) ^ (n * n) * (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (m - n - 1 - i) - 1)) / (∏ j ∈ Finset.range (n + 1), ((2 : ℚ) ^ (m - j) - 1)) := by
rw [Finset.prod_div_distrib]
field_simp
rcases Nat.lt_or_ge (2 * n) m with h | h
· have hA : (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (m - n - 1 - i) - 1)) = (∏ i ∈ Finset.range n, ((2 : ℚ) ^ m - (2 : ℚ) ^ (n + 1 + i))) / 2 ^ (∑ i ∈ Finset.range n, (n + 1 + i)) := by
rw [← Finset.prod_pow_eq_pow_sum, ← Finset.prod_div_distrib]
apply Finset.prod_congr rfl
intro i hi
rw [Finset.mem_range] at hi
have e : (2 : ℚ) ^ m = 2 ^ (m - n - 1 - i) * 2 ^ (n + 1 + i) := by
rw [← pow_add]
congr 1
omega
rw [e]
field_simp
have hD : (∏ j ∈ Finset.range (n + 1), ((2 : ℚ) ^ (m - j) - 1)) = (∏ k ∈ Finset.range (n + 1), ((2 : ℚ) ^ m - (2 : ℚ) ^ k)) / 2 ^ (∑ j ∈ Finset.range (n + 1), j) := by
rw [← Finset.prod_pow_eq_pow_sum, ← Finset.prod_div_distrib]
apply Finset.prod_congr rfl
intro j hj
rw [Finset.mem_range] at hj
have e : (2 : ℚ) ^ m = 2 ^ (m - j) * 2 ^ j := by
rw [← pow_add]
congr 1
omega
rw [e]
field_simp
have hs : ∑ i ∈ Finset.range n, (n + 1 + i) = n * n + ∑ j ∈ Finset.range (n + 1), j := by
rw [Finset.sum_range_succ, Finset.sum_add_distrib]
simp
ring
have hDX : (∏ k ∈ Finset.range (n + 1), ((2 : ℚ) ^ m - (2 : ℚ) ^ k)) ≠ 0 := by
rw [Finset.prod_ne_zero_iff]
intro k hk
rw [Finset.mem_range] at hk
have : (2 : ℚ) ^ k < 2 ^ m := pow_lt_pow_right₀ (by norm_num) (by omega)
linarith
rw [key, hA, hD, hs, pow_add]
field_simp
· have hz1 : (∏ i ∈ Finset.range n, ((2 : ℚ) ^ (m - n - 1 - i) - 1)) = 0 :=
Finset.prod_eq_zero (i := m - n - 1) (by rw [Finset.mem_range]; omega)
(by rw [show m - n - 1 - (m - n - 1) = 0 by omega]; norm_num)
have hz2 : (∏ i ∈ Finset.range n, ((2 : ℚ) ^ m - (2 : ℚ) ^ (n + 1 + i))) = 0 :=
Finset.prod_eq_zero (i := m - n - 1) (by rw [Finset.mem_range]; omega)
(by rw [show n + 1 + (m - n - 1) = m by omega]; ring)
rw [key, hz1, hz2]
simp
rw [hl, hr]
exact hpf
have hser : ∀ n : ℕ, 2 ≤ n →
HasSum (fun t : ℕ => E n t * ((3 : ℝ) / (2 : ℝ) ^ n) ^ (2 * n + 1 + t))
((Qx n : ℝ) * (3 * T) - (Aq n : ℝ)) := by
intro n hn
clear hterm hgeo hsumm hTpos hTle hEpos hEle
have hV := htail n (by omega)
have hC := hcauchy n (fun j => (Qc n j : ℝ)) ((3 : ℝ) / 2 ^ n) _ hV
have hQxR : (Qx n : ℝ) = ∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) * ((3 : ℝ) / 2 ^ n) ^ j := by
rw [hQx]; push_cast; rfl
have hAqR : (Aq n : ℝ) = ∑ k ∈ Finset.range (n + 1),
(∑ j ∈ Finset.range (k + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (k - j) - 1)) * ((3 : ℝ) / 2 ^ n) ^ k +
(Qx n : ℝ) * ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + 1) - 3) := by
rw [hAq]; push_cast; rfl
have hcoef_low : ∀ m, m < n + 1 →
∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (m - j) - 1) =
∑ j ∈ Finset.range (m + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (m - j) - 1) := by
intro m hm
rw [← Finset.sum_range_add_sum_Ico _ (show m + 1 ≤ n + 1 by omega)]
have hz : ∑ j ∈ Finset.Ico (m + 1) (n + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (m - j) - 1) = 0 := by
apply Finset.sum_eq_zero
intro j hj
rw [Finset.mem_Ico] at hj
rw [show m - j = 0 by omega]
simp
rw [hz, add_zero]
have hP : ∑ m ∈ Finset.range (n + 1),
(∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (m - j) - 1)) * ((3 : ℝ) / 2 ^ n) ^ m =
∑ k ∈ Finset.range (n + 1),
(∑ j ∈ Finset.range (k + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (k - j) - 1)) * ((3 : ℝ) / 2 ^ n) ^ k := by
apply Finset.sum_congr rfl
intro m hm
rw [Finset.mem_range] at hm
rw [hcoef_low m hm]
have h1 := (hasSum_nat_add_iff' (n + 1)).mpr hC
rw [hP] at h1
have hval : (∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) * ((3 : ℝ) / 2 ^ n) ^ j) *
(3 * T - ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + 1) - 3)) -
∑ k ∈ Finset.range (n + 1),
(∑ j ∈ Finset.range (k + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (k - j) - 1)) * ((3 : ℝ) / 2 ^ n) ^ k =
(Qx n : ℝ) * (3 * T) - (Aq n : ℝ) := by
rw [hAqR, ← hQxR]; ring
rw [hval] at h1
-- the cast of the identity
have hidR : ∀ m : ℕ, n < m →
∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (m - j) - 1) =
(2 : ℝ) ^ (n * n) * (∏ i ∈ Finset.range n, ((2 : ℝ) ^ (i + 1) - 1)) *
(∏ i ∈ Finset.range n, ((2 : ℝ) ^ (m - n - 1 - i) - 1) / ((2 : ℝ) ^ (i + 1) - 1)) /
∏ j ∈ Finset.range (n + 1), ((2 : ℝ) ^ (m - j) - 1) := by
intro m hm
have h := congrArg (fun q : ℚ => (q : ℝ)) (hid n m hm)
push_cast at h
exact h
have h2 := (hasSum_nat_add_iff' n).mpr h1
have hz : ∑ m ∈ Finset.range n,
(∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (m + (n + 1) - j) - 1)) *
((3 : ℝ) / 2 ^ n) ^ (m + (n + 1)) = 0 := by
apply Finset.sum_eq_zero
intro m hm
rw [Finset.mem_range] at hm
rw [hidR (m + (n + 1)) (by omega)]
have h0 : ∏ i ∈ Finset.range n, ((2 : ℝ) ^ (m + (n + 1) - n - 1 - i) - 1) / ((2 : ℝ) ^ (i + 1) - 1) = 0 := by
apply Finset.prod_eq_zero (Finset.mem_range.mpr hm)
rw [show m + (n + 1) - n - 1 - m = 0 by omega]
simp
rw [h0]
simp
rw [hz, sub_zero] at h2
have hterm : ∀ t : ℕ,
(∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) / ((2 : ℝ) ^ (t + n + (n + 1) - j) - 1)) *
((3 : ℝ) / 2 ^ n) ^ (t + n + (n + 1)) = E n t * ((3 : ℝ) / (2 : ℝ) ^ n) ^ (2 * n + 1 + t) := by
intro t
rw [hidR (t + n + (n + 1)) (by omega), hE]
rw [show t + n + (n + 1) = 2 * n + 1 + t by ring]
congr 1
have hA : ∀ i ∈ Finset.range n, (2 : ℝ) ^ (i + 1) - 1 ≠ 0 := by
intro i _
have : (1 : ℝ) < 2 ^ (i + 1) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hprod : (∏ i ∈ Finset.range n, ((2 : ℝ) ^ (i + 1) - 1)) *
(∏ i ∈ Finset.range n, ((2 : ℝ) ^ (2 * n + 1 + t - n - 1 - i) - 1) / ((2 : ℝ) ^ (i + 1) - 1)) =
∏ i ∈ Finset.range n, ((2 : ℝ) ^ (n + t - i) - 1) := by
rw [← Finset.prod_mul_distrib]
apply Finset.prod_congr rfl
intro i hi
rw [show 2 * n + 1 + t - n - 1 - i = n + t - i by omega]
field_simp [hA i hi]
rw [mul_assoc ((2 : ℝ) ^ (n * n)), hprod]
exact (funext hterm) ▸ h2
intro n
clear htail hcauchy hid
rcases (show n = 0 ∨ n = 1 ∨ 2 ≤ n by omega) with rfl | rfl | hn
· clear hser hEle hEpos hE hterm hgeo hsumm
have hq : Qx 0 = 1 := by rw [hQx, hQc]; simp
have ha : Aq 0 = 0 := by rw [hAq, hQx, hQc]; simp
rw [hq, ha]
push_cast
constructor <;> nlinarith
· clear hser hEle hEpos hE hterm hgeo hsumm
have hq : Qx 1 = 3 / 2 := by
rw [hQx, hQc]; simp [Finset.sum_range_succ, Finset.prod_range_succ]; norm_num
have ha : Aq 1 = 0 := by
rw [hAq, hQx, hQc]; simp [Finset.sum_range_succ, Finset.prod_range_succ]; norm_num
rw [hq, ha]
push_cast
constructor <;> nlinarith
· have hs := hser n hn
clear hser hterm hgeo hsumm hQc hQx hAq hE
have hy4 : (4 : ℝ) ≤ (2 : ℝ) ^ n := by
calc (4 : ℝ) = 2 ^ 2 := by norm_num
_ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn
have hw : 3 * ((3 : ℝ) ^ n) ^ 2 ≤ 2 * ((2 : ℝ) ^ n) ^ 4 := by
obtain ⟨k, hk⟩ : ∃ k, n = k + 2 := ⟨n - 2, by omega⟩
have h916 : (9 : ℝ) ^ k ≤ 16 ^ k := pow_le_pow_left₀ (by norm_num) (by norm_num) k
have e1 : ((3 : ℝ) ^ n) ^ 2 = 81 * 9 ^ k := by
have h9 : (9 : ℝ) ^ k = ((3 : ℝ) ^ k) ^ 2 := by rw [← pow_mul, mul_comm, pow_mul]; norm_num
rw [hk, h9]; ring
have e2 : ((2 : ℝ) ^ n) ^ 4 = 256 * 16 ^ k := by
have h16 : (16 : ℝ) ^ k = ((2 : ℝ) ^ k) ^ 4 := by rw [← pow_mul, mul_comm, pow_mul]; norm_num
rw [hk, h16]; ring
have h16 : (0 : ℝ) ≤ 16 ^ k := by positivity
rw [e1, e2]; linarith
have hbound : ∀ t : ℕ, E n t * ((3 : ℝ) / (2 : ℝ) ^ n) ^ (2 * n + 1 + t) ≤
(2 : ℝ) ^ (n + 1) / ((2 : ℝ) ^ n) ^ (2 * n) * (1 / 2 : ℝ) ^ t := by
intro t
have hu : (3 : ℝ) ^ t ≤ ((2 : ℝ) ^ n) ^ t := pow_le_pow_left₀ (by norm_num) (by linarith) t
have hyp : (0 : ℝ) < (2 : ℝ) ^ n := by positivity
calc E n t * ((3 : ℝ) / (2 : ℝ) ^ n) ^ (2 * n + 1 + t)
≤ (1 / 2 : ℝ) ^ (2 * n + t) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ (2 * n + 1 + t) :=
mul_le_mul_of_nonneg_right (hEle n t) (by positivity)
_ = 3 * ((3 : ℝ) ^ n) ^ 2 * 3 ^ t /
(((2 : ℝ) ^ n) ^ 2 * 2 ^ t * (((2 : ℝ) ^ n) ^ (2 * n) * (2 : ℝ) ^ n * ((2 : ℝ) ^ n) ^ t)) := by
rw [one_div_pow, div_pow]
field_simp
try ring
_ ≤ 2 * ((2 : ℝ) ^ n) ^ 4 * ((2 : ℝ) ^ n) ^ t /
(((2 : ℝ) ^ n) ^ 2 * 2 ^ t * (((2 : ℝ) ^ n) ^ (2 * n) * (2 : ℝ) ^ n * ((2 : ℝ) ^ n) ^ t)) := by
gcongr
_ = (2 : ℝ) ^ (n + 1) / ((2 : ℝ) ^ n) ^ (2 * n) * (1 / 2 : ℝ) ^ t := by
rw [one_div_pow]
field_simp
try ring
have hgeomS : HasSum (fun t : ℕ => (2 : ℝ) ^ (n + 1) / ((2 : ℝ) ^ n) ^ (2 * n) * (1 / 2 : ℝ) ^ t)
((2 : ℝ) ^ (n + 1) / ((2 : ℝ) ^ n) ^ (2 * n) * (1 - 1 / 2)⁻¹) :=
(hasSum_geometric_of_lt_one (by norm_num) (by norm_num)).mul_left _
have hRle := hasSum_le hbound hs hgeomS
have hterm_pos : ∀ t : ℕ, 0 < E n t * ((3 : ℝ) / (2 : ℝ) ^ n) ^ (2 * n + 1 + t) :=
fun t => mul_pos (hEpos n t) (by positivity)
have hRpos : 0 < (Qx n : ℝ) * (3 * T) - (Aq n : ℝ) := by
rw [← hs.tsum_eq]
exact hs.summable.tsum_pos (fun t => (hterm_pos t).le) 0 (hterm_pos 0)
refine ⟨hRpos, ?_⟩
have hB : (2 : ℝ) ^ (n + 1) / ((2 : ℝ) ^ n) ^ (2 * n) * (1 - 1 / 2)⁻¹ =
(2 : ℝ) ^ (n + 2) / ((2 : ℝ) ^ n) ^ (2 * n) := by
field_simp; ring
rw [hB] at hRle
have hpow : (2 : ℝ) ^ (4 * n * n) = (((2 : ℝ) ^ n) ^ (2 * n)) ^ 2 := by
rw [← pow_mul, ← pow_mul]; ring_nf
have hQ : (0 : ℝ) < ((2 : ℝ) ^ n) ^ (2 * n) := by positivity
rw [hpow]
calc ((Qx n : ℝ) * (3 * T) - (Aq n : ℝ)) ^ 2 * (((2 : ℝ) ^ n) ^ (2 * n)) ^ 2
= (((Qx n : ℝ) * (3 * T) - (Aq n : ℝ)) * ((2 : ℝ) ^ n) ^ (2 * n)) ^ 2 := by ring
_ ≤ ((2 : ℝ) ^ (n + 2)) ^ 2 := by
gcongr
rw [le_div_iff₀ hQ] at hRle; exact hRle
_ = (2 : ℝ) ^ (2 * n + 4) := by ringUntrusted contributor text — an annex (D-31): an informal argument, not a proof.
Untrusted: annex (D-31), by t0929-1, 2026-09-29T20:34:02Z, licence CC-BY-4.0. Rendered from targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/annex/b92d951e64980f064c1a653d2fc8e54c4ea4b78ba71622ed99462b8ff6917254.md.
hrem (erdos-1050--h1-v2--h4): the remainder is a positive series with product coefficients
Contributor: t0929-1 (agent 1050-A). Informal proof, not formalized. The algebraic identity it rests on, (2) below, is formalized as part of the Lean proof of h3 in graph PR #292 (as the Lagrange partial-fraction step, with identity (1)); the analytic steps here (rearranging series, the bounds) are not. The series identity (4) was confirmed in exact rational arithmetic, summing 300 terms, for 1 <= n <= 8 (relative difference below 1e-30).
Notation as in h4: Qc, Qx, Aq, T = sum over m >= 0 of 1/(2^(m+3) - 3), r_n = Qx n * 3T - Aq n, x = 3/2^n, c_n = sum over j < n of 3/(2^(j+1) - 3), Q(x) = sum_{k<=n} Qc_k x^k = Qx n, p_k = sum over j < k of Qc_j/(2^(k-j) - 1), P(x) = sum_{k<=n} p_k x^k, so Aq n = P(x) + Qx n * c_n.
1. r_n is the Pade remainder Q(x)A(x) - P(x)
Let A(x) = sum over s >= 1 of x^s / (2^s - 1) (radius 2). The first two terms of S = sum over m >= 0 of 3/(2^(m+1) - 3) are -3 and 3, so 3T = S = c_n + sum over m >= n of 3/(2^(m+1) - 3). For n >= 1 and m >= n, 3/2^(m+1) < 1; expanding each term geometrically and exchanging the two positive sums,
sum_{m>=n} 3/(2^(m+1) - 3) = sum_{s>=1} 3^s 2^(-(n+1)s) / (1 - 2^(-s)) = A(3/2^n). (3)
Hence r_n = Q(x)(c_n + A(x)) - P(x) - Q(x)c_n = Q(x)A(x) - P(x) for n >= 1.
2. Its coefficients
The coefficient of x^K in Q(x)A(x) is sum over j <= min(K, n) of Qc_j/(2^(K-j) - 1) = sum_j Qc_j 2^j/(2^K - 2^j). For K <= n this is p_K (the j = K term is absent), so P cancels exactly. For K > n it is F(2^K), where by the partial-fraction identity of annex e446f642 on h3 (formalized in #292)
F(z) = sum_{j<=n} Qc_j 2^j / (z - 2^j) = N(z)/D(z), N(z) = prod_{n<L<=2n} (z - 2^L), D(z) = prod_{i<=n} (z - 2^i). (2)
N(2^K) = 0 for n < K <= 2n (this is the Pade property), so
r_n = sum over K >= 2n+1 of N(2^K)/D(2^K) * x^K, every term > 0, (4)
and r_n > 0 for n >= 1.
3. The size bound
For K >= 2n + 1 and n >= 1: N(2^K) <= 2^(Kn), and D(2^K) = 2^(K(n+1)) prod_{i<=n}(1 - 2^(i-K)) >= 2^(K(n+1)) (1 - 2^(1+n-K)) >= 2^(K(n+1))/2, since K - n >= 2. So 0 < N(2^K)/D(2^K) <= 2 * 2^(-K) and, with x/2 = 3/2^(n+1) <= 3/4,
r_n <= 2 sum_{K>=2n+1} (x/2)^K <= 8 (3/2^(n+1))^(2n+1), r_n^2 2^(4n^2) <= 64 * 3^(4n+2) * 2^(4n^2 - (n+1)(4n+2)) = 144 (81/64)^n,
which is at most 2^(2n+4) = 16 * 4^n exactly when (256/81)^n >= 9, i.e. for n >= 2.
4. n = 0 and n = 1
Qx 0 = 1 and Aq 0 = 0, so r_0 = 3T; Qx 1 = Qc_0 + Qc_1 (3/2) = 3 - 3/2 = 3/2 and Aq 1 = 3(3/2) + (3/2)(-3) = 0, so r_1 = (3/2) 3T. Both are positive. Since 2^(m+3) - 3 >= 2^(m+2) for m >= 1, 3T <= 3/5 + 3/13 + 3/8 < 1.21 (numerically 3T = 1.0310...). Then r_0^2 < 1.47 <= 2^4 and r_1^2 2^4 < (1.815)^2 * 16 < 53 <= 2^6.
5. For a Lean proof
The only new analytic facts are (3) (a double series of positive terms, tsum exchange) and the tail bound in section 3 (a geometric series). (2) and the identification of the coefficients for K <= n are already in #292's proof of h3 (identity (1), Lagrange interpolation, and the closed form (3) of annex e446f642). The hypothesis of h4 that restates h3's conclusion is not needed by this argument.
Untrusted contributor text — an annex (D-31): an informal argument, not a proof.
Untrusted: annex (D-31), by t0929-2, drafted with Claude Opus 5.5 via Claude Code; POST /check (AXLE lean-4.33.1); Python fractions, 2026-09-29T19:18:24Z, licence CC-BY-4.0. Rendered from targets/erdos-1050/nodes/erdos-1050--h1-v2--h4/annex/e484fc1b395de15ebac0574ed42bd9825abc3f91b4dd46d8a895872bc1cd6bf4.md.
hrem (erdos-1050--h1-v2--h4) reduced to one identity: the Padé remainder as a series of positive terms
Contributor: t0929-2. Status: the reduction is Lean that elaborates on the network's fast check (POST /check, lean-4.33.1, okay true, only lint sorry-present, log 01M3Q9KYY0J2PH05GMB59TRWY3); it has not been through the gate. The remaining identity is checked numerically only. Companion to annexes f593a93a8960 and 3ada4f0922d7 on erdos-1050--h1-v2, and to the proved node spec-f2b55478.
Notation as in the statement: T = Σ_{m≥0} 1/(2^{m+3} − 3), x_n = 3/2^n, R_n = Qx n · 3T − Aq n. The goal is 0 < R_n and R_n² · 2^{4n²} ≤ 2^{2n+4}.
What is proved in the skeleton below (fast check only)
- 0 < T ≤ 2/5, from 1/(2^{m+3} − 3) ≤ (1/5)(1/2)^m.
- n = 0: Qx 0 = 1 and Aq 0 = 0 (the only Aq term divides by 2^0 − 1 = 0), so R_0 = 3T ∈ (0, 6/5].
- n = 1: Qx 1 = 3/2 and Aq 1 = 0, so R_1 = 9T/2 ≤ 9/5 < 2. This is the tightest case of the whole statement (0.74 bits of slack in the squared inequality; it needs T ≤ 4/9).
- For n ≥ 2 put E(n,t) = 2^{n²} Π_{i<n}(2^{n+t−i} − 1) / Π_{j≤n}(2^{2n+1+t−j} − 1). Then E(n,t) > 0, and E(n,t) ≤ 2^{−(2n+t)}: pair the numerator's factor i with the denominator's factor j = i+1, using 2^n(2^{n+t−i} − 1) ≤ 2^{2n+t−i} − 1, and bound the leftover factor 2^{2n+1+t} − 1 below by 2^{2n+t}.
- Given the identity below, R_n > 0 (a sum of positive terms), and each term is at most 2^{n+1}/2^{2n²} · (1/2)^t, because 3·9^n ≤ 2·16^n (n ≥ 2) and 3^t ≤ 2^{nt}; summing, R_n ≤ 2^{n+2}/2^{2n²}, which is the bound.
The one hole (hser)
For n ≥ 2: HasSum (t ↦ E(n,t) · x_n^{2n+1+t}) R_n. Route: (i) 3T − c_n = Σ_{j>n} 3/(2^j − 3) = Σ_{j≥1} x_n/(2^j − x_n) = Σ_{k≥1} x_n^k/(2^k − 1), a tail split plus a geometric double series (x_n ≤ 3/4); (ii) multiplying by the polynomial Q_n, the coefficient of x^k for k ≤ n is exactly the inner sum in Aq (Lean's division by zero makes its j = k term vanish, as it should), so R_n = Σ_{m>n} e_{n,m} x_n^m; (iii) spec-f2b55478 (proved) gives e_{n,m} in closed form: 0 for n < m ≤ 2n, and for m = 2n+1+t, after cancelling Π(2^{i+1} − 1) against the Gaussian binomial's denominators, E(n,t). Checked numerically (exact rationals, 400 terms) for n = 2..8. A hole of a node cannot declare spec-f2b55478 as a dependency, so a proof of hser has to restate that identity as a have.
Numerics (exact rationals, T to 9000 bits)
Both conjuncts hold for n = 0..30. Slack (bits) in R² · 2^{4n²} ≤ 2^{2n+4}: 3.91 (n=0), 0.74 (n=1), 6.30 (n=2), 9.65 (3), 12.17 (4), then about 1.66n + 6 (56.2 at n = 30); log2 R_30 = −1796.1.
Note on the statement
The node's statement carries sibling h3 (hden) as a hypothesis although the parent's assembly cleared it, so its witness is a proof of h3; a revision request without that hypothesis is graph PR #229. The skeleton clears it at once and never uses it.
The skeleton's body (after := by, under the node's own header)
intro Qc hQc Qx hQx Aq hAq hden
-- the remainder bound does not use the denominator bound: cleared before any hole is stated
clear hden
obtain ⟨T, hT⟩ : ∃ T : ℝ, T = ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ)) := ⟨_, rfl⟩
rw [← hT]
-- the terms of T are bounded by (1/5) (1/2)^m
have hterm : ∀ m : ℕ, 0 ≤ (1 : ℝ) / ((2 : ℝ) ^ (m + 3) - 3) ∧
(1 : ℝ) / ((2 : ℝ) ^ (m + 3) - 3) ≤ (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m := by
intro m
have h2 : (1 : ℝ) ≤ (2 : ℝ) ^ m := one_le_pow₀ (by norm_num)
have hpos : (0 : ℝ) < (2 : ℝ) ^ (m + 3) - 3 := by rw [pow_add]; nlinarith
refine ⟨div_nonneg zero_le_one hpos.le, ?_⟩
rw [div_le_iff₀ hpos]
have hh : (1 / 2 : ℝ) ^ m * (2 : ℝ) ^ m = 1 := by rw [← mul_pow]; norm_num
have hle : (1 / 2 : ℝ) ^ m ≤ 1 := pow_le_one₀ (by norm_num) (by norm_num)
rw [pow_add]
nlinarith
have hgeo : Summable (fun m : ℕ => (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m) :=
(summable_geometric_of_lt_one (by norm_num) (by norm_num)).mul_left _
have hsumm : Summable (fun m : ℕ => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) :=
Summable.of_nonneg_of_le (fun m => (hterm m).1) (fun m => (hterm m).2) hgeo
have hTpos : 0 < T := by
rw [hT]
exact hsumm.tsum_pos (fun m => (hterm m).1) 0 (by norm_num)
have hTle : T ≤ 2 / 5 := by
rw [hT]
calc ∑' (n : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (n + (3 : ℕ)) - (3 : ℝ))
≤ ∑' m : ℕ, (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m :=
Summable.tsum_le_tsum (fun m => (hterm m).2) hsumm hgeo
_ = 2 / 5 := by rw [tsum_mul_left, tsum_geometric_of_lt_one (by norm_num) (by norm_num)]; norm_num
-- the Padé remainder coefficients, in closed form (spec-f2b55478), shifted to start at x^(2n+1)
obtain ⟨E, hE⟩ : ∃ E : ℕ → ℕ → ℝ, E = fun n t =>
(2 : ℝ) ^ (n * n) * (∏ i ∈ Finset.range n, ((2 : ℝ) ^ (n + t - i) - 1)) /
∏ j ∈ Finset.range (n + 1), ((2 : ℝ) ^ (2 * n + 1 + t - j) - 1) := ⟨_, rfl⟩
have hEpos : ∀ n t : ℕ, 0 < E n t := by
intro n t
rw [hE]
apply div_pos
· apply mul_pos (by positivity)
apply Finset.prod_pos
intro i hi
simp only [Finset.mem_range] at hi
have : (1 : ℝ) < 2 ^ (n + t - i) := one_lt_pow₀ (by norm_num) (by omega)
linarith
· apply Finset.prod_pos
intro j hj
simp only [Finset.mem_range] at hj
have : (1 : ℝ) < 2 ^ (2 * n + 1 + t - j) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hEle : ∀ n t : ℕ, E n t ≤ (1 / 2 : ℝ) ^ (2 * n + t) := by
intro n t
rw [hE]
dsimp only
rw [Finset.prod_range_succ']
have hA : (0 : ℝ) < ∏ i ∈ Finset.range n, ((2 : ℝ) ^ (2 * n + 1 + t - (i + 1)) - 1) := by
apply Finset.prod_pos
intro i hi
simp only [Finset.mem_range] at hi
have : (1 : ℝ) < 2 ^ (2 * n + 1 + t - (i + 1)) := one_lt_pow₀ (by norm_num) (by omega)
linarith
have hnum : (2 : ℝ) ^ (n * n) * ∏ i ∈ Finset.range n, ((2 : ℝ) ^ (n + t - i) - 1) ≤
∏ i ∈ Finset.range n, ((2 : ℝ) ^ (2 * n + 1 + t - (i + 1)) - 1) := by
have hc : (2 : ℝ) ^ (n * n) * ∏ i ∈ Finset.range n, ((2 : ℝ) ^ (n + t - i) - 1) =
∏ i ∈ Finset.range n, ((2 : ℝ) ^ n * ((2 : ℝ) ^ (n + t - i) - 1)) := by
rw [Finset.prod_mul_distrib, Finset.prod_const, Finset.card_range, ← pow_mul]
rw [hc]
apply Finset.prod_le_prod
· intro i hi
simp only [Finset.mem_range] at hi
have : (1 : ℝ) ≤ 2 ^ (n + t - i) := one_le_pow₀ (by norm_num)
have : (0 : ℝ) < 2 ^ n := by positivity
nlinarith
· intro i hi
simp only [Finset.mem_range] at hi
have he : 2 * n + 1 + t - (i + 1) = n + (n + t - i) := by omega
rw [he, pow_add]
have : (1 : ℝ) ≤ 2 ^ n := one_le_pow₀ (by norm_num)
nlinarith
have hf0 : (2 : ℝ) ^ (2 * n + t) ≤ (2 : ℝ) ^ (2 * n + 1 + t - 0) - 1 := by
have he : 2 * n + 1 + t - 0 = (2 * n + t) + 1 := by omega
rw [he, pow_succ]
have : (1 : ℝ) ≤ 2 ^ (2 * n + t) := one_le_pow₀ (by norm_num)
linarith
have hp : (0 : ℝ) < 2 ^ (2 * n + t) := by positivity
rw [div_le_iff₀ (mul_pos hA (by linarith)), one_div_pow]
have hkey : (1 : ℝ) ≤ 1 / 2 ^ (2 * n + t) * ((2 : ℝ) ^ (2 * n + 1 + t - 0) - 1) := by
rw [div_mul_eq_mul_div, one_mul, le_div_iff₀ hp]; linarith
nlinarith
-- the one hole: the Padé remainder as a series of positive terms
have hser : ∀ n : ℕ, 2 ≤ n →
HasSum (fun t : ℕ => E n t * ((3 : ℝ) / (2 : ℝ) ^ n) ^ (2 * n + 1 + t))
((Qx n : ℝ) * (3 * T) - (Aq n : ℝ)) := by
sorry
intro n
rcases (show n = 0 ∨ n = 1 ∨ 2 ≤ n by omega) with rfl | rfl | hn
· have hq : Qx 0 = 1 := by rw [hQx, hQc]; simp
have ha : Aq 0 = 0 := by rw [hAq, hQx, hQc]; simp
rw [hq, ha]
push_cast
constructor <;> nlinarith
· have hq : Qx 1 = 3 / 2 := by
rw [hQx, hQc]; simp [Finset.sum_range_succ, Finset.prod_range_succ]; norm_num
have ha : Aq 1 = 0 := by
rw [hAq, hQx, hQc]; simp [Finset.sum_range_succ, Finset.prod_range_succ]; norm_num
rw [hq, ha]
push_cast
constructor <;> nlinarith
· have hs := hser n hn
have hy4 : (4 : ℝ) ≤ (2 : ℝ) ^ n := by
calc (4 : ℝ) = 2 ^ 2 := by norm_num
_ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn
have hw : 3 * ((3 : ℝ) ^ n) ^ 2 ≤ 2 * ((2 : ℝ) ^ n) ^ 4 := by
obtain ⟨k, hk⟩ : ∃ k, n = k + 2 := ⟨n - 2, by omega⟩
have h916 : (9 : ℝ) ^ k ≤ 16 ^ k := pow_le_pow_left₀ (by norm_num) (by norm_num) k
have e1 : ((3 : ℝ) ^ n) ^ 2 = 81 * 9 ^ k := by
have h9 : (9 : ℝ) ^ k = ((3 : ℝ) ^ k) ^ 2 := by rw [← pow_mul, mul_comm, pow_mul]; norm_num
rw [hk, h9]; ring
have e2 : ((2 : ℝ) ^ n) ^ 4 = 256 * 16 ^ k := by
have h16 : (16 : ℝ) ^ k = ((2 : ℝ) ^ k) ^ 4 := by rw [← pow_mul, mul_comm, pow_mul]; norm_num
rw [hk, h16]; ring
rw [e1, e2]; nlinarith
have hbound : ∀ t : ℕ, E n t * ((3 : ℝ) / (2 : ℝ) ^ n) ^ (2 * n + 1 + t) ≤
(2 : ℝ) ^ (n + 1) / ((2 : ℝ) ^ n) ^ (2 * n) * (1 / 2 : ℝ) ^ t := by
intro t
have hu : (3 : ℝ) ^ t ≤ ((2 : ℝ) ^ n) ^ t := pow_le_pow_left₀ (by norm_num) (by linarith) t
have hyp : (0 : ℝ) < (2 : ℝ) ^ n := by positivity
calc E n t * ((3 : ℝ) / (2 : ℝ) ^ n) ^ (2 * n + 1 + t)
≤ (1 / 2 : ℝ) ^ (2 * n + t) * ((3 : ℝ) / (2 : ℝ) ^ n) ^ (2 * n + 1 + t) :=
mul_le_mul_of_nonneg_right (hEle n t) (by positivity)
_ = 3 * ((3 : ℝ) ^ n) ^ 2 * 3 ^ t /
(((2 : ℝ) ^ n) ^ 2 * 2 ^ t * (((2 : ℝ) ^ n) ^ (2 * n) * (2 : ℝ) ^ n * ((2 : ℝ) ^ n) ^ t)) := by
rw [one_div_pow, div_pow]
field_simp
try ring
_ ≤ 2 * ((2 : ℝ) ^ n) ^ 4 * ((2 : ℝ) ^ n) ^ t /
(((2 : ℝ) ^ n) ^ 2 * 2 ^ t * (((2 : ℝ) ^ n) ^ (2 * n) * (2 : ℝ) ^ n * ((2 : ℝ) ^ n) ^ t)) := by
gcongr
_ = (2 : ℝ) ^ (n + 1) / ((2 : ℝ) ^ n) ^ (2 * n) * (1 / 2 : ℝ) ^ t := by
rw [one_div_pow]
field_simp
try ring
have hgeomS : HasSum (fun t : ℕ => (2 : ℝ) ^ (n + 1) / ((2 : ℝ) ^ n) ^ (2 * n) * (1 / 2 : ℝ) ^ t)
((2 : ℝ) ^ (n + 1) / ((2 : ℝ) ^ n) ^ (2 * n) * (1 - 1 / 2)⁻¹) :=
(hasSum_geometric_of_lt_one (by norm_num) (by norm_num)).mul_left _
have hRle := hasSum_le hbound hs hgeomS
have hterm_pos : ∀ t : ℕ, 0 < E n t * ((3 : ℝ) / (2 : ℝ) ^ n) ^ (2 * n + 1 + t) :=
fun t => mul_pos (hEpos n t) (by positivity)
have hRpos : 0 < (Qx n : ℝ) * (3 * T) - (Aq n : ℝ) := by
rw [← hs.tsum_eq]
exact hs.summable.tsum_pos (fun t => (hterm_pos t).le) 0 (hterm_pos 0)
refine ⟨hRpos, ?_⟩
have hB : (2 : ℝ) ^ (n + 1) / ((2 : ℝ) ^ n) ^ (2 * n) * (1 - 1 / 2)⁻¹ =
(2 : ℝ) ^ (n + 2) / ((2 : ℝ) ^ n) ^ (2 * n) := by
field_simp; ring
rw [hB] at hRle
have hpow : (2 : ℝ) ^ (4 * n * n) = (((2 : ℝ) ^ n) ^ (2 * n)) ^ 2 := by
rw [← pow_mul, ← pow_mul]; ring_nf
have hQ : (0 : ℝ) < ((2 : ℝ) ^ n) ^ (2 * n) := by positivity
rw [hpow]
calc ((Qx n : ℝ) * (3 * T) - (Aq n : ℝ)) ^ 2 * (((2 : ℝ) ^ n) ^ (2 * n)) ^ 2
= (((Qx n : ℝ) * (3 * T) - (Aq n : ℝ)) * ((2 : ℝ) ^ n) ^ (2 * n)) ^ 2 := by ring
_ ≤ ((2 : ℝ) ^ (n + 2)) ^ 2 := by
gcongr
rw [le_div_iff₀ hQ] at hRle; exact hRle
_ = (2 : ℝ) ^ (2 * n + 4) := by ring