Metamath Proof Explorer


Theorem eucalginv

Description: The invariant of the step function E for Euclid's Algorithm is the gcd operator applied to the state. (Contributed by Paul Chapman, 31-Mar-2011) (Revised by Mario Carneiro, 29-May-2014)

Ref Expression
Hypothesis eucalgval.1 ⊢ E = x ∈ ℕ 0 , y ∈ ℕ 0 ⟼ if y = 0 x y y x mod y
Assertion eucalginv ⊢ X ∈ ℕ 0 × ℕ 0 → gcd ⁡ E ⁡ X = gcd ⁡ X

Proof

Step Hyp Ref Expression
1 eucalgval.1 ⊢ E = x ∈ ℕ 0 , y ∈ ℕ 0 ⟼ if y = 0 x y y x mod y
2 1 eucalgval ⊢ X ∈ ℕ 0 × ℕ 0 → E ⁡ X = if 2 nd ⁡ X = 0 X 2 nd ⁡ X mod ⁡ X
3 2 fveq2d ⊢ X ∈ ℕ 0 × ℕ 0 → gcd ⁡ E ⁡ X = gcd ⁡ if 2 nd ⁡ X = 0 X 2 nd ⁡ X mod ⁡ X
4 1st2nd2 ⊢ X ∈ ℕ 0 × ℕ 0 → X = 1 st ⁡ X 2 nd ⁡ X
5 4 adantr ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → X = 1 st ⁡ X 2 nd ⁡ X
6 5 fveq2d ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → mod ⁡ X = mod ⁡ 1 st ⁡ X 2 nd ⁡ X
7 df-ov ⊢ 1 st ⁡ X mod 2 nd ⁡ X = mod ⁡ 1 st ⁡ X 2 nd ⁡ X
8 6 7 eqtr4di ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → mod ⁡ X = 1 st ⁡ X mod 2 nd ⁡ X
9 8 oveq2d ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → 2 nd ⁡ X gcd mod ⁡ X = 2 nd ⁡ X gcd 1 st ⁡ X mod 2 nd ⁡ X
10 nnz ⊢ 2 nd ⁡ X ∈ ℕ → 2 nd ⁡ X ∈ ℤ
11 xp1st ⊢ X ∈ ℕ 0 × ℕ 0 → 1 st ⁡ X ∈ ℕ 0
12 11 adantr ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → 1 st ⁡ X ∈ ℕ 0
13 12 nn0zd ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → 1 st ⁡ X ∈ ℤ
14 zmodcl ⊢ 1 st ⁡ X ∈ ℤ ∧ 2 nd ⁡ X ∈ ℕ → 1 st ⁡ X mod 2 nd ⁡ X ∈ ℕ 0
15 13 14 sylancom ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → 1 st ⁡ X mod 2 nd ⁡ X ∈ ℕ 0
16 15 nn0zd ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → 1 st ⁡ X mod 2 nd ⁡ X ∈ ℤ
17 gcdcom ⊢ 2 nd ⁡ X ∈ ℤ ∧ 1 st ⁡ X mod 2 nd ⁡ X ∈ ℤ → 2 nd ⁡ X gcd 1 st ⁡ X mod 2 nd ⁡ X = 1 st ⁡ X mod 2 nd ⁡ X gcd 2 nd ⁡ X
18 10 16 17 syl2an2 ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → 2 nd ⁡ X gcd 1 st ⁡ X mod 2 nd ⁡ X = 1 st ⁡ X mod 2 nd ⁡ X gcd 2 nd ⁡ X
19 modgcd ⊢ 1 st ⁡ X ∈ ℤ ∧ 2 nd ⁡ X ∈ ℕ → 1 st ⁡ X mod 2 nd ⁡ X gcd 2 nd ⁡ X = 1 st ⁡ X gcd 2 nd ⁡ X
20 13 19 sylancom ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → 1 st ⁡ X mod 2 nd ⁡ X gcd 2 nd ⁡ X = 1 st ⁡ X gcd 2 nd ⁡ X
21 9 18 20 3eqtrd ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → 2 nd ⁡ X gcd mod ⁡ X = 1 st ⁡ X gcd 2 nd ⁡ X
22 nnne0 ⊢ 2 nd ⁡ X ∈ ℕ → 2 nd ⁡ X ≠ 0
23 22 adantl ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → 2 nd ⁡ X ≠ 0
24 23 neneqd ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → ¬ 2 nd ⁡ X = 0
25 24 iffalsed ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → if 2 nd ⁡ X = 0 X 2 nd ⁡ X mod ⁡ X = 2 nd ⁡ X mod ⁡ X
26 25 fveq2d ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → gcd ⁡ if 2 nd ⁡ X = 0 X 2 nd ⁡ X mod ⁡ X = gcd ⁡ 2 nd ⁡ X mod ⁡ X
27 df-ov ⊢ 2 nd ⁡ X gcd mod ⁡ X = gcd ⁡ 2 nd ⁡ X mod ⁡ X
28 26 27 eqtr4di ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → gcd ⁡ if 2 nd ⁡ X = 0 X 2 nd ⁡ X mod ⁡ X = 2 nd ⁡ X gcd mod ⁡ X
29 5 fveq2d ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → gcd ⁡ X = gcd ⁡ 1 st ⁡ X 2 nd ⁡ X
30 df-ov ⊢ 1 st ⁡ X gcd 2 nd ⁡ X = gcd ⁡ 1 st ⁡ X 2 nd ⁡ X
31 29 30 eqtr4di ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → gcd ⁡ X = 1 st ⁡ X gcd 2 nd ⁡ X
32 21 28 31 3eqtr4d ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X ∈ ℕ → gcd ⁡ if 2 nd ⁡ X = 0 X 2 nd ⁡ X mod ⁡ X = gcd ⁡ X
33 iftrue ⊢ 2 nd ⁡ X = 0 → if 2 nd ⁡ X = 0 X 2 nd ⁡ X mod ⁡ X = X
34 33 fveq2d ⊢ 2 nd ⁡ X = 0 → gcd ⁡ if 2 nd ⁡ X = 0 X 2 nd ⁡ X mod ⁡ X = gcd ⁡ X
35 34 adantl ⊢ X ∈ ℕ 0 × ℕ 0 ∧ 2 nd ⁡ X = 0 → gcd ⁡ if 2 nd ⁡ X = 0 X 2 nd ⁡ X mod ⁡ X = gcd ⁡ X
36 xp2nd ⊢ X ∈ ℕ 0 × ℕ 0 → 2 nd ⁡ X ∈ ℕ 0
37 elnn0 ⊢ 2 nd ⁡ X ∈ ℕ 0 ↔ 2 nd ⁡ X ∈ ℕ ∨ 2 nd ⁡ X = 0
38 36 37 sylib ⊢ X ∈ ℕ 0 × ℕ 0 → 2 nd ⁡ X ∈ ℕ ∨ 2 nd ⁡ X = 0
39 32 35 38 mpjaodan ⊢ X ∈ ℕ 0 × ℕ 0 → gcd ⁡ if 2 nd ⁡ X = 0 X 2 nd ⁡ X mod ⁡ X = gcd ⁡ X
40 3 39 eqtrd ⊢ X ∈ ℕ 0 × ℕ 0 → gcd ⁡ E ⁡ X = gcd ⁡ X