input: Write a function to implement the Gradient Descent Algorithm. The function should take in inputs x, y, learning_rate, and iterations, and should return the optimized values of m_curr and b_curr after performing the gradient descent. If the input arrays x and y are empty, the function should return (0, 0).
  assert gradient_descent([3, 5, 7, 9], [2, 4, 6, 8])==(2.0, 0.0)
  assert gradient_descent([], [])==(0, 0)
  assert gradient_descent([1, 2, 3], [1, 2, 3])==(1.0, 0.0)
  assert gradient_descent([1, 2, 3, 4], [1, 3, 5, 7])==(2.0, -1.0)
  assert gradient_descent([1, 3, 5, 7], [2, 4, 6, 8])==(1.96, 0.08)
output: def gradient_descent(x, y, learning_rate=0.01, iterations=1000):
      if not x or not y:
          return (0, 0)
      
      n = len(x)
      m_curr, b_curr = 0, 0
      
      for _ in range(iterations):
          y_predicted = m_curr * x + b_curr
          dm = -(2/n) * sum(x * (y - y_predicted))
          db = -(2/n) * sum(y - y_predicted)
          m_curr = m_curr - learning_rate * dm
          b_curr = b_curr - learning_rate * db
      
      return (m_curr, b_curr)