Open Proof Network

Problems / erdos-1050 / spec-180d8b72

Padé remainder bound without the denominator hypothesis

spec-180d8b72 erdos_1050_pade_remainder_bound

proved

Proposed by a contributor.

$\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; with $x_n=3/2^n$, $Q_x(n)$ is the polynomial $\sum_k Q_c(n,k)X^k$ at $x_n$. 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}$. 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; there are no other hypotheses, and the doc comment's numerical check for $n\le 30$ is a comment, not part of what Lean checks.

unverified · history

Lean
theorem erdos_1050_pade_remainder_bound : ∀ (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 : ℕ),
                (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
  sorry
Why 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/fe09e6640e14….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 statement has no hypothesis about denominators; apart from that one missing hypothesis (and so one argument fewer in intro Qc hQc Qx hQx Aq hAq n) this proof's tactic script is the same, line for line, as that of erdos-1050--h1-v2--h4.

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_full combines 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.

  1. 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).
  2. By split3T and tail3, $3T=c_n+A$ with $c_n=\sum_{j<n}3/(2^{j+1}-3)$ (h4_series.h3T).
  3. 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).
  4. cauchy_fin with $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_coeff turns into the quotient of products, using id1_full for 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 from nd_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.

Improve these words →

History: 1 version on record
  1. 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/fe09e6640e14….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 statement has no hypothesis about denominators; apart from that one missing hypothesis (and so one argument fewer in intro Qc hQc Qx hQx Aq hAq n) this proof's tactic script is the same, line for line, as that of erdos-1050--h1-v2--h4.

    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_full combines 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_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$ (tail3 split3T)

    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 (cauchy_fin h4_series)

    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.

    1. 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).
    2. By split3T and tail3, $3T=c_n+A$ with $c_n=\sum_{j<n}3/(2^{j+1}-3)$ (h4_series.h3T).
    3. 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).
    4. cauchy_fin with $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_coeff turns into the quotient of products, using id1_full for 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_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$ (ineq_pow h4_big)

    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 from nd_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_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.

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, 000327, records the gate’s run.

The proof step by step (outline)

