Essayez de créer un groupe de dièdre avec Python

Auparavant, j'avais créé un groupe gratuit $ F_2 $ en Python.

Créez un groupe gratuit avec Python

Cette fois, je vais continuer à faire un groupe de dièdre $ D_4 $.

Qu'est-ce qu'un groupe de dièdre?

Imaginez un plat régulier à n côtés. Cette fois, nous allons faire $ D_4 $, alors pensez à un carré.

À propos de cette place

--Opération r: Faites pivoter le carré de 360 / n degrés dans le sens des aiguilles d'une montre --Opération t: Retourner le carré --Opération e: ne rien faire

Considérez les trois opérations de. Vous pouvez également considérer le produit de ceux-ci (effectuer plusieurs opérations en séquence) ou l'élément inverse (l'élément inverse de r tourne dans le sens antihoraire, l'élément inverse de t est t). De plus, l'opération "ne rien faire" e correspond à l'élément unité.

J'oublie d'écrire $ r ^ {-1} $, mais le diagramme ressemble à ceci:

Screenshot_20191125_181417.png

Il est similaire au groupe libre $ F_2 $ en ce qu'il est généré à partir de deux éléments r et t, mais comme une fonctionnalité que le groupe libre n'avait pas. Il a les propriétés de $ r ^ 4 = e $, $ t ^ 2 = e $, et même $ trt = r ^ {-1} $. (Avez-vous remarqué la troisième propriété? Elle indique que si vous la retournez et la tournez dans le sens des aiguilles d'une montre, puis la retournez à nouveau, cela signifie qu'elle tourne dans le sens antihoraire.)

En fait, il peut être intéressant de savoir que n'importe quel groupe peut être créé en ajoutant ces expressions relationnelles au groupe libre.

Implémentons

Je veux en faire une forme simple

Comme pour le groupe libre, nous le conservons sous forme de chaîne de caractères, mais je veux le garder aussi simple que possible tout en considérant l'expression relationnelle.

Premièrement, $ t ^ {-1} $ peut être remplacé par $ t $ et $ r ^ {-1} $ peut être remplacé par $ r ^ 3 . ( r \ cdot r ^ {3} = e $, donc $ r ^ {-1} = r ^ {3} $) En considérant $ t ^ 2 = e $, $ r ^ 4 = e $, nous pouvons compter le nombre de r et t et prendre le reste divisé par 4 et le reste divisé par 2.

Ne serait-ce pas plus facile? Il y avait $ trt = r ^ {-1} $, mais si vous multipliez $ t $ à partir de la droite, vous obtenez $ tr = r ^ {-1} t $ en considérant $ t ^ 2 = e $.

$ trrt = trttrt = r ^ {-1} r ^ {-1} $. Si vous répétez ceci, vous trouverez $ tr ^ nt = tr ^ {-n} t $. Comme ci-dessus, $ tr ^ n = r ^ {-n} t $. En répétant cela, vous pouvez voir que r ... rtr ... rtr ... rt est changé en r ... rt et t est décalé vers la droite.

En conséquence, nous pouvons voir que tout élément peut être écrit sous la forme de «r {, 3} t?» (0 à 3 r et 0 ou 1 t) lorsqu'il est écrit en expression régulière.

Pensez au produit

Considérons le cas selon la présence ou l'absence de t.

-Lorsque $ (r ^ n t) \ cdot (r ^ m t) $ ⇒ $ r ^ {n-m} $ -Lorsque $ (r ^ n t) \ cdot (r ^ m) $ ⇒ $ r ^ {n-m} t $ -Lorsque $ (r ^ n) \ cdot (r ^ m t) $ ⇒ $ r ^ {n + m} t $ -Lorsque $ (r ^ n) \ cdot (r ^ m) $ ⇒ $ r ^ {n + m} $

Autrement dit, s'il y a t sur le côté gauche, le nombre de r est n-m, sinon il est n + m. De plus, l'addition ou non de t à la fin dépend du fait que le nombre de t est pair ou impair.

Pensez à l'inverse

