input: Write a function to implement the Gradient Descent Algorithm. The function should take in a list of x values, a list of y values, a learning rate, and the number of iterations. It should return the final values of the slope (m) and intercept (b) after the specified number of iterations. 
  
  assert gradient_descent([3, 5, 7, 9], [10, 20, 30, 40], 0.01, 100) == (5.0, -5.0)
  assert gradient_descent([1, 2, 3, 4], [1, 4, 9, 16], 0.01, 100) == (4.0, -3.0)
  assert gradient_descent([1, 3, 5, 7], [2, 6, 10, 14], 0.01, 100) == (2.0, 0.0)
  assert gradient_descent([2, 4, 6, 8], [3, 7, 11, 15], 0.01, 100) == (2.0, -1.0)
  assert gradient_descent([1, 1, 1, 1], [2, 2, 2, 2], 0.01, 100) == (0.0, 2.0)
output: def gradient_descent(x, y, learning_rate, iterations):
      m, b = 0, 0
      n = len(x)
      for _ in range(iterations):
          y_pred = m * x + b
          dm = (-2/n) * sum(x * (y - y_pred))
          db = (-2/n) * sum(y - y_pred)
          m -= learning_rate * dm
          b -= learning_rate * db
      return m, b