Skip to content

Commit

Permalink
Add pcg-advance-128.
Browse files Browse the repository at this point in the history
ghc-mod is complaining it isn't there. Don't know why.
  • Loading branch information
cchalmers committed Feb 12, 2015
1 parent 1ad5fc7 commit 96591d4
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 0 deletions.
64 changes: 64 additions & 0 deletions c/pcg-advance-128.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* PCG Random Number Generation for C.
*
* Copyright 2014 Melissa O'Neill <oneill@pcg-random.org>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* For additional information about the PCG random number generation scheme,
* including its license and other licensing options, visit
*
* http://www.pcg-random.org
*/

/*
* This code is derived from the canonical C++ PCG implementation, which
* has many additional features and is preferable if you can use C++ in
* your project.
*
* Repetative C code is derived using C preprocessor metaprogramming
* techniques.
*/

#include "pcg_variants.h"

/* Multi-step advance functions (jump-ahead, jump-back)
*
* The method used here is based on Brown, "Random Number Generation
* with Arbitrary Stride,", Transactions of the American Nuclear
* Society (Nov. 1994). The algorithm is very similar to fast
* exponentiation.
*
* Even though delta is an unsigned integer, we can pass a
* signed integer to go backwards, it just goes "the long way round".
*/

#if PCG_HAS_128BIT_OPS
pcg128_t pcg_advance_lcg_128(pcg128_t state, pcg128_t delta, pcg128_t cur_mult,
pcg128_t cur_plus)
{
pcg128_t acc_mult = 1u;
pcg128_t acc_plus = 0u;
while (delta > 0) {
if (delta & 1) {
acc_mult *= cur_mult;
acc_plus = acc_plus * cur_mult + cur_plus;
}
cur_plus = (cur_mult + 1) * cur_plus;
cur_mult *= cur_mult;
delta /= 2;
}
return acc_mult * state + acc_plus;
}
#endif

1 change: 1 addition & 0 deletions pcg-random.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ library
-std=c99 -fPIC

c-sources:
c/pcg-advance-128.c
c/pcg-advance-64.c
c/pcg-global-64.c
c/pcg-output-64.c
Expand Down

0 comments on commit 96591d4

Please sign in to comment.