Orders and Polytropes: Matrix Algebras from Valuations

Loading necessary packages

[4]:
using Pkg;
Pkg.status()
using Oscar;
      Status `~/.julia/environments/v1.6/Project.toml`
  [c52e3926] Atom v0.12.32
  [7810ee48] Dory v0.1.0 `/Users/maazouz/Dropbox/Dory#master`
  [7073ff75] IJulia v1.23.2
  [c8e1da08] IterTools v1.3.0
  [e5e0dc1b] Juno v0.8.4
  [2edaba10] Nemo v0.22.1
  [f1435218] Oscar v0.5.2
  [d720cf60] Polymake v0.5.6
  [7ef55214] pAdicSolver v0.1.0 `/Users/maazouz/Dropbox/pAdicSolver#padicSolvers`
[5]:
versioninfo()
Julia Version 1.6.2
Commit 1b93d53fc4 (2021-07-14 15:36 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin18.7.0)
  CPU: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-11.0.1 (ORCJIT, skylake)

Defining functions

[4]:
#### Function that returns the inequalities defining the polytrope region P_d.

function polytropeRegionInequalities(d)

    N = d*(d-1)*(d-1) + 2*d

    Ineq = zeros(Integer,(N,1 + d*d))

    row = 1

    for i in 1:d
        for j in 1:d
            for k in 1:d

                if i != j && j != k
                    Ineq[row,1 + (i-1)*d + j] = 1;
                    Ineq[row,1 + (j-1)*d + k] = 1;
                    Ineq[row,1 + (i-1)*d + k] = -1;

                    row = row + 1;
                end

            end
        end
    end;

    for i in 1:d

        Ineq[row,1 + (i-1)*d + i ] = 1
        row = row + 1
        Ineq[row,1 + (i-1)*d + i] = -1
        row = row + 1
    end;

    return Ineq;


end;


#### Function that returns the inequalities defining the truncated polytrope region P_d(M).

function truncatedPolytropeRegionInequalities(M)

    d = size(M)[1]

    N = d*(d-1)*(d-1) + 2*d + d*(d-1)

    Ineq = zeros(Integer,(N,1 + d*d))

    row = 1

    for i in 1:d
        for j in 1:d
            for k in 1:d

                if i != j && j != k
                    Ineq[row,1 + (i-1)*d + j] = 1;
                    Ineq[row,1 + (j-1)*d + k] = 1;
                    Ineq[row,1 + (i-1)*d + k] = -1;

                    row = row + 1;
                end

            end
        end
    end;

    for i in 1:d

        Ineq[row,1 + (i-1)*d + i ] = 1;
        row = row + 1;
        Ineq[row,1 + (i-1)*d + i] = -1;
        row = row + 1;
    end;


    for i in 1:d

        for j in 1:d

            if i!= j

                Ineq[row, 1] = M[i,j];
                Ineq[row, 1 + (i-1)*d + j] = -1;

                row = row + 1;

            end;
        end;
    end;


    return Ineq;

end;


#### Function that returns the inequalities defining the semigroup of fractional ideals .

function SemiGroupInequalities(M)

    d = size(M)[1];

    N = 2*d*d*(d-1)

    Ineq = zeros(Integer,(N + 2,1 + d*d))

    row = 1


    for i in 1:d
        for j in 1:d
            for k in 1:d

                if k != j

                    Ineq[row,1] = M[k,j];
                    Ineq[row,1 + (i-1)*d + j] = -1;
                    Ineq[row,1 + (i-1)*d + k] = 1;
                    row = row + 1

                end

                if k != i
                    Ineq[row,1] = M[i,k];
                    Ineq[row,1 + (i-1)*d + j] = -1;
                    Ineq[row,1 + (k-1)*d + j] = 1;
                    row = row + 1

                end


            end
        end
    end

    Ineq[N+1,2] = 1
    Ineq[N+2,2] = -1

    return Ineq;


end;


#### Function that returns the inequalities defining the polytrope Q_M defined by M.

function QMInequalities(M)

    d = size(M)[1];

    N = d*(d-1)

    Ineq = zeros(Integer,(N + 2, 1 + d))

    row = 1

    for i in 1:d
        for j in 1:d

            if i != j

                Ineq[row,1] = M[i,j];
                Ineq[row,1 + i] = 1;
                Ineq[row,1 + j] = -1;
                row = row + 1

            end
        end
    end

    Ineq[N+1,2] = 1
    Ineq[N+2,2] = -1

    return Ineq;
end;


#### Tropical Min multiplication

function tropMultiply(A,B)

    d = size(A)[1];

    C = zeros(Rational,(d,d))

    for i in 1:d
        for j in 1:d
            C[i,j] = minimum(A[i,:] + B[:,j])
        end
    end

    return C
end;


#### Multiplication in the semigroup \mathcal{Q}_M


function tropMultiplyHomotethy(A,B)

    d = size(A)[1];

    C = zeros(Rational,(d,d))

    for i in 1:d
        for j in 1:d
            C[i,j] = minimum(A[i,:] + B[:,j])
        end
    end

    return C - C[1,1]*ones(Rational, (d,d))
end;



#### Pseudo inverse in the semigroup \mathcal{Q}_M

function invert(M,N)

    d = size(M)[1]
    invN = zeros(Rational, (d,d))

    for i in 1:d
        for j in 1:d

            a = maximum(M[:,j] - N[:,i])
            b = maximum(M[i,:] - N[j,:])

            invN[i,j] = max(a,b)
        end
    end

    return invN;

end;


#### Inverse closure of ideals

function idealClosure(M,N)

    return invert(M,invert(M,N));

end;


#### Computing inverse closed ideals and invertible ideals in the semigroup \mathcal{Q}_M.


function findGandS(M,L)

    N = size(L)[1]
    d = size(M)[1]
    points = []

    for i in 1:N
        points = append!(points, [    transpose(   reshape(L[i,:],(d,d))   )   ]  )
    end


    closed = []
    group = []

    for N in points

        cloN = idealClosure(M,N)

        if(N == cloN)
            closed = append!(closed,[N])
        end
    end


    d = size(M)[1]
    OneMatrix = ones(Rational, (d,d))


    for N in closed

        for A in closed

            NA = tropMultiplyHomotethy(N, A);
            AN = tropMultiplyHomotethy(A, N);

            if( NA == M && AN == M)
                group = append!(group,[N]);
                break;
            end;
        end;
    end;

    return group, closed

end;


#### Describing G as a group of permutations to determine its structure using GAP.

function GroupAsPermutations(G)

    group = Array{PermGroupElem}([])

    for g in G

        elem = Array{Int64}([])

        for h in G

            gh = tropMultiplyHomotethy(g,h)

            index = findall(==(gh), G)
            elem = append!(elem,index)

        end

        group = append!(group,[cperm(elem)])
    end

    return group

end;

Examples

Fractional ideals semi group \(\mathcal{Q}_M\) closed ideals and maximal subgroup elements \(\mathcal{G}_M\).

d = 2:

Example 1

The semigroup \(\mathcal{Q}_{M_1}\) and the group \(\mathcal{G}_{M_1}\) where \(M_1 = \begin{bmatrix}0&1\\1&0\end{bmatrix}\)

[5]:
M = [0 1;
     1 0]

d = size(M)[1]
SemiGroupIneq = SemiGroupInequalities(M);

P = Oscar.Polymake.polytope.Polytope(INEQUALITIES=SemiGroupIneq);
L = P.LATTICE_POINTS_GENERATORS[1][:, 2:d*d + 1];


G , S = findGandS(M,L);


n = size(G)[1]
gens = GroupAsPermutations(G)
Sn = symmetric_group(n)
H = sub(Sn,gens)[1]


