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 42020
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 6905 . . . 4 𝐡 ∈ V
32rabex 5332 . . 3 {π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁} ∈ V
4 hashxrcl 14319 . . 3 ({π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁} ∈ V β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ∈ ℝ*)
53, 4mp1i 13 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ∈ ℝ*)
6 fvex 6904 . . . 4 (Baseβ€˜π‘…) ∈ V
76rabex 5332 . . 3 {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} ∈ V
8 hashxrcl 14319 . . 3 ({π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} ∈ V β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ∈ ℝ*)
97, 8mp1i 13 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ∈ ℝ*)
10 nnre 12221 . . . 4 (𝑁 ∈ β„• β†’ 𝑁 ∈ ℝ)
1110rexrd 11266 . . 3 (𝑁 ∈ β„• β†’ 𝑁 ∈ ℝ*)
1211adantl 482 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑁 ∈ ℝ*)
13 isidom 20928 . . . . . . . . . . . 12 (𝑅 ∈ IDomn ↔ (𝑅 ∈ CRing ∧ 𝑅 ∈ Domn))
1413simplbi 498 . . . . . . . . . . 11 (𝑅 ∈ IDomn β†’ 𝑅 ∈ CRing)
1514adantr 481 . . . . . . . . . 10 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑅 ∈ CRing)
16 crngring 20070 . . . . . . . . . 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 20201 . . . . . . . 8 (𝑅 ∈ Ring β†’ 𝐺 ∈ Grp)
2218, 21syl 17 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ 𝐺 ∈ Grp)
23 simpr 485 . . . . . . 7 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ π‘₯ ∈ 𝐡)
24 nnz 12581 . . . . . . . 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 19417 . . . . . . 7 ((𝐺 ∈ Grp ∧ π‘₯ ∈ 𝐡 ∧ 𝑁 ∈ β„€) β†’ ((π‘‚β€˜π‘₯) βˆ₯ 𝑁 ↔ (𝑁(.gβ€˜πΊ)π‘₯) = (0gβ€˜πΊ)))
3022, 23, 25, 29syl3anc 1371 . . . . . 6 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ ((π‘‚β€˜π‘₯) βˆ₯ 𝑁 ↔ (𝑁(.gβ€˜πΊ)π‘₯) = (0gβ€˜πΊ)))
31 eqid 2732 . . . . . . . . . 10 (mulGrpβ€˜π‘…) = (mulGrpβ€˜π‘…)
3219, 31unitsubm 20204 . . . . . . . . 9 (𝑅 ∈ Ring β†’ (Unitβ€˜π‘…) ∈ (SubMndβ€˜(mulGrpβ€˜π‘…)))
3318, 32syl 17 . . . . . . . 8 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ (Unitβ€˜π‘…) ∈ (SubMndβ€˜(mulGrpβ€˜π‘…)))
34 nnnn0 12481 . . . . . . . . 9 (𝑁 ∈ β„• β†’ 𝑁 ∈ β„•0)
3534ad2antlr 725 . . . . . . . 8 (((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) ∧ π‘₯ ∈ 𝐡) β†’ 𝑁 ∈ β„•0)
3619, 20unitgrpbas 20200 . . . . . . . . . 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 19000 . . . . . . . 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 20203 . . . . . . . 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 6895 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) = (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}))
49 eqid 2732 . . . . . . 7 (Baseβ€˜π‘…) = (Baseβ€˜π‘…)
5049, 37unitss 20194 . . . . . 6 𝐡 βŠ† (Baseβ€˜π‘…)
51 rabss2 4075 . . . . . 6 (𝐡 βŠ† (Baseβ€˜π‘…) β†’ {π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} βŠ† {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)})
5250, 51mp1i 13 . . . . 5 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ {π‘₯ ∈ 𝐡 ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)} βŠ† {π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)})
53 ssdomg 8998 . . . . 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 14342 . . . 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 5170 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ 𝐡 ∣ (π‘‚β€˜π‘₯) βˆ₯ 𝑁}) ≀ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}))
58 simpl 483 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑅 ∈ IDomn)
5949, 42ringidcl 20085 . . . 4 (𝑅 ∈ Ring β†’ (1rβ€˜π‘…) ∈ (Baseβ€˜π‘…))
6017, 59syl 17 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (1rβ€˜π‘…) ∈ (Baseβ€˜π‘…))
61 simpr 485 . . 3 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ 𝑁 ∈ β„•)
6249, 39idomrootle 42019 . . 3 ((𝑅 ∈ IDomn ∧ (1rβ€˜π‘…) ∈ (Baseβ€˜π‘…) ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ≀ 𝑁)
6358, 60, 61, 62syl3anc 1371 . 2 ((𝑅 ∈ IDomn ∧ 𝑁 ∈ β„•) β†’ (β™―β€˜{π‘₯ ∈ (Baseβ€˜π‘…) ∣ (𝑁(.gβ€˜(mulGrpβ€˜π‘…))π‘₯) = (1rβ€˜π‘…)}) ≀ 𝑁)
645, 9, 12, 57, 63xrletrd 13143 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 3948   class class class wbr 5148  β€˜cfv 6543  (class class class)co 7411   β‰Ό cdom 8939  β„*cxr 11249   ≀ cle 11251  β„•cn 12214  β„•0cn0 12474  β„€cz 12560  β™―chash 14292   βˆ₯ cdvds 16199  Basecbs 17146   β†Ύs cress 17175  0gc0g 17387  SubMndcsubmnd 18672  Grpcgrp 18821  .gcmg 18952  odcod 19394  mulGrpcmgp 19989  1rcur 20006  Ringcrg 20058  CRingccrg 20059  Unitcui 20173  Domncdomn 20902  IDomncidom 20903
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 5285  ax-sep 5299  ax-nul 5306  ax-pow 5363  ax-pr 5427  ax-un 7727  ax-cnex 11168  ax-resscn 11169  ax-1cn 11170  ax-icn 11171  ax-addcl 11172  ax-addrcl 11173  ax-mulcl 11174  ax-mulrcl 11175  ax-mulcom 11176  ax-addass 11177  ax-mulass 11178  ax-distr 11179  ax-i2m1 11180  ax-1ne0 11181  ax-1rid 11182  ax-rnegex 11183  ax-rrecex 11184  ax-cnre 11185  ax-pre-lttri 11186  ax-pre-lttrn 11187  ax-pre-ltadd 11188  ax-pre-mulgt0 11189  ax-pre-sup 11190  ax-addf 11191  ax-mulf 11192
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 3778  df-csb 3894  df-dif 3951  df-un 3953  df-in 3955  df-ss 3965  df-pss 3967  df-nul 4323  df-if 4529  df-pw 4604  df-sn 4629  df-pr 4631  df-tp 4633  df-op 4635  df-uni 4909  df-int 4951  df-iun 4999  df-iin 5000  df-br 5149  df-opab 5211  df-mpt 5232  df-tr 5266  df-id 5574  df-eprel 5580  df-po 5588  df-so 5589  df-fr 5631  df-se 5632  df-we 5633  df-xp 5682  df-rel 5683  df-cnv 5684  df-co 5685  df-dm 5686  df-rn 5687  df-res 5688  df-ima 5689  df-pred 6300  df-ord 6367  df-on 6368  df-lim 6369  df-suc 6370  df-iota 6495  df-fun 6545  df-fn 6546  df-f 6547  df-f1 6548  df-fo 6549  df-f1o 6550  df-fv 6551  df-isom 6552  df-riota 7367  df-ov 7414  df-oprab 7415  df-mpo 7416  df-of 7672  df-ofr 7673  df-om 7858  df-1st 7977  df-2nd 7978  df-supp 8149  df-tpos 8213  df-frecs 8268  df-wrecs 8299  df-recs 8373  df-rdg 8412  df-1o 8468  df-oadd 8472  df-er 8705  df-map 8824  df-pm 8825  df-ixp 8894  df-en 8942  df-dom 8943  df-sdom 8944  df-fin 8945  df-fsupp 9364  df-sup 9439  df-inf 9440  df-oi 9507  df-dju 9898  df-card 9936  df-pnf 11252  df-mnf 11253  df-xr 11254  df-ltxr 11255  df-le 11256  df-sub 11448  df-neg 11449  df-div 11874  df-nn 12215  df-2 12277  df-3 12278  df-4 12279  df-5 12280  df-6 12281  df-7 12282  df-8 12283  df-9 12284  df-n0 12475  df-xnn0 12547  df-z 12561  df-dec 12680  df-uz 12825  df-rp 12977  df-fz 13487  df-fzo 13630  df-fl 13759  df-mod 13837  df-seq 13969  df-exp 14030  df-hash 14293  df-cj 15048  df-re 15049  df-im 15050  df-sqrt 15184  df-abs 15185  df-dvds 16200  df-struct 17082  df-sets 17099  df-slot 17117  df-ndx 17129  df-base 17147  df-ress 17176  df-plusg 17212  df-mulr 17213  df-starv 17214  df-sca 17215  df-vsca 17216  df-ip 17217  df-tset 17218  df-ple 17219  df-ds 17221  df-unif 17222  df-hom 17223  df-cco 17224  df-0g 17389  df-gsum 17390  df-prds 17395  df-pws 17397  df-mre 17532  df-mrc 17533  df-acs 17535  df-mgm 18563  df-sgrp 18612  df-mnd 18628  df-mhm 18673  df-submnd 18674  df-grp 18824  df-minusg 18825  df-sbg 18826  df-mulg 18953  df-subg 19005  df-ghm 19092  df-cntz 19183  df-od 19398  df-cmn 19652  df-abl 19653  df-mgp 19990  df-ur 20007  df-srg 20012  df-ring 20060  df-cring 20061  df-oppr 20154  df-dvdsr 20175  df-unit 20176  df-invr 20206  df-rnghom 20255  df-nzr 20296  df-subrg 20321  df-lmod 20477  df-lss 20548  df-lsp 20588  df-rlreg 20905  df-domn 20906  df-idom 20907  df-cnfld 20951  df-assa 21414  df-asp 21415  df-ascl 21416  df-psr 21468  df-mvr 21469  df-mpl 21470  df-opsr 21472  df-evls 21641  df-evl 21642  df-psr1 21710  df-vr1 21711  df-ply1 21712  df-coe1 21713  df-evl1 21842  df-mdeg 25577  df-deg1 25578  df-mon1 25655  df-uc1p 25656  df-q1p 25657  df-r1p 25658
This theorem is referenced by:  idomsubgmo  42022
  Copyright terms: Public domain W3C validator