input: Write a function to implement the Gradient Descent Algorithm in Python. The function should take in the input features `x`, the target values `y`, a learning rate `learning_rate`, and the number of iterations `iterations`. It should return the optimized slope `m_curr` and intercept `b_curr` after performing gradient descent. If the input features and target values are empty, the function should return `None`.
  assert gradient_descent([], []) == None
  assert gradient_descent([1, 2, 3], [2, 4, 6], 0.1, 10) != None
  assert gradient_descent([1, 2, 3], [2, 4, 6], 0.1, 0) != None
  assert gradient_descent([1, 2, 3], [2, 4, 6], 0.0, 10) != None
  assert gradient_descent([1, 2, 3], [2, 4, 6], 1.0, 10) != None
output: if len(x) == 0 or len(y) == 0:
      return None
  
  m_curr = 0
  b_curr = 0
  n = len(x)
  
  for i in range(iterations):
      y_pred = m_curr * x + b_curr
      md = -(2/n) * sum(x * (y - y_pred))
      bd = -(2/n) * sum(y - y_pred)
      m_curr = m_curr - learning_rate * md
      b_curr = b_curr - learning_rate * bd
  
  return m_curr, b_curr