Zuvor habe ich in Python eine kostenlose Gruppe $ F_2 $ erstellt.
Erstellen Sie eine kostenlose Gruppe mit Python
Dieses Mal werde ich weiterhin eine Diedergruppe $ D_4 $ bilden.
Stellen Sie sich eine flache regelmäßige n-seitige vor. Dieses Mal machen wir $ D_4 $, also denken Sie an ein Quadrat.
Über diesen Platz
--Operation r: Drehen Sie das Quadrat um 360 / n Grad im Uhrzeigersinn --Operation t: Drehen Sie das Quadrat um
Betrachten Sie die drei Operationen von. Sie können auch das Produkt aus diesen (mehrere Operationen nacheinander ausführen) oder das inverse Element (das inverse Element von r dreht sich gegen den Uhrzeigersinn, das inverse Element von t ist t) betrachten. Auch die Operation "nichts tun" e entspricht dem Einheitselement.
Ich überspringe das Schreiben von $ r ^ {-1} $, aber das Diagramm sieht folgendermaßen aus:
Es ähnelt der freien Gruppe $ F_2 $ darin, dass es aus zwei Elementen r und t generiert wird, aber als Merkmal, das die freie Gruppe nicht hatte. Es hat die Eigenschaften von $ r ^ 4 = e $, $ t ^ 2 = e $ und sogar $ trt = r ^ {-1} $. (Haben Sie die dritte Eigenschaft bemerkt? Wenn Sie sie umdrehen und im Uhrzeigersinn und dann wieder umdrehen, bedeutet dies, dass sie sich gegen den Uhrzeigersinn dreht.)
In der Tat kann es sinnvoll sein zu wissen, dass jede Gruppe durch Hinzufügen dieser relationalen Ausdrücke zur freien Gruppe erstellt werden kann.
Wie bei der freien Gruppe behalten wir es als Zeichenfolge bei, aber ich möchte es so einfach wie möglich halten, während ich den relationalen Ausdruck betrachte.
Erstens kann $ t ^ {-1} $ durch $ t $ ersetzt werden und $ r ^ {-1} $ kann durch $ r ^ 3 $ ersetzt werden. ($ r \ cdot r ^ {3} = e $, also $ r ^ {-1} = r ^ {3} $) Unter Berücksichtigung von $ t ^ 2 = e $, $ r ^ 4 = e $ können wir die Anzahl von r und t zählen und den Rest geteilt durch 4 und den Rest geteilt durch 2 nehmen.
Wäre es nicht einfacher? Es gab $ trt = r ^ {-1} $, aber wenn Sie es von rechts mit $ t $ multiplizieren, erhalten Sie $ tr = r ^ {-1} t $ unter Berücksichtigung von $ t ^ 2 = e $.
$ trrt = trttrt = r ^ {-1} r ^ {-1} $. Wenn Sie dies wiederholen, finden Sie $ tr ^ nt = tr ^ {-n} t $. Wie oben ist $ tr ^ n = r ^ {-n} t $. Wenn Sie dies wiederholen, können Sie sehen, dass r ... rtr ... rtr ... rt in r ... rt geändert und t nach rechts verschoben wird.
Als Ergebnis können wir sehen, dass jedes Element in der Form von 'r {, 3} t?' (0 bis 3 r und 0 oder 1 t) geschrieben werden kann, wenn es im regulären Ausdruck geschrieben wird.
Betrachten Sie den Fall entsprechend der Anwesenheit oder Abwesenheit von t.
-Wenn $ (r ^ n t) \ cdot (r ^ m t) $ ⇒ $ r ^ {n-m} $ -Wenn $ (r ^ n t) \ cdot (r ^ m) $ ⇒ $ r ^ {n-m} t $ -Wenn $ (r ^ n) \ cdot (r ^ m t) $ ⇒ $ r ^ {n + m} t $ -Wenn $ (r ^ n) \ cdot (r ^ m) $ ⇒ $ r ^ {n + m} $
Das heißt, wenn es auf der linken Seite t gibt, ist die Anzahl von r n-m, andernfalls ist es n + m. Ob t am Ende hinzugefügt wird oder nicht, hängt auch davon ab, ob die Anzahl von t ungerade oder gerade ist.
Wie bei der freien Gruppe wäre es schön, die Zeichenfolge umzukehren und alles umzukehren, aber angesichts der einfachen Form kann sie in die folgenden Fälle unterteilt werden.
Wie, wenn t angehängt ist, wirst du das Gegenteil von dir sein. interessant.
Machen wir die zuvor erstellte "FreeGroupBase" zur übergeordneten Klasse.
from collections import namedtuple
FreeGroupBase = namedtuple('FreeGroupBase', 's')
Transkribieren Sie außerdem das, was wir zuvor betrachtet haben, in den Code.
import re
class DihedralGroup(FreeGroupBase):
'''Eine Gruppe von zwei Elementen, r und t, r^n = e, t^2 = e, trt = r^-Treffen Sie 1.
Hier, n=4 (D_4)Und sagte.
'''
check = re.compile('r{,3}t?')
def __init__(self, s: str):
if not self.check.fullmatch(s):
raise ValueError('Unexpected format')
def __mul__(self, other: 'DihedralGroup') -> 'DihedralGroup':
return DihedralGroup(self._reduction(self.s, other.s))
def __invert__(self) -> 'DihedralGroup':
# ~(r^n) = r^{-n}
# ~t = t
# ~(r^n t) = t r^{-n} = r^n t
if not self.s or self.s[-1] == 't':
return self
return DihedralGroup('r' * (4 - len(self.s)))
@staticmethod
def _reduction(lhs: str, rhs: str) -> str:
# r^4 = e, t^2 = t, trt = r^-Es gibt einen relationalen Ausdruck von 1.
# trt = r^-1 ist tr= r^-Es kann als 1 t gelesen werden. Verwenden Sie dies, um t nach rechts zu verschieben.
#Auch r^-k (k>0)Wenn eine Form wie^{n-k}Ersetzen mit
#Wenn in regulärem Ausdruck geschrieben, ist r{,4}t?Es ist in Form von zusammengefasst.
# lhs,rhs glaubt, dass dies bereits getan wurde
def count(s):
'"r{,3}t?"Gibt die Anzahl von r und die Anzahl von t in der durch dargestellten Zeichenfolge zurück'
if not s:
return 0, 0
if s[-1] == 't':
return len(s) - 1, 1
return len(s), 0
r1, t1 = count(lhs)
r2, t2 = count(rhs)
if t1:
r2 = -r2
return 'r' * ((r1 + r2) % 4) + 't' * ((t1 + t2) % 2)
def __repr__(self) -> str:
if not self.s:
return 'e'
return ' * '.join(self.s)
print(t * r * t)
print(t * r * t * r)
print(t * r * r * r * t)
print(e * e * t * r * e * r * e * e * e * r * t)
print(r * r * t * r)
print(~(r*r*r) * (r*r*r))
print(~(r*r*r*t) * (r*r*r*t))
r * r * r
e
r
r
r * t
e
e
Ich denke, ich kann etwas tun.
Dieses Mal habe ich mit Python eine Diedergruppe gebildet. Die Diedergruppe ist eine einfache, aber nützliche Gruppe, die auch verwendet wird, wenn die molekulare Symmetrie in chemischen Berechnungen berücksichtigt wird.
Recommended Posts