Zulip Chat Archive

Stream: maths

Topic: Combinatorial Nullstellensatz


Iván Sadofschi Costa (Dec 03 2021 at 19:15):

Hi! I'm working on a proof of the Combinatorial Nullstellensatz:

theorem combinatorial_nullstellensatz { n :  } {F : Type u} [field F]
    (f : mv_polynomial (fin n) F) (t : fin n →₀ ) (h_max : max_degree_monomial t f)
    (S : fin n  finset F) (h_card_S :  i : fin n, t i < (S i).card) :
     s : fin n  F, ( i : fin n, s i  S i )  eval s f  0 :=

A possible way to define max_degree_monomial would be the following (is this definition reasonable?):

def monomial_degree {s : Type} (t : s →₀ ) :  :=  i in t.support, t i

def max_degree_monomial  { n :  } {F : Type u} [field F]
(t : fin n →₀ ) (f : mv_polynomial (fin n) F) : Prop :=
t  f.support  monomial_degree t = total_degree f

I am following Alon's original paper which is available at http://www.math.tau.ac.il/~nogaa/PDFS/null2.pdf

Most of the machinery needed to prove this result is already on mathlib (e.g polynomial.card_roots, mv_polynomial.fin_succ_equiv).

To complete the proof I still have to prove many smaller lemmas about coeff, degree_of, total_degree.

For the moment I have a complete proof of Lemma 2.1 in Alon's paper which already seems something nice to have in Mathlib:

-- What is a reasonable name for this one?
lemma lemma_2_1 { n :  } {F : Type u} [field F]
  (f : mv_polynomial (fin n) F) (S : fin n  finset F)
  (hS :  i : fin n, degree_of i f < (S i).card)
  (hz :  s : fin n  F, ( i : fin n, s i  S i )  eval s f = 0) :
  f = 0

In order to prove this result I had to state and prove many lemmas about polynomials and mv_polynomials that seem useful, for example the following:

lemma fin_succ_equiv_coeff_coeff {n : } {R : Type u} [comm_semiring R]
  (m : fin n →₀  ) (f : mv_polynomial (fin (n+1)) R ) (i : ) :
  coeff m (polynomial.coeff (fin_succ_equiv R n f) i) = coeff (fin.finsupp.cons i m) f

It seems that cons and tail were not yet defined for maps fin n →₀ ℕ:

def fin.finsupp.tail {n:  } (s : fin (n+1) →₀  ) : fin n →₀ 

def fin.finsupp.cons {n:} (y : ) (s : fin n →₀  ) : fin (n+1) →₀ 

If these are not already on mathlib, should I open a PR with cons, tail and their properties? I'm not sure where to put these.

Alex J. Best (Dec 03 2021 at 19:23):

You probably have seen it but you should definitely check out https://github.com/leanprover-community/mathlib/blob/master/src/data/mv_polynomial/variables.lean if you haven't already.
In https://github.com/leanprover-community/flt-regular/blob/master/src/ring_theory/polynomial/homogenization.lean I've been proving a lot of related things about the sum of leading terms, total degrees, supports, homogenizations etc. I'm now PRing this stuff to mathlib, but maybe some of it is useful for you already.

Alex J. Best (Dec 03 2021 at 19:31):

It seems a bit strange to talk about fin n →₀ ℕ, after all fin n is finite, and so finitely supported functions on fin n are just functions on fin n, can you rephrase things to be about functions on fin n instead, then maybe there will be more api there for you

Alex J. Best (Dec 03 2021 at 19:33):

We also tend to try and use general fintypes where possible rather than specializing to fin n for main results. Of course along the way it might be easier to deal with fin n, and then to prove the main result in general at the end by picking an equivalence between a finite type and fin n. But I'd definitely encourage you to see which of the lemmas are about fin n and which are about some general fintype.

Alex J. Best (Dec 03 2021 at 19:34):

Its really cool that you are working on this!

Iván Sadofschi Costa (Dec 03 2021 at 19:43):

Alex J. Best said:

You probably have seen it but you should definitely check out https://github.com/leanprover-community/mathlib/blob/master/src/data/mv_polynomial/variables.lean if you haven't already.
In https://github.com/leanprover-community/flt-regular/blob/master/src/ring_theory/polynomial/homogenization.lean I've been proving a lot of related things about the sum of leading terms, total degrees, supports, homogenizations etc. I'm now PRing this stuff to mathlib, but maybe some of it is useful for you already.

Thanks, it seems that many of this will be useful here too!

Iván Sadofschi Costa (Dec 03 2021 at 19:53):

Alex J. Best said:

It seems a bit strange to talk about fin n →₀ ℕ, after all fin n is finite, and so finitely supported functions on fin n are just functions on fin n, can you rephrase things to be about functions on fin n instead, then maybe there will be more api there for you

Yes, I agree that this is strange. I used fin n and fin (n+1) here following the definition of fin_succ_equiv:

def fin_succ_equiv (n : ) :
  mv_polynomial (fin (n + 1)) R ≃ₐ[R] polynomial (mv_polynomial (fin n) R)

This leads to considering maps s:fin n →₀ ℕ as the X^s. Is there a way to apply the usual cons and tail directly to these maps?

Iván Sadofschi Costa (Dec 15 2021 at 23:06):

I've finished the proof some days ago: https://github.com/isadofschi/combinatorial_nullstellensatz
There is a lot that I have to tidy before submitting the main results, but I'm happy that it works!
For now I'm sending PR's with lemmas about mv_polynomials.
Many results from flt-regular were useful in the proof. Thanks @Alex J. Best for pointing me to homogenization.lean!


Last updated: Dec 20 2023 at 11:08 UTC