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 41923
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 6902 . . . 4 𝐡 ∈ V
32rabex 5331 . . 3 {π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁} ∈ V
4 hashxrcl 14313 . . 3 ({π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁} ∈ V β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ∈ ℝ*)
53, 4mp1i 13 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ∈ ℝ*)
6 fvex 6901 . . . 4 (Baseβ€˜π‘…) ∈ V
76rabex 5331 . . 3 {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} ∈ V
8 hashxrcl 14313 . . 3 ({π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} ∈ V β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ∈ ℝ*)
97, 8mp1i 13 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ∈ ℝ*)
10 nnre 12215 . . . 4 (𝑁 ∈ β„• β†’ 𝑁 ∈ ℝ)
1110rexrd 11260 . . 3 (𝑁 ∈ β„• β†’ 𝑁 ∈ ℝ*)
1211adantl 482 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑁 ∈ ℝ*)
13 isidom 20914 . . . . . . . . . . . 12 (𝑅 ∈ IDomn ↔ (𝑅 ∈ CRing ∧ 𝑅 ∈ Domn))
1413simplbi 498 . . . . . . . . . . 11 (𝑅 ∈ IDomn β†’ 𝑅 ∈ CRing)
1514adantr 481 . . . . . . . . . 10 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑅 ∈ CRing)
16 crngring 20061 . . . . . . . . . 10 (𝑅 ∈ CRing β†’ 𝑅 ∈ Ring)
1715, 16syl 17 . . . . . . . . 9 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑅 ∈ Ring)
1817adantr 481 . . . . . . . 8 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ 𝑅 ∈ Ring)
19 eqid 2732 . . . . . . . . 9 (Unitβ€˜π‘…) = (Unitβ€˜π‘…)
20 idomodle.g . . . . . . . . 9 𝐺 = ((mulGrpβ€˜π‘…) β†Ύs (Unitβ€˜π‘…))
2119, 20unitgrp 20189 . . . . . . . 8 (𝑅 ∈ Ring β†’ 𝐺 ∈ Grp)
2218, 21syl 17 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ 𝐺 ∈ Grp)
23 simpr 485 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ π‘₯ ∈ 𝐡)
24 nnz 12575 . . . . . . . 8 (𝑁 ∈ β„• β†’ 𝑁 ∈ β„€)
2524ad2antlr 725 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ 𝑁 ∈ β„€)
26 idomodle.o . . . . . . . 8 𝑂 = (odβ€˜πΊ)
27 eqid 2732 . . . . . . . 8 (.gβ€˜πΊ) = (.gβ€˜πΊ)
28 eqid 2732 . . . . . . . 8 (0gβ€˜πΊ) = (0gβ€˜πΊ)
291, 26, 27, 28oddvds 19409 . . . . . . 7 ((𝐺 ∈ Grp ∧ π‘₯ ∈ 𝐡 ∧ 𝑁 ∈ β„€) β†’ ((π‘‚β€˜π‘₯) βˆ₯ 𝑁 ↔ (𝑁(.gβ€˜πΊ)π‘₯) = (0gβ€˜πΊ)))
3022, 23, 25, 29syl3anc 1371 . . . . . 6 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ ((π‘‚β€˜π‘₯) βˆ₯ 𝑁 ↔ (𝑁(.gβ€˜πΊ)π‘₯) = (0gβ€˜πΊ)))
31 eqid 2732 . . . . . . . . . 10 (mulGrpβ€˜π‘…) = (mulGrpβ€˜π‘…)
3219, 31unitsubm 20192 . . . . . . . . 9 (𝑅 ∈ Ring β†’ (Unitβ€˜π‘…) ∈ (SubMndβ€˜(mulGrpβ€˜π‘…)))
3318, 32syl 17 . . . . . . . 8 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ (Unitβ€˜π‘…) ∈ (SubMndβ€˜(mulGrpβ€˜π‘…)))
34 nnnn0 12475 . . . . . . . . 9 (𝑁 ∈ β„• β†’ 𝑁 ∈ β„•0)
3534ad2antlr 725 . . . . . . . 8 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ 𝑁 ∈ β„•0)
3619, 20unitgrpbas 20188 . . . . . . . . . 10 (Unitβ€˜π‘…) = (Baseβ€˜πΊ)
371, 36eqtr4i 2763 . . . . . . . . 9 𝐡 = (Unitβ€˜π‘…)
3823, 37eleqtrdi 2843 . . . . . . . 8 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ π‘₯ ∈ (Unitβ€˜π‘…))
39 eqid 2732 . . . . . . . . 9 (.gβ€˜(mulGrpβ€˜π‘…)) = (.gβ€˜(mulGrpβ€˜π‘…))
4039, 20, 27submmulg 18992 . . . . . . . 8 (((Unitβ€˜π‘…) ∈ (SubMndβ€˜(mulGrpβ€˜π‘…)) ∧ 𝑁 ∈ β„•0 ∧ π‘₯ ∈ (Unitβ€˜π‘…)) β†’ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (𝑁(.gβ€˜πΊ)π‘₯))
4133, 35, 38, 40syl3anc 1371 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (𝑁(.gβ€˜πΊ)π‘₯))
42 eqid 2732 . . . . . . . . 9 (1rβ€˜π‘…) = (1rβ€˜π‘…)
4319, 20, 42unitgrpid 20191 . . . . . . . 8 (𝑅 ∈ Ring β†’ (1rβ€˜π‘…) = (0gβ€˜πΊ))
4418, 43syl 17 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ (1rβ€˜π‘…) = (0gβ€˜πΊ))
4541, 44eqeq12d 2748 . . . . . 6 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ ((𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…) ↔ (𝑁(.gβ€˜πΊ)π‘₯) = (0gβ€˜πΊ)))
4630, 45bitr4d 281 . . . . 5 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ ((π‘‚β€˜π‘₯) βˆ₯ 𝑁 ↔ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)))
4746rabbidva 3439 . . . 4 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ {π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁} = {π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)})
4847fveq2d 6892 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) = (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}))
49 eqid 2732 . . . . . . 7 (Baseβ€˜π‘…) = (Baseβ€˜π‘…)
5049, 37unitss 20182 . . . . . 6 𝐡 βŠ† (Baseβ€˜π‘…)
51 rabss2 4074 . . . . . 6 (𝐡 βŠ† (Baseβ€˜π‘…) β†’ {π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} βŠ† {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)})
5250, 51mp1i 13 . . . . 5 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ {π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} βŠ† {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)})
53 ssdomg 8992 . . . . 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 14336 . . . 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 5169 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ≀ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}))
58 simpl 483 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑅 ∈ IDomn)
5949, 42ringidcl 20076 . . . 4 (𝑅 ∈ Ring β†’ (1rβ€˜π‘…) ∈ (Baseβ€˜π‘…))
6017, 59syl 17 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (1rβ€˜π‘…) ∈ (Baseβ€˜π‘…))
61 simpr 485 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑁 ∈ β„•)
6249, 39idomrootle 41922 . . 3 ((𝑅 ∈ IDomn ∧ (1rβ€˜π‘…) ∈ (Baseβ€˜π‘…) ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ≀ 𝑁)
6358, 60, 61, 62syl3anc 1371 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ≀ 𝑁)
645, 9, 12, 57, 63xrletrd 13137 1 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ≀ 𝑁)
Colors of variables: wff setvar class
Syntax hints:   β†’ wi 4   ↔ wb 205   ∧ wa 396   = wceq 1541   ∈ wcel 2106  {crab 3432  Vcvv 3474   βŠ† wss 3947   class class class wbr 5147  β€˜cfv 6540  (class class class)co 7405   β‰Ό cdom 8933  β„*cxr 11243   ≀ cle 11245  β„•cn 12208  β„•0cn0 12468  β„€cz 12554  β™―chash 14286   βˆ₯ cdvds 16193  Basecbs 17140   β†Ύs cress 17169  0gc0g 17381  SubMndcsubmnd 18666  Grpcgrp 18815  .gcmg 18944  odcod 19386  mulGrpcmgp 19981  1rcur 19998  Ringcrg 20049  CRingccrg 20050  Unitcui 20161  Domncdomn 20888  IDomncidom 20889
This theorem was proved from axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-3 8  ax-gen 1797  ax-4 1811  ax-5 1913  ax-6 1971  ax-7 2011  ax-8 2108  ax-9 2116  ax-10 2137  ax-11 2154  ax-12 2171  ax-ext 2703  ax-rep 5284  ax-sep 5298  ax-nul 5305  ax-pow 5362  ax-pr 5426  ax-un 7721  ax-cnex 11162  ax-resscn 11163  ax-1cn 11164  ax-icn 11165  ax-addcl 11166  ax-addrcl 11167  ax-mulcl 11168  ax-mulrcl 11169  ax-mulcom 11170  ax-addass 11171  ax-mulass 11172  ax-distr 11173  ax-i2m1 11174  ax-1ne0 11175  ax-1rid 11176  ax-rnegex 11177  ax-rrecex 11178  ax-cnre 11179  ax-pre-lttri 11180  ax-pre-lttrn 11181  ax-pre-ltadd 11182  ax-pre-mulgt0 11183  ax-pre-sup 11184  ax-addf 11185  ax-mulf 11186
This theorem depends on definitions:  df-bi 206  df-an 397  df-or 846  df-3or 1088  df-3an 1089  df-tru 1544  df-fal 1554  df-ex 1782  df-nf 1786  df-sb 2068  df-mo 2534  df-eu 2563  df-clab 2710  df-cleq 2724  df-clel 2810  df-nfc 2885  df-ne 2941  df-nel 3047  df-ral 3062  df-rex 3071  df-rmo 3376  df-reu 3377  df-rab 3433  df-v 3476  df-sbc 3777  df-csb 3893  df-dif 3950  df-un 3952  df-in 3954  df-ss 3964  df-pss 3966  df-nul 4322  df-if 4528  df-pw 4603  df-sn 4628  df-pr 4630  df-tp 4632  df-op 4634  df-uni 4908  df-int 4950  df-iun 4998  df-iin 4999  df-br 5148  df-opab 5210  df-mpt 5231  df-tr 5265  df-id 5573  df-eprel 5579  df-po 5587  df-so 5588  df-fr 5630  df-se 5631  df-we 5632  df-xp 5681  df-rel 5682  df-cnv 5683  df-co 5684  df-dm 5685  df-rn 5686  df-res 5687  df-ima 5688  df-pred 6297  df-ord 6364  df-on 6365  df-lim 6366  df-suc 6367  df-iota 6492  df-fun 6542  df-fn 6543  df-f 6544  df-f1 6545  df-fo 6546  df-f1o 6547  df-fv 6548  df-isom 6549  df-riota 7361  df-ov 7408  df-oprab 7409  df-mpo 7410  df-of 7666  df-ofr 7667  df-om 7852  df-1st 7971  df-2nd 7972  df-supp 8143  df-tpos 8207  df-frecs 8262  df-wrecs 8293  df-recs 8367  df-rdg 8406  df-1o 8462  df-oadd 8466  df-er 8699  df-map 8818  df-pm 8819  df-ixp 8888  df-en 8936  df-dom 8937  df-sdom 8938  df-fin 8939  df-fsupp 9358  df-sup 9433  df-inf 9434  df-oi 9501  df-dju 9892  df-card 9930  df-pnf 11246  df-mnf 11247  df-xr 11248  df-ltxr 11249  df-le 11250  df-sub 11442  df-neg 11443  df-div 11868  df-nn 12209  df-2 12271  df-3 12272  df-4 12273  df-5 12274  df-6 12275  df-7 12276  df-8 12277  df-9 12278  df-n0 12469  df-xnn0 12541  df-z 12555  df-dec 12674  df-uz 12819  df-rp 12971  df-fz 13481  df-fzo 13624  df-fl 13753  df-mod 13831  df-seq 13963  df-exp 14024  df-hash 14287  df-cj 15042  df-re 15043  df-im 15044  df-sqrt 15178  df-abs 15179  df-dvds 16194  df-struct 17076  df-sets 17093  df-slot 17111  df-ndx 17123  df-base 17141  df-ress 17170  df-plusg 17206  df-mulr 17207  df-starv 17208  df-sca 17209  df-vsca 17210  df-ip 17211  df-tset 17212  df-ple 17213  df-ds 17215  df-unif 17216  df-hom 17217  df-cco 17218  df-0g 17383  df-gsum 17384  df-prds 17389  df-pws 17391  df-mre 17526  df-mrc 17527  df-acs 17529  df-mgm 18557  df-sgrp 18606  df-mnd 18622  df-mhm 18667  df-submnd 18668  df-grp 18818  df-minusg 18819  df-sbg 18820  df-mulg 18945  df-subg 18997  df-ghm 19084  df-cntz 19175  df-od 19390  df-cmn 19644  df-abl 19645  df-mgp 19982  df-ur 19999  df-srg 20003  df-ring 20051  df-cring 20052  df-oppr 20142  df-dvdsr 20163  df-unit 20164  df-invr 20194  df-rnghom 20243  df-nzr 20284  df-subrg 20353  df-lmod 20465  df-lss 20535  df-lsp 20575  df-rlreg 20891  df-domn 20892  df-idom 20893  df-cnfld 20937  df-assa 21399  df-asp 21400  df-ascl 21401  df-psr 21453  df-mvr 21454  df-mpl 21455  df-opsr 21457  df-evls 21626  df-evl 21627  df-psr1 21695  df-vr1 21696  df-ply1 21697  df-coe1 21698  df-evl1 21826  df-mdeg 25561  df-deg1 25562  df-mon1 25639  df-uc1p 25640  df-q1p 25641  df-r1p 25642
This theorem is referenced by:  idomsubgmo  41925
  Copyright terms: Public domain W3C validator