3. EL GRUPO COCIENTE

*Las entradas de cada ejemplo deben ser ejecutados en orden para su correcto funcionamiento.
**Algunas varibles tienen nombres similares que difieren en un único caracter, puede aparecer el siguiente mensaje de aviso (no supone error): 
		General::"spell1": "Possible spelling error: new symbol name "VARIABLE1" is similar to existing symbol "VARIABLE2"

1. CLASES LATERALES. EL TEOREMA DE LAGRANGE

Función 1. Clases[]

\(Clases[x_, H_] := 
      Module[{claseizquierda, clasederecha, 
          CONTADORi}, 
claseizquierda = {}; 
clasederecha = {}; 
Do[
AppendTo[claseizquierda, 
            op[x, H[\([CONTADORi]\)]]]; 
AppendTo[
            clasederecha, 
            op[H[\([CONTADORi]\)], x]];
, {CONTADORi, 1, 
            Length[H]}]; 
Print[x, "*H = ", 
          claseizquierda, "; H*", x, " = ", 
          clasederecha]
]\)

Ejemplo 1.

\(Clases[x_, H_] := 
      Module[{claseizquierda, clasederecha, 
          CONTADORi}, 
claseizquierda = {}; 
clasederecha = {}; 
Do[
AppendTo[claseizquierda, 
            op[x, H[\([CONTADORi]\)]]]; 
AppendTo[
            clasederecha, 
            op[H[\([CONTADORi]\)], x]];
, {CONTADORi, 1, 
            Length[H]}]; 
Print[x, "*H = ", 
          claseizquierda, "; H*", x, " = ", 
          clasederecha]
]\)

G = {a, b, c, d};
operacion = {{a, b, c, d}, {b, a, d, c}, {c, d, b, a}, {d, c, a, 
            b}};

op[x_, 
            y_] := operacion[[Position[G, x][[1]], Position[
                      G, y][[1]]]][[1]][[1]];

Clases[b, {a, b}]

Clases[a, {a, b}]

2. SUBGRUPOS NORMALES Y GRUPOS COCIENTES

Función 2. NORMAL[]

NORMAL[H_] := 
      Module[{normal}, 
normal = 
          True; 
Do[
claseizquierda = {}; 
clasederecha = {}; 
Do[
AppendTo[claseizquierda, 
              op[G[[CONTADORj]], 
                H[[CONTADORi]]]]; 
AppendTo[
              clasederecha, 
              op[H[[CONTADORi]], 
                G[[CONTADORj]]]];
, {CONTADORi, 
              Length[H]}]; 
If[
            Intersection[claseizquierda, G] ≠ 
              Intersection[clasederecha, G], normal = False; 
            Break[];];
, {CONTADORj, 
            Length[G]}]; 
normal
]

Programa 3. Grupo Cociente

G=GRUPO
operacion=TABLA DE OPERACIONES DE G
op[x_,y_]:=FUNCIÓN OPERACIÓN DEL GRUPO
H=SUBGRUPO NORMAL

cociente={};
evaluados={};
Do[
  If[Intersection[{G[[j]]},evaluados]=={},
      clase={};
      Do[
        AppendTo[clase,op[G[[j]],H[[i]]]];
        ,{i,1,Length[H]}];
      AppendTo[cociente,clase];
      evaluados=Union[clase,evaluados];
      ];
  ,{j,1,Length[G]}]
cociente

Ejemplo 2.

NORMAL[H_] := 
      Module[{normal}, 
normal = 
          True; 
Do[
claseizquierda = {}; 
clasederecha = {}; 
Do[
AppendTo[claseizquierda, 
              op[G[[CONTADORj]], 
                H[[CONTADORi]]]]; 
AppendTo[
              clasederecha, 
              op[H[[CONTADORi]], 
                G[[CONTADORj]]]];
, {CONTADORi, 
              Length[H]}]; 
If[
            Intersection[claseizquierda, G] ≠ 
              Intersection[clasederecha, G], normal = False; 
            Break[];];
, {CONTADORj, 
            Length[G]}]; 
normal
]

G = {a, b, c, d};
operacion = {{a, b, c, d}, {b, a, d, c}, {c, d, b, a}, {d, c, a, 
            b}};

op[x_, 
            y_] := operacion[[Position[G, x][[1]], Position[
                      G, y][[1]]]][[1]][[1]];

NORMAL[{a, b}]

H = {a, b};
cociente = {};
evaluados = {};
Do[
If[
          Intersection[{G[[j]]}, 
              evaluados] == {}, 
clase = {}; 
Do[
AppendTo[clase, 
                op[G[[j]], H[[i]]]];
, {i, 1, 
              Length[H]}]; 
AppendTo[cociente, 
            clase]; 
evaluados = 
            Union[clase, 
              evaluados];
];
, {j, 1, 
        Length[G]}]
cociente

Clases[op[a, a], H]
Clases[op[a, c], H]
Clases[op[c, a], H]
Clases[op[c, c], H]