Comme pour le groupe libre, ce serait bien d'inverser la chaîne et de tout inverser, mais compte tenu de la forme simple, il peut être divisé dans les cas suivants.

Comment, si t est attaché, vous serez l'opposé de vous-même. intéressant.

code

Faisons du FreeGroupBase précédemment créé la classe parente.

from collections import namedtuple

FreeGroupBase = namedtuple('FreeGroupBase', 's')

De plus, transcrivez ce que nous avons considéré précédemment dans le code.

import re

class DihedralGroup(FreeGroupBase):
    '''Un groupe de deux éléments, r et t, r^n = e, t^2 = e, trt = r^-Satisfaire 1.

Ici, n=4 (D_4)Et dit.
    '''
    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^-Il existe une expression relationnelle de 1.
        # trt = r^-1 est tr= r^-Il peut être lu comme 1 t, alors utilisez-le pour déplacer t vers la droite.
        #Aussi, r^-k (k>0)Si une forme comme^{n-k}Remplacer par
        #Par conséquent, lorsqu'il est écrit en expression régulière, r{,4}t?Il se résume sous la forme de.
        # lhs,rhs pense que cela a déjà été fait

        def count(s):
            '"r{,3}t?"Renvoie le nombre de r et le nombre de t dans la chaîne représentée par'
            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)

Essayer

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

Je pense que je peux faire quelque chose.

Résumé

Cette fois, j'ai fait un groupe de dièdre avec Python. Le groupe du dièdre est un groupe simple mais utile qui est également utilisé lors de l'examen de la symétrie moléculaire dans les calculs chimiques.

Recommended Posts

Essayez de créer un groupe de dièdre avec Python
Faisons un outil de veille de commande avec python
Essayez de dessiner une courbe de vie avec python
Je veux faire un jeu avec Python
Faites une loterie avec Python
Essayez de créer un logiciel de capture aussi précis que possible avec python (2)
Essayez de créer un module Python en langage C
Faisons une interface graphique avec python.
Essayez d'exploiter Facebook avec Python
Créer un système de recommandation avec python
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques
Faisons un graphe avec python! !!
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Essayez de reproduire un film couleur avec Python
Essayez de vous connecter à qiita avec Python
Faisons un jeu de shiritori avec Python
[Python] Comment rendre une classe itérable
Faisons un noyau jupyter
Créons un groupe gratuit avec Python
Fractal pour faire et jouer avec Python
Faisons la voix lentement avec Python
Essayez le scraping HTML avec la bibliothèque Python
Créez un framework Web avec Python! (1)
Essayez de dessiner une carte avec python + cartopy 0.18.0
Créez une application de bureau avec Python avec Electron
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
Essayez de créer un environnement python avec Visual Studio Code et WSL
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Essayez de créer un type de service Web avec un langage de balisage 3D
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Essayez de créer un logiciel de capture aussi précis que possible avec python (1)
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
Essayez d'ajouter un mur à votre fichier IFC avec IfcOpenShell python
Essayez de créer votre propre AWS-SDK avec bash
[TCP / IP] Après avoir étudié, essayez de créer un client HTTP avec Python
Comment lire un fichier CSV avec Python 2/3
Essayez de gratter avec Python.
Envoyer un message à LINE avec Python (LINE Notify)
Un mémorandum pour faire WebDAV uniquement avec nginx
Créer un bot Twitter Trend avec heroku + Python
Les débutants en Python ont décidé de créer un bot LINE avec Flask (commentaire approximatif de Flask)
Essayez de résoudre le diagramme homme-machine avec Python
Comment créer un dictionnaire avec une structure hiérarchique.
Essayez de créer foldl et foldr avec Python: lambda. Aussi mesure du temps
Essayez de générer automatiquement des documents Python avec Sphinx
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
Décidez d'une mission de laboratoire avec Python (fiction)
Étapes pour créer un bot Twitter avec Python
Remplaçons UWSC par Python (5) Faisons un robot
[Python] Essayez de créer vous-même un programme de tri. (Tri sélectif, tri par insertion, tri par bulle)