clc
clear all

n=4; %c'est la dimension

%Définir M en fonction de n au cas ou n>4

%On part de M qui permet ensuite de trouver tous les résultats possibles
%laissant invariant la grille carrée

for k=1:n
  M(n+1-k,k)=1;
end

% Trouver les différents patrons cube dans une grille 4x4

% % Partir avec patron de base
% 
% A1=[1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16]
% 
% 'Symétrie horizontale'
% 
% M*A1
% 
% 'Symétrie verticale'
% 
% A1*M
% 
% 'Rotation 180 ° = symétrie centrale'
% 
% M*A1*M
% 
% 'Symétrie axiale \'
% 
% A1'
% 
% 'Symétrie axiale /'
% 
% M*(M*A1)'
% 
% 'Rotation +90°'
% 
% M*(A1')
% 
% 'Rotation -90°'
% 
% (A1')*M

%On rentre notre matrice à transformer


% A1=zeros(n);
R=zeros(n,16*n);

ResultatM=zeros(16,1);
PatronM=zeros(8,40);

%Patron 1

J=0;
%Entrer ici le patron du cube en laissant la translation vers le bas
%possible
PatronM(1:4,J*4+1:J*4+4)=[1 0 0 0;1 1 1 1;1 0 0 0; 0 0 0 0];

%Entrer le nouveau patron du cube après translation vers le bas
PatronM(6:8,J*4+1:J*4+4)=PatronM(1:3,J*4+1:J*4+4);

J=J+1;

%Patron 2
PatronM(1:4,J*4+1:J*4+4)=[1 1 0 0; 0 1 1 0;0 0 1 1; 0 0 0 0];
PatronM(6:8,J*4+1:J*4+4)=PatronM(1:3,J*4+1:J*4+4);
J=J+1;
%Patron 3
PatronM(1:4,J*4+1:J*4+4)=[0 0 0 1;1 1 1 1;1 0 0 0; 0 0 0 0];
PatronM(6:8,J*4+1:J*4+4)=PatronM(1:3,J*4+1:J*4+4);
J=J+1;
%Patron 4
PatronM(1:4,J*4+1:J*4+4)=[0 1 0 0;1 1 1 1;0 1 0 0; 0 0 0 0];
PatronM(6:8,J*4+1:J*4+4)=PatronM(1:3,J*4+1:J*4+4);
J=J+1;
%Patron 5
PatronM(1:4,J*4+1:J*4+4)=[1 1 0 0;0 1 1 1;0 1 0 0; 0 0 0 0];
PatronM(6:8,J*4+1:J*4+4)=PatronM(1:3,J*4+1:J*4+4);
J=J+1;
%Patron 6
PatronM(1:4,J*4+1:J*4+4)=[0 1 0 0;1 1 1 1;1 0 0 0; 0 0 0 0];
PatronM(6:8,J*4+1:J*4+4)=PatronM(1:3,J*4+1:J*4+4);
J=J+1;
%Patron 7
PatronM(1:4,J*4+1:J*4+4)=[0 0 1 0;1 1 1 1;0 1 0 0; 0 0 0 0];
PatronM(6:8,J*4+1:J*4+4)=PatronM(1:3,J*4+1:J*4+4);
J=J+1;
%Patron 8
PatronM(1:4,J*4+1:J*4+4)=[0 1 0 0;1 1 1 0;0 0 1 1; 0 0 0 0];
PatronM(6:8,J*4+1:J*4+4)=PatronM(1:3,J*4+1:J*4+4);
J=J+1;
%Patron 9
PatronM(1:4,J*4+1:J*4+4)=[1 1 0 0;0 1 1 1;0 0 0 1; 0 0 0 0];
PatronM(6:8,J*4+1:J*4+4)=PatronM(1:3,J*4+1:J*4+4);
J=J+1;
%Patron 10
PatronM(1:4,J*4+1:J*4+4)=[0 0 1 0;1 1 1 1;1 0 0 0; 0 0 0 0];
PatronM(6:8,J*4+1:J*4+4)=PatronM(1:3,J*4+1:J*4+4);


PatronM;

for L=0:9 % On effectue tous les calculs sur les dix patrons
    
A1=PatronM(1:4,L*4+1:L*4+4);
A2=PatronM(5:8,L*4+1:L*4+4);

%Calculs intermédiaires pour aider matlab
B1=A1';
C1=(M*A1)';

B2=A2';
C2=(M*A2)';


%Mettre tous les résultats dans une matrice 4 , 16x4=64
for k=1:64
 
    if k<=4
         R(:,k)=A1(:,k);%Inchangée
         
     elseif k<=8
         R(:,k)=M*A1(:,k-4);%Symétrie horizontale
         
    elseif k<=12
        R(:,k)=A1*M(:,k-8);%Symétrie verticale
    
    elseif k<=16
        R(:,k)=M*A1*M(:,k-12);
        
    elseif k<=20
        R(:,k)=B1(:,k-16);
        
    elseif k<=24
        R(:,k)=M*C1(:,k-20);
        
    elseif k<=28
        R(:,k)=M*B1(:,k-24);
        
    elseif k<=32
        R(:,k)=B1*M(:,k-28);
    
    elseif k<=36
         R(:,k)=A2(:,k-32);%Translation vers le bas
         
     elseif k<=40
         R(:,k)=M*A2(:,k-36);
         
    elseif k<=44
        R(:,k)=A2*M(:,k-40);
    
    elseif k<=48
        R(:,k)=M*A2*M(:,k-44);
        
    elseif k<=52
        R(:,k)=B2(:,k-48);
        
    elseif k<=56
        R(:,k)=M*C2(:,k-52);
        
    elseif k<=60
        R(:,k)=M*B2(:,k-56);
        
    elseif k<=64
        R(:,k)=B2*M(:,k-60);
        
    end
   
end

% Obtention de tous les résultats en base 10 en colonne
S=zeros(16,1);


%Ordre aléatoire
for k=0:16^2-1
   
   S(floor(k/16)+1,1)=S(floor(k/16)+1)+R(floor((k-16*floor(k/16))/4)+1,mod(k,4)+4*floor(k/16)+1)*2^(k-16*floor(k/16));
end

%Enlève les doublons
for k=1:16
    for i=k+1:16
        if S(k,1)==S(i,1)
            S(k,1)=0;
        end
    end
end

%Ordre décroissant
for k=1:16
    for i=k:16
        if S(k,1)<S(i,1)
            b=S(k,1);
            S(k,1)=S(i,1);
            S(i,1)=b;
        end
    end
end

%Compte le nombre de zeros avec h initialisé à 0

h=0;
for k=1:16
    if S(k,1)==0
        h=h+1;
    end
end

Resultat=zeros(16-h,1);

for k=1:16-h
    Resultat(k,1)=S(k,1);
end


% %Ordre croissant
% for k=1:(16-h)/2
%     p=Resultat(k,1);
%     Resultat(k,1)=Resultat(16-h-k,1);
%     Resultat(16-h-k+1,1)=p;
% end

L+1
A1
Resultat; % ordre décroissant
for k=1:16-h
   str=sprintf('(a-%d)*',Resultat(k,1));
       disp(str)
end
ResultatM(1:16-h,L+1)=Resultat(:,1);

end