MPE Home Metamath Proof Explorer < Previous   Next >
Nearby theorems
Mirrors  >  Home  >  MPE Home  >  Th. List  >  lgsdinn0 Structured version   Visualization version   GIF version

Theorem lgsdinn0 24787
Description: Variation on lgsdi 24776 valid for all 𝑀, 𝑁 but only for positive 𝐴. (The exact location of the failure of this law is for 𝐴 = -1, 𝑀 = 0, and some 𝑁 in which case (-1 /L 0) = 1 but (-1 /L 𝑁) = -1 when -1 is not a quadratic residue mod 𝑁.) (Contributed by Mario Carneiro, 28-Apr-2016.)
Assertion
Ref Expression
lgsdinn0 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → (𝐴 /L (𝑀 · 𝑁)) = ((𝐴 /L 𝑀) · (𝐴 /L 𝑁)))

Proof of Theorem lgsdinn0
Dummy variable 𝑥 is distinct from all other variables.
StepHypRef Expression
1 simp3 1055 . . . . . 6 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → 𝑁 ∈ ℤ)
2 sq1 12775 . . . . . . . . . . . . . . . 16 (1↑2) = 1
32eqeq2i 2621 . . . . . . . . . . . . . . 15 ((𝐴↑2) = (1↑2) ↔ (𝐴↑2) = 1)
4 nn0re 11148 . . . . . . . . . . . . . . . . 17 (𝐴 ∈ ℕ0𝐴 ∈ ℝ)
5 nn0ge0 11165 . . . . . . . . . . . . . . . . 17 (𝐴 ∈ ℕ0 → 0 ≤ 𝐴)
6 1re 9895 . . . . . . . . . . . . . . . . . 18 1 ∈ ℝ
7 0le1 10400 . . . . . . . . . . . . . . . . . 18 0 ≤ 1
8 sq11 12753 . . . . . . . . . . . . . . . . . 18 (((𝐴 ∈ ℝ ∧ 0 ≤ 𝐴) ∧ (1 ∈ ℝ ∧ 0 ≤ 1)) → ((𝐴↑2) = (1↑2) ↔ 𝐴 = 1))
96, 7, 8mpanr12 716 . . . . . . . . . . . . . . . . 17 ((𝐴 ∈ ℝ ∧ 0 ≤ 𝐴) → ((𝐴↑2) = (1↑2) ↔ 𝐴 = 1))
104, 5, 9syl2anc 690 . . . . . . . . . . . . . . . 16 (𝐴 ∈ ℕ0 → ((𝐴↑2) = (1↑2) ↔ 𝐴 = 1))
1110adantr 479 . . . . . . . . . . . . . . 15 ((𝐴 ∈ ℕ0𝑥 ∈ ℤ) → ((𝐴↑2) = (1↑2) ↔ 𝐴 = 1))
123, 11syl5bbr 272 . . . . . . . . . . . . . 14 ((𝐴 ∈ ℕ0𝑥 ∈ ℤ) → ((𝐴↑2) = 1 ↔ 𝐴 = 1))
1312biimpa 499 . . . . . . . . . . . . 13 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) = 1) → 𝐴 = 1)
1413oveq1d 6542 . . . . . . . . . . . 12 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) = 1) → (𝐴 /L 𝑥) = (1 /L 𝑥))
15 1lgs 24782 . . . . . . . . . . . . 13 (𝑥 ∈ ℤ → (1 /L 𝑥) = 1)
1615ad2antlr 758 . . . . . . . . . . . 12 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) = 1) → (1 /L 𝑥) = 1)
1714, 16eqtrd 2643 . . . . . . . . . . 11 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) = 1) → (𝐴 /L 𝑥) = 1)
1817oveq1d 6542 . . . . . . . . . 10 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) = 1) → ((𝐴 /L 𝑥) · (𝐴 /L 0)) = (1 · (𝐴 /L 0)))
19 nn0z 11233 . . . . . . . . . . . . . 14 (𝐴 ∈ ℕ0𝐴 ∈ ℤ)
2019ad2antrr 757 . . . . . . . . . . . . 13 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) = 1) → 𝐴 ∈ ℤ)
21 0z 11221 . . . . . . . . . . . . 13 0 ∈ ℤ
22 lgscl 24753 . . . . . . . . . . . . 13 ((𝐴 ∈ ℤ ∧ 0 ∈ ℤ) → (𝐴 /L 0) ∈ ℤ)
2320, 21, 22sylancl 692 . . . . . . . . . . . 12 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) = 1) → (𝐴 /L 0) ∈ ℤ)
2423zcnd 11315 . . . . . . . . . . 11 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) = 1) → (𝐴 /L 0) ∈ ℂ)
2524mulid2d 9914 . . . . . . . . . 10 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) = 1) → (1 · (𝐴 /L 0)) = (𝐴 /L 0))
2618, 25eqtr2d 2644 . . . . . . . . 9 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) = 1) → (𝐴 /L 0) = ((𝐴 /L 𝑥) · (𝐴 /L 0)))
27 lgscl 24753 . . . . . . . . . . . . . 14 ((𝐴 ∈ ℤ ∧ 𝑥 ∈ ℤ) → (𝐴 /L 𝑥) ∈ ℤ)
2819, 27sylan 486 . . . . . . . . . . . . 13 ((𝐴 ∈ ℕ0𝑥 ∈ ℤ) → (𝐴 /L 𝑥) ∈ ℤ)
2928zcnd 11315 . . . . . . . . . . . 12 ((𝐴 ∈ ℕ0𝑥 ∈ ℤ) → (𝐴 /L 𝑥) ∈ ℂ)
3029adantr 479 . . . . . . . . . . 11 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) ≠ 1) → (𝐴 /L 𝑥) ∈ ℂ)
3130mul01d 10086 . . . . . . . . . 10 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) ≠ 1) → ((𝐴 /L 𝑥) · 0) = 0)
3219adantr 479 . . . . . . . . . . . . 13 ((𝐴 ∈ ℕ0𝑥 ∈ ℤ) → 𝐴 ∈ ℤ)
33 lgs0 24752 . . . . . . . . . . . . 13 (𝐴 ∈ ℤ → (𝐴 /L 0) = if((𝐴↑2) = 1, 1, 0))
3432, 33syl 17 . . . . . . . . . . . 12 ((𝐴 ∈ ℕ0𝑥 ∈ ℤ) → (𝐴 /L 0) = if((𝐴↑2) = 1, 1, 0))
35 ifnefalse 4047 . . . . . . . . . . . 12 ((𝐴↑2) ≠ 1 → if((𝐴↑2) = 1, 1, 0) = 0)
3634, 35sylan9eq 2663 . . . . . . . . . . 11 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) ≠ 1) → (𝐴 /L 0) = 0)
3736oveq2d 6543 . . . . . . . . . 10 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) ≠ 1) → ((𝐴 /L 𝑥) · (𝐴 /L 0)) = ((𝐴 /L 𝑥) · 0))
3831, 37, 363eqtr4rd 2654 . . . . . . . . 9 (((𝐴 ∈ ℕ0𝑥 ∈ ℤ) ∧ (𝐴↑2) ≠ 1) → (𝐴 /L 0) = ((𝐴 /L 𝑥) · (𝐴 /L 0)))
3926, 38pm2.61dane 2868 . . . . . . . 8 ((𝐴 ∈ ℕ0𝑥 ∈ ℤ) → (𝐴 /L 0) = ((𝐴 /L 𝑥) · (𝐴 /L 0)))
4039ralrimiva 2948 . . . . . . 7 (𝐴 ∈ ℕ0 → ∀𝑥 ∈ ℤ (𝐴 /L 0) = ((𝐴 /L 𝑥) · (𝐴 /L 0)))
41403ad2ant1 1074 . . . . . 6 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → ∀𝑥 ∈ ℤ (𝐴 /L 0) = ((𝐴 /L 𝑥) · (𝐴 /L 0)))
42 oveq2 6535 . . . . . . . . 9 (𝑥 = 𝑁 → (𝐴 /L 𝑥) = (𝐴 /L 𝑁))
4342oveq1d 6542 . . . . . . . 8 (𝑥 = 𝑁 → ((𝐴 /L 𝑥) · (𝐴 /L 0)) = ((𝐴 /L 𝑁) · (𝐴 /L 0)))
4443eqeq2d 2619 . . . . . . 7 (𝑥 = 𝑁 → ((𝐴 /L 0) = ((𝐴 /L 𝑥) · (𝐴 /L 0)) ↔ (𝐴 /L 0) = ((𝐴 /L 𝑁) · (𝐴 /L 0))))
4544rspcv 3277 . . . . . 6 (𝑁 ∈ ℤ → (∀𝑥 ∈ ℤ (𝐴 /L 0) = ((𝐴 /L 𝑥) · (𝐴 /L 0)) → (𝐴 /L 0) = ((𝐴 /L 𝑁) · (𝐴 /L 0))))
461, 41, 45sylc 62 . . . . 5 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → (𝐴 /L 0) = ((𝐴 /L 𝑁) · (𝐴 /L 0)))
4746adantr 479 . . . 4 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑀 = 0) → (𝐴 /L 0) = ((𝐴 /L 𝑁) · (𝐴 /L 0)))
48193ad2ant1 1074 . . . . . . . 8 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → 𝐴 ∈ ℤ)
4948, 21, 22sylancl 692 . . . . . . 7 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → (𝐴 /L 0) ∈ ℤ)
5049zcnd 11315 . . . . . 6 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → (𝐴 /L 0) ∈ ℂ)
5150adantr 479 . . . . 5 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑀 = 0) → (𝐴 /L 0) ∈ ℂ)
52 lgscl 24753 . . . . . . . 8 ((𝐴 ∈ ℤ ∧ 𝑁 ∈ ℤ) → (𝐴 /L 𝑁) ∈ ℤ)
5348, 1, 52syl2anc 690 . . . . . . 7 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → (𝐴 /L 𝑁) ∈ ℤ)
5453zcnd 11315 . . . . . 6 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → (𝐴 /L 𝑁) ∈ ℂ)
5554adantr 479 . . . . 5 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑀 = 0) → (𝐴 /L 𝑁) ∈ ℂ)
5651, 55mulcomd 9917 . . . 4 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑀 = 0) → ((𝐴 /L 0) · (𝐴 /L 𝑁)) = ((𝐴 /L 𝑁) · (𝐴 /L 0)))
5747, 56eqtr4d 2646 . . 3 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑀 = 0) → (𝐴 /L 0) = ((𝐴 /L 0) · (𝐴 /L 𝑁)))
58 oveq1 6534 . . . . 5 (𝑀 = 0 → (𝑀 · 𝑁) = (0 · 𝑁))
591zcnd 11315 . . . . . 6 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → 𝑁 ∈ ℂ)
6059mul02d 10085 . . . . 5 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → (0 · 𝑁) = 0)
6158, 60sylan9eqr 2665 . . . 4 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑀 = 0) → (𝑀 · 𝑁) = 0)
6261oveq2d 6543 . . 3 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑀 = 0) → (𝐴 /L (𝑀 · 𝑁)) = (𝐴 /L 0))
63 simpr 475 . . . . 5 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑀 = 0) → 𝑀 = 0)
6463oveq2d 6543 . . . 4 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑀 = 0) → (𝐴 /L 𝑀) = (𝐴 /L 0))
6564oveq1d 6542 . . 3 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑀 = 0) → ((𝐴 /L 𝑀) · (𝐴 /L 𝑁)) = ((𝐴 /L 0) · (𝐴 /L 𝑁)))
6657, 62, 653eqtr4d 2653 . 2 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑀 = 0) → (𝐴 /L (𝑀 · 𝑁)) = ((𝐴 /L 𝑀) · (𝐴 /L 𝑁)))
67 simp2 1054 . . . . 5 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → 𝑀 ∈ ℤ)
68 oveq2 6535 . . . . . . . 8 (𝑥 = 𝑀 → (𝐴 /L 𝑥) = (𝐴 /L 𝑀))
6968oveq1d 6542 . . . . . . 7 (𝑥 = 𝑀 → ((𝐴 /L 𝑥) · (𝐴 /L 0)) = ((𝐴 /L 𝑀) · (𝐴 /L 0)))
7069eqeq2d 2619 . . . . . 6 (𝑥 = 𝑀 → ((𝐴 /L 0) = ((𝐴 /L 𝑥) · (𝐴 /L 0)) ↔ (𝐴 /L 0) = ((𝐴 /L 𝑀) · (𝐴 /L 0))))
7170rspcv 3277 . . . . 5 (𝑀 ∈ ℤ → (∀𝑥 ∈ ℤ (𝐴 /L 0) = ((𝐴 /L 𝑥) · (𝐴 /L 0)) → (𝐴 /L 0) = ((𝐴 /L 𝑀) · (𝐴 /L 0))))
7267, 41, 71sylc 62 . . . 4 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → (𝐴 /L 0) = ((𝐴 /L 𝑀) · (𝐴 /L 0)))
7372adantr 479 . . 3 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑁 = 0) → (𝐴 /L 0) = ((𝐴 /L 𝑀) · (𝐴 /L 0)))
74 oveq2 6535 . . . . 5 (𝑁 = 0 → (𝑀 · 𝑁) = (𝑀 · 0))
7567zcnd 11315 . . . . . 6 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → 𝑀 ∈ ℂ)
7675mul01d 10086 . . . . 5 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → (𝑀 · 0) = 0)
7774, 76sylan9eqr 2665 . . . 4 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑁 = 0) → (𝑀 · 𝑁) = 0)
7877oveq2d 6543 . . 3 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑁 = 0) → (𝐴 /L (𝑀 · 𝑁)) = (𝐴 /L 0))
79 simpr 475 . . . . 5 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑁 = 0) → 𝑁 = 0)
8079oveq2d 6543 . . . 4 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑁 = 0) → (𝐴 /L 𝑁) = (𝐴 /L 0))
8180oveq2d 6543 . . 3 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑁 = 0) → ((𝐴 /L 𝑀) · (𝐴 /L 𝑁)) = ((𝐴 /L 𝑀) · (𝐴 /L 0)))
8273, 78, 813eqtr4d 2653 . 2 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ 𝑁 = 0) → (𝐴 /L (𝑀 · 𝑁)) = ((𝐴 /L 𝑀) · (𝐴 /L 𝑁)))
83 lgsdi 24776 . . 3 (((𝐴 ∈ ℤ ∧ 𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ (𝑀 ≠ 0 ∧ 𝑁 ≠ 0)) → (𝐴 /L (𝑀 · 𝑁)) = ((𝐴 /L 𝑀) · (𝐴 /L 𝑁)))
8419, 83syl3anl1 1365 . 2 (((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) ∧ (𝑀 ≠ 0 ∧ 𝑁 ≠ 0)) → (𝐴 /L (𝑀 · 𝑁)) = ((𝐴 /L 𝑀) · (𝐴 /L 𝑁)))
8566, 82, 84pm2.61da2ne 2869 1 ((𝐴 ∈ ℕ0𝑀 ∈ ℤ ∧ 𝑁 ∈ ℤ) → (𝐴 /L (𝑀 · 𝑁)) = ((𝐴 /L 𝑀) · (𝐴 /L 𝑁)))
Colors of variables: wff setvar class
Syntax hints:  wi 4  wb 194  wa 382  w3a 1030   = wceq 1474  wcel 1976  wne 2779  wral 2895  ifcif 4035   class class class wbr 4577  (class class class)co 6527  cc 9790  cr 9791  0cc0 9792  1c1 9793   · cmul 9797  cle 9931  2c2 10917  0cn0 11139  cz 11210  cexp 12677   /L clgs 24736
This theorem was proved from axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-3 8  ax-gen 1712  ax-4 1727  ax-5 1826  ax-6 1874  ax-7 1921  ax-8 1978  ax-9 1985  ax-10 2005  ax-11 2020  ax-12 2033  ax-13 2233  ax-ext 2589  ax-rep 4693  ax-sep 4703  ax-nul 4712  ax-pow 4764  ax-pr 4828  ax-un 6824  ax-cnex 9848  ax-resscn 9849  ax-1cn 9850  ax-icn 9851  ax-addcl 9852  ax-addrcl 9853  ax-mulcl 9854  ax-mulrcl 9855  ax-mulcom 9856  ax-addass 9857  ax-mulass 9858  ax-distr 9859  ax-i2m1 9860  ax-1ne0 9861  ax-1rid 9862  ax-rnegex 9863  ax-rrecex 9864  ax-cnre 9865  ax-pre-lttri 9866  ax-pre-lttrn 9867  ax-pre-ltadd 9868  ax-pre-mulgt0 9869  ax-pre-sup 9870
This theorem depends on definitions:  df-bi 195  df-or 383  df-an 384  df-3or 1031  df-3an 1032  df-tru 1477  df-ex 1695  df-nf 1700  df-sb 1867  df-eu 2461  df-mo 2462  df-clab 2596  df-cleq 2602  df-clel 2605  df-nfc 2739  df-ne 2781  df-nel 2782  df-ral 2900  df-rex 2901  df-reu 2902  df-rmo 2903  df-rab 2904  df-v 3174  df-sbc 3402  df-csb 3499  df-dif 3542  df-un 3544  df-in 3546  df-ss 3553  df-pss 3555  df-nul 3874  df-if 4036  df-pw 4109  df-sn 4125  df-pr 4127  df-tp 4129  df-op 4131  df-uni 4367  df-int 4405  df-iun 4451  df-br 4578  df-opab 4638  df-mpt 4639  df-tr 4675  df-eprel 4939  df-id 4943  df-po 4949  df-so 4950  df-fr 4987  df-we 4989  df-xp 5034  df-rel 5035  df-cnv 5036  df-co 5037  df-dm 5038  df-rn 5039  df-res 5040  df-ima 5041  df-pred 5583  df-ord 5629  df-on 5630  df-lim 5631  df-suc 5632  df-iota 5754  df-fun 5792  df-fn 5793  df-f 5794  df-f1 5795  df-fo 5796  df-f1o 5797  df-fv 5798  df-riota 6489  df-ov 6530  df-oprab 6531  df-mpt2 6532  df-om 6935  df-1st 7036  df-2nd 7037  df-wrecs 7271  df-recs 7332  df-rdg 7370  df-1o 7424  df-2o 7425  df-oadd 7428  df-er 7606  df-map 7723  df-en 7819  df-dom 7820  df-sdom 7821  df-fin 7822  df-sup 8208  df-inf 8209  df-card 8625  df-cda 8850  df-pnf 9932  df-mnf 9933  df-xr 9934  df-ltxr 9935  df-le 9936  df-sub 10119  df-neg 10120  df-div 10534  df-nn 10868  df-2 10926  df-3 10927  df-4 10928  df-5 10929  df-6 10930  df-7 10931  df-8 10932  df-9 10933  df-n0 11140  df-z 11211  df-uz 11520  df-q 11621  df-rp 11665  df-fz 12153  df-fzo 12290  df-fl 12410  df-mod 12486  df-seq 12619  df-exp 12678  df-hash 12935  df-cj 13633  df-re 13634  df-im 13635  df-sqrt 13769  df-abs 13770  df-dvds 14768  df-gcd 15001  df-prm 15170  df-phi 15255  df-pc 15326  df-lgs 24737
This theorem is referenced by: (None)
  Copyright terms: Public domain W3C validator