Users' Mathboxes Mathbox for Stefan O'Rear < Previous   Next >
Nearby theorems
Mirrors  >  Home  >  MPE Home  >  Th. List  >   Mathboxes  >  idomodle Structured version   Visualization version   GIF version

Theorem idomodle 41566
Description: Limit on the number of 𝑁-th roots of unity in an integral domain. (Contributed by Stefan O'Rear, 12-Sep-2015.)
Hypotheses
Ref Expression
idomodle.g 𝐺 = ((mulGrpβ€˜π‘…) β†Ύs (Unitβ€˜π‘…))
idomodle.b 𝐡 = (Baseβ€˜πΊ)
idomodle.o 𝑂 = (odβ€˜πΊ)
Assertion
Ref Expression
idomodle ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ≀ 𝑁)
Distinct variable groups:   π‘₯,𝐡   π‘₯,𝑁   π‘₯,𝑅
Allowed substitution hints:   𝐺(π‘₯)   𝑂(π‘₯)

Proof of Theorem idomodle
StepHypRef Expression
1 idomodle.b . . . . 5 𝐡 = (Baseβ€˜πΊ)
21fvexi 6857 . . . 4 𝐡 ∈ V
32rabex 5290 . . 3 {π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁} ∈ V
4 hashxrcl 14263 . . 3 ({π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁} ∈ V β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ∈ ℝ*)
53, 4mp1i 13 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ∈ ℝ*)
6 fvex 6856 . . . 4 (Baseβ€˜π‘…) ∈ V
76rabex 5290 . . 3 {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} ∈ V
8 hashxrcl 14263 . . 3 ({π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} ∈ V β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ∈ ℝ*)
97, 8mp1i 13 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ∈ ℝ*)
10 nnre 12165 . . . 4 (𝑁 ∈ β„• β†’ 𝑁 ∈ ℝ)
1110rexrd 11210 . . 3 (𝑁 ∈ β„• β†’ 𝑁 ∈ ℝ*)
1211adantl 483 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑁 ∈ ℝ*)
13 isidom 20790 . . . . . . . . . . . 12 (𝑅 ∈ IDomn ↔ (𝑅 ∈ CRing ∧ 𝑅 ∈ Domn))
1413simplbi 499 . . . . . . . . . . 11 (𝑅 ∈ IDomn β†’ 𝑅 ∈ CRing)
1514adantr 482 . . . . . . . . . 10 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑅 ∈ CRing)
16 crngring 19981 . . . . . . . . . 10 (𝑅 ∈ CRing β†’ 𝑅 ∈ Ring)
1715, 16syl 17 . . . . . . . . 9 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑅 ∈ Ring)
1817adantr 482 . . . . . . . 8 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ 𝑅 ∈ Ring)
19 eqid 2733 . . . . . . . . 9 (Unitβ€˜π‘…) = (Unitβ€˜π‘…)
20 idomodle.g . . . . . . . . 9 𝐺 = ((mulGrpβ€˜π‘…) β†Ύs (Unitβ€˜π‘…))
2119, 20unitgrp 20101 . . . . . . . 8 (𝑅 ∈ Ring β†’ 𝐺 ∈ Grp)
2218, 21syl 17 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ 𝐺 ∈ Grp)
23 simpr 486 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ π‘₯ ∈ 𝐡)
24 nnz 12525 . . . . . . . 8 (𝑁 ∈ β„• β†’ 𝑁 ∈ β„€)
2524ad2antlr 726 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ 𝑁 ∈ β„€)
26 idomodle.o . . . . . . . 8 𝑂 = (odβ€˜πΊ)
27 eqid 2733 . . . . . . . 8 (.gβ€˜πΊ) = (.gβ€˜πΊ)
28 eqid 2733 . . . . . . . 8 (0gβ€˜πΊ) = (0gβ€˜πΊ)
291, 26, 27, 28oddvds 19334 . . . . . . 7 ((𝐺 ∈ Grp ∧ π‘₯ ∈ 𝐡 ∧ 𝑁 ∈ β„€) β†’ ((π‘‚β€˜π‘₯) βˆ₯ 𝑁 ↔ (𝑁(.gβ€˜πΊ)π‘₯) = (0gβ€˜πΊ)))
3022, 23, 25, 29syl3anc 1372 . . . . . 6 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ ((π‘‚β€˜π‘₯) βˆ₯ 𝑁 ↔ (𝑁(.gβ€˜πΊ)π‘₯) = (0gβ€˜πΊ)))
31 eqid 2733 . . . . . . . . . 10 (mulGrpβ€˜π‘…) = (mulGrpβ€˜π‘…)
3219, 31unitsubm 20104 . . . . . . . . 9 (𝑅 ∈ Ring β†’ (Unitβ€˜π‘…) ∈ (SubMndβ€˜(mulGrpβ€˜π‘…)))
3318, 32syl 17 . . . . . . . 8 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ (Unitβ€˜π‘…) ∈ (SubMndβ€˜(mulGrpβ€˜π‘…)))
34 nnnn0 12425 . . . . . . . . 9 (𝑁 ∈ β„• β†’ 𝑁 ∈ β„•0)
3534ad2antlr 726 . . . . . . . 8 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ 𝑁 ∈ β„•0)
3619, 20unitgrpbas 20100 . . . . . . . . . 10 (Unitβ€˜π‘…) = (Baseβ€˜πΊ)
371, 36eqtr4i 2764 . . . . . . . . 9 𝐡 = (Unitβ€˜π‘…)
3823, 37eleqtrdi 2844 . . . . . . . 8 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ π‘₯ ∈ (Unitβ€˜π‘…))
39 eqid 2733 . . . . . . . . 9 (.gβ€˜(mulGrpβ€˜π‘…)) = (.gβ€˜(mulGrpβ€˜π‘…))
4039, 20, 27submmulg 18925 . . . . . . . 8 (((Unitβ€˜π‘…) ∈ (SubMndβ€˜(mulGrpβ€˜π‘…)) ∧ 𝑁 ∈ β„•0 ∧ π‘₯ ∈ (Unitβ€˜π‘…)) β†’ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (𝑁(.gβ€˜πΊ)π‘₯))
4133, 35, 38, 40syl3anc 1372 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (𝑁(.gβ€˜πΊ)π‘₯))
42 eqid 2733 . . . . . . . . 9 (1rβ€˜π‘…) = (1rβ€˜π‘…)
4319, 20, 42unitgrpid 20103 . . . . . . . 8 (𝑅 ∈ Ring β†’ (1rβ€˜π‘…) = (0gβ€˜πΊ))
4418, 43syl 17 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ (1rβ€˜π‘…) = (0gβ€˜πΊ))
4541, 44eqeq12d 2749 . . . . . 6 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ ((𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…) ↔ (𝑁(.gβ€˜πΊ)π‘₯) = (0gβ€˜πΊ)))
4630, 45bitr4d 282 . . . . 5 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ ((π‘‚β€˜π‘₯) βˆ₯ 𝑁 ↔ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)))
4746rabbidva 3413 . . . 4 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ {π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁} = {π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)})
4847fveq2d 6847 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) = (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}))
49 eqid 2733 . . . . . . 7 (Baseβ€˜π‘…) = (Baseβ€˜π‘…)
5049, 37unitss 20094 . . . . . 6 𝐡 βŠ† (Baseβ€˜π‘…)
51 rabss2 4036 . . . . . 6 (𝐡 βŠ† (Baseβ€˜π‘…) β†’ {π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} βŠ† {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)})
5250, 51mp1i 13 . . . . 5 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ {π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} βŠ† {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)})
53 ssdomg 8943 . . . . 5 ({π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} ∈ V β†’ ({π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} βŠ† {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} β†’ {π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} β‰Ό {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}))
547, 52, 53mpsyl 68 . . . 4 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ {π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} β‰Ό {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)})
55 hashdomi 14286 . . . 4 ({π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} β‰Ό {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ≀ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}))
5654, 55syl 17 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ≀ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}))
5748, 56eqbrtrd 5128 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ≀ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}))
58 simpl 484 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑅 ∈ IDomn)
5949, 42ringidcl 19994 . . . 4 (𝑅 ∈ Ring β†’ (1rβ€˜π‘…) ∈ (Baseβ€˜π‘…))
6017, 59syl 17 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (1rβ€˜π‘…) ∈ (Baseβ€˜π‘…))
61 simpr 486 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑁 ∈ β„•)
6249, 39idomrootle 41565 . . 3 ((𝑅 ∈ IDomn ∧ (1rβ€˜π‘…) ∈ (Baseβ€˜π‘…) ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ≀ 𝑁)
6358, 60, 61, 62syl3anc 1372 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ≀ 𝑁)
645, 9, 12, 57, 63xrletrd 13087 1 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ≀ 𝑁)
Colors of variables: wff setvar class
Syntax hints:   β†’ wi 4   ↔ wb 205   ∧ wa 397   = wceq 1542   ∈ wcel 2107  {crab 3406  Vcvv 3444   βŠ† wss 3911   class class class wbr 5106  β€˜cfv 6497  (class class class)co 7358   β‰Ό cdom 8884  β„*cxr 11193   ≀ cle 11195  β„•cn 12158  β„•0cn0 12418  β„€cz 12504  β™―chash 14236   βˆ₯ cdvds 16141  Basecbs 17088   β†Ύs cress 17117  0gc0g 17326  SubMndcsubmnd 18605  Grpcgrp 18753  .gcmg 18877  odcod 19311  mulGrpcmgp 19901  1rcur 19918  Ringcrg 19969  CRingccrg 19970  Unitcui 20073  Domncdomn 20766  IDomncidom 20767
This theorem was proved from axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-3 8  ax-gen 1798  ax-4 1812  ax-5 1914  ax-6 1972  ax-7 2012  ax-8 2109  ax-9 2117  ax-10 2138  ax-11 2155  ax-12 2172  ax-ext 2704  ax-rep 5243  ax-sep 5257  ax-nul 5264  ax-pow 5321  ax-pr 5385  ax-un 7673  ax-cnex 11112  ax-resscn 11113  ax-1cn 11114  ax-icn 11115  ax-addcl 11116  ax-addrcl 11117  ax-mulcl 11118  ax-mulrcl 11119  ax-mulcom 11120  ax-addass 11121  ax-mulass 11122  ax-distr 11123  ax-i2m1 11124  ax-1ne0 11125  ax-1rid 11126  ax-rnegex 11127  ax-rrecex 11128  ax-cnre 11129  ax-pre-lttri 11130  ax-pre-lttrn 11131  ax-pre-ltadd 11132  ax-pre-mulgt0 11133  ax-pre-sup 11134  ax-addf 11135  ax-mulf 11136
This theorem depends on definitions:  df-bi 206  df-an 398  df-or 847  df-3or 1089  df-3an 1090  df-tru 1545  df-fal 1555  df-ex 1783  df-nf 1787  df-sb 2069  df-mo 2535  df-eu 2564  df-clab 2711  df-cleq 2725  df-clel 2811  df-nfc 2886  df-ne 2941  df-nel 3047  df-ral 3062  df-rex 3071  df-rmo 3352  df-reu 3353  df-rab 3407  df-v 3446  df-sbc 3741  df-csb 3857  df-dif 3914  df-un 3916  df-in 3918  df-ss 3928  df-pss 3930  df-nul 4284  df-if 4488  df-pw 4563  df-sn 4588  df-pr 4590  df-tp 4592  df-op 4594  df-uni 4867  df-int 4909  df-iun 4957  df-iin 4958  df-br 5107  df-opab 5169  df-mpt 5190  df-tr 5224  df-id 5532  df-eprel 5538  df-po 5546  df-so 5547  df-fr 5589  df-se 5590  df-we 5591  df-xp 5640  df-rel 5641  df-cnv 5642  df-co 5643  df-dm 5644  df-rn 5645  df-res 5646  df-ima 5647  df-pred 6254  df-ord 6321  df-on 6322  df-lim 6323  df-suc 6324  df-iota 6449  df-fun 6499  df-fn 6500  df-f 6501  df-f1 6502  df-fo 6503  df-f1o 6504  df-fv 6505  df-isom 6506  df-riota 7314  df-ov 7361  df-oprab 7362  df-mpo 7363  df-of 7618  df-ofr 7619  df-om 7804  df-1st 7922  df-2nd 7923  df-supp 8094  df-tpos 8158  df-frecs 8213  df-wrecs 8244  df-recs 8318  df-rdg 8357  df-1o 8413  df-oadd 8417  df-er 8651  df-map 8770  df-pm 8771  df-ixp 8839  df-en 8887  df-dom 8888  df-sdom 8889  df-fin 8890  df-fsupp 9309  df-sup 9383  df-inf 9384  df-oi 9451  df-dju 9842  df-card 9880  df-pnf 11196  df-mnf 11197  df-xr 11198  df-ltxr 11199  df-le 11200  df-sub 11392  df-neg 11393  df-div 11818  df-nn 12159  df-2 12221  df-3 12222  df-4 12223  df-5 12224  df-6 12225  df-7 12226  df-8 12227  df-9 12228  df-n0 12419  df-xnn0 12491  df-z 12505  df-dec 12624  df-uz 12769  df-rp 12921  df-fz 13431  df-fzo 13574  df-fl 13703  df-mod 13781  df-seq 13913  df-exp 13974  df-hash 14237  df-cj 14990  df-re 14991  df-im 14992  df-sqrt 15126  df-abs 15127  df-dvds 16142  df-struct 17024  df-sets 17041  df-slot 17059  df-ndx 17071  df-base 17089  df-ress 17118  df-plusg 17151  df-mulr 17152  df-starv 17153  df-sca 17154  df-vsca 17155  df-ip 17156  df-tset 17157  df-ple 17158  df-ds 17160  df-unif 17161  df-hom 17162  df-cco 17163  df-0g 17328  df-gsum 17329  df-prds 17334  df-pws 17336  df-mre 17471  df-mrc 17472  df-acs 17474  df-mgm 18502  df-sgrp 18551  df-mnd 18562  df-mhm 18606  df-submnd 18607  df-grp 18756  df-minusg 18757  df-sbg 18758  df-mulg 18878  df-subg 18930  df-ghm 19011  df-cntz 19102  df-od 19315  df-cmn 19569  df-abl 19570  df-mgp 19902  df-ur 19919  df-srg 19923  df-ring 19971  df-cring 19972  df-oppr 20054  df-dvdsr 20075  df-unit 20076  df-invr 20106  df-rnghom 20153  df-subrg 20234  df-lmod 20338  df-lss 20408  df-lsp 20448  df-nzr 20744  df-rlreg 20769  df-domn 20770  df-idom 20771  df-cnfld 20813  df-assa 21275  df-asp 21276  df-ascl 21277  df-psr 21327  df-mvr 21328  df-mpl 21329  df-opsr 21331  df-evls 21498  df-evl 21499  df-psr1 21567  df-vr1 21568  df-ply1 21569  df-coe1 21570  df-evl1 21698  df-mdeg 25433  df-deg1 25434  df-mon1 25511  df-uc1p 25512  df-q1p 25513  df-r1p 25514
This theorem is referenced by:  idomsubgmo  41568
  Copyright terms: Public domain W3C validator