Estuve escribiendo una librería de clases C# para manejar grupos finitos. Un grupo es un conjunto G de elementos dotados de una operación binaria *, dondee:
a * b is in G (clausura)
a * (b * c) = (a * b) * c (asociatividad)
a * a’ = e (existencia de inverso e identidad)
a * e = e * a (identidad)
El código de la solución está en AjCodeKata Google Project, en trunk/AjGroups:
Las principales interfaces son:
IElement tiene un método Multiply, que recibe otro IElement y retorna el resultado IElement. IElement.Order es el número de elementos a ser multiplicados para obtener la identidad:
a * a * a ….. * a = e
IGroup.Elements es la colección de IElements que son elementos del grupo. IGroup.Order es la cantidad de elementos.
Hay dos implementaciones de esas interfaces: una basada en permutaciones, otra basada en elementos con nombre (como “a”, “e”) y una tabla describiendo sus multiplicaciones.
Hay métodos para:
– Obtener los subgrupos de un grupo
– Obtener los subgrupos normales de un grupo
– Determinar si dos grupos son isomorfos
Seguí Test-Driven Development (TDD). Todos los tests en verde:
Buen code coverage:
Debería hacer algún refactoring, pero el proyecto va tomando forma. Escribiré posts describiendo la implementación de permutaciones, y la otra, la basada en elementos abstractos.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez