SUBROUTINE banbks(a,m1,m2,al,indx,b)
	USE nrtype; USE nrutil, ONLY : assert_eq,swap
	IMPLICIT NONE
	REAL(dp), DIMENSION(:,:), INTENT(IN) :: a,al
	INTEGER(I4B), INTENT(IN) :: m1,m2
	INTEGER(I4B), DIMENSION(:), INTENT(IN) :: indx
	REAL(dp), DIMENSION(:), INTENT(INOUT) :: b
	INTEGER(I4B) :: i,k,l,mdum,mm,n
	n=assert_eq(size(a,1),size(al,1),size(b),size(indx),'banbks: n')
	mm=assert_eq(size(a,2),m1+m2+1,'banbks: mm')
	mdum=assert_eq(size(al,2),m1,'banbks: mdum')
	do k=1,n
		l=min(n,m1+k)
		i=indx(k)
		if (i /= k) call swap(b(i),b(k))
		b(k+1:l)=b(k+1:l)-al(k,1:l-k)*b(k)
	end do
	do i=n,1,-1
		l=min(mm,n-i+1)
		b(i)=(b(i)-dot_product(a(i,2:l),b(1+i:i+l-1)))/a(i,1)
	end do
	END SUBROUTINE banbks