Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/qpa/lib/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 4.0.2024 mit Größe 35 kB image not shown  

Quelle  validity.gi   Sprache: unbekannt

 
InstallGlobalFunction( QPAStringQuiverRho,
  function(Q,rho)
    local rho_q, i,j,k,arr,arr1;
    rho_q := [];
    for i in [1..Length(rho)] do
        arr := [];
        for j in [1..Length(rho[i])] do
            for k in [1..NumberOfArrows(Q)] do
                if rho[i][j] = String(ArrowsOfQuiver(Q)[k])[1] then
                    Add(arr,ArrowsOfQuiver(Q)[k]);
                fi;
            od;
        od;
        arr1 := arr[1];
        for k in [2..Length(arr)] do
            arr1 := arr1*arr[k];
        od;
        Add(rho_q, arr1);
    od;
    return rho_q;
end
);

InstallGlobalFunction( QPAStringSigmaEps,
  function( A )
    local Q, rho1, rho, i, onerel, tworel, str, Composable_Matrix, IsComposable, temp_in, temp_out,
    j, k, sigma, eps, x, y;

    Q := QuiverOfPathAlgebra(A);
    rho := RelationsOfAlgebra(A);

    rho1 := [];
    for i in [1..Length(rho)] do
        onerel := CoefficientsAndMagmaElements(rho[i]);
        tworel := WalkOfPath(onerel[1]);
        str := Concatenation(List(tworel, a -> String(a)));
        Append(rho1, [str]);
    od;

    Composable_Matrix := function(Q,rho)
        local mat, x, str, i, j;
        mat := [];
        for i in [1..NumberOfArrows(Q)] do
            str := [];
            for j in [1..NumberOfArrows(Q)] do
                if SourceOfPath(ArrowsOfQuiver(Q)[i]) =
                  TargetOfPath(ArrowsOfQuiver(Q)[j]) and not
                  \in(ArrowsOfQuiver(Q)[j]*ArrowsOfQuiver(Q)[i],rho) then
                    Append(str, [1]);
                else
                    Append(str, [0]);
                fi;
            od;
            Append(mat, [str]);
        od;
        return mat;
    end;

    IsComposable := function(Q,rho,arrow1,arrow2)
        local i, Mat, pos1, pos2, j;
        Mat := Composable_Matrix(Q,rho);
        for i in [1..NumberOfArrows(Q)] do
            if arrow1 = ArrowsOfQuiver(Q)[i] then
                break;
            fi;
        od;
        for j in [1..NumberOfArrows(Q)] do
            if arrow2 = ArrowsOfQuiver(Q)[j] then
                break;
            fi;
        od;
        return Mat[i][j];
    end;

    temp_in := function(Q,i,j)
        return SIntChar(String(IncomingArrowsOfVertex(VerticesOfQuiver(Q)[i])[j])[1])
        - SIntChar('a') + 1;
    end;

    temp_out := function(Q,i,j)
        return SIntChar(String(OutgoingArrowsOfVertex(VerticesOfQuiver(Q)[i])[j])[1])
        - SIntChar('a') + 1;
    end;

    sigma := [];
    eps := [];
    for i in [1..NumberOfArrows(Q)] do
        Append(sigma, [0]);
        Append(eps, [0]);
    od;

    rho := QPAStringQuiverRho(Q,rho1);

    for i in [1..NumberOfVertices(Q)] do
        x := IncomingArrowsOfVertex(VerticesOfQuiver(Q)[i]);
        y := OutgoingArrowsOfVertex(VerticesOfQuiver(Q)[i]);
        if Length(x) = 2 then
            eps[temp_in(Q, i, 1)] := 1;
            eps[temp_in(Q, i, 2)] := -1;
            if Length(y) = 1 then
                if IsComposable(Q, rho, y[1], x[1]) = 1 then
                    sigma[temp_out(Q, i, 1)] := -1;
                elif IsComposable(Q, rho, y[1], x[2]) = 1 then
                    sigma[temp_out(Q, i, 1)] := 1;
                fi;
            elif Length(y) = 2 then
                if IsComposable(Q, rho, y[1], x[1]) = 1 or
                  IsComposable(Q, rho, y[2], x[2]) = 1 then
                    sigma[temp_out(Q, i, 1)] := -1;
                    sigma[temp_out(Q, i, 2)] := 1;
                else
                    sigma[temp_out(Q, i, 1)] := 1;
                    sigma[temp_out(Q, i, 2)] := -1;
                fi;
            fi;
        elif Length(x) = 1 then
            if Length(y) = 1 then
                eps[temp_in(Q, i, 1)] := 1;
                sigma[temp_out(Q, i, 1)] := -1;
            elif Length(y) = 2 then
                sigma[temp_out(Q, i, 1)] := 1;
                sigma[temp_out(Q, i, 2)] := -1;
                if IsComposable(Q, rho, y[1], x[1]) = 1 then
                    eps[temp_in(Q, i, 1)] := -1;
                else
                    eps[temp_in(Q, i, 1)] := 1;
                fi;
            fi;
        elif Length(x) = 0 then
          sigma[temp_out(Q, i, 1)] := 1;
          sigma[temp_out(Q, i, 2)] := -1;
        fi;
    od;
    return [sigma, eps];
end
);