Checked by the kernel — an outline of the attested proof below: attestations/000327.json, merge commit dfc7b5cc45a9.

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.

  1. id1_test have ∀ (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 : ℕ), (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 : ℕ)), with id1_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.range range n is the set of natural numbers less than n. .

    Lean, lines 28–39
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 28–39 at dfc7b5cc45a9 ↗

    1. id1_test.s1 case routine: simp

      Leaves (∏ 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 : ℚ)), with hj : (0 : ℕ) ≤ n.

      Uses library Nat.zero Zero, the smallest natural number. .

      Lean, line 33
          | zero => simp

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 33 at dfc7b5cc45a9 ↗

    2. id1_test.s2 case

      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 : ℚ)), with j : ℕ, 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.succ The successor of a natural number n. , Finset.prod_range_succ.

      Lean, lines 34–39
          | 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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 34–39 at dfc7b5cc45a9 ↗

      1. 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 : ℚ)), with ih' : (∏ 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 35
              have ih' := ih (by omega)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 35 at dfc7b5cc45a9 ↗

      2. id1_test.s2.s2 obtain ∃ (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 : ℚ)), with m : ℕ, hm : n - j = m + (1 : ℕ).

        Uses library Exists.intro Existential introduction. .

        Lean, line 37
              obtain ⟨m, hm⟩ : ∃ m, n - j = m + 1 := ⟨n - j - 1, by omega⟩

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 37 at dfc7b5cc45a9 ↗

  2. lower_test have ∀ (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 : ℕ), (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 : ℕ)), with lower_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.range range n is the set of natural numbers less than n. , Finset.prod_congr, rfl rfl : a = a is the unique constructor of the equality type. , Finset.prod_mul_distrib, Finset.prod_pow_eq_pow_sum, Finset.prod_range_reflect.

    Lean, lines 41–55
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 41–55 at dfc7b5cc45a9 ↗

    1. lower_test.h1 have ∀ 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 : ℚ)), with h1 : ∀ i ∈ Finset.range j, (2 : ℚ) ^ j - (2 : ℚ) ^ i = (2 : ℚ) ^ i * ((2 : ℚ) ^ (j - (1 : ℕ) - i + (1 : ℕ)) - (1 : ℚ)).

      Uses library Finset.range range n is the set of natural numbers less than n. , mul_sub Alias of mul_sub_left_distrib. , pow_add.

      Lean, lines 45–49
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 45–49 at dfc7b5cc45a9 ↗

      1. lower_test.h1.hi' have i < j

        Leaves (2 : ℚ) ^ j - (2 : ℚ) ^ i = (2 : ℚ) ^ i * ((2 : ℚ) ^ (j - (1 : ℕ) - i + (1 : ℕ)) - (1 : ℚ)), with hi' : i < j.

        Uses library Finset.mem_range.

        Lean, line 47
              have hi' := Finset.mem_range.mp hi

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 47 at dfc7b5cc45a9 ↗

    2. lower_test.this have (∑ i ∈ Finset.range j, i) * (2 : ℕ) = j * (j - (1 : ℕ))

      Leaves ∑ i ∈ Finset.range j, i = j * (j - (1 : ℕ)) / (2 : ℕ), with this : (∑ i ∈ Finset.range j, i) * (2 : ℕ) = j * (j - (1 : ℕ)).

      Uses library Finset.sum_range_id_mul_two Gauss' summation formula .

      Lean, line 54
          have := Finset.sum_range_id_mul_two j

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 54 at dfc7b5cc45a9 ↗

  3. upper_test have ∀ (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 : ℕ), (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 : ℕ)), with upper_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.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.range range n is the set of natural numbers less than n. , Finset.prod_Ico_eq_prod_range, Finset.prod_congr, rfl rfl : a = a is the unique constructor of the equality type. , Finset.prod_mul_distrib, Finset.prod_const, Finset.card_range, pow_mul.

    Lean, lines 57–69
      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/spec-180d8b72/Proof.lean, lines 57–69 at dfc7b5cc45a9 ↗

    1. upper_test.e have Finset.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 : ℚ)), with e : Finset.Ioc j n = Finset.Ico (j + (1 : ℕ)) (n + (1 : ℕ)).

      Uses library Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.Ico The finset $[a, b)$ of elements x such that a ≤ x and x < b. , Finset.mem_Ioc, Finset.mem_Ico.

      Lean, lines 61–62
          have e : Finset.Ioc j n = Finset.Ico (j + 1) (n + 1) := by
            ext x; simp only [Finset.mem_Ioc, Finset.mem_Ico]; omega

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 61–62 at dfc7b5cc45a9 ↗

    2. upper_test.h1 have ∀ 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 : ℚ)), with h1 : ∀ t ∈ Finset.range (n - j), (2 : ℚ) ^ j - (2 : ℚ) ^ (j + (1 : ℕ) + t) = (-1 : ℚ) * (2 : ℚ) ^ j * ((2 : ℚ) ^ (t + (1 : ℕ)) - (1 : ℚ)).

      Uses library Finset.range range n is the set of natural numbers less than n. , pow_add.

      Lean, lines 64–67
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 64–67 at dfc7b5cc45a9 ↗

  4. rhs_test have ∀ (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 : ℕ), (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 : ℕ)), with rhs_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.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.range range n is the set of natural numbers less than n. , Finset.prod_Ico_eq_prod_range, Finset.prod_congr, rfl rfl : a = a is 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 71–87
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 71–87 at dfc7b5cc45a9 ↗

    1. rhs_test.e have Finset.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 : ℚ)), with e : Finset.Ioc n ((2 : ℕ) * n) = Finset.Ico (n + (1 : ℕ)) ((2 : ℕ) * n + (1 : ℕ)).

      Uses library Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.Ico The finset $[a, b)$ of elements x such that a ≤ x and x < b. , Finset.mem_Ioc, Finset.mem_Ico.

      Lean, lines 76–77
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 76–77 at dfc7b5cc45a9 ↗

    2. rhs_test.h1 have ∀ 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 : ℚ)), with h1 : ∀ t ∈ Finset.range n, (2 : ℚ) ^ j - (2 : ℚ) ^ (n + (1 : ℕ) + t) = (-1 : ℚ) * (2 : ℚ) ^ j * ((2 : ℚ) ^ (n - j + t + (1 : ℕ)) - (1 : ℚ)).

      Uses library Finset.range range n is the set of natural numbers less than n. , pow_add.

      Lean, lines 79–83
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 79–83 at dfc7b5cc45a9 ↗

  5. id1_full have ∀ (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 : ℕ), (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 : ℕ)), with id1_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.range range n is the set of natural numbers less than n. , Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.prod_union, mul_right_cancel₀, pow_add.

    Lean, lines 89–132
      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/spec-180d8b72/Proof.lean, lines 89–132 at dfc7b5cc45a9 ↗

    1. id1_full.hPne have ∀ (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), with hPne : ∀ (m : ℕ), ∏ s ∈ Finset.range m, ((2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ)) ≠ (0 : ℚ).

      Uses library Finset.range range n is the set of natural numbers less than n. , Finset.prod_ne_zero_iff.

      Lean, lines 96–100
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 96–100 at dfc7b5cc45a9 ↗

      1. id1_full.hPne.this have (1 : ℚ) < (2 : ℚ) ^ (s + (1 : ℕ))

        Leaves (2 : ℚ) ^ (s + (1 : ℕ)) - (1 : ℚ) ≠ (0 : ℚ), with this : (1 : ℚ) < (2 : ℚ) ^ (s + (1 : ℕ)).

        Uses library one_lt_pow₀.

        Lean, line 99
              have : (1 : ℚ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 99 at dfc7b5cc45a9 ↗

    2. id1_full.hG1 have ∏ 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), with 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 : ℚ))).

      Uses library Finset.range range n is the set of natural numbers less than n. , Finset.prod_div_distrib.

      Lean, lines 101–105
          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/spec-180d8b72/Proof.lean, lines 101–105 at dfc7b5cc45a9 ↗

    3. id1_full.hG2 have ∏ 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), with 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 : ℚ))).

      Uses library Finset.range range n is the set of natural numbers less than n. , Finset.prod_div_distrib.

      Lean, lines 106–110
          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/spec-180d8b72/Proof.lean, lines 106–110 at dfc7b5cc45a9 ↗

    4. id1_full.hsplit have (Finset.range (n + (1 : ℕ))).erase j = 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), with hsplit : (Finset.range (n + (1 : ℕ))).erase j = Finset.range j ∪ Finset.Ioc j n.

      Uses library Finset.range range n is the set of natural numbers less than n. , Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.mem_erase, Finset.mem_range, Finset.mem_union, Finset.mem_Ioc.

      Lean, lines 111–112
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 111–112 at dfc7b5cc45a9 ↗

    5. id1_full.hdisj have Disjoint (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), with hdisj : Disjoint (Finset.range j) (Finset.Ioc j n).

      Uses library Disjoint Two elements of a lattice are disjoint if their inf is the bottom element. , Finset.range range n is the set of natural numbers less than n. , Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.disjoint_left, Finset.mem_range, Finset.mem_Ioc.

      Lean, lines 113–117
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 113–117 at dfc7b5cc45a9 ↗

    6. id1_full.hR have (∏ 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), with hR : (∏ 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 118
          have hR := rhs_test j n hj

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 118 at dfc7b5cc45a9 ↗

    7. id1_full.s7 obtain ∃ (k : ℕ), n = j + k

      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), with m : ℕ, 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 119
          obtain ⟨m, rfl⟩ := Nat.exists_eq_add_of_le hj

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 119 at dfc7b5cc45a9 ↗

    8. id1_full.hsign have (-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), with hsign : (-1 : ℚ) ^ (j + m) = (-1 : ℚ) ^ j * (-1 : ℚ) ^ (j + m - j).

      Uses library pow_add.

      Lean, lines 120–121
          have hsign : (-1 : ℚ) ^ (j + m) = (-1) ^ j * (-1) ^ (j + m - j) := by
            rw [← pow_add]; congr 1; omega

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 120–121 at dfc7b5cc45a9 ↗

    9. id1_full.ha have (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), with ha : (2 : ℕ) * (j * (j - (1 : ℕ)) / (2 : ℕ)) = j * (j - (1 : ℕ)).

      Uses library Nat.two_mul_div_two_of_even, Nat.even_mul_pred_self.

      Lean, line 122
          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/spec-180d8b72/Proof.lean, line 122 at dfc7b5cc45a9 ↗

    10. id1_full.hexp have j * (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), with hexp : j * (j + m) = j * (j - (1 : ℕ)) / (2 : ℕ) + j + j * (j - (1 : ℕ)) / (2 : ℕ) + j * (j + m - j).

      Lean, lines 123–128
          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/spec-180d8b72/Proof.lean, lines 123–128 at dfc7b5cc45a9 ↗

      1. id1_full.hexp.s1 case routine: simp

        Leaves (0 : ℕ) * ((0 : ℕ) + m) = (0 : ℕ) * ((0 : ℕ) - (1 : ℕ)) / (2 : ℕ) + (0 : ℕ) + (0 : ℕ) * ((0 : ℕ) - (1 : ℕ)) / (2 : ℕ) + (0 : ℕ) * m.

        Lean, line 126
              · simp

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 126 at dfc7b5cc45a9 ↗

      2. id1_full.hexp.s2 case routine: simp, nlinarith

        Leaves (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 127–128
              · simp only [Nat.add_sub_cancel] at ha ⊢
                nlinarith [ha]

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 127–128 at dfc7b5cc45a9 ↗

  6. lagr_eval have ∀ (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 : ℕ), (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 : ℕ)), with lagr_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.range range n is the set of natural numbers less than n. , Polynomial.C C a is the constant polynomial a. , Polynomial.X X is the polynomial variable (aka indeterminate). , Polynomial.eq_of_degree_sub_lt_of_eval_finset_eq.

    Lean, lines 135–168
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 135–168 at dfc7b5cc45a9 ↗

    1. lagr_eval.hinj have Set.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)), with hinj : Set.InjOn x (↑(Finset.range (n + (1 : ℕ))) : Set ℕ).

      Uses library Set.InjOn f is injective on s if the restriction of f to s is injective. , Finset.range range n is the set of natural numbers less than n. , Set A set is a collection of elements of some type α. , Finset.coe_range, Set.mem_Iio.

      Lean, lines 140–143
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 140–143 at dfc7b5cc45a9 ↗

    2. lagr_eval.s2 case

      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))).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 145–158
          · 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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 145–158 at dfc7b5cc45a9 ↗

      1. lagr_eval.s2.s1 case

        Leaves N.degree < (↑(n + (1 : ℕ)) : WithBot ℕ).

        Uses library lt_of_le_of_lt, Nat.lt_succ_self.

        Lean, line 147
              · exact lt_of_le_of_lt hNdeg (by exact_mod_cast Nat.lt_succ_self n)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 147 at dfc7b5cc45a9 ↗

      2. lagr_eval.s2.s2 case

        Leaves (∑ 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 148–158
              · 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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 148–158 at dfc7b5cc45a9 ↗

        1. lagr_eval.s2.s2.this have ∑ 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 ℕ), with this : ∑ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (Polynomial.X - (Polynomial.C : ℚ → Polynomial ℚ) (x i)).degree = (↑n : WithBot ℕ).

          Uses library Finset.range range n is the set of natural numbers less than n. , Polynomial.X X is the polynomial variable (aka indeterminate). , Polynomial.C C a is the constant polynomial a. , WithBot Attach ⊥ to a type. , Finset.sum_congr, rfl rfl : a = a is 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 153–156
                  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

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 153–156 at dfc7b5cc45a9 ↗

    3. lagr_eval.s3 case

      Leaves ∀ 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_sum Alias of Polynomial.eval_finsetSum. , Finset.sum_eq_single.

      Lean, lines 159–168
          · 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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 159–168 at dfc7b5cc45a9 ↗

      1. lagr_eval.s3.s1 obtain ∃ a ∈ Finset.range (n + (1 : ℕ)), x a = y

        Leaves 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))), with k : ℕ, hk : k ∈ Finset.range (n + (1 : ℕ)), hy : x k ∈ Finset.image x (Finset.range (n + (1 : ℕ))).

        Uses library Finset.mem_image.

        Lean, line 160
              obtain ⟨k, hk, rfl⟩ := Finset.mem_image.mp hy

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 160 at dfc7b5cc45a9 ↗

      2. lagr_eval.s3.hk' have k ≤ n

        Leaves 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))), with hk' : k ≤ n.

        Lean, line 161
              have hk' : k ≤ n := by have := Finset.mem_range.mp hk; omega

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 161 at dfc7b5cc45a9 ↗

        1. lagr_eval.s3.hk'.this have k < n + (1 : ℕ)

          Leaves k ≤ n, with this : k < n + (1 : ℕ).

          Uses library Finset.mem_range.

          Lean, line 161
                have hk' : k ≤ n := by have := Finset.mem_range.mp hk; omega

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 161 at dfc7b5cc45a9 ↗

      3. lagr_eval.s3.s3 case routine: simp

        Leaves 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_prod Polynomial evaluation commutes with Finset.prod .

        Lean, line 163
              · simp [Polynomial.eval_prod]

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 163 at dfc7b5cc45a9 ↗

      4. lagr_eval.s3.s4 case

        Leaves ∀ 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_prod Polynomial evaluation commutes with Finset.prod , Polynomial.eval_sub, Polynomial.eval_X, Finset.prod_eq_zero, Finset.mem_erase, And.intro And.intro : a → b → a ∧ b is the constructor for the And operation. , Ne.symm, MulZeroClass.mul_zero Zero is a right absorbing element for multiplication .

        Lean, lines 164–167
              · 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/spec-180d8b72/Proof.lean, lines 164–167 at dfc7b5cc45a9 ↗

      5. lagr_eval.s3.s5 case

        Leaves 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 absurd Anything follows from two contradictory hypotheses. .

        Lean, line 168
              · intro h; exact absurd hk h

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 168 at dfc7b5cc45a9 ↗

  7. tail_coeff have ∀ (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 : ℕ), (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 : ℕ)), with tail_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.range range n is the set of natural numbers less than n. , Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Polynomial.X X is the polynomial variable (aka indeterminate). , Polynomial.C C a is the constant polynomial a. , Polynomial.eval_finset_sum Alias of Polynomial.eval_finsetSum. , Finset.sum_div, Finset.sum_congr, rfl rfl : a = a is the unique constructor of the equality type. , Polynomial.eval_mul, Polynomial.eval_C, Polynomial.eval_prod Polynomial evaluation commutes with Finset.prod , Polynomial.eval_sub, Polynomial.eval_X, Finset.mul_prod_erase Taking a product over s : Finset ι is the same as multiplying the value on a single element f a by the product of s.erase a. .

    Lean, lines 170–222
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 170–222 at dfc7b5cc45a9 ↗

    1. tail_coeff.hxinj have ∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j

      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), with hxinj : ∀ i ≤ n, ∀ j ≤ n, x i = x j → i = j.

      Uses library Nat.pow_right_injective, le_refl The relation ≤ on a preorder is reflexive. .

      Lean, lines 177–180
          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/spec-180d8b72/Proof.lean, lines 177–180 at dfc7b5cc45a9 ↗

      1. tail_coeff.hxinj.h' have (2 : ℚ) ^ i = (2 : ℚ) ^ j

        Leaves i = j, with h' : (2 : ℚ) ^ i = (2 : ℚ) ^ j.

        Lean, line 179
              have h' : (2 : ℚ) ^ i = 2 ^ j := h

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 179 at dfc7b5cc45a9 ↗

    2. tail_coeff.hxne have ∀ (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), with hxne : ∀ (a b : ℕ), a ≠ b → (2 : ℚ) ^ a - (2 : ℚ) ^ b ≠ (0 : ℚ).

      Uses library Nat.pow_right_injective, le_refl The relation ≤ on a preorder is reflexive. , sub_eq_zero.

      Lean, lines 181–184
          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/spec-180d8b72/Proof.lean, lines 181–184 at dfc7b5cc45a9 ↗

    3. tail_coeff.hNdeg have N.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), with hNdeg : N.degree ≤ (↑n : WithBot ℕ).

      Uses library Polynomial.degree_prod The 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, rfl rfl : a = a is the unique constructor of the equality type. , Polynomial.degree_X_sub_C, Finset.sum_const, Nat.card_Ioc.

      Lean, lines 186–191
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 186–191 at dfc7b5cc45a9 ↗

    4. tail_coeff.hr have ∀ j ≤ n, Qc n j * (2 : ℚ) ^ j * ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, (x j - x i) = Polynomial.eval (x j) N

      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), with hr : ∀ 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.range range n is the set of natural numbers less than n. , Polynomial.eval_prod Polynomial evaluation commutes with Finset.prod , Polynomial.eval_sub, Polynomial.eval_X, Polynomial.eval_C.

      Lean, lines 192–196
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 192–196 at dfc7b5cc45a9 ↗

    5. tail_coeff.hL have 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))

      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), with hL : 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 197
          have hL := lagr_eval n x hxinj N hNdeg (fun j => Qc n j * 2 ^ j) hr

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 197 at dfc7b5cc45a9 ↗

    6. tail_coeff.hev have 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)))

      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), with hev : 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 congrArg Congruence in the function argument: if a₁ = a₂ then f a₁ = f a₂ for any (nondependent) function f. , Polynomial.eval eval x p is the evaluation of the polynomial p at x .

      Lean, line 198
          have hev := congrArg (Polynomial.eval ((2 : ℚ) ^ K)) hL

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 198 at dfc7b5cc45a9 ↗

    7. tail_coeff.hNK have Polynomial.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), with hNK : Polynomial.eval ((2 : ℚ) ^ K) N = ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℚ) ^ K - (2 : ℚ) ^ L).

      Uses library Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Polynomial.eval_prod Polynomial evaluation commutes with Finset.prod , Polynomial.eval_sub, Polynomial.eval_X, Polynomial.eval_C.

      Lean, lines 200–202
          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/spec-180d8b72/Proof.lean, lines 200–202 at dfc7b5cc45a9 ↗

    8. tail_coeff.hD have ∏ 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), with hD : ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℚ) ^ K - (2 : ℚ) ^ i) ≠ (0 : ℚ).

      Uses library Finset.range range n is the set of natural numbers less than n. , Finset.prod_ne_zero_iff.

      Lean, lines 203–204
          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/spec-180d8b72/Proof.lean, lines 203–204 at dfc7b5cc45a9 ↗

      1. tail_coeff.hD.this have i < n + (1 : ℕ)

        Leaves K ≠ i, with this : i < n + (1 : ℕ).

        Uses library Finset.mem_range.

        Lean, line 204
              Finset.prod_ne_zero_iff.mpr (fun i hi => hxne K i (by have := Finset.mem_range.mp hi; omega))

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 204 at dfc7b5cc45a9 ↗

    9. tail_coeff.hjn have j < 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), with hjn : j < n + (1 : ℕ).

      Uses library Finset.mem_range.

      Lean, line 208
          have hjn : j < n + 1 := Finset.mem_range.mp hj

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 208 at dfc7b5cc45a9 ↗

    10. tail_coeff.hne1 have (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), with hne1 : (2 : ℚ) ^ K - (2 : ℚ) ^ j ≠ (0 : ℚ).

      Lean, line 209
          have hne1 : (2 : ℚ) ^ K - 2 ^ j ≠ 0 := hxne K j (by omega)

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 209 at dfc7b5cc45a9 ↗

    11. tail_coeff.hne2 have (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), with hne2 : (2 : ℚ) ^ (K - j) - (1 : ℚ) ≠ (0 : ℚ).

      Lean, lines 210–212
          have hne2 : (2 : ℚ) ^ (K - j) - 1 ≠ 0 := by
            have : (1 : ℚ) < 2 ^ (K - j) := one_lt_pow₀ (by norm_num) (by omega)
            linarith

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 210–212 at dfc7b5cc45a9 ↗

      1. tail_coeff.hne2.this have (1 : ℚ) < (2 : ℚ) ^ (K - j)

        Leaves (2 : ℚ) ^ (K - j) - (1 : ℚ) ≠ (0 : ℚ), with this : (1 : ℚ) < (2 : ℚ) ^ (K - j).

        Uses library one_lt_pow₀.

        Lean, line 211
              have : (1 : ℚ) < 2 ^ (K - j) := one_lt_pow₀ (by norm_num) (by omega)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 211 at dfc7b5cc45a9 ↗

    12. tail_coeff.hE have ∏ 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)), with hE : ∏ i ∈ (Finset.range (n + (1 : ℕ))).erase j, ((2 : ℚ) ^ K - (2 : ℚ) ^ i) ≠ (0 : ℚ).

      Uses library Finset.range range n is the set of natural numbers less than n. , Finset.prod_ne_zero_iff.

      Lean, lines 216–218
          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/spec-180d8b72/Proof.lean, lines 216–218 at dfc7b5cc45a9 ↗

      1. tail_coeff.hE.this have i < n + (1 : ℕ)

        Leaves K ≠ i, with this : i < n + (1 : ℕ).

        Uses library Finset.mem_range, Finset.mem_of_mem_erase.

        Lean, line 218
                have := Finset.mem_range.mp (Finset.mem_of_mem_erase hi); omega))

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 218 at dfc7b5cc45a9 ↗

    13. tail_coeff.hpow have (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)), with hpow : (2 : ℚ) ^ K = (2 : ℚ) ^ j * (2 : ℚ) ^ (K - j).

      Uses library pow_add.

      Lean, line 219
          have hpow : (2 : ℚ) ^ K = 2 ^ j * 2 ^ (K - j) := by rw [← pow_add]; congr 1; omega

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 219 at dfc7b5cc45a9 ↗

  8. tail3 have ∀ (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 : ℕ), (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 : ℕ)), with tail3 : ∀ (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 225–289
      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/spec-180d8b72/Proof.lean, lines 225–289 at dfc7b5cc45a9 ↗

    1. tail3.key have ∀ (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 : ℝ)), with key : ∀ (m s : ℕ), f m s = ((3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ))) ^ (s + (1 : ℕ)).

      Uses library div_pow, one_pow, pow_mul, pow_add.

      Lean, lines 229–235
          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/spec-180d8b72/Proof.lean, lines 229–235 at dfc7b5cc45a9 ↗

    2. tail3.hpos have ∀ (m s : ℕ), (0 : ℝ) ≤ f m s

      Leaves ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), with hpos : ∀ (m s : ℕ), (0 : ℝ) ≤ f m s.

      Lean, line 236
          have hpos : ∀ m s, 0 ≤ f m s := fun m s => by rw [key]; positivity

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 236 at dfc7b5cc45a9 ↗

    3. tail3.h4 have ∀ (m : ℕ), (4 : ℝ) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ))

      Leaves ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), with h4 : ∀ (m : ℕ), (4 : ℝ) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ)).

      Lean, lines 237–240
          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/spec-180d8b72/Proof.lean, lines 237–240 at dfc7b5cc45a9 ↗

      1. tail3.h4.s1 calc (4 : ℝ) = (2 : ℝ) ^ (2 : ℕ) routine: norm_num

        Closes the goal.

        Lean, line 239
              calc (4 : ℝ) = 2 ^ 2 := by norm_num

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 239 at dfc7b5cc45a9 ↗

      2. tail3.h4.s2 calc (2 : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ))

        Closes the goal.

        Uses library pow_le_pow_right₀.

        Lean, line 240
                _ ≤ 2 ^ (m + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 240 at dfc7b5cc45a9 ↗

    4. tail3.inner1 have ∀ (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 : ℝ)), with inner1 : ∀ (m : ℕ), HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))).

      Uses library HasSum HasSum f a L means that the (potentially infinite) sum of the f b for b : β converges to a along the SummationFilter L. .

      Lean, lines 241–255
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 241–255 at dfc7b5cc45a9 ↗

      1. tail3.inner1.hr0 have (0 : ℝ) ≤ (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) routine: positivity

        Leaves HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), with hr0 : (0 : ℝ) ≤ (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)).

        Lean, line 243
              have hr0 : 0 ≤ (3 : ℝ) / 2 ^ (m + n + 1) := by positivity

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 243 at dfc7b5cc45a9 ↗

      2. tail3.inner1.hr1 have (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) < (1 : ℝ)

        Leaves HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), with hr1 : (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) < (1 : ℝ).

        Uses library div_lt_one.

        Lean, lines 244–245
              have hr1 : (3 : ℝ) / 2 ^ (m + n + 1) < 1 := by
                rw [div_lt_one (by positivity)]; linarith [h4 m]

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 244–245 at dfc7b5cc45a9 ↗

      3. tail3.inner1.hg have 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 : ℕ)))⁻¹)

        Leaves HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), with hg : 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 246
              have hg := (hasSum_geometric_of_lt_one hr0 hr1).mul_left ((3 : ℝ) / 2 ^ (m + n + 1))

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 246 at dfc7b5cc45a9 ↗

      4. tail3.inner1.hfun have f m = fun (s : ℕ) => (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ))) ^ s

        Leaves HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), with hfun : f m = fun (s : ℕ) => (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ))) ^ s.

        Lean, lines 247–248
              have hfun : f m = fun s => (3 : ℝ) / 2 ^ (m + n + 1) * ((3 : ℝ) / 2 ^ (m + n + 1)) ^ s := by
                funext s; rw [key]; ring

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 247–248 at dfc7b5cc45a9 ↗

      5. tail3.inner1.hne have (2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ) ≠ (0 : ℝ) routine: linarith

        Leaves HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), with hne : (2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ) ≠ (0 : ℝ).

        Lean, line 249
              have hne : (2 : ℝ) ^ (m + n + 1) - 3 ≠ 0 := by linarith [h4 m]

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 249 at dfc7b5cc45a9 ↗

      6. tail3.inner1.hne2 have (2 : ℝ) ^ (m + n + (1 : ℕ)) ≠ (0 : ℝ) routine: positivity

        Leaves HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), with hne2 : (2 : ℝ) ^ (m + n + (1 : ℕ)) ≠ (0 : ℝ).

        Lean, line 250
              have hne2 : (2 : ℝ) ^ (m + n + 1) ≠ 0 := by positivity

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 250 at dfc7b5cc45a9 ↗

      7. tail3.inner1.hval have (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((1 : ℝ) - (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)))⁻¹ routine: field_simp

        Leaves HasSum (f m) ((3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ))), with hval : (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)) * ((1 : ℝ) - (3 : ℝ) / (2 : ℝ) ^ (m + n + (1 : ℕ)))⁻¹.

        Lean, lines 251–253
              have hval : (3 : ℝ) / (2 ^ (m + n + 1) - 3) =
                  3 / 2 ^ (m + n + 1) * (1 - 3 / 2 ^ (m + n + 1))⁻¹ := by
                field_simp

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 251–253 at dfc7b5cc45a9 ↗

    5. tail3.inner2 have ∀ (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 : ℝ)), with inner2 : ∀ (s : ℕ), HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))).

      Uses library HasSum HasSum f a L means that the (potentially infinite) sum of the f b for b : β converges to a along the SummationFilter L. .

      Lean, lines 256–272
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 256–272 at dfc7b5cc45a9 ↗

      1. tail3.inner2.hr0 have (0 : ℝ) ≤ (1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ)) routine: positivity

        Leaves HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))), with hr0 : (0 : ℝ) ≤ (1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ)).

        Lean, line 258
              have hr0 : 0 ≤ (1 : ℝ) / 2 ^ (s + 1) := by positivity

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 258 at dfc7b5cc45a9 ↗

      2. tail3.inner2.hr1 have (1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ)) < (1 : ℝ)

        Leaves HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))), with hr1 : (1 : ℝ) / (2 : ℝ) ^ (s + (1 : ℕ)) < (1 : ℝ).

        Uses library div_lt_one, one_lt_pow₀.

        Lean, lines 259–261
              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/spec-180d8b72/Proof.lean, lines 259–261 at dfc7b5cc45a9 ↗

      3. tail3.inner2.hg have 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 : ℕ)))⁻¹)

        Leaves HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))), with hg : 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 262
              have hg := (hasSum_geometric_of_lt_one hr0 hr1).mul_left (((3 : ℝ) / 2 ^ (n + 1)) ^ (s + 1))

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 262 at dfc7b5cc45a9 ↗

      4. tail3.inner2.hne have (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ) ≠ (0 : ℝ)

        Leaves HasSum (fun (m : ℕ) => f m s) (((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ))), with hne : (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ) ≠ (0 : ℝ).

        Lean, lines 263–265
              have hne : (2 : ℝ) ^ (s + 1) - 1 ≠ 0 := by
                have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega)
                linarith

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 263–265 at dfc7b5cc45a9 ↗

        1. tail3.inner2.hne.this have (1 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ))

          Leaves (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ) ≠ (0 : ℝ), with this : (1 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ)).

          Uses library one_lt_pow₀.

          Lean, line 264
                  have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega)

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 264 at dfc7b5cc45a9 ↗

      5. tail3.inner2.hval have ((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 : ℝ))), with hval : ((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 266–270
              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/spec-180d8b72/Proof.lean, lines 266–270 at dfc7b5cc45a9 ↗

    6. tail3.hsum1 have Summable 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 : ℝ)), with hsum1 : Summable fun (m : ℕ) => (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)).

      Uses library Summable Summable f means that f has some (infinite) sum with respect to L. , Summable.of_nonneg_of_le Comparison test of convergence of series of non-negative real numbers. , summable_geometric_two.

      Lean, lines 273–281
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 273–281 at dfc7b5cc45a9 ↗

      1. tail3.hsum1.s1 case

        Leaves (0 : ℝ) ≤ (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)).

        Uses library div_nonneg.

        Lean, line 275
              · have := h4 m; exact div_nonneg (by norm_num) (by linarith)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 275 at dfc7b5cc45a9 ↗

        1. tail3.hsum1.s1.this have (4 : ℝ) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ))

          Leaves (0 : ℝ) ≤ (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), with this : (4 : ℝ) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ)).

          Lean, line 275
                · have := h4 m; exact div_nonneg (by norm_num) (by linarith)

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 275 at dfc7b5cc45a9 ↗

      2. tail3.hsum1.s2 case

        Leaves (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m.

        Lean, lines 276–281
              · 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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 276–281 at dfc7b5cc45a9 ↗

        1. tail3.hsum1.s2.hpow have (2 : ℝ) ^ (m + (2 : ℕ)) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ))

          Leaves (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, with hpow : (2 : ℝ) ^ (m + (2 : ℕ)) ≤ (2 : ℝ) ^ (m + n + (1 : ℕ)).

          Uses library pow_le_pow_right₀.

          Lean, line 276
                · have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + n + 1) := pow_le_pow_right₀ (by norm_num) (by omega)

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 276 at dfc7b5cc45a9 ↗

        2. tail3.hsum1.s2.h1 have (1 : ℝ) ≤ (2 : ℝ) ^ m

          Leaves (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, with h1 : (1 : ℝ) ≤ (2 : ℝ) ^ m.

          Uses library one_le_pow₀.

          Lean, line 277
                  have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num)

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 277 at dfc7b5cc45a9 ↗

        3. tail3.hsum1.s2.h2 have (2 : ℝ) ^ (m + (2 : ℕ)) = (4 : ℝ) * (2 : ℝ) ^ m

          Leaves (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, with h2 : (2 : ℝ) ^ (m + (2 : ℕ)) = (4 : ℝ) * (2 : ℝ) ^ m.

          Uses library pow_add.

          Lean, line 278
                  have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 278 at dfc7b5cc45a9 ↗

        4. tail3.hsum1.s2.s4 calc (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) / (2 : ℝ) ^ m

          Closes the goal.

          Uses library div_le_div_of_nonneg_left.

          Lean, lines 279–280
                  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/spec-180d8b72/Proof.lean, lines 279–280 at dfc7b5cc45a9 ↗

        5. tail3.hsum1.s2.s5 calc

          Closes the goal.

          Uses library one_div_pow.

          Lean, line 281
                    _ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ring

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 281 at dfc7b5cc45a9 ↗

    7. tail3.hU have Summable (Function.uncurry f)

      Leaves ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), with hU : Summable (Function.uncurry f).

      Uses library Summable Summable f means that f has some (infinite) sum with respect to L. , Function.uncurry Transforms a two-parameter function into an equivalent function from pairs. , summable_prod_of_nonneg, And.intro And.intro : a → b → a ∧ b is the constructor for the And operation. .

      Lean, lines 282–284
          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/spec-180d8b72/Proof.lean, lines 282–284 at dfc7b5cc45a9 ↗

    8. tail3.hcomm have ∑' (c : ℕ) (b : ℕ), f b c = ∑' (b : ℕ) (c : ℕ), f b c

      Leaves ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (s : ℕ), ((3 : ℝ) / (2 : ℝ) ^ n) ^ (s + (1 : ℕ)) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)), with hcomm : ∑' (c : ℕ) (b : ℕ), f b c = ∑' (b : ℕ) (c : ℕ), f b c.

      Lean, line 285
          have hcomm := hU.tsum_comm' (fun m => (inner1 m).summable) (fun s => (inner2 s).summable)

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 285 at dfc7b5cc45a9 ↗

  9. split3T have ∀ (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 : ℕ), (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 : ℕ)), with 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 : ℝ)).

    Uses library Finset.range range n is the set of natural numbers less than n. , zero_add.

    Lean, lines 291–329
      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/spec-180d8b72/Proof.lean, lines 291–329 at dfc7b5cc45a9 ↗

    1. split3T.hsum have Summable 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 : ℝ)), with hsum : Summable fun (m : ℕ) => g (m + (1 : ℕ)).

      Uses library Summable Summable f means that f has some (infinite) sum with respect to L. , Summable.of_nonneg_of_le Comparison test of convergence of series of non-negative real numbers. , summable_geometric_two.

      Lean, lines 296–308
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 296–308 at dfc7b5cc45a9 ↗

      1. split3T.hsum.s1 case

        Leaves (0 : ℝ) ≤ g (m + (1 : ℕ)).

        Uses library div_nonneg.

        Lean, lines 298–301
              · 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/spec-180d8b72/Proof.lean, lines 298–301 at dfc7b5cc45a9 ↗

        1. split3T.hsum.s1.this have (4 : ℝ) ≤ (2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ))

          Leaves (0 : ℝ) ≤ g (m + (1 : ℕ)), with this : (4 : ℝ) ≤ (2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ)).

          Lean, lines 298–300
                · 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/spec-180d8b72/Proof.lean, lines 298–300 at dfc7b5cc45a9 ↗

          1. split3T.hsum.s1.this.s1 calc (4 : ℝ) = (2 : ℝ) ^ (2 : ℕ) routine: norm_num

            Closes the goal.

            Lean, line 299
                      calc (4 : ℝ) = 2 ^ 2 := by norm_num

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 299 at dfc7b5cc45a9 ↗

          2. split3T.hsum.s1.this.s2 calc (2 : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ))

            Closes the goal.

            Uses library pow_le_pow_right₀.

            Lean, line 300
                        _ ≤ 2 ^ (m + 1 + 1) := pow_le_pow_right₀ (by norm_num) (by omega)

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 300 at dfc7b5cc45a9 ↗

      2. split3T.hsum.s2 case

        Leaves g (m + (1 : ℕ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m.

        Lean, lines 302–308
              · 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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 302–308 at dfc7b5cc45a9 ↗

        1. split3T.hsum.s2.hpow have (2 : ℝ) ^ (m + (2 : ℕ)) ≤ (2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ))

          Leaves g (m + (1 : ℕ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, with hpow : (2 : ℝ) ^ (m + (2 : ℕ)) ≤ (2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ)).

          Uses library le_of_eq.

          Lean, line 302
                · have hpow : (2 : ℝ) ^ (m + 2) ≤ 2 ^ (m + 1 + 1) := le_of_eq (by ring_nf)

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 302 at dfc7b5cc45a9 ↗

        2. split3T.hsum.s2.h1 have (1 : ℝ) ≤ (2 : ℝ) ^ m

          Leaves g (m + (1 : ℕ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, with h1 : (1 : ℝ) ≤ (2 : ℝ) ^ m.

          Uses library one_le_pow₀.

          Lean, line 303
                  have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num)

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 303 at dfc7b5cc45a9 ↗

        3. split3T.hsum.s2.h2 have (2 : ℝ) ^ (m + (2 : ℕ)) = (4 : ℝ) * (2 : ℝ) ^ m

          Leaves g (m + (1 : ℕ)) ≤ (3 : ℝ) * (1 / 2 : ℝ) ^ m, with h2 : (2 : ℝ) ^ (m + (2 : ℕ)) = (4 : ℝ) * (2 : ℝ) ^ m.

          Uses library pow_add.

          Lean, line 304
                  have h2 : (2 : ℝ) ^ (m + 2) = 4 * 2 ^ m := by rw [pow_add]; ring

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 304 at dfc7b5cc45a9 ↗

        4. split3T.hsum.s2.s4 calc (3 : ℝ) / ((2 : ℝ) ^ (m + (1 : ℕ) + (1 : ℕ)) - (3 : ℝ)) ≤ (3 : ℝ) / (2 : ℝ) ^ m

          Closes the goal.

          Uses library div_le_div_of_nonneg_left.

          Lean, lines 306–307
                  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/spec-180d8b72/Proof.lean, lines 306–307 at dfc7b5cc45a9 ↗

        5. split3T.hsum.s2.s5 calc

          Closes the goal.

          Uses library one_div_pow.

          Lean, line 308
                    _ = 3 * (1 / 2) ^ m := by rw [one_div_pow]; ring

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 308 at dfc7b5cc45a9 ↗

    2. split3T.hs have Summable g

      Leaves (3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = (Finset.range n).sum g + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), with hs : Summable g.

      Uses library Summable Summable f means that f has some (infinite) sum with respect to L. , summable_nat_add_iff.

      Lean, line 309
          have hs : Summable g := (summable_nat_add_iff 1).mp hsum

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 309 at dfc7b5cc45a9 ↗

    3. split3T.e1 have ∑ i ∈ Finset.range n, g i + ∑' (i : ℕ), g (i + n) = ∑' (i : ℕ), g i

      Leaves (3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = (Finset.range n).sum g + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), with e1 : ∑ i ∈ Finset.range n, g i + ∑' (i : ℕ), g (i + n) = ∑' (i : ℕ), g i.

      Lean, line 310
          have e1 := hs.sum_add_tsum_nat_add n

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 310 at dfc7b5cc45a9 ↗

    4. split3T.e2 have ∑ i ∈ Finset.range (2 : ℕ), g i + ∑' (i : ℕ), g (i + (2 : ℕ)) = ∑' (i : ℕ), g i

      Leaves (3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = (Finset.range n).sum g + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), with e2 : ∑ i ∈ Finset.range (2 : ℕ), g i + ∑' (i : ℕ), g (i + (2 : ℕ)) = ∑' (i : ℕ), g i.

      Lean, line 311
          have e2 := hs.sum_add_tsum_nat_add 2

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 311 at dfc7b5cc45a9 ↗

    5. split3T.h3T have (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 : ℝ)), with h3T : (3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = ∑' (m : ℕ), g (m + (2 : ℕ)).

      Uses library tsum_mul_left, tsum_congr.

      Lean, lines 312–317
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 312–317 at dfc7b5cc45a9 ↗

    6. split3T.hfirst have ∑ i ∈ Finset.range (2 : ℕ), g i = (0 : ℝ) routine: simp, norm_num

      Leaves (3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = (Finset.range n).sum g + ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)), with hfirst : ∑ i ∈ Finset.range (2 : ℕ), g i = (0 : ℝ).

      Uses library Finset.range range n is the set of natural numbers less than n. , Finset.sum_range_succ, Finset.sum_range_zero.

      Lean, lines 318–320
          have hfirst : ∑ i ∈ Finset.range 2, g i = 0 := by
            simp only [hg, Finset.sum_range_succ, Finset.sum_range_zero]
            norm_num

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 318–320 at dfc7b5cc45a9 ↗

    7. split3T.htail have ∑' (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 : ℝ)), with htail : ∑' (m : ℕ), (3 : ℝ) / ((2 : ℝ) ^ (m + n + (1 : ℕ)) - (3 : ℝ)) = ∑' (m : ℕ), g (m + n).

      Uses library tsum_congr.

      Lean, lines 322–324
          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/spec-180d8b72/Proof.lean, lines 322–324 at dfc7b5cc45a9 ↗

    8. split3T.hrange have ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ)) = ∑ i ∈ Finset.range n, g i routine: simp

      Leaves ∑' (m : ℕ), g (m + (2 : ℕ)) = (Finset.range n).sum g + ∑' (m : ℕ), g (m + n), with hrange : ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ)) = ∑ i ∈ Finset.range n, g i.

      Uses library Finset.range range n is the set of natural numbers less than n. .

      Lean, lines 326–327
          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/spec-180d8b72/Proof.lean, lines 326–327 at dfc7b5cc45a9 ↗

  10. cauchy_fin have ∀ (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 : ℕ), (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 : ℕ)), with cauchy_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 HasSum HasSum f a L means that the (potentially infinite) sum of the f b for b : β converges to a along the SummationFilter L. , Finset.range range n is the set of natural numbers less than n. , Finset.sum_mul, hasSum_sum, hasSum_nat_add_iff', sub_zero.

    Lean, lines 331–351
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 331–351 at dfc7b5cc45a9 ↗

    1. cauchy_fin.h have HasSum (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), with h : HasSum (fun (i : ℕ) => q j * x ^ j * (a i * x ^ (i + (1 : ℕ)))) (q j * x ^ j * A).

      Lean, line 338
          have h := hA.mul_left (q j * x ^ j)

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 338 at dfc7b5cc45a9 ↗

    2. cauchy_fin.hz have (∑ 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 : ℝ)), with hz : (∑ i ∈ Finset.range (j + (1 : ℕ)), if j < i then q j * a (i - j - (1 : ℕ)) * x ^ i else (0 : ℝ)) = (0 : ℝ).

      Uses library Finset.range range n is the set of natural numbers less than n. , Finset.sum_eq_zero, if_neg.

      Lean, lines 340–343
          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/spec-180d8b72/Proof.lean, lines 340–343 at dfc7b5cc45a9 ↗

      1. cauchy_fin.hz.this have i < j + (1 : ℕ)

        Leaves (if j < i then q j * a (i - j - (1 : ℕ)) * x ^ i else (0 : ℝ)) = (0 : ℝ), with this : i < j + (1 : ℕ).

        Uses library Finset.mem_range.

        Lean, line 342
                have := Finset.mem_range.mp hi

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 342 at dfc7b5cc45a9 ↗

    3. cauchy_fin.hfun have (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), with 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 : ℕ))).

      Uses library if_pos, pow_add.

      Lean, lines 345–349
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 345–349 at dfc7b5cc45a9 ↗

  11. h4_series have ∀ (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 : ℕ), (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 : ℕ)), with h4_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.range range n is the set of natural numbers less than n. , HasSum HasSum f a L means that the (potentially infinite) sum of the f b for b : β converges to a along the SummationFilter L. , Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. .

    Lean, lines 353–472
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 353–472 at dfc7b5cc45a9 ↗

    1. h4_series.hx0 have (0 : ℝ) ≤ x routine: positivity

      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) : ℝ)), with hx0 : (0 : ℝ) ≤ x.

      Lean, line 368
          have hx0 : 0 ≤ x := by positivity

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 368 at dfc7b5cc45a9 ↗

    2. h4_series.hx2 have x / (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) : ℝ)), with hx2 : x / (2 : ℝ) < (1 : ℝ).

      Uses library div_div, div_lt_one.

      Lean, lines 369–373
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 369–373 at dfc7b5cc45a9 ↗

      1. h4_series.hx2.this have (2 : ℝ) ≤ (2 : ℝ) ^ n

        Leaves x / (2 : ℝ) < (1 : ℝ), with this : (2 : ℝ) ≤ (2 : ℝ) ^ n.

        Lean, lines 370–372
              have : (2 : ℝ) ≤ 2 ^ n := by
                calc (2 : ℝ) = 2 ^ 1 := by norm_num
                  _ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 370–372 at dfc7b5cc45a9 ↗

        1. h4_series.hx2.this.s1 calc (2 : ℝ) = (2 : ℝ) ^ (1 : ℕ) routine: norm_num

          Closes the goal.

          Lean, line 371
                  calc (2 : ℝ) = 2 ^ 1 := by norm_num

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 371 at dfc7b5cc45a9 ↗

        2. h4_series.hx2.this.s2 calc (2 : ℝ) ^ (1 : ℕ) ≤ (2 : ℝ) ^ n

          Closes the goal.

          Uses library pow_le_pow_right₀.

          Lean, line 372
                    _ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 372 at dfc7b5cc45a9 ↗

    3. h4_series.hapos have ∀ (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) : ℝ)), with hapos : ∀ (s : ℕ), (0 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ).

      Lean, lines 375–377
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 375–377 at dfc7b5cc45a9 ↗

      1. h4_series.hapos.this have (1 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ))

        Leaves (0 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ), with this : (1 : ℝ) < (2 : ℝ) ^ (s + (1 : ℕ)).

        Uses library one_lt_pow₀.

        Lean, line 376
              have : (1 : ℝ) < 2 ^ (s + 1) := one_lt_pow₀ (by norm_num) (by omega)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 376 at dfc7b5cc45a9 ↗

    4. h4_series.hAsum have Summable 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) : ℝ)), with hAsum : Summable fun (s : ℕ) => a s * x ^ (s + (1 : ℕ)).

      Uses library Summable Summable f means that f has some (infinite) sum with respect to L. , Summable.of_nonneg_of_le Comparison test of convergence of series of non-negative real numbers. , summable_geometric_of_lt_one.

      Lean, lines 378–391
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 378–391 at dfc7b5cc45a9 ↗

      1. h4_series.hAsum.s1 case

        Leaves (0 : ℝ) ≤ a s * x ^ (s + (1 : ℕ)).

        Uses library mul_nonneg Alias of Left.mul_nonneg. , div_nonneg, le_of_lt.

        Lean, line 380
              · simp only [hadef]; exact mul_nonneg (div_nonneg (by norm_num) (le_of_lt (hapos s))) (by positivity)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 380 at dfc7b5cc45a9 ↗

      2. h4_series.hAsum.s2 case

        Leaves a s * x ^ (s + (1 : ℕ)) ≤ x * (x / (2 : ℝ)) ^ s.

        Lean, lines 381–391
              · 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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 381–391 at dfc7b5cc45a9 ↗

        1. h4_series.hAsum.s2.h1 have (2 : ℝ) ^ s ≤ (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)

          Leaves (1 : ℝ) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)) * x ^ (s + (1 : ℕ)) ≤ x * (x / (2 : ℝ)) ^ s, with h1 : (2 : ℝ) ^ s ≤ (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ).

          Uses library pow_succ.

          Lean, lines 382–384
                  have h1 : (2 : ℝ) ^ s ≤ 2 ^ (s + 1) - 1 := by
                    have : (1 : ℝ) ≤ 2 ^ s := one_le_pow₀ (by norm_num)
                    rw [pow_succ]; linarith

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 382–384 at dfc7b5cc45a9 ↗

          1. h4_series.hAsum.s2.h1.this have (1 : ℝ) ≤ (2 : ℝ) ^ s

            Leaves (2 : ℝ) ^ s ≤ (2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ), with this : (1 : ℝ) ≤ (2 : ℝ) ^ s.

            Uses library one_le_pow₀.

            Lean, line 383
                      have : (1 : ℝ) ≤ 2 ^ s := one_le_pow₀ (by norm_num)

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 383 at dfc7b5cc45a9 ↗

        2. h4_series.hAsum.s2.hxs have (0 : ℝ) ≤ x ^ (s + (1 : ℕ)) routine: positivity

          Leaves (1 : ℝ) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)) * x ^ (s + (1 : ℕ)) ≤ x * (x / (2 : ℝ)) ^ s, with hxs : (0 : ℝ) ≤ x ^ (s + (1 : ℕ)).

          Lean, line 385
                  have hxs : 0 ≤ x ^ (s + 1) := by positivity

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 385 at dfc7b5cc45a9 ↗

        3. h4_series.hAsum.s2.s3 calc (1 : ℝ) / ((2 : ℝ) ^ (s + (1 : ℕ)) - (1 : ℝ)) * x ^ (s + (1 : ℕ)) ≤ (1 : ℝ) / (2 : ℝ) ^ s * x ^ (s + (1 : ℕ))

          Closes the goal.

          Lean, lines 386–387
                  calc 1 / (2 ^ (s + 1) - 1) * x ^ (s + 1) ≤ 1 / 2 ^ s * x ^ (s + 1) := by
                        gcongr

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 386–387 at dfc7b5cc45a9 ↗

        4. h4_series.hAsum.s2.s4 calc

          Closes the goal.

          Lean, lines 388–391
                    _ = 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

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 388–391 at dfc7b5cc45a9 ↗

          1. h4_series.hAsum.s2.s4.e have ∀ (y : ℝ), (1 : ℝ) / (2 : ℝ) ^ s * y ^ (s + (1 : ℕ)) = y * (y / (2 : ℝ)) ^ s

            Leaves (1 : ℝ) / (2 : ℝ) ^ s * x ^ (s + (1 : ℕ)) = x * (x / (2 : ℝ)) ^ s, with e : ∀ (y : ℝ), (1 : ℝ) / (2 : ℝ) ^ s * y ^ (s + (1 : ℕ)) = y * (y / (2 : ℝ)) ^ s.

            Uses library div_pow, pow_succ.

            Lean, lines 389–390
                        have e : ∀ y : ℝ, 1 / 2 ^ s * y ^ (s + 1) = y * (y / 2) ^ s := by
                          intro y; rw [div_pow, pow_succ]; field_simp

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 389–390 at dfc7b5cc45a9 ↗

    5. h4_series.hA have HasSum (fun (s : ℕ) => a s * x ^ (s + (1 : ℕ))) 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) : ℝ)), with hA : HasSum (fun (s : ℕ) => a s * x ^ (s + (1 : ℕ))) A.

      Uses library HasSum HasSum f a L means that the (potentially infinite) sum of the f b for b : β converges to a along the SummationFilter L. .

      Lean, line 393
          have hA : HasSum (fun s => a s * x ^ (s + 1)) A := hAsum.hasSum

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 393 at dfc7b5cc45a9 ↗

    6. h4_series.h3T have (3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ)) + 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) : ℝ)), with h3T : (3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) = ∑ j ∈ Finset.range n, (3 : ℝ) / ((2 : ℝ) ^ (j + (1 : ℕ)) - (3 : ℝ)) + A.

      Uses library Finset.range range n is the set of natural numbers less than n. , tsum_congr.

      Lean, lines 395–400
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 395–400 at dfc7b5cc45a9 ↗

    7. h4_series.hQxR have (↑(Qx n) : ℝ) = ∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ j

      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) : ℝ)), with hQxR : (↑(Qx n) : ℝ) = ∑ j ∈ Finset.range (n + (1 : ℕ)), (↑(Qc n j) : ℝ) * x ^ j.

      Uses library Finset.range range n is the set of natural numbers less than n. .

      Lean, lines 401–402
          have hQxR : (Qx n : ℝ) = ∑ j ∈ Finset.range (n + 1), (Qc n j : ℝ) * x ^ j := by
            rw [hQx]; push_cast; rfl

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 401–402 at dfc7b5cc45a9 ↗

    8. h4_series.hAqR have (↑(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) : ℝ)), with 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 : ℝ)).

      Uses library Finset.range range n is the set of natural numbers less than n. .

      Lean, lines 403–406
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 403–406 at dfc7b5cc45a9 ↗

    9. h4_series.hC have 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)

      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) : ℝ)), with hC : 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 407
          have hC := cauchy_fin n (fun j => (Qc n j : ℝ)) a x A hA

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 407 at dfc7b5cc45a9 ↗

    10. h4_series.hP have 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

      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) : ℝ)), with 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.

      Uses library HasSum HasSum f a L means that the (potentially infinite) sum of the f b for b : β converges to a along the SummationFilter L. , Finset.range range n is the set of natural numbers less than n. .

      Lean, lines 410–422
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 410–422 at dfc7b5cc45a9 ↗

      1. h4_series.hP.h0 have 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 : ℝ))

        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, with 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 : ℝ)).

        Uses library HasSum HasSum f a L means that the (potentially infinite) sum of the f b for b : β converges to a along the SummationFilter L. , Finset.range range n is the set of natural numbers less than n. , hasSum_sum_of_ne_finset_zero If a function f vanishes outside of a finite set s, then it HasSum ∑ b ∈ s, f b. , if_neg.

        Lean, lines 412–416
              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/spec-180d8b72/Proof.lean, lines 412–416 at dfc7b5cc45a9 ↗

      2. h4_series.hP.h1 have (∑ 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

        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, with 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.

        Uses library Finset.range range n is the set of natural numbers less than n. , Finset.sum_congr, rfl rfl : a = a is the unique constructor of the equality type. , if_pos, Finset.mem_range.

        Lean, lines 417–420
              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/spec-180d8b72/Proof.lean, lines 417–420 at dfc7b5cc45a9 ↗

    11. h4_series.hD have 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)

      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) : ℝ)), with hD : 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 423
          have hD := hC.sub hP

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 423 at dfc7b5cc45a9 ↗

    12. h4_series.hval have (↑(Qx n) : ℝ) * ((3 : ℝ) * ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) - (↑(Aq n) : ℝ) = (∑ 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) : ℝ)), with hval : (↑(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.range range n is the set of natural numbers less than n. .

      Lean, lines 424–426
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 424–426 at dfc7b5cc45a9 ↗

    13. h4_series.hid1 have ∀ 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), with 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).

      Uses library Finset.range range n is the set of natural numbers less than n. , Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. .

      Lean, lines 428–429
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 428–429 at dfc7b5cc45a9 ↗

    14. h4_series.hfun have (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), with 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 : ℝ).

      Uses library Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.range range n is the set of natural numbers less than n. .

      Lean, lines 430–470
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 430–470 at dfc7b5cc45a9 ↗

      1. h4_series.hfun.s1 case

        Leaves ((∑ 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 438–452
              · 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/spec-180d8b72/Proof.lean, lines 438–452 at dfc7b5cc45a9 ↗

        1. h4_series.hfun.s1.hsplit have (∑ 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

          Leaves (∑ 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 : ℝ), with 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.

          Uses library Finset.range range n is the set of natural numbers less than n. , Finset.sum_range_add_sum_Ico, Finset.sum_eq_zero, Finset.Ico The finset $[a, b)$ of elements x such that a ≤ x and x < b. , if_neg, add_zero, Finset.sum_congr, rfl rfl : a = a is the unique constructor of the equality type. , if_pos.

          Lean, lines 441–451
                  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

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 441–451 at dfc7b5cc45a9 ↗

          1. h4_series.hfun.s1.hsplit.this have K ≤ j ∧ j < n + (1 : ℕ)

            Leaves ¬j < K, with this : K ≤ j ∧ j < n + (1 : ℕ).

            Uses library Finset.mem_Ico.

            Lean, line 445
                        rw [if_neg (by have := Finset.mem_Ico.mp hj; omega)]), add_zero]

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 445 at dfc7b5cc45a9 ↗

          2. h4_series.hfun.s1.hsplit.hjK have j < K

            Leaves (if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) = (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ)) * x ^ K, with hjK : j < K.

            Uses library Finset.mem_range.

            Lean, line 447
                      have hjK := Finset.mem_range.mp hj

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 447 at dfc7b5cc45a9 ↗

      2. h4_series.hfun.s2 case

        Leaves ((∑ 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 453–470
              · 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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 453–470 at dfc7b5cc45a9 ↗

        1. h4_series.hfun.s2.hS have (∑ 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

          Leaves (∑ 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 : ℝ), with 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.

          Uses library Finset.range range n is the set of natural numbers less than n. , Finset.sum_mul, Finset.sum_congr, rfl rfl : a = a is the unique constructor of the equality type. , if_pos.

          Lean, lines 454–463
                  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

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 454–463 at dfc7b5cc45a9 ↗

          1. h4_series.hfun.s2.hS.hjK have j < K

            Leaves (if j < K then (↑(Qc n j) : ℝ) * a (K - j - (1 : ℕ)) * x ^ K else (0 : ℝ)) = (↑(Qc n j) : ℝ) / ((2 : ℝ) ^ (K - j) - (1 : ℝ)) * x ^ K, with hjK : j < K.

            Lean, line 459
                      have hjK : j < K := by have := Finset.mem_range.mp hj; omega

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 459 at dfc7b5cc45a9 ↗

            1. h4_series.hfun.s2.hS.hjK.this have j < n + (1 : ℕ)

              Leaves j < K, with this : j < n + (1 : ℕ).

              Uses library Finset.mem_range.

              Lean, line 459
                        have hjK : j < K := by have := Finset.mem_range.mp hj; omega

              targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 459 at dfc7b5cc45a9 ↗

        2. h4_series.hfun.s2.s2 case

          Leaves ((∏ 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 467
                  · rw [if_pos h2]

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 467 at dfc7b5cc45a9 ↗

        3. h4_series.hfun.s2.s3 case

          Leaves ((∏ 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.intro And.intro : a → b → a ∧ b is the constructor for the And operation. , sub_self.

          Lean, lines 468–470
                  · rw [if_neg h2]
                    rw [Finset.prod_eq_zero (i := K) (Finset.mem_Ioc.mpr ⟨by omega, by omega⟩) (sub_self _)]
                    simp

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 468–470 at dfc7b5cc45a9 ↗

  12. prod_one_sub_ge have ∀ (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 : ℕ), (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 : ℕ)), with prod_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 Finset Finset α is the type of finite sets of elements of α. , Finset.induction_on To prove a proposition about an arbitrary Finset α, it suffices to prove it for the empty Finset, and to show that if it holds for some Finset α, then it holds for the Finset obtained by inserting a new element. .

    Lean, lines 475–490
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 475–490 at dfc7b5cc45a9 ↗

    1. prod_one_sub_ge.s1 case printed form did not read back: shown as its Lean lines only
    2. prod_one_sub_ge.s2 case

      Leaves (1 : ℝ) - ∑ i ∈ insert j s, a i ≤ ∏ i ∈ insert j s, ((1 : ℝ) - a i), with j : ℕ, 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 480–490
          | 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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 480–490 at dfc7b5cc45a9 ↗

      1. 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), with ih' : (1 : ℝ) - ∑ i ∈ s, a i ≤ ∏ i ∈ s, ((1 : ℝ) - a i).

        Uses library Finset.mem_insert_of_mem.

        Lean, line 482
              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/spec-180d8b72/Proof.lean, line 482 at dfc7b5cc45a9 ↗

      2. prod_one_sub_ge.s2.haj0 have (0 : ℝ) ≤ a j

        Leaves (1 : ℝ) - (a j + ∑ x ∈ s, a x) ≤ ((1 : ℝ) - a j) * ∏ x ∈ s, ((1 : ℝ) - a x), with haj0 : (0 : ℝ) ≤ a j.

        Uses library Finset.mem_insert_self.

        Lean, line 483
              have haj0 := h0 j (Finset.mem_insert_self j s)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 483 at dfc7b5cc45a9 ↗

      3. prod_one_sub_ge.s2.haj1 have a j ≤ (1 : ℝ)

        Leaves (1 : ℝ) - (a j + ∑ x ∈ s, a x) ≤ ((1 : ℝ) - a j) * ∏ x ∈ s, ((1 : ℝ) - a x), with haj1 : a j ≤ (1 : ℝ).

        Uses library Finset.mem_insert_self.

        Lean, line 484
              have haj1 := h1 j (Finset.mem_insert_self j s)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 484 at dfc7b5cc45a9 ↗

      4. prod_one_sub_ge.s2.hP have (0 : ℝ) ≤ ∏ i ∈ s, ((1 : ℝ) - a i)

        Leaves (1 : ℝ) - (a j + ∑ x ∈ s, a x) ≤ ((1 : ℝ) - a j) * ∏ x ∈ s, ((1 : ℝ) - a x), with hP : (0 : ℝ) ≤ ∏ i ∈ s, ((1 : ℝ) - a i).

        Uses library Finset.prod_nonneg, Finset.mem_insert_of_mem.

        Lean, lines 485–486
              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/spec-180d8b72/Proof.lean, lines 485–486 at dfc7b5cc45a9 ↗

      5. prod_one_sub_ge.s2.hP1 have ∏ i ∈ s, ((1 : ℝ) - a i) ≤ (1 : ℝ)

        Leaves (1 : ℝ) - (a j + ∑ x ∈ s, a x) ≤ ((1 : ℝ) - a j) * ∏ x ∈ s, ((1 : ℝ) - a x), with hP1 : ∏ i ∈ s, ((1 : ℝ) - a i) ≤ (1 : ℝ).

        Uses library Finset.prod_le_one If each f i, i ∈ s belongs to [0, 1], then their product is less than or equal to one. , Finset.mem_insert_of_mem.

        Lean, lines 487–489
              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/spec-180d8b72/Proof.lean, lines 487–489 at dfc7b5cc45a9 ↗

  13. nd_bound have ∀ (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

    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 : ℕ), (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 : ℕ)), with nd_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.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.range range n is the set of natural numbers less than n. , And.intro And.intro : a → b → a ∧ b is the constructor for the And operation. , div_pos, div_le_iff₀ See div_le_iff₀' for a version with multiplication on the other side. .

    Lean, lines 492–547
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 492–547 at dfc7b5cc45a9 ↗

    1. nd_bound.hlt have ∀ i < K, (0 : ℝ) < (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, with hlt : ∀ i < K, (0 : ℝ) < (2 : ℝ) ^ K - (2 : ℝ) ^ i.

      Lean, lines 497–499
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 497–499 at dfc7b5cc45a9 ↗

      1. nd_bound.hlt.this have (2 : ℝ) ^ i < (2 : ℝ) ^ K

        Leaves (0 : ℝ) < (2 : ℝ) ^ K - (2 : ℝ) ^ i, with this : (2 : ℝ) ^ i < (2 : ℝ) ^ K.

        Uses library pow_lt_pow_right₀.

        Lean, line 498
              have : (2 : ℝ) ^ i < 2 ^ K := pow_lt_pow_right₀ (by norm_num) hi

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 498 at dfc7b5cc45a9 ↗

    2. nd_bound.hNpos have (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, with hNpos : (0 : ℝ) < ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L).

      Uses library Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.prod_pos.

      Lean, lines 500–501
          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/spec-180d8b72/Proof.lean, lines 500–501 at dfc7b5cc45a9 ↗

      1. nd_bound.hNpos.this have n < L ∧ L ≤ (2 : ℕ) * n

        Leaves L < K, with this : n < L ∧ L ≤ (2 : ℕ) * n.

        Uses library Finset.mem_Ioc.

        Lean, line 501
              Finset.prod_pos (fun L hL => hlt L (by have := Finset.mem_Ioc.mp hL; omega))

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 501 at dfc7b5cc45a9 ↗

    3. nd_bound.hDpos have (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, with hDpos : (0 : ℝ) < ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i).

      Uses library Finset.range range n is the set of natural numbers less than n. , Finset.prod_pos.

      Lean, lines 502–503
          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/spec-180d8b72/Proof.lean, lines 502–503 at dfc7b5cc45a9 ↗

      1. nd_bound.hDpos.this have i < n + (1 : ℕ)

        Leaves i < K, with this : i < n + (1 : ℕ).

        Uses library Finset.mem_range.

        Lean, line 503
              Finset.prod_pos (fun i hi => hlt i (by have := Finset.mem_range.mp hi; omega))

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 503 at dfc7b5cc45a9 ↗

    4. nd_bound.hN have ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L) ≤ ((2 : ℝ) ^ K) ^ n

      Leaves (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K, with hN : ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L) ≤ ((2 : ℝ) ^ K) ^ n.

      Uses library Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.prod_const, Nat.card_Ioc.

      Lean, lines 505–511
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 505–511 at dfc7b5cc45a9 ↗

      1. nd_bound.hN.this have ∏ i ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ ∏ i ∈ Finset.Ioc n ((2 : ℕ) * n), (2 : ℝ) ^ K

        Leaves ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L) ≤ ((2 : ℝ) ^ K) ^ n, with this : ∏ i ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ ∏ i ∈ Finset.Ioc n ((2 : ℕ) * n), (2 : ℝ) ^ K.

        Uses library Finset.prod_le_prod If all f i, i ∈ s, are nonnegative and each f i is less than or equal to g i, then the product of f i is less than or equal to the product of g i. , Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , le_of_lt.

        Lean, lines 506–509
              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/spec-180d8b72/Proof.lean, lines 506–509 at dfc7b5cc45a9 ↗

        1. nd_bound.hN.this.s1 have n < L ∧ L ≤ (2 : ℕ) * n

          Leaves L < K, with this : n < L ∧ L ≤ (2 : ℕ) * n.

          Uses library Finset.mem_Ioc.

          Lean, line 507
                  (fun L hL => le_of_lt (hlt L (by have := Finset.mem_Ioc.mp hL; omega))) (fun L _ => by

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 507 at dfc7b5cc45a9 ↗

        2. nd_bound.hN.this.s2 have (0 : ℝ) < (2 : ℝ) ^ L routine: positivity

          Leaves (2 : ℝ) ^ K - (2 : ℝ) ^ L ≤ (2 : ℝ) ^ K, with this : (0 : ℝ) < (2 : ℝ) ^ L.

          Lean, line 508
                    have : (0 : ℝ) < 2 ^ L := by positivity

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 508 at dfc7b5cc45a9 ↗

    5. nd_bound.hD have ((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, with hD : ((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ) ≤ ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i).

      Uses library Finset.range range n is the set of natural numbers less than n. , Finset.prod_congr, rfl rfl : a = a is the unique constructor of the equality type. , Finset.prod_mul_distrib, Finset.prod_const, Finset.card_range.

      Lean, lines 512–538
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 512–538 at dfc7b5cc45a9 ↗

      1. nd_bound.hD.hfac have ∀ 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), with hfac : ∀ i ∈ Finset.range (n + (1 : ℕ)), (2 : ℝ) ^ K - (2 : ℝ) ^ i = (2 : ℝ) ^ K * ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - i)).

        Uses library Finset.range range n is the set of natural numbers less than n. , mul_sub Alias of mul_sub_left_distrib. , mul_one, one_div_pow, mul_one_div.

        Lean, lines 513–518
              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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 513–518 at dfc7b5cc45a9 ↗

        1. nd_bound.hD.hfac.hiK have i ≤ K

          Leaves (2 : ℝ) ^ K - (2 : ℝ) ^ i = (2 : ℝ) ^ K * ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - i)), with hiK : i ≤ K.

          Lean, line 515
                  have hiK : i ≤ K := by have := Finset.mem_range.mp hi; omega

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 515 at dfc7b5cc45a9 ↗

          1. nd_bound.hD.hfac.hiK.this have i < n + (1 : ℕ)

            Leaves i ≤ K, with this : i < n + (1 : ℕ).

            Uses library Finset.mem_range.

            Lean, line 515
                    have hiK : i ≤ K := by have := Finset.mem_range.mp hi; omega

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 515 at dfc7b5cc45a9 ↗

        2. nd_bound.hD.hfac.e have (2 : ℝ) ^ K = (2 : ℝ) ^ i * (2 : ℝ) ^ (K - i)

          Leaves (2 : ℝ) ^ K - (2 : ℝ) ^ i = (2 : ℝ) ^ K * ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - i)), with e : (2 : ℝ) ^ K = (2 : ℝ) ^ i * (2 : ℝ) ^ (K - i).

          Uses library pow_add.

          Lean, line 516
                  have e : (2 : ℝ) ^ K = 2 ^ i * 2 ^ (K - i) := by rw [← pow_add]; congr 1; omega

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 516 at dfc7b5cc45a9 ↗

      2. nd_bound.hD.hsum have ∑ 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)), with hsum : ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (K - i) ≤ (1 / 2 : ℝ).

        Uses library Finset.range range n is the set of natural numbers less than n. , Finset.sum_congr, rfl rfl : a = a is the unique constructor of the equality type. , Finset.mul_sum.

        Lean, lines 520–534
              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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 520–534 at dfc7b5cc45a9 ↗

        1. nd_bound.hD.hsum.e have ∀ 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 : ℝ), with e : ∀ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (K - i) = (1 / 2 : ℝ) ^ (K - n) * (1 / 2 : ℝ) ^ (n - i).

          Uses library Finset.range range n is the set of natural numbers less than n. , pow_add.

          Lean, lines 521–524
                  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

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 521–524 at dfc7b5cc45a9 ↗

          1. nd_bound.hD.hsum.e.this have i < n + (1 : ℕ)

            Leaves (1 / 2 : ℝ) ^ (K - i) = (1 / 2 : ℝ) ^ (K - n) * (1 / 2 : ℝ) ^ (n - i), with this : i < n + (1 : ℕ).

            Uses library Finset.mem_range.

            Lean, line 523
                      have := Finset.mem_range.mp hi

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 523 at dfc7b5cc45a9 ↗

        2. nd_bound.hD.hsum.hg have ∑ 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 : ℝ), with hg : ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n - i) ≤ (2 : ℝ).

          Uses library Finset.range range n is the set of natural numbers less than n. , Nat.add_sub_cancel, sum_geometric_two_le.

          Lean, lines 526–530
                  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/spec-180d8b72/Proof.lean, lines 526–530 at dfc7b5cc45a9 ↗

          1. nd_bound.hD.hsum.hg.hr have ∑ j ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n + (1 : ℕ) - (1 : ℕ) - j) = ∑ j ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ j

            Leaves ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n - i) ≤ (2 : ℝ), with hr : ∑ 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 527
                      have hr := Finset.sum_range_reflect (fun i => ((1 : ℝ) / 2) ^ i) (n + 1)

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 527 at dfc7b5cc45a9 ↗

        3. nd_bound.hD.hsum.hk have (1 / 2 : ℝ) ^ (K - n) ≤ (1 / 2 : ℝ) ^ (2 : ℕ)

          Leaves (1 / 2 : ℝ) ^ (K - n) * ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n - i) ≤ (1 / 2 : ℝ), with hk : (1 / 2 : ℝ) ^ (K - n) ≤ (1 / 2 : ℝ) ^ (2 : ℕ).

          Uses library pow_le_pow_of_le_one.

          Lean, lines 531–532
                  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/spec-180d8b72/Proof.lean, lines 531–532 at dfc7b5cc45a9 ↗

        4. nd_bound.hD.hsum.hpos have (0 : ℝ) ≤ (1 / 2 : ℝ) ^ (K - n) routine: positivity

          Leaves (1 / 2 : ℝ) ^ (K - n) * ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (n - i) ≤ (1 / 2 : ℝ), with hpos : (0 : ℝ) ≤ (1 / 2 : ℝ) ^ (K - n).

          Lean, line 533
                  have hpos : 0 ≤ ((1 : ℝ) / 2) ^ (K - n) := by positivity

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 533 at dfc7b5cc45a9 ↗

      3. nd_bound.hD.hprod have (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)), with hprod : (1 : ℝ) - ∑ i ∈ Finset.range (n + (1 : ℕ)), (1 / 2 : ℝ) ^ (K - i) ≤ ∏ i ∈ Finset.range (n + (1 : ℕ)), ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - i)).

        Uses library Finset.range range n is the set of natural numbers less than n. , pow_le_one₀.

        Lean, lines 535–536
              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/spec-180d8b72/Proof.lean, lines 535–536 at dfc7b5cc45a9 ↗

      4. nd_bound.hD.h2K have (0 : ℝ) < ((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) routine: positivity

        Leaves ((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ) ≤ ((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) * ∏ x ∈ Finset.range (n + (1 : ℕ)), ((1 : ℝ) - (1 / 2 : ℝ) ^ (K - x)), with h2K : (0 : ℝ) < ((2 : ℝ) ^ K) ^ (n + (1 : ℕ)).

        Lean, line 537
              have h2K : (0 : ℝ) < (2 ^ K) ^ (n + 1) := by positivity

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 537 at dfc7b5cc45a9 ↗

    6. nd_bound.h2K have (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), with h2K : (2 : ℝ) ^ K * (1 / 2 : ℝ) ^ K = (1 : ℝ).

      Uses library mul_pow.

      Lean, line 540
          have h2K : (2 : ℝ) ^ K * (1 / 2) ^ K = 1 := by rw [← mul_pow]; norm_num

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 540 at dfc7b5cc45a9 ↗

    7. nd_bound.e2 have (2 : ℝ) * (1 / 2 : ℝ) ^ K * (((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ)) = ((2 : ℝ) ^ K) ^ n

      Leaves ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K * ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i), with e2 : (2 : ℝ) * (1 / 2 : ℝ) ^ K * (((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ)) = ((2 : ℝ) ^ K) ^ n.

      Uses library pow_succ.

      Lean, lines 541–544
          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/spec-180d8b72/Proof.lean, lines 541–544 at dfc7b5cc45a9 ↗

      1. nd_bound.e2.s1 calc (2 : ℝ) * (1 / 2 : ℝ) ^ K * (((2 : ℝ) ^ K) ^ n * (2 : ℝ) ^ K / (2 : ℝ)) = (2 : ℝ) ^ K * (1 / 2 : ℝ) ^ K * ((2 : ℝ) ^ K) ^ n routine: ring

        Closes the goal.

        Lean, line 543
              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/spec-180d8b72/Proof.lean, line 543 at dfc7b5cc45a9 ↗

      2. nd_bound.e2.s2 calc

        Closes the goal.

        Uses library one_mul.

        Lean, line 544
                _ = (2 ^ K) ^ n := by rw [h2K, one_mul]

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 544 at dfc7b5cc45a9 ↗

    8. nd_bound.s8 calc ∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L) ≤ ((2 : ℝ) ^ K) ^ n

      Closes the goal.

      Uses library Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. .

      Lean, line 545
          calc ∏ L ∈ Finset.Ioc n (2 * n), ((2 : ℝ) ^ K - 2 ^ L) ≤ (2 ^ K) ^ n := hN

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 545 at dfc7b5cc45a9 ↗

    9. nd_bound.s9 calc ((2 : ℝ) ^ K) ^ n = (2 : ℝ) * (1 / 2 : ℝ) ^ K * (((2 : ℝ) ^ K) ^ (n + (1 : ℕ)) / (2 : ℝ))

      Closes the goal.

      Lean, line 546
            _ = 2 * (1 / 2) ^ K * ((2 ^ K) ^ (n + 1) / 2) := e2.symm

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 546 at dfc7b5cc45a9 ↗

    10. nd_bound.s10 calc

      Closes the goal.

      Uses library Finset.range range n is the set of natural numbers less than n. .

      Lean, line 547
            _ ≤ 2 * (1 / 2) ^ K * ∏ i ∈ Finset.range (n + 1), ((2 : ℝ) ^ K - 2 ^ i) := by gcongr

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 547 at dfc7b5cc45a9 ↗

  14. ineq_pow have ∀ (n : ℕ), (2 : ℕ) ≤ n → (9 : ℕ) * (81 : ℕ) ^ n ≤ (256 : ℕ) ^ 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 : ℕ), (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 : ℕ)), with ineq_pow : ∀ (n : ℕ), (2 : ℕ) ≤ n → (9 : ℕ) * (81 : ℕ) ^ n ≤ (256 : ℕ) ^ n.

    Lean, lines 550–560
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 550–560 at dfc7b5cc45a9 ↗

    1. ineq_pow.s1 case routine: omega

      Leaves (9 : ℕ) * (81 : ℕ) ^ (0 : ℕ) ≤ (256 : ℕ) ^ (0 : ℕ), with hn : (2 : ℕ) ≤ (0 : ℕ).

      Uses library Nat.zero Zero, the smallest natural number. .

      Lean, line 554
          | zero => omega

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 554 at dfc7b5cc45a9 ↗

    2. ineq_pow.s2 case

      Leaves (9 : ℕ) * (81 : ℕ) ^ (m + (1 : ℕ)) ≤ (256 : ℕ) ^ (m + (1 : ℕ)), with m : ℕ, ih : (2 : ℕ) ≤ m → (9 : ℕ) * (81 : ℕ) ^ m ≤ (256 : ℕ) ^ m, hn : (2 : ℕ) ≤ m + (1 : ℕ).

      Uses library Nat.succ The successor of a natural number n. .

      Lean, lines 555–560
          | 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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 555–560 at dfc7b5cc45a9 ↗

      1. ineq_pow.s2.s1 case routine: norm_num

        Leaves (9 : ℕ) * (81 : ℕ) ^ ((1 : ℕ) + (1 : ℕ)) ≤ (256 : ℕ) ^ ((1 : ℕ) + (1 : ℕ)).

        Lean, line 557
              · norm_num

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 557 at dfc7b5cc45a9 ↗

      2. ineq_pow.s2.s2 case

        Leaves (9 : ℕ) * (81 : ℕ) ^ (m + (1 : ℕ)) ≤ (256 : ℕ) ^ (m + (1 : ℕ)).

        Uses library pow_succ.

        Lean, lines 558–560
              · have := ih hm
                rw [pow_succ, pow_succ]
                omega

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 558–560 at dfc7b5cc45a9 ↗

        1. ineq_pow.s2.s2.this have (9 : ℕ) * (81 : ℕ) ^ m ≤ (256 : ℕ) ^ m

          Leaves (9 : ℕ) * (81 : ℕ) ^ (m + (1 : ℕ)) ≤ (256 : ℕ) ^ (m + (1 : ℕ)), with this : (9 : ℕ) * (81 : ℕ) ^ m ≤ (256 : ℕ) ^ m.

          Lean, line 558
                · have := ih hm

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 558 at dfc7b5cc45a9 ↗

  15. h4_big have ∀ (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 : ℕ), (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 : ℕ)), with h4_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.range range n is the set of natural numbers less than n. , Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , And.intro And.intro : a → b → a ∧ b is the constructor for the And operation. .

    Lean, lines 562–655
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 562–655 at dfc7b5cc45a9 ↗

    1. h4_big.hS have 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 (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 : ℕ)), with hS : 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 575
          have hS := h4_series Qc hQc Qx hQx Aq hAq n (by omega)

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 575 at dfc7b5cc45a9 ↗

    2. h4_big.hx0 have (0 : ℝ) < x routine: positivity

      Leaves (0 : ℝ) < r ∧ r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hx0 : (0 : ℝ) < x.

      Lean, line 578
          have hx0 : 0 < x := by positivity

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 578 at dfc7b5cc45a9 ↗

    3. h4_big.hx2 have x / (2 : ℝ) ≤ (3 / 8 : ℝ)

      Leaves (0 : ℝ) < r ∧ r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hx2 : x / (2 : ℝ) ≤ (3 / 8 : ℝ).

      Uses library div_div, div_le_div_iff₀.

      Lean, lines 579–583
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 579–583 at dfc7b5cc45a9 ↗

      1. h4_big.hx2.this have (4 : ℝ) ≤ (2 : ℝ) ^ n

        Leaves x / (2 : ℝ) ≤ (3 / 8 : ℝ), with this : (4 : ℝ) ≤ (2 : ℝ) ^ n.

        Lean, lines 580–582
              have : (4 : ℝ) ≤ 2 ^ n := by
                calc (4 : ℝ) = 2 ^ 2 := by norm_num
                  _ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 580–582 at dfc7b5cc45a9 ↗

        1. h4_big.hx2.this.s1 calc (4 : ℝ) = (2 : ℝ) ^ (2 : ℕ) routine: norm_num

          Closes the goal.

          Lean, line 581
                  calc (4 : ℝ) = 2 ^ 2 := by norm_num

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 581 at dfc7b5cc45a9 ↗

        2. h4_big.hx2.this.s2 calc (2 : ℝ) ^ (2 : ℕ) ≤ (2 : ℝ) ^ n

          Closes the goal.

          Uses library pow_le_pow_right₀.

          Lean, line 582
                    _ ≤ 2 ^ n := pow_le_pow_right₀ (by norm_num) hn

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 582 at dfc7b5cc45a9 ↗

    4. h4_big.hGnn have ∀ (K : ℕ), (0 : ℝ) ≤ G K

      Leaves (0 : ℝ) < r ∧ r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hGnn : ∀ (K : ℕ), (0 : ℝ) ≤ G K.

      Lean, lines 587–591
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 587–591 at dfc7b5cc45a9 ↗

      1. h4_big.hGnn.s1 case

        Leaves (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_nonneg Alias of Left.mul_nonneg. , le_of_lt.

        Lean, line 590
              · exact mul_nonneg (le_of_lt (nd_bound n K (by omega) (by omega)).1) (by positivity)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 590 at dfc7b5cc45a9 ↗

      2. h4_big.hGnn.s2 case

        Leaves (0 : ℝ) ≤ (0 : ℝ).

        Uses library le_refl The relation ≤ on a preorder is reflexive. .

        Lean, line 591
              · exact le_refl 0

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 591 at dfc7b5cc45a9 ↗

    5. h4_big.hGpos have (0 : ℝ) < G ((2 : ℕ) * n + (1 : ℕ))

      Leaves (0 : ℝ) < r ∧ r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hGpos : (0 : ℝ) < G ((2 : ℕ) * n + (1 : ℕ)).

      Uses library if_pos, mul_pos Alias of Left.mul_pos. .

      Lean, lines 592–594
          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/spec-180d8b72/Proof.lean, lines 592–594 at dfc7b5cc45a9 ↗

    6. h4_big.s6 case

      Leaves (0 : ℝ) < r.

      Uses library hasSum_lt, hasSum_zero Constant zero function has sum 0 .

      Lean, line 596
          · exact hasSum_lt (f := fun _ => (0 : ℝ)) (g := G) (i := 2 * n + 1) (fun K => hGnn K) hGpos hasSum_zero hS

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 596 at dfc7b5cc45a9 ↗

    7. h4_big.s7 case

      Leaves r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)).

      Lean, lines 597–655
          · 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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 597–655 at dfc7b5cc45a9 ↗

      1. h4_big.s7.hGH have ∀ (K : ℕ), G K ≤ H K

        Leaves r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hGH : ∀ (K : ℕ), G K ≤ H K.

        Lean, lines 598–606
              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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 598–606 at dfc7b5cc45a9 ↗

        1. h4_big.s7.hGH.s1 case

          Leaves ((∏ 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 601–605
                  · 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

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 601–605 at dfc7b5cc45a9 ↗

          1. h4_big.s7.hGH.s1.hb have (∏ L ∈ Finset.Ioc n ((2 : ℕ) * n), ((2 : ℝ) ^ K - (2 : ℝ) ^ L)) / ∏ i ∈ Finset.range (n + (1 : ℕ)), ((2 : ℝ) ^ K - (2 : ℝ) ^ i) ≤ (2 : ℝ) * (1 / 2 : ℝ) ^ K

            Leaves ((∏ 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, with hb : (∏ 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 601
                    · have hb := (nd_bound n K (by omega) (by omega)).2

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 601 at dfc7b5cc45a9 ↗

          2. h4_big.s7.hGH.s1.s2 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

            Closes the goal.

            Uses library Finset.Ioc The finset $(a, b]$ of elements x such that a < x and x ≤ b. , Finset.range range n is the set of natural numbers less than n. .

            Lean, lines 602–604
                      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

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 602–604 at dfc7b5cc45a9 ↗

          3. h4_big.s7.hGH.s1.s3 calc routine: ring

            Closes the goal.

            Lean, line 605
                        _ = 2 * (x / 2) ^ K := by ring

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 605 at dfc7b5cc45a9 ↗

        2. h4_big.s7.hGH.s2 case

          Leaves (0 : ℝ) ≤ (0 : ℝ).

          Uses library le_refl The relation ≤ on a preorder is reflexive. .

          Lean, line 606
                  · exact le_refl 0

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 606 at dfc7b5cc45a9 ↗

      2. h4_big.s7.hq have x / (2 : ℝ) < (1 : ℝ) routine: linarith

        Leaves r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hq : x / (2 : ℝ) < (1 : ℝ).

        Lean, line 607
              have hq : x / 2 < 1 := by linarith

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 607 at dfc7b5cc45a9 ↗

      3. h4_big.s7.hHsum have HasSum H ((2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹)

        Leaves r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hHsum : HasSum H ((2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹).

        Uses library HasSum HasSum f a L means that the (potentially infinite) sum of the f b for b : β converges to a along the SummationFilter L. , hasSum_nat_add_iff', sub_zero.

        Lean, lines 608–618
              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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 608–618 at dfc7b5cc45a9 ↗

        1. h4_big.s7.hHsum.hz have ∑ 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), with hz : ∑ i ∈ Finset.range ((2 : ℕ) * n + (1 : ℕ)), H i = (0 : ℝ).

          Uses library Finset.range range n is the set of natural numbers less than n. , Finset.sum_eq_zero, if_neg.

          Lean, lines 610–612
                  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/spec-180d8b72/Proof.lean, lines 610–612 at dfc7b5cc45a9 ↗

          1. h4_big.s7.hHsum.hz.this have i < (2 : ℕ) * n + (1 : ℕ)

            Leaves ¬(2 : ℕ) * n < i, with this : i < (2 : ℕ) * n + (1 : ℕ).

            Uses library Finset.mem_range.

            Lean, line 612
                        simp only [hH]; rw [if_neg (by have := Finset.mem_range.mp hi; omega)])

            targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 612 at dfc7b5cc45a9 ↗

        2. h4_big.s7.hHsum.hgeo have HasSum (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 : ℝ))⁻¹), with hgeo : 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 614
                  have hgeo := (hasSum_geometric_of_lt_one (by positivity) hq).mul_left (2 * (x / 2) ^ (2 * n + 1))

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 614 at dfc7b5cc45a9 ↗

        3. h4_big.s7.hHsum.hfun have (fun (s : ℕ) => H (s + ((2 : ℕ) * n + (1 : ℕ)))) = fun (s : ℕ) => (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * (x / (2 : ℝ)) ^ s

          Leaves HasSum (fun (n_1 : ℕ) => H (n_1 + ((2 : ℕ) * n + (1 : ℕ)))) ((2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹), with hfun : (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 615–616
                  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

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 615–616 at dfc7b5cc45a9 ↗

      4. h4_big.s7.hrle have r ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹

        Leaves r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hrle : r ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹.

        Uses library hasSum_le.

        Lean, line 619
              have hrle : r ≤ 2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹ := hasSum_le hGH hS hHsum

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 619 at dfc7b5cc45a9 ↗

      5. h4_big.s7.hr0 have (0 : ℝ) ≤ r

        Leaves r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hr0 : (0 : ℝ) ≤ r.

        Uses library le_of_lt, hasSum_lt, hasSum_zero Constant zero function has sum 0 .

        Lean, lines 620–621
              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/spec-180d8b72/Proof.lean, lines 620–621 at dfc7b5cc45a9 ↗

      6. h4_big.s7.hr8 have r ≤ (8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ))

        Leaves r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hr8 : r ≤ (8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)).

        Lean, lines 622–628
              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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 622–628 at dfc7b5cc45a9 ↗

        1. h4_big.s7.hr8.hinv have ((1 : ℝ) - x / (2 : ℝ))⁻¹ ≤ (4 : ℝ)

          Leaves r ≤ (8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)), with hinv : ((1 : ℝ) - x / (2 : ℝ))⁻¹ ≤ (4 : ℝ).

          Uses library inv_le_comm₀ See also inv_le_of_inv_le₀ for a one-sided implication with one fewer assumption. .

          Lean, lines 623–624
                  have hinv : (1 - x / 2)⁻¹ ≤ 4 := by
                    rw [inv_le_comm₀ (by linarith) (by norm_num)]; linarith

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 623–624 at dfc7b5cc45a9 ↗

        2. h4_big.s7.hr8.hp have (0 : ℝ) ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) routine: positivity

          Leaves r ≤ (8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)), with hp : (0 : ℝ) ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)).

          Lean, line 625
                  have hp : 0 ≤ 2 * (x / 2) ^ (2 * n + 1) := by positivity

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 625 at dfc7b5cc45a9 ↗

        3. h4_big.s7.hr8.s3 calc r ≤ (2 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ)) * ((1 : ℝ) - x / (2 : ℝ))⁻¹

          Closes the goal.

          Lean, line 626
                  calc r ≤ 2 * (x / 2) ^ (2 * n + 1) * (1 - x / 2)⁻¹ := hrle

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 626 at dfc7b5cc45a9 ↗

        4. h4_big.s7.hr8.s4 calc

          Closes the goal.

          Lean, line 627
                    _ ≤ 2 * (x / 2) ^ (2 * n + 1) * 4 := by gcongr

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 627 at dfc7b5cc45a9 ↗

        5. h4_big.s7.hr8.s5 calc routine: ring

          Closes the goal.

          Lean, line 628
                    _ = 8 * (x / 2) ^ (2 * n + 1) := by ring

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 628 at dfc7b5cc45a9 ↗

      7. h4_big.s7.hsq have r ^ (2 : ℕ) ≤ ((8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ))) ^ (2 : ℕ)

        Leaves r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hsq : r ^ (2 : ℕ) ≤ ((8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ))) ^ (2 : ℕ).

        Uses library pow_le_pow_left₀.

        Lean, line 629
              have hsq : r ^ 2 ≤ (8 * (x / 2) ^ (2 * n + 1)) ^ 2 := pow_le_pow_left₀ hr0 hr8 2

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 629 at dfc7b5cc45a9 ↗

      8. h4_big.s7.hnat have (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 : ℕ)), with hnat : (64 : ℕ) * (3 : ℕ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℕ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℕ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℕ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)).

        Lean, lines 630–639
              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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 630–639 at dfc7b5cc45a9 ↗

        1. h4_big.s7.hnat.e1 have (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 : ℕ)), with e1 : (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 631–634
                  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

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 631–634 at dfc7b5cc45a9 ↗

        2. h4_big.s7.hnat.e2 have (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 : ℕ)), with e2 : (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 635–636
                  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

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 635–636 at dfc7b5cc45a9 ↗

        3. h4_big.s7.hnat.this have (9 : ℕ) * (81 : ℕ) ^ n ≤ (256 : ℕ) ^ n

          Leaves (2 : ℕ) ^ ((4 : ℕ) * n * n) * ((64 : ℕ) * ((9 : ℕ) * (81 : ℕ) ^ n)) ≤ (2 : ℕ) ^ ((4 : ℕ) * n * n) * ((64 : ℕ) * (256 : ℕ) ^ n), with this : (9 : ℕ) * (81 : ℕ) ^ n ≤ (256 : ℕ) ^ n.

          Lean, line 638
                  have := ineq_pow n hn

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 638 at dfc7b5cc45a9 ↗

      9. h4_big.s7.hreal have (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 : ℕ)), with hreal : (64 : ℝ) * (3 : ℝ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)).

        Lean, lines 640–641
              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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 640–641 at dfc7b5cc45a9 ↗

      10. h4_big.s7.hx2' have x / (2 : ℝ) = (3 : ℝ) / (2 : ℝ) ^ (n + (1 : ℕ))

        Leaves r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hx2' : x / (2 : ℝ) = (3 : ℝ) / (2 : ℝ) ^ (n + (1 : ℕ)).

        Uses library pow_succ.

        Lean, line 642
              have hx2' : x / 2 = 3 / 2 ^ (n + 1) := by rw [hxdef, pow_succ]; field_simp

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 642 at dfc7b5cc45a9 ↗

      11. h4_big.s7.hsq' have r ^ (2 : ℕ) ≤ (64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ))

        Leaves r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hsq' : r ^ (2 : ℕ) ≤ (64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)).

        Lean, lines 643–645
              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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 643–645 at dfc7b5cc45a9 ↗

        1. h4_big.s7.hsq'.s1 calc r ^ (2 : ℕ) ≤ ((8 : ℝ) * (x / (2 : ℝ)) ^ ((2 : ℕ) * n + (1 : ℕ))) ^ (2 : ℕ)

          Closes the goal.

          Lean, line 644
                  calc r ^ 2 ≤ (8 * (x / 2) ^ (2 * n + 1)) ^ 2 := hsq

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 644 at dfc7b5cc45a9 ↗

        2. h4_big.s7.hsq'.s2 calc routine: ring

          Closes the goal.

          Lean, line 645
                    _ = 64 * (x / 2) ^ (4 * n + 2) := by ring

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 645 at dfc7b5cc45a9 ↗

      12. h4_big.s7.hkey have (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 : ℕ)), with hkey : (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)) * ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)) = (3 : ℝ) ^ ((4 : ℕ) * n + (2 : ℕ)).

        Uses library mul_pow, div_mul_cancel₀.

        Lean, lines 646–647
              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/spec-180d8b72/Proof.lean, lines 646–647 at dfc7b5cc45a9 ↗

      13. h4_big.s7.hP have (0 : ℝ) < ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)) routine: positivity

        Leaves r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)), with hP : (0 : ℝ) < ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ)).

        Lean, line 648
              have hP : (0 : ℝ) < ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) := by positivity

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 648 at dfc7b5cc45a9 ↗

      14. h4_big.s7.hmain have (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 : ℕ)), with hmain : (64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)).

        Uses library le_of_mul_le_mul_right.

        Lean, lines 649–653
              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

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 649–653 at dfc7b5cc45a9 ↗

        1. h4_big.s7.hmain.s1 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)

          Closes the goal.

          Lean, lines 651–652
                  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

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 651–652 at dfc7b5cc45a9 ↗

        2. h4_big.s7.hmain.s2 calc (64 : ℝ) * (3 : ℝ) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ)) * ((2 : ℝ) ^ (n + (1 : ℕ))) ^ ((4 : ℕ) * n + (2 : ℕ))

          Closes the goal.

          Lean, line 653
                    _ ≤ 2 ^ (2 * n + 4) * ((2 : ℝ) ^ (n + 1)) ^ (4 * n + 2) := hreal

          targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 653 at dfc7b5cc45a9 ↗

      15. h4_big.s7.s15 calc r ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n)

        Closes the goal.

        Lean, line 654
              calc r ^ 2 * (2 : ℝ) ^ (4 * n * n) ≤ 64 * (x / 2) ^ (4 * n + 2) * 2 ^ (4 * n * n) := by gcongr

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 654 at dfc7b5cc45a9 ↗

      16. h4_big.s7.s16 calc (64 : ℝ) * (x / (2 : ℝ)) ^ ((4 : ℕ) * n + (2 : ℕ)) * (2 : ℝ) ^ ((4 : ℕ) * n * n) ≤ (2 : ℝ) ^ ((2 : ℕ) * n + (4 : ℕ))

        Closes the goal.

        Lean, line 655
                _ ≤ 2 ^ (2 * n + 4) := hmain

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 655 at dfc7b5cc45a9 ↗

  16. T_facts have (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 : ℕ), (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 : ℕ)), with 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 : ℝ).

    Uses library Summable Summable f means that f has some (infinite) sum with respect to L. , And.intro And.intro : a → b → a ∧ b is the constructor for the And operation. .

    Lean, lines 658–681
      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

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 658–681 at dfc7b5cc45a9 ↗

    1. T_facts.h5 have ∀ (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 : ℝ), with h5 : ∀ (m : ℕ), (5 : ℝ) * (2 : ℝ) ^ m ≤ (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ).

      Lean, lines 660–664
          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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 660–664 at dfc7b5cc45a9 ↗

      1. T_facts.h5.h1 have (1 : ℝ) ≤ (2 : ℝ) ^ m

        Leaves (5 : ℝ) * (2 : ℝ) ^ m ≤ (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ), with h1 : (1 : ℝ) ≤ (2 : ℝ) ^ m.

        Uses library one_le_pow₀.

        Lean, line 662
              have h1 : (1 : ℝ) ≤ 2 ^ m := one_le_pow₀ (by norm_num)

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 662 at dfc7b5cc45a9 ↗

      2. T_facts.h5.e have (2 : ℝ) ^ (m + (3 : ℕ)) = (8 : ℝ) * (2 : ℝ) ^ m

        Leaves (5 : ℝ) * (2 : ℝ) ^ m ≤ (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ), with e : (2 : ℝ) ^ (m + (3 : ℕ)) = (8 : ℝ) * (2 : ℝ) ^ m.

        Uses library pow_add.

        Lean, line 663
              have e : (2 : ℝ) ^ (m + 3) = 8 * 2 ^ m := by rw [pow_add]; norm_num; ring

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 663 at dfc7b5cc45a9 ↗

    2. T_facts.hpos have ∀ (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 : ℝ), with hpos : ∀ (m : ℕ), (0 : ℝ) < (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ).

      Lean, lines 665–667
          have hpos : ∀ m : ℕ, 0 < (2 : ℝ) ^ (m + 3) - 3 := fun m => by
            have := h5 m; have : (0 : ℝ) < 2 ^ m := by positivity
            linarith

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 665–667 at dfc7b5cc45a9 ↗

      1. T_facts.hpos.s1 have (5 : ℝ) * (2 : ℝ) ^ m ≤ (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)

        Leaves (0 : ℝ) < (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ), with this : (5 : ℝ) * (2 : ℝ) ^ m ≤ (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ).

        Lean, line 666
              have := h5 m; have : (0 : ℝ) < 2 ^ m := by positivity

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 666 at dfc7b5cc45a9 ↗

      2. T_facts.hpos.s2 have (0 : ℝ) < (2 : ℝ) ^ m routine: positivity

        Leaves (0 : ℝ) < (2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ), with this : (0 : ℝ) < (2 : ℝ) ^ m.

        Lean, line 666
              have := h5 m; have : (0 : ℝ) < 2 ^ m := by positivity

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 666 at dfc7b5cc45a9 ↗

    3. T_facts.hle have ∀ (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m

      Leaves (Summable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ))) ∧ (0 : ℝ) < ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ∧ ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (2 / 5 : ℝ), with hle : ∀ (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m.

      Uses library one_div_le_one_div_of_le.

      Lean, lines 668–673
          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/spec-180d8b72/Proof.lean, lines 668–673 at dfc7b5cc45a9 ↗

      1. T_facts.hle.e have (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m = (1 : ℝ) / ((5 : ℝ) * (2 : ℝ) ^ m)

        Leaves (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m, with e : (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m = (1 : ℝ) / ((5 : ℝ) * (2 : ℝ) ^ m).

        Uses library one_div_pow.

        Lean, lines 670–671
              have e : (1 / 5 : ℝ) * (1 / 2) ^ m = 1 / (5 * 2 ^ m) := by
                rw [one_div_pow]; field_simp

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 670–671 at dfc7b5cc45a9 ↗

    4. T_facts.hs have Summable 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 : ℝ), with hs : Summable fun (m : ℕ) => (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)).

      Uses library Summable Summable f means that f has some (infinite) sum with respect to L. , Summable.of_nonneg_of_le Comparison test of convergence of series of non-negative real numbers. , le_of_lt, one_div_pos, summable_geometric_two.

      Lean, lines 674–676
          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/spec-180d8b72/Proof.lean, lines 674–676 at dfc7b5cc45a9 ↗

    5. T_facts.s5 case

      Leaves (0 : ℝ) < ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)).

      Uses library le_of_lt, one_div_pos.

      Lean, line 678
          · 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/spec-180d8b72/Proof.lean, line 678 at dfc7b5cc45a9 ↗

    6. T_facts.s6 case

      Leaves ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ (2 / 5 : ℝ).

      Lean, lines 679–681
          · 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

      targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 679–681 at dfc7b5cc45a9 ↗

      1. T_facts.s6.s1 calc ∑' (m : ℕ), (1 : ℝ) / ((2 : ℝ) ^ (m + (3 : ℕ)) - (3 : ℝ)) ≤ ∑' (m : ℕ), (1 / 5 : ℝ) * (1 / 2 : ℝ) ^ m

        Closes the goal.

        Uses library summable_geometric_two.

        Lean, lines 679–680
            · 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/spec-180d8b72/Proof.lean, lines 679–680 at dfc7b5cc45a9 ↗

      2. T_facts.s6.s2 calc

        Closes the goal.

        Uses library tsum_mul_left, tsum_geometric_two.

        Lean, line 681
                _ = 2 / 5 := by rw [tsum_mul_left, tsum_geometric_two]; norm_num

        targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 681 at dfc7b5cc45a9 ↗

  17. s17 obtain (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 : ℕ), (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 : ℕ)), with left✝ : 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 682
      obtain ⟨_, hTpos, hTle⟩ := T_facts

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 682 at dfc7b5cc45a9 ↗

  18. hQx0 have Qx (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 : ℕ)), with hQx0 : Qx (0 : ℕ) = (1 : ℚ).

    Lean, line 686
        have hQx0 : Qx 0 = 1 := by rw [hQx, hQc]; simp

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 686 at dfc7b5cc45a9 ↗

  19. hAq0 have Aq (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 : ℕ)), with hAq0 : Aq (0 : ℕ) = (0 : ℚ).

    Lean, line 687
        have hAq0 : Aq 0 = 0 := by rw [hAq]; simp

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 687 at dfc7b5cc45a9 ↗

  20. e have ((1 : ℝ) * ((3 : ℝ) * T) - (0 : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * (0 : ℕ) * (0 : ℕ)) = (9 : ℝ) * (T * T) routine: ring

    Leaves ((1 : ℝ) * ((3 : ℝ) * T) - (0 : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ (0 : ℕ) ≤ (2 : ℝ) ^ (4 : ℕ), with e : ((1 : ℝ) * ((3 : ℝ) * T) - (0 : ℝ)) ^ (2 : ℕ) * (2 : ℝ) ^ ((4 : ℕ) * (0 : ℕ) * (0 : ℕ)) = (9 : ℝ) * (T * T).

    Lean, line 692
        have e : ((1 : ℝ) * (3 * T) - 0) ^ 2 * (2 : ℝ) ^ (4 * 0 * 0) = 9 * (T * T) := by ring

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, line 692 at dfc7b5cc45a9 ↗

  21. hQx1 have Qx (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 : ℕ)), with hQx1 : Qx (1 : ℕ) = (3 / 2 : ℚ).

    Uses library Finset.sum_range_succ, Finset.prod_range_succ.

    Lean, lines 698–699
        have hQx1 : Qx 1 = 3 / 2 := by
          rw [hQx, hQc]; norm_num [Finset.sum_range_succ, Finset.prod_range_succ]

    targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, lines 698–699 at dfc7b5cc45a9 ↗

  22. hAq1 have Aq (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 : ℕ)), with hAq1 : Aq (1 : ℕ) = (0 : ℚ).

    Uses library Finset.sum_range_succ, Finset.prod_range_succ.

    Lean, lines 700–702
        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/spec-180d8b72/Proof.lean, lines 700–702 at dfc7b5cc45a9 ↗

The proof in Lean (Proof.lean)

Checked by the kernel — these bytes are the ones its attestation names: attestations/000327.json, merge commit dfc7b5cc45a9.

Proof.lean — its sha256 is the artifact_hash of the attestation below, so these are the bytes the gate checked. Rendered from targets/erdos-1050/nodes/spec-180d8b72/Proof.lean, sha256 3ff2a2cfeae6.
import Mathlib
import Nodes.«spec-180d8b72».Context

/-- erdos-1050, Borwein's route: the remainder bound `hrem` of the skeleton on erdos-1050--h1-v2 (hole erdos-1050--h1-v2--h4), without the denominator bound `hden` that the hole carries as an unused hypothesis (revision request, graph PR #229). With T = sum 1/(2^(n+3) - 3) and x_n = 3/2^n, the Pade remainder R_n = Q_n(x_n) * 3T - A_n is positive and R_n^2 * 2^(4n^2) <= 2^(2n+4). Numerically checked for n <= 30 (tightest at n = 1). -/
theorem erdos_1050_pade_remainder_bound : ∀ (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 : ℕ),
                (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

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.«spec-180d8b72».Context

/-- erdos-1050, Borwein's route: the remainder bound `hrem` of the skeleton on erdos-1050--h1-v2 (hole erdos-1050--h1-v2--h4), without the denominator bound `hden` that the hole carries as an unused hypothesis (revision request, graph PR #229). With T = sum 1/(2^(n+3) - 3) and x_n = 3/2^n, the Pade remainder R_n = Q_n(x_n) * 3T - A_n is positive and R_n^2 * 2^(4n^2) <= 2^(2n+4). Numerically checked for n <= 30 (tightest at n = 1). -/
theorem erdos_1050_pade_remainder_bound : ∀ (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 : ℕ),
                (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
  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 →

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; with $x_n=3/2^n$, $Q_x(n)$ is the polynomial $\sum_k Q_c(n,k)X^k$ at $x_n$. 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}$. 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; there are no other hypotheses, and the doc comment's numerical check for $n\le 30$ is a comment, not part of what Lean checks.

Rendered from gloss/e4490fe8efbd….md · Improve these words →

History: 2 versions on record
  1. 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/624faabaa55d….md · the first version of its chain

    Read this version

    This file states the theorem erdos_1050_pade_remainder_bound. Its doc comment calls it the remainder bound hrem of the skeleton on erdos-1050--h1-v2 (the hole erdos-1050--h1-v2--h4), without the hypothesis hden that the hole carries. The statement below is the hole's statement with that one hypothesis removed.

    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$.

    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). With $x_n=3/2^n$, $Q_x(n)$ is the polynomial $\sum_k Q_c(n,k)X^k$ evaluated at $x_n$. 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}$.

    There are no other hypotheses. The doc comment also says the bound was checked numerically for $n\le 30$ and is tightest at $n=1$; that remark is a comment, not part of what Lean checks.

  2. 2026-10-18 · written by f29-words, drafted with Claude Fable 5.1 (claude-fable-5-1) · not signed · current · gloss/e4490fe8efbd….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; with $x_n=3/2^n$, $Q_x(n)$ is the polynomial $\sum_k Q_c(n,k)X^k$ at $x_n$. 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}$. 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; there are no other hypotheses, and the doc comment's numerical check for $n\le 30$ is a comment, not part of what Lean checks.

