You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2019/10/09 22:17:35 UTC

[commons-rng] branch master updated: Refactor the duplicate code in the XorShiRo generators to the parent.

This is an automated email from the ASF dual-hosted git repository.

aherbert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-rng.git


The following commit(s) were added to refs/heads/master by this push:
     new 23983b9  Refactor the duplicate code in the XorShiRo generators to the parent.
23983b9 is described below

commit 23983b9905893935520d5073df9dbc63308012d6
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Wed Oct 9 21:46:18 2019 +0100

    Refactor the duplicate code in the XorShiRo generators to the parent.
    
    This implements the common code in the next() generation method in the
    abstract parent. Concrete implementations now provide a method to get
    the next output value given the current state.
---
 .../rng/core/source32/AbstractXoRoShiRo64.java     | 24 ++++++++++++++++
 .../rng/core/source32/AbstractXoShiRo128.java      | 28 +++++++++++++++++++
 .../commons/rng/core/source32/XoRoShiRo64Star.java | 12 ++------
 .../rng/core/source32/XoRoShiRo64StarStar.java     | 12 ++------
 .../commons/rng/core/source32/XoShiRo128Plus.java  | 17 ++----------
 .../rng/core/source32/XoShiRo128PlusPlus.java      | 17 ++----------
 .../rng/core/source32/XoShiRo128StarStar.java      | 17 ++----------
 .../rng/core/source64/AbstractXoRoShiRo128.java    | 24 ++++++++++++++++
 .../rng/core/source64/AbstractXoShiRo256.java      | 28 +++++++++++++++++++
 .../rng/core/source64/AbstractXoShiRo512.java      | 32 ++++++++++++++++++++++
 .../rng/core/source64/XoRoShiRo128Plus.java        | 12 ++------
 .../rng/core/source64/XoRoShiRo128PlusPlus.java    |  9 ++++++
 .../rng/core/source64/XoRoShiRo128StarStar.java    | 12 ++------
 .../commons/rng/core/source64/XoShiRo256Plus.java  | 17 ++----------
 .../rng/core/source64/XoShiRo256PlusPlus.java      | 17 ++----------
 .../rng/core/source64/XoShiRo256StarStar.java      | 17 ++----------
 .../commons/rng/core/source64/XoShiRo512Plus.java  | 21 ++------------
 .../rng/core/source64/XoShiRo512PlusPlus.java      | 21 ++------------
 .../rng/core/source64/XoShiRo512StarStar.java      | 21 ++------------
 .../core/source64/XoRoShiRo128PlusPlusTest.java    | 10 +++++++
 20 files changed, 181 insertions(+), 187 deletions(-)

diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java
index b3f8b82..03e7582 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java
@@ -94,4 +94,28 @@ abstract class AbstractXoRoShiRo64 extends IntProvider {
 
         super.setStateInternal(c[1]);
     }
+
+    /** {@inheritDoc} */
+    @Override
+    public int next() {
+        final int result = nextOutput();
+
+        final int s0 = state0;
+        int s1 = state1;
+
+        s1 ^= s0;
+        state0 = Integer.rotateLeft(s0, 26) ^ s1 ^ (s1 << 9); // a, b
+        state1 = Integer.rotateLeft(s1, 13); // c
+
+        return result;
+    }
+
+    /**
+     * Use the current state to compute the next output from the generator.
+     * The output function shall vary with respect to different generators.
+     * This method is called from {@link #next()} before the current state is updated.
+     *
+     * @return the next output
+     */
+    protected abstract int nextOutput();
 }
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java
index 6bcdf78..8a8c94b 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java
@@ -130,6 +130,34 @@ abstract class AbstractXoShiRo128 extends IntProvider implements LongJumpableUni
         super.setStateInternal(c[1]);
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public int next() {
+        final int result = nextOutput();
+
+        final int t = state1 << 9;
+
+        state2 ^= state0;
+        state3 ^= state1;
+        state1 ^= state2;
+        state0 ^= state3;
+
+        state2 ^= t;
+
+        state3 = Integer.rotateLeft(state3, 11);
+
+        return result;
+    }
+
+    /**
+     * Use the current state to compute the next output from the generator.
+     * The output function shall vary with respect to different generators.
+     * This method is called from {@link #next()} before the current state is updated.
+     *
+     * @return the next output
+     */
+    protected abstract int nextOutput();
+
     /**
      * {@inheritDoc}
      *
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64Star.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64Star.java
index 762fe0e..72b1211 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64Star.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64Star.java
@@ -55,15 +55,7 @@ public class XoRoShiRo64Star extends AbstractXoRoShiRo64 {
 
     /** {@inheritDoc} */
     @Override
