function [X] = gbu(D,K)
    % [X] = gbu(D,K)
    % 
    % INPUT:
    % D: matriz de distancias (incompleta) (distancias ao quadrado)
    % .  se d(i,j) nao e' conhecida, entao D(i,j) = D(j,i) = 0.
    % K: dimensao de realizacao
    % 
    % OUTPUT:
    % X: realizacao em dimensao K
    %
    
    n = length(D);
    
    % realizar (K+1)-clique inicial
    D0 = D(1:K+1,1:K+1);
    X0 = edm(D0);
    
    X = zeros(K,n);
    X(:,1:K+1) = X0;
    
    % localizar os vertices i > K+1
    for i=K+2:n
        % determinar os predecessores adjacentes
        idpa = find(D(1:i-1,i));
        
        % montar matriz A
        Y = X(:,idpa);
        B = (Y(:,1) - Y)';
        A = 2*B(2:end,:);
        
        % montar o vetor do lado direito b
        d = D(idpa,i);
        s = sum(Y.^2,1)';
        dd = d - d(1);
        d2 = dd(2:end);
        ss = s(1) - s;
        s2 = ss(2:end);
        b = d2 + s2;
        
        xi = A\b; 
        
        % resolvendo o sistema linear
        X(:,i) = xi;
        
    end
    
end