function [ CPERM ] = CyclicPerm( BIT )

%Funkce ma za ucel vygenerovani vsech cyklickych permutaci o danem poctu
%bitu
NECKLACE = [2,3,4,6,8,14,20,36,60,108,188,352,632,1182,2192];               %reseni "necklace problemu"

CPERM = ones(1,BIT);                                                        %pripraveni matice vysledku, ulozeni prvniho prvku do ni

while size(CPERM,1)<NECKLACE(BIT);                                          %terminacni podminka while cyklu podle reseni "necklace" problemu
 
    b = randi([0,1],1,BIT);                                                 %nahodny vektor b nul a jednicek
    
    for k=1:BIT;                                                            %rotace vznikle premistenim posledniho prvku vektoru na jeho pocatek
        
        b = [b(BIT),b];
        
        b(BIT+1) = [];
        
        for j=1:size(CPERM,1);                                              %kontrola pro kazdou rotaci, zda nahodny vektor b lezi mezi cyklickymi permutacemi, Hammingova vzdalenost musi byt ve vsech pripadech vetsi nez BIT (vektory se nesmi shodovat)
            
            HAMMING(j,k) = sum((b==CPERM(j,:)));
            
            if HAMMING(j,k)==BIT;
                
                HAMMING(j,k) = 1;
                
                break;
                
            else HAMMING(j,k)=0;
                
            end;
            
        end;
        
        if sum(sum(HAMMING))>=1;                                            %pokud najde shodnost nejake rotace nahodneho vektoru s prvkem z knihovny - terminuje vnitrni cyklus
            
            break;
            
        end;
        
    end;
    
    if sum(sum(HAMMING))==0;                                                %pokud jsou vsechny rotace neshodne s prvky v knihovne - zapise se nahodny vektor mezi cyklicke rotace
        
        CPERM(size(CPERM,1)+1,:) = b;
        
    end;
    
    clear HAMMING
    
end

end

