Créons un groupe gratuit avec Python

Qu'est-ce qu'un groupe

Un ensemble non vide $ G $ qui peut faire une "opération binaire" (Autrement dit, si $ g, h \ dans G $, il y a une opération binaire $ g \ cdot h $, et le résultat de l'opération est également l'élément de G, c'est-à-dire $ g \ cdot h \ dans G $) Ceux qui remplissent les conditions suivantes sont appelés groupes.

Exemple de groupe

--Les entiers qui peuvent être ajoutés sont des groupes (élément unitaire → $ 0 $, élément inverse de $ a $ → $ -a $, loi de combinaison → l'addition est connue pour contenir la loi de combinaison) --Il existe également des groupes de nombres rationnels qui peuvent être ajoutés (comme ci-dessus). Il existe également un groupe de nombres rationnels moins 0 qui peut être multiplié. (S'il s'agit d'un nombre rationnel comprenant 0, ce n'est pas un groupe car l'élément inverse de 0 ne peut pas être défini.)

Groupe gratuit

Les groupes libres n'ont aucune restriction autre que la définition des groupes.

Ici, considérons $ F_2 $ généré à partir de deux éléments du groupe libre. En d'autres termes, à partir de l'élément unit, les deux éléments $ a, b \ dans F_2 $, et les éléments inverses $ a ^ {-1}, b ^ {-1} $, sélectionnez celui que vous aimez et calculez, et vous aimez Pensez à quelque chose qui peut être répété autant de fois que possible.

F_2 = \\{e, a, b, a^{-1}, b^{-1}, aa, ab, ab^{-1}, ba, ba^{-1}, bb, a^{-1}b, a^{-1}a^{-1}, a^{-1}b^{-1}, \dots\\}

Quelle est la source inverse?

Je comprends que l'inverse de $ a $ est $ a ^ {-1} $, mais qu'en est-il de l'inverse d'une combinaison, telle que $ ab ^ {-1} aab $? En fait, c'est l'inverse de chaque original, et l'ordre est inversé, c'est-à-dire $ b ^ {-1} a ^ {-1} a ^ {-1} ba ^ {-dans ce cas. 1} $ est la source inverse. En fait, quand j'essaye de calculer ces

\begin{eqnarray}
ab^{-1}aab\cdot b^{-1}a^{-1}a^{-1}ba^{-1} & = & ab^{-1}aa \cdot a^{-1}a^{-1}ba^{-1}\\
& = & ab^{-1}a \cdot a^{-1}ba^{-1}\\
& = & ab^{-1} \cdot ba^{-1}\\
& = & a \cdot a^{-1}\\
&=&e\\
\\
b^{-1}a^{-1}a^{-1}ba^{-1}\cdot ab^{-1}aab & = & b^{-1}a^{-1}a^{-1}b\cdot b^{-1}aab\\
& = & b^{-1}a^{-1}a^{-1}\cdot aab\\
& = & b^{-1}a^{-1}\cdot ab\\
& = & b^{-1}\cdot b\\
& = & e
\end{eqnarray}

Certes, vous pouvez voir que c'est l'inverse.

Faisons-le avec Python

Python est facile à faire car la surcharge d'opérateurs est facile. Je vais l'essayer immédiatement.

En tant que politique de mise en œuvre, nous aurons $ a $ et $ ab $ comme chaînes. De plus, l'élément inverse sera conservé par les lettres majuscules A et B.

Pour le calcul inverse, utilisez la méthode str.swapcase pour retourner la chaîne. J'utilise Python depuis de nombreuses années, mais c'est la première fois que j'utilise «swapcase» de ma vie. Cette méthode est une méthode qui rend les majuscules et minuscules minuscules et minuscules majuscules.

'heLLo woRLd,ゎ ゎ ゎ ωπ'.swapcase() # =>Le résultat est le suivant
'HEllO WOrlD,ゎ ゎ ΩΠ'

Malheureusement (?), Small hiragana ne grossit pas, mais il semble que les caractères grecs sont convertis même s'ils ne sont pas des caractères ASCII. Eh bien, je m'en fiche, alors mettons-le en œuvre.

J'ai pensé aux choses importantes, alors écrivons le code.

from collections import namedtuple

FreeGroupBase = namedtuple('FreeGroupBase', 's')
class FreeGroup(FreeGroupBase):
    def __init__(self, s: str):
        if s.lower().replace('a', '').replace('b', ''):
            # a,Vérifiez s'il est généré uniquement à partir de b
            raise ValueError('Unexpected element is contained')

    #Source inverse~Je vais le prendre comme un
    def __invert__(self) -> 'FreeGroup':
        return FreeGroup(self.s.swapcase()[::-1])

    #Arithmétique*Je vais le faire dans
    def __mul__(self, other: 'FreeGroup') -> 'FreeGroup':
        return FreeGroup(self._mul_impl(self.s, other.s))

    @classmethod
    def _mul_impl(cls, lhs: str, rhs: str) -> str:
        'Implémentation de l'arithmétique'
        if not lhs: #lhs est l'élément unitaire
            return rhs
        if not rhs: #rhs est l'unité
            return lhs
        if lhs[-1].swapcase() == rhs[0]: # ...a * ~a...Sous la forme d'un* ~peut annuler un
            return cls._mul_impl(lhs[:-1], rhs[1:])
        return lhs + rhs #Sinon, c'est juste une chaîne de chaînes

    def __repr__(self) -> 'str':
        if not self.s:
            return 'e'
        return ' * '.join(e if e.lower() else '~' + e.tolower() for e in self.s)

a = FreeGroup('a')
b = FreeGroup('b')
e = FreeGroup('')

g = a * b * b * a * ~b * ~b * ~a * a * b * (a * a * b)
print(g)
print(g * ~g)
print(~g * g)

Ouais, ça fait du bien.

Recommended Posts

Créons un groupe gratuit avec Python
Créer un répertoire avec python
Faisons une interface graphique avec python.
Créez un environnement virtuel avec Python!
Faisons un graphe avec python! !!
Créons un script qui s'enregistre avec Ideone.com en Python.
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Faisons un jeu de shiritori avec Python
Créez une image factice avec Python + PIL.
Créons un environnement virtuel pour Python
Faisons la voix lentement avec Python
Créer un compteur de fréquence de mots avec Python 3.4
Créez un framework Web avec Python! (1)
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
Créer un environnement Python
Créer un cadre avec un arrière-plan transparent avec tkinter [Python]
Créer un LINE BOT avec Minette pour Python
Créer un environnement virtuel avec conda avec Python
Créer une page qui se charge indéfiniment avec python
[Note] Créez une classe de fuseau horaire sur une ligne avec python
Vous pouvez facilement créer une interface graphique même avec Python
Créer un environnement de construction python3 avec Sublime Text3
Créer une barre de couleurs avec Python + Qt (PySide)
Étapes pour créer un bot Twitter avec Python
Remplaçons UWSC par Python (5) Faisons un robot
Créer un arbre de décision à partir de 0 avec Python (1. Présentation)
Créer une nouvelle page en confluence avec Python
Créer un widget avec une couleur spécifiée avec Python + Qt (PySide)
Essayez de créer un groupe de dièdre avec Python
Créer un fichier au format Photoshop (.psd) avec python
Facile à créer une application console Python avec Click
Créer un plugin Wox (Python)
Créer une fonction en Python
Créer un dictionnaire en Python
Créer un gif 3D avec python3
[Python] Générer ValueObject avec un constructeur complet à l'aide de classes de données
Créer une page d'accueil avec django
[Jouons avec Python] Créer un livre de comptes de ménage
Pourquoi ne pas créer facilement une table élégante avec Python?
Créez un environnement de développement python avec vagrant + ansible + fabric
Essayez de créer un jeu simple avec Python 3 et iPhone
Créez un chatbot prenant en charge la saisie gratuite avec Word2Vec
Créer un tableau numpy python
Faites une loterie avec Python
Écrivons python avec cinema4d.
Créer une couche pour AWS Lambda Python dans Docker
[python] Créez un tableau de dates avec des incréments arbitraires avec np.arange
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
[Python] Créez un fichier de distribution pour le programme Tkinter avec cx_Freeze
Construisons git-cat avec Python
Créez un faux serveur Minecraft en Python avec Quarry
[Piyopiyokai # 1] Jouons avec Lambda: création d'un script Python
[Super facile] Faisons un LINE BOT avec Python.
Créer un fichier CAO 2D ".dxf" avec python [ezdxf]
Créons un client de socket Web avec Python. (Authentification par jeton d'accès)
[Python] Créez un écran de spécification de chemin de fichier et de dossier avec tkinter