Zulip Chat Archive
Stream: new members
Topic: Ideal membership in multivariate polynomial rings
Manoj Kummini (Jul 10 2021 at 19:19):
I am trying to write a formal proof that a polynomial in a multivariate polynomial ring is a member of an ideal of . This is typically done using Grobner bases. I am relatively new to lean. Looking at old discussions, I understood the following:
- 
There is no Grobner basis tactic in mathlib, so a suggested approach is to compute a Grobner basis of and a candidate expression that writes using some other program and verify this expression in lean. 
- 
I tried to do this for a small example: show that belongs to the ideal of the ring . Though this particular example can be done in more general commutative rings using rw pow_two, I tried the following (non-working) minimal example in lean:
import data.mv_polynomial.basic
import data.mv_polynomial.comm_ring
import data.zmod.basic
open mv_polynomial
def R := mv_polynomial (fin 2) (zmod 2)
example :
  let f :=  (X 0)^2 + (X 1)^2,
      f1 := X 0,
      f2 := X 1,
      in
      f = (X 0) * f1 + (X 1) * f2 :=
begin
  sorry
end
Lean  did not recognize X. What should I be doing?
- Is it possible to refer to  mv_polynomial (fin 3) (zmod 2)by some easier name within my code? E.g., I was able to copy-paste some examples from zulip discussions and make them run, but when I tried to refer to it asRafter doing a
def R := mv_polynomial (fin 2) (zmod 2)
I got some errors. Here is an example.
import data.mv_polynomial.basic
import data.mv_polynomial.comm_ring
import data.zmod.basic
open mv_polynomial
example :
  let I := ideal.span { x : mv_polynomial (fin 3) (zmod 2) | ∃ (i : fin 3), x = X i} in
  (X 0 : mv_polynomial (fin 3) (zmod 2)) ∈ I :=
begin
  sorry,
  -- I get "goals accomplished" at this step.
end
-- I would like to give a name to the ring.
def R:= mv_polynomial (fin 3) (zmod 2)
#check R
example :
  let I := ideal.span { x :  R | ∃ (i : fin 3), x = X i} in
  (X 0 : R) ∈ I :=
begin
  -- there is a red squiggly line below the word `ideal' above
  -- I get an error failed to synthesize type class instance for
  -- ⊢ semiring R
  sorry,
  -- no "goals accomplished" message at this step.
end
- Is it possible to check in Lean whether a set of polynomials is a Grobner basis (e.g. using Buchberger's theorem)? In the proof I would like to formalise, I need to show that and for every variable $X_i$. To do this, one strategy would be to compute a Grobner basis of and the remainder of after reducing it modulo using some other program , prove in lean that it indeed is a Grobner basis, and then show that the leading terms do not divide the leading term of .
Thanks.
Johan Commelin (Jul 10 2021 at 19:23):
Lean did not recognize
X. What should I be doing?
It doesn't know that you want f to be a term of type R. If you write let f : R := ... I think things will be better.
Hanting Zhang (Jul 10 2021 at 19:24):
AFAIK using def a := b will not carry the instances on b to a; you can try defining it as local notation instead
Johan Commelin (Jul 10 2021 at 19:25):
Is it possible to refer to
mv_polynomial (fin 3) (zmod 2)by some easier name within my code? E.g., I was able to copy-paste some examples from zulip discussions and make them run, but when I tried to refer to it asRafter doing adef R := mv_polynomial (fin 2) (zmod 2)I got some errors
The problem is that you gave a new definition, and Lean does not automatically see through this (for good reasons). So now it doesn't know anything about R.
Solutions could be to use notation or abbreviation instead.
Johan Commelin (Jul 10 2021 at 19:25):
If you use notation, I would suggest local notation.
Manoj Kummini (Jul 10 2021 at 19:39):
Thanks. The following code worked.
import data.mv_polynomial.basic
import data.mv_polynomial.comm_ring
import data.zmod.basic
open mv_polynomial
abbreviation R := mv_polynomial (fin 2) (zmod 2)
example :
  let f : R :=  (X 0)^2 + (X 1)^2,
      f1 : R := X 0,
      f2 : R := X 1
      in
      f = (X 0) * f1 + (X 1) * f2 :=
begin
  ring,
  rw pow_two,
  rw pow_two,
end
Kevin Buzzard (Jul 10 2021 at 20:04):
begin
  ring_exp,
end
is a shortcut (or even by ring_exp) -- this is a variant of ring which knows more about the arithmetic of exponents.
Manoj Kummini (Jul 11 2021 at 00:49):
Thank you. ring_exp is substantially faster; ring  takes about a minute to rewrite the goal.
Last updated: May 02 2025 at 03:31 UTC