clc
clear all

n=4; %c'est la dimension


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

% ResultatM=zeros(16,1);

%Insertion des patrons dans la matrice PatronM pour les patrons de 1 à 10
%Par paquet de 6 colonnes --> tous les patrons d'un même cube

%nombre de positions possibles
G=(n-4+1)*(n-3+1);

PatronM=zeros(G*n,11*n);

%On entre tous les patrons possibles avec avec les 2t vers la droite et 3
%vers le bas. Pour cela, on impose que les 10 premiers patrons occupent 3
%lignes et 4 colonnes.

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

%Insertion des translations
for p=1:11 %sur les 10 patrons
    if p<11
        
        num=0;
        for c=0:n-4%translation vers la droite
    
            for l=0:n-3%translation vers le bas
              
                PatronM(num*n+l+1:num*n+l+3,c+(p-1)*n+1:c+(p-1)*n+4)=PatronM(1:3,(p-1)*n+1:(p-1)*n+4);
                num=num+1;
        
            end
    
        end
        
    else
        
        num=0;
        for c=0:n-5%translation vers la droite
    
            for l=0:n-2%translation vers le bas
              
                PatronM(num*n+l+1:num*n+l+2,c+(p-1)*n+1:c+(p-1)*n+5)=PatronM(1:2,(p-1)*n+1:(p-1)*n+5);
                num=num+1;
        
            end
    
        end
        
    end

end

PatronM



PatronM;

for p=1:11 % On effectue tous les calculs sur les 10 patrons
    
    P=PatronM(1:n,(p-1)*n+1:p*n);
    R=zeros(n,G*n*8); %On stock tous les patrons possibles 12 translations*8transformations!!
    
    S=zeros(G*8,1);% Obtention de tous les résultats en base 10 en colonne
    
    for m=1:G%stock les 8 transformations de chaque translations dans la matrice R
        
        %Calculs intermédiaires pour aider matlab
        A=PatronM((m-1)*n+1:m*n,(p-1)*n+1:p*n); %n par n
        B=A';
        C=(M*A)';

        for t=1:8
 
            if t==1%Identité
                
                T=A;
                
                R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T;
                
                for k=0:n^2-1
                    S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1);
                end
                
            elseif t==2%Symétrie horizontale
                
                T=M*A;
                
                R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T;
                
                for k=0:n^2-1
                    S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1);
                end
         
            elseif t==3%Symétrie verticale
                
                T=A*M;
                R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T;
                
                for k=0:n^2-1
                    S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1);
                end
    
            elseif t==4%Symétrie centrale
                
                T=M*A*M;
                R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T;
                
                for k=0:n^2-1
                    S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1);
                end
        
            elseif t==5%Symétrie axiale \
                
                T=B;
                R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T;
                
                for k=0:n^2-1
                    S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1);
                end
        
            elseif t==6%Symétrie axiale /
                
                T=M*C;
                R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T;
                
                for k=0:n^2-1
                    S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1);
                end
        
            elseif t==7%Rotation +90
                
                T=M*B;
                R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T;
                
                for k=0:n^2-1
                    S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1);
                end
        
            elseif t==8%Rotation -90
                
                T=B*M;
                R(:,1+(t-1)*n+8*n*(m-1):t*n+8*n*(m-1))=T;
                
                for k=0:n^2-1
                    S((t-1)+8*(m-1)+1,1)=S((t-1)+8*(m-1)+1,1)+2^(k)*T(floor(k/n)+1,mod(k,n)+1);
                end
                
            end
        
        end
    
    end
    
    R;
    S;

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

    %Ordre décroissant
    for k=1:G*8
        for i=k:G*8
            if S(k,1)<S(i,1)
                b=S(k,1);
                S(k,1)=S(i,1);
                S(i,1)=b;
            end
        end
    end
    
    S;
    
    %Compte le nombre de zeros avec h initialisé à 0

    h=0;
    for k=1:G*8
        if S(k,1)==0
            h=h+1;
        end
    end

    h;
    
    Resultat=zeros(G*8-h,1);

    for k=1:G*8-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
    
    sprintf('Patron %d',p)
    P
    Resultat; % ordre décroissant
     
    for k=1:G*8-h
        str=sprintf('(a-%f)*',Resultat(k,1));
        disp(str);
    end
    
    

end