data.polynomial.unit_trinomialMathlib.Data.Polynomial.UnitTrinomial

This file has been ported!

Changes since the initial port

The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.

Changes in mathlib3

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(last sync)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -357,7 +357,7 @@ theorem irreducible_aux3 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k
   · exact irreducible_aux2 hkm hmn hkm' hmn' u v w hp hq h
   · rw [← mirror_inj, trinomial_mirror hkm' hmn' w.ne_zero u.ne_zero] at hq
     rw [mul_comm q, ← q.mirror_mirror, q.mirror.mirror_mirror] at h
-    rw [← mirror_inj, or_comm', ← mirror_eq_iff]
+    rw [← mirror_inj, or_comm, ← mirror_eq_iff]
     exact
       irreducible_aux2 hkm hmn (lt_add_of_pos_left k (tsub_pos_of_lt hmn'))
         (lt_tsub_iff_right.mp ((tsub_lt_tsub_iff_left_of_le hmn'.le).mpr hkm')) u v w hp hq h
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
 -/
 import Analysis.Complex.Polynomial
-import Data.Polynomial.Mirror
+import Algebra.Polynomial.Mirror
 
 #align_import data.polynomial.unit_trinomial from "leanprover-community/mathlib"@"660b3a2db3522fa0db036e569dc995a615c4c848"
 
Diff
@@ -85,7 +85,7 @@ theorem trinomial_natDegree (hkm : k < m) (hmn : m < n) (hw : w ≠ 0) :
       ((Finset.sup_le fun i h => _).antisymm <|
         le_degree_of_ne_zero <| by rwa [trinomial_leading_coeff' hkm hmn])
   replace h := support_trinomial' k m n u v w h
-  rw [mem_insert, mem_insert, mem_singleton] at h 
+  rw [mem_insert, mem_insert, mem_singleton] at h
   rcases h with (rfl | rfl | rfl)
   · exact with_bot.coe_le_coe.mpr (hkm.trans hmn).le
   · exact with_bot.coe_le_coe.mpr hmn.le
@@ -102,7 +102,7 @@ theorem trinomial_natTrailingDegree (hkm : k < m) (hmn : m < n) (hu : u ≠ 0) :
       ((Finset.le_inf fun i h => _).antisymm <|
           le_trailing_degree_of_ne_zero <| by rwa [trinomial_trailing_coeff' hkm hmn]).symm
   replace h := support_trinomial' k m n u v w h
-  rw [mem_insert, mem_insert, mem_singleton] at h 
+  rw [mem_insert, mem_insert, mem_singleton] at h
   rcases h with (rfl | rfl | rfl)
   · exact le_rfl
   · exact with_top.coe_le_coe.mpr hkm.le
@@ -199,7 +199,7 @@ theorem coeff_isUnit (hp : p.IsUnitTrinomial) {k : ℕ} (hk : k ∈ p.support) :
   by
   obtain ⟨k, m, n, hkm, hmn, u, v, w, rfl⟩ := hp
   have := support_trinomial' k m n (↑u) (↑v) (↑w) hk
-  rw [mem_insert, mem_insert, mem_singleton] at this 
+  rw [mem_insert, mem_insert, mem_singleton] at this
   rcases this with (rfl | rfl | rfl)
   · refine' ⟨u, by rw [trinomial_trailing_coeff' hkm hmn]⟩
   · refine' ⟨v, by rw [trinomial_middle_coeff hkm hmn]⟩
@@ -227,15 +227,15 @@ theorem isUnitTrinomial_iff :
   by
   refine' ⟨fun hp => ⟨hp.card_support_eq_three, fun k => hp.coeff_isUnit⟩, fun hp => _⟩
   obtain ⟨k, m, n, hkm, hmn, x, y, z, hx, hy, hz, rfl⟩ := card_support_eq_three.mp hp.1
-  rw [support_trinomial hkm hmn hx hy hz] at hp 
+  rw [support_trinomial hkm hmn hx hy hz] at hp
   replace hx := hp.2 k (mem_insert_self k {m, n})
   replace hy := hp.2 m (mem_insert_of_mem (mem_insert_self m {n}))
   replace hz := hp.2 n (mem_insert_of_mem (mem_insert_of_mem (mem_singleton_self n)))
-  simp_rw [coeff_add, coeff_C_mul, coeff_X_pow_self, mul_one, coeff_X_pow] at hx hy hz 
-  rw [if_neg hkm.ne, if_neg (hkm.trans hmn).Ne] at hx 
-  rw [if_neg hkm.ne', if_neg hmn.ne] at hy 
-  rw [if_neg (hkm.trans hmn).ne', if_neg hmn.ne'] at hz 
-  simp_rw [MulZeroClass.mul_zero, zero_add, add_zero] at hx hy hz 
+  simp_rw [coeff_add, coeff_C_mul, coeff_X_pow_self, mul_one, coeff_X_pow] at hx hy hz
+  rw [if_neg hkm.ne, if_neg (hkm.trans hmn).Ne] at hx
+  rw [if_neg hkm.ne', if_neg hmn.ne] at hy
+  rw [if_neg (hkm.trans hmn).ne', if_neg hmn.ne'] at hz
+  simp_rw [MulZeroClass.mul_zero, zero_add, add_zero] at hx hy hz
   exact ⟨k, m, n, hkm, hmn, hx.unit, hy.unit, hz.unit, rfl⟩
 #align polynomial.is_unit_trinomial_iff Polynomial.isUnitTrinomial_iff
 -/
@@ -259,7 +259,7 @@ theorem isUnitTrinomial_iff' :
       Int.sq_eq_one_of_sq_le_three
         ((single_le_sum (fun k hk => sq_nonneg (p.coeff k)) hk).trans hp.le) (mem_support_iff.mp hk)
     refine' is_unit_trinomial_iff.mpr ⟨_, fun k hk => isUnit_ofPowEqOne (key k hk) two_ne_zero⟩
-    rw [sum_def, sum_congr rfl key, sum_const, Nat.smul_one_eq_coe] at hp 
+    rw [sum_def, sum_congr rfl key, sum_const, Nat.smul_one_eq_coe] at hp
     exact Nat.cast_injective hp
 #align polynomial.is_unit_trinomial_iff' Polynomial.isUnitTrinomial_iff'
 -/
@@ -297,7 +297,7 @@ theorem irreducible_aux1 {k m n : ℕ} (hkm : k < m) (hmn : m < n) (u v w : Unit
     exact fun h => h.1.Ne rfl
   · intro h
     have := h.1
-    rw [add_comm, add_lt_add_iff_right] at this 
+    rw [add_comm, add_lt_add_iff_right] at this
     exact asymm this hmn
   · exact fun h => h.1.Ne rfl
   · exact fun h => asymm ((add_lt_add_iff_left k).mp h.1) key
@@ -314,19 +314,19 @@ theorem irreducible_aux2 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k
   replace h := congr_arg f h
   replace h := (irreducible_aux1 hkm hmn u v w hp).trans h
   replace h := h.trans (irreducible_aux1 hkm' hmn' u v w hq).symm
-  rw [(is_unit_C.mpr v.is_unit).mul_right_inj] at h 
-  rw [binomial_eq_binomial u.ne_zero w.ne_zero] at h 
-  simp only [add_left_inj, Units.eq_iff] at h 
+  rw [(is_unit_C.mpr v.is_unit).mul_right_inj] at h
+  rw [binomial_eq_binomial u.ne_zero w.ne_zero] at h
+  simp only [add_left_inj, Units.eq_iff] at h
   rcases h with (⟨rfl, -⟩ | ⟨rfl, rfl, h⟩ | ⟨-, hm, hm'⟩)
   · exact Or.inl (hq.trans hp.symm)
   · refine' Or.inr _
-    rw [← trinomial_mirror hkm' hmn' u.ne_zero u.ne_zero, eq_comm, mirror_eq_iff] at hp 
+    rw [← trinomial_mirror hkm' hmn' u.ne_zero u.ne_zero, eq_comm, mirror_eq_iff] at hp
     exact hq.trans hp
   · suffices m = m' by
-      rw [this] at hp 
+      rw [this] at hp
       exact Or.inl (hq.trans hp.symm)
-    rw [tsub_add_eq_add_tsub hmn.le, eq_tsub_iff_add_eq_of_le, ← two_mul] at hm 
-    rw [tsub_add_eq_add_tsub hmn'.le, eq_tsub_iff_add_eq_of_le, ← two_mul] at hm' 
+    rw [tsub_add_eq_add_tsub hmn.le, eq_tsub_iff_add_eq_of_le, ← two_mul] at hm
+    rw [tsub_add_eq_add_tsub hmn'.le, eq_tsub_iff_add_eq_of_le, ← two_mul] at hm'
     exact mul_left_cancel₀ two_ne_zero (hm.trans hm'.symm)
     exact hmn'.le.trans (Nat.le_add_right n k)
     exact hmn.le.trans (Nat.le_add_right n k)
@@ -342,21 +342,21 @@ theorem irreducible_aux3 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k
   rw [leading_coeff_mul, leading_coeff_mul, mirror_leading_coeff, mirror_leading_coeff, hp, hq,
     trinomial_leading_coeff hkm hmn w.ne_zero, trinomial_leading_coeff hkm' hmn' z.ne_zero,
     trinomial_trailing_coeff hkm hmn u.ne_zero, trinomial_trailing_coeff hkm' hmn' x.ne_zero] at
-    hmul 
+    hmul
   have hadd := congr_arg (eval 1) h
-  rw [eval_mul, eval_mul, mirror_eval_one, mirror_eval_one, ← sq, ← sq, hp, hq] at hadd 
-  simp only [eval_add, eval_C_mul, eval_pow, eval_X, one_pow, mul_one, trinomial_def] at hadd 
-  rw [add_assoc, add_assoc, add_comm ↑u, add_comm ↑x, add_assoc, add_assoc] at hadd 
-  simp only [add_sq', add_assoc, add_right_inj, ← Units.val_pow_eq_pow_val, Int.units_sq] at hadd 
+  rw [eval_mul, eval_mul, mirror_eval_one, mirror_eval_one, ← sq, ← sq, hp, hq] at hadd
+  simp only [eval_add, eval_C_mul, eval_pow, eval_X, one_pow, mul_one, trinomial_def] at hadd
+  rw [add_assoc, add_assoc, add_comm ↑u, add_comm ↑x, add_assoc, add_assoc] at hadd
+  simp only [add_sq', add_assoc, add_right_inj, ← Units.val_pow_eq_pow_val, Int.units_sq] at hadd
   rw [mul_assoc, hmul, ← mul_assoc, add_right_inj,
-    mul_right_inj' (show 2 * (v : ℤ) ≠ 0 from mul_ne_zero two_ne_zero v.ne_zero)] at hadd 
+    mul_right_inj' (show 2 * (v : ℤ) ≠ 0 from mul_ne_zero two_ne_zero v.ne_zero)] at hadd
   replace hadd :=
     (Int.isUnit_add_isUnit_eq_isUnit_add_isUnit w.is_unit u.is_unit z.is_unit x.is_unit).mp hadd
-  simp only [Units.eq_iff] at hadd 
+  simp only [Units.eq_iff] at hadd
   rcases hadd with (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩)
   · exact irreducible_aux2 hkm hmn hkm' hmn' u v w hp hq h
-  · rw [← mirror_inj, trinomial_mirror hkm' hmn' w.ne_zero u.ne_zero] at hq 
-    rw [mul_comm q, ← q.mirror_mirror, q.mirror.mirror_mirror] at h 
+  · rw [← mirror_inj, trinomial_mirror hkm' hmn' w.ne_zero u.ne_zero] at hq
+    rw [mul_comm q, ← q.mirror_mirror, q.mirror.mirror_mirror] at h
     rw [← mirror_inj, or_comm', ← mirror_eq_iff]
     exact
       irreducible_aux2 hkm hmn (lt_add_of_pos_left k (tsub_pos_of_lt hmn'))
@@ -390,10 +390,10 @@ theorem irreducible_of_coprime (hp : p.IsUnitTrinomial)
     · exact Or.inl h2
     · exact Or.inr (Or.inr (Or.inl h2))
   · rw [h1] at *
-    rw [trinomial_def] at hp 
+    rw [trinomial_def] at hp
     rw [← neg_inj, neg_add, neg_add, ← neg_mul, ← neg_mul, ← neg_mul, ← C_neg, ← C_neg, ← C_neg] at
-      hp 
-    rw [← neg_mul_neg, ← mirror_neg] at hpq 
+      hp
+    rw [← neg_mul_neg, ← mirror_neg] at hpq
     rcases irreducible_aux3 hkm hmn hkm' hmn' (-u) (-v) (-w) x z hp hq hpq with (rfl | rfl)
     · exact Or.inr (Or.inl rfl)
     · exact Or.inr (Or.inr (Or.inr p.mirror_neg))
@@ -417,15 +417,15 @@ theorem irreducible_of_coprime' (hp : IsUnitTrinomial p)
   suffices ¬0 < q.nat_degree by
     rcases hq with ⟨p, rfl⟩
     replace hp := hp.leading_coeff_is_unit
-    rw [leading_coeff_mul] at hp 
+    rw [leading_coeff_mul] at hp
     replace hp := isUnit_of_mul_isUnit_left hp
-    rw [not_lt, le_zero_iff] at this 
+    rw [not_lt, le_zero_iff] at this
     rwa [eq_C_of_nat_degree_eq_zero this, is_unit_C, ← this]
   intro hq''
-  rw [nat_degree_pos_iff_degree_pos] at hq'' 
-  rw [← degree_map_eq_of_injective (algebraMap ℤ ℂ).injective_int] at hq'' 
+  rw [nat_degree_pos_iff_degree_pos] at hq''
+  rw [← degree_map_eq_of_injective (algebraMap ℤ ℂ).injective_int] at hq''
   cases' Complex.exists_root hq'' with z hz
-  rw [is_root, eval_map, ← aeval_def] at hz 
+  rw [is_root, eval_map, ← aeval_def] at hz
   refine' h z ⟨_, _⟩
   · cases' hq with g' hg'
     rw [hg', aeval_mul, hz, MulZeroClass.zero_mul]
Diff
@@ -3,8 +3,8 @@ Copyright (c) 2022 Thomas Browning. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
 -/
-import Mathbin.Analysis.Complex.Polynomial
-import Mathbin.Data.Polynomial.Mirror
+import Analysis.Complex.Polynomial
+import Data.Polynomial.Mirror
 
 #align_import data.polynomial.unit_trinomial from "leanprover-community/mathlib"@"660b3a2db3522fa0db036e569dc995a615c4c848"
 
Diff
@@ -2,15 +2,12 @@
 Copyright (c) 2022 Thomas Browning. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
-
-! This file was ported from Lean 3 source module data.polynomial.unit_trinomial
-! leanprover-community/mathlib commit 660b3a2db3522fa0db036e569dc995a615c4c848
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathbin.Analysis.Complex.Polynomial
 import Mathbin.Data.Polynomial.Mirror
 
+#align_import data.polynomial.unit_trinomial from "leanprover-community/mathlib"@"660b3a2db3522fa0db036e569dc995a615c4c848"
+
 /-!
 # Unit Trinomials
 
Diff
@@ -47,9 +47,11 @@ noncomputable def trinomial :=
 #align polynomial.trinomial Polynomial.trinomial
 -/
 
+#print Polynomial.trinomial_def /-
 theorem trinomial_def : trinomial k m n u v w = C u * X ^ k + C v * X ^ m + C w * X ^ n :=
   rfl
 #align polynomial.trinomial_def Polynomial.trinomial_def
+-/
 
 variable {k m n u v w}
 
@@ -77,6 +79,7 @@ theorem trinomial_trailing_coeff' (hkm : k < m) (hmn : m < n) :
 #align polynomial.trinomial_trailing_coeff' Polynomial.trinomial_trailing_coeff'
 -/
 
+#print Polynomial.trinomial_natDegree /-
 theorem trinomial_natDegree (hkm : k < m) (hmn : m < n) (hw : w ≠ 0) :
     (trinomial k m n u v w).natDegree = n :=
   by
@@ -91,7 +94,9 @@ theorem trinomial_natDegree (hkm : k < m) (hmn : m < n) (hw : w ≠ 0) :
   · exact with_bot.coe_le_coe.mpr hmn.le
   · exact le_rfl
 #align polynomial.trinomial_nat_degree Polynomial.trinomial_natDegree
+-/
 
+#print Polynomial.trinomial_natTrailingDegree /-
 theorem trinomial_natTrailingDegree (hkm : k < m) (hmn : m < n) (hu : u ≠ 0) :
     (trinomial k m n u v w).natTrailingDegree = k :=
   by
@@ -106,16 +111,21 @@ theorem trinomial_natTrailingDegree (hkm : k < m) (hmn : m < n) (hu : u ≠ 0) :
   · exact with_top.coe_le_coe.mpr hkm.le
   · exact with_top.coe_le_coe.mpr (hkm.trans hmn).le
 #align polynomial.trinomial_nat_trailing_degree Polynomial.trinomial_natTrailingDegree
+-/
 
+#print Polynomial.trinomial_leadingCoeff /-
 theorem trinomial_leadingCoeff (hkm : k < m) (hmn : m < n) (hw : w ≠ 0) :
     (trinomial k m n u v w).leadingCoeff = w := by
   rw [leading_coeff, trinomial_nat_degree hkm hmn hw, trinomial_leading_coeff' hkm hmn]
 #align polynomial.trinomial_leading_coeff Polynomial.trinomial_leadingCoeff
+-/
 
+#print Polynomial.trinomial_trailingCoeff /-
 theorem trinomial_trailingCoeff (hkm : k < m) (hmn : m < n) (hu : u ≠ 0) :
     (trinomial k m n u v w).trailingCoeff = u := by
   rw [trailing_coeff, trinomial_nat_trailing_degree hkm hmn hu, trinomial_trailing_coeff' hkm hmn]
 #align polynomial.trinomial_trailing_coeff Polynomial.trinomial_trailingCoeff
+-/
 
 #print Polynomial.trinomial_monic /-
 theorem trinomial_monic (hkm : k < m) (hmn : m < n) : (trinomial k m n u v 1).Monic :=
@@ -126,6 +136,7 @@ theorem trinomial_monic (hkm : k < m) (hmn : m < n) : (trinomial k m n u v 1).Mo
 #align polynomial.trinomial_monic Polynomial.trinomial_monic
 -/
 
+#print Polynomial.trinomial_mirror /-
 theorem trinomial_mirror (hkm : k < m) (hmn : m < n) (hu : u ≠ 0) (hw : w ≠ 0) :
     (trinomial k m n u v w).mirror = trinomial k (n - m + k) n w v u := by
   rw [mirror, trinomial_nat_trailing_degree hkm hmn hu, reverse, trinomial_nat_degree hkm hmn hw,
@@ -135,25 +146,31 @@ theorem trinomial_mirror (hkm : k < m) (hmn : m < n) (hu : u ≠ 0) (hw : w ≠
     Nat.sub_add_cancel (hkm.trans hmn).le, Nat.sub_self, zero_add, add_comm, add_comm (C u * X ^ n),
     ← add_assoc, ← trinomial_def]
 #align polynomial.trinomial_mirror Polynomial.trinomial_mirror
+-/
 
+#print Polynomial.trinomial_support /-
 theorem trinomial_support (hkm : k < m) (hmn : m < n) (hu : u ≠ 0) (hv : v ≠ 0) (hw : w ≠ 0) :
     (trinomial k m n u v w).support = {k, m, n} :=
   support_trinomial hkm hmn hu hv hw
 #align polynomial.trinomial_support Polynomial.trinomial_support
+-/
 
 end Semiring
 
 variable (p q : ℤ[X])
 
+#print Polynomial.IsUnitTrinomial /-
 /-- A unit trinomial is a trinomial with unit coefficients. -/
 def IsUnitTrinomial :=
   ∃ (k m n : ℕ) (hkm : k < m) (hmn : m < n) (u v w : Units ℤ), p = trinomial k m n u v w
 #align polynomial.is_unit_trinomial Polynomial.IsUnitTrinomial
+-/
 
 variable {p q}
 
 namespace IsUnitTrinomial
 
+#print Polynomial.IsUnitTrinomial.not_isUnit /-
 theorem not_isUnit (hp : p.IsUnitTrinomial) : ¬IsUnit p :=
   by
   obtain ⟨k, m, n, hkm, hmn, u, v, w, rfl⟩ := hp
@@ -162,19 +179,25 @@ theorem not_isUnit (hp : p.IsUnitTrinomial) : ¬IsUnit p :=
       ((trinomial_nat_degree hkm hmn w.ne_zero).symm.trans
         (nat_degree_eq_of_degree_eq_some (degree_eq_zero_of_is_unit h)))
 #align polynomial.is_unit_trinomial.not_is_unit Polynomial.IsUnitTrinomial.not_isUnit
+-/
 
+#print Polynomial.IsUnitTrinomial.card_support_eq_three /-
 theorem card_support_eq_three (hp : p.IsUnitTrinomial) : p.support.card = 3 :=
   by
   obtain ⟨k, m, n, hkm, hmn, u, v, w, rfl⟩ := hp
   exact card_support_trinomial hkm hmn u.ne_zero v.ne_zero w.ne_zero
 #align polynomial.is_unit_trinomial.card_support_eq_three Polynomial.IsUnitTrinomial.card_support_eq_three
+-/
 
+#print Polynomial.IsUnitTrinomial.ne_zero /-
 theorem ne_zero (hp : p.IsUnitTrinomial) : p ≠ 0 :=
   by
   rintro rfl
   exact Nat.zero_ne_bit1 1 hp.card_support_eq_three
 #align polynomial.is_unit_trinomial.ne_zero Polynomial.IsUnitTrinomial.ne_zero
+-/
 
+#print Polynomial.IsUnitTrinomial.coeff_isUnit /-
 theorem coeff_isUnit (hp : p.IsUnitTrinomial) {k : ℕ} (hk : k ∈ p.support) : IsUnit (p.coeff k) :=
   by
   obtain ⟨k, m, n, hkm, hmn, u, v, w, rfl⟩ := hp
@@ -185,17 +208,23 @@ theorem coeff_isUnit (hp : p.IsUnitTrinomial) {k : ℕ} (hk : k ∈ p.support) :
   · refine' ⟨v, by rw [trinomial_middle_coeff hkm hmn]⟩
   · refine' ⟨w, by rw [trinomial_leading_coeff' hkm hmn]⟩
 #align polynomial.is_unit_trinomial.coeff_is_unit Polynomial.IsUnitTrinomial.coeff_isUnit
+-/
 
+#print Polynomial.IsUnitTrinomial.leadingCoeff_isUnit /-
 theorem leadingCoeff_isUnit (hp : p.IsUnitTrinomial) : IsUnit p.leadingCoeff :=
   hp.coeff_isUnit (natDegree_mem_support_of_nonzero hp.NeZero)
 #align polynomial.is_unit_trinomial.leading_coeff_is_unit Polynomial.IsUnitTrinomial.leadingCoeff_isUnit
+-/
 
+#print Polynomial.IsUnitTrinomial.trailingCoeff_isUnit /-
 theorem trailingCoeff_isUnit (hp : p.IsUnitTrinomial) : IsUnit p.trailingCoeff :=
   hp.coeff_isUnit (natTrailingDegree_mem_support_of_nonzero hp.NeZero)
 #align polynomial.is_unit_trinomial.trailing_coeff_is_unit Polynomial.IsUnitTrinomial.trailingCoeff_isUnit
+-/
 
 end IsUnitTrinomial
 
+#print Polynomial.isUnitTrinomial_iff /-
 theorem isUnitTrinomial_iff :
     p.IsUnitTrinomial ↔ p.support.card = 3 ∧ ∀ k ∈ p.support, IsUnit (p.coeff k) :=
   by
@@ -212,7 +241,9 @@ theorem isUnitTrinomial_iff :
   simp_rw [MulZeroClass.mul_zero, zero_add, add_zero] at hx hy hz 
   exact ⟨k, m, n, hkm, hmn, hx.unit, hy.unit, hz.unit, rfl⟩
 #align polynomial.is_unit_trinomial_iff Polynomial.isUnitTrinomial_iff
+-/
 
+#print Polynomial.isUnitTrinomial_iff' /-
 theorem isUnitTrinomial_iff' :
     p.IsUnitTrinomial ↔
       (p * p.mirror).coeff (((p * p.mirror).natDegree + (p * p.mirror).natTrailingDegree) / 2) =
@@ -234,14 +265,18 @@ theorem isUnitTrinomial_iff' :
     rw [sum_def, sum_congr rfl key, sum_const, Nat.smul_one_eq_coe] at hp 
     exact Nat.cast_injective hp
 #align polynomial.is_unit_trinomial_iff' Polynomial.isUnitTrinomial_iff'
+-/
 
+#print Polynomial.isUnitTrinomial_iff'' /-
 theorem isUnitTrinomial_iff'' (h : p * p.mirror = q * q.mirror) :
     p.IsUnitTrinomial ↔ q.IsUnitTrinomial := by
   rw [is_unit_trinomial_iff', is_unit_trinomial_iff', h]
 #align polynomial.is_unit_trinomial_iff'' Polynomial.isUnitTrinomial_iff''
+-/
 
 namespace IsUnitTrinomial
 
+#print Polynomial.IsUnitTrinomial.irreducible_aux1 /-
 theorem irreducible_aux1 {k m n : ℕ} (hkm : k < m) (hmn : m < n) (u v w : Units ℤ)
     (hp : p = trinomial k m n u v w) :
     C ↑v * (C ↑u * X ^ (m + n) + C ↑w * X ^ (n - m + k + n)) =
@@ -271,7 +306,9 @@ theorem irreducible_aux1 {k m n : ℕ} (hkm : k < m) (hmn : m < n) (u v w : Unit
   · exact fun h => asymm ((add_lt_add_iff_left k).mp h.1) key
   · exact fun h => asymm ((add_lt_add_iff_left k).mp h.1) (hkm.trans hmn)
 #align polynomial.is_unit_trinomial.irreducible_aux1 Polynomial.IsUnitTrinomial.irreducible_aux1
+-/
 
+#print Polynomial.IsUnitTrinomial.irreducible_aux2 /-
 theorem irreducible_aux2 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k < m') (hmn' : m' < n)
     (u v w : Units ℤ) (hp : p = trinomial k m n u v w) (hq : q = trinomial k m' n u v w)
     (h : p * p.mirror = q * q.mirror) : q = p ∨ q = p.mirror :=
@@ -297,7 +334,9 @@ theorem irreducible_aux2 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k
     exact hmn'.le.trans (Nat.le_add_right n k)
     exact hmn.le.trans (Nat.le_add_right n k)
 #align polynomial.is_unit_trinomial.irreducible_aux2 Polynomial.IsUnitTrinomial.irreducible_aux2
+-/
 
+#print Polynomial.IsUnitTrinomial.irreducible_aux3 /-
 theorem irreducible_aux3 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k < m') (hmn' : m' < n)
     (u v w x z : Units ℤ) (hp : p = trinomial k m n u v w) (hq : q = trinomial k m' n x v z)
     (h : p * p.mirror = q * q.mirror) : q = p ∨ q = p.mirror :=
@@ -326,7 +365,9 @@ theorem irreducible_aux3 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k
       irreducible_aux2 hkm hmn (lt_add_of_pos_left k (tsub_pos_of_lt hmn'))
         (lt_tsub_iff_right.mp ((tsub_lt_tsub_iff_left_of_le hmn'.le).mpr hkm')) u v w hp hq h
 #align polynomial.is_unit_trinomial.irreducible_aux3 Polynomial.IsUnitTrinomial.irreducible_aux3
+-/
 
+#print Polynomial.IsUnitTrinomial.irreducible_of_coprime /-
 theorem irreducible_of_coprime (hp : p.IsUnitTrinomial)
     (h : ∀ q : ℤ[X], q ∣ p → q ∣ p.mirror → IsUnit q) : Irreducible p :=
   by
@@ -360,13 +401,17 @@ theorem irreducible_of_coprime (hp : p.IsUnitTrinomial)
     · exact Or.inr (Or.inl rfl)
     · exact Or.inr (Or.inr (Or.inr p.mirror_neg))
 #align polynomial.is_unit_trinomial.irreducible_of_coprime Polynomial.IsUnitTrinomial.irreducible_of_coprime
+-/
 
+#print Polynomial.IsUnitTrinomial.irreducible_of_isCoprime /-
 /-- A unit trinomial is irreducible if it is coprime with its mirror -/
 theorem irreducible_of_isCoprime (hp : p.IsUnitTrinomial) (h : IsCoprime p p.mirror) :
     Irreducible p :=
   irreducible_of_coprime hp fun q => h.isUnit_of_dvd'
 #align polynomial.is_unit_trinomial.irreducible_of_is_coprime Polynomial.IsUnitTrinomial.irreducible_of_isCoprime
+-/
 
+#print Polynomial.IsUnitTrinomial.irreducible_of_coprime' /-
 /-- A unit trinomial is irreducible if it has no complex roots in common with its mirror -/
 theorem irreducible_of_coprime' (hp : IsUnitTrinomial p)
     (h : ∀ z : ℂ, ¬(aeval z p = 0 ∧ aeval z (mirror p) = 0)) : Irreducible p :=
@@ -390,6 +435,7 @@ theorem irreducible_of_coprime' (hp : IsUnitTrinomial p)
   · cases' hq' with g' hg'
     rw [hg', aeval_mul, hz, MulZeroClass.zero_mul]
 #align polynomial.is_unit_trinomial.irreducible_of_coprime' Polynomial.IsUnitTrinomial.irreducible_of_coprime'
+-/
 
 -- TODO: Develop more theory (e.g., it suffices to check that `aeval z p ≠ 0` for `z = 0`
 -- and `z` a root of unity)
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
 
 ! This file was ported from Lean 3 source module data.polynomial.unit_trinomial
-! leanprover-community/mathlib commit 302eab4f46abb63de520828de78c04cb0f9b5836
+! leanprover-community/mathlib commit 660b3a2db3522fa0db036e569dc995a615c4c848
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
@@ -14,6 +14,9 @@ import Mathbin.Data.Polynomial.Mirror
 /-!
 # Unit Trinomials
 
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
 This file defines irreducible trinomials and proves an irreducibility criterion.
 
 ## Main definitions
Diff
@@ -37,10 +37,12 @@ section Semiring
 
 variable {R : Type _} [Semiring R] (k m n : ℕ) (u v w : R)
 
+#print Polynomial.trinomial /-
 /-- Shorthand for a trinomial -/
 noncomputable def trinomial :=
   C u * X ^ k + C v * X ^ m + C w * X ^ n
 #align polynomial.trinomial Polynomial.trinomial
+-/
 
 theorem trinomial_def : trinomial k m n u v w = C u * X ^ k + C v * X ^ m + C w * X ^ n :=
   rfl
@@ -48,23 +50,29 @@ theorem trinomial_def : trinomial k m n u v w = C u * X ^ k + C v * X ^ m + C w
 
 variable {k m n u v w}
 
+#print Polynomial.trinomial_leading_coeff' /-
 theorem trinomial_leading_coeff' (hkm : k < m) (hmn : m < n) :
     (trinomial k m n u v w).coeff n = w := by
   rw [trinomial_def, coeff_add, coeff_add, coeff_C_mul_X_pow, coeff_C_mul_X_pow, coeff_C_mul_X_pow,
     if_neg (hkm.trans hmn).ne', if_neg hmn.ne', if_pos rfl, zero_add, zero_add]
 #align polynomial.trinomial_leading_coeff' Polynomial.trinomial_leading_coeff'
+-/
 
+#print Polynomial.trinomial_middle_coeff /-
 theorem trinomial_middle_coeff (hkm : k < m) (hmn : m < n) : (trinomial k m n u v w).coeff m = v :=
   by
   rw [trinomial_def, coeff_add, coeff_add, coeff_C_mul_X_pow, coeff_C_mul_X_pow, coeff_C_mul_X_pow,
     if_neg hkm.ne', if_pos rfl, if_neg hmn.ne, zero_add, add_zero]
 #align polynomial.trinomial_middle_coeff Polynomial.trinomial_middle_coeff
+-/
 
+#print Polynomial.trinomial_trailing_coeff' /-
 theorem trinomial_trailing_coeff' (hkm : k < m) (hmn : m < n) :
     (trinomial k m n u v w).coeff k = u := by
   rw [trinomial_def, coeff_add, coeff_add, coeff_C_mul_X_pow, coeff_C_mul_X_pow, coeff_C_mul_X_pow,
     if_pos rfl, if_neg hkm.ne, if_neg (hkm.trans hmn).Ne, add_zero, add_zero]
 #align polynomial.trinomial_trailing_coeff' Polynomial.trinomial_trailing_coeff'
+-/
 
 theorem trinomial_natDegree (hkm : k < m) (hmn : m < n) (hw : w ≠ 0) :
     (trinomial k m n u v w).natDegree = n :=
@@ -106,12 +114,14 @@ theorem trinomial_trailingCoeff (hkm : k < m) (hmn : m < n) (hu : u ≠ 0) :
   rw [trailing_coeff, trinomial_nat_trailing_degree hkm hmn hu, trinomial_trailing_coeff' hkm hmn]
 #align polynomial.trinomial_trailing_coeff Polynomial.trinomial_trailingCoeff
 
+#print Polynomial.trinomial_monic /-
 theorem trinomial_monic (hkm : k < m) (hmn : m < n) : (trinomial k m n u v 1).Monic :=
   by
   cases' subsingleton_or_nontrivial R with h h
   · apply Subsingleton.elim
   · exact trinomial_leading_coeff hkm hmn one_ne_zero
 #align polynomial.trinomial_monic Polynomial.trinomial_monic
+-/
 
 theorem trinomial_mirror (hkm : k < m) (hmn : m < n) (hu : u ≠ 0) (hw : w ≠ 0) :
     (trinomial k m n u v w).mirror = trinomial k (n - m + k) n w v u := by
Diff
@@ -74,7 +74,7 @@ theorem trinomial_natDegree (hkm : k < m) (hmn : m < n) (hw : w ≠ 0) :
       ((Finset.sup_le fun i h => _).antisymm <|
         le_degree_of_ne_zero <| by rwa [trinomial_leading_coeff' hkm hmn])
   replace h := support_trinomial' k m n u v w h
-  rw [mem_insert, mem_insert, mem_singleton] at h
+  rw [mem_insert, mem_insert, mem_singleton] at h 
   rcases h with (rfl | rfl | rfl)
   · exact with_bot.coe_le_coe.mpr (hkm.trans hmn).le
   · exact with_bot.coe_le_coe.mpr hmn.le
@@ -89,7 +89,7 @@ theorem trinomial_natTrailingDegree (hkm : k < m) (hmn : m < n) (hu : u ≠ 0) :
       ((Finset.le_inf fun i h => _).antisymm <|
           le_trailing_degree_of_ne_zero <| by rwa [trinomial_trailing_coeff' hkm hmn]).symm
   replace h := support_trinomial' k m n u v w h
-  rw [mem_insert, mem_insert, mem_singleton] at h
+  rw [mem_insert, mem_insert, mem_singleton] at h 
   rcases h with (rfl | rfl | rfl)
   · exact le_rfl
   · exact with_top.coe_le_coe.mpr hkm.le
@@ -134,7 +134,7 @@ variable (p q : ℤ[X])
 
 /-- A unit trinomial is a trinomial with unit coefficients. -/
 def IsUnitTrinomial :=
-  ∃ (k m n : ℕ)(hkm : k < m)(hmn : m < n)(u v w : Units ℤ), p = trinomial k m n u v w
+  ∃ (k m n : ℕ) (hkm : k < m) (hmn : m < n) (u v w : Units ℤ), p = trinomial k m n u v w
 #align polynomial.is_unit_trinomial Polynomial.IsUnitTrinomial
 
 variable {p q}
@@ -166,7 +166,7 @@ theorem coeff_isUnit (hp : p.IsUnitTrinomial) {k : ℕ} (hk : k ∈ p.support) :
   by
   obtain ⟨k, m, n, hkm, hmn, u, v, w, rfl⟩ := hp
   have := support_trinomial' k m n (↑u) (↑v) (↑w) hk
-  rw [mem_insert, mem_insert, mem_singleton] at this
+  rw [mem_insert, mem_insert, mem_singleton] at this 
   rcases this with (rfl | rfl | rfl)
   · refine' ⟨u, by rw [trinomial_trailing_coeff' hkm hmn]⟩
   · refine' ⟨v, by rw [trinomial_middle_coeff hkm hmn]⟩
@@ -188,15 +188,15 @@ theorem isUnitTrinomial_iff :
   by
   refine' ⟨fun hp => ⟨hp.card_support_eq_three, fun k => hp.coeff_isUnit⟩, fun hp => _⟩
   obtain ⟨k, m, n, hkm, hmn, x, y, z, hx, hy, hz, rfl⟩ := card_support_eq_three.mp hp.1
-  rw [support_trinomial hkm hmn hx hy hz] at hp
+  rw [support_trinomial hkm hmn hx hy hz] at hp 
   replace hx := hp.2 k (mem_insert_self k {m, n})
   replace hy := hp.2 m (mem_insert_of_mem (mem_insert_self m {n}))
   replace hz := hp.2 n (mem_insert_of_mem (mem_insert_of_mem (mem_singleton_self n)))
-  simp_rw [coeff_add, coeff_C_mul, coeff_X_pow_self, mul_one, coeff_X_pow] at hx hy hz
-  rw [if_neg hkm.ne, if_neg (hkm.trans hmn).Ne] at hx
-  rw [if_neg hkm.ne', if_neg hmn.ne] at hy
-  rw [if_neg (hkm.trans hmn).ne', if_neg hmn.ne'] at hz
-  simp_rw [MulZeroClass.mul_zero, zero_add, add_zero] at hx hy hz
+  simp_rw [coeff_add, coeff_C_mul, coeff_X_pow_self, mul_one, coeff_X_pow] at hx hy hz 
+  rw [if_neg hkm.ne, if_neg (hkm.trans hmn).Ne] at hx 
+  rw [if_neg hkm.ne', if_neg hmn.ne] at hy 
+  rw [if_neg (hkm.trans hmn).ne', if_neg hmn.ne'] at hz 
+  simp_rw [MulZeroClass.mul_zero, zero_add, add_zero] at hx hy hz 
   exact ⟨k, m, n, hkm, hmn, hx.unit, hy.unit, hz.unit, rfl⟩
 #align polynomial.is_unit_trinomial_iff Polynomial.isUnitTrinomial_iff
 
@@ -218,7 +218,7 @@ theorem isUnitTrinomial_iff' :
       Int.sq_eq_one_of_sq_le_three
         ((single_le_sum (fun k hk => sq_nonneg (p.coeff k)) hk).trans hp.le) (mem_support_iff.mp hk)
     refine' is_unit_trinomial_iff.mpr ⟨_, fun k hk => isUnit_ofPowEqOne (key k hk) two_ne_zero⟩
-    rw [sum_def, sum_congr rfl key, sum_const, Nat.smul_one_eq_coe] at hp
+    rw [sum_def, sum_congr rfl key, sum_const, Nat.smul_one_eq_coe] at hp 
     exact Nat.cast_injective hp
 #align polynomial.is_unit_trinomial_iff' Polynomial.isUnitTrinomial_iff'
 
@@ -252,7 +252,7 @@ theorem irreducible_aux1 {k m n : ℕ} (hkm : k < m) (hmn : m < n) (u v w : Unit
     exact fun h => h.1.Ne rfl
   · intro h
     have := h.1
-    rw [add_comm, add_lt_add_iff_right] at this
+    rw [add_comm, add_lt_add_iff_right] at this 
     exact asymm this hmn
   · exact fun h => h.1.Ne rfl
   · exact fun h => asymm ((add_lt_add_iff_left k).mp h.1) key
@@ -267,19 +267,19 @@ theorem irreducible_aux2 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k
   replace h := congr_arg f h
   replace h := (irreducible_aux1 hkm hmn u v w hp).trans h
   replace h := h.trans (irreducible_aux1 hkm' hmn' u v w hq).symm
-  rw [(is_unit_C.mpr v.is_unit).mul_right_inj] at h
-  rw [binomial_eq_binomial u.ne_zero w.ne_zero] at h
-  simp only [add_left_inj, Units.eq_iff] at h
+  rw [(is_unit_C.mpr v.is_unit).mul_right_inj] at h 
+  rw [binomial_eq_binomial u.ne_zero w.ne_zero] at h 
+  simp only [add_left_inj, Units.eq_iff] at h 
   rcases h with (⟨rfl, -⟩ | ⟨rfl, rfl, h⟩ | ⟨-, hm, hm'⟩)
   · exact Or.inl (hq.trans hp.symm)
   · refine' Or.inr _
-    rw [← trinomial_mirror hkm' hmn' u.ne_zero u.ne_zero, eq_comm, mirror_eq_iff] at hp
+    rw [← trinomial_mirror hkm' hmn' u.ne_zero u.ne_zero, eq_comm, mirror_eq_iff] at hp 
     exact hq.trans hp
   · suffices m = m' by
-      rw [this] at hp
+      rw [this] at hp 
       exact Or.inl (hq.trans hp.symm)
-    rw [tsub_add_eq_add_tsub hmn.le, eq_tsub_iff_add_eq_of_le, ← two_mul] at hm
-    rw [tsub_add_eq_add_tsub hmn'.le, eq_tsub_iff_add_eq_of_le, ← two_mul] at hm'
+    rw [tsub_add_eq_add_tsub hmn.le, eq_tsub_iff_add_eq_of_le, ← two_mul] at hm 
+    rw [tsub_add_eq_add_tsub hmn'.le, eq_tsub_iff_add_eq_of_le, ← two_mul] at hm' 
     exact mul_left_cancel₀ two_ne_zero (hm.trans hm'.symm)
     exact hmn'.le.trans (Nat.le_add_right n k)
     exact hmn.le.trans (Nat.le_add_right n k)
@@ -293,21 +293,21 @@ theorem irreducible_aux3 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k
   rw [leading_coeff_mul, leading_coeff_mul, mirror_leading_coeff, mirror_leading_coeff, hp, hq,
     trinomial_leading_coeff hkm hmn w.ne_zero, trinomial_leading_coeff hkm' hmn' z.ne_zero,
     trinomial_trailing_coeff hkm hmn u.ne_zero, trinomial_trailing_coeff hkm' hmn' x.ne_zero] at
-    hmul
+    hmul 
   have hadd := congr_arg (eval 1) h
-  rw [eval_mul, eval_mul, mirror_eval_one, mirror_eval_one, ← sq, ← sq, hp, hq] at hadd
-  simp only [eval_add, eval_C_mul, eval_pow, eval_X, one_pow, mul_one, trinomial_def] at hadd
-  rw [add_assoc, add_assoc, add_comm ↑u, add_comm ↑x, add_assoc, add_assoc] at hadd
-  simp only [add_sq', add_assoc, add_right_inj, ← Units.val_pow_eq_pow_val, Int.units_sq] at hadd
+  rw [eval_mul, eval_mul, mirror_eval_one, mirror_eval_one, ← sq, ← sq, hp, hq] at hadd 
+  simp only [eval_add, eval_C_mul, eval_pow, eval_X, one_pow, mul_one, trinomial_def] at hadd 
+  rw [add_assoc, add_assoc, add_comm ↑u, add_comm ↑x, add_assoc, add_assoc] at hadd 
+  simp only [add_sq', add_assoc, add_right_inj, ← Units.val_pow_eq_pow_val, Int.units_sq] at hadd 
   rw [mul_assoc, hmul, ← mul_assoc, add_right_inj,
-    mul_right_inj' (show 2 * (v : ℤ) ≠ 0 from mul_ne_zero two_ne_zero v.ne_zero)] at hadd
+    mul_right_inj' (show 2 * (v : ℤ) ≠ 0 from mul_ne_zero two_ne_zero v.ne_zero)] at hadd 
   replace hadd :=
     (Int.isUnit_add_isUnit_eq_isUnit_add_isUnit w.is_unit u.is_unit z.is_unit x.is_unit).mp hadd
-  simp only [Units.eq_iff] at hadd
+  simp only [Units.eq_iff] at hadd 
   rcases hadd with (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩)
   · exact irreducible_aux2 hkm hmn hkm' hmn' u v w hp hq h
-  · rw [← mirror_inj, trinomial_mirror hkm' hmn' w.ne_zero u.ne_zero] at hq
-    rw [mul_comm q, ← q.mirror_mirror, q.mirror.mirror_mirror] at h
+  · rw [← mirror_inj, trinomial_mirror hkm' hmn' w.ne_zero u.ne_zero] at hq 
+    rw [mul_comm q, ← q.mirror_mirror, q.mirror.mirror_mirror] at h 
     rw [← mirror_inj, or_comm', ← mirror_eq_iff]
     exact
       irreducible_aux2 hkm hmn (lt_add_of_pos_left k (tsub_pos_of_lt hmn'))
@@ -339,10 +339,10 @@ theorem irreducible_of_coprime (hp : p.IsUnitTrinomial)
     · exact Or.inl h2
     · exact Or.inr (Or.inr (Or.inl h2))
   · rw [h1] at *
-    rw [trinomial_def] at hp
+    rw [trinomial_def] at hp 
     rw [← neg_inj, neg_add, neg_add, ← neg_mul, ← neg_mul, ← neg_mul, ← C_neg, ← C_neg, ← C_neg] at
-      hp
-    rw [← neg_mul_neg, ← mirror_neg] at hpq
+      hp 
+    rw [← neg_mul_neg, ← mirror_neg] at hpq 
     rcases irreducible_aux3 hkm hmn hkm' hmn' (-u) (-v) (-w) x z hp hq hpq with (rfl | rfl)
     · exact Or.inr (Or.inl rfl)
     · exact Or.inr (Or.inr (Or.inr p.mirror_neg))
@@ -362,15 +362,15 @@ theorem irreducible_of_coprime' (hp : IsUnitTrinomial p)
   suffices ¬0 < q.nat_degree by
     rcases hq with ⟨p, rfl⟩
     replace hp := hp.leading_coeff_is_unit
-    rw [leading_coeff_mul] at hp
+    rw [leading_coeff_mul] at hp 
     replace hp := isUnit_of_mul_isUnit_left hp
-    rw [not_lt, le_zero_iff] at this
+    rw [not_lt, le_zero_iff] at this 
     rwa [eq_C_of_nat_degree_eq_zero this, is_unit_C, ← this]
   intro hq''
-  rw [nat_degree_pos_iff_degree_pos] at hq''
-  rw [← degree_map_eq_of_injective (algebraMap ℤ ℂ).injective_int] at hq''
+  rw [nat_degree_pos_iff_degree_pos] at hq'' 
+  rw [← degree_map_eq_of_injective (algebraMap ℤ ℂ).injective_int] at hq'' 
   cases' Complex.exists_root hq'' with z hz
-  rw [is_root, eval_map, ← aeval_def] at hz
+  rw [is_root, eval_map, ← aeval_def] at hz 
   refine' h z ⟨_, _⟩
   · cases' hq with g' hg'
     rw [hg', aeval_mul, hz, MulZeroClass.zero_mul]
Diff
@@ -29,7 +29,7 @@ This file defines irreducible trinomials and proves an irreducibility criterion.
 
 namespace Polynomial
 
-open Polynomial
+open scoped Polynomial
 
 open Finset
 
Diff
@@ -196,7 +196,7 @@ theorem isUnitTrinomial_iff :
   rw [if_neg hkm.ne, if_neg (hkm.trans hmn).Ne] at hx
   rw [if_neg hkm.ne', if_neg hmn.ne] at hy
   rw [if_neg (hkm.trans hmn).ne', if_neg hmn.ne'] at hz
-  simp_rw [mul_zero, zero_add, add_zero] at hx hy hz
+  simp_rw [MulZeroClass.mul_zero, zero_add, add_zero] at hx hy hz
   exact ⟨k, m, n, hkm, hmn, hx.unit, hy.unit, hz.unit, rfl⟩
 #align polynomial.is_unit_trinomial_iff Polynomial.isUnitTrinomial_iff
 
@@ -373,9 +373,9 @@ theorem irreducible_of_coprime' (hp : IsUnitTrinomial p)
   rw [is_root, eval_map, ← aeval_def] at hz
   refine' h z ⟨_, _⟩
   · cases' hq with g' hg'
-    rw [hg', aeval_mul, hz, zero_mul]
+    rw [hg', aeval_mul, hz, MulZeroClass.zero_mul]
   · cases' hq' with g' hg'
-    rw [hg', aeval_mul, hz, zero_mul]
+    rw [hg', aeval_mul, hz, MulZeroClass.zero_mul]
 #align polynomial.is_unit_trinomial.irreducible_of_coprime' Polynomial.IsUnitTrinomial.irreducible_of_coprime'
 
 -- TODO: Develop more theory (e.g., it suffices to check that `aeval z p ≠ 0` for `z = 0`
Diff
@@ -39,10 +39,10 @@ variable {R : Type _} [Semiring R] (k m n : ℕ) (u v w : R)
 
 /-- Shorthand for a trinomial -/
 noncomputable def trinomial :=
-  c u * x ^ k + c v * x ^ m + c w * x ^ n
+  C u * X ^ k + C v * X ^ m + C w * X ^ n
 #align polynomial.trinomial Polynomial.trinomial
 
-theorem trinomial_def : trinomial k m n u v w = c u * x ^ k + c v * x ^ m + c w * x ^ n :=
+theorem trinomial_def : trinomial k m n u v w = C u * X ^ k + C v * X ^ m + C w * X ^ n :=
   rfl
 #align polynomial.trinomial_def Polynomial.trinomial_def
 
@@ -231,7 +231,7 @@ namespace IsUnitTrinomial
 
 theorem irreducible_aux1 {k m n : ℕ} (hkm : k < m) (hmn : m < n) (u v w : Units ℤ)
     (hp : p = trinomial k m n u v w) :
-    c ↑v * (c ↑u * x ^ (m + n) + c ↑w * x ^ (n - m + k + n)) =
+    C ↑v * (C ↑u * X ^ (m + n) + C ↑w * X ^ (n - m + k + n)) =
       ⟨Finsupp.filter (Set.Ioo (k + n) (n + n)) (p * p.mirror).toFinsupp⟩ :=
   by
   have key : n - m + k < n := by rwa [← lt_tsub_iff_right, tsub_lt_tsub_iff_left_of_le hmn.le]

Changes in mathlib4

mathlib3
mathlib4
chore: adapt to multiple goal linter 2 (#12361)

A PR analogous to #12338: reformatting proofs following the multiple goals linter of #12339.

Diff
@@ -273,10 +273,10 @@ theorem irreducible_aux2 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k
       rw [this] at hp
       exact Or.inl (hq.trans hp.symm)
     rw [tsub_add_eq_add_tsub hmn.le, eq_tsub_iff_add_eq_of_le, ← two_mul] at hm
-    rw [tsub_add_eq_add_tsub hmn'.le, eq_tsub_iff_add_eq_of_le, ← two_mul] at hm'
-    exact mul_left_cancel₀ two_ne_zero (hm.trans hm'.symm)
-    exact hmn'.le.trans (Nat.le_add_right n k)
-    exact hmn.le.trans (Nat.le_add_right n k)
+    · rw [tsub_add_eq_add_tsub hmn'.le, eq_tsub_iff_add_eq_of_le, ← two_mul] at hm'
+      · exact mul_left_cancel₀ two_ne_zero (hm.trans hm'.symm)
+      · exact hmn'.le.trans (Nat.le_add_right n k)
+    · exact hmn.le.trans (Nat.le_add_right n k)
 #align polynomial.is_unit_trinomial.irreducible_aux2 Polynomial.IsUnitTrinomial.irreducible_aux2
 
 theorem irreducible_aux3 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k < m') (hmn' : m' < n)
move(Polynomial): Move out of Data (#11751)

Polynomial and MvPolynomial are algebraic objects, hence should be under Algebra (or at least not under Data)

Diff
@@ -3,8 +3,8 @@ Copyright (c) 2022 Thomas Browning. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
 -/
+import Mathlib.Algebra.Polynomial.Mirror
 import Mathlib.Analysis.Complex.Polynomial
-import Mathlib.Data.Polynomial.Mirror
 
 #align_import data.polynomial.unit_trinomial from "leanprover-community/mathlib"@"302eab4f46abb63de520828de78c04cb0f9b5836"
 
feat(Polynomial): When the trailing degree is zero (#11655)

Characterise when trailingDegree p = 0 and natTrailingDegree p = 0. Also fix a few names.

Diff
@@ -83,7 +83,7 @@ theorem trinomial_natTrailingDegree (hkm : k < m) (hmn : m < n) (hu : u ≠ 0) :
   refine'
     natTrailingDegree_eq_of_trailingDegree_eq_some
       ((Finset.le_inf fun i h => _).antisymm <|
-          le_trailingDegree_of_ne_zero <| by rwa [trinomial_trailing_coeff' hkm hmn]).symm
+          trailingDegree_le_of_ne_zero <| by rwa [trinomial_trailing_coeff' hkm hmn]).symm
   replace h := support_trinomial' k m n u v w h
   rw [mem_insert, mem_insert, mem_singleton] at h
   rcases h with (rfl | rfl | rfl)
chore: Reduce scope of LinearOrderedCommGroupWithZero (#11716)

Reconstitute the file Algebra.Order.Monoid.WithZero from three files:

  • Algebra.Order.Monoid.WithZero.Defs
  • Algebra.Order.Monoid.WithZero.Basic
  • Algebra.Order.WithZero

Avoid importing it in many files. Most uses were just to get le_zero_iff to work on Nat.

Before pre_11716

After post_11716

Diff
@@ -358,7 +358,7 @@ theorem irreducible_of_coprime' (hp : IsUnitTrinomial p)
     replace hp := hp.leadingCoeff_isUnit
     rw [leadingCoeff_mul] at hp
     replace hp := isUnit_of_mul_isUnit_left hp
-    rw [not_lt, le_zero_iff] at this
+    rw [not_lt, Nat.le_zero] at this
     rwa [eq_C_of_natDegree_eq_zero this, isUnit_C, ← this]
   intro hq''
   rw [natDegree_pos_iff_degree_pos] at hq''
feat: introduce IsRelPrime and DecompositionMonoid and refactor (#10327)
  • Introduce typeclass DecompositionMonoid, which says every element in the monoid is primal, i.e., whenever an element divides a product b * c, it can be factored into a product such that the factors divides b and c respectively. A domain is called pre-Schreier if its multiplicative monoid is a decomposition monoid, and these are more general than GCD domains.

  • Show that any GCDMonoid is a DecompositionMonoid. In order for lemmas about DecompositionMonoids to automatically apply to UniqueFactorizationMonoids, we add instances from UniqueFactorizationMonoid α to Nonempty (NormalizedGCDMonoid α) to Nonempty (GCDMonoid α) to DecompositionMonoid α. (Zulip) See the bottom of message for an updated diagram of classes and instances.

  • Introduce binary predicate IsRelPrime which says that the only common divisors of the two elements are units. Replace previous occurrences in mathlib by this predicate.

  • Duplicate all lemmas about IsCoprime in Coprime/Basic (except three lemmas about smul) to IsRelPrime. Due to import constraints, they are spread into three files Algebra/Divisibility/Units (including key lemmas assuming DecompositionMonoid), GroupWithZero/Divisibility, and Coprime/Basic.

  • Show IsCoprime always imply IsRelPrime and is equivalent to it in Bezout rings. To reduce duplication, the definition of Bezout rings and the GCDMonoid instance are moved from RingTheory/Bezout to RingTheory/PrincipalIdealDomain, and some results in PrincipalIdealDomain are generalized to Bezout rings.

  • Remove the recently added file Squarefree/UniqueFactorizationMonoid and place the results appropriately within Squarefree/Basic. All results are generalized to DecompositionMonoid or weaker except the last one.

Zulip

With this PR, all the following instances (indicated by arrows) now work; this PR fills the central part.

                                                                          EuclideanDomain (bundled)
                                                                              ↙          ↖
                                                                 IsPrincipalIdealRing ← Field (bundled)
                                                                            ↓             ↓
         NormalizationMonoid ←          NormalizedGCDMonoid → GCDMonoid  IsBezout ← ValuationRing ← DiscreteValuationRing
                   ↓                             ↓                 ↘       ↙
Nonempty NormalizationMonoid ← Nonempty NormalizedGCDMonoid →  Nonempty GCDMonoid → IsIntegrallyClosed
                                                 ↑                    ↓
                    WfDvdMonoid ← UniqueFactorizationMonoid → DecompositionMonoid
                                                 ↑
                                       IsPrincipalIdealRing

Co-authored-by: Junyan Xu <junyanxu.math@gmail.com> Co-authored-by: Oliver Nash <github@olivernash.org>

Diff
@@ -309,7 +309,7 @@ theorem irreducible_aux3 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k
 #align polynomial.is_unit_trinomial.irreducible_aux3 Polynomial.IsUnitTrinomial.irreducible_aux3
 
 theorem irreducible_of_coprime (hp : p.IsUnitTrinomial)
-    (h : ∀ q : ℤ[X], q ∣ p → q ∣ p.mirror → IsUnit q) : Irreducible p := by
+    (h : IsRelPrime p p.mirror) : Irreducible p := by
   refine' irreducible_of_mirror hp.not_isUnit (fun q hpq => _) h
   have hq : IsUnitTrinomial q := (isUnitTrinomial_iff'' hpq).mp hp
   obtain ⟨k, m, n, hkm, hmn, u, v, w, hp⟩ := hp
fix: do not abuse Set.Ioo as a predicate (#9027)
Diff
@@ -222,7 +222,7 @@ namespace IsUnitTrinomial
 theorem irreducible_aux1 {k m n : ℕ} (hkm : k < m) (hmn : m < n) (u v w : Units ℤ)
     (hp : p = trinomial k m n (u : ℤ) v w) :
     C (v : ℤ) * (C (u : ℤ) * X ^ (m + n) + C (w : ℤ) * X ^ (n - m + k + n)) =
-      ⟨Finsupp.filter (Set.Ioo (k + n) (n + n)) (p * p.mirror).toFinsupp⟩ := by
+      ⟨Finsupp.filter (· ∈ Set.Ioo (k + n) (n + n)) (p * p.mirror).toFinsupp⟩ := by
   have key : n - m + k < n := by rwa [← lt_tsub_iff_right, tsub_lt_tsub_iff_left_of_le hmn.le]
   rw [hp, trinomial_mirror hkm hmn u.ne_zero w.ne_zero]
   simp_rw [trinomial_def, C_mul_X_pow_eq_monomial, add_mul, mul_add, monomial_mul_monomial,
@@ -257,7 +257,7 @@ theorem irreducible_aux1 {k m n : ℕ} (hkm : k < m) (hmn : m < n) (u v w : Unit
 theorem irreducible_aux2 {k m m' n : ℕ} (hkm : k < m) (hmn : m < n) (hkm' : k < m') (hmn' : m' < n)
     (u v w : Units ℤ) (hp : p = trinomial k m n (u : ℤ) v w) (hq : q = trinomial k m' n (u : ℤ) v w)
     (h : p * p.mirror = q * q.mirror) : q = p ∨ q = p.mirror := by
-  let f : ℤ[X] → ℤ[X] := fun p => ⟨Finsupp.filter (Set.Ioo (k + n) (n + n)) p.toFinsupp⟩
+  let f : ℤ[X] → ℤ[X] := fun p => ⟨Finsupp.filter (· ∈ Set.Ioo (k + n) (n + n)) p.toFinsupp⟩
   replace h := congr_arg f h
   replace h := (irreducible_aux1 hkm hmn u v w hp).trans h
   replace h := h.trans (irreducible_aux1 hkm' hmn' u v w hq).symm
chore: tidy various files (#8823)
Diff
@@ -202,7 +202,7 @@ theorem isUnitTrinomial_iff' :
       sum_insert (mt mem_insert.mp (not_or_of_not hkm.ne (mt mem_singleton.mp (hkm.trans hmn).ne))),
       sum_insert (mt mem_singleton.mp hmn.ne), sum_singleton, trinomial_leading_coeff' hkm hmn,
       trinomial_middle_coeff hkm hmn, trinomial_trailing_coeff' hkm hmn]
-    simp_rw [← Units.val_pow_eq_pow_val, Int.units_sq]
+    simp_rw [← Units.val_pow_eq_pow_val, Int.units_sq, Units.val_one]
     decide
   · have key : ∀ k ∈ p.support, p.coeff k ^ 2 = 1 := fun k hk =>
       Int.sq_eq_one_of_sq_le_three
chore: bump to v4.3.0-rc2 (#8366)

PR contents

This is the supremum of

along with some minor fixes from failures on nightly-testing as Mathlib master is merged into it.

Note that some PRs for changes that are already compatible with the current toolchain and will be necessary have already been split out: #8380.

I am hopeful that in future we will be able to progressively merge adaptation PRs into a bump/v4.X.0 branch, so we never end up with a "big merge" like this. However one of these adaptation PRs (#8056) predates my new scheme for combined CI, and it wasn't possible to keep that PR viable in the meantime.

Lean PRs involved in this bump

In particular this includes adjustments for the Lean PRs

leanprover/lean4#2778

We can get rid of all the

local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue [lean4#2220](https://github.com/leanprover/lean4/pull/2220)

macros across Mathlib (and in any projects that want to write natural number powers of reals).

leanprover/lean4#2722

Changes the default behaviour of simp to (config := {decide := false}). This makes simp (and consequentially norm_num) less powerful, but also more consistent, and less likely to blow up in long failures. This requires a variety of changes: changing some previously by simp or norm_num to decide or rfl, or adding (config := {decide := true}).

leanprover/lean4#2783

This changed the behaviour of simp so that simp [f] will only unfold "fully applied" occurrences of f. The old behaviour can be recovered with simp (config := { unfoldPartialApp := true }). We may in future add a syntax for this, e.g. simp [!f]; please provide feedback! In the meantime, we have made the following changes:

  • switching to using explicit lemmas that have the intended level of application
  • (config := { unfoldPartialApp := true }) in some places, to recover the old behaviour
  • Using @[eqns] to manually adjust the equation lemmas for a particular definition, recovering the old behaviour just for that definition. See #8371, where we do this for Function.comp and Function.flip.

This change in Lean may require further changes down the line (e.g. adding the !f syntax, and/or upstreaming the special treatment for Function.comp and Function.flip, and/or removing this special treatment). Please keep an open and skeptical mind about these changes!

Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Mauricio Collares <mauricio@collares.org>

Diff
@@ -203,6 +203,7 @@ theorem isUnitTrinomial_iff' :
       sum_insert (mt mem_singleton.mp hmn.ne), sum_singleton, trinomial_leading_coeff' hkm hmn,
       trinomial_middle_coeff hkm hmn, trinomial_trailing_coeff' hkm hmn]
     simp_rw [← Units.val_pow_eq_pow_val, Int.units_sq]
+    decide
   · have key : ∀ k ∈ p.support, p.coeff k ^ 2 = 1 := fun k hk =>
       Int.sq_eq_one_of_sq_le_three
         ((single_le_sum (fun k _ => sq_nonneg (p.coeff k)) hk).trans hp.le) (mem_support_iff.mp hk)
chore: drop MulZeroClass. in mul_zero/zero_mul (#6682)

Search&replace MulZeroClass.mul_zero -> mul_zero, MulZeroClass.zero_mul -> zero_mul.

These were introduced by Mathport, as the full name of mul_zero is actually MulZeroClass.mul_zero (it's exported with the short name).

Diff
@@ -186,7 +186,7 @@ theorem isUnitTrinomial_iff :
   rw [if_neg hkm.ne, if_neg (hkm.trans hmn).ne] at hx
   rw [if_neg hkm.ne', if_neg hmn.ne] at hy
   rw [if_neg (hkm.trans hmn).ne', if_neg hmn.ne'] at hz
-  simp_rw [MulZeroClass.mul_zero, zero_add, add_zero] at hx hy hz
+  simp_rw [mul_zero, zero_add, add_zero] at hx hy hz
   exact ⟨k, m, n, hkm, hmn, hx.unit, hy.unit, hz.unit, rfl⟩
 #align polynomial.is_unit_trinomial_iff Polynomial.isUnitTrinomial_iff
 
chore: remove unused simps (#6632)

Co-authored-by: Eric Wieser <wieser.eric@gmail.com>

Diff
@@ -225,7 +225,7 @@ theorem irreducible_aux1 {k m n : ℕ} (hkm : k < m) (hmn : m < n) (u v w : Unit
   have key : n - m + k < n := by rwa [← lt_tsub_iff_right, tsub_lt_tsub_iff_left_of_le hmn.le]
   rw [hp, trinomial_mirror hkm hmn u.ne_zero w.ne_zero]
   simp_rw [trinomial_def, C_mul_X_pow_eq_monomial, add_mul, mul_add, monomial_mul_monomial,
-    toFinsupp_add, toFinsupp_monomial, Finsupp.filter_add]
+    toFinsupp_add, toFinsupp_monomial]
   -- Porting note: added next line (less powerful `simp`).
   rw [Finsupp.filter_add, Finsupp.filter_add, Finsupp.filter_add, Finsupp.filter_add,
     Finsupp.filter_add, Finsupp.filter_add, Finsupp.filter_add, Finsupp.filter_add]
chore: banish Type _ and Sort _ (#6499)

We remove all possible occurences of Type _ and Sort _ in favor of Type* and Sort*.

This has nice performance benefits.

Diff
@@ -33,7 +33,7 @@ open Finset
 
 section Semiring
 
-variable {R : Type _} [Semiring R] (k m n : ℕ) (u v w : R)
+variable {R : Type*} [Semiring R] (k m n : ℕ) (u v w : R)
 
 /-- Shorthand for a trinomial -/
 noncomputable def trinomial :=
chore: script to replace headers with #align_import statements (#5979)

Open in Gitpod

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -2,15 +2,12 @@
 Copyright (c) 2022 Thomas Browning. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
-
-! This file was ported from Lean 3 source module data.polynomial.unit_trinomial
-! leanprover-community/mathlib commit 302eab4f46abb63de520828de78c04cb0f9b5836
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathlib.Analysis.Complex.Polynomial
 import Mathlib.Data.Polynomial.Mirror
 
+#align_import data.polynomial.unit_trinomial from "leanprover-community/mathlib"@"302eab4f46abb63de520828de78c04cb0f9b5836"
+
 /-!
 # Unit Trinomials
 
feat: port Data.Polynomial.UnitTrinomial (#4948)

Dependencies 12 + 1128

1129 files ported (98.9%)
503465 lines ported (98.9%)
Show graph

The unported dependencies are

The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file