InstallMethod( IsValidString,
"for stringalgebras and strings",
true,
[ IsAlgebra, IsString ], 0,
function( A, input_str )
    local IsValidStringSA, IsReducedWalk, IsValidWalk, Q, rho1, rho, vertices, arrows, i, x, y, str;
    if IsStringAlgebra(A) = false then
      Error("The input algebra is not a string algebra");
      return 0;
    fi;

    Q := QuiverOfPathAlgebra(A);
    rho1 := RelationsOfAlgebra(A);

    vertices := VerticesOfQuiver(Q);
    arrows := ArrowsOfQuiver(Q);

    for i in [1..Length(vertices)] do
      if Length(String(vertices[i])) <> 2 or String(vertices[i])[1] <> 'v' or
        String(vertices[i])[2] <> String(i)[1] then
        Error("The Quiver of A is not acceptable");
        return 0;
      fi;
    od;

    for i in [1..Length(arrows)] do
      if Length(String(arrows[i])) <> 1 or String(arrows[i])[1] <> CharInt(i+96) then
        Error("The Quiver of A is not acceptable");
        return 0;
      fi;
    od;

    rho := [];
    for i in [1..Length(rho1)] do
        x := CoefficientsAndMagmaElements(rho1[i]);
        y := WalkOfPath(x[1]);
        str := Concatenation(List(y, a -> String(a)));
        Append(rho, [str]);
    od;

    IsReducedWalk := function(Q, input_str)
        local x,y,i,j;
        x := 0;
        y := ['-','1'];
        for i in [1..Length(ArrowsOfQuiver(Q))] do
            Append(y, String(ArrowsOfQuiver(Q)[i]));
        od;
        for i in [1..Length(ArrowsOfQuiver(Q))] do
            Append(y, [CharInt(SIntChar(String(ArrowsOfQuiver(Q)[i])[1])-32)]);
        od;

        for i in [1..Length(input_str)] do
            if not input_str[i] in y then
                return 0;
            fi;
        od;
        for i in [1..Length(input_str) - 1] do
            if SIntChar(input_str[i]) - SIntChar(input_str[i+1]) = 32 or
              SIntChar(input_str[i + 1]) - SIntChar(input_str[i]) = 32 then
                x := 1;
            else continue;
            fi;
        od;
        if x = 0 then return 1;
        else return 0;
        fi;
    end;

    IsValidWalk := function (Q, input_str)
        local i,j,k,x,s,t,array, y;
        x := 0;
        y := [];
        for i in [1..Length(ArrowsOfQuiver(Q))] do
            Append(y, String(ArrowsOfQuiver(Q)[i]));
        od;
        for i in [1..Length(ArrowsOfQuiver(Q))] do
            Append(y, [CharInt(SIntChar(String(ArrowsOfQuiver(Q)[i])[1]) - 32)]);
        od;
        for i in [1..Length(input_str)] do
            if not input_str[i] in y then
                return false;
            fi;
        od;
        for i in [1..Length(input_str) - 1] do
            if SIntChar(input_str[i]) > 96 then
                if SIntChar(input_str[i + 1]) > 96 then
                    if SourceOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[i])
                      - SIntChar('a') + 1]) <>
                      TargetOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[i + 1])
                      - SIntChar('a') + 1]) then
                        x := 1;
                    fi;
                else
                    if SourceOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[i])
                      - SIntChar('a') + 1]) <>
                      SourceOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[i + 1])
                      - SIntChar('A') + 1]) then
                        x := 1;
                    fi;
                fi;
            else
                if SIntChar(input_str[i + 1]) > 96 then
                    if TargetOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[i])
                      - SIntChar('A') + 1]) <>
                      TargetOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[i + 1])
                      - SIntChar('a') + 1]) then
                        x := 1;
                    fi;
                else
                    if TargetOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[i])
                      - SIntChar('A') + 1]) <>
                      SourceOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[i + 1])
                      - SIntChar('A') + 1]) then
                        x := 1;
                    fi;
                fi;
            fi;
        od;
        if x = 0 then
            if SIntChar(input_str[Length(input_str)]) > 96 then
            s := SourceOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[Length(input_str)])
            - SIntChar('a') + 1]);
            else
            s := TargetOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[Length(input_str)])
            - SIntChar('A') + 1]);
            fi;

            if SIntChar(input_str[1]) > 96 then
            t := TargetOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[1])
            - SIntChar('a') + 1]);
            else
            t := SourceOfPath(ArrowsOfQuiver(Q)[SIntChar(input_str[1])
            - SIntChar('A') + 1]);
            fi;
            array := [s, t];
        fi;

        if x = 1 then return false;
        else return true;
        fi;
    end;

    IsValidStringSA := function(A, Q, rho1, input_str)
        local i, j, k, rel, temp, temp_caps, temp1, y, x, l, length, count, num,
        num_digits, lit, sigma, eps, array, rho;
        rho := QPAStringQuiverRho(Q,rho1);
        array := QPAStringSigmaEps(A);
        sigma := array[1];
        eps := array[2];
        num := NumberOfVertices(Q);
        num_digits := 0;
        while num <> 0 do
            num := num - num mod 10;
            num := num/10;
            num_digits := num_digits + 1;
        od;
        y := "0123456789(-,)";
        for i in [1..Length(ArrowsOfQuiver(Q))] do
            y := Concatenation(String(ArrowsOfQuiver(Q)[i]), y);
        od;
        for i in [1..Length(ArrowsOfQuiver(Q))] do
            y := Concatenation([CharInt(SIntChar(String(
            ArrowsOfQuiver(Q)[i])[1]) - 32)], y);
        od;
        for i in [1..Length(input_str)] do
            if not input_str[i] in y then
                return false;
            fi;
        od;
        if input_str[1] = '(' then
            num := 0;
            for j in [2..num_digits + 1] do
                num := num + (SIntChar(input_str[j])
                - SIntChar('0')) * 10^(num_digits - j + 1);
          od;
            if \in(num,[1..NumberOfVertices(Q)]) and input_str[num_digits + 2] =
              ',' and input_str[num_digits + 3] = '1' and
              input_str[num_digits+4] = ')' then
                return true;
            elif \in(num,[1..NumberOfVertices(Q)]) and input_str[num_digits + 2]
              = ',' and input_str[num_digits + 3] = '-' and
              input_str[num_digits + 4] = '1' and
              input_str[num_digits + 5] = ')' then
                return true;
            fi;
        fi;
        for i in [1..14] do
            Unbind(y[Length(y)]);
        od;

        count := 0;
        if Length(input_str) > 2 then
            for i in [1..Length(input_str) - 2] do
            if input_str[i] = '-' and input_str[i + 1] = '1' and
              \in(input_str[i+2],y) then
                if SIntChar(input_str[i + 2]) > 96 and
                  eps[SIntChar(input_str[i + 2]) - SIntChar('a') + 1] = 1 then
                    return false;
                elif SIntChar(input_str[i + 2]) < 96 and
                  sigma[SIntChar(input_str[i + 2]) - SIntChar('A') + 1] = 1 then
                    return false;
                else
                    for j in [i..Length(input_str) - 2] do
                        input_str[j] := input_str[j + 2];
                    od;
                    count := count + 2;
                fi;
                if input_str[i + 1] = '1' then input_str[i + 1] := '2';
                fi;
            fi;
            od;
        fi;

        if Length(input_str) > 1 then
        for i in [1..Length(input_str) - 1] do
            if input_str[i] = '1' and \in(input_str[i + 1], y) then
                if SIntChar(input_str[i + 1]) > 96 and
                  eps[SIntChar(input_str[i + 1]) - SIntChar('a') + 1] = -1 then
                    return false;
                elif SIntChar(input_str[i + 1]) < 96 and
                  sigma[SIntChar(input_str[i + 1]) - SIntChar('A') + 1]= -1 then
                    return false;
                else
                    for j in [i..Length(input_str) - 1] do
                        input_str[j] := input_str[j + 1];
                    od;
                    count := count + 1;
                fi;
            fi;
        od;
        fi;

        if Length(input_str) > 1 then
            if input_str[Length(input_str) - 1] = '-'
              and input_str[Length(input_str)] = '1' and
              \in(input_str[Length(input_str) - 2], y) then
                if SIntChar(input_str[Length(input_str) - 2]) > 96 and
                  sigma[SIntChar(input_str[Length(input_str) - 2]) -
                  SIntChar('a') + 1] = -1 then
                    return false;
                elif SIntChar(input_str[Length(input_str)-2]) < 96 and
                  eps[SIntChar(input_str[Length(input_str) - 2]) -
                  SIntChar('A') + 1] = -1 then
                    return false;
                else count := count + 2;
                fi;
            elif input_str[Length(input_str)] = '1' and
              \in(input_str[Length(input_str) - 1], y) then
                if SIntChar(input_str[Length(input_str) - 1]) > 96 and
                  sigma[SIntChar(input_str[Length(input_str) - 1]) -
                  SIntChar('a') + 1] = 1 then
                    return false;
                elif SIntChar(input_str[Length(input_str) - 1]) < 96 and
                  eps[SIntChar(input_str[Length(input_str) - 1]) -
                  SIntChar('A') + 1] = 1 then
                    return false;
                else
                    count := count + 1;
                fi;
            fi;
        fi;

        for i in [1..count] do
            Unbind(input_str[Length(input_str)]);
        od;

        for i in [1..Length(input_str)] do
            if not input_str[i] in y then
                return false;
            fi;
        od;

        if IsReducedWalk(Q, input_str) = 0 then return false;
        fi;

        if IsValidWalk(Q, input_str) = false then
            return false;
        fi;

        x := 0;
        for i in [1..Length(rho)] do
            temp := "";
            temp_caps := "";
            rel := WalkOfPath(rho[i]);
            for j in [1..Length(rel)] do
                temp := Concatenation(String(rel[j]), temp);
            od;
            for j in [1..Length(rel)] do
                temp1 := CharSInt(SIntChar(String(rel[j])[1]) - 32);
                temp_caps[j] := temp1;
            od;

            l := Length(input_str)-Length(temp);

            for j in [0..l] do
                for k in [1..Length(temp)] do
                    if input_str[j + k] <> temp[k] then
                        break;
                    fi;
                od;
                if k = Length(temp) and input_str[j + k] = temp[k] then
                    x := 3;
                    break;
                fi;
            od;
            for j in [0..l] do
                for k in [1..Length(temp_caps)] do
                    if input_str[j + k] <> temp_caps[k] then
                        break;
                    fi;
                od;
                if k = Length(temp_caps) and input_str[j +k] = temp_caps[k] then
                    x := 3;
                    break;
                fi;
            od;
        od;

        if x=0 then return true;
        else return false;
        fi;
    end;

    return IsValidStringSA(A, Q, rho, input_str);
