function value = p15_f ( dim_num, point_num, x )

%*****************************************************************************80
%
%% P15_F evaluates the integrand for problem 15.
%
%  Dimension:
%
%    N arbitrary.
%
%  Region:
%
%    0 <= X(1:DIM_NUM) <= 1
%
%  Integral Input:
%
%    N determines the order of the product.  It defaults to 1.
%    You can modify N by calling P15_I4.
%
%  Integrand:
%
%    f(x) = product ( 1 <= I <= N ) X(MOD(I-1,DIM_NUM)+1)
%
%  Exact integral:
%
%    product ( 1 / exponent(1:DIM_NUM) )
%
%    where, if I <= N - DIM_NUM * ( N/DIM_NUM),
%    
%      exponent ( I ) = ( N / dim_num ) + 2 
%
%    else
%
%      exponent ( I ) = ( N / dim_num ) + 1
%
%  Licensing:
%
%    This code is distributed under the MIT license.
%
%  Modified:
%
%    02 June 2007
%
%  Author:
%
%    John Burkardt
%
%  Input:
%
%    integer DIM_NUM, the dimension of the argument.
%
%    integer POINT_NUM, the number of points.
%
%    real X(DIM_NUM,POINT_NUM), the evaluation points.
%
%  Output:
%
%    real VALUE(POINT_NUM), the integrand values.
%
  n = 0;
  n = p15_i4 ( 'G', 'N', n );

  fraction = floor ( n / dim_num );
  remainder = n - fraction * dim_num;


  value(1:point_num) = 1.0;

  for point = 1 : point_num

    if ( any ( x(1:dim_num,point) == 0.0 ) )

      value(point) = 0.0;

    else 

      for dim = 1 : dim_num
        if ( dim <= remainder )
          value(point) = value(point) * x(dim,point) ^ ( fraction + 1 );
        elseif ( fraction ~= 0 )
          value(point) = value(point) * x(dim,point) ^ fraction;
        end
      end

    end

  end

  p15_i4 ( 'I', '#', point_num );

  return
end