Diff of e4490fe8efbd against 624faabaa55d
@@ -1,19 +1,3 @@
-This file states the theorem `erdos_1050_pade_remainder_bound`. Its doc comment calls it the remainder bound `hrem` of the skeleton on `erdos-1050--h1-v2` (the hole `erdos-1050--h1-v2--h4`), without the hypothesis `hden` that the hole carries. The statement below is the hole's statement with that one hypothesis removed.
+$$\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$.
-
-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). With $x_n=3/2^n$, $Q_x(n)$ is the polynomial $\sum_k Q_c(n,k)X^k$ evaluated at $x_n$. 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}$.
-
-There are no other hypotheses. The doc comment also says the bound was checked numerically for $n\le 30$ and is tightest at $n=1$; that remark is a comment, not part of what Lean checks.
+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; with $x_n=3/2^n$, $Q_x(n)$ is the polynomial $\sum_k Q_c(n,k)X^k$ at $x_n$. 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}$. 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; there are no other hypotheses, and the doc comment's numerical check for $n\le 30$ is a comment, not part of what Lean checks.

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/spec-180d8b72/Statement.lean. Origin: authored.

Attestation: pass, 7 of 7 checks

Checked by the kernel — the gate’s record of the run: attestations/000327.json, merge commit dfc7b5cc45a9.