println("Groups elements")

for g in G
    println("     ", g, "\n")end


println("\n \n Inverse closed fractional ideals")

for s in S
    println("     ", s, "\n")
end


println("\n\n  Small group identification", small_group_identification(H))



Groups elements
     Polymake.Integer[0 -1; -1 0]

     Polymake.Integer[0 1; 1 0]



 Inverse closed fractional ideals
     Polymake.Integer[0 -1; -1 0]

     Polymake.Integer[0 0; 0 0]

     Polymake.Integer[0 1; 1 0]



  Small group identification(2, 1)

Example 2

The semigroup \(\mathcal{Q}_{M}\) and the group \(\mathcal{G}_{M}\) where \(M=\begin{bmatrix}0&3\\2&0\end{bmatrix}\)

[13]:
M = [0 3;
     2 0]


d = size(M)[1]
SemiGroupIneq = SemiGroupInequalities(M);

P = Oscar.Polymake.polytope.Polytope(INEQUALITIES=SemiGroupIneq);
L = P.LATTICE_POINTS_GENERATORS[1][:, 2:d*d + 1];


G , S = findGandS(M,L);


n = size(G)[1]
gens = GroupAsPermutations(G)
Sn = symmetric_group(n)
H = sub(Sn,gens)[1]


println("Groups elements")

for g in G
    println("     ", g, "\n")end


println("\n \n Inverse closed fractional ideals")

for s in S
    println("     ", s, "\n")
end


println("\n\n  Small group identification", small_group_identification(H))

Groups elements
     Polymake.Integer[0 -2; -3 0]

     Polymake.Integer[0 3; 2 0]



 Inverse closed fractional ideals
     Polymake.Integer[0 -2; -3 0]

     Polymake.Integer[0 -1; -2 0]

     Polymake.Integer[0 0; -1 0]

     Polymake.Integer[0 1; 0 0]

     Polymake.Integer[0 2; 1 0]

     Polymake.Integer[0 3; 2 0]



  Small group identification(2, 1)

d = 3:

Example 3

The semigroup \(\mathcal{Q}_{M_3}\) and the group \(\mathcal{G}_{M_3}\) where \(M_3 = \begin{bmatrix}0&1&1\\1&0&1\\1&1&0\end{bmatrix}\)

[18]:
M = [0 1 1;
     1 0 1;
     1 1 0];

d = size(M)[1];
SemiGroupIneq = SemiGroupInequalities(M);

P = Oscar.Polymake.polytope.Polytope(INEQUALITIES=SemiGroupIneq);
L = P.LATTICE_POINTS_GENERATORS[1][:, 2:d*d + 1];


G , S = findGandS(M,L);


n = size(G)[1];
gens = GroupAsPermutations(G);
Sn = symmetric_group(n);
H = sub(Sn,gens)[1];


println("Groups elements")

for g in G
    println("     ", g, "\n")end


println("\n \n Inverse closed fractional ideals")

for s in S
    println("     ", s, "\n")
end


#println("\n\n  Small group identification", small_group_identification(H))
Groups elements
     Polymake.Integer[0 -1 0; -1 0 0; 0 0 -1]

     Polymake.Integer[0 -1 0; 0 0 -1; -1 0 0]

     Polymake.Integer[0 0 -1; -1 0 0; 0 -1 0]

     Polymake.Integer[0 0 -1; 0 -1 0; -1 0 0]

     Polymake.Integer[0 1 1; 1 0 1; 1 1 0]

     Polymake.Integer[0 1 1; 1 1 0; 1 0 1]



 Inverse closed fractional ideals
     Polymake.Integer[0 -1 -1; -1 0 0; 0 -1 -1]

     Polymake.Integer[0 -1 -1; 0 -1 -1; -1 0 0]

     Polymake.Integer[0 -1 -1; 0 0 0; 0 0 0]

     Polymake.Integer[0 -1 0; -1 0 -1; -1 0 -1]

     Polymake.Integer[0 -1 0; -1 0 0; 0 0 -1]

     Polymake.Integer[0 -1 0; 0 -1 0; 0 0 0]

     Polymake.Integer[0 -1 0; 0 0 -1; -1 0 0]

     Polymake.Integer[0 -1 0; 0 0 0; 0 -1 0]

     Polymake.Integer[0 -1 0; 0 0 0; 0 0 0]

     Polymake.Integer[0 0 -1; -1 -1 0; -1 -1 0]

     Polymake.Integer[0 0 -1; -1 0 0; 0 -1 0]

     Polymake.Integer[0 0 -1; 0 -1 0; -1 0 0]

     Polymake.Integer[0 0 -1; 0 0 -1; 0 0 0]

     Polymake.Integer[0 0 -1; 0 0 0; 0 0 -1]

     Polymake.Integer[0 0 -1; 0 0 0; 0 0 0]

     Polymake.Integer[0 0 0; -1 -1 0; 0 0 0]

     Polymake.Integer[0 0 0; -1 0 -1; 0 0 0]

     Polymake.Integer[0 0 0; -1 0 0; -1 0 0]

     Polymake.Integer[0 0 0; -1 0 0; 0 0 0]

     Polymake.Integer[0 0 0; 0 -1 -1; 0 0 0]

     Polymake.Integer[0 0 0; 0 -1 0; 0 -1 0]

     Polymake.Integer[0 0 0; 0 -1 0; 0 0 0]

     Polymake.Integer[0 0 0; 0 0 -1; 0 0 -1]

     Polymake.Integer[0 0 0; 0 0 -1; 0 0 0]

     Polymake.Integer[0 0 0; 0 0 0; -1 -1 0]

     Polymake.Integer[0 0 0; 0 0 0; -1 0 -1]

     Polymake.Integer[0 0 0; 0 0 0; -1 0 0]

     Polymake.Integer[0 0 0; 0 0 0; 0 -1 -1]

     Polymake.Integer[0 0 0; 0 0 0; 0 -1 0]

     Polymake.Integer[0 0 0; 0 0 0; 0 0 -1]

     Polymake.Integer[0 0 0; 0 0 0; 0 0 0]

     Polymake.Integer[0 0 1; 0 0 1; 1 1 0]

     Polymake.Integer[0 0 1; 1 1 0; 0 0 1]

     Polymake.Integer[0 0 1; 1 1 1; 1 1 1]

     Polymake.Integer[0 1 0; 0 1 0; 1 0 1]

     Polymake.Integer[0 1 0; 1 0 1; 0 1 0]

     Polymake.Integer[0 1 0; 1 1 1; 1 1 1]

     Polymake.Integer[0 1 1; 0 1 1; 1 1 1]

     Polymake.Integer[0 1 1; 1 0 0; 1 0 0]

     Polymake.Integer[0 1 1; 1 0 1; 1 1 0]

     Polymake.Integer[0 1 1; 1 1 0; 1 0 1]

     Polymake.Integer[0 1 1; 1 1 1; 0 1 1]

     Polymake.Integer[0 1 1; 1 1 1; 1 1 1]

Example 4

The semigroup \(\mathcal{Q}_{M}\) and the group \(\mathcal{G}_{M}\) where \(M = \begin{bmatrix}0&1&1\\0&0&1\\0&0&0\end{bmatrix}\)

[15]:
M = [0 1 1;
     0 0 1;
     0 0 0];

d = size(M)[1];
SemiGroupIneq = SemiGroupInequalities(M);

P = Oscar.Polymake.polytope.Polytope(INEQUALITIES=SemiGroupIneq);
L = P.LATTICE_POINTS_GENERATORS[1][:, 2:d*d + 1];


G , S = findGandS(M,L);