end
);

InstallGlobalFunction( QPAStringDirectLeft,
  function(A, input_str, sigma, eps)
    local Q, x, y, z, temp, output, num, num_digits, j, temp3;
    output := IsValidString(A, input_str);
    #if output <> "Valid Positive Length String" then
    #       return output;
    #fi;
    Q := QuiverOfPathAlgebra(A);
    if output = true and input_str[1] = '(' then
        num := NumberOfVertices(Q);
        num_digits := 0;
        while num <> 0 do
            num := num - num mod 10;
            num := num/10;
            num_digits := num_digits + 1;
        od;
        num := 0;
        for j in [2..num_digits + 1] do
            num := num +
            (SIntChar(input_str[j]) - SIntChar('0')) * 10^(num_digits - j + 1);
        od;

        temp := OutgoingArrowsOfVertex(VerticesOfQuiver(Q)[num]);
        if input_str[num_digits + 3] = '1' then
            if Length(temp) = 1 and
              sigma[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = -1 then
                z := String(temp[1]);
            elif Length(temp) = 2 then
                if sigma[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = -1 then
                    z := String(temp[1]);
                else
                    z := String(temp[2]);
                fi;
            else z := "Cannot Perform The Operation";
            fi;
            return z;
        elif input_str[num_digits + 3] = '-' then
            if Length(temp) = 1 and
              sigma[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = 1 then
                z := String(temp[1]);
            elif Length(temp) = 2 then
                if sigma[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = 1 then
                    z := String(temp[1]);
                else
                    z := String(temp[2]);
                fi;
            else z := "Cannot Perform The Operation";
            fi;
            return z;
        fi;
    fi;

    if SIntChar(input_str[1]) > 96 then
        x := SIntChar(String(TargetOfPath(ArrowsOfQuiver(Q)[
        SIntChar(input_str[1]) - SIntChar('a') + 1]))[2]) - SIntChar('0');

        temp3 := OutgoingArrowsOfVertex(VerticesOfQuiver(Q)[x]);

        if Length(temp3) = 2 then
            z := [String(temp3[1])[1]];
            Append(z, input_str);
            if IsValidString(A, z) = false then
                z := [String(temp3[2])[1]];
                Append(z, input_str);
                if IsValidString(A, z) = false then
                    return "Cannot Perform The Operation";
                fi;
            fi;
        elif Length(temp3) = 1 then
            z := [String(temp3[1])[1]];
            Append(z, input_str);
            if IsValidString(A, z) = false then
                return "Cannot Perform The Operation";
            fi;
        else return "Cannot Perform The Operation";
        fi;
    else
        x := SIntChar(String(SourceOfPath(ArrowsOfQuiver(Q)[
        SIntChar(input_str[1]) - SIntChar('A') + 1]))[2]) - SIntChar('0');

        temp3 := OutgoingArrowsOfVertex(VerticesOfQuiver(Q)[x]);

        if Length(temp3) = 2 then
            if SIntChar(String(temp3[1])[1])
              - SIntChar(input_str[1]) = 32 then
                y := String(temp3[2])[1];
            else
                y := String(temp3[1])[1];
            fi;
            z := [y];
            Append(z, input_str);
            if IsValidString(A, z) = false then
                return "Cannot Perform The Operation";
            fi;
        else
            return "Cannot Perform The Operation";
        fi;
    fi;
    return z;
end
);

InstallGlobalFunction( QPAStringInverseLeft,
  function(A, input_str, sigma, eps)
    local Q, x, y, z, temp, output, num, num_digits, j, temp2;
    output := IsValidString(A, input_str);
    #if output = "Valid Positive Length String" then
    #  return output;
    #fi;
    Q := QuiverOfPathAlgebra(A);
    if output = true and input_str[1] = '(' then
        num := NumberOfVertices(Q);
        num_digits := 0;
        while num <> 0 do
            num := num - num mod 10;
            num := num/10;
            num_digits := num_digits + 1;
        od;
        num := 0;
        for j in [2..num_digits + 1] do
            num := num +
            (SIntChar(input_str[j]) - SIntChar('0')) * 10^(num_digits - j + 1);
        od;
        temp := IncomingArrowsOfVertex(VerticesOfQuiver(Q)[num]);
        if input_str[num_digits + 3] = '1' then
            if Length(temp) = 1 and eps[SIntChar(String(temp[1])[1])
              - SIntChar('a') + 1] = -1 then
                z := [CharInt(SIntChar(String(temp[1])[1]) - 32)];
            elif Length(temp) = 2 then
                if eps[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = -1 then
                    z := [CharInt(SIntChar(String(temp[1])[1]) - 32)];
                else
                    z := [CharInt(SIntChar(String(temp[2])[1]) - 32)];
                fi;
            else z := "Cannot Perform The Operation";
            fi;
            return z;
        elif input_str[num_digits + 3] = '-' then
            if Length(temp) = 1 and
              eps[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = 1 then
                z := [CharInt(SIntChar(String(temp[1])[1]) - 32)];
            elif Length(temp) = 2 then
                if eps[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = 1 then
                    z := [CharInt(SIntChar(String(temp[1])[1]) - 32)];
                else
                    z := [CharInt(SIntChar(String(temp[2])[1]) - 32)];
                fi;
            else z := "Cannot Perform The Operation";
            fi;
            return z;
        fi;
    fi;

    if SIntChar(input_str[1]) > 96 then
        x := SIntChar(String(TargetOfPath(ArrowsOfQuiver(Q)[
        SIntChar(input_str[1]) - SIntChar('a') + 1]))[2]) - SIntChar('0');

        temp2 := IncomingArrowsOfVertex(VerticesOfQuiver(Q)[x]);

        if Length(temp2) = 2 then
            if String(temp2[1])[1] = input_str[1] then
                y := String(temp2[2])[1];
            else
                y := String(temp2[1])[1];
            fi;
            z := [CharInt(SIntChar(y) - 32)];
            Append(z, input_str);
            if IsValidString(A, z) = false then
                return "Cannot Perform The Operation";
            fi;
        else
            return "Cannot Perform The Operation";
        fi;
    else
        x := SIntChar(String(SourceOfPath(ArrowsOfQuiver(Q)[
        SIntChar(input_str[1]) - SIntChar('A') + 1]))[2]) - SIntChar('0');

        temp2 := IncomingArrowsOfVertex(VerticesOfQuiver(Q)[x]);

        if Length(temp2) = 2 then
            z := [CharInt(SIntChar(String(temp2[1])[1]) - 32)];
            Append(z, input_str);
            if IsValidString(A, z) = false then
                z := [CharInt(SIntChar(String(temp2[2])[1]) - 32)];
                Append(z, input_str);
                if IsValidString(A, z) = false then
                    return "Cannot Perform The Operation";
                fi;
            fi;
        elif Length(temp2) = 1 then
            z := [CharInt(SIntChar(String(temp2[1])[1]) - 32)];
            Append(z, input_str);
            if IsValidString(A, z) = false then
                return "Cannot Perform The Operation";
            fi;
        else return "Cannot Perform The Operation";
        fi;
    fi;
    return z;
end
);

InstallGlobalFunction( QPAStringDirectRight,
  function(A, input_str, sigma, eps)
    local Q, x, y, z, temp, output, i, num, num_digits, j, temp2;
    #if IsValidString(Q,rho,input_str) = false then
    #return false;
    #fi;
    output := IsValidString(A, input_str);
    Q := QuiverOfPathAlgebra(A);

    if output = true and input_str[1] = '(' then
        num := NumberOfVertices(Q);
        num_digits := 0;
        while num <> 0 do
            num := num - num mod 10;
            num := num/10;
            num_digits := num_digits + 1;
        od;
        num := 0;
        for j in [2..num_digits+1] do
            num := num +
            (SIntChar(input_str[j])-SIntChar('0')) * 10^(num_digits -j + 1);
        od;
        temp := IncomingArrowsOfVertex(VerticesOfQuiver(Q)[num]);
        if input_str[num_digits + 3] = '1' then
            if Length(temp) = 1 and eps[SIntChar(String(temp[1])[1])
              - SIntChar('a')+1] = 1 then
                z := temp;
            elif Length(temp) = 2 then
                if eps[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = 1
                  then z := String(temp[1]);
                else
                    z := String(temp[2]);
                fi;
            else z := "Cannot Perform The Operation";
            fi;
            return z;
        elif input_str[num_digits + 3] = '-' then
            if Length(temp) = 1 and eps[SIntChar(String(temp[1])[1])
              - SIntChar('a') + 1] = -1 then
                z := String(temp[1]);
            elif Length(temp) = 2 then
                if eps[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = -1
                  then z := String(temp[1]);
                else
                    z := String(temp[2]);
                fi;
            else z := "Cannot Perform The Operation";
            fi;
            return z;
        fi;
    fi;
    #temp := input_str;
    temp := [];
    for i in [1..Length(input_str)] do
        Add(temp, input_str[i]);
    od;
    if SIntChar(temp[Length(temp)]) > 96 then
        x := SIntChar(String(SourceOfPath(ArrowsOfQuiver(Q)[
        SIntChar(temp[Length(temp)]) - SIntChar('a') + 1]))[2])
        - SIntChar('0');
        temp2 := IncomingArrowsOfVertex(VerticesOfQuiver(Q)[x]);
        if Length(temp2) = 2 then
            z := [String(temp2[1])[1]];
            temp := Concatenation(temp, z);
            if IsValidString(A, temp) = false then
                z := [String(temp2[2])[1]];
                temp := input_str;
                temp := Concatenation(temp, z);
                if IsValidString(A, temp) = false then
                    return "Cannot Perform The Operation";
                fi;
            fi;
        elif Length(temp2) = 1 then
            z := [String(temp2[1])[1]];
            temp := Concatenation(temp, z);
            if IsValidString(A, temp) = false then
                return "Cannot Perform The Operation";
            fi;
        else return "Cannot Perform The Operation";
        fi;
    else
        x := SIntChar(String(TargetOfPath(ArrowsOfQuiver(Q)[
        SIntChar(temp[Length(temp)]) - SIntChar('A') + 1]))[2])
        - SIntChar('0');
        temp2 := IncomingArrowsOfVertex(VerticesOfQuiver(Q)[x]);
        if Length(temp2) = 2 then
            if SIntChar(String(temp2[1])[1])
              - SIntChar(temp[Length(temp)]) = 32 then
                y := String(temp2[2])[1];
            else
                y := String(temp2[1])[1];
            fi;
            z := [y];
            temp := Concatenation(temp, z);
            if IsValidString(A, temp) = false then
                return "Cannot Perform The Operation";
            fi;
        else
            return "Cannot Perform The Operation";
        fi;
    fi;
    return temp;
end
);

InstallGlobalFunction( QPAStringInverseRight,
  function(A, input_str, sigma, eps)
    local Q, x, y, z, temp, output, i, num_digits, num, j, temp3;
    #if IsValidString(Q,rho,input_str) = false then
    #  return false;
    #fi;
    output := IsValidString(A, input_str);
    Q := QuiverOfPathAlgebra(A);

    if output = true and input_str[1] = '(' then
        num := NumberOfVertices(Q);
        num_digits := 0;
        while num <> 0 do
            num := num - num mod 10;
            num := num/10;
            num_digits := num_digits + 1;
        od;
        num := 0;
        for j in [2..num_digits + 1] do
            num := num +
            (SIntChar(input_str[j]) - SIntChar('0')) * 10^(num_digits - j + 1);
        od;
        temp := OutgoingArrowsOfVertex(VerticesOfQuiver(Q)[num]);
        if input_str[num_digits + 3] = '1' then
            if Length(temp) = 1 and sigma[SIntChar(String(temp[1])[1])
              - SIntChar('a') + 1] = 1 then
                z := [CharInt(SIntChar(String(temp[1])[1]) - 32)];
            elif Length(temp) = 2 then
                if sigma[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = 1 then
                    z := [CharInt(SIntChar(String(temp[1])[1]) - 32)];
                else
                    z := [CharInt(SIntChar(String(temp[2])[1]) - 32)];
                fi;
            else z := "Cannot Perform The Operation";
            fi;
            return z;
        elif input_str[num_digits + 3] = '-' then
            if Length(temp) = 1 and
              sigma[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = -1 then
                z := [CharInt(SIntChar(String(temp[1])[1]) - 32)];
            elif Length(temp) = 2 then
                if sigma[SIntChar(String(temp[1])[1]) - SIntChar('a') + 1] = -1 then
                    z := [CharInt(SIntChar(String(temp[1])[1]) - 32)];
                else
                    z := [CharInt(SIntChar(String(temp[2])[1]) - 32)];
                fi;
            else z := "Cannot Perform The Operation";
            fi;
            return z;
        fi;
    fi;

    #temp1 := input_str;
    temp := [];
    for i in [1..Length(input_str)] do
        Add(temp,input_str[i]);
    od;
    #temp := input_str;
    #input_str := temp1;
    if SIntChar(temp[Length(temp)]) > 96 then
        x := SIntChar(String(SourceOfPath(ArrowsOfQuiver(Q)[
        SIntChar(temp[Length(temp)]) - SIntChar('a') + 1]))[2]) - SIntChar('0');

        temp3 := OutgoingArrowsOfVertex(VerticesOfQuiver(Q)[x]);

        if Length(temp3) = 2 then
            if String(temp3[1])[1] = temp[Length(temp)] then
                y := String(temp3[2])[1];
            else
                y := String(temp3[1])[1];
            fi;
            z := [CharInt(SIntChar(y) - 32)];
            Append(temp, z);
            if IsValidString(A, temp) = false then
                return "Cannot Perform The Operation";
            fi;
        else
            return "Cannot Perform The Operation";
        fi;
    else
        x := SIntChar(String(TargetOfPath(ArrowsOfQuiver(Q)[
        SIntChar(temp[Length(temp)]) - SIntChar('A') + 1]))[2]) - SIntChar('0');

        temp3 := OutgoingArrowsOfVertex(VerticesOfQuiver(Q)[x]);

        if Length(temp3) = 2 then
            z := [CharInt(SIntChar(String(temp3[1])[1]) - 32)];
            temp := Concatenation(temp, z);
            if IsValidString(A, temp) = false then
                temp := input_str;
                z := [CharInt(SIntChar(String(temp3[2])[1]) - 32)];
                Append(temp, z);
                if IsValidString(A, temp) = false then
                    return "Cannot Perform The Operation";
                fi;
            fi;
        elif Length(temp3) = 1 then
            z := [CharInt(SIntChar(String(temp3[1])[1]) - 32)];
            Append(temp, z);
            if IsValidString(A, temp) = false then
                return "Cannot Perform The Operation";
            fi;
        else return "Cannot Perform The Operation";
        fi;
    fi;
    return temp;
end
);

InstallMethod( LocalARQuiver,
"for stringalgebras and strings",
true,
[ IsAlgebra, IsString ], 0,
function( A, input_str )
    local Q, rho1, rho, vertices, arrows, onerel, tworel, str, arr, temp, temp1,
    temp2, temp3, La, Lb, Ra, Rb, array,
    sigma, eps, k, kQ, rel, arr1, gens, i, j;

    if IsStringAlgebra(A) = false then
      Error("The input algebra is not a string algebra");
      return 0;
    fi;

    Q := QuiverOfPathAlgebra(A);
    rho1 := RelationsOfAlgebra(A);

    vertices := VerticesOfQuiver(Q);
    arrows := ArrowsOfQuiver(Q);

    for i in [1..Length(vertices)] do
      if Length(String(vertices[i])) <> 2 or String(vertices[i])[1] <> 'v' or
        String(vertices[i])[2] <> String(i)[1] then
        Error("The Quiver of A is not acceptable");
        return 0;
      fi;
    od;

    for i in [1..Length(arrows)] do
      if Length(String(arrows[i])) <> 1 or String(arrows[i])[1] <> CharInt(i+96) then
        Error("The Quiver of A is not acceptable");
        return 0;
      fi;
    od;

    rho := [];
    for i in [1..Length(rho1)] do
        onerel := CoefficientsAndMagmaElements(rho1[i]);
        tworel := WalkOfPath(onerel[1]);
        str := Concatenation(List(tworel, a -> String(a)));
        Append(rho, [str]);
    od;

    temp := IsValidString(A, input_str);
    if temp = false then
        Error("The input string is invalid");
    fi;

    array := QPAStringSigmaEps(A);
    sigma := array[1];
    eps := array[2];

    La := function(A, input_str)
        local x,y;
        #output := IsValidString(Q,rho,input_str);
        #if output <> "Valid Positive Length String" and output <> "Valid Zero Length String" then return output;
        #fi;
        x := QPAStringInverseLeft(A, input_str, sigma, eps);
        if x = "Cannot Perform The Operation" then return 0;
        fi;
        while true do
            y := QPAStringDirectLeft(A, x, sigma, eps);
            if y = "Cannot Perform The Operation" then return x;
            else x := y;
            fi;
        od;
    end;

    Lb := function(A, input_str)
        local x, y;
        x := QPAStringDirectLeft(A, input_str, sigma, eps);
        if x = "Cannot Perform The Operation" then return 0;
        fi;
        while true do
            y := QPAStringInverseLeft(A, x, sigma, eps);
            if y = "Cannot Perform The Operation" then return x;
            else x := y;
            fi;
        od;
    end;

    Ra := function(A, input_str)
        local x, y;
        x := QPAStringInverseRight(A, input_str, sigma, eps);
        if x = "Cannot Perform The Operation" then return 0;
        fi;
        while true do
            y := QPAStringDirectRight(A, x, sigma, eps);
            if y = "Cannot Perform The Operation" then return x;
            else x := y;
            fi;
        od;
    end;

    Rb := function(A, input_str)
        local x, y;
        x := QPAStringDirectRight(A, input_str, sigma, eps);
        if x = "Cannot Perform The Operation" then return 0;
        fi;
        while true do
            y := QPAStringInverseRight(A, x, sigma, eps);
            if y = "Cannot Perform The Operation" then return x;
            else x := y;
            fi;
        od;
    end;

    arr := [];
    temp1 := La(A, input_str);
    if temp1 <> 0 then
        Append(arr, [Concatenation
        ("The canonical embedding StringModule(", input_str, ") to StringModule(", temp1, ")")]);
    fi;

    temp1 := Lb(A, input_str);
    if temp1 <> 0 then
        Append(arr, [Concatenation
        ("The canonical projection StringModule(", temp1, ") to StringModule(", input_str, ")")]);
    fi;

    temp1 := Ra(A, input_str);
    if temp1 <> 0 then
        Append(arr, [Concatenation
        ("The canonical projection StringModule(", temp1, ") to StringModule(", input_str, ")")]);
    fi;

    temp1 := Rb(A, input_str);
    if temp1 <> 0 then
        Append(arr, [Concatenation
        ("The canonical embedding StringModule(", input_str, ") to StringModule(", temp1, ")")]);
    fi;
    return arr;
end
);

[ Dauer der Verarbeitung: 0.51 Sekunden  (vorverarbeitet)  ]