summaryrefslogtreecommitdiff
path: root/src/haversine_generator/libs/pcg/pcg-advance-16.c
diff options
context:
space:
mode:
authorRaymaekers Luca <luca@spacehb.net>2025-11-13 12:37:21 +0100
committerRaymaekers Luca <luca@spacehb.net>2025-11-13 12:37:21 +0100
commit6fad44af4ae20b424ff1caddc8b38957897d400a (patch)
tree21257ae6500de5a667655c133bed68c2f0c9c426 /src/haversine_generator/libs/pcg/pcg-advance-16.c
parent7c6bb686871a5fed3eb9623ac8121dc4a60048bd (diff)
checkpoint
Diffstat (limited to 'src/haversine_generator/libs/pcg/pcg-advance-16.c')
-rw-r--r--src/haversine_generator/libs/pcg/pcg-advance-16.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/haversine_generator/libs/pcg/pcg-advance-16.c b/src/haversine_generator/libs/pcg/pcg-advance-16.c
new file mode 100644
index 0000000..11461d9
--- /dev/null
+++ b/src/haversine_generator/libs/pcg/pcg-advance-16.c
@@ -0,0 +1,62 @@
+/*
+ * 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".
+ */
+
+uint16_t pcg_advance_lcg_16(uint16_t state, uint16_t delta, uint16_t cur_mult,
+ uint16_t cur_plus)
+{
+ uint16_t acc_mult = 1u;
+ uint16_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;
+}
+