Versuchen Sie, mit Python eine Diedergruppe zu bilden

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.

Was ist eine Diedergruppe?

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:

Screenshot_20191125_181417.png

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.

Lassen Sie uns implementieren

Ich möchte es zu einer einfachen Form machen

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.

Denken Sie an das Produkt

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.

Denken Sie an das Gegenteil

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.

Code

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)

Versuchen

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.

Zusammenfassung

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

Versuchen Sie, mit Python eine Diedergruppe zu bilden
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
Ich möchte ein Spiel mit Python machen
Machen Sie eine Lotterie mit Python
Versuchen Sie, mit Python (2) eine Erfassungssoftware zu erstellen, die so genau wie möglich ist.
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Lassen Sie uns eine GUI mit Python erstellen.
Versuchen Sie, Facebook mit Python zu betreiben
Erstellen Sie ein Empfehlungssystem mit Python
WEB Scraping mit Python und versuchen, aus Bewertungen eine Wortwolke zu machen
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Experimentieren Sie mit Python, um ein PDF für Selbstversorger für Kindle zu erstellen
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Versuchen Sie, Farbfilme mit Python zu reproduzieren
Versuchen Sie, sich mit Python bei qiita anzumelden
Lassen Sie uns mit Python ein Shiritori-Spiel machen
[Python] Wie man eine Klasse iterierbar macht
Machen wir einen Jupyter-Kernel
Erstellen wir mit Python eine kostenlose Gruppe
Fraktal zum Erstellen und Spielen mit Python
Lassen Sie uns mit Python langsam sprechen
Versuchen Sie HTML-Scraping mit der Python-Bibliothek
Erstellen Sie ein Webframework mit Python! (1)
Versuchen Sie, eine Karte mit Python + Cartopy 0.18.0 zu zeichnen
Erstellen Sie eine Desktop-App mit Python mit Electron
Machen wir einen Twitter-Bot mit Python!
Erstellen Sie ein Webframework mit Python! (2)
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Versuchen Sie, eine Python-Umgebung mit Visual Studio Code & WSL zu erstellen
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Versuchen Sie, einen Web-Service-ähnlichen Typ mit 3D-Markup-Sprache zu erstellen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Versuchen Sie, mit Python (1) eine Erfassungssoftware zu erstellen, die so genau wie möglich ist.
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Versuchen Sie, Ihrer IFC-Datei mit IfcOpenShell Python eine Wand hinzuzufügen
Versuchen Sie, Ihr eigenes AWS-SDK mit bash zu erstellen
[TCP / IP] Versuchen Sie nach dem Studium, mit Python einen HTTP-Client zu erstellen
Lesen einer CSV-Datei mit Python 2/3
Versuchen Sie es mit Python.
Senden Sie eine Nachricht mit Python an LINE (LINE Notify)
Ein Memorandum, um WebDAV nur mit Nginx zu erstellen
Machen Sie Twitter Trend Bot mit Heroku + Python
Python-Anfänger haben beschlossen, einen LINE-Bot mit Flask zu erstellen (Flask-Kommentar)
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
Versuchen Sie, Foldl und Foldr mit Python: Lambda zu machen. Auch Zeitmessung
Versuchen Sie, Python-Dokumente automatisch mit Sphinx zu generieren
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
Entscheide dich für einen Laborauftrag mit Python (Fiktion)
Schritte zum Erstellen eines Twitter-Bots mit Python
Ersetzen wir UWSC durch Python (5) Machen wir einen Roboter
[Python] Versuchen Sie, selbst ein Sortierprogramm zu erstellen. (Selektive Sortierung, Sortierung einfügen, Blasensortierung)