n = size(G)[1];
gens = GroupAsPermutations(G);
Sn = symmetric_group(n);
H = sub(Sn,gens)[1];


println("Groups elements")

for g in G
    println("     ", g, "\n")end


println("\n \n Inverse closed fractional ideals")

for s in S
    println("     ", s, "\n")
end


println("\n\n  Small group identification", small_group_identification(H))
Groups elements
     Polymake.Integer[0 0 0; -1 0 0; -1 -1 0]

     Polymake.Integer[0 0 1; 0 0 0; -1 0 0]

     Polymake.Integer[0 1 1; 0 0 1; 0 0 0]



 Inverse closed fractional ideals
     Polymake.Integer[0 0 0; -1 -1 0; -1 -1 0]

     Polymake.Integer[0 0 0; -1 0 0; -1 -1 -1]

     Polymake.Integer[0 0 0; -1 0 0; -1 -1 0]

     Polymake.Integer[0 0 0; 0 0 0; -1 0 0]

     Polymake.Integer[0 0 1; -1 0 0; -1 0 0]

     Polymake.Integer[0 0 1; 0 0 0; -1 -1 0]

     Polymake.Integer[0 0 1; 0 0 0; -1 0 0]

     Polymake.Integer[0 0 1; 0 0 1; 0 0 0]

     Polymake.Integer[0 1 1; 0 0 0; 0 0 0]

     Polymake.Integer[0 1 1; 0 0 1; -1 0 0]

     Polymake.Integer[0 1 1; 0 0 1; 0 0 0]

     Polymake.Integer[0 1 1; 0 1 1; 0 0 1]



  Small group identification(3, 1)

d = 4:

Example 5

The semigroup \(\mathcal{Q}_{M}\) and the group \(\mathcal{G}_{M}\) where \(M = \begin{bmatrix}0&1&1&1\\0&0&1&1\\0&0&0&1\\0&0&0&0\end{bmatrix}\)

[16]:
M = [0 1 1 1;
     0 0 1 1;
     0 0 0 1;
     0 0 0 0]

d = size(M)[1];
SemiGroupIneq = SemiGroupInequalities(M);

P = Oscar.Polymake.polytope.Polytope(INEQUALITIES=SemiGroupIneq);
L = P.LATTICE_POINTS_GENERATORS[1][:, 2:d*d + 1];


G , S = findGandS(M,L);


n = size(G)[1];
gens = GroupAsPermutations(G);
Sn = symmetric_group(n);
H = sub(Sn,gens)[1];


println("Groups elements")

for g in G
    println("     ", g, "\n")end


println("\n \n Inverse closed fractional ideals")

for s in S
    println("     ", s, "\n")
end


println("\n\n  Small group identification", small_group_identification(H))
Groups elements
     Polymake.Integer[0 0 0 0; -1 0 0 0; -1 -1 0 0; -1 -1 -1 0]

     Polymake.Integer[0 0 0 1; 0 0 0 0; -1 0 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 1 1; 0 0 0 1; 0 0 0 0; -1 0 0 0]

     Polymake.Integer[0 1 1 1; 0 0 1 1; 0 0 0 1; 0 0 0 0]



 Inverse closed fractional ideals
     Polymake.Integer[0 0 0 0; -1 -1 -1 0; -1 -1 -1 0; -1 -1 -1 0]

     Polymake.Integer[0 0 0 0; -1 -1 0 0; -1 -1 -1 0; -1 -1 -1 0]

     Polymake.Integer[0 0 0 0; -1 -1 0 0; -1 -1 0 0; -1 -1 -1 0]

     Polymake.Integer[0 0 0 0; -1 0 0 0; -1 -1 -1 -1; -1 -1 -1 -1]

     Polymake.Integer[0 0 0 0; -1 0 0 0; -1 -1 -1 0; -1 -1 -1 -1]

     Polymake.Integer[0 0 0 0; -1 0 0 0; -1 -1 -1 0; -1 -1 -1 0]

     Polymake.Integer[0 0 0 0; -1 0 0 0; -1 -1 0 0; -1 -1 -1 -1]

     Polymake.Integer[0 0 0 0; -1 0 0 0; -1 -1 0 0; -1 -1 -1 0]

     Polymake.Integer[0 0 0 0; -1 0 0 0; -1 0 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 0 0; 0 0 0 0; -1 0 0 0; -1 -1 -1 -1]

     Polymake.Integer[0 0 0 0; 0 0 0 0; -1 0 0 0; -1 -1 -1 0]

     Polymake.Integer[0 0 0 0; 0 0 0 0; -1 0 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 0 0; 0 0 0 0; 0 0 0 0; -1 0 0 0]

     Polymake.Integer[0 0 0 1; -1 -1 0 0; -1 -1 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 0 1; -1 0 0 0; -1 -1 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 0 1; -1 0 0 0; -1 0 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 0 1; 0 0 0 0; -1 -1 -1 0; -1 -1 -1 0]

     Polymake.Integer[0 0 0 1; 0 0 0 0; -1 -1 0 0; -1 -1 -1 0]

     Polymake.Integer[0 0 0 1; 0 0 0 0; -1 -1 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 0 1; 0 0 0 0; -1 0 0 0; -1 -1 -1 0]

     Polymake.Integer[0 0 0 1; 0 0 0 0; -1 0 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 0 1; 0 0 0 0; 0 0 0 0; -1 0 0 0]

     Polymake.Integer[0 0 0 1; 0 0 0 1; 0 0 0 0; -1 -1 -1 0]

     Polymake.Integer[0 0 0 1; 0 0 0 1; 0 0 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 0 1; 0 0 0 1; 0 0 0 0; -1 0 0 0]

     Polymake.Integer[0 0 0 1; 0 0 0 1; 0 0 0 1; 0 0 0 0]

     Polymake.Integer[0 0 1 1; -1 0 0 0; -1 0 0 0; -1 0 0 0]

     Polymake.Integer[0 0 1 1; 0 0 0 0; -1 0 0 0; -1 0 0 0]

     Polymake.Integer[0 0 1 1; 0 0 0 0; 0 0 0 0; -1 0 0 0]

     Polymake.Integer[0 0 1 1; 0 0 0 1; -1 -1 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 1 1; 0 0 0 1; -1 0 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 1 1; 0 0 0 1; -1 0 0 0; -1 0 0 0]

     Polymake.Integer[0 0 1 1; 0 0 0 1; 0 0 0 0; -1 -1 0 0]

     Polymake.Integer[0 0 1 1; 0 0 0 1; 0 0 0 0; -1 0 0 0]

     Polymake.Integer[0 0 1 1; 0 0 0 1; 0 0 0 1; 0 0 0 0]

     Polymake.Integer[0 0 1 1; 0 0 1 1; 0 0 0 1; -1 -1 0 0]

     Polymake.Integer[0 0 1 1; 0 0 1 1; 0 0 0 1; -1 0 0 0]

     Polymake.Integer[0 0 1 1; 0 0 1 1; 0 0 0 1; 0 0 0 0]

     Polymake.Integer[0 0 1 1; 0 0 1 1; 0 0 1 1; 0 0 0 1]

     Polymake.Integer[0 1 1 1; 0 0 0 0; 0 0 0 0; 0 0 0 0]

     Polymake.Integer[0 1 1 1; 0 0 0 1; 0 0 0 0; 0 0 0 0]

     Polymake.Integer[0 1 1 1; 0 0 0 1; 0 0 0 1; 0 0 0 0]

     Polymake.Integer[0 1 1 1; 0 0 1 1; -1 0 0 0; -1 0 0 0]

     Polymake.Integer[0 1 1 1; 0 0 1 1; 0 0 0 0; -1 0 0 0]

     Polymake.Integer[0 1 1 1; 0 0 1 1; 0 0 0 0; 0 0 0 0]

     Polymake.Integer[0 1 1 1; 0 0 1 1; 0 0 0 1; -1 0 0 0]

     Polymake.Integer[0 1 1 1; 0 0 1 1; 0 0 0 1; 0 0 0 0]

     Polymake.Integer[0 1 1 1; 0 0 1 1; 0 0 1 1; 0 0 0 1]

     Polymake.Integer[0 1 1 1; 0 1 1 1; 0 0 1 1; -1 0 0 0]

     Polymake.Integer[0 1 1 1; 0 1 1 1; 0 0 1 1; 0 0 0 0]

     Polymake.Integer[0 1 1 1; 0 1 1 1; 0 0 1 1; 0 0 0 1]

     Polymake.Integer[0 1 1 1; 0 1 1 1; 0 1 1 1; 0 0 1 1]



  Small group identification(4, 1)

