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 $.
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:
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.
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
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.
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.
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.
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)
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.
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