-    public int next() {
-        final int s0 = state0;
-        int s1 = state1;
-        final int result = s0 * 0x9E3779BB;
-
-        s1 ^= s0;
-        state0 = Integer.rotateLeft(s0, 26) ^ s1 ^ (s1 << 9); // a, b
-        state1 = Integer.rotateLeft(s1, 13); // c
-
-        return result;
+    protected int nextOutput() {
+        return state0 * 0x9e3779bb;
     }
 }
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64StarStar.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64StarStar.java
index a7ca604..7c903a1 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64StarStar.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoRoShiRo64StarStar.java
@@ -55,15 +55,7 @@ public class XoRoShiRo64StarStar extends AbstractXoRoShiRo64 {
 
     /** {@inheritDoc} */
     @Override
-    public int next() {
-        final int s0 = state0;
-        int s1 = state1;
-        final int result = Integer.rotateLeft(s0 * 0x9E3779BB, 5) * 5;
-
-        s1 ^= s0;
-        state0 = Integer.rotateLeft(s0, 26) ^ s1 ^ (s1 << 9); // a, b
-        state1 = Integer.rotateLeft(s1, 13); // c
-
-        return result;
+    protected int nextOutput() {
+        return Integer.rotateLeft(state0 * 0x9e3779bb, 5) * 5;
     }
 }
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128Plus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128Plus.java
index 91a9541..105d5d1 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128Plus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128Plus.java
@@ -66,21 +66,8 @@ public class XoShiRo128Plus extends AbstractXoShiRo128 {
 
     /** {@inheritDoc} */
     @Override
-    public int next() {
-        final int result = state0 + state3;
-
-        final int t = state1 << 9;
-
-        state2 ^= state0;
-        state3 ^= state1;
-        state1 ^= state2;
-        state0 ^= state3;
-
-        state2 ^= t;
-
-        state3 = Integer.rotateLeft(state3, 11);
-
-        return result;
+    protected int nextOutput() {
+        return state0 + state3;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlus.java
index 80cfd1e..81e982d 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlus.java
@@ -66,21 +66,8 @@ public class XoShiRo128PlusPlus extends AbstractXoShiRo128 {
 
     /** {@inheritDoc} */
     @Override
-    public int next() {
-        final int result = Integer.rotateLeft(state0 + state3, 7) + state0;
-
-        final int t = state1 << 9;
-
-        state2 ^= state0;
-        state3 ^= state1;
-        state1 ^= state2;
-        state0 ^= state3;
-
-        state2 ^= t;
-
-        state3 = Integer.rotateLeft(state3, 11);
-
-        return result;
+    protected int nextOutput() {
+        return Integer.rotateLeft(state0 + state3, 7) + state0;
     }
 
     /**
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128StarStar.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128StarStar.java
index 9cb35d6..f636ad3 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128StarStar.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128StarStar.java
@@ -66,21 +66,8 @@ public class XoShiRo128StarStar extends AbstractXoShiRo128 {
 
     /** {@inheritDoc} */
     @Override
-    public int next() {
-        final int result = Integer.rotateLeft(state0 * 5, 7) * 9;
-
-        final int t = state1 << 9;
-
-        state2 ^= state0;
-        state3 ^= state1;
-        state1 ^= state2;
-        state0 ^= state3;
-
-        state2 ^= t;
-
-        state3 = Integer.rotateLeft(state3, 11);
-
-        return result;
+    protected int nextOutput() {
+        return Integer.rotateLeft(state0 * 5, 7) * 9;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java
index 6530aeb..794eef6 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java
@@ -117,6 +117,30 @@ abstract class AbstractXoRoShiRo128 extends LongProvider implements LongJumpable
         super.setStateInternal(c[1]);
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public long next() {
+        final long result = nextOutput();
+
+        final long s0 = state0;
+        long s1 = state1;
+
+        s1 ^= s0;
+        state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
+        state1 = Long.rotateLeft(s1, 37); // c
+
+        return result;
+    }
+
+    /**
+     * Use the current state to compute the next output from the generator.
+     * The output function shall vary with respect to different generators.
+     * This method is called from {@link #next()} before the current state is updated.
+     *
+     * @return the next output
+     */
+    protected abstract long nextOutput();
+
     /**
      * {@inheritDoc}
      *
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java
index af603ca..12a292e 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java
@@ -130,6 +130,34 @@ abstract class AbstractXoShiRo256 extends LongProvider implements LongJumpableUn
         super.setStateInternal(c[1]);
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public long next() {
+        final long result = nextOutput();
+
+        final long t = state1 << 17;
+
+        state2 ^= state0;
+        state3 ^= state1;
+        state1 ^= state2;
+        state0 ^= state3;
+
+        state2 ^= t;
+
+        state3 = Long.rotateLeft(state3, 45);
+
+        return result;
+    }
+
+    /**
+     * Use the current state to compute the next output from the generator.
+     * The output function shall vary with respect to different generators.
+     * This method is called from {@link #next()} before the current state is updated.
+     *
+     * @return the next output
+     */
+    protected abstract long nextOutput();
+
     /**
      * {@inheritDoc}
      *
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java
index d4f5be2..d6ebd05 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java
@@ -158,6 +158,38 @@ abstract class AbstractXoShiRo512 extends LongProvider implements LongJumpableUn
         super.setStateInternal(c[1]);
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public long next() {
+        final long result = nextOutput();
+
+        final long t = state1 << 11;
+
+        state2 ^= state0;
+        state5 ^= state1;
+        state1 ^= state2;
+        state7 ^= state3;
+        state3 ^= state4;
+        state4 ^= state5;
+        state0 ^= state6;
+        state6 ^= state7;
+
+        state6 ^= t;
+
+        state7 = Long.rotateLeft(state7, 21);
+
+        return result;
+    }
+
+    /**
+     * Use the current state to compute the next output from the generator.
+     * The output function shall vary with respect to different generators.
+     * This method is called from {@link #next()} before the current state is updated.
+     *
+     * @return the next output
+     */
+    protected abstract long nextOutput();
+
     /**
      * {@inheritDoc}
      *
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128Plus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128Plus.java
index f8386fd..ce7c9b5 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128Plus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128Plus.java
@@ -65,16 +65,8 @@ public class XoRoShiRo128Plus extends AbstractXoRoShiRo128 {
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long s0 = state0;
-        long s1 = state1;
-        final long result = s0 + s1;
-
-        s1 ^= s0;
-        state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
-        state1 = Long.rotateLeft(s1, 37); // c
-
-        return result;
+    protected long nextOutput() {
+        return state0 + state1;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlus.java
index d753745..d6c20d9 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlus.java
@@ -77,6 +77,9 @@ public class XoRoShiRo128PlusPlus extends AbstractXoRoShiRo128 {
     /** {@inheritDoc} */
     @Override
     public long next() {
+        // Override the abstract class to use a different state update step.
+        // Note: This requires different jump coefficients.
+
         final long s0 = state0;
         long s1 = state1;
         final long result = Long.rotateLeft(s0 + s1, 17) + s0;
@@ -90,6 +93,12 @@ public class XoRoShiRo128PlusPlus extends AbstractXoRoShiRo128 {
 
     /** {@inheritDoc} */
     @Override
+    protected long nextOutput() {
+        throw new UnsupportedOperationException("The PlusPlus algorithm redefines the next() method");
+    }
+
+    /** {@inheritDoc} */
+    @Override
     public UniformRandomProvider jump() {
         // Duplicated from the abstract class to change the jump coefficients
         final UniformRandomProvider copy = copy();
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
index c926d17..f115fed 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
@@ -64,16 +64,8 @@ public class XoRoShiRo128StarStar extends AbstractXoRoShiRo128 {
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long s0 = state0;
-        long s1 = state1;
-        final long result = Long.rotateLeft(s0 * 5, 7) * 9;
-
-        s1 ^= s0;
-        state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
-        state1 = Long.rotateLeft(s1, 37); // c
-
-        return result;
+    protected long nextOutput() {
+        return Long.rotateLeft(state0 * 5, 7) * 9;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256Plus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256Plus.java
index 46591af..838a12c 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256Plus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256Plus.java
@@ -66,21 +66,8 @@ public class XoShiRo256Plus extends AbstractXoShiRo256 {
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long result = state0 + state3;
-
-        final long t = state1 << 17;
-
-        state2 ^= state0;
-        state3 ^= state1;
-        state1 ^= state2;
-        state0 ^= state3;
-
-        state2 ^= t;
-
-        state3 = Long.rotateLeft(state3, 45);
-
-        return result;
+    protected long nextOutput() {
+        return state0 + state3;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlus.java
index 4d43e23..4c398f4 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlus.java
@@ -65,21 +65,8 @@ public class XoShiRo256PlusPlus extends AbstractXoShiRo256 {
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long result = Long.rotateLeft(state0 + state3, 23) + state0;
-
-        final long t = state1 << 17;
-
-        state2 ^= state0;
-        state3 ^= state1;
-        state1 ^= state2;
-        state0 ^= state3;
-
-        state2 ^= t;
-
-        state3 = Long.rotateLeft(state3, 45);
-
-        return result;
+    protected long nextOutput() {
+        return Long.rotateLeft(state0 + state3, 23) + state0;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256StarStar.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256StarStar.java
index 2be5ddc..11a4bb5 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256StarStar.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256StarStar.java
@@ -65,21 +65,8 @@ public class XoShiRo256StarStar extends AbstractXoShiRo256 {
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long result = Long.rotateLeft(state1 * 5, 7) * 9;
-
-        final long t = state1 << 17;
-
-        state2 ^= state0;
-        state3 ^= state1;
-        state1 ^= state2;
-        state0 ^= state3;
-
-        state2 ^= t;
-
-        state3 = Long.rotateLeft(state3, 45);
-
-        return result;
+    protected long nextOutput() {
+        return Long.rotateLeft(state1 * 5, 7) * 9;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512Plus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512Plus.java
index f515e4d..678f5d4 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512Plus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512Plus.java
@@ -72,25 +72,8 @@ public class XoShiRo512Plus extends AbstractXoShiRo512 {
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long result = state0 + state2;
-
-        final long t = state1 << 11;
-
-        state2 ^= state0;
-        state5 ^= state1;
-        state1 ^= state2;
-        state7 ^= state3;
-        state3 ^= state4;
-        state4 ^= state5;
-        state0 ^= state6;
-        state6 ^= state7;
-
-        state6 ^= t;
-
-        state7 = Long.rotateLeft(state7, 21);
-
-        return result;
+    protected long nextOutput() {
+        return state0 + state2;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlus.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlus.java
index 0223944..7989516 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlus.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlus.java
@@ -71,25 +71,8 @@ public class XoShiRo512PlusPlus extends AbstractXoShiRo512 {
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long result = Long.rotateLeft(state0 + state2, 17) + state2;
-
-        final long t = state1 << 11;
-
-        state2 ^= state0;
-        state5 ^= state1;
-        state1 ^= state2;
-        state7 ^= state3;
-        state3 ^= state4;
-        state4 ^= state5;
-        state0 ^= state6;
-        state6 ^= state7;
-
-        state6 ^= t;
-
-        state7 = Long.rotateLeft(state7, 21);
-
-        return result;
+    protected long nextOutput() {
+        return Long.rotateLeft(state0 + state2, 17) + state2;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512StarStar.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512StarStar.java
index d997afd..756a7fe 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512StarStar.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512StarStar.java
@@ -71,25 +71,8 @@ public class XoShiRo512StarStar extends AbstractXoShiRo512 {
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long result = Long.rotateLeft(state1 * 5, 7) * 9;
-
-        final long t = state1 << 11;
-
-        state2 ^= state0;
-        state5 ^= state1;
-        state1 ^= state2;
-        state7 ^= state3;
-        state3 ^= state4;
-        state4 ^= state5;
-        state0 ^= state6;
-        state6 ^= state7;
-
-        state6 ^= t;
-
-        state7 = Long.rotateLeft(state7, 21);
-
-        return result;
+    protected long nextOutput() {
+        return Long.rotateLeft(state1 * 5, 7) * 9;
     }
 
     /** {@inheritDoc} */
diff --git a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlusTest.java b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlusTest.java
index dd3af12..b75b5c6 100644
--- a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlusTest.java
+++ b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlusTest.java
@@ -109,4 +109,14 @@ public class XoRoShiRo128PlusPlusTest {
     public void testLongJump() {
         RandomAssert.assertLongJumpEquals(EXPECTED_SEQUENCE, EXPECTED_SEQUENCE_AFTER_LONG_JUMP, new XoRoShiRo128PlusPlus(SEED));
     }
+
+    /**
+     * This PlusPlus algorithm uses a different state update step. It overrides next() directly
+     * and the abstract nextOutput() method should not be used. This test checks the method
+     * throws an exception if used.
+     */
+    @Test(expected = UnsupportedOperationException.class)
+    public void testNextOutputThrows() {
+        new XoRoShiRo128PlusPlus(SEED).nextOutput();
+    }
 }