Example 6: warning: It might take a long time to finish the computation!

The semigroup \(\mathcal{Q}_{M}\) and the group \(\mathcal{G}_{M}\) where $M =

$

[ ]:
M = [0 1 1 1;
     1 0 1 1;
     1 1 0 1;
     1 1 1 0]


d = size(M)[1];
SemiGroupIneq = SemiGroupInequalities(M);

P = Oscar.Polymake.polytope.Polytope(INEQUALITIES=SemiGroupIneq);
L = P.LATTICE_POINTS_GENERATORS[1][:, 2:d*d + 1];


G , S = findGandS(M,L);


n = size(G)[1];
gens = GroupAsPermutations(G);
Sn = symmetric_group(n);
H = sub(Sn,gens)[1];


println("Groups elements")

for g in G
    println("     ", g, "\n")end


println("\n \n Inverse closed fractional ideals")

for s in S
    println("     ", s, "\n")
end

println("\n\n  Small group identification", small_group_identification(H))

Polytrope Region \(\mathcal{P}_d\) and truncated region \(\mathcal{P}_d(M)\)

d = 2

Example 1

[19]:
M = [0 1;
     1 0];

d = size(M)[1];

P_dIneqs = polytropeRegionInequalities(d);
P_dMIneqs = truncatedPolytropeRegionInequalities(M);

P_d = Oscar.Polymake.polytope.Cone(INEQUALITIES=P_dIneqs);
P_dM = Oscar.Polymake.polytope.Polytope(INEQUALITIES=P_dMIneqs);


println("The polytrope region P_2 has f_vector: ",P_d.F_VECTOR)
println("\n \n")
println("The truncated polytrope region P_2(M) has f_vector: ",P_dM.F_VECTOR)
The polytrope region P_2 has f_vector: pm::Vector<pm::Integer>




The truncated polytrope region P_2(M) has f_vector: pm::Vector<pm::Integer>
3 4

d = 3:

Example 2

[23]:
M = [0 1 1;
     1 0 1;
     1 1 0];

d = size(M)[1];

P_dIneqs = polytropeRegionInequalities(d);
P_dMIneqs = truncatedPolytropeRegionInequalities(M);

P_d = Oscar.Polymake.polytope.Cone(INEQUALITIES=P_dIneqs);
P_dF_VECTOR = P_d.F_VECTOR;
P_dRays = P_d.RAYS;




P_dM = Oscar.Polymake.polytope.Polytope(INEQUALITIES=P_dMIneqs);
P_dMF_VECTOR = P_dM.F_VECTOR;
P_dMLatticePoints = P_dM.LATTICE_POINTS_GENERATORS[1][:, 2:d*d + 1];








println("The polytrope region P_3 has f_vector: ",P_dF_VECTOR)

println("\n \n")
println("The polytrope region P_3 has rays: ",P_dRays)

println("\n \n")
println("The truncated polytrope region P_3(M) has f_vector: ",P_dMF_VECTOR)

println("\n \n")
println("The truncated polytrope region P_3(M) has lattice points: ",P_dMLatticePoints)


The polytrope region P_3 has f_vector: pm::Vector<pm::Integer>
5 9 6



The polytrope region P_3 has rays: pm::Matrix<pm::Rational>
0 0 1 2 0 0 1 -1 0 0
0 0 0 1 0 0 1 0 0 0
0 0 1 1 0 0 1 -1 0 0
0 0 1 1 0 0 0 0 0 0
0 0 1 1 0 0 1 0 0 0




The truncated polytrope region P_3(M) has f_vector: pm::Vector<pm::Integer>
36 132 199 151 60 12



The truncated polytrope region P_3(M) has lattice points: pm::Matrix<pm::Integer>
0 -1 -1 1 0 0 1 0 0
0 -1 0 1 0 1 0 -1 0
0 -1 0 1 0 1 1 0 0
0 0 -1 0 0 -1 1 1 0
0 0 -1 1 0 0 1 1 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0
0 0 0 1 0 0 1 0 0
0 0 0 1 0 0 1 1 0
0 0 0 1 0 1 0 0 0
0 0 0 1 0 1 1 0 0
0 0 0 1 0 1 1 1 0
0 0 1 0 0 1 -1 -1 0
0 0 1 0 0 1 0 0 0
0 0 1 0 0 1 1 1 0
0 0 1 1 0 1 0 -1 0
0 0 1 1 0 1 0 0 0
0 0 1 1 0 1 1 0 0
0 0 1 1 0 1 1 1 0
0 1 0 -1 0 -1 0 1 0
0 1 0 0 0 -1 1 1 0
0 1 0 0 0 0 0 1 0
0 1 0 0 0 0 1 1 0
0 1 0 1 0 0 1 1 0
0 1 0 1 0 1 0 1 0
0 1 0 1 0 1 1 1 0
0 1 1 -1 0 0 -1 0 0
0 1 1 -1 0 0 0 1 0
0 1 1 0 0 0 0 0 0
0 1 1 0 0 0 0 1 0
0 1 1 0 0 0 1 1 0
0 1 1 0 0 1 -1 0 0
0 1 1 0 0 1 0 0 0
0 1 1 0 0 1 0 1 0
0 1 1 0 0 1 1 1 0
0 1 1 1 0 0 1 0 0
0 1 1 1 0 0 1 1 0
0 1 1 1 0 1 0 0 0
0 1 1 1 0 1 0 1 0
0 1 1 1 0 1 1 0 0
0 1 1 1 0 1 1 1 0

Example 3

[24]:
M = [0 1 1;
     0 0 1;
     0 0 0];

d = size(M)[1];

P_dIneqs = polytropeRegionInequalities(d);
P_dMIneqs = truncatedPolytropeRegionInequalities(M);

P_d = Oscar.Polymake.polytope.Cone(INEQUALITIES=P_dIneqs);
P_dF_VECTOR = P_d.F_VECTOR;
P_dRays = P_d.RAYS;




P_dM = Oscar.Polymake.polytope.Polytope(INEQUALITIES=P_dMIneqs);
P_dMF_VECTOR = P_dM.F_VECTOR;
P_dMLatticePoints = P_dM.LATTICE_POINTS_GENERATORS[1][:, 2:d*d + 1];






println("The polytrope region P_3 has f_vector: ",P_dF_VECTOR)

println("\n \n")
println("The polytrope region P_3 has rays: ",P_dRays)

println("\n \n")
println("The truncated polytrope region P_3(M) has f_vector: ",P_dMF_VECTOR)

println("\n \n")
println("The truncated polytrope region P_3(M) has lattice points: ",P_dMLatticePoints)

The polytrope region P_3 has f_vector: pm::Vector<pm::Integer>
5 9 6



