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 : ) :
                      kFinset.range (n + 1), f (n - k) = jFinset.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 * rFinset.range (p + 1), ((G.m + p).choose r) * (G.m + p - r).factorial * (PowerSeries.coeff (p - r)) G.ASeries * S.gapPowerSum r) = rFinset.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 : ) => gS.gaps, g ^ n / n.factorial) = rFinset.range (p + 1), (PowerSeries.coeff (p - r)) G.ASeries * gS.gaps, g ^ r / r.factorial
                                          theorem FelsConjectureProof.sum_swap_gaps_range {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (p : ) :
                                          rFinset.range (p + 1), (PowerSeries.coeff (p - r)) G.ASeries * gS.gaps, g ^ r / r.factorial = gS.gaps, rFinset.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 : ) => gS.gaps, g ^ n / n.factorial) = gS.gaps, rFinset.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 + gS.gaps, rFinset.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 * gS.gaps, rFinset.range (p + 1), (PowerSeries.coeff (p - r)) G.ASeries * g ^ r / r.factorial = gS.gaps, rFinset.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 : ) :
                                          gS.gaps, rFinset.range (p + 1), (G.m + p).factorial / r.factorial * (PowerSeries.coeff (p - r)) G.ASeries * g ^ r = rFinset.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 * gS.gaps, rFinset.range (p + 1), (PowerSeries.coeff (p - r)) G.ASeries * g ^ r / r.factorial = rFinset.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) :
                                            jFinset.range (P.natDegree + 1), (P.coeff j) * j ^ n = jFinset.range k, (P.coeff j) * j ^ n
                                            theorem FelsConjectureProof.telescoping_general (D n : ) (P : Polynomial ) :
                                            jFinset.range (D + 1), (∑ kFinset.range (j + 1), (P.coeff k)) * ((j + 1) ^ n - j ^ n) = (∑ kFinset.range (D + 1), (P.coeff k)) * (D + 1) ^ n - jFinset.range (D + 1), (P.coeff j) * j ^ n
                                            theorem FelsConjectureProof.coeff_eq_partial_sum_diff (P : Polynomial ) (n : ) :
                                            (P.coeff n) = kFinset.range (n + 1), (P.coeff k) - kFinset.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) = kFinset.range (n + 1), (∑ aFinset.range (P.natDegree + 1), (P.coeff a) * a ^ k) / k.factorial * ((∑ bFinset.range (Q.natDegree + 1), (Q.coeff b) * b ^ (n - k)) / (n - k).factorial)
                                              theorem FelsConjectureProof.lhs_to_triple_sum (P Q : Polynomial ) (n : ) :
                                              kFinset.range (n + 1), (∑ aFinset.range (P.natDegree + 1), (P.coeff a) * a ^ k) / k.factorial * ((∑ bFinset.range (Q.natDegree + 1), (Q.coeff b) * b ^ (n - k)) / (n - k).factorial) = kFinset.range (n + 1), aFinset.range (P.natDegree + 1), bFinset.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) :
                                              jFinset.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) :
                                              jFinset.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 mPowerSeries ) :
                                              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 mPowerSeries ) :
                                              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 : ) :
                                              kFinset.range (n + 1), aFinset.range (P.natDegree + 1), bFinset.range (Q.natDegree + 1), (P.coeff a) * (Q.coeff b) * a ^ k * b ^ (n - k) / (k.factorial * (n - k).factorial) = kFinset.range (n + 1), aFinset.range (P.natDegree + 1), bFinset.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 : ) :
                                              kFinset.range (n + 1), aFinset.range (P.natDegree + 1), bFinset.range (Q.natDegree + 1), (P.coeff a) * (Q.coeff b) * a ^ k * b ^ (n - k) * ((n.choose k) / n.factorial) = 1 / n.factorial * kFinset.range (n + 1), aFinset.range (P.natDegree + 1), bFinset.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 : ) :
                                              kFinset.range (n + 1), aFinset.range (P.natDegree + 1), bFinset.range (Q.natDegree + 1), (P.coeff a) * (Q.coeff b) * (n.choose k) * a ^ k * b ^ (n - k) = aFinset.range (P.natDegree + 1), bFinset.range (Q.natDegree + 1), kFinset.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 : ) :
                                              aFinset.range (P.natDegree + 1), bFinset.range (Q.natDegree + 1), kFinset.range (n + 1), (P.coeff a) * (Q.coeff b) * (n.choose k) * a ^ k * b ^ (n - k) = aFinset.range (P.natDegree + 1), bFinset.range (Q.natDegree + 1), (P.coeff a) * (Q.coeff b) * kFinset.range (n + 1), (n.choose k) * a ^ k * b ^ (n - k)
                                              theorem FelsConjectureProof.binomial_sum_eq_power (a b n : ) :
                                              kFinset.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 : ) :
                                              aFinset.range (P.natDegree + 1), bFinset.range (Q.natDegree + 1), (P.coeff a) * (Q.coeff b) * kFinset.range (n + 1), (n.choose k) * a ^ k * b ^ (n - k) = aFinset.range (P.natDegree + 1), bFinset.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) = (∑ aFinset.range (P.natDegree + 1), bFinset.range (Q.natDegree + 1), (P.coeff a) * (Q.coeff b) * (a + b) ^ n) / n.factorial
                                              theorem FelsConjectureProof.convolution_sum_eq (P Q : Polynomial ) (n : ) :
                                              jFinset.range ((P * Q).natDegree + 1), ((P * Q).coeff j) * j ^ n = jFinset.range (P.natDegree + Q.natDegree + 1), abFinset.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 : abFinset.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 : ) :
                                              jFinset.range (P.natDegree + Q.natDegree + 1), abFinset.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 : ) :
                                              abFinset.range (P.natDegree + 1) ×ˢ Finset.range (Q.natDegree + 1), (P.coeff ab.1) * (Q.coeff ab.2) * (ab.1 + ab.2) ^ n = aFinset.range (P.natDegree + 1), bFinset.range (Q.natDegree + 1), (P.coeff a) * (Q.coeff b) * (a + b) ^ n
                                              theorem FelsConjectureProof.triangular_to_rectangular_sum (P Q : Polynomial ) (n : ) :
                                              jFinset.range (P.natDegree + Q.natDegree + 1), abFinset.antidiagonal j, (P.coeff ab.1) * (Q.coeff ab.2) * (ab.1 + ab.2) ^ n = aFinset.range (P.natDegree + 1), bFinset.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)) = (∑ aFinset.range (P.natDegree + 1), bFinset.range (Q.natDegree + 1), (P.coeff a) * (Q.coeff b) * (a + b) ^ n) / n.factorial
                                              theorem FelsConjectureProof.binomial_sum_minus_j_pow (j n : ) :
                                              (∑ kFinset.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 : ) :
                                              kFinset.range (n + 1), (PowerSeries.coeff k) (1 - PowerSeries.exp ) * (PowerSeries.coeff (n - k)) (partialSumGenFunc G) = kFinset.range (n + 1), (if k = 0 then 0 else -1 / k.factorial) * ((∑ jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ mFinset.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 : ) :
                                              kFinset.range (n + 1), (if k = 0 then 0 else -1 / k.factorial) * ((∑ jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ mFinset.range (j + 1), (G.productPolynomial.coeff m)) * j ^ (n - k)) / (n - k).factorial) = kFinset.range (n + 1), if k = 0 then 0 else -1 / k.factorial * ((∑ jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ mFinset.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 * ((∑ jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ mFinset.range (j + 1), (G.productPolynomial.coeff m)) * j ^ (n - k)) / (n - k).factorial) = -(n.choose k) / n.factorial * jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ mFinset.range (j + 1), (G.productPolynomial.coeff m)) * j ^ (n - k)
                                              theorem FelsConjectureProof.apply_factorial_identity {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ) :
                                              (∑ kFinset.range (n + 1), if k = 0 then 0 else -1 / k.factorial * ((∑ jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ mFinset.range (j + 1), (G.productPolynomial.coeff m)) * j ^ (n - k)) / (n - k).factorial)) = kFinset.range (n + 1), if k = 0 then 0 else -(n.choose k) / n.factorial * jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ mFinset.range (j + 1), (G.productPolynomial.coeff m)) * j ^ (n - k)
                                              theorem FelsConjectureProof.factor_neg_choose_div_factorial (D n : ) (coeff : ) :
                                              (∑ kFinset.range (n + 1), if k = 0 then 0 else -(n.choose k) / n.factorial * jFinset.range (D + 1), coeff j * j ^ (n - k)) = -1 / n.factorial * kFinset.range (n + 1), if k = 0 then 0 else (n.choose k) * jFinset.range (D + 1), coeff j * j ^ (n - k)
                                              theorem FelsConjectureProof.swap_and_apply_binomial (D n : ) (coeff : ) :
                                              (∑ kFinset.range (n + 1), if k = 0 then 0 else (n.choose k) * jFinset.range (D + 1), coeff j * j ^ (n - k)) = jFinset.range (D + 1), coeff j * ((j + 1) ^ n - j ^ n)
                                              theorem FelsConjectureProof.factor_and_apply_binomial {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ) :
                                              (∑ kFinset.range (n + 1), if k = 0 then 0 else -(n.choose k) / n.factorial * jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ mFinset.range (j + 1), (G.productPolynomial.coeff m)) * j ^ (n - k)) = -1 / n.factorial * jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ mFinset.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 {xFinset.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) :
                                              jFinset.range (G.hilbertNumerator.natDegree + 1) with g j, (G.productPolynomial.coeff (j - g)) * j ^ n = kFinset.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 : ) :
                                              (∑ gS.gaps with g j, (G.productPolynomial.coeff (j - g))) * j ^ n = gS.gaps with g j, (G.productPolynomial.coeff (j - g)) * j ^ n
                                              theorem FelsConjectureProof.distribute_and_swap_sums {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ) :
                                              jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ gS.gaps with g j, (G.productPolynomial.coeff (j - g))) * j ^ n = gS.gaps, jFinset.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 : ) :
                                              jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ gS.gaps with g j, (G.productPolynomial.coeff (j - g))) * j ^ n = gS.gaps, kFinset.range (G.productPolynomial.natDegree + 1), (G.productPolynomial.coeff k) * (k + g) ^ n
                                              theorem FelsConjectureProof.binomial_sum_eq_add_pow (a b : ) (n : ) :
                                              kFinset.range (n + 1), (n.choose k) * a ^ k * b ^ (n - k) = (a + b) ^ n
                                              theorem FelsConjectureProof.triple_sum_exchange (gaps : Finset ) (degP : ) (coeff : ) (n : ) :
                                              ggaps, kFinset.range (degP + 1), rFinset.range (n + 1), coeff k * (n.choose r) * k ^ r * g ^ (n - r) = rFinset.range (n + 1), ggaps, kFinset.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 : ) :
                                              ggaps, kFinset.range (degP + 1), coeff k * (n.choose r) * k ^ r * g ^ (n - r) = ((n.choose r) * kFinset.range (degP + 1), coeff k * k ^ r) * ggaps, g ^ (n - r)
                                              theorem FelsConjectureProof.sum_choose_mul_div_factorial_eq_sum_div_factorials (n : ) (A B : ) :
                                              rFinset.range (n + 1), (n.choose r) * A r * B r / n.factorial = rFinset.range (n + 1), A r / r.factorial * (B r / (n - r).factorial)
                                              theorem FelsConjectureProof.gap_sum_binomial_expand {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ) :
                                              (∑ gS.gaps, kFinset.range (G.productPolynomial.natDegree + 1), (G.productPolynomial.coeff k) * (k + g) ^ n) / n.factorial = rFinset.range (n + 1), (∑ kFinset.range (G.productPolynomial.natDegree + 1), (G.productPolynomial.coeff k) * k ^ r) / r.factorial * ((∑ gS.gaps, g ^ (n - r)) / (n - r).factorial)
                                              theorem FelsConjectureProof.gap_sum_to_coeff {S : NumericalSemigroup} (k : ) :
                                              (∑ gS.gaps, g ^ k) / k.factorial = (PowerSeries.coeff k) (PowerSeries.mk fun (j : ) => gS.gaps, g ^ j / j.factorial)
                                              theorem FelsConjectureProof.coeff_mul_range' {R : Type u_1} [Semiring R] (φ ψ : PowerSeries R) (n : ) :
                                              (PowerSeries.coeff n) (φ * ψ) = rFinset.range (n + 1), (PowerSeries.coeff r) φ * (PowerSeries.coeff (n - r)) ψ
                                              theorem FelsConjectureProof.sum_factor_scalar' {α : Type u_1} (s : Finset α) (c : ) (a b : α) :
                                              rs, c * a r * b r = c * rs, a r * b r
                                              theorem FelsConjectureProof.binomial_sum_to_convolution {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ) :
                                              rFinset.range (n + 1), (∑ kFinset.range (G.productPolynomial.natDegree + 1), (G.productPolynomial.coeff k) * k ^ r) / r.factorial * ((∑ gS.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 : ) => gS.gaps, g ^ k / k.factorial)
                                              theorem FelsConjectureProof.gap_part_equals_gap_term_natDegree {S : NumericalSemigroup} (G : NumericalSemigroupGenerators S) (n : ) :
                                              (∑ jFinset.range (G.hilbertNumerator.natDegree + 1), (∑ gS.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 : ) => gS.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 * rFinset.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 = rFinset.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 = rFinset.range (p + 1), (p.choose r) * G.TSigma (p - r) * S.gapPowerSum r + 2 ^ (p + 1) / (p + 1) * G.TDelta (p + 1)