function y = lcrg_evaluate ( a, b, c, x ) %*****************************************************************************80 % %% LCRG_EVALUATE evaluates an LCRG, y = ( A * x + B ) mod C. % % Discussion: % % This routine cannot be recommended for production use. Because we want % to do modular arithmetic, but the base is not a power of 2, we need to % use "double precision" integers to keep accuracy. % % If we knew the base C, we could try to avoid overflow while not changing % precision. % % If the base C was a power of 2, we could rely on the usual properties of % integer arithmetic on computers, in which overflow bits, which are always % ignored, don't actually matter. % % Licensing: % % This code is distributed under the GNU LGPL license. % % Modified: % % 21 May 2008 % % Author: % % John Burkardt % % Parameters: % % Input, integer A, the multiplier for the LCRG. % % Input, integer B, the added value for the LCRG. % % Input, integer C, the base for the modular arithmetic. % For 32 bit arithmetic, this is often 2^31 - 1, or 2147483647. It is % required that 0 < C. % % Input, integer X, the value to be processed. % % Output, integer Y, the processed value. % y = mod ( a * x + b, c ); if ( y < 0 ) y = y + c; end return end