Skip to content

Commit 787dbbd

Browse files
andyclaude
andcommitted
Character tables, verified by the orthogonality theorem (#132)
Phase 1 of the MO correlation diagram roadmap. PointGroups already lists the irrep NAMES of 46 groups, which is all that is needed to label an orbital; deciding which irreps a set of orbitals spans needs the characters, which is what this adds -- for the thirteen groups the AH_n and ML_n scope calls for. A character table is a hand-entered grid of small integers, and a wrong sign in one cell gives a table that still looks like a character table while silently misassigning an irrep. So none of this was checked by eye: the great orthogonality theorem makes the data self-verifying, and tests/symmetry enforces the class counts against the group order, the squared dimensions against it, every row's norm, row orthogonality, column orthogonality, and that there are as many irreps as classes. 987 checks over thirteen groups. THE ONE THING ORTHOGONALITY CANNOT CATCH is two rows being swapped. A relabelling leaves every orthogonality relation intact -- the table stays perfectly self-consistent while two irreps wear each other's names. Confirmed rather than assumed: swapping Td's T1 and T2 passed the orthogonality checks cleanly. Closed by tying a label to something physical. The character of the 3-D Cartesian representation follows from the class NAMES alone -- 1+2cos for a proper rotation, -1+2cos for an improper one, 1 for a mirror, -3 for inversion -- so reducing it is an independent constraint on the labelling. It comes out T2 in Td, T1u in Oh, E'+A2'' in D3h, A1+B1+B2 in C2v, and so on for all thirteen, every one matching the standard tables. The swap is now caught. Every check was self-tested by introducing the error and watching it fail: a flipped sign, a row swap, a renamed irrep, a g/u mislabel. The irrep names are also checked against PointGroups for the same group, since the point of the labels is to be compared against the ones the codes themselves report in ORBSYM -- which the roadmap makes the oracle for the whole symmetry pipeline. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EFMUNbw2UpRPmgsqviAowb
1 parent 9ed6d44 commit 787dbbd

3 files changed

Lines changed: 516 additions & 0 deletions

File tree

‎data/client/config/CharacterTables‎

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
# Character tables, for symmetry analysis of molecular orbitals.
2+
#
3+
# data/client/config/PointGroups already lists the IRREP NAMES of 46
4+
# groups, which is all that was needed to label an orbital. Deciding
5+
# which irreps a set of orbitals spans needs the characters themselves,
6+
# which is what this file adds.
7+
#
8+
# FORMAT. One block per group, blank-line separated:
9+
#
10+
# [GROUP] h=<order>
11+
# classes: <name> <name> ... the conjugacy classes, in order
12+
# counts: <n> <n> ... how many operations in each
13+
# <irrep>: <chi> <chi> ... one row per irreducible rep
14+
#
15+
# The irrep names must match PointGroups' spelling for the same group,
16+
# since that is what the codes' own ORBSYM labels are compared against.
17+
#
18+
# The "translations" line records what the Cartesian coordinates x, y, z
19+
# span in that group. It is there because orthogonality alone CANNOT
20+
# catch two rows being swapped -- a relabelling leaves every orthogonality
21+
# relation intact, so the table stays self-consistent while two irreps
22+
# have each other's names. The character of the 3-D Cartesian
23+
# representation is computable from the class names alone (1+2cos(theta)
24+
# for a proper rotation, -1+2cos(theta) for an improper one, 1 for a
25+
# mirror, -3 for inversion), so reducing it and comparing against this
26+
# line ties each label to something physical and pins the labelling too.
27+
#
28+
# THESE ARE VERIFIED MECHANICALLY, not by eye. The great orthogonality
29+
# theorem makes the data self-checking -- rows orthogonal, columns
30+
# orthogonal, sum of counts equal to h, sum of squared dimensions equal
31+
# to h, and every row's own norm equal to h. tests/symmetry enforces all
32+
# five, so a transcription slip in a hand-entered table cannot survive.
33+
# That is the only reason entering them by hand is acceptable.
34+
#
35+
# Only real characters appear here. The cyclic groups Cn with n > 2 have
36+
# complex characters for their E irreps; none of the groups below is one,
37+
# and a group that needs them must not be added without extending the
38+
# format rather than rounding them.
39+
40+
[C1] h=1
41+
classes: E
42+
counts: 1
43+
A: 1
44+
translations: 3A
45+
46+
[CS] h=2
47+
classes: E sh
48+
counts: 1 1
49+
A': 1 1
50+
A'': 1 -1
51+
translations: 2A' + A''
52+
53+
[CI] h=2
54+
classes: E i
55+
counts: 1 1
56+
Ag: 1 1
57+
Au: 1 -1
58+
translations: 3Au
59+
60+
[C2] h=2
61+
classes: E C2
62+
counts: 1 1
63+
A: 1 1
64+
B: 1 -1
65+
translations: A + 2B
66+
67+
[C2V] h=4
68+
classes: E C2 sv_xz sv_yz
69+
counts: 1 1 1 1
70+
A1: 1 1 1 1
71+
A2: 1 1 -1 -1
72+
B1: 1 -1 1 -1
73+
B2: 1 -1 -1 1
74+
translations: A1 + B1 + B2
75+
76+
[C3V] h=6
77+
classes: E C3 sv
78+
counts: 1 2 3
79+
A1: 1 1 1
80+
A2: 1 1 -1
81+
E: 2 -1 0
82+
translations: A1 + E
83+
84+
[C4V] h=8
85+
classes: E C4 C2 sv sd
86+
counts: 1 2 1 2 2
87+
A1: 1 1 1 1 1
88+
A2: 1 1 1 -1 -1
89+
B1: 1 -1 1 1 -1
90+
B2: 1 -1 1 -1 1
91+
E: 2 0 -2 0 0
92+
translations: A1 + E
93+
94+
[C2H] h=4
95+
classes: E C2 i sh
96+
counts: 1 1 1 1
97+
Ag: 1 1 1 1
98+
Bg: 1 -1 1 -1
99+
Au: 1 1 -1 -1
100+
Bu: 1 -1 -1 1
101+
translations: Au + 2Bu
102+
103+
[D2H] h=8
104+
classes: E C2_z C2_y C2_x i s_xy s_xz s_yz
105+
counts: 1 1 1 1 1 1 1 1
106+
Ag: 1 1 1 1 1 1 1 1
107+
B1g: 1 1 -1 -1 1 1 -1 -1
108+
B2g: 1 -1 1 -1 1 -1 1 -1
109+
B3g: 1 -1 -1 1 1 -1 -1 1
110+
Au: 1 1 1 1 -1 -1 -1 -1
111+
B1u: 1 1 -1 -1 -1 -1 1 1
112+
B2u: 1 -1 1 -1 -1 1 -1 1
113+
B3u: 1 -1 -1 1 -1 1 1 -1
114+
translations: B1u + B2u + B3u
115+
116+
[D3H] h=12
117+
classes: E C3 C2 sh S3 sv
118+
counts: 1 2 3 1 2 3
119+
A1': 1 1 1 1 1 1
120+
A2': 1 1 -1 1 1 -1
121+
E': 2 -1 0 2 -1 0
122+
A1'': 1 1 1 -1 -1 -1
123+
A2'': 1 1 -1 -1 -1 1
124+
E'': 2 -1 0 -2 1 0
125+
translations: E' + A2''
126+
127+
[D4H] h=16
128+
classes: E C4 C2 C2' C2'' i S4 sh sv sd
129+
counts: 1 2 1 2 2 1 2 1 2 2
130+
A1g: 1 1 1 1 1 1 1 1 1 1
131+
A2g: 1 1 1 -1 -1 1 1 1 -1 -1
132+
B1g: 1 -1 1 1 -1 1 -1 1 1 -1
133+
B2g: 1 -1 1 -1 1 1 -1 1 -1 1
134+
Eg: 2 0 -2 0 0 2 0 -2 0 0
135+
A1u: 1 1 1 1 1 -1 -1 -1 -1 -1
136+
A2u: 1 1 1 -1 -1 -1 -1 -1 1 1
137+
B1u: 1 -1 1 1 -1 -1 1 -1 -1 1
138+
B2u: 1 -1 1 -1 1 -1 1 -1 1 -1
139+
Eu: 2 0 -2 0 0 -2 0 2 0 0
140+
translations: A2u + Eu
141+
142+
[TD] h=24
143+
classes: E C3 C2 S4 sd
144+
counts: 1 8 3 6 6
145+
A1: 1 1 1 1 1
146+
A2: 1 1 1 -1 -1
147+
E: 2 -1 2 0 0
148+
T1: 3 0 -1 1 -1
149+
T2: 3 0 -1 -1 1
150+
translations: T2
151+
152+
[OH] h=48
153+
classes: E C3 C2 C4 C2' i S4 S6 sh sd
154+
counts: 1 8 6 6 3 1 6 8 3 6
155+
A1g: 1 1 1 1 1 1 1 1 1 1
156+
A2g: 1 1 -1 -1 1 1 -1 1 1 -1
157+
Eg: 2 -1 0 0 2 2 0 -1 2 0
158+
T1g: 3 0 -1 1 -1 3 1 0 -1 -1
159+
T2g: 3 0 1 -1 -1 3 -1 0 -1 1
160+
A1u: 1 1 1 1 1 -1 -1 -1 -1 -1
161+
A2u: 1 1 -1 -1 1 -1 1 -1 -1 1
162+
Eu: 2 -1 0 0 2 -2 0 1 -2 0
163+
T1u: 3 0 -1 1 -1 -3 -1 0 1 1
164+
T2u: 3 0 1 -1 -1 -3 1 0 1 -1
165+
translations: T1u

‎tests/symmetry/README.md‎

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# tests/symmetry — are the character tables right?
2+
3+
```
4+
tests/symmetry/run_tests.py check every table
5+
tests/symmetry/run_tests.py -v show each check
6+
```
7+
8+
Exit 0 if every table is sound, 1 otherwise. No build, no display, no
9+
chemistry codes.
10+
11+
## Why
12+
13+
`data/client/config/CharacterTables` is a hand-entered grid of small
14+
integers — exactly the kind of data a transcription slip survives in. A
15+
wrong sign in one cell gives a table that still *looks* like a character
16+
table and silently misassigns one irrep, which would then propagate into
17+
every MO symmetry label built on it (#132).
18+
19+
It does not have to be checked by eye. The great orthogonality theorem
20+
makes the data self-verifying.
21+
22+
## What is checked
23+
24+
| | |
25+
|---|---|
26+
| class counts sum to the group order | catches a missing or duplicated class |
27+
| squared dimensions sum to the group order | catches a wrong dimension |
28+
| every irrep's own norm equals the order | catches most single-cell errors |
29+
| distinct irreps are orthogonal | catches the rest |
30+
| distinct classes are orthogonal, normalised | independent of the row checks |
31+
| as many irreps as classes | catches a whole row left out |
32+
| **(x, y, z) reduces to the recorded irreps** | catches a row **swap** |
33+
34+
## The one orthogonality cannot catch
35+
36+
Swapping two whole rows leaves **every** orthogonality relation intact —
37+
it is a relabelling, so the table stays perfectly self-consistent while
38+
two irreps wear each other's names. That was confirmed, not assumed: the
39+
Td T₁/T₂ swap passed the orthogonality checks cleanly.
40+
41+
The fix is to tie a label to something physical. The character of the
42+
3-D Cartesian representation follows from the class *names* alone —
43+
1+2cos θ for a proper rotation, −1+2cos θ for an improper one, 1 for a
44+
mirror, −3 for inversion — so reducing it and comparing against the
45+
`translations:` line is an independent constraint. In Td it must come
46+
out T₂, in Oh T₁ᵤ, in D3h E′+A₂″.
47+
48+
Every check here was self-tested by introducing the error and watching
49+
it fail: a flipped sign, a row swap, a renamed irrep, a g/u mislabel.
50+
51+
## Scope
52+
53+
Thirteen groups: C1, Cs, Ci, C2, C2v, C3v, C4v, C2h, D2h, D3h, D4h, Td,
54+
Oh — enough for AH_n and ML_n, which is the scope #132 sets for the
55+
first MO diagram.
56+
57+
Only **real** characters. The cyclic groups Cn with n > 2 have complex
58+
characters for their E irreps; none of the above is one, and a group
59+
that needs them must not be added without extending the format rather
60+
than rounding them.

0 commit comments

Comments
 (0)