code: def indexes_to_fix_for_low_rank(rank, size):
      
      #first we'll work out what to keep, and the do the set difference.
  
      #here are the indexes of the first column, which are the triangular numbers
      n = np.arange(size)
      triangulars = (n**2 + n) / 2
      keep = []
      for i in range(rank):
          keep.append(triangulars[i:] + i)
      #add the diagonal
      keep.append(triangulars[1:]-1)
      keep.append((size**2 + size)/2 -1)# the very last element
      keep = np.hstack(keep)
  
      return np.setdiff1d(np.arange((size**2+size)/2), keep)
docs: Work out which indexes of the flatteneed array should be fixed if we want
      the cholesky to represent a low rank matrix