The polytrope region P_3 has rays: pm::Matrix<pm::Rational>
0 0 1 2 0 0 1 -1 0 0
0 0 0 1 0 0 1 0 0 0
0 0 1 1 0 0 1 -1 0 0
0 0 1 1 0 0 0 0 0 0
0 0 1 1 0 0 1 0 0 0




The truncated polytrope region P_3(M) has f_vector: pm::Vector<pm::Integer>
8 27 49 51 30 9



The truncated polytrope region P_3(M) has lattice points: pm::Matrix<pm::Integer>
0 0 0 0 0 0 0 0 0
0 0 1 0 0 1 -1 -1 0
0 0 1 0 0 1 0 0 0
0 1 1 -1 0 0 -1 0 0
0 1 1 0 0 0 0 0 0
0 1 1 0 0 1 -1 0 0
0 1 1 0 0 1 0 0 0

d = 4:

Example 4

[25]:
M = [0 1 1 1;
     0 0 1 1;
     0 0 0 1;
     0 0 0 0];

d = size(M)[1];

P_dIneqs = polytropeRegionInequalities(d);
P_dMIneqs = truncatedPolytropeRegionInequalities(M);

P_d = Oscar.Polymake.polytope.Cone(INEQUALITIES=P_dIneqs);
P_dF_VECTOR = P_d.F_VECTOR;
P_dRays = P_d.RAYS;




P_dM = Oscar.Polymake.polytope.Polytope(INEQUALITIES=P_dMIneqs);
P_dMF_VECTOR = P_dM.F_VECTOR;
P_dMLatticePoints = P_dM.LATTICE_POINTS_GENERATORS[1][:, 2:d*d + 1];





println("The polytrope region P_3 has f_vector: ",P_dF_VECTOR)

println("\n \n")
println("The polytrope region P_3 has rays: ",P_dRays)

println("\n \n")
println("The truncated polytrope region P_3(M) has f_vector: ",P_dMF_VECTOR)

println("\n \n")
println("The truncated polytrope region P_3(M) has lattice points: ",P_dMLatticePoints)

The polytrope region P_3 has f_vector: pm::Vector<pm::Integer>
37 327 1140 1902 1680 808 204 24



The polytrope region P_3 has rays: pm::Matrix<pm::Rational>
0 0 1 1 1 0 0 0 0 0 1 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 1 1 1 -1 0 0 0 0 1 0 0 0 1 1 0
0 0 1 1 1 -1 0 0 0 0 1 0 1 -1 0 0 0
0 0 1 1 1 -1 0 0 0 0 1 0 0 0 1 0 0
0 0 1 1 1 -1 0 0 0 0 1 0 1 0 1 0 0
0 0 1 1 0 0 0 0 0 0 1 0 0 1 2 1 0
0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 1 0
0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0
0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 1 0
0 0 1 1/2 1 -1/2 0 0 0 0 1 0 1/2 -1/2 1/2 0 0
0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0
0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 0
0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0
0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0
0 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0
0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 1 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1 0 1/2 0 1/2 0 0
0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0
0 0 1 1 1 -1/2 0 0 0 0 1/2 0 1/2 -1/2 1/2 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 0 0 1 1/2 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 1/2 0 1/2 1/2 0
0 0 1 1 1/2 -1/2 0 0 0 0 1/2 0 0 0 1/2 1/2 0
0 0 1 1/2 1 -1/2 0 0 0 0 1/2 0 1/2 -1/2 1/2 0 0
0 0 1 1/2 1 -1/2 0 0 0 0 1/2 0 1/2 -1/2 0 0 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 0 0 1/2 0 0
0 0 1 1/2 1/2 0 0 0 0 0 1/2 0 1/2 0 1/2 0 0
0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0
0 0 1 1/2 1 -1/2 0 0 0 0 1/2 0 1/2 0 1/2 0 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 1/2 0 1/2 0 0
0 0 1 1/2 1/2 0 0 0 0 0 1/2 0 0 0 1/2 1/2 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 0 0 1/2 1/2 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 1/2 -1/2 1/2 0 0




The truncated polytrope region P_3(M) has f_vector: pm::Vector<pm::Integer>
41 481 2674 8573 17473 23827 22264 14310 6233 1772 306 28



The truncated polytrope region P_3(M) has lattice points: pm::Matrix<pm::Integer>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 1 0 0 0 1 -1 -1 -1 0
0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0
0 0 1 1 0 0 1 1 -1 -1 0 0 -1 -1 0 0
0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0
0 0 1 1 0 0 1 1 0 0 0 1 -1 -1 0 0
0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0
0 1 1 1 -1 0 0 0 -1 0 0 0 -1 0 0 0
0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 0 0 0 1 0 0 0 1 -1 0 0 0
0 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0
0 1 1 1 0 0 1 1 -1 0 0 0 -1 0 0 0
0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0
0 1 1 1 0 0 1 1 0 0 0 1 -1 0 0 0
0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0

Example 5

[27]:
M = [0 1 1 1;
     1 0 1 1;
     1 1 0 1;
     1 1 1 0];

d = size(M)[1];

P_dIneqs = polytropeRegionInequalities(d);
P_dMIneqs = truncatedPolytropeRegionInequalities(M);

P_d = Oscar.Polymake.polytope.Cone(INEQUALITIES=P_dIneqs);
P_dF_VECTOR = P_d.F_VECTOR;
P_dRays = P_d.RAYS;




P_dM = Oscar.Polymake.polytope.Polytope(INEQUALITIES=P_dMIneqs);
P_dMF_VECTOR = P_dM.F_VECTOR;
P_dMLatticePoints = P_dM.LATTICE_POINTS_GENERATORS[1][:, 2:d*d + 1];








println("The polytrope region P_4 has f_vector: ",P_dF_VECTOR)

println("\n \n")
println("The polytrope region P_4 has rays: ",P_dRays)

println("\n \n")
println("The truncated polytrope region P_4(M) has f_vector: ",P_dMF_VECTOR)

println("\n \n")
println("The truncated polytrope region P_4(M) has lattice points: ",P_dMLatticePoints)

The polytrope region P_4 has f_vector: pm::Vector<pm::Integer>
37 327 1140 1902 1680 808 204 24



The polytrope region P_4 has rays: pm::Matrix<pm::Rational>
0 0 1 1 1 0 0 0 0 0 1 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 1 1 1 -1 0 0 0 0 1 0 0 0 1 1 0
0 0 1 1 1 -1 0 0 0 0 1 0 1 -1 0 0 0
0 0 1 1 1 -1 0 0 0 0 1 0 0 0 1 0 0
0 0 1 1 1 -1 0 0 0 0 1 0 1 0 1 0 0
0 0 1 1 0 0 0 0 0 0 1 0 0 1 2 1 0
0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 1 0
0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0
0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 1 0
0 0 1 1/2 1 -1/2 0 0 0 0 1 0 1/2 -1/2 1/2 0 0
0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0
0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 0
0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0
0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0
0 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0
0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 1 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1 0 1/2 0 1/2 0 0
0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0
0 0 1 1 1 -1/2 0 0 0 0 1/2 0 1/2 -1/2 1/2 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 0 0 1 1/2 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 1/2 0 1/2 1/2 0
0 0 1 1 1/2 -1/2 0 0 0 0 1/2 0 0 0 1/2 1/2 0
0 0 1 1/2 1 -1/2 0 0 0 0 1/2 0 1/2 -1/2 1/2 0 0
0 0 1 1/2 1 -1/2 0 0 0 0 1/2 0 1/2 -1/2 0 0 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 0 0 1/2 0 0
0 0 1 1/2 1/2 0 0 0 0 0 1/2 0 1/2 0 1/2 0 0
0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0
0 0 1 1/2 1 -1/2 0 0 0 0 1/2 0 1/2 0 1/2 0 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 1/2 0 1/2 0 0
0 0 1 1/2 1/2 0 0 0 0 0 1/2 0 0 0 1/2 1/2 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 0 0 1/2 1/2 0
0 0 1 1/2 1/2 -1/2 0 0 0 0 1/2 0 1/2 -1/2 1/2 0 0




