Documentation

LeanPool.FelConjecture.Solution

Fel's Conjecture for Numerical Semigroups #

A numerical semigroup: an additive submonoid of ℕ with finite complement.

Instances For

    The gaps of S: the (finite) complement ℕ \ S as a Finset.

    Equations
    Instances For

      The gap power sum G_r(S) = ∑_{g ∈ Δ} g^r (Definition 3 in the paper).

      Equations
      Instances For

        The gap polynomial Φ_S(z) = ∑_{g ∈ Δ} z^g (Definition 4 in the paper).

        Equations
        Instances For

          The Hilbert series H_S(z) = ∑_{s ∈ S} z^s, expressed as a formal power series.

          Equations
          Instances For

            The coefficient of the Hilbert series at position n is 1 if n ∈ S.carrier, else 0.

            The coefficient of the gap polynomial (viewed as a power series) at position n is 1 if n ∈ S.gaps, else 0.

            For any n, we have n ∈ S.gaps ↔ n ∉ S.carrier.

            A choice of generators for a numerical semigroup S: positive integers d₁, …, d_m with gcd = 1 whose nonneg-integer combinations recover S.carrier.

            Instances For

              The product of generators π_m = ∏ᵢ dᵢ (Definition 6 in the paper).

              Equations
              Instances For

                The product polynomial P_S(z) = ∏ᵢ (1 - z^{dᵢ}) (Definition 6 in the paper).

                Equations
                Instances For

                  Upper bound on the degree of the Hilbert numerator Q_S(z).

                  Equations
                  Instances For

                    The Hilbert numerator Q_S(z), computed coefficient-wise from P_S and the gaps.

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      theorem NumericalSemigroupGenerators.sum_range_reindex (f : ℕ → ℚ) (n : ℕ) :
                      ∑ k ∈ Finset.range (n + 1), f (n - k) = ∑ j ∈ Finset.range (n + 1), f j

                      The coefficients cⱼ in the expansion Q_S(z) = 1 - ∑_{j ≥ 1} cⱼ z^j.

                      Equations
                      Instances For

                        The alternating power sum C_n(S) = ∑_{j ≥ 1} cⱼ · jⁿ (Definition 8).

                        Equations
                        Instances For

                          The invariant K_p(S) = ((-1)^m · p!) / ((m+p)! · π_m) · C_{m+p}(S) (Definition 9 in the paper).

                          Equations
                          Instances For

                            The single factor `(e^{dᵢ t} -

                            1. / (dᵢ t) = ∑_k dᵢ^k · t^k / (k+1)!of theA` generating series.
                            Equations
                            Instances For

                              The generating series A(t) = ∏ᵢ (e^{dᵢ t} - 1) / (dᵢ t) (Definition 10).

                              Equations
                              Instances For

                                The symbol T_n(σ) = n! · [t^n] A(t) (Definition 10).

                                Equations
                                Instances For

                                  The generating series B(t) = (t / (e^t - 1)) · A(t) (Definition 11).

                                  Equations
                                  Instances For

                                    The symbol T_n(δ) = (n! / 2^n) · [t^n] B(t) (Definition 11).

                                    Equations
                                    Instances For
                                      theorem FelsConjectureProof.bernoulli_term_simplify (m p piM : ℕ) (hpi : 0 < piM) (coeff : ℚ) :
                                      (-1) ^ m * ↑p.factorial / (↑(m + p).factorial * ↑piM) * ((-1) ^ m * ↑piM * ↑(m + p).factorial * coeff) = ↑p.factorial * coeff
                                      theorem FelsConjectureProof.outer_factor_cancel {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ℕ) (sum_term : ℚ) :
                                      (-1) ^ G.m * ↑p.factorial / (↑(G.m + p).factorial * ↑G.piM) * ((-1) ^ G.m * ↑G.piM * sum_term) = ↑p.factorial / ↑(G.m + p).factorial * sum_term
                                      theorem FelsConjectureProof.term_simplify (m p r : ℕ) (hr : r ≤ p) (A_coeff G_r : ℚ) :
                                      ↑p.factorial / ↑(m + p).factorial * (↑((m + p).choose r) * ↑(m + p - r).factorial * A_coeff * G_r) = ↑p.factorial / ↑r.factorial * A_coeff * G_r
                                      theorem FelsConjectureProof.gap_sum_simplify {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ℕ) :
                                      (-1) ^ G.m * ↑p.factorial / (↑(G.m + p).factorial * ↑G.piM) * ((-1) ^ G.m * ↑G.piM * ∑ r ∈ Finset.range (p + 1), ↑((G.m + p).choose r) * ↑(G.m + p - r).factorial * (PowerSeries.coeff (p - r)) G.ASeries * S.gapPowerSum r) = ∑ r ∈ Finset.range (p + 1), ↑p.factorial / ↑r.factorial * (PowerSeries.coeff (p - r)) G.ASeries * S.gapPowerSum r

                                      Auxiliary series obtained by evaluating Q_S at t ↦ ∑ jⁿ t^n / n! per coordinate.

                                      Equations
                                      • One or more equations did not get rendered due to their size.
                                      Instances For

                                        Auxiliary helper: Q_S minus its constant term, evaluated coefficient-wise on the exponential expansion.

                                        Equations
                                        Instances For
                                          theorem FelsConjectureProof.coeff_A_mul_E {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ℕ) :
                                          (PowerSeries.coeff p) (G.ASeries * PowerSeries.mk fun (n : ℕ) => ∑ g ∈ S.gaps, ↑g ^ n / ↑n.factorial) = ∑ r ∈ Finset.range (p + 1), (PowerSeries.coeff (p - r)) G.ASeries * ∑ g ∈ S.gaps, ↑g ^ r / ↑r.factorial
                                          theorem FelsConjectureProof.sum_swap_gaps_range {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ℕ) :
                                          ∑ r ∈ Finset.range (p + 1), (PowerSeries.coeff (p - r)) G.ASeries * ∑ g ∈ S.gaps, ↑g ^ r / ↑r.factorial = ∑ g ∈ S.gaps, ∑ r ∈ Finset.range (p + 1), (PowerSeries.coeff (p - r)) G.ASeries * ↑g ^ r / ↑r.factorial
                                          theorem FelsConjectureProof.gap_term_coeff_shift {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ℕ) :
                                          (PowerSeries.coeff (G.m + p)) (PowerSeries.X ^ G.m * G.ASeries * PowerSeries.mk fun (n : ℕ) => ∑ g ∈ S.gaps, ↑g ^ n / ↑n.factorial) = ∑ g ∈ S.gaps, ∑ r ∈ Finset.range (p + 1), (PowerSeries.coeff (p - r)) G.ASeries * ↑g ^ r / ↑r.factorial
                                          theorem FelsConjectureProof.Q_exp_coeff_at_m_plus_p {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ℕ) :
                                          (PowerSeries.coeff (G.m + p)) (QExpSeries G) = (-1) ^ (G.m + 1) * ↑G.piM * ((PowerSeries.coeff (p + 1)) G.BSeries + ∑ g ∈ S.gaps, ∑ r ∈ Finset.range (p + 1), (PowerSeries.coeff (p - r)) G.ASeries * ↑g ^ r / ↑r.factorial)
                                          theorem FelsConjectureProof.gap_coeff_to_leibniz {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ℕ) :
                                          ↑(G.m + p).factorial * ∑ g ∈ S.gaps, ∑ r ∈ Finset.range (p + 1), (PowerSeries.coeff (p - r)) G.ASeries * ↑g ^ r / ↑r.factorial = ∑ g ∈ S.gaps, ∑ r ∈ Finset.range (p + 1), ↑(G.m + p).factorial / ↑r.factorial * (PowerSeries.coeff (p - r)) G.ASeries * ↑g ^ r
                                          theorem FelsConjectureProof.gap_sum_swap {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ℕ) :
                                          ∑ g ∈ S.gaps, ∑ r ∈ Finset.range (p + 1), ↑(G.m + p).factorial / ↑r.factorial * (PowerSeries.coeff (p - r)) G.ASeries * ↑g ^ r = ∑ r ∈ Finset.range (p + 1), ↑((G.m + p).choose r) * ↑(G.m + p - r).factorial * (PowerSeries.coeff (p - r)) G.ASeries * S.gapPowerSum r
                                          theorem FelsConjectureProof.gap_term_final_form {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ℕ) :
                                          ↑(G.m + p).factorial * ∑ g ∈ S.gaps, ∑ r ∈ Finset.range (p + 1), (PowerSeries.coeff (p - r)) G.ASeries * ↑g ^ r / ↑r.factorial = ∑ r ∈ Finset.range (p + 1), ↑((G.m + p).choose r) * ↑(G.m + p - r).factorial * (PowerSeries.coeff (p - r)) G.ASeries * S.gapPowerSum r

                                          For a polynomial P : ℤ[X], the formal power series ∑ₙ (P.coeff n : ℚ) · t^n / n! minus its constant term.

                                          Equations
                                          Instances For
                                            theorem FelsConjectureProof.exp_poly_sub_sum_extend (P : Polynomial ℤ) (k n : ℕ) (hk : P.natDegree + 1 ≤ k) :
                                            ∑ j ∈ Finset.range (P.natDegree + 1), ↑(P.coeff j) * ↑j ^ n = ∑ j ∈ Finset.range k, ↑(P.coeff j) * ↑j ^ n
                                            theorem FelsConjectureProof.telescoping_general (D n : ℕ) (P : Polynomial ℤ) :
                                            ∑ j ∈ Finset.range (D + 1), (∑ k ∈ Finset.range (j + 1), ↑(P.coeff k)) * ((↑j + 1) ^ n - ↑j ^ n) = (∑ k ∈ Finset.range (D + 1), ↑(P.coeff k)) * (↑D + 1) ^ n - ∑ j ∈ Finset.range (D + 1), ↑(P.coeff j) * ↑j ^ n
                                            theorem FelsConjectureProof.coeff_eq_partial_sum_diff (P : Polynomial ℤ) (n : ℕ) :
                                            ↑(P.coeff n) = ∑ k ∈ Finset.range (n + 1), ↑(P.coeff k) - ∑ k ∈ Finset.range n, ↑(P.coeff k)

                                            Generating function for the partial sums of P_S.coeff along Finset.range.

                                            Equations
                                            • One or more equations did not get rendered due to their size.
                                            Instances For
                                              theorem FelsConjectureProof.coeff_mul_expand (P Q : Polynomial ℤ) (n : ℕ) :
                                              (PowerSeries.coeff n) (expPolySub P * expPolySub Q) = ∑ k ∈ Finset.range (n + 1), (∑ a ∈ Finset.range (P.natDegree + 1), ↑(P.coeff a) * ↑a ^ k) / ↑k.factorial * ((∑ b ∈ Finset.range (Q.natDegree + 1), ↑(Q.coeff b) * ↑b ^ (n - k)) / ↑(n - k).factorial)
                                              theorem FelsConjectureProof.lhs_to_triple_sum (P Q : Polynomial ℤ) (n : ℕ) :
                                              ∑ k ∈ Finset.range (n + 1), (∑ a ∈ Finset.range (P.natDegree + 1), ↑(P.coeff a) * ↑a ^ k) / ↑k.factorial * ((∑ b ∈ Finset.range (Q.natDegree + 1), ↑(Q.coeff b) * ↑b ^ (n - k)) / ↑(n - k).factorial) = ∑ k ∈ Finset.range (n + 1), ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * ↑a ^ k * ↑b ^ (n - k) / (↑k.factorial * ↑(n - k).factorial)
                                              theorem FelsConjectureProof.term_factorial_to_choose (Pa Qb : ℚ) (a b k n : ℕ) (hk : k ≤ n) :
                                              Pa * Qb * ↑a ^ k * ↑b ^ (n - k) / (↑k.factorial * ↑(n - k).factorial) = Pa * Qb * ↑a ^ k * ↑b ^ (n - k) * (↑(n.choose k) / ↑n.factorial)
                                              theorem FelsConjectureProof.sum_coeff_one_sub_X_pow (k : ℕ) (_hk : 0 < k) :
                                              ∑ j ∈ Finset.range (k + 1), ↑((1 - Polynomial.X ^ k).coeff j) = 0
                                              theorem FelsConjectureProof.one_sub_X_pow_term_eq_zero (k n j : ℕ) (_hk : 0 < k) (hn : 1 ≤ n) (_hj_mem : j ∈ Finset.range (k + 1)) (hj_ne : j ≠ k) :
                                              ↑((1 - Polynomial.X ^ k).coeff j) * ↑j ^ n = 0
                                              theorem FelsConjectureProof.one_sub_X_pow_term_at_k (k n : ℕ) (hk : 0 < k) :
                                              ↑((1 - Polynomial.X ^ k).coeff k) * ↑k ^ n = -↑k ^ n
                                              theorem FelsConjectureProof.one_sub_X_pow_sum_eq (k n : ℕ) (hk : 0 < k) (hn : 1 ≤ n) :
                                              ∑ j ∈ Finset.range ((1 - Polynomial.X ^ k).natDegree + 1), ↑((1 - Polynomial.X ^ k).coeff j) * ↑j ^ n = -↑k ^ n
                                              theorem FelsConjectureProof.prod_smul_eq_smul_prod (m : ℕ) (c : Fin m → ℚ) (f : Fin m → PowerSeries ℚ) :
                                              ∏ i : Fin m, c i • f i = (∏ i : Fin m, c i) • ∏ i : Fin m, f i
                                              theorem FelsConjectureProof.prod_X_mul_eq_X_pow_mul (m : ℕ) (f : Fin m → PowerSeries ℚ) :
                                              ∏ i : Fin m, PowerSeries.X * f i = PowerSeries.X ^ m * ∏ i : Fin m, f i
                                              theorem FelsConjectureProof.prod_neg_eq_neg_one_pow_mul (m : ℕ) (c : Fin m → ℚ) :
                                              ∏ i : Fin m, -c i = (-1) ^ m * ∏ i : Fin m, c i
                                              theorem FelsConjectureProof.triple_sum_factorial_to_choose (P Q : Polynomial ℤ) (n : ℕ) :
                                              ∑ k ∈ Finset.range (n + 1), ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * ↑a ^ k * ↑b ^ (n - k) / (↑k.factorial * ↑(n - k).factorial) = ∑ k ∈ Finset.range (n + 1), ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * ↑a ^ k * ↑b ^ (n - k) * (↑(n.choose k) / ↑n.factorial)
                                              theorem FelsConjectureProof.factor_out_factorial (P Q : Polynomial ℤ) (n : ℕ) :
                                              ∑ k ∈ Finset.range (n + 1), ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * ↑a ^ k * ↑b ^ (n - k) * (↑(n.choose k) / ↑n.factorial) = 1 / ↑n.factorial * ∑ k ∈ Finset.range (n + 1), ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * ↑(n.choose k) * ↑a ^ k * ↑b ^ (n - k)
                                              theorem FelsConjectureProof.sum_rearrange (P Q : Polynomial ℤ) (n : ℕ) :
                                              ∑ k ∈ Finset.range (n + 1), ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * ↑(n.choose k) * ↑a ^ k * ↑b ^ (n - k) = ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ∑ k ∈ Finset.range (n + 1), ↑(P.coeff a) * ↑(Q.coeff b) * ↑(n.choose k) * ↑a ^ k * ↑b ^ (n - k)
                                              theorem FelsConjectureProof.factor_coeffs_from_inner_sum (P Q : Polynomial ℤ) (n : ℕ) :
                                              ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ∑ k ∈ Finset.range (n + 1), ↑(P.coeff a) * ↑(Q.coeff b) * ↑(n.choose k) * ↑a ^ k * ↑b ^ (n - k) = ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * ∑ k ∈ Finset.range (n + 1), ↑(n.choose k) * ↑a ^ k * ↑b ^ (n - k)
                                              theorem FelsConjectureProof.binomial_sum_eq_power (a b n : ℕ) :
                                              ∑ k ∈ Finset.range (n + 1), ↑(n.choose k) * ↑a ^ k * ↑b ^ (n - k) = (↑a + ↑b) ^ n
                                              theorem FelsConjectureProof.apply_binomial_to_inner_sum (P Q : Polynomial ℤ) (n : ℕ) :
                                              ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * ∑ k ∈ Finset.range (n + 1), ↑(n.choose k) * ↑a ^ k * ↑b ^ (n - k) = ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * (↑a + ↑b) ^ n
                                              theorem FelsConjectureProof.exp_poly_sub_mul_coeff_eq (P Q : Polynomial ℤ) (n : ℕ) :
                                              (PowerSeries.coeff n) (expPolySub P * expPolySub Q) = (∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * (↑a + ↑b) ^ n) / ↑n.factorial
                                              theorem FelsConjectureProof.convolution_sum_eq (P Q : Polynomial ℤ) (n : ℕ) :
                                              ∑ j ∈ Finset.range ((P * Q).natDegree + 1), ↑((P * Q).coeff j) * ↑j ^ n = ∑ j ∈ Finset.range (P.natDegree + Q.natDegree + 1), ∑ ab ∈ Finset.antidiagonal j, ↑(P.coeff ab.1) * ↑(Q.coeff ab.2) * (↑ab.1 + ↑ab.2) ^ n
                                              theorem FelsConjectureProof.term_vanishes_outside_rectangle (P Q : Polynomial ℤ) (n : ℕ) (ab : ℕ × ℕ) (_h_in_tri : ab ∈ (Finset.range (P.natDegree + Q.natDegree + 1)).biUnion Finset.antidiagonal) (h_not_rect : ab ∉ Finset.range (P.natDegree + 1) ×ˢ Finset.range (Q.natDegree + 1)) :
                                              ↑(P.coeff ab.1) * ↑(Q.coeff ab.2) * (↑ab.1 + ↑ab.2) ^ n = 0
                                              theorem FelsConjectureProof.nested_sum_eq_biUnion_sum (P Q : Polynomial ℤ) (n : ℕ) :
                                              ∑ j ∈ Finset.range (P.natDegree + Q.natDegree + 1), ∑ ab ∈ Finset.antidiagonal j, ↑(P.coeff ab.1) * ↑(Q.coeff ab.2) * (↑ab.1 + ↑ab.2) ^ n = ∑ ab ∈ (Finset.range (P.natDegree + Q.natDegree + 1)).biUnion Finset.antidiagonal, ↑(P.coeff ab.1) * ↑(Q.coeff ab.2) * (↑ab.1 + ↑ab.2) ^ n
                                              theorem FelsConjectureProof.product_sum_eq_nested (P Q : Polynomial ℤ) (n : ℕ) :
                                              ∑ ab ∈ Finset.range (P.natDegree + 1) ×ˢ Finset.range (Q.natDegree + 1), ↑(P.coeff ab.1) * ↑(Q.coeff ab.2) * (↑ab.1 + ↑ab.2) ^ n = ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * (↑a + ↑b) ^ n
                                              theorem FelsConjectureProof.triangular_to_rectangular_sum (P Q : Polynomial ℤ) (n : ℕ) :
                                              ∑ j ∈ Finset.range (P.natDegree + Q.natDegree + 1), ∑ ab ∈ Finset.antidiagonal j, ↑(P.coeff ab.1) * ↑(Q.coeff ab.2) * (↑ab.1 + ↑ab.2) ^ n = ∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * (↑a + ↑b) ^ n
                                              theorem FelsConjectureProof.exp_poly_sub_prod_coeff_eq (P Q : Polynomial ℤ) (n : ℕ) :
                                              (PowerSeries.coeff n) (expPolySub (P * Q)) = (∑ a ∈ Finset.range (P.natDegree + 1), ∑ b ∈ Finset.range (Q.natDegree + 1), ↑(P.coeff a) * ↑(Q.coeff b) * (↑a + ↑b) ^ n) / ↑n.factorial
                                              theorem FelsConjectureProof.binomial_sum_minus_j_pow (j n : ℕ) :
                                              (∑ k ∈ Finset.range (n + 1), if k = 0 then 0 else ↑(n.choose k) * ↑j ^ (n - k)) = (↑j + 1) ^ n - ↑j ^ n
                                              theorem FelsConjectureProof.coeff_sum_substitute {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ℕ) :
                                              ∑ k ∈ Finset.range (n + 1), (PowerSeries.coeff k) (1 - PowerSeries.exp ℚ) * (PowerSeries.coeff (n - k)) (partialSumGenFunc G) = ∑ k ∈ Finset.range (n + 1), (if k = 0 then 0 else -1 / ↑k.factorial) * ((∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ m ∈ Finset.range (j + 1), ↑(G.productPolynomial.coeff m)) * ↑j ^ (n - k)) / ↑(n - k).factorial)
                                              theorem FelsConjectureProof.drop_k_eq_zero_term {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ℕ) :
                                              ∑ k ∈ Finset.range (n + 1), (if k = 0 then 0 else -1 / ↑k.factorial) * ((∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ m ∈ Finset.range (j + 1), ↑(G.productPolynomial.coeff m)) * ↑j ^ (n - k)) / ↑(n - k).factorial) = ∑ k ∈ Finset.range (n + 1), if k = 0 then 0 else -1 / ↑k.factorial * ((∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ m ∈ Finset.range (j + 1), ↑(G.productPolynomial.coeff m)) * ↑j ^ (n - k)) / ↑(n - k).factorial)
                                              theorem FelsConjectureProof.summand_eq_for_pos {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n k : ℕ) (_hk_pos : k ≠ 0) (hk_le : k ≤ n) :
                                              -1 / ↑k.factorial * ((∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ m ∈ Finset.range (j + 1), ↑(G.productPolynomial.coeff m)) * ↑j ^ (n - k)) / ↑(n - k).factorial) = -↑(n.choose k) / ↑n.factorial * ∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ m ∈ Finset.range (j + 1), ↑(G.productPolynomial.coeff m)) * ↑j ^ (n - k)
                                              theorem FelsConjectureProof.apply_factorial_identity {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ℕ) :
                                              (∑ k ∈ Finset.range (n + 1), if k = 0 then 0 else -1 / ↑k.factorial * ((∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ m ∈ Finset.range (j + 1), ↑(G.productPolynomial.coeff m)) * ↑j ^ (n - k)) / ↑(n - k).factorial)) = ∑ k ∈ Finset.range (n + 1), if k = 0 then 0 else -↑(n.choose k) / ↑n.factorial * ∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ m ∈ Finset.range (j + 1), ↑(G.productPolynomial.coeff m)) * ↑j ^ (n - k)
                                              theorem FelsConjectureProof.factor_neg_choose_div_factorial (D n : ℕ) (coeff : ℕ → ℚ) :
                                              (∑ k ∈ Finset.range (n + 1), if k = 0 then 0 else -↑(n.choose k) / ↑n.factorial * ∑ j ∈ Finset.range (D + 1), coeff j * ↑j ^ (n - k)) = -1 / ↑n.factorial * ∑ k ∈ Finset.range (n + 1), if k = 0 then 0 else ↑(n.choose k) * ∑ j ∈ Finset.range (D + 1), coeff j * ↑j ^ (n - k)
                                              theorem FelsConjectureProof.swap_and_apply_binomial (D n : ℕ) (coeff : ℕ → ℚ) :
                                              (∑ k ∈ Finset.range (n + 1), if k = 0 then 0 else ↑(n.choose k) * ∑ j ∈ Finset.range (D + 1), coeff j * ↑j ^ (n - k)) = ∑ j ∈ Finset.range (D + 1), coeff j * ((↑j + 1) ^ n - ↑j ^ n)
                                              theorem FelsConjectureProof.factor_and_apply_binomial {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ℕ) :
                                              (∑ k ∈ Finset.range (n + 1), if k = 0 then 0 else -↑(n.choose k) / ↑n.factorial * ∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ m ∈ Finset.range (j + 1), ↑(G.productPolynomial.coeff m)) * ↑j ^ (n - k)) = -1 / ↑n.factorial * ∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ m ∈ Finset.range (j + 1), ↑(G.productPolynomial.coeff m)) * ((↑j + 1) ^ n - ↑j ^ n)
                                              theorem FelsConjectureProof.cond_equiv (m n : ℕ) :
                                              m ≤ n + 1 ↔ m - 1 ≤ n
                                              theorem FelsConjectureProof.index_eq (m n : ℕ) (hm : 0 < m) (h : m ≤ n + 1) :
                                              n + 1 - m = n - (m - 1)
                                              theorem FelsConjectureProof.neg_neg_one_pow_eq (m : ℕ) :
                                              -(-1) ^ m = (-1) ^ (m + 1)
                                              theorem FelsConjectureProof.summand_eq' {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n g j : ℕ) (hj : j ∈ {x ∈ Finset.range (G.hilbertNumerator.natDegree + 1) | g ≤ x}) :
                                              ↑(G.productPolynomial.coeff (j - g)) * ↑j ^ n = ↑(G.productPolynomial.coeff (j - g)) * (↑(j - g) + ↑g) ^ n
                                              theorem FelsConjectureProof.inner_sum_reindex {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n g : ℕ) (_hg : g ∈ S.gaps) :
                                              ∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1) with g ≤ j, ↑(G.productPolynomial.coeff (j - g)) * ↑j ^ n = ∑ k ∈ Finset.range (G.hilbertNumerator.natDegree + 1 - g), ↑(G.productPolynomial.coeff k) * (↑k + ↑g) ^ n
                                              theorem FelsConjectureProof.distribute_j_pow_into_sum {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n j : ℕ) :
                                              (∑ g ∈ S.gaps with g ≤ j, ↑(G.productPolynomial.coeff (j - g))) * ↑j ^ n = ∑ g ∈ S.gaps with g ≤ j, ↑(G.productPolynomial.coeff (j - g)) * ↑j ^ n
                                              theorem FelsConjectureProof.distribute_and_swap_sums {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ℕ) :
                                              ∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ g ∈ S.gaps with g ≤ j, ↑(G.productPolynomial.coeff (j - g))) * ↑j ^ n = ∑ g ∈ S.gaps, ∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1) with g ≤ j, ↑(G.productPolynomial.coeff (j - g)) * ↑j ^ n
                                              theorem FelsConjectureProof.gap_sum_exchange {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ℕ) :
                                              ∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ g ∈ S.gaps with g ≤ j, ↑(G.productPolynomial.coeff (j - g))) * ↑j ^ n = ∑ g ∈ S.gaps, ∑ k ∈ Finset.range (G.productPolynomial.natDegree + 1), ↑(G.productPolynomial.coeff k) * (↑k + ↑g) ^ n
                                              theorem FelsConjectureProof.binomial_sum_eq_add_pow (a b : ℚ) (n : ℕ) :
                                              ∑ k ∈ Finset.range (n + 1), ↑(n.choose k) * a ^ k * b ^ (n - k) = (a + b) ^ n
                                              theorem FelsConjectureProof.triple_sum_exchange (gaps : Finset ℕ) (degP : ℕ) (coeff : ℕ → ℚ) (n : ℕ) :
                                              ∑ g ∈ gaps, ∑ k ∈ Finset.range (degP + 1), ∑ r ∈ Finset.range (n + 1), coeff k * ↑(n.choose r) * ↑k ^ r * ↑g ^ (n - r) = ∑ r ∈ Finset.range (n + 1), ∑ g ∈ gaps, ∑ k ∈ Finset.range (degP + 1), coeff k * ↑(n.choose r) * ↑k ^ r * ↑g ^ (n - r)
                                              theorem FelsConjectureProof.factor_binomial_coeff_from_double_sum (gaps : Finset ℕ) (degP : ℕ) (coeff : ℕ → ℚ) (n r : ℕ) :
                                              ∑ g ∈ gaps, ∑ k ∈ Finset.range (degP + 1), coeff k * ↑(n.choose r) * ↑k ^ r * ↑g ^ (n - r) = (↑(n.choose r) * ∑ k ∈ Finset.range (degP + 1), coeff k * ↑k ^ r) * ∑ g ∈ gaps, ↑g ^ (n - r)
                                              theorem FelsConjectureProof.sum_choose_mul_div_factorial_eq_sum_div_factorials (n : ℕ) (A B : ℕ → ℚ) :
                                              ∑ r ∈ Finset.range (n + 1), ↑(n.choose r) * A r * B r / ↑n.factorial = ∑ r ∈ Finset.range (n + 1), A r / ↑r.factorial * (B r / ↑(n - r).factorial)
                                              theorem FelsConjectureProof.gap_sum_binomial_expand {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ℕ) :
                                              (∑ g ∈ S.gaps, ∑ k ∈ Finset.range (G.productPolynomial.natDegree + 1), ↑(G.productPolynomial.coeff k) * (↑k + ↑g) ^ n) / ↑n.factorial = ∑ r ∈ Finset.range (n + 1), (∑ k ∈ Finset.range (G.productPolynomial.natDegree + 1), ↑(G.productPolynomial.coeff k) * ↑k ^ r) / ↑r.factorial * ((∑ g ∈ S.gaps, ↑g ^ (n - r)) / ↑(n - r).factorial)
                                              theorem FelsConjectureProof.gap_sum_to_coeff {S : NumericalSemigroup} (k : ℕ) :
                                              (∑ g ∈ S.gaps, ↑g ^ k) / ↑k.factorial = (PowerSeries.coeff k) (PowerSeries.mk fun (j : ℕ) => ∑ g ∈ S.gaps, ↑g ^ j / ↑j.factorial)
                                              theorem FelsConjectureProof.coeff_mul_range' {R : Type u_1} [Semiring R] (φ ψ : PowerSeries R) (n : ℕ) :
                                              (PowerSeries.coeff n) (φ * ψ) = ∑ r ∈ Finset.range (n + 1), (PowerSeries.coeff r) φ * (PowerSeries.coeff (n - r)) ψ
                                              theorem FelsConjectureProof.sum_factor_scalar' {α : Type u_1} (s : Finset α) (c : ℚ) (a b : α → ℚ) :
                                              ∑ r ∈ s, c * a r * b r = c * ∑ r ∈ s, a r * b r
                                              theorem FelsConjectureProof.binomial_sum_to_convolution {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ℕ) :
                                              ∑ r ∈ Finset.range (n + 1), (∑ k ∈ Finset.range (G.productPolynomial.natDegree + 1), ↑(G.productPolynomial.coeff k) * ↑k ^ r) / ↑r.factorial * ((∑ g ∈ S.gaps, ↑g ^ (n - r)) / ↑(n - r).factorial) = (-1) ^ G.m * ↑G.piM * (PowerSeries.coeff n) (PowerSeries.X ^ G.m * G.ASeries * PowerSeries.mk fun (k : ℕ) => ∑ g ∈ S.gaps, ↑g ^ k / ↑k.factorial)
                                              theorem FelsConjectureProof.gap_part_equals_gap_term_natDegree {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ℕ) :
                                              (∑ j ∈ Finset.range (G.hilbertNumerator.natDegree + 1), (∑ g ∈ S.gaps with g ≤ j, ↑(G.productPolynomial.coeff (j - g))) * ↑j ^ n) / ↑n.factorial = (-1) ^ (G.m + 1) * ↑G.piM * -(PowerSeries.coeff n) (PowerSeries.X ^ G.m * G.ASeries * PowerSeries.mk fun (k : ℕ) => ∑ g ∈ S.gaps, ↑g ^ k / ↑k.factorial)
                                              theorem FelsConjectureProof.C_m_plus_p_formula {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ℕ) :
                                              G.alternatingPowerSum (G.m + p) = (-1) ^ G.m * ↑G.piM * ↑(G.m + p).factorial * (PowerSeries.coeff (p + 1)) G.BSeries + (-1) ^ G.m * ↑G.piM * ∑ r ∈ Finset.range (p + 1), ↑((G.m + p).choose r) * ↑(G.m + p - r).factorial * (PowerSeries.coeff (p - r)) G.ASeries * S.gapPowerSum r
                                              theorem FelsConjectureProof.factorial_div_eq_choose_mul {p r : ℕ} (hr : r ≤ p) :
                                              ↑p.factorial / ↑r.factorial = ↑(p.choose r) * ↑(p - r).factorial
                                              theorem FelsConjectureProof.fels_conjecture_main {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ℕ) :
                                              G.KInvariant p = ∑ r ∈ Finset.range (p + 1), ↑(p.choose r) * G.TSigma (p - r) * S.gapPowerSum r + 2 ^ (p + 1) / (↑p + 1) * G.TDelta (p + 1)
                                              theorem fels_conjecture (S : NumericalSemigroup) (G : NumericalSemigroupGenerators S) (p : ℕ) :
                                              G.KInvariant p = ∑ r ∈ Finset.range (p + 1), ↑(p.choose r) * G.TSigma (p - r) * S.gapPowerSum r + 2 ^ (p + 1) / (↑p + 1) * G.TDelta (p + 1)