function create_one_spin_basis(n_orbs, n_spins) result(one_spin_basis)
integer, intent(in) :: n_orbs, n_spins
integer(n_int), allocatable :: one_spin_basis(:)
#ifdef DEBUG_
character(*), parameter :: this_routine = "create_one_spin_basis"
#endif
integer :: n_max_states, i, right_zero
integer(n_int) :: count_mask, n_set_zero
n_max_states = int(choose_i64(n_orbs, n_spins))
!
allocate(one_spin_basis(n_max_states))
! create the first basis state:
one_spin_basis(1) = maskr(n_spins)
! implement my matlab routine to create the basis states:
! but now i have to do it for spin-orbital encoding!
! but do this afterwards so the mapping is easier for off-half-filling!
do i = 2, n_max_states
! copy last state:
one_spin_basis(i) = one_spin_basis(i - 1)
! find the right-most zero with atleast one 1 right of it
right_zero = right_most_zero(one_spin_basis(i), n_orbs)
! if the right-most zero is bigger than n_orbs already, we should
! have been finished already..
ASSERT(right_zero <= n_orbs)
! i need to count the number of 1 right of this zero
! so i want a mask where every bit right of right_zero is set
! to one
count_mask = maskr(right_zero - 1)
n_set_zero = popcnt(iand(one_spin_basis(i), count_mask))
! now i want to set the right_most zero to one
one_spin_basis(i) = ibset(one_spin_basis(i), right_zero - 1)
! and everything to 0 right of it for now
one_spin_basis(i) = iand(one_spin_basis(i), not(count_mask))
! and then we want to set n_set_zero bits to the very right of
! our bit-string
one_spin_basis(i) = merge_bits(one_spin_basis(i), maskr(n_set_zero - 1, n_int), not(maskr(n_set_zero - 1, n_int)))
end do
end function create_one_spin_basis