code: def degree_elevation(degree, ctrlpts, **kwargs):
      
      # Get keyword arguments
      num = kwargs.get('num', 1)  # number of degree elevations
      check_op = kwargs.get('check_num', True)  # enable/disable input validation checks
  
      if check_op:
          if degree + 1 != len(ctrlpts):
              raise GeomdlException("Degree elevation can only work with Bezier-type geometries")
          if num <= 0:
              raise GeomdlException("Cannot degree elevate " + str(num) + " times")
  
      # Initialize variables
      num_pts_elev = degree + 1 + num
      pts_elev = [[0.0 for _ in range(len(ctrlpts[0]))] for _ in range(num_pts_elev)]
  
      # Compute control points of degree-elevated 1-dimensional shape
      for i in range(0, num_pts_elev):
          start = max(0, (i - num))
          end = min(degree, i)
          for j in range(start, end + 1):
              coeff = linalg.binomial_coefficient(degree, j) * linalg.binomial_coefficient(num, (i - j))
              coeff /= linalg.binomial_coefficient((degree + num), i)
              pts_elev[i] = [p1 + (coeff * p2) for p1, p2 in zip(pts_elev[i], ctrlpts[j])]
  
      # Return computed control points after degree elevation
      return pts_elev
docs: Computes the control points of the rational/non-rational spline after degree elevation.
  
      Implementation of Eq. 5.36 of The NURBS Book by Piegl & Tiller, 2nd Edition, p.205
  
      Keyword Arguments:
          * ``num``: number of degree elevations
  
      Please note that degree elevation algorithm can only operate on Bezier shapes, i.e. curves, surfaces, volumes.
  
      :param degree: degree
      :type degree: int
      :param ctrlpts: control points
      :type ctrlpts: list, tuple
      :return: control points of the degree-elevated shape
      :rtype: list