Verdict pass, from attestations/000327.json.

Submitter
t1001-1050a
Toolchain
leanprover/lean4:v4.33.1 (hash f54d0bc916bf76a7fae460ce9d078ccd1f74aeb4fd12c4b6546bca28b6aa1c63)
Mathlib
0df444a360eaa60ab8c11dca51a86af692955474
Reviewer
none needed (calibration)
StepCheckResult
1toolchainpass
2pathspass
4kernel-replaypass
5axiomspass
6hazardspass
7witnesspass
8depspass
Witness

Checked by the kernel — step 7 passed in the run its attestation records: attestations/000327.json, merge commit dfc7b5cc45a9.

Witness.lean — checked at step 7 of the run recorded below: pass. Rendered from targets/erdos-1050/nodes/spec-180d8b72/Witness.lean, sha256 b97324b1a56e.
import Mathlib

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 : ℚ))) :=
  ⟨_, _, _, 0, 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 imports only Mathlib. It 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

  • $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$, and
  • $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$.

These are the three hypotheses of the statement of this node (erdos_1050_pade_remainder_bound), written exactly as there (as equations between functions), so the theorem says those hypotheses can all hold at once. The existentially quantified $n$ appears in none of the three equations; the statement's own $n$ is quantified after the hypotheses and has no counterpart here.

