code: def G(w, Xs):
      '''Calculate the G function given a cylinder direction w and a
      list of data points Xs to be fitted.'''
      n = len(Xs)
      P = projection_matrix(w)
      Ys = [np.dot(P, X) for X in Xs]
      A = calc_A(Ys)
      A_hat = calc_A_hat(A, skew_matrix(w))
  
      
      u = sum(np.dot(Y, Y) for Y in Ys) / n
      v = np.dot(A_hat, sum(np.dot(Y, Y) * Y for Y in Ys)) / np.trace(np.dot(A_hat, A))
  
      return sum((np.dot(Y, Y) - u - 2 * np.dot(Y, v)) ** 2 for Y in Ysf G(w, Xs):
      '''Calculate the G function given a cylinder direction w and a
      list of data points Xs to be fitted.'''
      n = len(Xs)
      P = projection_matrix(w)
      Ys = [np.dot(P, X) for X in Xs]
      A = calc_A(Ys)
      A_hat = calc_A_hat(A, skew_matrix(w))
  
      
      u = sum(np.dot(Y, Y) for Y in Ys) / n
      v = np.dot(A_hat, sum(np.dot(Y, Y) * Y for Y in Ys)) / np.trace(np.dot(A_hat, A))
  
      return sum((np.dot(Y, Y) - u - 2 * np.dot(Y, v)) ** 2 for Y in Ys)
docs: Calculate the G function given a cylinder direction w and a
      list of data points Xs to be fitted.