function r = i4_to_halton_sequence ( dim_num, n, step, seed, leap, base )

%*****************************************************************************80
%
%% I4_TO_HALTON_SEQUENCE: N elements of an DIM_NUM-dimensional Halton sequence.
%
%  Discussion:
%
%    The DIM_NUM-dimensional Halton sequence is really DIM_NUM separate
%    sequences, each generated by a particular base.
%
%    This routine selects elements of a "leaped" subsequence of the
%    Halton sequence.  The subsequence elements are indexed by a
%    quantity called STEP, which starts at 0.  The STEP-th subsequence
%    element is simply element
%
%      SEED(1:DIM_NUM) + STEP * LEAP(1:DIM_NUM)
%
%    of the original Halton sequence.
%
%  Licensing:
%
%    This code is distributed under the GNU LGPL license.
%
%  Modified:
%
%    21 September 2004
%
%  Author:
%
%    John Burkardt
%
%  Reference:
%
%    J H Halton,
%    On the efficiency of certain quasi-random sequences of points
%    in evaluating multi-dimensional integrals,
%    Numerische Mathematik,
%    Volume 2, 1960, pages 84-90.
% 
%    J H Halton and G B Smith,
%    Algorithm 247: Radical-Inverse Quasi-Random Point Sequence,
%    Communications of the ACM,
%    Volume 7, 1964, pages 701-702.
%
%    Ladislav Kocis and William Whiten,
%    Computational Investigations of Low-Discrepancy Sequences,
%    ACM Transactions on Mathematical Software,
%    Volume 23, Number 2, 1997, pages 266-294.
%
%  Parameters:
%
%    Input, integer DIM_NUM, the spatial dimension.
%    1 <= DIM_NUM is required.
%
%    Input, integer N, the number of elements of the sequence.
%
%    Input, integer STEP, the index of the subsequence element.
%    0 <= STEP is required.
%
%    Input, integer SEED(DIM_NUM), the Halton sequence index corresponding
%    to STEP = 0.
%
%    Input, integer LEAP(DIM_NUM), the succesive jumps in the Halton sequence.
%
%    Input, integer BASE(DIM_NUM), the Halton bases.
%
%    Output, real R(DIM_NUM,N), the next N elements of the
%    leaped Halton subsequence, beginning with element STEP.
%
  dim_num = floor ( dim_num );
  n = floor ( n );
  step = floor ( step );
  seed(1:dim_num) = floor ( seed(1:dim_num) );
  leap(1:dim_num) = floor ( leap(1:dim_num) );
  base(1:dim_num) = floor ( base(1:dim_num) );
%
%  Check the input.
%
  if ( ~halham_dim_num_check ( dim_num ) )
    error ( 'I4_TO_HALTON_SEQUENCE - Fatal error!' );
  end

  if ( ~halham_n_check ( n ) )
    error ( 'I4_TO_HALTON_SEQUENCE - Fatal error!' );
  end

  if ( ~halham_step_check ( step ) )
    error ( 'I4_TO_HALTON_SEQUENCE - Fatal error!' );
  end

  if ( ~halham_seed_check ( dim_num, seed ) )
    error ( 'I4_TO_HALTON_SEQUENCE - Fatal error!' );
  end

  if ( ~halham_leap_check ( dim_num, leap ) )
    error ( 'I4_TO_HALTON_SEQUENCE - Fatal error!' );
  end

  if ( ~halton_base_check ( dim_num, base ) )
    error ( 'I4_TO_HALTON_SEQUENCE - Fatal error!' );
  end
%
%  Calculate the data.
%
  r(1:dim_num,1:n) = 0.0;
  
  for i = 1: dim_num

    seed2(1:n) = seed(i) + step * leap(i) : leap(i) : ...
                 seed(i) + ( step + n - 1 ) * leap(i);

    base_inv = 1.0 / base(i);
  
    while ( any ( seed2 ~= 0 ) )
      digit(1:n) = mod ( seed2(1:n), base(i) );
      r(i,1:n) = r(i,1:n) + digit(1:n) * base_inv;
      base_inv = base_inv / base(i);
      seed2(1:n) = floor ( seed2(1:n) / base(i) );
    end

  end

  return
end