The truncated polytrope region P_4(M) has f_vector: pm::Vector<pm::Integer>
960 15612 82755 219299 341638 337275 218454 93894 26643 4892 558 36



The truncated polytrope region P_4(M) has lattice points: pm::Matrix<pm::Integer>
0 -1 -1 -1 1 0 0 0 1 0 0 0 1 0 0 0
0 -1 -1 0 1 0 0 1 1 0 0 1 0 -1 -1 0
0 -1 -1 0 1 0 0 1 1 0 0 1 1 0 0 0
0 -1 0 -1 1 0 1 0 0 -1 0 -1 1 0 1 0
0 -1 0 -1 1 0 1 0 1 0 0 0 1 0 1 0
0 -1 0 0 1 0 1 1 0 -1 0 0 0 -1 0 0
0 -1 0 0 1 0 1 1 0 -1 0 0 1 0 1 0
0 -1 0 0 1 0 1 1 1 0 0 0 1 0 0 0
0 -1 0 0 1 0 1 1 1 0 0 0 1 0 1 0
0 -1 0 0 1 0 1 1 1 0 0 1 0 -1 0 0
0 -1 0 0 1 0 1 1 1 0 0 1 1 0 0 0
0 -1 0 0 1 0 1 1 1 0 0 1 1 0 1 0
0 0 -1 -1 0 0 -1 -1 1 1 0 0 1 1 0 0
0 0 -1 -1 1 0 0 0 1 1 0 0 1 1 0 0
0 0 -1 0 0 0 -1 0 1 1 0 1 0 0 -1 0
0 0 -1 0 0 0 -1 0 1 1 0 1 1 1 0 0
0 0 -1 0 1 0 0 0 1 1 0 1 1 0 0 0
0 0 -1 0 1 0 0 0 1 1 0 1 1 1 0 0
0 0 -1 0 1 0 0 1 1 1 0 1 0 0 -1 0
0 0 -1 0 1 0 0 1 1 1 0 1 1 0 0 0
0 0 -1 0 1 0 0 1 1 1 0 1 1 1 0 0
0 0 0 -1 0 0 0 -1 0 0 0 -1 1 1 1 0
0 0 0 -1 0 0 0 -1 1 1 0 0 1 1 1 0
0 0 0 -1 1 0 0 0 1 0 0 0 1 1 1 0
0 0 0 -1 1 0 0 0 1 1 0 0 1 1 1 0
0 0 0 -1 1 0 1 0 0 0 0 -1 1 1 1 0
0 0 0 -1 1 0 1 0 1 0 0 0 1 1 1 0
0 0 0 -1 1 0 1 0 1 1 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0
0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0
0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0
0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0
0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0
0 0 0 0 1 0 0 0 1 1 0 0 1 1 0 0
0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0
0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0
0 0 0 0 1 0 0 0 1 1 0 1 1 1 0 0
0 0 0 0 1 0 0 0 1 1 0 1 1 1 1 0
0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0
0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0
0 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0
0 0 0 0 1 0 0 1 1 1 0 1 0 0 0 0
0 0 0 0 1 0 0 1 1 1 0 1 1 0 0 0
0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0
0 0 0 0 1 0 0 1 1 1 0 1 1 1 1 0
0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0
0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0
0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0
0 0 0 0 1 0 1 0 1 0 0 0 1 1 1 0
0 0 0 0 1 0 1 0 1 1 0 0 1 1 1 0
0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0
0 0 0 0 1 0 1 0 1 1 0 1 1 1 1 0
0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0
0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 0
0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0
0 0 0 0 1 0 1 1 1 0 0 0 1 0 1 0
0 0 0 0 1 0 1 1 1 0 0 0 1 1 1 0
0 0 0 0 1 0 1 1 1 0 0 1 0 0 0 0
0 0 0 0 1 0 1 1 1 0 0 1 1 0 0 0
0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 0
0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 0
0 0 0 0 1 0 1 1 1 1 0 0 1 1 0 0
0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 0
0 0 0 0 1 0 1 1 1 1 0 1 0 0 0 0
0 0 0 0 1 0 1 1 1 1 0 1 1 0 0 0
0 0 0 0 1 0 1 1 1 1 0 1 1 0 1 0
0 0 0 0 1 0 1 1 1 1 0 1 1 1 0 0
0 0 0 0 1 0 1 1 1 1 0 1 1 1 1 0
0 0 0 1 0 0 0 1 0 0 0 1 -1 -1 -1 0
0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0
0 0 0 1 0 0 0 1 1 1 0 1 0 0 -1 0
0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0
0 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0
0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 0
0 0 0 1 1 0 0 1 1 0 0 1 0 -1 -1 0
0 0 0 1 1 0 0 1 1 0 0 1 0 0 0 0
0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0
0 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0
0 0 0 1 1 0 0 1 1 1 0 1 0 0 -1 0
0 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0
0 0 0 1 1 0 0 1 1 1 0 1 1 0 0 0
0 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0
0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0
0 0 0 1 1 0 1 1 0 0 0 1 0 -1 0 0
0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0
0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 0
0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 0
0 0 0 1 1 0 1 1 1 0 0 1 0 -1 0 0
0 0 0 1 1 0 1 1 1 0 0 1 0 0 0 0
0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0
0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0
0 0 0 1 1 0 1 1 1 0 0 1 1 1 1 0
0 0 0 1 1 0 1 1 1 1 0 1 0 0 0 0
0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 0
0 0 0 1 1 0 1 1 1 1 0 1 1 0 1 0
0 0 0 1 1 0 1 1 1 1 0 1 1 1 0 0
0 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0
0 0 1 0 0 0 1 0 -1 -1 0 -1 0 0 1 0
0 0 1 0 0 0 1 0 0 0 0 -1 1 1 1 0
0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0
0 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0
0 0 1 0 0 0 1 0 1 1 0 0 1 1 1 0
0 0 1 0 0 0 1 0 1 1 0 1 0 0 1 0
0 0 1 0 0 0 1 0 1 1 0 1 1 1 1 0
0 0 1 0 1 0 1 0 0 -1 0 -1 1 0 1 0
0 0 1 0 1 0 1 0 0 0 0 -1 1 1 1 0
0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0
0 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0
0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0
0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0
0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0
0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0
0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 0
0 0 1 0 1 0 1 1 0 -1 0 0 0 0 1 0
0 0 1 0 1 0 1 1 0 -1 0 0 1 0 1 0
0 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0
0 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0
0 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0
0 0 1 0 1 0 1 1 1 0 0 0 1 0 1 0
0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0
0 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0
0 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0
0 0 1 0 1 0 1 1 1 0 0 1 1 1 1 0
0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0
0 0 1 0 1 0 1 1 1 1 0 1 0 0 1 0
0 0 1 0 1 0 1 1 1 1 0 1 1 0 1 0
0 0 1 0 1 0 1 1 1 1 0 1 1 1 1 0
0 0 1 1 0 0 1 1 -1 -1 0 0 -1 -1 0 0
0 0 1 1 0 0 1 1 -1 -1 0 0 0 0 1 0
0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0
0 0 1 1 0 0 1 1 0 0 0 0 0 0 1 0
0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0
0 0 1 1 0 0 1 1 0 0 0 1 -1 -1 0 0
0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0
0 0 1 1 0 0 1 1 0 0 0 1 0 0 1 0
0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0
0 0 1 1 0 0 1 1 1 1 0 0 1 1 1 0
0 0 1 1 0 0 1 1 1 1 0 1 0 0 0 0
0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0
0 0 1 1 0 0 1 1 1 1 0 1 1 1 0 0
0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 0
0 0 1 1 1 0 1 1 0 -1 0 0 0 -1 0 0
0 0 1 1 1 0 1 1 0 -1 0 0 0 0 1 0
0 0 1 1 1 0 1 1 0 -1 0 0 1 0 1 0
0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0
0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0
0 0 1 1 1 0 1 1 0 0 0 0 1 0 1 0
0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 0
0 0 1 1 1 0 1 1 0 0 0 1 0 -1 0 0
0 0 1 1 1 0 1 1 0 0 0 1 0 0 0 0
0 0 1 1 1 0 1 1 0 0 0 1 0 0 1 0
0 0 1 1 1 0 1 1 0 0 0 1 1 0 1 0
0 0 1 1 1 0 1 1 0 0 0 1 1 1 1 0
0 0 1 1 1 0 1 1 1 0 0 0 1 0 0 0
0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 0
0 0 1 1 1 0 1 1 1 0 0 0 1 1 1 0
0 0 1 1 1 0 1 1 1 0 0 1 0 -1 0 0
0 0 1 1 1 0 1 1 1 0 0 1 0 0 0 0
0 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0
0 0 1 1 1 0 1 1 1 0 0 1 1 0 0 0
0 0 1 1 1 0 1 1 1 0 0 1 1 0 1 0
0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0
0 0 1 1 1 0 1 1 1 1 0 0 1 1 0 0
0 0 1 1 1 0 1 1 1 1 0 0 1 1 1 0
0 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0
0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0
0 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0
0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0
0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0
0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0
0 1 0 0 -1 0 -1 -1 0 1 0 0 0 1 0 0
0 1 0 0 0 0 -1 -1 1 1 0 0 1 1 0 0
0 1 0 0 0 0 -1 0 1 1 0 1 0 1 0 0
0 1 0 0 0 0 -1 0 1 1 0 1 1 1 0 0
0 1 0 0 0 0 0 -1 0 1 0 0 1 1 1 0
0 1 0 0 0 0 0 -1 1 1 0 0 1 1 1 0
0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
0 1 0 0 0 0 0 0 0 1 0 0 1 1 1 0
0 1 0 0 0 0 0 0 1 1 0 0 1 1 0 0
0 1 0 0 0 0 0 0 1 1 0 0 1 1 1 0
0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0
0 1 0 0 0 0 0 0 1 1 0 1 1 1 0 0
0 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0
0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0
0 1 0 0 1 0 0 0 1 1 0 0 1 1 1 0
0 1 0 0 1 0 0 0 1 1 0 1 1 1 0 0
0 1 0 0 1 0 0 0 1 1 0 1 1 1 1 0
0 1 0 0 1 0 0 1 1 1 0 1 0 1 0 0
0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0
0 1 0 0 1 0 0 1 1 1 0 1 1 1 1 0
0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 0
0 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0
0 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0
0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0
0 1 0 0 1 0 1 1 0 1 0 0 1 1 1 0
0 1 0 0 1 0 1 1 1 1 0 0 1 1 0 0
0 1 0 0 1 0 1 1 1 1 0 0 1 1 1 0
0 1 0 0 1 0 1 1 1 1 0 1 0 1 0 0
0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0
0 1 0 0 1 0 1 1 1 1 0 1 1 1 1 0
0 1 0 1 -1 0 -1 0 0 1 0 1 -1 0 -1 0
0 1 0 1 -1 0 -1 0 0 1 0 1 0 1 0 0
0 1 0 1 0 0 -1 0 1 1 0 1 0 0 -1 0
0 1 0 1 0 0 -1 0 1 1 0 1 0 1 0 0
0 1 0 1 0 0 -1 0 1 1 0 1 1 1 0 0
0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0
0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0
0 1 0 1 0 0 0 0 0 1 0 1 1 1 1 0
0 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0
0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0
0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 0
0 1 0 1 0 0 0 0 1 1 0 1 1 1 1 0
0 1 0 1 0 0 0 1 0 1 0 1 -1 0 -1 0
0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0
0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0
0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 0
0 1 0 1 0 0 0 1 1 1 0 1 0 0 -1 0
0 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0
0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 0
0 1 0 1 0 0 0 1 1 1 0 1 1 1 0 0
0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0
0 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0
0 1 0 1 1 0 0 0 1 1 0 1 1 1 0 0
0 1 0 1 1 0 0 0 1 1 0 1 1 1 1 0
0 1 0 1 1 0 0 1 1 1 0 1 0 0 -1 0
0 1 0 1 1 0 0 1 1 1 0 1 0 0 0 0
0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 0
0 1 0 1 1 0 0 1 1 1 0 1 1 0 0 0
0 1 0 1 1 0 0 1 1 1 0 1 1 1 0 0
0 1 0 1 1 0 0 1 1 1 0 1 1 1 1 0
0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0
0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 0
0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0
0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0
0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0
0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0
0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0
0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0
0 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0
0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0
0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 0
0 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0
0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 0
0 1 0 1 1 0 1 1 1 1 0 1 1 1 1 0
0 1 1 0 -1 0 0 -1 -1 0 0 -1 0 1 1 0
0 1 1 0 -1 0 0 -1 0 1 0 0 0 1 1 0
0 1 1 0 0 0 0 -1 0 0 0 -1 1 1 1 0
0 1 1 0 0 0 0 -1 0 1 0 0 1 1 1 0
0 1 1 0 0 0 0 -1 1 1 0 0 1 1 1 0
0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0
0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0
0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 0
0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0
0 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0
0 1 1 0 0 0 0 0 1 1 0 1 0 1 1 0
0 1 1 0 0 0 0 0 1 1 0 1 1 1 1 0
0 1 1 0 0 0 1 0 -1 0 0 -1 0 1 1 0
0 1 1 0 0 0 1 0 0 0 0 -1 1 1 1 0
0 1 1 0 0 0 1 0 0 0 0 0 0 1 1 0
0 1 1 0 0 0 1 0 0 0 0 0 1 1 1 0
0 1 1 0 0 0 1 0 0 1 0 0 0 1 1 0
0 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0
0 1 1 0 0 0 1 0 1 1 0 0 1 1 1 0
0 1 1 0 0 0 1 0 1 1 0 1 0 1 1 0
0 1 1 0 0 0 1 0 1 1 0 1 1 1 1 0
0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 0
0 1 1 0 1 0 0 0 1 1 0 0 1 1 1 0
0 1 1 0 1 0 0 0 1 1 0 1 1 1 1 0
0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0
0 1 1 0 1 0 0 1 1 0 0 1 1 1 1 0
0 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0
0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 0
0 1 1 0 1 0 1 0 0 0 0 -1 1 1 1 0
0 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0
0 1 1 0 1 0 1 0 0 1 0 0 1 1 1 0
0 1 1 0 1 0 1 0 1 0 0 0 1 1 1 0
0 1 1 0 1 0 1 0 1 1 0 0 1 1 1 0
0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 0
0 1 1 0 1 0 1 1 0 0 0 0 0 1 1 0
0 1 1 0 1 0 1 1 0 0 0 0 1 1 1 0
0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0
0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0
0 1 1 0 1 0 1 1 1 0 0 0 1 1 1 0
0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 0
0 1 1 0 1 0 1 1 1 0 0 1 1 1 1 0
0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0
0 1 1 0 1 0 1 1 1 1 0 1 0 1 1 0
0 1 1 0 1 0 1 1 1 1 0 1 1 1 1 0
0 1 1 1 -1 0 0 0 -1 0 0 0 -1 0 0 0
0 1 1 1 -1 0 0 0 -1 0 0 0 0 1 1 0
0 1 1 1 -1 0 0 0 0 1 0 0 0 1 0 0
0 1 1 1 -1 0 0 0 0 1 0 0 0 1 1 0
0 1 1 1 -1 0 0 0 0 1 0 1 -1 0 0 0
0 1 1 1 -1 0 0 0 0 1 0 1 0 1 0 0
0 1 1 1 -1 0 0 0 0 1 0 1 0 1 1 0
0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0
0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0
0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0
0 1 1 1 0 0 0 0 0 1 0 0 0 1 1 0
0 1 1 1 0 0 0 0 0 1 0 0 1 1 1 0
0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0
0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0
0 1 1 1 0 0 0 0 0 1 0 1 0 1 1 0
0 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0
0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0
0 1 1 1 0 0 0 0 1 1 0 0 1 1 1 0
0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 0
0 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0
0 1 1 1 0 0 0 0 1 1 0 1 0 1 1 0
0 1 1 1 0 0 0 0 1 1 0 1 1 1 0 0
0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
0 1 1 1 0 0 0 1 0 0 0 1 -1 0 0 0
0 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0
0 1 1 1 0 0 0 1 0 0 0 1 0 1 1 0
0 1 1 1 0 0 0 1 0 0 0 1 1 1 1 0
0 1 1 1 0 0 0 1 0 1 0 1 -1 0 0 0
0 1 1 1 0 0 0 1 0 1 0 1 0 0 0 0
0 1 1 1 0 0 0 1 0 1 0 1 0 1 0 0
0 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0
0 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0
0 1 1 1 0 0 0 1 1 1 0 1 0 0 0 0
0 1 1 1 0 0 0 1 1 1 0 1 0 1 0 0
0 1 1 1 0 0 0 1 1 1 0 1 0 1 1 0
0 1 1 1 0 0 0 1 1 1 0 1 1 1 0 0
0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 0
0 1 1 1 0 0 1 0 -1 0 0 0 0 0 1 0
0 1 1 1 0 0 1 0 -1 0 0 0 0 1 1 0
0 1 1 1 0 0 1 0 0 0 0 0 0 0 1 0
0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 0
0 1 1 1 0 0 1 0 0 0 0 0 1 1 1 0
0 1 1 1 0 0 1 0 0 1 0 0 0 1 1 0
0 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0
0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0
0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 0
0 1 1 1 0 0 1 0 0 1 0 1 1 1 1 0
0 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0
0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0
0 1 1 1 0 0 1 0 1 1 0 1 0 1 1 0
0 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0
0 1 1 1 0 0 1 1 -1 0 0 0 -1 0 0 0
0 1 1 1 0 0 1 1 -1 0 0 0 0 0 1 0
0 1 1 1 0 0 1 1 -1 0 0 0 0 1 1 0
0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0
0 1 1 1 0 0 1 1 0 0 0 0 0 0 1 0
0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0
0 1 1 1 0 0 1 1 0 0 0 0 1 1 1 0
0 1 1 1 0 0 1 1 0 0 0 1 -1 0 0 0
0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0
0 1 1 1 0 0 1 1 0 0 0 1 0 0 1 0
0 1 1 1 0 0 1 1 0 0 0 1 0 1 1 0
0 1 1 1 0 0 1 1 0 0 0 1 1 1 1 0
0 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0
0 1 1 1 0 0 1 1 0 1 0 0 0 1 1 0
0 1 1 1 0 0 1 1 0 1 0 0 1 1 1 0
0 1 1 1 0 0 1 1 0 1 0 1 -1 0 0 0
0 1 1 1 0 0 1 1 0 1 0 1 0 0 0 0
0 1 1 1 0 0 1 1 0 1 0 1 0 0 1 0
0 1 1 1 0 0 1 1 0 1 0 1 0 1 0 0
0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0
0 1 1 1 0 0 1 1 0 1 0 1 1 1 1 0
0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 0
0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0
0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0
0 1 1 1 0 0 1 1 1 1 0 1 0 0 1 0
0 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0
0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 0
0 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0
0 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0
0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0
0 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0
0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0
0 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0
0 1 1 1 1 0 0 0 1 1 0 1 1 0 0 0
0 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0
0 1 1 1 1 0 0 0 1 1 0 1 1 1 1 0
0 1 1 1 1 0 0 1 1 0 0 1 0 0 0 0
0 1 1 1 1 0 0 1 1 0 0 1 0 1 1 0
0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 0
0 1 1 1 1 0 0 1 1 0 0 1 1 1 1 0
0 1 1 1 1 0 0 1 1 1 0 1 0 0 0 0
0 1 1 1 1 0 0 1 1 1 0 1 0 1 0 0
0 1 1 1 1 0 0 1 1 1 0 1 0 1 1 0
0 1 1 1 1 0 0 1 1 1 0 1 1 0 0 0
0 1 1 1 1 0 0 1 1 1 0 1 1 1 0 0
0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 0
0 1 1 1 1 0 1 0 0 0 0 0 1 0 1 0
0 1 1 1 1 0 1 0 0 0 0 0 1 1 1 0
0 1 1 1 1 0 1 0 0 1 0 0 1 1 1 0
0 1 1 1 1 0 1 0 0 1 0 1 1 0 1 0
0 1 1 1 1 0 1 0 0 1 0 1 1 1 1 0
0 1 1 1 1 0 1 0 1 0 0 0 1 0 1 0
0 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0
0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0
0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0
0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 0
0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0
0 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0
0 1 1 1 1 0 1 1 0 0 0 0 0 1 1 0
0 1 1 1 1 0 1 1 0 0 0 0 1 0 1 0
0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0
0 1 1 1 1 0 1 1 0 0 0 1 0 0 0 0
0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 0
0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 0
0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0
0 1 1 1 1 0 1 1 0 0 0 1 1 1 1 0
0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0
0 1 1 1 1 0 1 1 0 1 0 0 0 1 1 0
0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 0
0 1 1 1 1 0 1 1 0 1 0 1 0 0 0 0
0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 0
0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 0
0 1 1 1 1 0 1 1 0 1 0 1 0 1 1 0
0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0
0 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0
0 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0
0 1 1 1 1 0 1 1 1 0 0 0 1 0 1 0
0 1 1 1 1 0 1 1 1 0 0 0 1 1 1 0
0 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0
0 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0
0 1 1 1 1 0 1 1 1 0 0 1 0 1 1 0
0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0
0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0
0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0
0 1 1 1 1 0 1 1 1 1 0 0 1 1 0 0
0 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0
0 1 1 1 1 0 1 1 1 1 0 1 0 0 0 0
0 1 1 1 1 0 1 1 1 1 0 1 0 0 1 0
0 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0
0 1 1 1 1 0 1 1 1 1 0 1 0 1 1 0
0 1 1 1 1 0 1 1 1 1 0 1 1 0 0 0
0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 0
0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 0
0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0

Example 6: Warning: F_vector computation takes a long time!!

[ ]:
d = 5

P_dIneqs = polytropeRegionInequalities(d);

P_d = Oscar.Polymake.polytope.Cone(INEQUALITIES=P_dIneqs);
P_dF_VECTOR = P_d.F_VECTOR;
P_dRays = P_d.RAYS;


println("The polytrope region P_5 has f_vector: ",P_dF_VECTOR)

println("\n \n")

println("The polytrope region P_5 has rays: ",P_dRays)