Added: websites/production/commons/content/proper/commons-rng/commons-rng-core/javadocs/api-1.1/src-html/org/apache/commons/rng/core/source64/TwoCmres.html ============================================================================== --- websites/production/commons/content/proper/commons-rng/commons-rng-core/javadocs/api-1.1/src-html/org/apache/commons/rng/core/source64/TwoCmres.html (added) +++ websites/production/commons/content/proper/commons-rng/commons-rng-core/javadocs/api-1.1/src-html/org/apache/commons/rng/core/source64/TwoCmres.html Tue Aug 14 12:48:23 2018 @@ -0,0 +1,381 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html lang="en"> +<head> +<title>Source code</title> +<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style"> +</head> +<body> +<div class="sourceContainer"> +<pre><span class="sourceLineNo">001</span><a name="line.1">/*</a> +<span class="sourceLineNo">002</span><a name="line.2"> * Licensed to the Apache Software Foundation (ASF) under one or more</a> +<span class="sourceLineNo">003</span><a name="line.3"> * contributor license agreements. See the NOTICE file distributed with</a> +<span class="sourceLineNo">004</span><a name="line.4"> * this work for additional information regarding copyright ownership.</a> +<span class="sourceLineNo">005</span><a name="line.5"> * The ASF licenses this file to You under the Apache License, Version 2.0</a> +<span class="sourceLineNo">006</span><a name="line.6"> * (the "License"); you may not use this file except in compliance with</a> +<span class="sourceLineNo">007</span><a name="line.7"> * the License. You may obtain a copy of the License at</a> +<span class="sourceLineNo">008</span><a name="line.8"> *</a> +<span class="sourceLineNo">009</span><a name="line.9"> * http://www.apache.org/licenses/LICENSE-2.0</a> +<span class="sourceLineNo">010</span><a name="line.10"> *</a> +<span class="sourceLineNo">011</span><a name="line.11"> * Unless required by applicable law or agreed to in writing, software</a> +<span class="sourceLineNo">012</span><a name="line.12"> * distributed under the License is distributed on an "AS IS" BASIS,</a> +<span class="sourceLineNo">013</span><a name="line.13"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</a> +<span class="sourceLineNo">014</span><a name="line.14"> * See the License for the specific language governing permissions and</a> +<span class="sourceLineNo">015</span><a name="line.15"> * limitations under the License.</a> +<span class="sourceLineNo">016</span><a name="line.16"> */</a> +<span class="sourceLineNo">017</span><a name="line.17"></a> +<span class="sourceLineNo">018</span><a name="line.18">package org.apache.commons.rng.core.source64;</a> +<span class="sourceLineNo">019</span><a name="line.19"></a> +<span class="sourceLineNo">020</span><a name="line.20">import java.util.List;</a> +<span class="sourceLineNo">021</span><a name="line.21">import java.util.ArrayList;</a> +<span class="sourceLineNo">022</span><a name="line.22">import org.apache.commons.rng.core.util.NumberFactory;</a> +<span class="sourceLineNo">023</span><a name="line.23"></a> +<span class="sourceLineNo">024</span><a name="line.24">/**</a> +<span class="sourceLineNo">025</span><a name="line.25"> * Random number generator designed by Mark D.&nbsp;Overton.</a> +<span class="sourceLineNo">026</span><a name="line.26"> *</a> +<span class="sourceLineNo">027</span><a name="line.27"> * <p>It is one of the many generators described by the author in the following article series:</p></a> +<span class="sourceLineNo">028</span><a name="line.28"> * <ul></a> +<span class="sourceLineNo">029</span><a name="line.29"> * <li><a href="http://www.drdobbs.com/tools/fast-high-quality-parallel-random-number/229625477">Part one</a></li></a> +<span class="sourceLineNo">030</span><a name="line.30"> * <li><a href="http://www.drdobbs.com/tools/fast-high-quality-parallel-random-number/231000484">Part two</a></li></a> +<span class="sourceLineNo">031</span><a name="line.31"> * </ul></a> +<span class="sourceLineNo">032</span><a name="line.32"> *</a> +<span class="sourceLineNo">033</span><a name="line.33"> * @since 1.0</a> +<span class="sourceLineNo">034</span><a name="line.34"> */</a> +<span class="sourceLineNo">035</span><a name="line.35">public class TwoCmres extends LongProvider {</a> +<span class="sourceLineNo">036</span><a name="line.36"> /** Error message. */</a> +<span class="sourceLineNo">037</span><a name="line.37"> private static final String INTERNAL_ERROR_MSG = "Internal error: Please file a bug report";</a> +<span class="sourceLineNo">038</span><a name="line.38"> /** A small positive integer. */</a> +<span class="sourceLineNo">039</span><a name="line.39"> private static final byte SEED_GUARD = 9;</a> +<span class="sourceLineNo">040</span><a name="line.40"> /** Factory of instances of this class. Singleton. */</a> +<span class="sourceLineNo">041</span><a name="line.41"> private static final Cmres.Factory FACTORY = new Cmres.Factory();</a> +<span class="sourceLineNo">042</span><a name="line.42"> /** First subcycle generator. */</a> +<span class="sourceLineNo">043</span><a name="line.43"> private final Cmres x;</a> +<span class="sourceLineNo">044</span><a name="line.44"> /** Second subcycle generator. */</a> +<span class="sourceLineNo">045</span><a name="line.45"> private final Cmres y;</a> +<span class="sourceLineNo">046</span><a name="line.46"> /** State of first subcycle generator. */</a> +<span class="sourceLineNo">047</span><a name="line.47"> private long xx;</a> +<span class="sourceLineNo">048</span><a name="line.48"> /** State of second subcycle generator. */</a> +<span class="sourceLineNo">049</span><a name="line.49"> private long yy;</a> +<span class="sourceLineNo">050</span><a name="line.50"></a> +<span class="sourceLineNo">051</span><a name="line.51"> /**</a> +<span class="sourceLineNo">052</span><a name="line.52"> * Creates a new instance.</a> +<span class="sourceLineNo">053</span><a name="line.53"> *</a> +<span class="sourceLineNo">054</span><a name="line.54"> * @param seed Initial seed.</a> +<span class="sourceLineNo">055</span><a name="line.55"> * @param x First subcycle generator.</a> +<span class="sourceLineNo">056</span><a name="line.56"> * @param y Second subcycle generator.</a> +<span class="sourceLineNo">057</span><a name="line.57"> * @throws IllegalArgumentException if {@code x == y}.</a> +<span class="sourceLineNo">058</span><a name="line.58"> */</a> +<span class="sourceLineNo">059</span><a name="line.59"> private TwoCmres(int seed,</a> +<span class="sourceLineNo">060</span><a name="line.60"> Cmres x,</a> +<span class="sourceLineNo">061</span><a name="line.61"> Cmres y) {</a> +<span class="sourceLineNo">062</span><a name="line.62"> if (x == y) {</a> +<span class="sourceLineNo">063</span><a name="line.63"> throw new IllegalArgumentException("Subcycle generators must be different");</a> +<span class="sourceLineNo">064</span><a name="line.64"> }</a> +<span class="sourceLineNo">065</span><a name="line.65"> this.x = x;</a> +<span class="sourceLineNo">066</span><a name="line.66"> this.y = y;</a> +<span class="sourceLineNo">067</span><a name="line.67"> setSeedInternal(seed);</a> +<span class="sourceLineNo">068</span><a name="line.68"> }</a> +<span class="sourceLineNo">069</span><a name="line.69"></a> +<span class="sourceLineNo">070</span><a name="line.70"> /**</a> +<span class="sourceLineNo">071</span><a name="line.71"> * Creates a new instance.</a> +<span class="sourceLineNo">072</span><a name="line.72"> *</a> +<span class="sourceLineNo">073</span><a name="line.73"> * @param seed Seed.</a> +<span class="sourceLineNo">074</span><a name="line.74"> */</a> +<span class="sourceLineNo">075</span><a name="line.75"> public TwoCmres(Integer seed) {</a> +<span class="sourceLineNo">076</span><a name="line.76"> this(seed, 0, 1);</a> +<span class="sourceLineNo">077</span><a name="line.77"> }</a> +<span class="sourceLineNo">078</span><a name="line.78"></a> +<span class="sourceLineNo">079</span><a name="line.79"> /**</a> +<span class="sourceLineNo">080</span><a name="line.80"> * Creates a new instance.</a> +<span class="sourceLineNo">081</span><a name="line.81"> *</a> +<span class="sourceLineNo">082</span><a name="line.82"> * @param seed Seed.</a> +<span class="sourceLineNo">083</span><a name="line.83"> * @param i Table entry for first subcycle generator.</a> +<span class="sourceLineNo">084</span><a name="line.84"> * @param j Table entry for second subcycle generator.</a> +<span class="sourceLineNo">085</span><a name="line.85"> * @throws IllegalArgumentException if {@code i == j}.</a> +<span class="sourceLineNo">086</span><a name="line.86"> * @throws IndexOutOfBoundsException if {@code i < 0} or</a> +<span class="sourceLineNo">087</span><a name="line.87"> * {@code i >= numberOfSubcycleGenerators()}.</a> +<span class="sourceLineNo">088</span><a name="line.88"> * @throws IndexOutOfBoundsException if {@code j < 0} or</a> +<span class="sourceLineNo">089</span><a name="line.89"> * {@code j >= numberOfSubcycleGenerators()}.</a> +<span class="sourceLineNo">090</span><a name="line.90"> */</a> +<span class="sourceLineNo">091</span><a name="line.91"> public TwoCmres(Integer seed,</a> +<span class="sourceLineNo">092</span><a name="line.92"> int i,</a> +<span class="sourceLineNo">093</span><a name="line.93"> int j) {</a> +<span class="sourceLineNo">094</span><a name="line.94"> this(seed, FACTORY.get(i), FACTORY.get(j));</a> +<span class="sourceLineNo">095</span><a name="line.95"> }</a> +<span class="sourceLineNo">096</span><a name="line.96"></a> +<span class="sourceLineNo">097</span><a name="line.97"> /** {@inheritDoc} */</a> +<span class="sourceLineNo">098</span><a name="line.98"> @Override</a> +<span class="sourceLineNo">099</span><a name="line.99"> public long next() {</a> +<span class="sourceLineNo">100</span><a name="line.100"> xx = x.transform(xx);</a> +<span class="sourceLineNo">101</span><a name="line.101"> yy = y.transform(yy);</a> +<span class="sourceLineNo">102</span><a name="line.102"></a> +<span class="sourceLineNo">103</span><a name="line.103"> return xx + yy;</a> +<span class="sourceLineNo">104</span><a name="line.104"> }</a> +<span class="sourceLineNo">105</span><a name="line.105"></a> +<span class="sourceLineNo">106</span><a name="line.106"> /** {@inheritDoc} */</a> +<span class="sourceLineNo">107</span><a name="line.107"> @Override</a> +<span class="sourceLineNo">108</span><a name="line.108"> public String toString() {</a> +<span class="sourceLineNo">109</span><a name="line.109"> return super.toString() + " (" + x + " + " + y + ")";</a> +<span class="sourceLineNo">110</span><a name="line.110"> }</a> +<span class="sourceLineNo">111</span><a name="line.111"></a> +<span class="sourceLineNo">112</span><a name="line.112"> /**</a> +<span class="sourceLineNo">113</span><a name="line.113"> * @return the number of subcycle generators.</a> +<span class="sourceLineNo">114</span><a name="line.114"> */</a> +<span class="sourceLineNo">115</span><a name="line.115"> public static int numberOfSubcycleGenerators() {</a> +<span class="sourceLineNo">116</span><a name="line.116"> return FACTORY.numberOfSubcycleGenerators();</a> +<span class="sourceLineNo">117</span><a name="line.117"> }</a> +<span class="sourceLineNo">118</span><a name="line.118"></a> +<span class="sourceLineNo">119</span><a name="line.119"> /** {@inheritDoc} */</a> +<span class="sourceLineNo">120</span><a name="line.120"> @Override</a> +<span class="sourceLineNo">121</span><a name="line.121"> protected byte[] getStateInternal() {</a> +<span class="sourceLineNo">122</span><a name="line.122"> return NumberFactory.makeByteArray(new long[] { xx, yy });</a> +<span class="sourceLineNo">123</span><a name="line.123"> }</a> +<span class="sourceLineNo">124</span><a name="line.124"></a> +<span class="sourceLineNo">125</span><a name="line.125"> /** {@inheritDoc} */</a> +<span class="sourceLineNo">126</span><a name="line.126"> @Override</a> +<span class="sourceLineNo">127</span><a name="line.127"> protected void setStateInternal(byte[] s) {</a> +<span class="sourceLineNo">128</span><a name="line.128"> checkStateSize(s, 16);</a> +<span class="sourceLineNo">129</span><a name="line.129"></a> +<span class="sourceLineNo">130</span><a name="line.130"> final long[] state = NumberFactory.makeLongArray(s);</a> +<span class="sourceLineNo">131</span><a name="line.131"> xx = state[0];</a> +<span class="sourceLineNo">132</span><a name="line.132"> yy = state[1];</a> +<span class="sourceLineNo">133</span><a name="line.133"> }</a> +<span class="sourceLineNo">134</span><a name="line.134"></a> +<span class="sourceLineNo">135</span><a name="line.135"> /**</a> +<span class="sourceLineNo">136</span><a name="line.136"> * @param seed Seed.</a> +<span class="sourceLineNo">137</span><a name="line.137"> */</a> +<span class="sourceLineNo">138</span><a name="line.138"> private void setSeedInternal(int seed) {</a> +<span class="sourceLineNo">139</span><a name="line.139"> // The seeding procedure consists in going away from some</a> +<span class="sourceLineNo">140</span><a name="line.140"> // point known to be in the cycle.</a> +<span class="sourceLineNo">141</span><a name="line.141"> // The total number of calls to the "transform" method will</a> +<span class="sourceLineNo">142</span><a name="line.142"> // not exceed about 130,000 (which is negligible as seeding</a> +<span class="sourceLineNo">143</span><a name="line.143"> // will not occur more than once in normal usage).</a> +<span class="sourceLineNo">144</span><a name="line.144"></a> +<span class="sourceLineNo">145</span><a name="line.145"> // Make two positive 16-bits integers.</a> +<span class="sourceLineNo">146</span><a name="line.146"> final long s = NumberFactory.makeLong(0, seed); // s >= 0</a> +<span class="sourceLineNo">147</span><a name="line.147"> final int xMax = (int) ((s & 0xffff) + SEED_GUARD);</a> +<span class="sourceLineNo">148</span><a name="line.148"> final int yMax = (int) ((s >> 16) + SEED_GUARD);</a> +<span class="sourceLineNo">149</span><a name="line.149"></a> +<span class="sourceLineNo">150</span><a name="line.150"> if (xMax < 0 ||</a> +<span class="sourceLineNo">151</span><a name="line.151"> yMax < 0) {</a> +<span class="sourceLineNo">152</span><a name="line.152"> throw new IllegalStateException(INTERNAL_ERROR_MSG);</a> +<span class="sourceLineNo">153</span><a name="line.153"> }</a> +<span class="sourceLineNo">154</span><a name="line.154"></a> +<span class="sourceLineNo">155</span><a name="line.155"> xx = x.getStart();</a> +<span class="sourceLineNo">156</span><a name="line.156"> for (int i = xMax; i > 0; i--) {</a> +<span class="sourceLineNo">157</span><a name="line.157"> xx = x.transform(xx);</a> +<span class="sourceLineNo">158</span><a name="line.158"> }</a> +<span class="sourceLineNo">159</span><a name="line.159"></a> +<span class="sourceLineNo">160</span><a name="line.160"> yy = y.getStart();</a> +<span class="sourceLineNo">161</span><a name="line.161"> for (int i = yMax; i > 0; i--) {</a> +<span class="sourceLineNo">162</span><a name="line.162"> yy = y.transform(yy);</a> +<span class="sourceLineNo">163</span><a name="line.163"> }</a> +<span class="sourceLineNo">164</span><a name="line.164"> }</a> +<span class="sourceLineNo">165</span><a name="line.165"></a> +<span class="sourceLineNo">166</span><a name="line.166"> /**</a> +<span class="sourceLineNo">167</span><a name="line.167"> * Subcycle generator.</a> +<span class="sourceLineNo">168</span><a name="line.168"> * Class is immutable.</a> +<span class="sourceLineNo">169</span><a name="line.169"> */</a> +<span class="sourceLineNo">170</span><a name="line.170"> static class Cmres {</a> +<span class="sourceLineNo">171</span><a name="line.171"> /** Separator. */</a> +<span class="sourceLineNo">172</span><a name="line.172"> private static final String SEP = ", ";</a> +<span class="sourceLineNo">173</span><a name="line.173"> /** Hexadecimal format. */</a> +<span class="sourceLineNo">174</span><a name="line.174"> private static final String HEX_FORMAT = "0x%016xL";</a> +<span class="sourceLineNo">175</span><a name="line.175"> /** Cycle start. */</a> +<span class="sourceLineNo">176</span><a name="line.176"> private final int start;</a> +<span class="sourceLineNo">177</span><a name="line.177"> /** Multiplier. */</a> +<span class="sourceLineNo">178</span><a name="line.178"> private final long multiply;</a> +<span class="sourceLineNo">179</span><a name="line.179"> /** Rotation. */</a> +<span class="sourceLineNo">180</span><a name="line.180"> private final int rotate;</a> +<span class="sourceLineNo">181</span><a name="line.181"></a> +<span class="sourceLineNo">182</span><a name="line.182"> /**</a> +<span class="sourceLineNo">183</span><a name="line.183"> * @param multiply Multiplier.</a> +<span class="sourceLineNo">184</span><a name="line.184"> * @param rotate Positive number. Must be in {@code [0, 64]}.</a> +<span class="sourceLineNo">185</span><a name="line.185"> * @param start Cycle start.</a> +<span class="sourceLineNo">186</span><a name="line.186"> */</a> +<span class="sourceLineNo">187</span><a name="line.187"> Cmres(long multiply,</a> +<span class="sourceLineNo">188</span><a name="line.188"> int rotate,</a> +<span class="sourceLineNo">189</span><a name="line.189"> int start) {</a> +<span class="sourceLineNo">190</span><a name="line.190"> this.multiply = multiply;</a> +<span class="sourceLineNo">191</span><a name="line.191"> this.rotate = rotate;</a> +<span class="sourceLineNo">192</span><a name="line.192"> this.start = start;</a> +<span class="sourceLineNo">193</span><a name="line.193"> }</a> +<span class="sourceLineNo">194</span><a name="line.194"></a> +<span class="sourceLineNo">195</span><a name="line.195"> /** {@inheritDoc} */</a> +<span class="sourceLineNo">196</span><a name="line.196"> @Override</a> +<span class="sourceLineNo">197</span><a name="line.197"> public String toString() {</a> +<span class="sourceLineNo">198</span><a name="line.198"> final String m = String.format((java.util.Locale) null, HEX_FORMAT, multiply);</a> +<span class="sourceLineNo">199</span><a name="line.199"> return "Cmres: [" + m + SEP + rotate + SEP + start + "]";</a> +<span class="sourceLineNo">200</span><a name="line.200"> }</a> +<span class="sourceLineNo">201</span><a name="line.201"></a> +<span class="sourceLineNo">202</span><a name="line.202"> /**</a> +<span class="sourceLineNo">203</span><a name="line.203"> * @return the multiplier.</a> +<span class="sourceLineNo">204</span><a name="line.204"> */</a> +<span class="sourceLineNo">205</span><a name="line.205"> public long getMultiply() {</a> +<span class="sourceLineNo">206</span><a name="line.206"> return multiply;</a> +<span class="sourceLineNo">207</span><a name="line.207"> }</a> +<span class="sourceLineNo">208</span><a name="line.208"></a> +<span class="sourceLineNo">209</span><a name="line.209"> /**</a> +<span class="sourceLineNo">210</span><a name="line.210"> * @return the cycle start.</a> +<span class="sourceLineNo">211</span><a name="line.211"> */</a> +<span class="sourceLineNo">212</span><a name="line.212"> public int getStart() {</a> +<span class="sourceLineNo">213</span><a name="line.213"> return start;</a> +<span class="sourceLineNo">214</span><a name="line.214"> }</a> +<span class="sourceLineNo">215</span><a name="line.215"></a> +<span class="sourceLineNo">216</span><a name="line.216"> /**</a> +<span class="sourceLineNo">217</span><a name="line.217"> * @param state Current state.</a> +<span class="sourceLineNo">218</span><a name="line.218"> * @return the new state.</a> +<span class="sourceLineNo">219</span><a name="line.219"> */</a> +<span class="sourceLineNo">220</span><a name="line.220"> long transform(long state) {</a> +<span class="sourceLineNo">221</span><a name="line.221"> long s = state;</a> +<span class="sourceLineNo">222</span><a name="line.222"> s *= multiply;</a> +<span class="sourceLineNo">223</span><a name="line.223"> s = rotl(s);</a> +<span class="sourceLineNo">224</span><a name="line.224"> s -= state;</a> +<span class="sourceLineNo">225</span><a name="line.225"> return s;</a> +<span class="sourceLineNo">226</span><a name="line.226"> }</a> +<span class="sourceLineNo">227</span><a name="line.227"></a> +<span class="sourceLineNo">228</span><a name="line.228"> /**</a> +<span class="sourceLineNo">229</span><a name="line.229"> * @param state State.</a> +<span class="sourceLineNo">230</span><a name="line.230"> * @return the rotated state.</a> +<span class="sourceLineNo">231</span><a name="line.231"> */</a> +<span class="sourceLineNo">232</span><a name="line.232"> private long rotl(long state) {</a> +<span class="sourceLineNo">233</span><a name="line.233"> return (state << rotate) | (state >>> (64 - rotate));</a> +<span class="sourceLineNo">234</span><a name="line.234"> }</a> +<span class="sourceLineNo">235</span><a name="line.235"></a> +<span class="sourceLineNo">236</span><a name="line.236"> /** Factory. */</a> +<span class="sourceLineNo">237</span><a name="line.237"> static class Factory {</a> +<span class="sourceLineNo">238</span><a name="line.238"> /** List of good "Cmres" subcycle generators. */</a> +<span class="sourceLineNo">239</span><a name="line.239"> private static final List<Cmres> TABLE = new ArrayList<Cmres>();</a> +<span class="sourceLineNo">240</span><a name="line.240"></a> +<span class="sourceLineNo">241</span><a name="line.241"> /**</a> +<span class="sourceLineNo">242</span><a name="line.242"> * Populates the table.</a> +<span class="sourceLineNo">243</span><a name="line.243"> * It lists parameters known to be good (provided in</a> +<span class="sourceLineNo">244</span><a name="line.244"> * the article referred to above).</a> +<span class="sourceLineNo">245</span><a name="line.245"> * To maintain compatibility, new entries must be added</a> +<span class="sourceLineNo">246</span><a name="line.246"> * only at the end of the table.</a> +<span class="sourceLineNo">247</span><a name="line.247"> */</a> +<span class="sourceLineNo">248</span><a name="line.248"> static {</a> +<span class="sourceLineNo">249</span><a name="line.249"> add(0xedce446814d3b3d9L, 33, 0x13b572e7);</a> +<span class="sourceLineNo">250</span><a name="line.250"> add(0xc5b3cf786c806df7L, 33, 0x13c8e18a);</a> +<span class="sourceLineNo">251</span><a name="line.251"> add(0xdd91bbb8ab9e0e65L, 31, 0x06dd03a6);</a> +<span class="sourceLineNo">252</span><a name="line.252"> add(0x7b69342c0790221dL, 31, 0x1646bb8b);</a> +<span class="sourceLineNo">253</span><a name="line.253"> add(0x0c72c0d18614c32bL, 33, 0x06014a3d);</a> +<span class="sourceLineNo">254</span><a name="line.254"> add(0xd8d98c13bebe26c9L, 33, 0x014e8475);</a> +<span class="sourceLineNo">255</span><a name="line.255"> add(0xcb039dc328bbc40fL, 31, 0x008684bd);</a> +<span class="sourceLineNo">256</span><a name="line.256"> add(0x858c5ef3c021ed2fL, 32, 0x0dc8d622);</a> +<span class="sourceLineNo">257</span><a name="line.257"> add(0x4c8be96bfc23b127L, 33, 0x0b6b20cc);</a> +<span class="sourceLineNo">258</span><a name="line.258"> add(0x11eab77f808cf641L, 32, 0x06534421);</a> +<span class="sourceLineNo">259</span><a name="line.259"> add(0xbc9bd78810fd28fdL, 31, 0x1d9ba40d);</a> +<span class="sourceLineNo">260</span><a name="line.260"> add(0x0f1505c780688cb5L, 33, 0x0b7b7b67);</a> +<span class="sourceLineNo">261</span><a name="line.261"> add(0xadc174babc2053afL, 31, 0x267f4197);</a> +<span class="sourceLineNo">262</span><a name="line.262"> add(0x900b6b82b31686d9L, 31, 0x023c6985);</a> +<span class="sourceLineNo">263</span><a name="line.263"> // Add new entries here.</a> +<span class="sourceLineNo">264</span><a name="line.264"> }</a> +<span class="sourceLineNo">265</span><a name="line.265"></a> +<span class="sourceLineNo">266</span><a name="line.266"> /**</a> +<span class="sourceLineNo">267</span><a name="line.267"> * @return the number of subcycle generators.</a> +<span class="sourceLineNo">268</span><a name="line.268"> */</a> +<span class="sourceLineNo">269</span><a name="line.269"> int numberOfSubcycleGenerators() {</a> +<span class="sourceLineNo">270</span><a name="line.270"> return TABLE.size();</a> +<span class="sourceLineNo">271</span><a name="line.271"> }</a> +<span class="sourceLineNo">272</span><a name="line.272"></a> +<span class="sourceLineNo">273</span><a name="line.273"> /**</a> +<span class="sourceLineNo">274</span><a name="line.274"> * @param index Index into the list of available generators.</a> +<span class="sourceLineNo">275</span><a name="line.275"> * @return the subcycle generator entry at index {@code index}.</a> +<span class="sourceLineNo">276</span><a name="line.276"> */</a> +<span class="sourceLineNo">277</span><a name="line.277"> Cmres get(int index) {</a> +<span class="sourceLineNo">278</span><a name="line.278"> if (index < 0 ||</a> +<span class="sourceLineNo">279</span><a name="line.279"> index >= TABLE.size()) {</a> +<span class="sourceLineNo">280</span><a name="line.280"> throw new IndexOutOfBoundsException("Out of interval [0, " +</a> +<span class="sourceLineNo">281</span><a name="line.281"> (TABLE.size() - 1) + "]");</a> +<span class="sourceLineNo">282</span><a name="line.282"> }</a> +<span class="sourceLineNo">283</span><a name="line.283"></a> +<span class="sourceLineNo">284</span><a name="line.284"> return TABLE.get(index);</a> +<span class="sourceLineNo">285</span><a name="line.285"> }</a> +<span class="sourceLineNo">286</span><a name="line.286"></a> +<span class="sourceLineNo">287</span><a name="line.287"> /**</a> +<span class="sourceLineNo">288</span><a name="line.288"> * Adds an entry to the {@link Factory#TABLE}.</a> +<span class="sourceLineNo">289</span><a name="line.289"> *</a> +<span class="sourceLineNo">290</span><a name="line.290"> * @param multiply Multiplier.</a> +<span class="sourceLineNo">291</span><a name="line.291"> * @param rotate Rotate.</a> +<span class="sourceLineNo">292</span><a name="line.292"> * @param start Cycle start.</a> +<span class="sourceLineNo">293</span><a name="line.293"> */</a> +<span class="sourceLineNo">294</span><a name="line.294"> private static void add(long multiply,</a> +<span class="sourceLineNo">295</span><a name="line.295"> int rotate,</a> +<span class="sourceLineNo">296</span><a name="line.296"> int start) {</a> +<span class="sourceLineNo">297</span><a name="line.297"> // Sanity check: if there are duplicates, the class initialization</a> +<span class="sourceLineNo">298</span><a name="line.298"> // will fail (and the JVM will report "NoClassDefFoundError").</a> +<span class="sourceLineNo">299</span><a name="line.299"> for (Cmres sg : TABLE) {</a> +<span class="sourceLineNo">300</span><a name="line.300"> if (multiply == sg.getMultiply()) {</a> +<span class="sourceLineNo">301</span><a name="line.301"> throw new IllegalStateException(INTERNAL_ERROR_MSG);</a> +<span class="sourceLineNo">302</span><a name="line.302"> }</a> +<span class="sourceLineNo">303</span><a name="line.303"> }</a> +<span class="sourceLineNo">304</span><a name="line.304"></a> +<span class="sourceLineNo">305</span><a name="line.305"> TABLE.add(new Cmres(multiply, rotate, start));</a> +<span class="sourceLineNo">306</span><a name="line.306"> }</a> +<span class="sourceLineNo">307</span><a name="line.307"> }</a> +<span class="sourceLineNo">308</span><a name="line.308"> }</a> +<span class="sourceLineNo">309</span><a name="line.309">}</a> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</pre> +</div> +</body> +</html>
Added: websites/production/commons/content/proper/commons-rng/commons-rng-core/javadocs/api-1.1/src-html/org/apache/commons/rng/core/source64/XorShift1024Star.html ============================================================================== --- websites/production/commons/content/proper/commons-rng/commons-rng-core/javadocs/api-1.1/src-html/org/apache/commons/rng/core/source64/XorShift1024Star.html (added) +++ websites/production/commons/content/proper/commons-rng/commons-rng-core/javadocs/api-1.1/src-html/org/apache/commons/rng/core/source64/XorShift1024Star.html Tue Aug 14 12:48:23 2018 @@ -0,0 +1,165 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html lang="en"> +<head> +<title>Source code</title> +<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style"> +</head> +<body> +<div class="sourceContainer"> +<pre><span class="sourceLineNo">001</span><a name="line.1">/*</a> +<span class="sourceLineNo">002</span><a name="line.2"> * Licensed to the Apache Software Foundation (ASF) under one or more</a> +<span class="sourceLineNo">003</span><a name="line.3"> * contributor license agreements. See the NOTICE file distributed with</a> +<span class="sourceLineNo">004</span><a name="line.4"> * this work for additional information regarding copyright ownership.</a> +<span class="sourceLineNo">005</span><a name="line.5"> * The ASF licenses this file to You under the Apache License, Version 2.0</a> +<span class="sourceLineNo">006</span><a name="line.6"> * (the "License"); you may not use this file except in compliance with</a> +<span class="sourceLineNo">007</span><a name="line.7"> * the License. You may obtain a copy of the License at</a> +<span class="sourceLineNo">008</span><a name="line.8"> *</a> +<span class="sourceLineNo">009</span><a name="line.9"> * http://www.apache.org/licenses/LICENSE-2.0</a> +<span class="sourceLineNo">010</span><a name="line.10"> *</a> +<span class="sourceLineNo">011</span><a name="line.11"> * Unless required by applicable law or agreed to in writing, software</a> +<span class="sourceLineNo">012</span><a name="line.12"> * distributed under the License is distributed on an "AS IS" BASIS,</a> +<span class="sourceLineNo">013</span><a name="line.13"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</a> +<span class="sourceLineNo">014</span><a name="line.14"> * See the License for the specific language governing permissions and</a> +<span class="sourceLineNo">015</span><a name="line.15"> * limitations under the License.</a> +<span class="sourceLineNo">016</span><a name="line.16"> */</a> +<span class="sourceLineNo">017</span><a name="line.17"></a> +<span class="sourceLineNo">018</span><a name="line.18">package org.apache.commons.rng.core.source64;</a> +<span class="sourceLineNo">019</span><a name="line.19"></a> +<span class="sourceLineNo">020</span><a name="line.20">import java.util.Arrays;</a> +<span class="sourceLineNo">021</span><a name="line.21">import org.apache.commons.rng.core.util.NumberFactory;</a> +<span class="sourceLineNo">022</span><a name="line.22"></a> +<span class="sourceLineNo">023</span><a name="line.23">/**</a> +<span class="sourceLineNo">024</span><a name="line.24"> * A fast RNG.</a> +<span class="sourceLineNo">025</span><a name="line.25"> *</a> +<span class="sourceLineNo">026</span><a name="line.26"> * @see <a href="http://xorshift.di.unimi.it/xorshift1024star.c"></a> +<span class="sourceLineNo">027</span><a name="line.27"> * Original source code</a></a> +<span class="sourceLineNo">028</span><a name="line.28"> *</a> +<span class="sourceLineNo">029</span><a name="line.29"> * @see <a href="https://en.wikipedia.org/wiki/Xorshift">Xorshift (Wikipedia)</a></a> +<span class="sourceLineNo">030</span><a name="line.30"> * @since 1.0</a> +<span class="sourceLineNo">031</span><a name="line.31"> */</a> +<span class="sourceLineNo">032</span><a name="line.32">public class XorShift1024Star extends LongProvider {</a> +<span class="sourceLineNo">033</span><a name="line.33"> /** Size of the state vector. */</a> +<span class="sourceLineNo">034</span><a name="line.34"> private static final int SEED_SIZE = 16;</a> +<span class="sourceLineNo">035</span><a name="line.35"> /** State. */</a> +<span class="sourceLineNo">036</span><a name="line.36"> private final long[] state = new long[SEED_SIZE];</a> +<span class="sourceLineNo">037</span><a name="line.37"> /** Index in "state" array. */</a> +<span class="sourceLineNo">038</span><a name="line.38"> private int index;</a> +<span class="sourceLineNo">039</span><a name="line.39"></a> +<span class="sourceLineNo">040</span><a name="line.40"> /**</a> +<span class="sourceLineNo">041</span><a name="line.41"> * Creates a new instance.</a> +<span class="sourceLineNo">042</span><a name="line.42"> *</a> +<span class="sourceLineNo">043</span><a name="line.43"> * @param seed Initial seed.</a> +<span class="sourceLineNo">044</span><a name="line.44"> * If the length is larger than 16, only the first 16 elements will</a> +<span class="sourceLineNo">045</span><a name="line.45"> * be used; if smaller, the remaining elements will be automatically</a> +<span class="sourceLineNo">046</span><a name="line.46"> * set.</a> +<span class="sourceLineNo">047</span><a name="line.47"> */</a> +<span class="sourceLineNo">048</span><a name="line.48"> public XorShift1024Star(long[] seed) {</a> +<span class="sourceLineNo">049</span><a name="line.49"> setSeedInternal(seed);</a> +<span class="sourceLineNo">050</span><a name="line.50"> }</a> +<span class="sourceLineNo">051</span><a name="line.51"></a> +<span class="sourceLineNo">052</span><a name="line.52"> /** {@inheritDoc} */</a> +<span class="sourceLineNo">053</span><a name="line.53"> @Override</a> +<span class="sourceLineNo">054</span><a name="line.54"> protected byte[] getStateInternal() {</a> +<span class="sourceLineNo">055</span><a name="line.55"> final long[] s = Arrays.copyOf(state, SEED_SIZE + 1);</a> +<span class="sourceLineNo">056</span><a name="line.56"> s[SEED_SIZE] = index;</a> +<span class="sourceLineNo">057</span><a name="line.57"></a> +<span class="sourceLineNo">058</span><a name="line.58"> return NumberFactory.makeByteArray(s);</a> +<span class="sourceLineNo">059</span><a name="line.59"> }</a> +<span class="sourceLineNo">060</span><a name="line.60"></a> +<span class="sourceLineNo">061</span><a name="line.61"> /** {@inheritDoc} */</a> +<span class="sourceLineNo">062</span><a name="line.62"> @Override</a> +<span class="sourceLineNo">063</span><a name="line.63"> protected void setStateInternal(byte[] s) {</a> +<span class="sourceLineNo">064</span><a name="line.64"> checkStateSize(s, (SEED_SIZE + 1) * 8);</a> +<span class="sourceLineNo">065</span><a name="line.65"></a> +<span class="sourceLineNo">066</span><a name="line.66"> final long[] tmp = NumberFactory.makeLongArray(s);</a> +<span class="sourceLineNo">067</span><a name="line.67"></a> +<span class="sourceLineNo">068</span><a name="line.68"> System.arraycopy(tmp, 0, state, 0, SEED_SIZE);</a> +<span class="sourceLineNo">069</span><a name="line.69"> index = (int) tmp[SEED_SIZE];</a> +<span class="sourceLineNo">070</span><a name="line.70"> }</a> +<span class="sourceLineNo">071</span><a name="line.71"></a> +<span class="sourceLineNo">072</span><a name="line.72"> /**</a> +<span class="sourceLineNo">073</span><a name="line.73"> * Seeds the RNG.</a> +<span class="sourceLineNo">074</span><a name="line.74"> *</a> +<span class="sourceLineNo">075</span><a name="line.75"> * @param seed Seed.</a> +<span class="sourceLineNo">076</span><a name="line.76"> */</a> +<span class="sourceLineNo">077</span><a name="line.77"> private void setSeedInternal(long[] seed) {</a> +<span class="sourceLineNo">078</span><a name="line.78"> // Reset the whole state of this RNG (i.e. "state" and "index").</a> +<span class="sourceLineNo">079</span><a name="line.79"> // Filling procedure is not part of the reference code.</a> +<span class="sourceLineNo">080</span><a name="line.80"> fillState(state, seed);</a> +<span class="sourceLineNo">081</span><a name="line.81"> index = 0;</a> +<span class="sourceLineNo">082</span><a name="line.82"> }</a> +<span class="sourceLineNo">083</span><a name="line.83"></a> +<span class="sourceLineNo">084</span><a name="line.84"> /** {@inheritDoc} */</a> +<span class="sourceLineNo">085</span><a name="line.85"> @Override</a> +<span class="sourceLineNo">086</span><a name="line.86"> public long next() {</a> +<span class="sourceLineNo">087</span><a name="line.87"> final long s0 = state[index];</a> +<span class="sourceLineNo">088</span><a name="line.88"> long s1 = state[index = (index + 1) & 15];</a> +<span class="sourceLineNo">089</span><a name="line.89"> s1 ^= s1 << 31; // a</a> +<span class="sourceLineNo">090</span><a name="line.90"> state[index] = s1 ^ s0 ^ (s1 >>> 11) ^ (s0 >>> 30); // b,c</a> +<span class="sourceLineNo">091</span><a name="line.91"> return state[index] * 1181783497276652981L;</a> +<span class="sourceLineNo">092</span><a name="line.92"> }</a> +<span class="sourceLineNo">093</span><a name="line.93">}</a> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</pre> +</div> +</body> +</html> Added: websites/production/commons/content/proper/commons-rng/commons-rng-core/javadocs/api-1.1/src-html/org/apache/commons/rng/core/util/NumberFactory.html ============================================================================== --- websites/production/commons/content/proper/commons-rng/commons-rng-core/javadocs/api-1.1/src-html/org/apache/commons/rng/core/util/NumberFactory.html (added) +++ websites/production/commons/content/proper/commons-rng/commons-rng-core/javadocs/api-1.1/src-html/org/apache/commons/rng/core/util/NumberFactory.html Tue Aug 14 12:48:23 2018 @@ -0,0 +1,404 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html lang="en"> +<head> +<title>Source code</title> +<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style"> +</head> +<body> +<div class="sourceContainer"> +<pre><span class="sourceLineNo">001</span><a name="line.1">/*</a> +<span class="sourceLineNo">002</span><a name="line.2"> * Licensed to the Apache Software Foundation (ASF) under one or more</a> +<span class="sourceLineNo">003</span><a name="line.3"> * contributor license agreements. See the NOTICE file distributed with</a> +<span class="sourceLineNo">004</span><a name="line.4"> * this work for additional information regarding copyright ownership.</a> +<span class="sourceLineNo">005</span><a name="line.5"> * The ASF licenses this file to You under the Apache License, Version 2.0</a> +<span class="sourceLineNo">006</span><a name="line.6"> * (the "License"); you may not use this file except in compliance with</a> +<span class="sourceLineNo">007</span><a name="line.7"> * the License. You may obtain a copy of the License at</a> +<span class="sourceLineNo">008</span><a name="line.8"> *</a> +<span class="sourceLineNo">009</span><a name="line.9"> * http://www.apache.org/licenses/LICENSE-2.0</a> +<span class="sourceLineNo">010</span><a name="line.10"> *</a> +<span class="sourceLineNo">011</span><a name="line.11"> * Unless required by applicable law or agreed to in writing, software</a> +<span class="sourceLineNo">012</span><a name="line.12"> * distributed under the License is distributed on an "AS IS" BASIS,</a> +<span class="sourceLineNo">013</span><a name="line.13"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</a> +<span class="sourceLineNo">014</span><a name="line.14"> * See the License for the specific language governing permissions and</a> +<span class="sourceLineNo">015</span><a name="line.15"> * limitations under the License.</a> +<span class="sourceLineNo">016</span><a name="line.16"> */</a> +<span class="sourceLineNo">017</span><a name="line.17">package org.apache.commons.rng.core.util;</a> +<span class="sourceLineNo">018</span><a name="line.18"></a> +<span class="sourceLineNo">019</span><a name="line.19">import java.util.Arrays;</a> +<span class="sourceLineNo">020</span><a name="line.20"></a> +<span class="sourceLineNo">021</span><a name="line.21">/**</a> +<span class="sourceLineNo">022</span><a name="line.22"> * Utility for creating number types from one or two {@code int} values</a> +<span class="sourceLineNo">023</span><a name="line.23"> * or one {@code long} value, or a sequence of bytes.</a> +<span class="sourceLineNo">024</span><a name="line.24"> */</a> +<span class="sourceLineNo">025</span><a name="line.25">public final class NumberFactory {</a> +<span class="sourceLineNo">026</span><a name="line.26"> /** See {@link #makeDouble(long)}. */</a> +<span class="sourceLineNo">027</span><a name="line.27"> private static final long DOUBLE_HIGH_BITS = 0x3ffL << 52;</a> +<span class="sourceLineNo">028</span><a name="line.28"> /** See {@link #makeFloat(int)}. */</a> +<span class="sourceLineNo">029</span><a name="line.29"> private static final float FLOAT_MULTIPLIER = 0x1.0p-23f;</a> +<span class="sourceLineNo">030</span><a name="line.30"> /** See {@link #makeDouble(int, int)}. */</a> +<span class="sourceLineNo">031</span><a name="line.31"> private static final double DOUBLE_MULTIPLIER = 0x1.0p-52d;</a> +<span class="sourceLineNo">032</span><a name="line.32"> /** Lowest byte mask. */</a> +<span class="sourceLineNo">033</span><a name="line.33"> private static final long LONG_LOWEST_BYTE_MASK = 0xffL;</a> +<span class="sourceLineNo">034</span><a name="line.34"> /** Number of bytes in a {@code long}. */</a> +<span class="sourceLineNo">035</span><a name="line.35"> private static final int LONG_SIZE = 8;</a> +<span class="sourceLineNo">036</span><a name="line.36"> /** Lowest byte mask. */</a> +<span class="sourceLineNo">037</span><a name="line.37"> private static final int INT_LOWEST_BYTE_MASK = 0xff;</a> +<span class="sourceLineNo">038</span><a name="line.38"> /** Number of bytes in a {@code int}. */</a> +<span class="sourceLineNo">039</span><a name="line.39"> private static final int INT_SIZE = 4;</a> +<span class="sourceLineNo">040</span><a name="line.40"></a> +<span class="sourceLineNo">041</span><a name="line.41"> /**</a> +<span class="sourceLineNo">042</span><a name="line.42"> * Class contains only static methods.</a> +<span class="sourceLineNo">043</span><a name="line.43"> */</a> +<span class="sourceLineNo">044</span><a name="line.44"> private NumberFactory() {}</a> +<span class="sourceLineNo">045</span><a name="line.45"></a> +<span class="sourceLineNo">046</span><a name="line.46"> /**</a> +<span class="sourceLineNo">047</span><a name="line.47"> * @param v Number.</a> +<span class="sourceLineNo">048</span><a name="line.48"> * @return a boolean.</a> +<span class="sourceLineNo">049</span><a name="line.49"> */</a> +<span class="sourceLineNo">050</span><a name="line.50"> public static boolean makeBoolean(int v) {</a> +<span class="sourceLineNo">051</span><a name="line.51"> return (v >>> 31) != 0;</a> +<span class="sourceLineNo">052</span><a name="line.52"> }</a> +<span class="sourceLineNo">053</span><a name="line.53"></a> +<span class="sourceLineNo">054</span><a name="line.54"> /**</a> +<span class="sourceLineNo">055</span><a name="line.55"> * @param v Number.</a> +<span class="sourceLineNo">056</span><a name="line.56"> * @return a boolean.</a> +<span class="sourceLineNo">057</span><a name="line.57"> */</a> +<span class="sourceLineNo">058</span><a name="line.58"> public static boolean makeBoolean(long v) {</a> +<span class="sourceLineNo">059</span><a name="line.59"> return (v >>> 63) != 0;</a> +<span class="sourceLineNo">060</span><a name="line.60"> }</a> +<span class="sourceLineNo">061</span><a name="line.61"></a> +<span class="sourceLineNo">062</span><a name="line.62"> /**</a> +<span class="sourceLineNo">063</span><a name="line.63"> * @param v Number.</a> +<span class="sourceLineNo">064</span><a name="line.64"> * @return a {@code double} value in the interval {@code [0, 1]}.</a> +<span class="sourceLineNo">065</span><a name="line.65"> */</a> +<span class="sourceLineNo">066</span><a name="line.66"> public static double makeDouble(long v) {</a> +<span class="sourceLineNo">067</span><a name="line.67"> // http://xorshift.di.unimi.it</a> +<span class="sourceLineNo">068</span><a name="line.68"> return Double.longBitsToDouble(DOUBLE_HIGH_BITS | v >>> 12) - 1d;</a> +<span class="sourceLineNo">069</span><a name="line.69"> }</a> +<span class="sourceLineNo">070</span><a name="line.70"></a> +<span class="sourceLineNo">071</span><a name="line.71"> /**</a> +<span class="sourceLineNo">072</span><a name="line.72"> * @param v Number (high order bits).</a> +<span class="sourceLineNo">073</span><a name="line.73"> * @param w Number (low order bits).</a> +<span class="sourceLineNo">074</span><a name="line.74"> * @return a {@code double} value in the interval {@code [0, 1]}.</a> +<span class="sourceLineNo">075</span><a name="line.75"> */</a> +<span class="sourceLineNo">076</span><a name="line.76"> public static double makeDouble(int v,</a> +<span class="sourceLineNo">077</span><a name="line.77"> int w) {</a> +<span class="sourceLineNo">078</span><a name="line.78"> final long high = ((long) (v >>> 6)) << 26;</a> +<span class="sourceLineNo">079</span><a name="line.79"> final int low = w >>> 6;</a> +<span class="sourceLineNo">080</span><a name="line.80"> return (high | low) * DOUBLE_MULTIPLIER;</a> +<span class="sourceLineNo">081</span><a name="line.81"> }</a> +<span class="sourceLineNo">082</span><a name="line.82"></a> +<span class="sourceLineNo">083</span><a name="line.83"> /**</a> +<span class="sourceLineNo">084</span><a name="line.84"> * @param v Number.</a> +<span class="sourceLineNo">085</span><a name="line.85"> * @return a {@code float} value in the interval {@code [0, 1]}.</a> +<span class="sourceLineNo">086</span><a name="line.86"> */</a> +<span class="sourceLineNo">087</span><a name="line.87"> public static float makeFloat(int v) {</a> +<span class="sourceLineNo">088</span><a name="line.88"> return (v >>> 9) * FLOAT_MULTIPLIER;</a> +<span class="sourceLineNo">089</span><a name="line.89"> }</a> +<span class="sourceLineNo">090</span><a name="line.90"></a> +<span class="sourceLineNo">091</span><a name="line.91"> /**</a> +<span class="sourceLineNo">092</span><a name="line.92"> * @param v Number (high order bits).</a> +<span class="sourceLineNo">093</span><a name="line.93"> * @param w Number (low order bits).</a> +<span class="sourceLineNo">094</span><a name="line.94"> * @return a {@code long} value.</a> +<span class="sourceLineNo">095</span><a name="line.95"> */</a> +<span class="sourceLineNo">096</span><a name="line.96"> public static long makeLong(int v,</a> +<span class="sourceLineNo">097</span><a name="line.97"> int w) {</a> +<span class="sourceLineNo">098</span><a name="line.98"> return (((long) v) << 32) | (w & 0xffffffffL);</a> +<span class="sourceLineNo">099</span><a name="line.99"> }</a> +<span class="sourceLineNo">100</span><a name="line.100"></a> +<span class="sourceLineNo">101</span><a name="line.101"> /**</a> +<span class="sourceLineNo">102</span><a name="line.102"> * Creates an {@code int} from a {@code long}.</a> +<span class="sourceLineNo">103</span><a name="line.103"> *</a> +<span class="sourceLineNo">104</span><a name="line.104"> * @param v Number.</a> +<span class="sourceLineNo">105</span><a name="line.105"> * @return an {@code int} value made from the "xor" of the</a> +<span class="sourceLineNo">106</span><a name="line.106"> * {@link #extractHi(long) high order bits} and</a> +<span class="sourceLineNo">107</span><a name="line.107"> * {@link #extractLo(long) low order bits} of {@code v}.</a> +<span class="sourceLineNo">108</span><a name="line.108"> */</a> +<span class="sourceLineNo">109</span><a name="line.109"> public static int makeInt(long v) {</a> +<span class="sourceLineNo">110</span><a name="line.110"> return extractHi(v) ^ extractLo(v);</a> +<span class="sourceLineNo">111</span><a name="line.111"> }</a> +<span class="sourceLineNo">112</span><a name="line.112"></a> +<span class="sourceLineNo">113</span><a name="line.113"> /**</a> +<span class="sourceLineNo">114</span><a name="line.114"> * Creates an {@code int} from a {@code long}, using the high order bits.</a> +<span class="sourceLineNo">115</span><a name="line.115"> *</a> +<span class="sourceLineNo">116</span><a name="line.116"> * <p>The returned value is such that if</p></a> +<span class="sourceLineNo">117</span><a name="line.117"> * <pre><code></a> +<span class="sourceLineNo">118</span><a name="line.118"> * vL = extractLo(v);</a> +<span class="sourceLineNo">119</span><a name="line.119"> * vH = extractHi(v);</a> +<span class="sourceLineNo">120</span><a name="line.120"> * </code></pre></a> +<span class="sourceLineNo">121</span><a name="line.121"> *</a> +<span class="sourceLineNo">122</span><a name="line.122"> * <p>then {@code v} is equal to {@link #makeLong(int,int) makeLong(vH, vL)}.</p></a> +<span class="sourceLineNo">123</span><a name="line.123"> *</a> +<span class="sourceLineNo">124</span><a name="line.124"> * @param v Number.</a> +<span class="sourceLineNo">125</span><a name="line.125"> * @return an {@code int} value made from the most significant bits</a> +<span class="sourceLineNo">126</span><a name="line.126"> * of {@code v}.</a> +<span class="sourceLineNo">127</span><a name="line.127"> */</a> +<span class="sourceLineNo">128</span><a name="line.128"> public static int extractHi(long v) {</a> +<span class="sourceLineNo">129</span><a name="line.129"> return (int) (v >>> 32);</a> +<span class="sourceLineNo">130</span><a name="line.130"> }</a> +<span class="sourceLineNo">131</span><a name="line.131"></a> +<span class="sourceLineNo">132</span><a name="line.132"> /**</a> +<span class="sourceLineNo">133</span><a name="line.133"> * Creates an {@code int} from a {@code long}, using the low order bits.</a> +<span class="sourceLineNo">134</span><a name="line.134"> *</a> +<span class="sourceLineNo">135</span><a name="line.135"> * <p>The returned value is such that if</p></a> +<span class="sourceLineNo">136</span><a name="line.136"> *</a> +<span class="sourceLineNo">137</span><a name="line.137"> * <pre><code></a> +<span class="sourceLineNo">138</span><a name="line.138"> * vL = extractLo(v);</a> +<span class="sourceLineNo">139</span><a name="line.139"> * vH = extractHi(v);</a> +<span class="sourceLineNo">140</span><a name="line.140"> * </code></pre></a> +<span class="sourceLineNo">141</span><a name="line.141"> *</a> +<span class="sourceLineNo">142</span><a name="line.142"> * <p>then {@code v} is equal to {@link #makeLong(int,int) makeLong(vH, vL)}.</p></a> +<span class="sourceLineNo">143</span><a name="line.143"> *</a> +<span class="sourceLineNo">144</span><a name="line.144"> * @param v Number.</a> +<span class="sourceLineNo">145</span><a name="line.145"> * @return an {@code int} value made from the least significant bits</a> +<span class="sourceLineNo">146</span><a name="line.146"> * of {@code v}.</a> +<span class="sourceLineNo">147</span><a name="line.147"> */</a> +<span class="sourceLineNo">148</span><a name="line.148"> public static int extractLo(long v) {</a> +<span class="sourceLineNo">149</span><a name="line.149"> return (int) v;</a> +<span class="sourceLineNo">150</span><a name="line.150"> }</a> +<span class="sourceLineNo">151</span><a name="line.151"></a> +<span class="sourceLineNo">152</span><a name="line.152"> /**</a> +<span class="sourceLineNo">153</span><a name="line.153"> * Splits a {@code long} into 8 bytes.</a> +<span class="sourceLineNo">154</span><a name="line.154"> *</a> +<span class="sourceLineNo">155</span><a name="line.155"> * @param v Value.</a> +<span class="sourceLineNo">156</span><a name="line.156"> * @return the bytes that compose the given value (least-significant</a> +<span class="sourceLineNo">157</span><a name="line.157"> * byte first).</a> +<span class="sourceLineNo">158</span><a name="line.158"> */</a> +<span class="sourceLineNo">159</span><a name="line.159"> public static byte[] makeByteArray(long v) {</a> +<span class="sourceLineNo">160</span><a name="line.160"> final byte[] b = new byte[LONG_SIZE];</a> +<span class="sourceLineNo">161</span><a name="line.161"></a> +<span class="sourceLineNo">162</span><a name="line.162"> for (int i = 0; i < LONG_SIZE; i++) {</a> +<span class="sourceLineNo">163</span><a name="line.163"> final int shift = i * 8;</a> +<span class="sourceLineNo">164</span><a name="line.164"> b[i] = (byte) ((v >>> shift) & LONG_LOWEST_BYTE_MASK);</a> +<span class="sourceLineNo">165</span><a name="line.165"> }</a> +<span class="sourceLineNo">166</span><a name="line.166"></a> +<span class="sourceLineNo">167</span><a name="line.167"> return b;</a> +<span class="sourceLineNo">168</span><a name="line.168"> }</a> +<span class="sourceLineNo">169</span><a name="line.169"></a> +<span class="sourceLineNo">170</span><a name="line.170"> /**</a> +<span class="sourceLineNo">171</span><a name="line.171"> * Creates a {@code long} from 8 bytes.</a> +<span class="sourceLineNo">172</span><a name="line.172"> *</a> +<span class="sourceLineNo">173</span><a name="line.173"> * @param input Input.</a> +<span class="sourceLineNo">174</span><a name="line.174"> * @return the value that correspond to the given bytes assuming</a> +<span class="sourceLineNo">175</span><a name="line.175"> * that the is ordered in increasing byte significance (i.e. the</a> +<span class="sourceLineNo">176</span><a name="line.176"> * first byte in the array is the least-siginficant).</a> +<span class="sourceLineNo">177</span><a name="line.177"> * @throws IllegalArgumentException if {@code input.length != 8}.</a> +<span class="sourceLineNo">178</span><a name="line.178"> */</a> +<span class="sourceLineNo">179</span><a name="line.179"> public static long makeLong(byte[] input) {</a> +<span class="sourceLineNo">180</span><a name="line.180"> checkSize(LONG_SIZE, input.length);</a> +<span class="sourceLineNo">181</span><a name="line.181"></a> +<span class="sourceLineNo">182</span><a name="line.182"> long v = 0;</a> +<span class="sourceLineNo">183</span><a name="line.183"> for (int i = 0; i < LONG_SIZE; i++) {</a> +<span class="sourceLineNo">184</span><a name="line.184"> final int shift = i * 8;</a> +<span class="sourceLineNo">185</span><a name="line.185"> v |= (((long) input[i]) & LONG_LOWEST_BYTE_MASK) << shift;</a> +<span class="sourceLineNo">186</span><a name="line.186"> }</a> +<span class="sourceLineNo">187</span><a name="line.187"></a> +<span class="sourceLineNo">188</span><a name="line.188"> return v;</a> +<span class="sourceLineNo">189</span><a name="line.189"> }</a> +<span class="sourceLineNo">190</span><a name="line.190"></a> +<span class="sourceLineNo">191</span><a name="line.191"> /**</a> +<span class="sourceLineNo">192</span><a name="line.192"> * Splits an array of {@code long} values into a sequence of bytes.</a> +<span class="sourceLineNo">193</span><a name="line.193"> * This method calls {@link #makeByteArray(long)} for each element of</a> +<span class="sourceLineNo">194</span><a name="line.194"> * the {@code input}.</a> +<span class="sourceLineNo">195</span><a name="line.195"> *</a> +<span class="sourceLineNo">196</span><a name="line.196"> * @param input Input.</a> +<span class="sourceLineNo">197</span><a name="line.197"> * @return an array of bytes.</a> +<span class="sourceLineNo">198</span><a name="line.198"> */</a> +<span class="sourceLineNo">199</span><a name="line.199"> public static byte[] makeByteArray(long[] input) {</a> +<span class="sourceLineNo">200</span><a name="line.200"> final int size = input.length * LONG_SIZE;</a> +<span class="sourceLineNo">201</span><a name="line.201"> final byte[] b = new byte[size];</a> +<span class="sourceLineNo">202</span><a name="line.202"></a> +<span class="sourceLineNo">203</span><a name="line.203"> for (int i = 0; i < input.length; i++) {</a> +<span class="sourceLineNo">204</span><a name="line.204"> final byte[] current = makeByteArray(input[i]);</a> +<span class="sourceLineNo">205</span><a name="line.205"> System.arraycopy(current, 0, b, i * LONG_SIZE, LONG_SIZE);</a> +<span class="sourceLineNo">206</span><a name="line.206"> }</a> +<span class="sourceLineNo">207</span><a name="line.207"></a> +<span class="sourceLineNo">208</span><a name="line.208"> return b;</a> +<span class="sourceLineNo">209</span><a name="line.209"> }</a> +<span class="sourceLineNo">210</span><a name="line.210"></a> +<span class="sourceLineNo">211</span><a name="line.211"> /**</a> +<span class="sourceLineNo">212</span><a name="line.212"> * Creates an array of {@code long} values from a sequence of bytes.</a> +<span class="sourceLineNo">213</span><a name="line.213"> * This method calls {@link #makeLong(byte[])} for each subsequence</a> +<span class="sourceLineNo">214</span><a name="line.214"> * of 8 bytes.</a> +<span class="sourceLineNo">215</span><a name="line.215"> *</a> +<span class="sourceLineNo">216</span><a name="line.216"> * @param input Input.</a> +<span class="sourceLineNo">217</span><a name="line.217"> * @return an array of {@code long}.</a> +<span class="sourceLineNo">218</span><a name="line.218"> * @throws IllegalArgumentException if {@code input.length} is not</a> +<span class="sourceLineNo">219</span><a name="line.219"> * a multiple of 8.</a> +<span class="sourceLineNo">220</span><a name="line.220"> */</a> +<span class="sourceLineNo">221</span><a name="line.221"> public static long[] makeLongArray(byte[] input) {</a> +<span class="sourceLineNo">222</span><a name="line.222"> final int size = input.length;</a> +<span class="sourceLineNo">223</span><a name="line.223"> final int num = size / LONG_SIZE;</a> +<span class="sourceLineNo">224</span><a name="line.224"> checkSize(num * LONG_SIZE, size);</a> +<span class="sourceLineNo">225</span><a name="line.225"></a> +<span class="sourceLineNo">226</span><a name="line.226"> final long[] output = new long[num];</a> +<span class="sourceLineNo">227</span><a name="line.227"> for (int i = 0; i < num; i++) {</a> +<span class="sourceLineNo">228</span><a name="line.228"> final int from = i * LONG_SIZE;</a> +<span class="sourceLineNo">229</span><a name="line.229"> final byte[] current = Arrays.copyOfRange(input, from, from + LONG_SIZE);</a> +<span class="sourceLineNo">230</span><a name="line.230"> output[i] = makeLong(current);</a> +<span class="sourceLineNo">231</span><a name="line.231"> }</a> +<span class="sourceLineNo">232</span><a name="line.232"></a> +<span class="sourceLineNo">233</span><a name="line.233"> return output;</a> +<span class="sourceLineNo">234</span><a name="line.234"> }</a> +<span class="sourceLineNo">235</span><a name="line.235"></a> +<span class="sourceLineNo">236</span><a name="line.236"> /**</a> +<span class="sourceLineNo">237</span><a name="line.237"> * Splits an {@code int} into 4 bytes.</a> +<span class="sourceLineNo">238</span><a name="line.238"> *</a> +<span class="sourceLineNo">239</span><a name="line.239"> * @param v Value.</a> +<span class="sourceLineNo">240</span><a name="line.240"> * @return the bytes that compose the given value (least-significant</a> +<span class="sourceLineNo">241</span><a name="line.241"> * byte first).</a> +<span class="sourceLineNo">242</span><a name="line.242"> */</a> +<span class="sourceLineNo">243</span><a name="line.243"> public static byte[] makeByteArray(int v) {</a> +<span class="sourceLineNo">244</span><a name="line.244"> final byte[] b = new byte[INT_SIZE];</a> +<span class="sourceLineNo">245</span><a name="line.245"></a> +<span class="sourceLineNo">246</span><a name="line.246"> for (int i = 0; i < INT_SIZE; i++) {</a> +<span class="sourceLineNo">247</span><a name="line.247"> final int shift = i * 8;</a> +<span class="sourceLineNo">248</span><a name="line.248"> b[i] = (byte) ((v >>> shift) & INT_LOWEST_BYTE_MASK);</a> +<span class="sourceLineNo">249</span><a name="line.249"> }</a> +<span class="sourceLineNo">250</span><a name="line.250"></a> +<span class="sourceLineNo">251</span><a name="line.251"> return b;</a> +<span class="sourceLineNo">252</span><a name="line.252"> }</a> +<span class="sourceLineNo">253</span><a name="line.253"></a> +<span class="sourceLineNo">254</span><a name="line.254"> /**</a> +<span class="sourceLineNo">255</span><a name="line.255"> * Creates an {@code int} from 4 bytes.</a> +<span class="sourceLineNo">256</span><a name="line.256"> *</a> +<span class="sourceLineNo">257</span><a name="line.257"> * @param input Input.</a> +<span class="sourceLineNo">258</span><a name="line.258"> * @return the value that correspond to the given bytes assuming</a> +<span class="sourceLineNo">259</span><a name="line.259"> * that the is ordered in increasing byte significance (i.e. the</a> +<span class="sourceLineNo">260</span><a name="line.260"> * first byte in the array is the least-siginficant).</a> +<span class="sourceLineNo">261</span><a name="line.261"> * @throws IllegalArgumentException if {@code input.length != 4}.</a> +<span class="sourceLineNo">262</span><a name="line.262"> */</a> +<span class="sourceLineNo">263</span><a name="line.263"> public static int makeInt(byte[] input) {</a> +<span class="sourceLineNo">264</span><a name="line.264"> checkSize(INT_SIZE, input.length);</a> +<span class="sourceLineNo">265</span><a name="line.265"></a> +<span class="sourceLineNo">266</span><a name="line.266"> int v = 0;</a> +<span class="sourceLineNo">267</span><a name="line.267"> for (int i = 0; i < INT_SIZE; i++) {</a> +<span class="sourceLineNo">268</span><a name="line.268"> final int shift = i * 8;</a> +<span class="sourceLineNo">269</span><a name="line.269"> v |= (((int) input[i]) & INT_LOWEST_BYTE_MASK) << shift;</a> +<span class="sourceLineNo">270</span><a name="line.270"> }</a> +<span class="sourceLineNo">271</span><a name="line.271"></a> +<span class="sourceLineNo">272</span><a name="line.272"> return v;</a> +<span class="sourceLineNo">273</span><a name="line.273"> }</a> +<span class="sourceLineNo">274</span><a name="line.274"></a> +<span class="sourceLineNo">275</span><a name="line.275"> /**</a> +<span class="sourceLineNo">276</span><a name="line.276"> * Splits an array of {@code int} values into a sequence of bytes.</a> +<span class="sourceLineNo">277</span><a name="line.277"> * This method calls {@link #makeByteArray(int)} for each element of</a> +<span class="sourceLineNo">278</span><a name="line.278"> * the {@code input}.</a> +<span class="sourceLineNo">279</span><a name="line.279"> *</a> +<span class="sourceLineNo">280</span><a name="line.280"> * @param input Input.</a> +<span class="sourceLineNo">281</span><a name="line.281"> * @return an array of bytes.</a> +<span class="sourceLineNo">282</span><a name="line.282"> */</a> +<span class="sourceLineNo">283</span><a name="line.283"> public static byte[] makeByteArray(int[] input) {</a> +<span class="sourceLineNo">284</span><a name="line.284"> final int size = input.length * INT_SIZE;</a> +<span class="sourceLineNo">285</span><a name="line.285"> final byte[] b = new byte[size];</a> +<span class="sourceLineNo">286</span><a name="line.286"></a> +<span class="sourceLineNo">287</span><a name="line.287"> for (int i = 0; i < input.length; i++) {</a> +<span class="sourceLineNo">288</span><a name="line.288"> final byte[] current = makeByteArray(input[i]);</a> +<span class="sourceLineNo">289</span><a name="line.289"> System.arraycopy(current, 0, b, i * INT_SIZE, INT_SIZE);</a> +<span class="sourceLineNo">290</span><a name="line.290"> }</a> +<span class="sourceLineNo">291</span><a name="line.291"></a> +<span class="sourceLineNo">292</span><a name="line.292"> return b;</a> +<span class="sourceLineNo">293</span><a name="line.293"> }</a> +<span class="sourceLineNo">294</span><a name="line.294"></a> +<span class="sourceLineNo">295</span><a name="line.295"> /**</a> +<span class="sourceLineNo">296</span><a name="line.296"> * Creates an array of {@code int} values from a sequence of bytes.</a> +<span class="sourceLineNo">297</span><a name="line.297"> * This method calls {@link #makeInt(byte[])} for each subsequence</a> +<span class="sourceLineNo">298</span><a name="line.298"> * of 4 bytes.</a> +<span class="sourceLineNo">299</span><a name="line.299"> *</a> +<span class="sourceLineNo">300</span><a name="line.300"> * @param input Input. Length must be a multiple of 4.</a> +<span class="sourceLineNo">301</span><a name="line.301"> * @return an array of {@code int}.</a> +<span class="sourceLineNo">302</span><a name="line.302"> * @throws IllegalArgumentException if {@code input.length} is not</a> +<span class="sourceLineNo">303</span><a name="line.303"> * a multiple of 4.</a> +<span class="sourceLineNo">304</span><a name="line.304"> */</a> +<span class="sourceLineNo">305</span><a name="line.305"> public static int[] makeIntArray(byte[] input) {</a> +<span class="sourceLineNo">306</span><a name="line.306"> final int size = input.length;</a> +<span class="sourceLineNo">307</span><a name="line.307"> final int num = size / INT_SIZE;</a> +<span class="sourceLineNo">308</span><a name="line.308"> checkSize(num * INT_SIZE, size);</a> +<span class="sourceLineNo">309</span><a name="line.309"></a> +<span class="sourceLineNo">310</span><a name="line.310"> final int[] output = new int[num];</a> +<span class="sourceLineNo">311</span><a name="line.311"> for (int i = 0; i < num; i++) {</a> +<span class="sourceLineNo">312</span><a name="line.312"> final int from = i * INT_SIZE;</a> +<span class="sourceLineNo">313</span><a name="line.313"> final byte[] current = Arrays.copyOfRange(input, from, from + INT_SIZE);</a> +<span class="sourceLineNo">314</span><a name="line.314"> output[i] = makeInt(current);</a> +<span class="sourceLineNo">315</span><a name="line.315"> }</a> +<span class="sourceLineNo">316</span><a name="line.316"></a> +<span class="sourceLineNo">317</span><a name="line.317"> return output;</a> +<span class="sourceLineNo">318</span><a name="line.318"> }</a> +<span class="sourceLineNo">319</span><a name="line.319"></a> +<span class="sourceLineNo">320</span><a name="line.320"> /**</a> +<span class="sourceLineNo">321</span><a name="line.321"> * @param expected Expected value.</a> +<span class="sourceLineNo">322</span><a name="line.322"> * @param actual Actual value.</a> +<span class="sourceLineNo">323</span><a name="line.323"> * @throw IllegalArgumentException if {@code expected != actual}.</a> +<span class="sourceLineNo">324</span><a name="line.324"> */</a> +<span class="sourceLineNo">325</span><a name="line.325"> private static void checkSize(int expected,</a> +<span class="sourceLineNo">326</span><a name="line.326"> int actual) {</a> +<span class="sourceLineNo">327</span><a name="line.327"> if (expected != actual) {</a> +<span class="sourceLineNo">328</span><a name="line.328"> throw new IllegalArgumentException("Array size: Expected " + expected +</a> +<span class="sourceLineNo">329</span><a name="line.329"> " but was " + actual);</a> +<span class="sourceLineNo">330</span><a name="line.330"> }</a> +<span class="sourceLineNo">331</span><a name="line.331"> }</a> +<span class="sourceLineNo">332</span><a name="line.332">}</a> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +</pre> +</div> +</body> +</html>