The proof takes for $Q_c$, $Q_x$ and $A_q$ the functions the formulas define, and $n=0$; each equation then holds by definition (rfl).

Rendered from gloss/817faba6618a….md · Improve these words →

Acknowledged findings (13)

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a div-zero finding at (2 ^ (2 * n - k - i) - 1) / (2 ^ (i + 1) - 1)

The divisor 2^(i+1) - 1 is at least 1 for every i; the definition of Qc is copied verbatim from erdos-1050--h1-v2--h4 (and h3).

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a div-zero finding at (2 ^ (n - i) - 1) / (2 ^ (i + 1) - 1)

The divisor 2^(i+1) - 1 is at least 1 for every i; copied verbatim from Qc in erdos-1050--h1-v2--h4.

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a div-zero finding at 1 / (2 ^ (n + 3) - 3)

2^(n+3) - 3 >= 5 for every n, so no junk value; this is the target's own sum T.

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a div-zero finding at 3 / (2 ^ (j + 1) - 3)

2^(j+1) - 3 is -1 at j = 0, 1 at j = 1 and >= 5 after, never 0; c_n = sum_{j<n} 3/(2^(j+1) - 3), copied from the hole.

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a div-zero finding at 3 / 2 ^ n

2^n is never 0.

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a div-zero finding at Qc n j / (2 ^ (k - j) - 1)

Intended: the divisor is 0 exactly at j = k, and Lean's x / 0 = 0 makes that term vanish, which is the Pade numerator's coefficient (f has no constant term); copied verbatim from the hole.

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a nat-sub finding at 2 * n - k

Inside Qc n k with k <= n (Qx and Aq only use k in range (n+1)), so 2n - k >= n: no truncation.

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a nat-sub finding at 2 * n - k - i

k <= n and i < n, so 2n - k - i >= 1: no truncation.

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a nat-sub finding at k - 1

Used only in k*(k-1)/2, which is 0 at k = 0 with or without truncation, as intended.

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a nat-sub finding at k - j

j ranges over range (k+1), so j <= k and k - j never truncates; k - j = 0 at j = k is intended (see the division finding).

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a nat-sub finding at n - i

i < k <= n inside Qc n k as used here, so n - i >= 1: no truncation.

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a off-by-one-range finding at Finset.range (k + 1)

Intended inclusive endpoint: the coefficient of x^k sums over j = 0..k.

Untrusted contributor text — the prover’s justification for a finding.

Untrusted: acknowledgment of a off-by-one-range finding at Finset.range (n + 1)

Intended inclusive endpoint: Q_n and P_n are polynomials of degree n, summed over k = 0..n.

How to read this page