tag:blogger.com,1999:blog-38240944006623522242024-03-13T20:27:27.324-07:00BigInteger AlgorithmsC# , System.Numerics, Multiplication, Karatsuba, Toom Cook, Division, Burnikel, Ziegler, Factorial, Luschny, Square Root, Zimmermann, Choose, Binomial Coefficient, Permutation, Combination, Eratosthenes, Primes, Fibonacci, Lucas, Pell, Catalan, Fast Random Number Generator, OvertonPeterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.comBlogger58125tag:blogger.com,1999:blog-3824094400662352224.post-66563529488147295942022-02-20T09:51:00.000-08:002022-02-20T09:51:14.567-08:00Arduino UNO DS1302<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjaDp8LY9l6zdpprk1lZh_KE6b7QZ7wdoZxYeVLucR4VruOPOxd4ErWXKIHRsVMVdftSLVWI6onMv_DncMD92UexCaRC9qm62v7KL6ZF6g2TeRFnTw3-rvEyrXRje6guTXUnBwtPnPqK40LVyksqrTuMNUd438DommMbOTsZVnlhToROW-evE8Qhbij3A=s1032" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="697" data-original-width="1032" height="493" src="https://blogger.googleusercontent.com/img/a/AVvXsEjaDp8LY9l6zdpprk1lZh_KE6b7QZ7wdoZxYeVLucR4VruOPOxd4ErWXKIHRsVMVdftSLVWI6onMv_DncMD92UexCaRC9qm62v7KL6ZF6g2TeRFnTw3-rvEyrXRje6guTXUnBwtPnPqK40LVyksqrTuMNUd438DommMbOTsZVnlhToROW-evE8Qhbij3A=w702-h493" width="702" /></a></div><br /><p>On my pc the Arduino ide uses port "COM3" to program a UNO.<br />A C# program uses the same port.<br />Button1 writes the pc date/time to the DS1302, <br />Button2 reads date/time from the DS1302, it is written to label1.<br />When the port is disconnected, the DS1302 keeps the time with a CR2032 backup battery.<br />If the port is connected again the proper time can be read by clicking button2 (two times:)</p><p>ARDUINO code (2446 bytes (7%), 192 bytes (9%)):<br /><font><br /><span style="color: #00979c;">void</span></font> <font color="#5e6d03">setup</font><font color="#000000">(</font><font color="#000000">)</font> <font color="#000000">{<br /></font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">begin</font><font color="#000000">(</font><font color="#000000">9600</font><font color="#000000">)</font><font color="#000000">;<br /></font> <font color="#5e6d03">while</font> <font color="#000000">(</font><font color="#434f54">!</font><b><font color="#d35400">Serial</font></b><font color="#000000">)</font><font color="#000000">;<br /></font> <font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#000000">13</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#434f54">// Led off // Vcc2 -|1 8|- Vcc1<br /></font> <font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#000000">7</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#434f54">// Clock c // X1 -|2 7|- SCLK<br /></font> <font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#000000">6</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#434f54">// Data (I/O) w // X2 -|3 6|- I/O<br /></font> <font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#000000">5</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#434f54">// Enable e // GND -|4 5|- CE<br /></font> <font color="#000000">c</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">e</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#434f54">// DS1302<br /></font>}</p><pre><font color="#00979c">byte</font> <font color="#000000">b</font><font color="#000000">[</font><font color="#000000">8</font><font color="#000000">]</font><font color="#000000">;</font>
<font color="#00979c">void</font> <font color="#5e6d03">loop</font><font color="#000000">(</font><font color="#000000">)</font> <font color="#000000">{</font>
<font color="#000000">io</font><font color="#000000">(</font><font color="#000000">1</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#00979c">byte</font> <font color="#000000">com</font><font color="#000000">[</font><font color="#000000">1</font><font color="#000000">]</font><font color="#000000">;</font> <font color="#434f54">// command</font>
<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">readBytes</font><font color="#000000">(</font><font color="#000000">com</font><font color="#434f54">,</font> <font color="#000000">1</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">com</font> <font color="#000000">[</font><font color="#000000">0</font><font color="#000000">]</font> <font color="#434f54">==</font> <font color="#000000">0</font><font color="#000000">)</font> <font color="#000000">{</font> <font color="#434f54">// pc date time -> DS1302</font>
<font color="#5e6d03">setup</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">readBytes</font><font color="#000000">(</font><font color="#000000">b</font><font color="#434f54">,</font> <font color="#000000">7</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">c</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">e</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">io</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">e</font><font color="#000000">(</font><font color="#000000">1</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">w</font><font color="#000000">(</font><font color="#000000">0xBE</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#5e6d03">for</font> <font color="#000000">(</font><font color="#00979c">int</font> <font color="#000000">i</font> <font color="#434f54">=</font> <font color="#000000">0</font><font color="#000000">;</font> <font color="#000000">i</font> <font color="#434f54"><</font> <font color="#000000">8</font><font color="#000000">;</font> <font color="#000000">i</font><font color="#434f54">++</font><font color="#000000">)</font> <font color="#000000">w</font><font color="#000000">(</font><font color="#000000">b</font><font color="#000000">[</font><font color="#000000">i</font><font color="#000000">]</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">e</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">c</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">}</font>
<font color="#5e6d03">else</font> <font color="#000000">{</font> <font color="#434f54">// DS1302 -> label1</font>
<font color="#000000">c</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">e</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">io</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">e</font><font color="#000000">(</font><font color="#000000">1</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">w</font><font color="#000000">(</font><font color="#000000">0xBF</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">io</font><font color="#000000">(</font><font color="#000000">1</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#5e6d03">for</font> <font color="#000000">(</font><font color="#00979c">int</font> <font color="#000000">i</font> <font color="#434f54">=</font> <font color="#000000">0</font><font color="#000000">;</font> <font color="#000000">i</font> <font color="#434f54"><</font> <font color="#000000">8</font><font color="#000000">;</font> <font color="#000000">i</font><font color="#434f54">++</font><font color="#000000">)</font> <font color="#000000">b</font><font color="#000000">[</font><font color="#000000">i</font><font color="#000000">]</font> <font color="#434f54">=</font> <font color="#000000">r</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">e</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">c</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font>
<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">write</font><font color="#000000">(</font><font color="#000000">b</font><font color="#434f54">,</font> <font color="#000000">7</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">}</font>
<font color="#000000">}</font>
<font color="#00979c">void</font> <font color="#000000">io</font><font color="#000000">(</font><font color="#00979c">byte</font> <font color="#000000">io</font><font color="#000000">)</font> <font color="#000000">{</font>
<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">io</font> <font color="#434f54">></font> <font color="#000000">0</font><font color="#000000">)</font><font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#000000">6</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#5e6d03">else</font> <font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#000000">6</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">}</font>
<font color="#00979c">byte</font> <font color="#000000">r</font><font color="#000000">(</font><font color="#000000">)</font> <font color="#000000">{</font>
<font color="#00979c">byte</font> <font color="#000000">r</font> <font color="#434f54">=</font> <font color="#000000">0</font><font color="#000000">;</font>
<font color="#5e6d03">for</font> <font color="#000000">(</font><font color="#00979c">int</font> <font color="#000000">i</font> <font color="#434f54">=</font> <font color="#000000">0</font><font color="#000000">;</font> <font color="#000000">i</font> <font color="#434f54"><</font> <font color="#000000">8</font><font color="#000000">;</font> <font color="#000000">i</font><font color="#434f54">++</font><font color="#000000">)</font> <font color="#000000">{</font>
<font color="#000000">c</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">r</font> <font color="#434f54">|=</font> <font color="#d35400">digitalRead</font><font color="#000000">(</font><font color="#000000">6</font><font color="#000000">)</font> <font color="#434f54"><<</font> <font color="#000000">i</font><font color="#000000">;</font> <font color="#000000">c</font><font color="#000000">(</font><font color="#000000">1</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">}</font>
<font color="#5e6d03">return</font> <font color="#000000">r</font><font color="#000000">;</font>
<font color="#000000">}</font>
<font color="#00979c">void</font> <font color="#000000">w</font><font color="#000000">(</font><font color="#00979c">byte</font> <font color="#000000">w</font><font color="#000000">)</font> <font color="#000000">{</font>
<font color="#5e6d03">for</font> <font color="#000000">(</font><font color="#00979c">int</font> <font color="#000000">i</font> <font color="#434f54">=</font> <font color="#000000">0</font><font color="#000000">;</font> <font color="#000000">i</font> <font color="#434f54"><</font> <font color="#000000">8</font><font color="#000000">;</font> <font color="#000000">i</font><font color="#434f54">++</font><font color="#000000">)</font> <font color="#000000">{</font>
<font color="#000000">c</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">w</font> <font color="#434f54">&</font> <font color="#000000">1</font> <font color="#434f54">></font> <font color="#000000">0</font><font color="#000000">)</font><font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">6</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#5e6d03">else</font> <font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">6</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">w</font> <font color="#434f54">>>=</font> <font color="#000000">1</font><font color="#000000">;</font> <font color="#000000">c</font><font color="#000000">(</font><font color="#000000">1</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">}</font>
<font color="#000000">}</font>
<font color="#00979c">void</font> <font color="#000000">c</font><font color="#000000">(</font><font color="#00979c">byte</font> <font color="#000000">c</font><font color="#000000">)</font> <font color="#000000">{</font>
<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">c</font> <font color="#434f54">></font> <font color="#000000">0</font><font color="#000000">)</font><font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">7</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#5e6d03">else</font> <font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">7</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">}</font>
<font color="#00979c">void</font> <font color="#000000">e</font><font color="#000000">(</font><font color="#00979c">byte</font> <font color="#000000">e</font><font color="#000000">)</font> <font color="#000000">{</font>
<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">e</font> <font color="#434f54">></font> <font color="#000000">0</font><font color="#000000">)</font><font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">5</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#5e6d03">else</font> <font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">5</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">}</font>
<font color="#00979c">void</font> <font color="#000000">h</font><font color="#000000">(</font><font color="#000000">)</font> <font color="#000000">{</font>
<font color="#d35400">delayMicroseconds</font><font color="#000000">(</font><font color="#000000">1</font><font color="#000000">)</font><font color="#000000">;</font>
<font color="#000000">}</font></pre><pre><br /></pre><pre>C# code:</pre><pre><pre class="csharp" style="background-color: white; box-sizing: border-box; color: #212529; font-size: 14.4px; margin-bottom: 1rem; margin-top: 0px; overflow: auto;"><span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">using</span> <span style="box-sizing: border-box; color: teal;">System</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">using</span> <span style="box-sizing: border-box; color: teal;">System.IO.Ports</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">using</span> <span style="box-sizing: border-box; color: teal;">System.Windows.Forms</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">namespace</span> DS1302_02
<span style="box-sizing: border-box; color: green;">{</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">public</span> <span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">partial</span> <span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">class</span> Form1 <span style="box-sizing: border-box; color: green;">:</span> Form
<span style="box-sizing: border-box; color: green;">{</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">public</span> Form1<span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span> <span style="box-sizing: border-box; color: green;">{</span> InitializeComponent<span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span> <span style="box-sizing: border-box; color: green;">}</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">private</span> <span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">void</span> button1_Click<span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">object</span> sender, EventArgs e<span style="box-sizing: border-box; color: green;">)</span>
<span style="box-sizing: border-box; color: green;">{</span> <span style="box-sizing: border-box; color: teal; font-style: italic;">// pc date time -> DS1302</span>
button1<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Enabled</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">false</span><span style="box-sizing: border-box; color: green;">;</span>
button2<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Focus</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">var</span> sp <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">new</span> SerialPort<span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #666666;">"COM3"</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">BaudRate</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: red;">9600</span><span style="box-sizing: border-box; color: green;">;</span> sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Open</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Write</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">new</span> <span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">{</span> <span style="box-sizing: border-box; color: red;">0</span> <span style="box-sizing: border-box; color: green;">}</span>, <span style="box-sizing: border-box; color: red;">0</span>, <span style="box-sizing: border-box; color: red;">1</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">var</span> DT <span style="box-sizing: border-box; color: green;">=</span> DateTime<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Now</span><span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">AddSeconds</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: red;">1</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">var</span> b <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">new</span> <span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">8</span><span style="box-sizing: border-box; color: green;">]</span><span style="box-sizing: border-box; color: green;">;</span>
b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">6</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">(</span>DT<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Year</span> <span style="box-sizing: border-box; color: green;">%</span> <span style="box-sizing: border-box; color: red;">100</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">5</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">(</span>DT<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">DayOfWeek</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span> <span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">if</span> <span style="box-sizing: border-box; color: green;">(</span>b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">5</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">==</span> <span style="box-sizing: border-box; color: red;">0</span><span style="box-sizing: border-box; color: green;">)</span> b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">5</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: red;">7</span><span style="box-sizing: border-box; color: green;">;</span>
b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">4</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">(</span>DT<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Month</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">3</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">(</span>DT<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Day</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">2</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">(</span>DT<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Hour</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">1</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">(</span>DT<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Minute</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">0</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">(</span>DT<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Second</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">for</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">int</span> i <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: red;">0</span><span style="box-sizing: border-box; color: green;">;</span> i <span style="box-sizing: border-box; color: green;"><</span> <span style="box-sizing: border-box; color: red;">8</span><span style="box-sizing: border-box; color: green;">;</span> i<span style="box-sizing: border-box; color: green;">++</span><span style="box-sizing: border-box; color: green;">)</span>
b<span style="box-sizing: border-box; color: green;">[</span>i<span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">(</span>b<span style="box-sizing: border-box; color: green;">[</span>i<span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">%</span> <span style="box-sizing: border-box; color: red;">10</span> <span style="box-sizing: border-box; color: green;">|</span> b<span style="box-sizing: border-box; color: green;">[</span>i<span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">/</span> <span style="box-sizing: border-box; color: red;">10</span> <span style="box-sizing: border-box; color: green;"><<</span> <span style="box-sizing: border-box; color: red;">4</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Write</span><span style="box-sizing: border-box; color: green;">(</span>b, <span style="box-sizing: border-box; color: red;">0</span>, <span style="box-sizing: border-box; color: red;">8</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span> sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Close</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: black;">System.<span style="box-sizing: border-box; color: blue;">Threading</span></span><span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Thread</span><span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Sleep</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: red;">1050</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">this</span><span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">button2_Click</span><span style="box-sizing: border-box; color: green;">(</span>sender, e<span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: green;">}</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">private</span> <span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">void</span> button2_Click<span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">object</span> sender, EventArgs e<span style="box-sizing: border-box; color: green;">)</span>
<span style="box-sizing: border-box; color: green;">{</span> <span style="box-sizing: border-box; color: teal; font-style: italic;">// DS1302 -> label1</span>
button2<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Enabled</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">false</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">var</span> sp <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">new</span> SerialPort<span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #666666;">"COM3"</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">BaudRate</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: red;">9600</span><span style="box-sizing: border-box; color: green;">;</span> sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Open</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">var</span> b <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">new</span> <span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">8</span><span style="box-sizing: border-box; color: green;">]</span><span style="box-sizing: border-box; color: green;">;</span>
L0<span style="box-sizing: border-box; color: green;">:</span> sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Write</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">new</span> <span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">{</span> <span style="box-sizing: border-box; color: red;">1</span> <span style="box-sizing: border-box; color: green;">}</span>, <span style="box-sizing: border-box; color: red;">0</span>, <span style="box-sizing: border-box; color: red;">1</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">int</span> c <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: red;">0</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">while</span> <span style="box-sizing: border-box; color: green;">(</span>sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">BytesToRead</span> <span style="box-sizing: border-box; color: green;"><</span> <span style="box-sizing: border-box; color: red;">8</span><span style="box-sizing: border-box; color: green;">)</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">if</span> <span style="box-sizing: border-box; color: green;">(</span>c<span style="box-sizing: border-box; color: green;">++</span> <span style="box-sizing: border-box; color: green;">></span> <span style="box-sizing: border-box; color: red;">2</span><span style="box-sizing: border-box; color: green;">)</span>
<span style="box-sizing: border-box; color: green;">{</span>
sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">ReadExisting</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">goto</span> L0<span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: green;">}</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">for</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">int</span> i <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: red;">0</span><span style="box-sizing: border-box; color: green;">;</span> i <span style="box-sizing: border-box; color: green;"><</span> <span style="box-sizing: border-box; color: red;">8</span><span style="box-sizing: border-box; color: green;">;</span> i<span style="box-sizing: border-box; color: green;">++</span><span style="box-sizing: border-box; color: green;">)</span>
b<span style="box-sizing: border-box; color: green;">[</span>i<span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">byte</span><span style="box-sizing: border-box; color: green;">)</span>sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">ReadByte</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">ReadExisting</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span> sp<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Close</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
label1<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Text</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: green;">(</span>b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">6</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">>></span> <span style="box-sizing: border-box; color: red;">4</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">ToString</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span> <span style="box-sizing: border-box; color: green;">+</span> <span style="box-sizing: border-box; color: green;">(</span>b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">6</span><span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">&</span> <span style="box-sizing: border-box; color: red;">15</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">ToString</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span> <span style="box-sizing: border-box; color: green;">+</span> <span style="box-sizing: border-box; color: #666666;">" "</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">for</span> <span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: #6666cc; font-weight: bold;">int</span> i <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: red;">4</span><span style="box-sizing: border-box; color: green;">;</span> i <span style="box-sizing: border-box; color: green;">>=</span> <span style="box-sizing: border-box; color: red;">0</span><span style="box-sizing: border-box; color: green;">;</span> i<span style="box-sizing: border-box; color: green;">--</span><span style="box-sizing: border-box; color: green;">)</span>
label1<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Text</span> <span style="box-sizing: border-box; color: green;">+=</span> <span style="box-sizing: border-box; color: green;">(</span>b<span style="box-sizing: border-box; color: green;">[</span>i<span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">>></span> <span style="box-sizing: border-box; color: red;">4</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">ToString</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span> <span style="box-sizing: border-box; color: green;">+</span> <span style="box-sizing: border-box; color: green;">(</span>b<span style="box-sizing: border-box; color: green;">[</span>i<span style="box-sizing: border-box; color: green;">]</span> <span style="box-sizing: border-box; color: green;">&</span> <span style="box-sizing: border-box; color: red;">15</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">ToString</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span> <span style="box-sizing: border-box; color: green;">+</span> <span style="box-sizing: border-box; color: #666666;">" "</span><span style="box-sizing: border-box; color: green;">;</span>
label1<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Text</span> <span style="box-sizing: border-box; color: green;">+=</span> <span style="box-sizing: border-box; color: #666666;">" "</span> <span style="box-sizing: border-box; color: green;">+</span> b<span style="box-sizing: border-box; color: green;">[</span><span style="box-sizing: border-box; color: red;">5</span><span style="box-sizing: border-box; color: green;">]</span><span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">ToString</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
button1<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Enabled</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">true</span><span style="box-sizing: border-box; color: green;">;</span>
button2<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Enabled</span> <span style="box-sizing: border-box; color: green;">=</span> <span style="box-sizing: border-box; color: #0600ff; font-weight: bold;">true</span><span style="box-sizing: border-box; color: green;">;</span>
button2<span style="box-sizing: border-box; color: green;">.</span><span style="box-sizing: border-box; color: blue;">Focus</span><span style="box-sizing: border-box; color: green;">(</span><span style="box-sizing: border-box; color: green;">)</span><span style="box-sizing: border-box; color: green;">;</span>
<span style="box-sizing: border-box; color: green;">}</span>
<span style="box-sizing: border-box; color: green;">}</span>
<span style="box-sizing: border-box; color: green;">}</span></pre></pre><pre></pre>Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-73147491129073727122020-02-14T08:31:00.000-08:002020-02-14T08:31:05.437-08:00A055932<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-xRdwZpHlcqs/XkbKXi9NglI/AAAAAAAAAgs/lk5ZcXjbdeILfK_hkGoCgMOKr3mkMw_JwCLcBGAsYHQ/s1600/a.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="175" data-original-width="925" src="https://1.bp.blogspot.com/-xRdwZpHlcqs/XkbKXi9NglI/AAAAAAAAAgs/lk5ZcXjbdeILfK_hkGoCgMOKr3mkMw_JwCLcBGAsYHQ/s1600/a.jpg" /></a></div>
<pre class="cscode" style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span class="com" style="color: green;">
</span></code></pre>
<pre class="cscode" style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span class="com" style="color: green;">/* A055932 Numbers all of whose prime divisors are consecutive primes starting at 2
Examples 2 4=2.2 6=2.3 8=2.2.2 12=2.2.3 16=2.2.2.2 18=2.3.3 24=2.2.2.3 30=2.3.5
The largest limit(m) is 3129970635269988509 (~ 3e18),
1695808 terms, largest one: 3129968285335791900 in 27 ms.
*/</span>
<span class="key" style="color: blue;">using</span> System; <span class="com" style="color: green;">// 4790@3.6</span>
<span class="key" style="color: blue;">namespace</span> A055932
{
<span class="key" style="color: blue;">class</span> Program
{
<span class="key" style="color: blue;">static</span> <span class="key" style="color: blue;">void</span> Main()
{
<span class="key" style="color: blue;">var</span> w = System.Diagnostics.Stopwatch.StartNew();
Console.Write(C((<span class="key" style="color: blue;">ulong</span>)1e18) + <span class="str" style="color: #a31515;">" "</span> + w.Elapsed); Console.Read();
}
<span class="key" style="color: blue;">static</span> <span class="key" style="color: blue;">int</span> C(<span class="key" style="color: blue;">ulong</span> m) { <span class="key" style="color: blue;">return</span> <span class="key" style="color: blue;">new</span> A055932(m).a.Length; }
}
<span class="key" style="color: blue;">class</span> A055932
{
<span class="key" style="color: blue;">public</span> <span class="key" style="color: blue;">ulong</span>[] a; <span class="key" style="color: blue;">int</span> _i;
<span class="key" style="color: blue;">public</span> A055932(<span class="key" style="color: blue;">ulong</span> m) <span class="com" style="color: green;">// A055932 <= m</span>
{
<span class="key" style="color: blue;">byte</span>[] p = { 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53 };
m >>= 1; a = <span class="key" style="color: blue;">new</span> <span class="key" style="color: blue;">ulong</span>[8]; <span class="key" style="color: blue;">ulong</span> pow = 3, Π = 3, aj; <span class="key" style="color: blue;">uint</span> pi;
<span class="key" style="color: blue;">while</span> (pow <= m) { add(pow); pow *= 3; }
<span class="key" style="color: blue;">int</span> i = 0, j0 = 0, j, k;
L0: pi = p[i++]; Π *= pi;
<span class="key" style="color: blue;">if</span> (Π > m) <span class="key" style="color: blue;">goto</span> L2; pow = pi; j = k = j0; j0 = _i;
L1: aj = pow * a[j++];
<span class="key" style="color: blue;">if</span> (aj > m) { Array.Sort(a, j0, _i - j0); <span class="key" style="color: blue;">goto</span> L0; }
<span class="key" style="color: blue;">do</span> { add(aj); aj = pow * a[j++]; } <span class="key" style="color: blue;">while</span> (aj <= m);
pow *= pi; j = k; <span class="key" style="color: blue;">goto</span> L1;
L2: m <<= 1; <span class="key" style="color: blue;">if</span> (m > 1) add(1); j = _i - 1;
<span class="key" style="color: blue;">while</span> (j >= 0) { aj = a[j--] <<= 1; <span class="key" style="color: blue;">while</span> ((aj <<= 1) <= m) add(aj); }
Array.Resize(<span class="key" style="color: blue;">ref</span> a, _i);
}
<span class="key" style="color: blue;">void</span> add(<span class="key" style="color: blue;">ulong</span> v) { <span class="key" style="color: blue;">if</span> (_i >= a.Length) Array.Resize(<span class="key" style="color: blue;">ref</span> a, a.Length << 1); a[_i++] = v; }
}
}</code></pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-42071491247234223052019-03-05T08:59:00.000-08:002019-03-05T08:59:57.230-08:00Largest left-truncatable prime in base 45<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-91lKcyXJwGE/XH6pza3rygI/AAAAAAAAAeA/Fz2aXjBTXcEKkbN5aW9UWvDvqsM88UhVACLcBGAs/s1600/a0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="200" data-original-width="925" src="https://1.bp.blogspot.com/-91lKcyXJwGE/XH6pza3rygI/AAAAAAAAAeA/Fz2aXjBTXcEKkbN5aW9UWvDvqsM88UhVACLcBGAs/s1600/a0.jpg" /></a></div>
<br />
<pre style="background-color: white; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">/* THE ON-LINE ENCYCLOPEDIA OF INTEGER SEQUENCES (OEIS),
sequence A103443, Largest left-truncatable prime in base n (given in decimal),
contains a table of n, a(n) for n = 3..89 (with some question marks).
The smallest odd n with a question mark is 45.
The largest left-truncatable prime in base 45 seems to be:
</span>6418889846539907432243324898640584712447897570848322447697313961466124548502810052430598307<span style="color: green;">
in base 45: </span><span style="color: red;">Y8cE6UEE8SY4AcCGCiaiOWUgQeUSaeKOCaCWWSiKSQ8Ea8SYMU4E6ab</span><span style="color: green;">
Until someone finds a larger left-truncatable prime in base 45 ;)
It took 32 hours and 12 minutes to find it.
Memory usage peaked at 9.6 GB, with the 9th prime: 23 (and a list of 18275774 primes).
*/</span>
<span style="color: blue;">using</span> Mpir.NET; <span style="color: green;">// 0.4.0</span>
<span style="color: blue;">using</span> System; <span style="color: green;">// 4790@3.6</span>
<span style="color: blue;">using</span> System.Collections.Generic;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">class</span> LLTPb
{
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
<span style="color: blue;">uint</span> b = 45;
<span style="color: blue;">var</span> sw = System.Diagnostics.Stopwatch.StartNew(); mpz_t p = M(b);
Console.WriteLine(sw.Elapsed);
Console.WriteLine(p);
Console.WriteLine(mpir.mpz_get_string(b, p)); Console.Read();
}
<span style="color: blue;">static</span> mpz_t M(<span style="color: blue;">uint</span> b)
{
mpz_t m0 = 0, m1; <span style="color: blue;">uint</span> s = 0;
<span style="color: blue;">for</span> (s = np(s, b); s > 0; s = np(s, b))
<span style="color: blue;">if</span> (m0 < (m1 = L(s, b))) m0 = m1;
<span style="color: blue;">return</span> m0;
}
<span style="color: blue;">static</span> <span style="color: blue;">readonly</span> <span style="color: blue;">object</span> locker = <span style="color: blue;">new</span> <span style="color: blue;">object</span>();
<span style="color: blue;">static</span> mpz_t L(<span style="color: blue;">uint</span> s, <span style="color: blue;">uint</span> b)
{
Console.WriteLine(<span style="color: #a31515;">"p: "</span> + s);
List<mpz_t> p1 = <span style="color: blue;">new</span> List<mpz_t>(), p0 = <span style="color: blue;">new</span> List<mpz_t>() { s };
mpz_t n0 = 1, n; <span style="color: blue;">uint</span> a;
<span style="color: blue;">for</span> (; ; )
{
<span style="color: blue;">for</span> (n = 0, n0 *= b, a = 1; a < b; a++)
{
n += n0;
Parallel.For(0, 8, t =>
{
mpz_t np;
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> j = p0.Count, i = t; i < j; i += 8)
<span style="color: blue;">if</span> (mpir.mpz_probab_prime_p(np = n + p0[i], 15) > 0)
<span style="color: blue;">lock</span> (locker) p1.Add(np);
});
}
<span style="color: blue;">if</span> (p1.Count == 0) <span style="color: blue;">return</span> max(p0);
Console.WriteLine(p0.Count);
p0.Clear(); GC.Collect();
<span style="color: blue;">for</span> (n = 0, n0 *= b, a = 1; a < b; a++)
{
n += n0;
Parallel.For(0, 8, t =>
{
mpz_t np;
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> j = p1.Count, i = t; i < j; i += 8)
<span style="color: blue;">if</span> (mpir.mpz_probab_prime_p(np = n + p1[i], 15) > 0)
<span style="color: blue;">lock</span> (locker) p0.Add(np);
});
}
<span style="color: blue;">if</span> (p0.Count == 0) <span style="color: blue;">return</span> max(p1);
Console.WriteLine(p1.Count);
p1.Clear(); GC.Collect();
}
}
<span style="color: blue;">static</span> mpz_t max(List<mpz_t> p)
{
mpz_t m = p[0];
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = p.Count - 1; i > 0; i--) <span style="color: blue;">if</span> (m < p[i]) m = p[i];
<span style="color: blue;">return</span> m;
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span> np(<span style="color: blue;">uint</span> s, <span style="color: blue;">uint</span> b)
{
<span style="color: blue;">if</span> (s == 0) <span style="color: blue;">return</span> 2 < b ? 2u : 0;
<span style="color: blue;">if</span> (s == 2) <span style="color: blue;">return</span> 3 < b ? 3u : 0;
<span style="color: blue;">if</span> (s == 3) <span style="color: blue;">return</span> 5 < b ? 5u : 0;
<span style="color: blue;">if</span> (s == 5) <span style="color: blue;">return</span> 7 < b ? 7u : 0;
<span style="color: blue;">for</span> (s += 2; ; s += 2)
<span style="color: blue;">if</span> (s % 3 > 0 && s % 5 > 0 && s % 7 > 0) <span style="color: blue;">return</span> s < b ? s : 0;
}
}</code></pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-20269090771343920372018-04-16T10:38:00.000-07:002018-04-16T10:38:21.969-07:00primes less than 65536<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-6GSczUk5Dm4/WtTa-YNZGhI/AAAAAAAAAdA/eAOMqGtz7dg1s9HL5YZayWBBpffcx05uQCLcBGAs/s1600/sp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="259" data-original-width="909" src="https://4.bp.blogspot.com/-6GSczUk5Dm4/WtTa-YNZGhI/AAAAAAAAAdA/eAOMqGtz7dg1s9HL5YZayWBBpffcx05uQCLcBGAs/s1600/sp.jpg" /></a></div>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">
</span></code></pre>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">// --μs--μs--μs--</span>
<span style="color: green;">// n pi(n) p0 p1 p2 </span>
<span style="color: green;">// 255 54 1 1 1.05 p0 trial division</span>
<span style="color: green;">// 511 97 2 1 1.07 p1 Eratosthenes</span>
<span style="color: green;">// 1023 172 5 1 1.07 p2 500 lines</span>
<span style="color: green;">// 2047 309 12 2 1.07</span>
<span style="color: green;">// 4095 564 31 3 1.11 </span>
<span style="color: green;">// 8191 1028 80 6 1.17</span>
<span style="color: green;">// 16383 1900 191 12 1.27</span>
<span style="color: green;">// 32767 3512 456 26 1.50</span>
<span style="color: green;">// 65000 6493 2.02</span>
<span style="color: green;">// 65535 6542 1095 69 1.01</span>
<span style="color: blue;">using</span> System; <span style="color: green;">// i7-4790@3.6</span>
<span style="color: blue;">class</span> Program
{
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
<span style="color: blue;">int</span> i, j; <span style="color: blue;">ushort</span> u; <span style="color: blue;">ushort</span>[] p;
<span style="color: blue;">var</span> sw = <span style="color: blue;">new</span> System.Diagnostics.Stopwatch();
Console.WriteLine(<span style="color: #a31515;">" μs pi(n) n"</span>);
<span style="color: blue;">for</span> (u = 0, i = 16; i >= 0; i--, u <<= 1, u |= 1)
{
p = primes0(u); sw.Restart();
<span style="color: blue;">for</span> (j = 1000; j > 0; j--) primes0(u);
Console.Write(<span style="color: #a31515;">"{0,4}"</span>, sw.ElapsedMilliseconds);
Console.WriteLine(<span style="color: #a31515;">" {0,4} {1,5}"</span>, p.Length, u);
}
Console.WriteLine();
<span style="color: blue;">for</span> (u = 0, i = 16; i >= 0; i--, u <<= 1, u |= 1)
{
p = primes1(u); sw.Restart();
<span style="color: blue;">for</span> (j = 1000; j > 0; j--) primes1(u);
Console.Write(sw.Elapsed);
Console.WriteLine(<span style="color: #a31515;">" {0,4} {1,5}"</span>, p.Length, u);
}
Console.WriteLine();
<span style="color: blue;">for</span> (u = 0, i = 16; i >= 0; i--, u <<= 1, u |= 1)
{
p = primes2(u); sw.Restart();
<span style="color: blue;">for</span> (j = 1000000; j > 0; j--) primes2(u);
Console.Write(sw.Elapsed);
Console.WriteLine(<span style="color: #a31515;">" {0,4} {1,5}"</span>, p.Length, u);
}
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">ushort</span>[] primes0(<span style="color: blue;">ushort</span> u) <span style="color: green;">// trial division </span>
{
<span style="color: blue;">var</span> p = <span style="color: blue;">new</span> <span style="color: blue;">ushort</span>[6542]; <span style="color: blue;">var</span> w = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[] { 4, 2, 4, 2, 4, 6, 2, 6 };
<span style="color: blue;">int</span> i = 2, j = 0, c = 0, m = u, r = 3, s = 25, d, n = 7;
<span style="color: blue;">if</span> (m > 1) p[c++] = 2; <span style="color: blue;">if</span> (m > 2) p[c++] = 3; <span style="color: blue;">if</span> (m > 4) p[c++] = 5;
<span style="color: blue;">for</span> (; n <= m; i = 2, n += w[j++])
{
<span style="color: blue;">if</span> (j > 7) j = 0;
<span style="color: blue;">if</span> (s <= n) { r += 4; s = r * r; r -= 2; }
<span style="color: blue;">while</span> ((d = p[i]) <= r && n % d > 0) i++;
<span style="color: blue;">if</span> (d > r) p[c++] = (<span style="color: blue;">ushort</span>)n;
}
Array.Resize(<span style="color: blue;">ref</span> p, c); <span style="color: blue;">return</span> p;
}
<span style="color: blue;">static</span> <span style="color: blue;">ushort</span>[] primes1(<span style="color: blue;">ushort</span> u) <span style="color: green;">// Eratosthenes</span>
{
<span style="color: blue;">if</span> (u < 5) <span style="color: blue;">return</span> u < 2 ? <span style="color: blue;">new</span> <span style="color: blue;">ushort</span>[0] : u < 3 ?
<span style="color: blue;">new</span> <span style="color: blue;">ushort</span>[] { 2 } : <span style="color: blue;">new</span> <span style="color: blue;">ushort</span>[] { 2, 3 };
<span style="color: blue;">int</span> a = 1, b = 1, c = 1, m = u, d = m; d += d & 1; d >>= 1;
<span style="color: blue;">var</span> x = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[c += d >> 5]; x[0] = 1 << 24;
<span style="color: blue;">for</span> (<span style="color: green;">/* */</span>; a < c; a += 7) x[a] = 0x08102040;
<span style="color: blue;">for</span> (a = 2; a < c; a += 7) x[a] = 0x40810204;
<span style="color: blue;">for</span> (a = 3; a < c; a += 7) x[a] = 0x04081020;
<span style="color: blue;">for</span> (a = 4; a < c; a += 7) x[a] = 0x20408102;
<span style="color: blue;">for</span> (a = 5; a < c; a += 7) x[a] = 0x02040810;
<span style="color: blue;">for</span> (a = 6; a < c; a += 7) x[a] = 0x10204081;
<span style="color: blue;">for</span> (a = 7; a < c; a += 7) x[a] = ~0x7EFDFBF7; a = 7;
<span style="color: blue;">while</span> ((c = (a += 0x5A28A6 >> (3 * (b++ & 7)) & 7) * a) <= m)
<span style="color: blue;">if</span> ((x[a >> 6] & 1 << (a >> 1)) == 0)
<span style="color: blue;">for</span> (c >>= 1; c < d; c += a) x[c >> 5] |= 1 << c;
<span style="color: blue;">var</span> p = <span style="color: blue;">new</span> <span style="color: blue;">ushort</span>[6542]; p[0] = 2; p[1] = 3; p[2] = 5;
<span style="color: blue;">for</span> (c = 3, a = 1; a + 30 <= m; )
{
<span style="color: blue;">if</span> ((x[(a += 6) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (<span style="color: blue;">ushort</span>)a;
<span style="color: blue;">if</span> ((x[(a += 4) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (<span style="color: blue;">ushort</span>)a;
<span style="color: blue;">if</span> ((x[(a += 2) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (<span style="color: blue;">ushort</span>)a;
<span style="color: blue;">if</span> ((x[(a += 4) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (<span style="color: blue;">ushort</span>)a;
<span style="color: blue;">if</span> ((x[(a += 2) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (<span style="color: blue;">ushort</span>)a;
<span style="color: blue;">if</span> ((x[(a += 4) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (<span style="color: blue;">ushort</span>)a;
<span style="color: blue;">if</span> ((x[(a += 6) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (<span style="color: blue;">ushort</span>)a;
<span style="color: blue;">if</span> ((x[(a += 2) >> 6] & 1 << (a >> 1)) == 0) p[c++] = (<span style="color: blue;">ushort</span>)a;
}
<span style="color: blue;">for</span> (b = 0; ; )
{
<span style="color: blue;">if</span> ((a += 0x5A28A6 >> (3 * (b++ & 7)) & 7) > m) <span style="color: blue;">break</span>;
<span style="color: blue;">if</span> ((x[a >> 6] & 1 << (a >> 1)) == 0) p[c++] = (<span style="color: blue;">ushort</span>)a;
}
Array.Resize(<span style="color: blue;">ref</span> p, c); <span style="color: blue;">return</span> p;
}
<span style="color: blue;">static</span> <span style="color: blue;">ushort</span>[] primes2(<span style="color: blue;">ushort</span> u)
{
<span style="color: blue;">ushort</span>[] p = primes(); <span style="color: blue;">int</span> i = Array.BinarySearch(p, u);
Array.Resize(<span style="color: blue;">ref</span> p, i < 0 ? ~i : i + 1); <span style="color: blue;">return</span> p;
}
<span style="color: blue;">static</span> <span style="color: blue;">ushort</span>[] primes()
{
#region primes < 2^16
<span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: blue;">ushort</span>[] {2,3,5,7,
11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,
197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,
311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,
431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,
557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,
661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,
809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,
937,941,947,953,967,971,977,983,991,997,
1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093,
1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,
1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,1303,
1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,1433,1439,
1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,1523,1531,1543,
1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,1619,1621,1627,
1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,1741,1747,1753,
1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,
1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,
2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,
2113,2129,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,
2243,2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,
2351,2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,
2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,
2609,2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699,
2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797,2801,
2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909,2917,2927,
2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037,3041,3049,3061,
3067,3079,3083,3089,3109,3119,3121,3137,3163,3167,3169,3181,3187,3191,3203,
3209,3217,3221,3229,3251,3253,3257,3259,3271,3299,3301,3307,3313,3319,3323,
3329,3331,3343,3347,3359,3361,3371,3373,3389,3391,3407,3413,3433,3449,3457,
3461,3463,3467,3469,3491,3499,3511,3517,3527,3529,3533,3539,3541,3547,3557,
3559,3571,3581,3583,3593,3607,3613,3617,3623,3631,3637,3643,3659,3671,3673,
3677,3691,3697,3701,3709,3719,3727,3733,3739,3761,3767,3769,3779,3793,3797,
3803,3821,3823,3833,3847,3851,3853,3863,3877,3881,3889,3907,3911,3917,3919,
3923,3929,3931,3943,3947,3967,3989,4001,4003,4007,4013,4019,4021,4027,4049,
4051,4057,4073,4079,4091,4093,4099,4111,4127,4129,4133,4139,4153,4157,4159,
4177,4201,4211,4217,4219,4229,4231,4241,4243,4253,4259,4261,4271,4273,4283,
4289,4297,4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,4421,4423,4441,
4447,4451,4457,4463,4481,4483,4493,4507,4513,4517,4519,4523,4547,4549,4561,
4567,4583,4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,4663,4673,4679,
4691,4703,4721,4723,4729,4733,4751,4759,4783,4787,4789,4793,4799,4801,4813,
4817,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933,4937,4943,4951,4957,
4967,4969,4973,4987,4993,4999,5003,5009,5011,5021,5023,5039,5051,5059,5077,
5081,5087,5099,5101,5107,5113,5119,5147,5153,5167,5171,5179,5189,5197,5209,
5227,5231,5233,5237,5261,5273,5279,5281,5297,5303,5309,5323,5333,5347,5351,
5381,5387,5393,5399,5407,5413,5417,5419,5431,5437,5441,5443,5449,5471,5477,
5479,5483,5501,5503,5507,5519,5521,5527,5531,5557,5563,5569,5573,5581,5591,
5623,5639,5641,5647,5651,5653,5657,5659,5669,5683,5689,5693,5701,5711,5717,
5737,5741,5743,5749,5779,5783,5791,5801,5807,5813,5821,5827,5839,5843,5849,
5851,5857,5861,5867,5869,5879,5881,5897,5903,5923,5927,5939,5953,5981,5987,
6007,6011,6029,6037,6043,6047,6053,6067,6073,6079,6089,6091,6101,6113,6121,
6131,6133,6143,6151,6163,6173,6197,6199,6203,6211,6217,6221,6229,6247,6257,
6263,6269,6271,6277,6287,6299,6301,6311,6317,6323,6329,6337,6343,6353,6359,
6361,6367,6373,6379,6389,6397,6421,6427,6449,6451,6469,6473,6481,6491,6521,
6529,6547,6551,6553,6563,6569,6571,6577,6581,6599,6607,6619,6637,6653,6659,
6661,6673,6679,6689,6691,6701,6703,6709,6719,6733,6737,6761,6763,6779,6781,
6791,6793,6803,6823,6827,6829,6833,6841,6857,6863,6869,6871,6883,6899,6907,
6911,6917,6947,6949,6959,6961,6967,6971,6977,6983,6991,6997,7001,7013,7019,
7027,7039,7043,7057,7069,7079,7103,7109,7121,7127,7129,7151,7159,7177,7187,
7193,7207,7211,7213,7219,7229,7237,7243,7247,7253,7283,7297,7307,7309,7321,
7331,7333,7349,7351,7369,7393,7411,7417,7433,7451,7457,7459,7477,7481,7487,
7489,7499,7507,7517,7523,7529,7537,7541,7547,7549,7559,7561,7573,7577,7583,
7589,7591,7603,7607,7621,7639,7643,7649,7669,7673,7681,7687,7691,7699,7703,
7717,7723,7727,7741,7753,7757,7759,7789,7793,7817,7823,7829,7841,7853,7867,
7873,7877,7879,7883,7901,7907,7919,7927,7933,7937,7949,7951,7963,7993,8009,
8011,8017,8039,8053,8059,8069,8081,8087,8089,8093,8101,8111,8117,8123,8147,
8161,8167,8171,8179,8191,8209,8219,8221,8231,8233,8237,8243,8263,8269,8273,
8287,8291,8293,8297,8311,8317,8329,8353,8363,8369,8377,8387,8389,8419,8423,
8429,8431,8443,8447,8461,8467,8501,8513,8521,8527,8537,8539,8543,8563,8573,
8581,8597,8599,8609,8623,8627,8629,8641,8647,8663,8669,8677,8681,8689,8693,
8699,8707,8713,8719,8731,8737,8741,8747,8753,8761,8779,8783,8803,8807,8819,
8821,8831,8837,8839,8849,8861,8863,8867,8887,8893,8923,8929,8933,8941,8951,
8963,8969,8971,8999,9001,9007,9011,9013,9029,9041,9043,9049,9059,9067,9091,
9103,9109,9127,9133,9137,9151,9157,9161,9173,9181,9187,9199,9203,9209,9221,
9227,9239,9241,9257,9277,9281,9283,9293,9311,9319,9323,9337,9341,9343,9349,
9371,9377,9391,9397,9403,9413,9419,9421,9431,9433,9437,9439,9461,9463,9467,
9473,9479,9491,9497,9511,9521,9533,9539,9547,9551,9587,9601,9613,9619,9623,
9629,9631,9643,9649,9661,9677,9679,9689,9697,9719,9721,9733,9739,9743,9749,
9767,9769,9781,9787,9791,9803,9811,9817,9829,9833,9839,9851,9857,9859,9871,
9883,9887,9901,9907,9923,9929,9931,9941,9949,9967,9973,
10007,10009,10037,10039,10061,10067,10069,10079,10091,10093,10099,10103,10111,
10133,10139,10141,10151,10159,10163,10169,10177,10181,10193,10211,10223,10243,
10247,10253,10259,10267,10271,10273,10289,10301,10303,10313,10321,10331,10333,
10337,10343,10357,10369,10391,10399,10427,10429,10433,10453,10457,10459,10463,
10477,10487,10499,10501,10513,10529,10531,10559,10567,10589,10597,10601,10607,
10613,10627,10631,10639,10651,10657,10663,10667,10687,10691,10709,10711,10723,
10729,10733,10739,10753,10771,10781,10789,10799,10831,10837,10847,10853,10859,
10861,10867,10883,10889,10891,10903,10909,10937,10939,10949,10957,10973,10979,
10987,10993,11003,11027,11047,11057,11059,11069,11071,11083,11087,11093,11113,
11117,11119,11131,11149,11159,11161,11171,11173,11177,11197,11213,11239,11243,
11251,11257,11261,11273,11279,11287,11299,11311,11317,11321,11329,11351,11353,
11369,11383,11393,11399,11411,11423,11437,11443,11447,11467,11471,11483,11489,
11491,11497,11503,11519,11527,11549,11551,11579,11587,11593,11597,11617,11621,
11633,11657,11677,11681,11689,11699,11701,11717,11719,11731,11743,11777,11779,
11783,11789,11801,11807,11813,11821,11827,11831,11833,11839,11863,11867,11887,
11897,11903,11909,11923,11927,11933,11939,11941,11953,11959,11969,11971,11981,
11987,12007,12011,12037,12041,12043,12049,12071,12073,12097,12101,12107,12109,
12113,12119,12143,12149,12157,12161,12163,12197,12203,12211,12227,12239,12241,
12251,12253,12263,12269,12277,12281,12289,12301,12323,12329,12343,12347,12373,
12377,12379,12391,12401,12409,12413,12421,12433,12437,12451,12457,12473,12479,
12487,12491,12497,12503,12511,12517,12527,12539,12541,12547,12553,12569,12577,
12583,12589,12601,12611,12613,12619,12637,12641,12647,12653,12659,12671,12689,
12697,12703,12713,12721,12739,12743,12757,12763,12781,12791,12799,12809,12821,
12823,12829,12841,12853,12889,12893,12899,12907,12911,12917,12919,12923,12941,
12953,12959,12967,12973,12979,12983,13001,13003,13007,13009,13033,13037,13043,
13049,13063,13093,13099,13103,13109,13121,13127,13147,13151,13159,13163,13171,
13177,13183,13187,13217,13219,13229,13241,13249,13259,13267,13291,13297,13309,
13313,13327,13331,13337,13339,13367,13381,13397,13399,13411,13417,13421,13441,
13451,13457,13463,13469,13477,13487,13499,13513,13523,13537,13553,13567,13577,
13591,13597,13613,13619,13627,13633,13649,13669,13679,13681,13687,13691,13693,
13697,13709,13711,13721,13723,13729,13751,13757,13759,13763,13781,13789,13799,
13807,13829,13831,13841,13859,13873,13877,13879,13883,13901,13903,13907,13913,
13921,13931,13933,13963,13967,13997,13999,14009,14011,14029,14033,14051,14057,
14071,14081,14083,14087,14107,14143,14149,14153,14159,14173,14177,14197,14207,
14221,14243,14249,14251,14281,14293,14303,14321,14323,14327,14341,14347,14369,
14387,14389,14401,14407,14411,14419,14423,14431,14437,14447,14449,14461,14479,
14489,14503,14519,14533,14537,14543,14549,14551,14557,14561,14563,14591,14593,
14621,14627,14629,14633,14639,14653,14657,14669,14683,14699,14713,14717,14723,
14731,14737,14741,14747,14753,14759,14767,14771,14779,14783,14797,14813,14821,
14827,14831,14843,14851,14867,14869,14879,14887,14891,14897,14923,14929,14939,
14947,14951,14957,14969,14983,15013,15017,15031,15053,15061,15073,15077,15083,
15091,15101,15107,15121,15131,15137,15139,15149,15161,15173,15187,15193,15199,
15217,15227,15233,15241,15259,15263,15269,15271,15277,15287,15289,15299,15307,
15313,15319,15329,15331,15349,15359,15361,15373,15377,15383,15391,15401,15413,
15427,15439,15443,15451,15461,15467,15473,15493,15497,15511,15527,15541,15551,
15559,15569,15581,15583,15601,15607,15619,15629,15641,15643,15647,15649,15661,
15667,15671,15679,15683,15727,15731,15733,15737,15739,15749,15761,15767,15773,
15787,15791,15797,15803,15809,15817,15823,15859,15877,15881,15887,15889,15901,
15907,15913,15919,15923,15937,15959,15971,15973,15991,16001,16007,16033,16057,
16061,16063,16067,16069,16073,16087,16091,16097,16103,16111,16127,16139,16141,
16183,16187,16189,16193,16217,16223,16229,16231,16249,16253,16267,16273,16301,
16319,16333,16339,16349,16361,16363,16369,16381,16411,16417,16421,16427,16433,
16447,16451,16453,16477,16481,16487,16493,16519,16529,16547,16553,16561,16567,
16573,16603,16607,16619,16631,16633,16649,16651,16657,16661,16673,16691,16693,
16699,16703,16729,16741,16747,16759,16763,16787,16811,16823,16829,16831,16843,
16871,16879,16883,16889,16901,16903,16921,16927,16931,16937,16943,16963,16979,
16981,16987,16993,17011,17021,17027,17029,17033,17041,17047,17053,17077,17093,
17099,17107,17117,17123,17137,17159,17167,17183,17189,17191,17203,17207,17209,
17231,17239,17257,17291,17293,17299,17317,17321,17327,17333,17341,17351,17359,
17377,17383,17387,17389,17393,17401,17417,17419,17431,17443,17449,17467,17471,
17477,17483,17489,17491,17497,17509,17519,17539,17551,17569,17573,17579,17581,
17597,17599,17609,17623,17627,17657,17659,17669,17681,17683,17707,17713,17729,
17737,17747,17749,17761,17783,17789,17791,17807,17827,17837,17839,17851,17863,
17881,17891,17903,17909,17911,17921,17923,17929,17939,17957,17959,17971,17977,
17981,17987,17989,18013,18041,18043,18047,18049,18059,18061,18077,18089,18097,
18119,18121,18127,18131,18133,18143,18149,18169,18181,18191,18199,18211,18217,
18223,18229,18233,18251,18253,18257,18269,18287,18289,18301,18307,18311,18313,
18329,18341,18353,18367,18371,18379,18397,18401,18413,18427,18433,18439,18443,
18451,18457,18461,18481,18493,18503,18517,18521,18523,18539,18541,18553,18583,
18587,18593,18617,18637,18661,18671,18679,18691,18701,18713,18719,18731,18743,
18749,18757,18773,18787,18793,18797,18803,18839,18859,18869,18899,18911,18913,
18917,18919,18947,18959,18973,18979,19001,19009,19013,19031,19037,19051,19069,
19073,19079,19081,19087,19121,19139,19141,19157,19163,19181,19183,19207,19211,
19213,19219,19231,19237,19249,19259,19267,19273,19289,19301,19309,19319,19333,
19373,19379,19381,19387,19391,19403,19417,19421,19423,19427,19429,19433,19441,
19447,19457,19463,19469,19471,19477,19483,19489,19501,19507,19531,19541,19543,
19553,19559,19571,19577,19583,19597,19603,19609,19661,19681,19687,19697,19699,
19709,19717,19727,19739,19751,19753,19759,19763,19777,19793,19801,19813,19819,
19841,19843,19853,19861,19867,19889,19891,19913,19919,19927,19937,19949,19961,
19963,19973,19979,19991,19993,19997,20011,20021,20023,20029,20047,20051,20063,
20071,20089,20101,20107,20113,20117,20123,20129,20143,20147,20149,20161,20173,
20177,20183,20201,20219,20231,20233,20249,20261,20269,20287,20297,20323,20327,
20333,20341,20347,20353,20357,20359,20369,20389,20393,20399,20407,20411,20431,
20441,20443,20477,20479,20483,20507,20509,20521,20533,20543,20549,20551,20563,
20593,20599,20611,20627,20639,20641,20663,20681,20693,20707,20717,20719,20731,
20743,20747,20749,20753,20759,20771,20773,20789,20807,20809,20849,20857,20873,
20879,20887,20897,20899,20903,20921,20929,20939,20947,20959,20963,20981,20983,
21001,21011,21013,21017,21019,21023,21031,21059,21061,21067,21089,21101,21107,
21121,21139,21143,21149,21157,21163,21169,21179,21187,21191,21193,21211,21221,
21227,21247,21269,21277,21283,21313,21317,21319,21323,21341,21347,21377,21379,
21383,21391,21397,21401,21407,21419,21433,21467,21481,21487,21491,21493,21499,
21503,21517,21521,21523,21529,21557,21559,21563,21569,21577,21587,21589,21599,
21601,21611,21613,21617,21647,21649,21661,21673,21683,21701,21713,21727,21737,
21739,21751,21757,21767,21773,21787,21799,21803,21817,21821,21839,21841,21851,
21859,21863,21871,21881,21893,21911,21929,21937,21943,21961,21977,21991,21997,
22003,22013,22027,22031,22037,22039,22051,22063,22067,22073,22079,22091,22093,
22109,22111,22123,22129,22133,22147,22153,22157,22159,22171,22189,22193,22229,
22247,22259,22271,22273,22277,22279,22283,22291,22303,22307,22343,22349,22367,
22369,22381,22391,22397,22409,22433,22441,22447,22453,22469,22481,22483,22501,
22511,22531,22541,22543,22549,22567,22571,22573,22613,22619,22621,22637,22639,
22643,22651,22669,22679,22691,22697,22699,22709,22717,22721,22727,22739,22741,
22751,22769,22777,22783,22787,22807,22811,22817,22853,22859,22861,22871,22877,
22901,22907,22921,22937,22943,22961,22963,22973,22993,23003,23011,23017,23021,
23027,23029,23039,23041,23053,23057,23059,23063,23071,23081,23087,23099,23117,
23131,23143,23159,23167,23173,23189,23197,23201,23203,23209,23227,23251,23269,
23279,23291,23293,23297,23311,23321,23327,23333,23339,23357,23369,23371,23399,
23417,23431,23447,23459,23473,23497,23509,23531,23537,23539,23549,23557,23561,
23563,23567,23581,23593,23599,23603,23609,23623,23627,23629,23633,23663,23669,
23671,23677,23687,23689,23719,23741,23743,23747,23753,23761,23767,23773,23789,
23801,23813,23819,23827,23831,23833,23857,23869,23873,23879,23887,23893,23899,
23909,23911,23917,23929,23957,23971,23977,23981,23993,24001,24007,24019,24023,
24029,24043,24049,24061,24071,24077,24083,24091,24097,24103,24107,24109,24113,
24121,24133,24137,24151,24169,24179,24181,24197,24203,24223,24229,24239,24247,
24251,24281,24317,24329,24337,24359,24371,24373,24379,24391,24407,24413,24419,
24421,24439,24443,24469,24473,24481,24499,24509,24517,24527,24533,24547,24551,
24571,24593,24611,24623,24631,24659,24671,24677,24683,24691,24697,24709,24733,
24749,24763,24767,24781,24793,24799,24809,24821,24841,24847,24851,24859,24877,
24889,24907,24917,24919,24923,24943,24953,24967,24971,24977,24979,24989,25013,
25031,25033,25037,25057,25073,25087,25097,25111,25117,25121,25127,25147,25153,
25163,25169,25171,25183,25189,25219,25229,25237,25243,25247,25253,25261,25301,
25303,25307,25309,25321,25339,25343,25349,25357,25367,25373,25391,25409,25411,
25423,25439,25447,25453,25457,25463,25469,25471,25523,25537,25541,25561,25577,
25579,25583,25589,25601,25603,25609,25621,25633,25639,25643,25657,25667,25673,
25679,25693,25703,25717,25733,25741,25747,25759,25763,25771,25793,25799,25801,
25819,25841,25847,25849,25867,25873,25889,25903,25913,25919,25931,25933,25939,
25943,25951,25969,25981,25997,25999,26003,26017,26021,26029,26041,26053,26083,
26099,26107,26111,26113,26119,26141,26153,26161,26171,26177,26183,26189,26203,
26209,26227,26237,26249,26251,26261,26263,26267,26293,26297,26309,26317,26321,
26339,26347,26357,26371,26387,26393,26399,26407,26417,26423,26431,26437,26449,
26459,26479,26489,26497,26501,26513,26539,26557,26561,26573,26591,26597,26627,
26633,26641,26647,26669,26681,26683,26687,26693,26699,26701,26711,26713,26717,
26723,26729,26731,26737,26759,26777,26783,26801,26813,26821,26833,26839,26849,
26861,26863,26879,26881,26891,26893,26903,26921,26927,26947,26951,26953,26959,
26981,26987,26993,27011,27017,27031,27043,27059,27061,27067,27073,27077,27091,
27103,27107,27109,27127,27143,27179,27191,27197,27211,27239,27241,27253,27259,
27271,27277,27281,27283,27299,27329,27337,27361,27367,27397,27407,27409,27427,
27431,27437,27449,27457,27479,27481,27487,27509,27527,27529,27539,27541,27551,
27581,27583,27611,27617,27631,27647,27653,27673,27689,27691,27697,27701,27733,
27737,27739,27743,27749,27751,27763,27767,27773,27779,27791,27793,27799,27803,
27809,27817,27823,27827,27847,27851,27883,27893,27901,27917,27919,27941,27943,
27947,27953,27961,27967,27983,27997,28001,28019,28027,28031,28051,28057,28069,
28081,28087,28097,28099,28109,28111,28123,28151,28163,28181,28183,28201,28211,
28219,28229,28277,28279,28283,28289,28297,28307,28309,28319,28349,28351,28387,
28393,28403,28409,28411,28429,28433,28439,28447,28463,28477,28493,28499,28513,
28517,28537,28541,28547,28549,28559,28571,28573,28579,28591,28597,28603,28607,
28619,28621,28627,28631,28643,28649,28657,28661,28663,28669,28687,28697,28703,
28711,28723,28729,28751,28753,28759,28771,28789,28793,28807,28813,28817,28837,
28843,28859,28867,28871,28879,28901,28909,28921,28927,28933,28949,28961,28979,
29009,29017,29021,29023,29027,29033,29059,29063,29077,29101,29123,29129,29131,
29137,29147,29153,29167,29173,29179,29191,29201,29207,29209,29221,29231,29243,
29251,29269,29287,29297,29303,29311,29327,29333,29339,29347,29363,29383,29387,
29389,29399,29401,29411,29423,29429,29437,29443,29453,29473,29483,29501,29527,
29531,29537,29567,29569,29573,29581,29587,29599,29611,29629,29633,29641,29663,
29669,29671,29683,29717,29723,29741,29753,29759,29761,29789,29803,29819,29833,
29837,29851,29863,29867,29873,29879,29881,29917,29921,29927,29947,29959,29983,
29989,30011,30013,30029,30047,30059,30071,30089,30091,30097,30103,30109,30113,
30119,30133,30137,30139,30161,30169,30181,30187,30197,30203,30211,30223,30241,
30253,30259,30269,30271,30293,30307,30313,30319,30323,30341,30347,30367,30389,
30391,30403,30427,30431,30449,30467,30469,30491,30493,30497,30509,30517,30529,
30539,30553,30557,30559,30577,30593,30631,30637,30643,30649,30661,30671,30677,
30689,30697,30703,30707,30713,30727,30757,30763,30773,30781,30803,30809,30817,
30829,30839,30841,30851,30853,30859,30869,30871,30881,30893,30911,30931,30937,
30941,30949,30971,30977,30983,31013,31019,31033,31039,31051,31063,31069,31079,
31081,31091,31121,31123,31139,31147,31151,31153,31159,31177,31181,31183,31189,
31193,31219,31223,31231,31237,31247,31249,31253,31259,31267,31271,31277,31307,
31319,31321,31327,31333,31337,31357,31379,31387,31391,31393,31397,31469,31477,
31481,31489,31511,31513,31517,31531,31541,31543,31547,31567,31573,31583,31601,
31607,31627,31643,31649,31657,31663,31667,31687,31699,31721,31723,31727,31729,
31741,31751,31769,31771,31793,31799,31817,31847,31849,31859,31873,31883,31891,
31907,31957,31963,31973,31981,31991,32003,32009,32027,32029,32051,32057,32059,
32063,32069,32077,32083,32089,32099,32117,32119,32141,32143,32159,32173,32183,
32189,32191,32203,32213,32233,32237,32251,32257,32261,32297,32299,32303,32309,
32321,32323,32327,32341,32353,32359,32363,32369,32371,32377,32381,32401,32411,
32413,32423,32429,32441,32443,32467,32479,32491,32497,32503,32507,32531,32533,
32537,32561,32563,32569,32573,32579,32587,32603,32609,32611,32621,32633,32647,
32653,32687,32693,32707,32713,32717,32719,32749,32771,32779,32783,32789,32797,
32801,32803,32831,32833,32839,32843,32869,32887,32909,32911,32917,32933,32939,
32941,32957,32969,32971,32983,32987,32993,32999,33013,33023,33029,33037,33049,
33053,33071,33073,33083,33091,33107,33113,33119,33149,33151,33161,33179,33181,
33191,33199,33203,33211,33223,33247,33287,33289,33301,33311,33317,33329,33331,
33343,33347,33349,33353,33359,33377,33391,33403,33409,33413,33427,33457,33461,
33469,33479,33487,33493,33503,33521,33529,33533,33547,33563,33569,33577,33581,
33587,33589,33599,33601,33613,33617,33619,33623,33629,33637,33641,33647,33679,
33703,33713,33721,33739,33749,33751,33757,33767,33769,33773,33791,33797,33809,
33811,33827,33829,33851,33857,33863,33871,33889,33893,33911,33923,33931,33937,
33941,33961,33967,33997,34019,34031,34033,34039,34057,34061,34123,34127,34129,
34141,34147,34157,34159,34171,34183,34211,34213,34217,34231,34253,34259,34261,
34267,34273,34283,34297,34301,34303,34313,34319,34327,34337,34351,34361,34367,
34369,34381,34403,34421,34429,34439,34457,34469,34471,34483,34487,34499,34501,
34511,34513,34519,34537,34543,34549,34583,34589,34591,34603,34607,34613,34631,
34649,34651,34667,34673,34679,34687,34693,34703,34721,34729,34739,34747,34757,
34759,34763,34781,34807,34819,34841,34843,34847,34849,34871,34877,34883,34897,
34913,34919,34939,34949,34961,34963,34981,35023,35027,35051,35053,35059,35069,
35081,35083,35089,35099,35107,35111,35117,35129,35141,35149,35153,35159,35171,
35201,35221,35227,35251,35257,35267,35279,35281,35291,35311,35317,35323,35327,
35339,35353,35363,35381,35393,35401,35407,35419,35423,35437,35447,35449,35461,
35491,35507,35509,35521,35527,35531,35533,35537,35543,35569,35573,35591,35593,
35597,35603,35617,35671,35677,35729,35731,35747,35753,35759,35771,35797,35801,
35803,35809,35831,35837,35839,35851,35863,35869,35879,35897,35899,35911,35923,
35933,35951,35963,35969,35977,35983,35993,35999,36007,36011,36013,36017,36037,
36061,36067,36073,36083,36097,36107,36109,36131,36137,36151,36161,36187,36191,
36209,36217,36229,36241,36251,36263,36269,36277,36293,36299,36307,36313,36319,
36341,36343,36353,36373,36383,36389,36433,36451,36457,36467,36469,36473,36479,
36493,36497,36523,36527,36529,36541,36551,36559,36563,36571,36583,36587,36599,
36607,36629,36637,36643,36653,36671,36677,36683,36691,36697,36709,36713,36721,
36739,36749,36761,36767,36779,36781,36787,36791,36793,36809,36821,36833,36847,
36857,36871,36877,36887,36899,36901,36913,36919,36923,36929,36931,36943,36947,
36973,36979,36997,37003,37013,37019,37021,37039,37049,37057,37061,37087,37097,
37117,37123,37139,37159,37171,37181,37189,37199,37201,37217,37223,37243,37253,
37273,37277,37307,37309,37313,37321,37337,37339,37357,37361,37363,37369,37379,
37397,37409,37423,37441,37447,37463,37483,37489,37493,37501,37507,37511,37517,
37529,37537,37547,37549,37561,37567,37571,37573,37579,37589,37591,37607,37619,
37633,37643,37649,37657,37663,37691,37693,37699,37717,37747,37781,37783,37799,
37811,37813,37831,37847,37853,37861,37871,37879,37889,37897,37907,37951,37957,
37963,37967,37987,37991,37993,37997,38011,38039,38047,38053,38069,38083,38113,
38119,38149,38153,38167,38177,38183,38189,38197,38201,38219,38231,38237,38239,
38261,38273,38281,38287,38299,38303,38317,38321,38327,38329,38333,38351,38371,
38377,38393,38431,38447,38449,38453,38459,38461,38501,38543,38557,38561,38567,
38569,38593,38603,38609,38611,38629,38639,38651,38653,38669,38671,38677,38693,
38699,38707,38711,38713,38723,38729,38737,38747,38749,38767,38783,38791,38803,
38821,38833,38839,38851,38861,38867,38873,38891,38903,38917,38921,38923,38933,
38953,38959,38971,38977,38993,39019,39023,39041,39043,39047,39079,39089,39097,
39103,39107,39113,39119,39133,39139,39157,39161,39163,39181,39191,39199,39209,
39217,39227,39229,39233,39239,39241,39251,39293,39301,39313,39317,39323,39341,
39343,39359,39367,39371,39373,39383,39397,39409,39419,39439,39443,39451,39461,
39499,39503,39509,39511,39521,39541,39551,39563,39569,39581,39607,39619,39623,
39631,39659,39667,39671,39679,39703,39709,39719,39727,39733,39749,39761,39769,
39779,39791,39799,39821,39827,39829,39839,39841,39847,39857,39863,39869,39877,
39883,39887,39901,39929,39937,39953,39971,39979,39983,39989,40009,40013,40031,
40037,40039,40063,40087,40093,40099,40111,40123,40127,40129,40151,40153,40163,
40169,40177,40189,40193,40213,40231,40237,40241,40253,40277,40283,40289,40343,
40351,40357,40361,40387,40423,40427,40429,40433,40459,40471,40483,40487,40493,
40499,40507,40519,40529,40531,40543,40559,40577,40583,40591,40597,40609,40627,
40637,40639,40693,40697,40699,40709,40739,40751,40759,40763,40771,40787,40801,
40813,40819,40823,40829,40841,40847,40849,40853,40867,40879,40883,40897,40903,
40927,40933,40939,40949,40961,40973,40993,41011,41017,41023,41039,41047,41051,
41057,41077,41081,41113,41117,41131,41141,41143,41149,41161,41177,41179,41183,
41189,41201,41203,41213,41221,41227,41231,41233,41243,41257,41263,41269,41281,
41299,41333,41341,41351,41357,41381,41387,41389,41399,41411,41413,41443,41453,
41467,41479,41491,41507,41513,41519,41521,41539,41543,41549,41579,41593,41597,
41603,41609,41611,41617,41621,41627,41641,41647,41651,41659,41669,41681,41687,
41719,41729,41737,41759,41761,41771,41777,41801,41809,41813,41843,41849,41851,
41863,41879,41887,41893,41897,41903,41911,41927,41941,41947,41953,41957,41959,
41969,41981,41983,41999,42013,42017,42019,42023,42043,42061,42071,42073,42083,
42089,42101,42131,42139,42157,42169,42179,42181,42187,42193,42197,42209,42221,
42223,42227,42239,42257,42281,42283,42293,42299,42307,42323,42331,42337,42349,
42359,42373,42379,42391,42397,42403,42407,42409,42433,42437,42443,42451,42457,
42461,42463,42467,42473,42487,42491,42499,42509,42533,42557,42569,42571,42577,
42589,42611,42641,42643,42649,42667,42677,42683,42689,42697,42701,42703,42709,
42719,42727,42737,42743,42751,42767,42773,42787,42793,42797,42821,42829,42839,
42841,42853,42859,42863,42899,42901,42923,42929,42937,42943,42953,42961,42967,
42979,42989,43003,43013,43019,43037,43049,43051,43063,43067,43093,43103,43117,
43133,43151,43159,43177,43189,43201,43207,43223,43237,43261,43271,43283,43291,
43313,43319,43321,43331,43391,43397,43399,43403,43411,43427,43441,43451,43457,
43481,43487,43499,43517,43541,43543,43573,43577,43579,43591,43597,43607,43609,
43613,43627,43633,43649,43651,43661,43669,43691,43711,43717,43721,43753,43759,
43777,43781,43783,43787,43789,43793,43801,43853,43867,43889,43891,43913,43933,
43943,43951,43961,43963,43969,43973,43987,43991,43997,44017,44021,44027,44029,
44041,44053,44059,44071,44087,44089,44101,44111,44119,44123,44129,44131,44159,
44171,44179,44189,44201,44203,44207,44221,44249,44257,44263,44267,44269,44273,
44279,44281,44293,44351,44357,44371,44381,44383,44389,44417,44449,44453,44483,
44491,44497,44501,44507,44519,44531,44533,44537,44543,44549,44563,44579,44587,
44617,44621,44623,44633,44641,44647,44651,44657,44683,44687,44699,44701,44711,
44729,44741,44753,44771,44773,44777,44789,44797,44809,44819,44839,44843,44851,
44867,44879,44887,44893,44909,44917,44927,44939,44953,44959,44963,44971,44983,
44987,45007,45013,45053,45061,45077,45083,45119,45121,45127,45131,45137,45139,
45161,45179,45181,45191,45197,45233,45247,45259,45263,45281,45289,45293,45307,
45317,45319,45329,45337,45341,45343,45361,45377,45389,45403,45413,45427,45433,
45439,45481,45491,45497,45503,45523,45533,45541,45553,45557,45569,45587,45589,
45599,45613,45631,45641,45659,45667,45673,45677,45691,45697,45707,45737,45751,
45757,45763,45767,45779,45817,45821,45823,45827,45833,45841,45853,45863,45869,
45887,45893,45943,45949,45953,45959,45971,45979,45989,46021,46027,46049,46051,
46061,46073,46091,46093,46099,46103,46133,46141,46147,46153,46171,46181,46183,
46187,46199,46219,46229,46237,46261,46271,46273,46279,46301,46307,46309,46327,
46337,46349,46351,46381,46399,46411,46439,46441,46447,46451,46457,46471,46477,
46489,46499,46507,46511,46523,46549,46559,46567,46573,46589,46591,46601,46619,
46633,46639,46643,46649,46663,46679,46681,46687,46691,46703,46723,46727,46747,
46751,46757,46769,46771,46807,46811,46817,46819,46829,46831,46853,46861,46867,
46877,46889,46901,46919,46933,46957,46993,46997,47017,47041,47051,47057,47059,
47087,47093,47111,47119,47123,47129,47137,47143,47147,47149,47161,47189,47207,
47221,47237,47251,47269,47279,47287,47293,47297,47303,47309,47317,47339,47351,
47353,47363,47381,47387,47389,47407,47417,47419,47431,47441,47459,47491,47497,
47501,47507,47513,47521,47527,47533,47543,47563,47569,47581,47591,47599,47609,
47623,47629,47639,47653,47657,47659,47681,47699,47701,47711,47713,47717,47737,
47741,47743,47777,47779,47791,47797,47807,47809,47819,47837,47843,47857,47869,
47881,47903,47911,47917,47933,47939,47947,47951,47963,47969,47977,47981,48017,
48023,48029,48049,48073,48079,48091,48109,48119,48121,48131,48157,48163,48179,
48187,48193,48197,48221,48239,48247,48259,48271,48281,48299,48311,48313,48337,
48341,48353,48371,48383,48397,48407,48409,48413,48437,48449,48463,48473,48479,
48481,48487,48491,48497,48523,48527,48533,48539,48541,48563,48571,48589,48593,
48611,48619,48623,48647,48649,48661,48673,48677,48679,48731,48733,48751,48757,
48761,48767,48779,48781,48787,48799,48809,48817,48821,48823,48847,48857,48859,
48869,48871,48883,48889,48907,48947,48953,48973,48989,48991,49003,49009,49019,
49031,49033,49037,49043,49057,49069,49081,49103,49109,49117,49121,49123,49139,
49157,49169,49171,49177,49193,49199,49201,49207,49211,49223,49253,49261,49277,
49279,49297,49307,49331,49333,49339,49363,49367,49369,49391,49393,49409,49411,
49417,49429,49433,49451,49459,49463,49477,49481,49499,49523,49529,49531,49537,
49547,49549,49559,49597,49603,49613,49627,49633,49639,49663,49667,49669,49681,
49697,49711,49727,49739,49741,49747,49757,49783,49787,49789,49801,49807,49811,
49823,49831,49843,49853,49871,49877,49891,49919,49921,49927,49937,49939,49943,
49957,49991,49993,49999,50021,50023,50033,50047,50051,50053,50069,50077,50087,
50093,50101,50111,50119,50123,50129,50131,50147,50153,50159,50177,50207,50221,
50227,50231,50261,50263,50273,50287,50291,50311,50321,50329,50333,50341,50359,
50363,50377,50383,50387,50411,50417,50423,50441,50459,50461,50497,50503,50513,
50527,50539,50543,50549,50551,50581,50587,50591,50593,50599,50627,50647,50651,
50671,50683,50707,50723,50741,50753,50767,50773,50777,50789,50821,50833,50839,
50849,50857,50867,50873,50891,50893,50909,50923,50929,50951,50957,50969,50971,
50989,50993,51001,51031,51043,51047,51059,51061,51071,51109,51131,51133,51137,
51151,51157,51169,51193,51197,51199,51203,51217,51229,51239,51241,51257,51263,
51283,51287,51307,51329,51341,51343,51347,51349,51361,51383,51407,51413,51419,
51421,51427,51431,51437,51439,51449,51461,51473,51479,51481,51487,51503,51511,
51517,51521,51539,51551,51563,51577,51581,51593,51599,51607,51613,51631,51637,
51647,51659,51673,51679,51683,51691,51713,51719,51721,51749,51767,51769,51787,
51797,51803,51817,51827,51829,51839,51853,51859,51869,51871,51893,51899,51907,
51913,51929,51941,51949,51971,51973,51977,51991,52009,52021,52027,52051,52057,
52067,52069,52081,52103,52121,52127,52147,52153,52163,52177,52181,52183,52189,
52201,52223,52237,52249,52253,52259,52267,52289,52291,52301,52313,52321,52361,
52363,52369,52379,52387,52391,52433,52453,52457,52489,52501,52511,52517,52529,
52541,52543,52553,52561,52567,52571,52579,52583,52609,52627,52631,52639,52667,
52673,52691,52697,52709,52711,52721,52727,52733,52747,52757,52769,52783,52807,
52813,52817,52837,52859,52861,52879,52883,52889,52901,52903,52919,52937,52951,
52957,52963,52967,52973,52981,52999,53003,53017,53047,53051,53069,53077,53087,
53089,53093,53101,53113,53117,53129,53147,53149,53161,53171,53173,53189,53197,
53201,53231,53233,53239,53267,53269,53279,53281,53299,53309,53323,53327,53353,
53359,53377,53381,53401,53407,53411,53419,53437,53441,53453,53479,53503,53507,
53527,53549,53551,53569,53591,53593,53597,53609,53611,53617,53623,53629,53633,
53639,53653,53657,53681,53693,53699,53717,53719,53731,53759,53773,53777,53783,
53791,53813,53819,53831,53849,53857,53861,53881,53887,53891,53897,53899,53917,
53923,53927,53939,53951,53959,53987,53993,54001,54011,54013,54037,54049,54059,
54083,54091,54101,54121,54133,54139,54151,54163,54167,54181,54193,54217,54251,
54269,54277,54287,54293,54311,54319,54323,54331,54347,54361,54367,54371,54377,
54401,54403,54409,54413,54419,54421,54437,54443,54449,54469,54493,54497,54499,
54503,54517,54521,54539,54541,54547,54559,54563,54577,54581,54583,54601,54617,
54623,54629,54631,54647,54667,54673,54679,54709,54713,54721,54727,54751,54767,
54773,54779,54787,54799,54829,54833,54851,54869,54877,54881,54907,54917,54919,
54941,54949,54959,54973,54979,54983,55001,55009,55021,55049,55051,55057,55061,
55073,55079,55103,55109,55117,55127,55147,55163,55171,55201,55207,55213,55217,
55219,55229,55243,55249,55259,55291,55313,55331,55333,55337,55339,55343,55351,
55373,55381,55399,55411,55439,55441,55457,55469,55487,55501,55511,55529,55541,
55547,55579,55589,55603,55609,55619,55621,55631,55633,55639,55661,55663,55667,
55673,55681,55691,55697,55711,55717,55721,55733,55763,55787,55793,55799,55807,
55813,55817,55819,55823,55829,55837,55843,55849,55871,55889,55897,55901,55903,
55921,55927,55931,55933,55949,55967,55987,55997,56003,56009,56039,56041,56053,
56081,56087,56093,56099,56101,56113,56123,56131,56149,56167,56171,56179,56197,
56207,56209,56237,56239,56249,56263,56267,56269,56299,56311,56333,56359,56369,
56377,56383,56393,56401,56417,56431,56437,56443,56453,56467,56473,56477,56479,
56489,56501,56503,56509,56519,56527,56531,56533,56543,56569,56591,56597,56599,
56611,56629,56633,56659,56663,56671,56681,56687,56701,56711,56713,56731,56737,
56747,56767,56773,56779,56783,56807,56809,56813,56821,56827,56843,56857,56873,
56891,56893,56897,56909,56911,56921,56923,56929,56941,56951,56957,56963,56983,
56989,56993,56999,57037,57041,57047,57059,57073,57077,57089,57097,57107,57119,
57131,57139,57143,57149,57163,57173,57179,57191,57193,57203,57221,57223,57241,
57251,57259,57269,57271,57283,57287,57301,57329,57331,57347,57349,57367,57373,
57383,57389,57397,57413,57427,57457,57467,57487,57493,57503,57527,57529,57557,
57559,57571,57587,57593,57601,57637,57641,57649,57653,57667,57679,57689,57697,
57709,57713,57719,57727,57731,57737,57751,57773,57781,57787,57791,57793,57803,
57809,57829,57839,57847,57853,57859,57881,57899,57901,57917,57923,57943,57947,
57973,57977,57991,58013,58027,58031,58043,58049,58057,58061,58067,58073,58099,
58109,58111,58129,58147,58151,58153,58169,58171,58189,58193,58199,58207,58211,
58217,58229,58231,58237,58243,58271,58309,58313,58321,58337,58363,58367,58369,
58379,58391,58393,58403,58411,58417,58427,58439,58441,58451,58453,58477,58481,
58511,58537,58543,58549,58567,58573,58579,58601,58603,58613,58631,58657,58661,
58679,58687,58693,58699,58711,58727,58733,58741,58757,58763,58771,58787,58789,
58831,58889,58897,58901,58907,58909,58913,58921,58937,58943,58963,58967,58979,
58991,58997,59009,59011,59021,59023,59029,59051,59053,59063,59069,59077,59083,
59093,59107,59113,59119,59123,59141,59149,59159,59167,59183,59197,59207,59209,
59219,59221,59233,59239,59243,59263,59273,59281,59333,59341,59351,59357,59359,
59369,59377,59387,59393,59399,59407,59417,59419,59441,59443,59447,59453,59467,
59471,59473,59497,59509,59513,59539,59557,59561,59567,59581,59611,59617,59621,
59627,59629,59651,59659,59663,59669,59671,59693,59699,59707,59723,59729,59743,
59747,59753,59771,59779,59791,59797,59809,59833,59863,59879,59887,59921,59929,
59951,59957,59971,59981,59999,60013,60017,60029,60037,60041,60077,60083,60089,
60091,60101,60103,60107,60127,60133,60139,60149,60161,60167,60169,60209,60217,
60223,60251,60257,60259,60271,60289,60293,60317,60331,60337,60343,60353,60373,
60383,60397,60413,60427,60443,60449,60457,60493,60497,60509,60521,60527,60539,
60589,60601,60607,60611,60617,60623,60631,60637,60647,60649,60659,60661,60679,
60689,60703,60719,60727,60733,60737,60757,60761,60763,60773,60779,60793,60811,
60821,60859,60869,60887,60889,60899,60901,60913,60917,60919,60923,60937,60943,
60953,60961,61001,61007,61027,61031,61043,61051,61057,61091,61099,61121,61129,
61141,61151,61153,61169,61211,61223,61231,61253,61261,61283,61291,61297,61331,
61333,61339,61343,61357,61363,61379,61381,61403,61409,61417,61441,61463,61469,
61471,61483,61487,61493,61507,61511,61519,61543,61547,61553,61559,61561,61583,
61603,61609,61613,61627,61631,61637,61643,61651,61657,61667,61673,61681,61687,
61703,61717,61723,61729,61751,61757,61781,61813,61819,61837,61843,61861,61871,
61879,61909,61927,61933,61949,61961,61967,61979,61981,61987,61991,62003,62011,
62017,62039,62047,62053,62057,62071,62081,62099,62119,62129,62131,62137,62141,
62143,62171,62189,62191,62201,62207,62213,62219,62233,62273,62297,62299,62303,
62311,62323,62327,62347,62351,62383,62401,62417,62423,62459,62467,62473,62477,
62483,62497,62501,62507,62533,62539,62549,62563,62581,62591,62597,62603,62617,
62627,62633,62639,62653,62659,62683,62687,62701,62723,62731,62743,62753,62761,
62773,62791,62801,62819,62827,62851,62861,62869,62873,62897,62903,62921,62927,
62929,62939,62969,62971,62981,62983,62987,62989,63029,63031,63059,63067,63073,
63079,63097,63103,63113,63127,63131,63149,63179,63197,63199,63211,63241,63247,
63277,63281,63299,63311,63313,63317,63331,63337,63347,63353,63361,63367,63377,
63389,63391,63397,63409,63419,63421,63439,63443,63463,63467,63473,63487,63493,
63499,63521,63527,63533,63541,63559,63577,63587,63589,63599,63601,63607,63611,
63617,63629,63647,63649,63659,63667,63671,63689,63691,63697,63703,63709,63719,
63727,63737,63743,63761,63773,63781,63793,63799,63803,63809,63823,63839,63841,
63853,63857,63863,63901,63907,63913,63929,63949,63977,63997,64007,64013,64019,
64033,64037,64063,64067,64081,64091,64109,64123,64151,64153,64157,64171,64187,
64189,64217,64223,64231,64237,64271,64279,64283,64301,64303,64319,64327,64333,
64373,64381,64399,64403,64433,64439,64451,64453,64483,64489,64499,64513,64553,
64567,64577,64579,64591,64601,64609,64613,64621,64627,64633,64661,64663,64667,
64679,64693,64709,64717,64747,64763,64781,64783,64793,64811,64817,64849,64853,
64871,64877,64879,64891,64901,64919,64921,64927,64937,64951,64969,64997,65003,
65011,65027,65029,65033,65053,65063,65071,65089,65099,65101,65111,65119,65123,
65129,65141,65147,65167,65171,65173,65179,65183,65203,65213,65239,65257,65267,
65269,65287,65293,65309,65323,65327,65353,65357,65371,65381,65393,65407,65413,
65419,65423,65437,65447,65449,65479,65497,65519,65521};
#endregion primes < 2^16
}
}</code></pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-20822028692890258102017-09-25T12:32:00.000-07:002018-04-10T09:59:44.396-07:00Direct Search Factorization<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-QYuFhIsJ-G4/WclXlKuT-bI/AAAAAAAAAcg/HDMoDV2RdvEa3HxjAXE7ryLuQ_t0Z_A4gCLcBGAs/s1600/7_31.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="221" data-original-width="925" src="https://1.bp.blogspot.com/-QYuFhIsJ-G4/WclXlKuT-bI/AAAAAAAAAcg/HDMoDV2RdvEa3HxjAXE7ryLuQ_t0Z_A4gCLcBGAs/s1600/7_31.jpg" /></a></div>
<br />
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">// <a href="http://mathworld.wolfram.com/DirectSearchFactorization.html" target="_blank">MathWorld</a>: DSF is the simplest (and most simple-minded) prime factorization algorithm.</span>
<span style="color: green;">// It consists of searching for factors of a number by systemetically performing trial divisions,</span>
<span style="color: green;">// usually using a sequence of increasing numbers. Multiples of small primes are commonly excluded</span>
<span style="color: green;">// to reduce the number of trial divisors, but just including them is sometimes faster than the time</span>
<span style="color: green;">// required to exclude them. DSF is very inefficient, and can be used only with fairly small numbers.</span>
<span style="color: blue;">using</span> System; <span style="color: green;">// i7-4790@3.6GHz</span>
<span style="color: blue;">using</span> System.Collections.Generic;
<span style="color: blue;">class</span> Program
{
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
findPF(~0uL); <span style="color: green;">// warm up</span>
time(4294967291); <span style="color: green;">// largest prime < 2^32 50 µs</span>
time(4294967291 * 4294967291uL); <span style="color: green;">// 6.5 s </span>
time(3183958073 * 5793651691uL); <span style="color: green;">// 2 primes 4.8 s</span>
time(~0uL - 58); <span style="color: green;">// largest prime < 2^64 6.5 s</span>
time(~0uL); <span style="color: green;">// (2^64)-1 100 µs </span>
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> time(<span style="color: blue;">ulong</span> u)
{
Console.Write(<span style="color: #a31515;">" n "</span> + u + <span style="color: #a31515;">"\n"</span> + <span style="color: #a31515;">" t "</span>);
<span style="color: blue;">var</span> sw = System.Diagnostics.Stopwatch.StartNew();
List<<span style="color: blue;">ulong</span>> pf = findPF(u);
Console.Write(sw.Elapsed + <span style="color: #a31515;">"\n"</span> + <span style="color: #a31515;">" f "</span>);
<span style="color: blue;">foreach</span> (<span style="color: blue;">var</span> v <span style="color: blue;">in</span> pf) Console.Write(v + <span style="color: #a31515;">" "</span>);
Console.Write(<span style="color: #a31515;">"\n"</span> + <span style="color: #a31515;">"\n"</span>);
}
<span style="color: blue;">static</span> List<<span style="color: blue;">ulong</span>> findPF(<span style="color: blue;">ulong</span> n)
{
<span style="color: blue;">var</span> pf = <span style="color: blue;">new</span> List<<span style="color: blue;">ulong</span>>();
<span style="color: blue;">if</span> (n < 4) { <span style="color: blue;">if</span> (n > 0) pf.Add(n); <span style="color: blue;">return</span> pf; }
<span style="color: blue;">while</span> (n % 2 == 0) { n /= 2; pf.Add(2); }
<span style="color: blue;">while</span> (n % 3 == 0) { n /= 3; pf.Add(3); }
<span style="color: blue;">while</span> (n % 5 == 0) { n /= 5; pf.Add(5); }
<span style="color: blue;">if</span> (n == 1) <span style="color: blue;">return</span> pf;
<span style="color: blue;">ulong</span> d = 1; <span style="color: blue;">uint</span> b = 0, rt = sqrt(n);
<span style="color: blue;">if</span> (n <= ~0u) { findPF((<span style="color: blue;">uint</span>)n, rt, 1, 0, pf); <span style="color: blue;">return</span> pf; }
<span style="color: blue;">for</span> (; ; b = 0x5A28A6)
{
<span style="color: blue;">while</span> (b > 0)
{
d += b & 7; b >>= 3; <span style="color: blue;">if</span> (d > rt) { pf.Add(n); <span style="color: blue;">return</span> pf; }
<span style="color: blue;">if</span> (n % d == 0)
{
n /= d; pf.Add(d); <span style="color: blue;">while</span> (n % d == 0) { n /= d; pf.Add(d); }
<span style="color: blue;">if</span> (n == 1) <span style="color: blue;">return</span> pf;
rt = sqrt(n);
<span style="color: blue;">if</span> (n <= ~0u) { findPF((<span style="color: blue;">uint</span>)n, rt, (<span style="color: blue;">uint</span>)d, b, pf); <span style="color: blue;">return</span> pf; }
}
}
<span style="color: blue;">while</span> (d + 30 <= rt && n % (d + 06) > 0 && n % (d + 10) > 0
&& n % (d + 12) > 0 && n % (d + 16) > 0
&& n % (d + 18) > 0 && n % (d + 22) > 0
&& n % (d + 28) > 0 && n % (d + 30) > 0) d += 30;
}
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> findPF(<span style="color: blue;">uint</span> n, <span style="color: blue;">uint</span> rt, <span style="color: blue;">uint</span> d, <span style="color: blue;">uint</span> b, List<<span style="color: blue;">ulong</span>> pf)
{
<span style="color: blue;">for</span> (; ; b = 0x5A28A6)
{
<span style="color: blue;">while</span> (b > 0)
{
d += b & 7; b >>= 3; <span style="color: blue;">if</span> (d > rt) { pf.Add(n); <span style="color: blue;">return</span>; }
<span style="color: blue;">if</span> (n % d == 0)
{
n /= d; pf.Add(d); <span style="color: blue;">while</span> (n % d == 0) { n /= d; pf.Add(d); }
<span style="color: blue;">if</span> (n == 1) <span style="color: blue;">return</span>;
rt = (<span style="color: blue;">uint</span>)Math.Sqrt(n);
}
}
<span style="color: blue;">while</span> (d + 30 <= rt && n % (d + 06) > 0 && n % (d + 10) > 0
&& n % (d + 12) > 0 && n % (d + 16) > 0
&& n % (d + 18) > 0 && n % (d + 22) > 0
&& n % (d + 28) > 0 && n % (d + 30) > 0) d += 30;
}
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span> sqrt(<span style="color: blue;">ulong</span> n0)
{
<span style="color: blue;">if</span> (n0 < 1uL << 52) <span style="color: blue;">return</span> (<span style="color: blue;">uint</span>)Math.Sqrt(n0);
<span style="color: blue;">ulong</span> n1 = n0 - 1 >> 24; <span style="color: blue;">int</span> s = 25;
<span style="color: blue;">if</span> (n1 > 255) { n1 >>= 4; s = 29; }
<span style="color: blue;">if</span> (n1 > 15) { n1 >>= 2; s |= 2; }
<span style="color: blue;">if</span> (n1 > 3) s++;
<span style="color: blue;">ulong</span> r0 = 1uL << s, r1 = r0 + (n0 >> s) >> 1;
<span style="color: blue;">while</span> (r1 < r0) { r0 = r1; r1 = r0 + n0 / r0 >> 1; }
<span style="color: blue;">return</span> (<span style="color: blue;">uint</span>)r0;
}
}
<span style="color: green;">///////////////////////////////////////////////////////////////////////////////////////////////////</span>
<span style="color: green;">// //</span>
<span style="color: green;">// Eight threads, four cores. // </span>
<span style="color: green;">// //</span>
<span style="color: green;">///////////////////////////////////////////////////////////////////////////////////////////////////</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Collections.Generic;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">class</span> Program
{
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
findPF(~0uL); <span style="color: green;">// warm up</span>
time(4294967291); <span style="color: green;">// largest prime < 2^32 90 µs</span>
time(4294967291 * 4294967291uL); <span style="color: green;">// 110 µs </span>
time(3183958073 * 5793651691uL); <span style="color: green;">// 2 primes 0.9 s</span>
time(~0uL - 58); <span style="color: green;">// largest prime < 2^64 1.1 s</span>
time(~0uL); <span style="color: green;">// (2^64)-1 80 µs </span>
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> time(<span style="color: blue;">ulong</span> u)
{
Console.Write(<span style="color: #a31515;">" n "</span> + u + <span style="color: #a31515;">"\n"</span> + <span style="color: #a31515;">" t "</span>);
<span style="color: blue;">var</span> sw = System.Diagnostics.Stopwatch.StartNew();
List<<span style="color: blue;">ulong</span>> pf = findPF(u);
Console.Write(sw.Elapsed + <span style="color: #a31515;">"\n"</span> + <span style="color: #a31515;">" f "</span>);
<span style="color: blue;">foreach</span> (<span style="color: blue;">var</span> v <span style="color: blue;">in</span> pf) Console.Write(v + <span style="color: #a31515;">" "</span>);
Console.Write(<span style="color: #a31515;">"\n"</span> + <span style="color: #a31515;">"\n"</span>);
}
<span style="color: blue;">static</span> List<<span style="color: blue;">ulong</span>> findPF(<span style="color: blue;">ulong</span> n)
{
<span style="color: blue;">var</span> pf = <span style="color: blue;">new</span> List<<span style="color: blue;">ulong</span>>();
<span style="color: blue;">if</span> (n < 4) { <span style="color: blue;">if</span> (n > 0) pf.Add(n); <span style="color: blue;">return</span> pf; }
<span style="color: blue;">while</span> (n % 2 == 0) { n /= 2; pf.Add(2); }
<span style="color: blue;">while</span> (n % 3 == 0) { n /= 3; pf.Add(3); }
<span style="color: blue;">while</span> (n % 5 == 0) { n /= 5; pf.Add(5); }
<span style="color: blue;">if</span> (n > 1) { recFindF(n, pf); pf.Sort(); } <span style="color: blue;">return</span> pf;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> recFindF(<span style="color: blue;">ulong</span> n, List<<span style="color: blue;">ulong</span>> pf)
{
<span style="color: blue;">ulong</span> f = findF(n); <span style="color: blue;">if</span> (f == n) pf.Add(n);
<span style="color: blue;">else</span> { recFindF(f, pf); recFindF(n / f, pf); }
}
<span style="color: blue;">static</span> <span style="color: blue;">ulong</span> findF(<span style="color: blue;">ulong</span> n)
{
<span style="color: blue;">uint</span> r = sqrt(n); <span style="color: blue;">if</span> (n % r == 0) <span style="color: blue;">return</span> r;
<span style="color: blue;">var</span> locker = <span style="color: blue;">new</span> <span style="color: blue;">object</span>();
Parallel.For(0, 8, k =>
{
<span style="color: blue;">ulong</span> d0 = k == 0 ? 07u : k == 1 ? 11u : k == 2 ? 13u : k == 3 ? 17u :
k == 4 ? 19u : k == 5 ? 23u : k == 6 ? 29u : 31;
<span style="color: blue;">ulong</span> d1 = d0 + 30, d2 = d0 + 60, d3 = d0 + 90;
<span style="color: blue;">while</span> (d0 <= r)
{
<span style="color: blue;">if</span> (n % d0 == 0 || n % d1 == 0 || n % d2 == 0 || n % d3 == 0)
<span style="color: blue;">lock</span> (locker)
{
<span style="color: blue;">if</span> (r == 0) <span style="color: blue;">return</span>; r = 0;
n = n % d0 == 0 ? d0 : n % d1 == 0 ? d1 : n % d2 == 0 ? d2 : d3;
<span style="color: blue;">return</span>;
}
d0 += 120; d1 += 120; d2 += 120; d3 += 120;
}
}); <span style="color: blue;">return</span> n;
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span> sqrt(<span style="color: blue;">ulong</span> n0)
{
<span style="color: blue;">if</span> (n0 < 1uL << 52) <span style="color: blue;">return</span> (<span style="color: blue;">uint</span>)Math.Sqrt(n0);
<span style="color: blue;">ulong</span> n1 = n0 - 1 >> 24; <span style="color: blue;">int</span> s = 25;
<span style="color: blue;">if</span> (n1 > 255) { n1 >>= 4; s = 29; }
<span style="color: blue;">if</span> (n1 > 15) { n1 >>= 2; s |= 2; }
<span style="color: blue;">if</span> (n1 > 3) s++;
<span style="color: blue;">ulong</span> r0 = 1uL << s, r1 = r0 + (n0 >> s) >> 1;
<span style="color: blue;">while</span> (r1 < r0) { r0 = r1; r1 = r0 + n0 / r0 >> 1; }
<span style="color: blue;">return</span> (<span style="color: blue;">uint</span>)r0;
}
}
<pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">///////////////////////////////////////////////////////////////////////////////////////////////////</span>
<span style="color: green;">// //</span>
<span style="color: green;">// ? //</span>
<span style="color: green;">// //</span>
<span style="color: green;">///////////////////////////////////////////////////////////////////////////////////////////////////</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Collections.Generic;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">class</span> Program
{
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
sqrt(1uL << 52);
<span style="color: blue;">ulong</span>[] n = <span style="color: blue;">new</span> <span style="color: blue;">ulong</span>[] { ~0u - 4, 0, ~0uL - 172, ~0uL - 58, ~0uL };
n[1] = n[0] * n[0];
findPF(n[0]); time(n[0]); <span style="color: green;">// largest prime < 2^32 50 µs</span>
findPF(n[1]); time(n[1]); <span style="color: green;">// 80 µs </span>
findPF(n[2]); time(n[2]); <span style="color: green;">// 2 primes 0.78 s</span>
findPF(n[3]); time(n[3]); <span style="color: green;">// largest prime < 2^64 1.05 s</span>
findPF(n[4]); time(n[4]); <span style="color: green;">// (2^64)-1 70 µs </span>
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> time(<span style="color: blue;">ulong</span> u)
{
Console.Write(<span style="color: #a31515;">" n "</span> + u + <span style="color: #a31515;">"\n"</span> + <span style="color: #a31515;">" t "</span>);
<span style="color: blue;">var</span> sw = System.Diagnostics.Stopwatch.StartNew();
List<<span style="color: blue;">ulong</span>> pf = findPF(u);
Console.Write(sw.Elapsed + <span style="color: #a31515;">"\n"</span> + <span style="color: #a31515;">" f "</span>);
<span style="color: blue;">foreach</span> (<span style="color: blue;">var</span> v <span style="color: blue;">in</span> pf) Console.Write(v + <span style="color: #a31515;">" "</span>);
Console.Write(<span style="color: #a31515;">"\n"</span> + <span style="color: #a31515;">"\n"</span>);
}
<span style="color: blue;">static</span> List<<span style="color: blue;">ulong</span>> findPF(<span style="color: blue;">ulong</span> n)
{
<span style="color: blue;">var</span> pf = <span style="color: blue;">new</span> List<<span style="color: blue;">ulong</span>>();
<span style="color: blue;">if</span> (n < 4) { <span style="color: blue;">if</span> (n > 0) pf.Add(n); <span style="color: blue;">return</span> pf; }
<span style="color: blue;">while</span> (n % 2 == 0) { n /= 2; pf.Add(2); }
<span style="color: blue;">while</span> (n % 3 == 0) { n /= 3; pf.Add(3); }
<span style="color: blue;">while</span> (n % 5 == 0) { n /= 5; pf.Add(5); }
<span style="color: blue;">if</span> (n > 1)
<span style="color: blue;">if</span> (n <= ~0u) findPF((<span style="color: blue;">uint</span>)n, pf);
<span style="color: blue;">else</span> { recFindF(n, pf, 1); pf.Sort(); }
<span style="color: blue;">return</span> pf;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> findPF(<span style="color: blue;">uint</span> n, List<<span style="color: blue;">ulong</span>> pf)
{
<span style="color: blue;">for</span> (<span style="color: blue;">uint</span> d = 1, r = (<span style="color: blue;">uint</span>)Math.Sqrt(n), b = 0; ; b = 0x5A28A6)
{
<span style="color: blue;">while</span> (b > 0)
{
d += b & 7; b >>= 3; <span style="color: blue;">if</span> (d > r) { pf.Add(n); <span style="color: blue;">return</span>; }
<span style="color: blue;">if</span> (n % d == 0)
{
n /= d; pf.Add(d); <span style="color: blue;">while</span> (n % d == 0) { n /= d; pf.Add(d); }
<span style="color: blue;">if</span> (n == 1) <span style="color: blue;">return</span>;
r = (<span style="color: blue;">uint</span>)Math.Sqrt(n);
}
}
<span style="color: blue;">while</span> (d + 30 <= r && n % (d + 06) > 0 && n % (d + 10) > 0
&& n % (d + 12) > 0 && n % (d + 16) > 0
&& n % (d + 18) > 0 && n % (d + 22) > 0
&& n % (d + 28) > 0 && n % (d + 30) > 0) d += 30;
}
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> recFindF(<span style="color: blue;">ulong</span> n, List<<span style="color: blue;">ulong</span>> pf, <span style="color: blue;">int</span> i)
{
<span style="color: blue;">ulong</span> f = findF(n);
<span style="color: blue;">if</span> (f == n) { <span style="color: blue;">while</span> (i > 0) { pf.Add(n); i--; } }
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (n / f == f) { recFindF(f, pf, i << 1); }
<span style="color: blue;">else</span> { recFindF(f, pf, i); recFindF(n / f, pf, i); }
}
<span style="color: blue;">static</span> <span style="color: blue;">ulong</span> findF(<span style="color: blue;">ulong</span> n0)
{
<span style="color: blue;">if</span> (n0 <= ~0u) <span style="color: blue;">return</span> findF((<span style="color: blue;">uint</span>)n0);
<span style="color: blue;">uint</span> r = sqrt(n0); <span style="color: blue;">if</span> (n0 % r == 0) <span style="color: blue;">return</span> r;
<span style="color: blue;">var</span> locker = <span style="color: blue;">new</span> <span style="color: blue;">object</span>();
Parallel.For(0, 8, k =>
{
<span style="color: blue;">ulong</span> d0 = k == 0 ? 07u : k == 1 ? 11u : k == 2 ? 13u : k == 3 ? 17u :
k == 4 ? 19u : k == 5 ? 23u : k == 6 ? 29u : 31,
d1 = d0 + 30, d2 = d0 + 60, d3 = d0 + 90, n1 = n0;
<span style="color: blue;">for</span> (; d0 <= r; d0 += 120, d1 += 120, d2 += 120, d3 += 120)
<span style="color: blue;">if</span> (n1 % d0 == 0 || n1 % d1 == 0 || n1 % d2 == 0 || n1 % d3 == 0)
<span style="color: blue;">lock</span> (locker)
{
<span style="color: blue;">if</span> (r == 0) <span style="color: blue;">return</span>; r = 0;
n0 = n0 % d0 == 0 ? d0 : n0 % d1 == 0 ? d1 : n0 % d2 == 0 ? d2 : d3;
<span style="color: blue;">return</span>;
}
}); <span style="color: blue;">return</span> n0;
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span> findF(<span style="color: blue;">uint</span> n0)
{
<span style="color: blue;">uint</span> r = (<span style="color: blue;">uint</span>)Math.Sqrt(n0); <span style="color: blue;">if</span> (n0 % r == 0) <span style="color: blue;">return</span> r;
<span style="color: blue;">var</span> locker = <span style="color: blue;">new</span> <span style="color: blue;">object</span>();
Parallel.For(0, 8, k =>
{
<span style="color: blue;">uint</span> d0 = k == 0 ? 07u : k == 1 ? 11u : k == 2 ? 13u : k == 3 ? 17u :
k == 4 ? 19u : k == 5 ? 23u : k == 6 ? 29u : 31,
d1 = d0 + 30, d2 = d0 + 60, d3 = d0 + 90, n1 = n0;
<span style="color: blue;">for</span> (; d0 <= r; d0 += 120, d1 += 120, d2 += 120, d3 += 120)
<span style="color: blue;">if</span> (n1 % d0 == 0 || n1 % d1 == 0 || n1 % d2 == 0 || n1 % d3 == 0)
<span style="color: blue;">lock</span> (locker)
{
<span style="color: blue;">if</span> (r == 0) <span style="color: blue;">return</span>; r = 0;
n0 = n0 % d0 == 0 ? d0 : n0 % d1 == 0 ? d1 : n0 % d2 == 0 ? d2 : d3;
<span style="color: blue;">return</span>;
}
}); <span style="color: blue;">return</span> n0;
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span> sqrt(<span style="color: blue;">ulong</span> n0)
{
<span style="color: blue;">if</span> (n0 < 1uL << 52) <span style="color: blue;">return</span> (<span style="color: blue;">uint</span>)Math.Sqrt(n0);
</code><span style="color: blue; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">uint</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> n1 = (</span><span style="color: blue; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">uint</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">)(n0 >> 48); </span><span style="color: blue; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">int</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> s = 25;
</span><span style="color: blue; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">if</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> (n1 > 255u) { n1 >>= 8; s = 29; }
</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> </span><span style="color: blue; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">if</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> (n1 > 15u) { n1 >>= 4; s |= 2; }</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">
</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> </span><span style="color: blue; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">if</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> (n1 > 3u) s++;</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">
</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> </span><span style="color: blue; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">ulong</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> r0 = 1uL << s, r1 = r0 + (n0 >> s) >> 1;
</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> </span><span style="color: blue; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">while</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> (r1 < r0) { r0 = r1; r1 = r0 + n0 / r0 >> 1; }
</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> </span><span style="color: blue; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">return</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> (</span><span style="color: blue; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">uint</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">)r0;
</span><span style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> }
}</span></pre>
<pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"></pre>
</code></pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-73091244721243106532016-08-14T07:18:00.001-07:002016-08-27T10:46:52.393-07:00Odd prime sieve<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-kd9YP18RZN0/V7B6MX_QyeI/AAAAAAAAAT8/5FJE3uITy4YQk9rwPtPTdfZO0b9kgVtXACLcB/s1600/920.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-kd9YP18RZN0/V7B6MX_QyeI/AAAAAAAAAT8/5FJE3uITy4YQk9rwPtPTdfZO0b9kgVtXACLcB/s1600/920.jpg" /></a></div>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">
</span></code></pre>
<pre style="background-color: white; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="font-family: consolas, 'courier new', courier, monospace; font-size: 10pt;"><span style="color: green;">/* 105,000,000 Odd primes in 1 second on an i7-4790. It's almost a sieve of Eratosthenes.
Composites are marked by 24 threads running in cache friendly ranges, after they're counted,
a prime array of exactly the right size is filled with ... primes. <a href="https://graphics.stanford.edu/~seander/bithacks.html">Bit twiddling hacks</a> used:
"count bits set, in parallel" and "count trailing zero bits with a de Bruijn sequence".
</span><span style="color: red;">.</span><span style="color: green;">.</span><span style="color: blue;">.</span><span style="color: green;">Code colorized with: <a href="http://www.pvladov.com/p/syntax-highlighter.html">C# Syntax Highlighter</a></span><span style="color: blue;">.</span><span style="color: green;">.</span><span style="color: red;">. 125,000,000 ? scroll down</span></code></pre>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">
<a href="http://bigintegers.blogspot.com/2016/04/segmented-sieve-of-eratosthenes.html">Old</a> times New times (in seconds).
n x p x p p(rimes) <= n < 2^32
1e9 0.50 0.66 0.31 0.42 x: odd composites, marked in
2e9 1.02 1.31 0.63 0.84 essentially a bit array.
4e9 2.13 2.65 1.29 1.70 best of 5
~0u 2.28 2.87 1.39 1.82 best of 5
*/</span>
<pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><pre style="font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">using</span> sw = System.Diagnostics.Stopwatch;
<span style="color: blue;">class</span> oddPrimes
{
<span style="color: blue;">static</span> sw sw = <span style="color: blue;">new</span> sw();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
<span style="color: blue;">uint</span> m = (<span style="color: blue;">uint</span>)1e9;
sw.Start(); <span style="color: blue;">uint</span>[] p = getPrimes(m);
Console.Write(p.Length + <span style="color: #a31515;">" odd primes <= "</span> + m);
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] getPrimes(<span style="color: blue;">uint</span> m) { <span style="color: blue;">return</span> countPrimes(buildX(m)); }
<span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] buildX(<span style="color: blue;">uint</span> m) <span style="color: green;">// odd composites</span>
{
<span style="color: blue;">uint</span> i, j, t, r; <span style="color: blue;">uint</span>[] x, r0, r1;
t = (<span style="color: blue;">uint</span>)Environment.ProcessorCount * 3; r = 32768 * 6;
m -= m / ~0u; m += m & 1; m /= 2;
x = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[(m >> 5) + 1];
x[m >> 5] = ~0u << (<span style="color: blue;">int</span>)m;
<span style="color: blue;">if</span> (m > 32) x[0] = 0x9b4b3491;
<span style="color: blue;">for</span> (i = j = 0; i < m; i += j += 4) x[i >> 5] |= 1u << (<span style="color: blue;">int</span>)i;
r0 = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[t + 1]; r1 = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[t + 1];
<span style="color: blue;">for</span> (i = 0; i <= t; i++) { r0[i] = i * r; r1[i] = (i + 1) * r; } r *= t;
<span style="color: blue;">while</span> (r0[0] < m)
{
Parallel.For(0, t, k =>
{
<span style="color: blue;">uint</span> b, c, d, e, f, g, m0, m1;
<span style="color: blue;">if</span> ((m0 = r0[k]) >= m) <span style="color: blue;">return</span>;
<span style="color: blue;">if</span> ((m1 = r1[k]) > m) m1 = m;
<span style="color: blue;">for</span> (d = 3, b = e = 4; ; b += e += 4, d += 2)
{
<span style="color: blue;">if</span> ((c = b + d) >= m1) <span style="color: blue;">break</span>;
<span style="color: blue;">if</span> ((x[d >> 6] & (1 << (<span style="color: blue;">int</span>)(d >> 1))) == 0)
{
<span style="color: blue;">if</span> (c < m0) <span style="color: blue;">if</span> ((c += (m0 - c) / d * d) < m0) c += d;
<span style="color: blue;">for</span> (g = d << 1, f = c + d; f < m1; c += g, f += g)
{ x[c >> 5] |= 1u << (<span style="color: blue;">int</span>)c; x[f >> 5] |= 1u << (<span style="color: blue;">int</span>)f; }
<span style="color: blue;">for</span> (; c < m1; c += g) x[c >> 5] |= 1u << (<span style="color: blue;">int</span>)c;
}
}
});
<span style="color: blue;">for</span> (j = 0; j <= t; j++) { r0[j] += r; r1[j] += r; }
}
time(<span style="color: #a31515;">"x"</span>);
<span style="color: blue;">return</span> x;
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] countPrimes(<span style="color: blue;">uint</span>[] x)
{
<span style="color: blue;">int</span> t = Environment.ProcessorCount; <span style="color: blue;">uint</span>[] c = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[t];
<span style="color: blue;">byte</span>[] b = <span style="color: blue;">new</span> <span style="color: blue;">byte</span>[x.Length]; <span style="color: blue;">uint</span> n;
Parallel.For(0, t, k =>
{
<span style="color: blue;">uint</span> xi, ck = 0;
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = x.Length - 1 - k; i >= 0; i -= t)
{
xi = x[i]; xi -= (xi >> 1) & 0x55555555;
xi = (xi & 0x33333333) + (xi >> 2 & 0x33333333);
ck += b[i] = (<span style="color: blue;">byte</span>)(32 - ((xi + (xi >> 4) & 0xf0f0f0f) * 0x1010101 >> 24));
}
c[k] = ck;
});
<span style="color: blue;">for</span> (n = c[0], t--; t > 0; t--) n += c[t];
time(<span style="color: #a31515;">"c"</span>);
<span style="color: blue;">return</span> buildPrimes(b, x, n);
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] buildPrimes(<span style="color: blue;">byte</span>[] b, <span style="color: blue;">uint</span>[] x, <span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span> j = b.Length - 1; <span style="color: blue;">uint</span>[] c = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[8]; <span style="color: blue;">uint</span>[] p = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[n];
<span style="color: blue;">sbyte</span>[] bruijn = {01,02,29,03,30,15,25,04,31,23,21,16,26,18,05,09,
32,28,14,24,22,20,17,08,27,13,19,07,12,06,11,10};
<span style="color: blue;">for</span> (<span style="color: blue;">uint</span> s = 0, k = 1; k < 8 && k <= j; k++) c[k] += s += b[k - 1];
Parallel.For(0, 8, k =>
{
<span style="color: blue;">int</span> s, i = k; <span style="color: blue;">uint</span> ck = c[k], ci, u, v; <span style="color: blue;">long</span> xi;
<span style="color: blue;">if</span> (k > 0 && ck == 0) <span style="color: blue;">return</span>;
<span style="color: blue;">for</span> (u = (<span style="color: blue;">uint</span>)(k << 6) - 1; ; u += 512)
{
v = u; ci = ck; xi = ~x[i];
<span style="color: blue;">while</span> (xi > 0)
{
s = bruijn[((<span style="color: blue;">uint</span>)((xi & -xi) * 0x077cb531)) >> 27];
p[ci++] = v += (<span style="color: blue;">uint</span>)s << 1;
xi >>= s;
}
i += 8; <span style="color: blue;">if</span> (i > j) <span style="color: blue;">break</span>;
ck += (<span style="color: blue;">uint</span>)(b[i - 1] + b[i - 2] + b[i - 3] + b[i - 4] +
b[i - 5] + b[i - 6] + b[i - 7] + b[i - 8]);
}
});
time(<span style="color: #a31515;">"p"</span>);
<span style="color: blue;">return</span> p;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> time(<span style="color: blue;">string</span> s) { Console.WriteLine(sw.ElapsedMilliseconds + <span style="color: #a31515;">" ms "</span> + s); }
}
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-DNe3fnf_9gY/V77oQxWhwsI/AAAAAAAAAUk/TJ59zkKVF7sUDhF-Pd9lTujJyea9KkQNQCEw/s1600/ops.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://1.bp.blogspot.com/-DNe3fnf_9gY/V77oQxWhwsI/AAAAAAAAAUk/TJ59zkKVF7sUDhF-Pd9lTujJyea9KkQNQCEw/s1600/ops.jpg" /></a></div>
<pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">/* Nothing new under the sun, pre-sieving 3, 5 & 7.
</span></code><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">First I did it the old way (scroll down), but a hard
</span><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">coded table works faster. Actually the table can be
</span><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">made "on the fly", with a few more small primes?
</span><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">
Old times New times (in seconds).
</span><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> n x p x p
</span><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> 1e9 0.31 0.42 0.24 0.34
</span><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> 2e9 0.63 0.84 0.48 0.68
</span><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> 4e9 1.29 1.70 0.99 1.50 (average of 10 runs)
</span><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;"> ~0u 1.39 1.82 1.07 1.60 (average of 10000 ;)
</span><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt; line-height: 18.48px;">*/</span></pre>
<pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">using</span> sw = System.Diagnostics.Stopwatch;
<span style="color: blue;">class</span> oddPrimes
{
<span style="color: blue;">static</span> sw sw = <span style="color: blue;">new</span> sw();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
<span style="color: blue;">uint</span> m = (<span style="color: blue;">uint</span>)1e9;
sw.Start(); <span style="color: blue;">uint</span>[] p = getPrimes(m);
Console.Write(p.Length + <span style="color: #a31515;">" odd primes <= "</span> + m);
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] getPrimes(<span style="color: blue;">uint</span> m) { <span style="color: blue;">return</span> countPrimes(buildX(m)); }
<span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] buildX(<span style="color: blue;">uint</span> m)
{
<span style="color: blue;">uint</span> i, j, t, r; <span style="color: blue;">uint</span>[] x, r0, r1;
t = (<span style="color: blue;">uint</span>)Environment.ProcessorCount * 3; r = 32768 * 6;
m -= m / ~0u; m += m & 1; m >>= 1;
x = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[(m >> 5) + 1]; x[0] = 0x9b4b3491;
preMark((<span style="color: blue;">int</span>)m >> 5, x);
<span style="color: blue;">for</span> (i = j = 0; i < m; i += j += 4) x[i >> 5] |= 1u << (<span style="color: blue;">int</span>)i;
r0 = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[t]; r1 = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[t];
<span style="color: blue;">for</span> (i = 0; i < t; i++) { r0[i] = i * r; r1[i] = (i + 1) * r; } r *= t;
<span style="color: blue;">while</span> (r0[0] < m)
{
Parallel.For(0, t, k =>
{
<span style="color: blue;">uint</span> b, c, d, e, f, g, m0, m1;
<span style="color: blue;">if</span> ((m0 = r0[k]) >= m) <span style="color: blue;">return</span>;
<span style="color: blue;">if</span> ((m1 = r1[k]) > m) m1 = m;
<span style="color: blue;">for</span> (d = 11, b = 60, e = 20; ; b += e += 4, d += 2)
{
<span style="color: blue;">if</span> ((c = b + d) >= m1) <span style="color: blue;">break</span>;
<span style="color: blue;">if</span> ((x[d >> 6] & (1 << (<span style="color: blue;">int</span>)(d >> 1))) == 0)
{
<span style="color: blue;">if</span> (c < m0) <span style="color: blue;">if</span> ((c += (m0 - c) / d * d) < m0) c += d;
<span style="color: blue;">for</span> (g = d << 1, f = c + d; f < m1; c += g, f += g)
{ x[c >> 5] |= 1u << (<span style="color: blue;">int</span>)c; x[f >> 5] |= 1u << (<span style="color: blue;">int</span>)f; }
<span style="color: blue;">for</span> (; c < m1; c += g) x[c >> 5] |= 1u << (<span style="color: blue;">int</span>)c;
}
}
});
<span style="color: blue;">for</span> (j = 0; j < t; j++) { r0[j] += r; r1[j] += r; }
}
x[m >> 5] |= ~0u << (<span style="color: blue;">int</span>)m;
time(<span style="color: #a31515;">"x"</span>);
<span style="color: blue;">return</span> x;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> preMark(<span style="color: blue;">int</span> m, <span style="color: blue;">uint</span>[] x)
{
<span style="color: blue;">uint</span>[] a = <span style="color: green;">// 3*5*7 uints = 420 bytes</span>
{
0x6e92ed65,0x59a5b34d,0x96693cf2,0x25dacb36,0x4b669add,0xd279e4b3,0xb5966d2c, <span style="color: green;">// No</span>
0xcd35ba4b,0xf3c96696,0x2cda59a4,0x6b74976b,0x92cd2d9a,0xb4b349e7,0xe92ed659, <span style="color: green;">// co</span>
0x9a5b34d6,0x6693cf25,0x5dacb369,0xb669add2,0x279e4b34,0x5966d2cd,0xd35ba4bb, <span style="color: green;">// de</span>
0x3c96696c,0xcda59a4f,0xb74976b2,0x2cd2d9a6,0x4b349e79,0x92ed659b,0xa5b34d6e, <span style="color: green;">// an</span>
0x693cf259,0xdacb3696,0x669add25,0x79e4b34b,0x966d2cd2,0x35ba4bb5,0xc96696cd, <span style="color: green;">// aly</span>
0xda59a4f3,0x74976b2c,0xcd2d9a6b,0xb349e792,0x2ed659b4,0x5b34d6e9,0x93cf259a, <span style="color: green;">// sis</span>
0xacb36966,0x69add25d,0x9e4b34b6,0x66d2cd27,0x5ba4bb59,0x96696cd3,0xa59a4f3c, <span style="color: green;">// iss</span>
0x4976b2cd,0xd2d9a6b7,0x349e792c,0xed659b4b,0xb34d6e92,0x3cf259a5,0xcb369669, <span style="color: green;">// ue</span>
0x9add25da,0xe4b34b66,0x6d2cd279,0xba4bb596,0x6696cd35,0x59a4f3c9,0x976b2cda, <span style="color: green;">// s</span>
0x2d9a6b74,0x49e792cd,0xd659b4b3,0x34d6e92e,0xcf259a5b,0xb3696693,0xadd25dac, <span style="color: green;">// we</span>
0x4b34b669,0xd2cd279e,0xa4bb5966,0x696cd35b,0x9a4f3c96,0x76b2cda5,0xd9a6b749, <span style="color: green;">// re</span>
0x9e792cd2,0x659b4b34,0x4d6e92ed,0xf259a5b3,0x3696693c,0xdd25dacb,0xb34b669a, <span style="color: green;">// de</span>
0x2cd279e4,0x4bb5966d,0x96cd35ba,0xa4f3c966,0x6b2cda59,0x9a6b7497,0xe792cd2d, <span style="color: green;">// tec</span>
0x59b4b349,0xd6e92ed6,0x259a5b34,0x696693cf,0xd25dacb3,0x34b669ad,0xcd279e4b, <span style="color: green;">// te</span>
0xbb5966d2,0x6cd35ba4,0x4f3c9669,0xb2cda59a,0xa6b74976,0x792cd2d9,0x9b4b349e, <span style="color: green;">// d.</span>
};
Parallel.For(0, 8, k =>
{
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i, j, m0 = 1 + k * 105, m1 = m0 + 104; m0 <= m; m0 += 840, m1 += 840)
{ <span style="color: blue;">if</span> (m1 > m) m1 = m; j = 0; i = m0; <span style="color: blue;">while</span> (i <= m1) x[i++] = a[j++]; }
});
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] countPrimes(<span style="color: blue;">uint</span>[] x)
{
<span style="color: blue;">uint</span>[] c = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[8]; <span style="color: blue;">byte</span>[] b = <span style="color: blue;">new</span> <span style="color: blue;">byte</span>[x.Length];
Parallel.For(0, 8, k =>
{
<span style="color: blue;">uint</span> xi, ck = 0;
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = x.Length - 1 - k; i >= 0; i -= 8)
{
xi = x[i]; xi -= xi >> 1 & 0x55555555;
xi = (xi & 0x33333333) + (xi >> 2 & 0x33333333);
ck += b[i] = (<span style="color: blue;">byte</span>)(32 - ((xi + (xi >> 4) & 0xf0f0f0f) * 0x1010101 >> 24));
}
c[k] = ck;
});
time(<span style="color: #a31515;">"c"</span>);
<span style="color: blue;">return</span> buildPrimes(b, x, c[0] + c[1] + c[2] + c[3] + c[4] + c[5] + c[6] + c[7]);
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] buildPrimes(<span style="color: blue;">byte</span>[] b, <span style="color: blue;">uint</span>[] x, <span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span> j = b.Length - 1; <span style="color: blue;">byte</span>[] c = <span style="color: blue;">new</span> <span style="color: blue;">byte</span>[8]; <span style="color: blue;">uint</span>[] p = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[n];
<span style="color: blue;">sbyte</span>[] bruijn = {01,02,29,03,30,15,25,04,31,23,21,16,26,18,05,09,
32,28,14,24,22,20,17,08,27,13,19,07,12,06,11,10};
<span style="color: blue;">for</span> (<span style="color: blue;">byte</span> s = 0, k = 1; k < 8 && k <= j; k++) c[k] += s += b[k - 1];
Parallel.For(0, 8, k =>
{
<span style="color: blue;">int</span> s, i = k; <span style="color: blue;">uint</span> ck = c[k], ci, u, v; <span style="color: blue;">long</span> xi;
<span style="color: blue;">if</span> (k > 0 && ck == 0) <span style="color: blue;">return</span>;
<span style="color: blue;">for</span> (u = (<span style="color: blue;">uint</span>)(k << 6) - 1; ; u += 512)
{
v = u; ci = ck; xi = ~x[i];
<span style="color: blue;">while</span> (xi > 0)
{
s = bruijn[((<span style="color: blue;">uint</span>)((xi & -xi) * 0x077cb531)) >> 27];
p[ci++] = v += (<span style="color: blue;">uint</span>)s << 1;
xi >>= s;
}
i += 8; <span style="color: blue;">if</span> (i > j) <span style="color: blue;">break</span>;
ck += (<span style="color: blue;">uint</span>)(b[i - 1] + b[i - 2] + b[i - 3] + b[i - 4] +
b[i - 5] + b[i - 6] + b[i - 7] + b[i - 8]);
}
});
time(<span style="color: #a31515;">"p"</span>);
<span style="color: blue;">return</span> p;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> time(<span style="color: blue;">string</span> s) { Console.WriteLine(sw.ElapsedMilliseconds + <span style="color: #a31515;">" ms "</span> + s); }
}
<span style="color: green;">/*
static void preMark(int m, uint[] x) // the old way
{
Parallel.For(0, 3, k =>
{
if (k == 0) for (int i = 1; i <= m; i += 3) x[i] = 0x24924924;
if (k == 1) for (int i = 2; i <= m; i += 3) x[i] = 0x49249249;
if (k == 2) for (int i = 3; i <= m; i += 3) x[i] = 0x92492492;
});
Parallel.For(0, 5, k =>
{
if (k == 0) for (int i = 1; i <= m; i += 5) x[i] |= 0x42108421;
if (k == 1) for (int i = 2; i <= m; i += 5) x[i] |= 0x10842108;
if (k == 2) for (int i = 3; i <= m; i += 5) x[i] |= 0x84210842;
if (k == 3) for (int i = 4; i <= m; i += 5) x[i] |= 0x21084210;
if (k == 4) for (int i = 5; i <= m; i += 5) x[i] |= 0x08421084;
});
Parallel.For(0, 7, k =>
{
if (k == 0) for (int i = 1; i <= m; i += 7) x[i] |= 0x08102040;
if (k == 1) for (int i = 2; i <= m; i += 7) x[i] |= 0x40810204;
if (k == 2) for (int i = 3; i <= m; i += 7) x[i] |= 0x04081020;
if (k == 3) for (int i = 4; i <= m; i += 7) x[i] |= 0x20408102;
if (k == 4) for (int i = 5; i <= m; i += 7) x[i] |= 0x02040810;
if (k == 5) for (int i = 6; i <= m; i += 7) x[i] |= 0x10204081;
if (k == 6) for (int i = 7; i <= m; i += 7) x[i] |= 0x81020408;
});
}
*/</span></code></pre>
</code></pre>
</pre>
</code></pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com1tag:blogger.com,1999:blog-3824094400662352224.post-3593358460499973992016-04-02T07:09:00.000-07:002016-08-25T05:57:49.466-07:00Segmented sieve of Eratosthenes<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-JUWMO9Dldic/Vv_SA-PXI8I/AAAAAAAAASg/zEJYBDUG-qQ2FSAJMLSvZBLEXX9NGA_Bg/s1600/2pc.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://1.bp.blogspot.com/-JUWMO9Dldic/Vv_SA-PXI8I/AAAAAAAAASg/zEJYBDUG-qQ2FSAJMLSvZBLEXX9NGA_Bg/s1600/2pc.jpg" /></a></div>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"></pre>
<pre style="background-color: white; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="font-family: consolas, 'courier new', courier, monospace; font-size: 10pt;"><span style="color: green;">/* 50,000,000 primes in 1 second. </span><span style="color: red;">70,000,000 ? scroll down</span><span style="color: green;">
<span style="color: red; font-size: 10pt; line-height: 18.48px;">125,000,000 ? <a href="http://bigintegers.blogspot.com/2016/08/odd-prime-sieve.html">Odd prime sieve</a></span>
time (in seconds) i7@3G6Hz
n x p isP? x = composites
1e9 0.68 0.93 0.83 p = primes <= n < 2^32 ~ 4e9
2e9 1.39 1.84 1.65 isP? = isPrime[i], i odd
4e9 2.85 3.72 3.38 = (isP[i >> 6] & 1 << (i >> 1)) != 0
~0u 3.06 4.00 3.63
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">using</span> sw = System.Diagnostics.Stopwatch;
<span style="color: blue;">namespace</span> primes
{
<span style="color: blue;">class</span> Program
{
<span style="color: blue;">static</span> sw sw = <span style="color: blue;">new</span> sw();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
test((<span style="color: blue;">uint</span>)1e9);
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> test(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">uint</span> pi_n; <span style="color: blue;">uint</span>[] p;
sw.Start();
p = getPrimes(n);
sw.Stop();
pi_n = p[p.Length - 1];
Console.WriteLine(<span style="color: #a31515;">"pi("</span> + n + <span style="color: #a31515;">") = "</span> + pi_n);
<span style="color: blue;">if</span> (pi_n > 0)
Console.Write(<span style="color: #a31515;">"largest prime = "</span> + p[pi_n - 1]);
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] getPrimes(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span> c, y, i, j; <span style="color: blue;">uint</span> u; <span style="color: blue;">double</span> logN; <span style="color: blue;">int</span>[] x; <span style="color: blue;">uint</span>[] p;
<span style="color: blue;">if</span> (n < 3) <span style="color: blue;">return</span> n < 2 ? <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { 0 } : <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { 2, 1 };
logN = Math.Log(n);
c = (<span style="color: blue;">int</span>)(n / logN * (1 + 1.2762 / logN));
p = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[c + 1]; p[0] = 2; p[1] = 3;
y = (<span style="color: blue;">int</span>)(n / 3); x = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(y >> 5) + 1];
<span style="color: blue;">if</span> (n < 200000000)
mark0(y, x);
<span style="color: blue;">else</span>
mark1(y, x);
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" x"</span>);
y = y <= 2 ? 0 : y - 2;
j = y < 32 ? 2 : paraPrimes(y >> 5, x, p);
i = y >> 5 << 5; u = 5 + 3 * (<span style="color: blue;">uint</span>)i;
<span style="color: blue;">while</span> (i < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) p[j++] = u; u += 2;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) p[j++] = u; u += 4;
}
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) p[j++] = u; u += 2;
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) p[j++] = u;
p[c] = (<span style="color: blue;">uint</span>)j;
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" p"</span>);
<span style="color: blue;">return</span> p;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> mark0(<span style="color: blue;">int</span> y, <span style="color: blue;">int</span>[] z)
{
<span style="color: blue;">int</span> u, v, w, x, s, i, j;
u = 8; v = 0; w = 3; x = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">while</span> (s < y)
{
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> a = s, b = s + j, c = s + w, d = c + j, k = j << 1;
<span style="color: blue;">for</span> (; d < y; a += k, b += k, c += k, d += k)
{
z[a >> 5] |= 1 << a; z[c >> 5] |= 1 << c;
z[b >> 5] |= 1 << b; z[d >> 5] |= 1 << d;
}
<span style="color: blue;">if</span> (a < y)
{
z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (c < y) z[c >> 5] |= 1 << c;
<span style="color: blue;">if</span> (b < y) z[b >> 5] |= 1 << b;
}
}
v += 8; s += v; x += 8; j += 4;
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> a = s, b = s + j, c = s + x, d = c + j, k = j << 1;
<span style="color: blue;">for</span> (; d < y; a += k, b += k, c += k, d += k)
{
z[a >> 5] |= 1 << a; z[c >> 5] |= 1 << c;
z[b >> 5] |= 1 << b; z[d >> 5] |= 1 << d;
}
<span style="color: blue;">if</span> (a < y)
{
z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (c < y) z[c >> 5] |= 1 << c;
<span style="color: blue;">if</span> (b < y) z[b >> 5] |= 1 << b;
}
}
u += 16; s += u; w += 4; j += 8;
}
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> mark1(<span style="color: blue;">int</span> y, <span style="color: blue;">int</span>[] z)
{
<span style="color: blue;">bool</span> bl, bq; <span style="color: blue;">int</span> u, v, w, x, s, i, j, m, n; queue q0, q1;
bq = <span style="color: blue;">true</span>; q0 = <span style="color: blue;">new</span> queue(); q1 = <span style="color: blue;">new</span> queue();
bl = <span style="color: blue;">false</span>; m = 1024; u = 8; v = 0; w = 3; x = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">for</span> (n = m; n < y; n += m)
{
<span style="color: blue;">if</span> (bl)
{
bl = <span style="color: blue;">false</span>;
<span style="color: blue;">if</span> (bq)
{
bq = <span style="color: blue;">false</span>;
<span style="color: blue;">while</span> (q0.count > 0)
{
<span style="color: blue;">int</span> a = q0.dequeue(), k = q0.dequeue();
<span style="color: blue;">for</span> (; a < n; a += k) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (a < y) q1.enqueue(a, k);
}
q0.idxIn = q0.idxOut = 0;
}
<span style="color: blue;">else</span>
{
bq = <span style="color: blue;">true</span>;
<span style="color: blue;">while</span> (q1.count > 0)
{
<span style="color: blue;">int</span> a = q1.dequeue(), k = q1.dequeue();
<span style="color: blue;">for</span> (; a < n; a += k) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (a < y) q0.enqueue(a, k);
}
q1.idxIn = q1.idxOut = 0;
}
}
<span style="color: blue;">while</span> (s < n)
{
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
bl = <span style="color: blue;">true</span>;
<span style="color: blue;">int</span> a = s, b = s + w;
<span style="color: blue;">for</span> (; b < n; a += j, b += j) { z[a >> 5] |= 1 << a; z[b >> 5] |= 1 << b; }
<span style="color: blue;">for</span> (; a < n; a += j) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (bq)
{ <span style="color: blue;">if</span> (a < y) q0.enqueue(a, j); <span style="color: blue;">if</span> (b < y) q0.enqueue(b, j); }
<span style="color: blue;">else</span>
{ <span style="color: blue;">if</span> (a < y) q1.enqueue(a, j); <span style="color: blue;">if</span> (b < y) q1.enqueue(b, j); }
}
v += 8; s += v; x += 8; j += 4;
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
bl = <span style="color: blue;">true</span>;
<span style="color: blue;">int</span> a = s, b = s + x;
<span style="color: blue;">for</span> (; b < n; a += j, b += j) { z[a >> 5] |= 1 << a; z[b >> 5] |= 1 << b; }
<span style="color: blue;">for</span> (; a < n; a += j) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (bq)
{ <span style="color: blue;">if</span> (a < y) q0.enqueue(a, j); <span style="color: blue;">if</span> (b < y) q0.enqueue(b, j); }
<span style="color: blue;">else</span>
{ <span style="color: blue;">if</span> (a < y) q1.enqueue(a, j); <span style="color: blue;">if</span> (b < y) q1.enqueue(b, j); }
}
u += 16; s += u; w += 4; j += 8;
}
}
<span style="color: blue;">while</span> (q0.count > 0)
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> a = q0.dequeue(), k = q0.dequeue(); a < y; a += k) z[a >> 5] |= 1 << a;
<span style="color: blue;">while</span> (q1.count > 0)
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> a = q1.dequeue(), k = q1.dequeue(); a < y; a += k) z[a >> 5] |= 1 << a;
}
<span style="color: blue;">static</span> <span style="color: blue;">int</span> paraPrimes(<span style="color: blue;">int</span> imax, <span style="color: blue;">int</span>[] x, <span style="color: blue;">uint</span>[] p)
{
<span style="color: blue;">int</span> j0 = 0, j1 = 0;
Parallel.For(0, 2, k =>
{
<span style="color: blue;">int</span> i, j, y; <span style="color: blue;">uint</span> u;
<span style="color: blue;">if</span> (k == 0) { i = 0; j = 2; u = 5; }
<span style="color: blue;">else</span> { <span style="color: blue;">if</span> (imax < 2) <span style="color: blue;">return</span>; i = 1; j = 25; u = 101; }
<span style="color: blue;">for</span> (; ; )
{
y = x[i];
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4;
i += 2; <span style="color: blue;">if</span> (i >= imax) { <span style="color: blue;">if</span> (k == 0) j0 = j; <span style="color: blue;">else</span> j1 = j; <span style="color: blue;">break</span>; }
u += 96; j += bitsSet(~x[i - 1]);
}
});
<span style="color: blue;">return</span> j0 > j1 ? j0 : j1;
}
<span style="color: blue;">static</span> <span style="color: blue;">int</span> bitsSet(<span style="color: blue;">int</span> i)
{
i -= i >> 1 & 0x55555555;
i = (i & 0x33333333) + (i >> 2 & 0x33333333);
<span style="color: blue;">return</span> (i + (i >> 4) & 0xf0f0f0f) * 0x1010101 >> 24;
}
}
<span style="color: blue;">class</span> queue
{
<span style="color: blue;">public</span> <span style="color: blue;">int</span> idxIn, idxOut, count;
<span style="color: blue;">int</span>[] q = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[26200];
<span style="color: blue;">public</span> <span style="color: blue;">void</span> enqueue(<span style="color: blue;">int</span> i, <span style="color: blue;">int</span> j) { count += 2; q[idxIn++] = i; q[idxIn++] = j; }
<span style="color: blue;">public</span> <span style="color: blue;">int</span> dequeue() { count--; <span style="color: blue;">return</span> q[idxOut++]; }
}
}
<div class="separator" style="clear: both; color: black; text-align: center;">
<a href="https://3.bp.blogspot.com/-F0iFx0_IZ50/Vv_SPEjjiMI/AAAAAAAAASk/ohdMAnqyEF8OrMDxyY_kN72vpAmKd0AJA/s1600/4pc.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-F0iFx0_IZ50/Vv_SPEjjiMI/AAAAAAAAASk/ohdMAnqyEF8OrMDxyY_kN72vpAmKd0AJA/s1600/4pc.jpg" /></a></div>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">using</span> sw = System.Diagnostics.Stopwatch;
<span style="color: blue;">namespace</span> isPrime
{
<span style="color: blue;">class</span> Program
{
<span style="color: blue;">static</span> sw sw = <span style="color: blue;">new</span> sw();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
test((<span style="color: blue;">uint</span>)1e9);
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> test(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span>[] isP;
sw.Start();
isP = buildIsPrime(n);
sw.Stop(); <span style="color: green;">// n check</span>
<span style="color: blue;">int</span> check = 0; <span style="color: green;">// 1e9 1DF99124</span>
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = isP.Length - 1; i >= 0; i--) <span style="color: green;">// 2e9 E9D92C9E</span>
check ^= isP[i]; <span style="color: green;">// 4e9 DB1F9720</span>
Console.Write(<span style="color: #a31515;">"check: {0:X8}"</span>, check); <span style="color: green;">// ~0u D696B791</span>
}
<span style="color: blue;">static</span> <span style="color: blue;">int</span>[] buildIsPrime(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span> y, i, u; <span style="color: blue;">int</span>[] x, isP;
<span style="color: blue;">if</span> (n < 64) <span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: blue;">int</span>[] { 0x64b4cb6e };
isP = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(n >> 6) + 1]; isP[0] = 2;
y = (<span style="color: blue;">int</span>)(n / 3); x = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(y >> 5) + 1];
<span style="color: blue;">if</span> (n < 200000000)
mark0(y, x);
<span style="color: blue;">else</span>
mark1(y, x);
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" x"</span>);
y -= 2; n >>= 1;
paraIsPrime(y >> 5, x, isP);
u = (y >> 5 << 4) * 3 + 2; i = y >> 5 << 5;
<span style="color: blue;">while</span> (i < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 2;
}
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) isP[u >> 5] |= 1 << u;
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" p"</span>);
<span style="color: blue;">return</span> isP;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> mark0(<span style="color: blue;">int</span> y, <span style="color: blue;">int</span>[] z)
{
<span style="color: blue;">int</span> u, v, w, x, s, i, j;
u = 8; v = 0; w = 3; x = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">while</span> (s < y)
{
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> a = s, b = s + j, c = s + w, d = c + j, k = j << 1;
<span style="color: blue;">for</span> (; d < y; a += k, b += k, c += k, d += k)
{
z[a >> 5] |= 1 << a; z[c >> 5] |= 1 << c;
z[b >> 5] |= 1 << b; z[d >> 5] |= 1 << d;
}
<span style="color: blue;">if</span> (a < y)
{
z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (c < y) z[c >> 5] |= 1 << c;
<span style="color: blue;">if</span> (b < y) z[b >> 5] |= 1 << b;
}
}
v += 8; s += v; x += 8; j += 4;
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> a = s, b = s + j, c = s + x, d = c + j, k = j << 1;
<span style="color: blue;">for</span> (; d < y; a += k, b += k, c += k, d += k)
{
z[a >> 5] |= 1 << a; z[c >> 5] |= 1 << c;
z[b >> 5] |= 1 << b; z[d >> 5] |= 1 << d;
}
<span style="color: blue;">if</span> (a < y)
{
z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (c < y) z[c >> 5] |= 1 << c;
<span style="color: blue;">if</span> (b < y) z[b >> 5] |= 1 << b;
}
}
u += 16; s += u; w += 4; j += 8;
}
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> mark1(<span style="color: blue;">int</span> y, <span style="color: blue;">int</span>[] z)
{
<span style="color: blue;">bool</span> bl, bq; <span style="color: blue;">int</span> u, v, w, x, s, i, j, m, n; queue q0, q1;
bq = <span style="color: blue;">true</span>; q0 = <span style="color: blue;">new</span> queue(); q1 = <span style="color: blue;">new</span> queue();
bl = <span style="color: blue;">false</span>; m = 1024; u = 8; v = 0; w = 3; x = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">for</span> (n = m; n < y; n += m)
{
<span style="color: blue;">if</span> (bl)
{
bl = <span style="color: blue;">false</span>;
<span style="color: blue;">if</span> (bq)
{
bq = <span style="color: blue;">false</span>;
<span style="color: blue;">while</span> (q0.count > 0)
{
<span style="color: blue;">int</span> a = q0.dequeue(), k = q0.dequeue();
<span style="color: blue;">for</span> (; a < n; a += k) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (a < y) q1.enqueue(a, k);
}
q0.idxIn = q0.idxOut = 0;
}
<span style="color: blue;">else</span>
{
bq = <span style="color: blue;">true</span>;
<span style="color: blue;">while</span> (q1.count > 0)
{
<span style="color: blue;">int</span> a = q1.dequeue(), k = q1.dequeue();
<span style="color: blue;">for</span> (; a < n; a += k) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (a < y) q0.enqueue(a, k);
}
q1.idxIn = q1.idxOut = 0;
}
}
<span style="color: blue;">while</span> (s < n)
{
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
bl = <span style="color: blue;">true</span>;
<span style="color: blue;">int</span> a = s, b = s + w;
<span style="color: blue;">for</span> (; b < n; a += j, b += j) { z[a >> 5] |= 1 << a; z[b >> 5] |= 1 << b; }
<span style="color: blue;">for</span> (; a < n; a += j) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (bq)
{ <span style="color: blue;">if</span> (a < y) q0.enqueue(a, j); <span style="color: blue;">if</span> (b < y) q0.enqueue(b, j); }
<span style="color: blue;">else</span>
{ <span style="color: blue;">if</span> (a < y) q1.enqueue(a, j); <span style="color: blue;">if</span> (b < y) q1.enqueue(b, j); }
}
v += 8; s += v; x += 8; j += 4;
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
bl = <span style="color: blue;">true</span>;
<span style="color: blue;">int</span> a = s, b = s + x;
<span style="color: blue;">for</span> (; b < n; a += j, b += j) { z[a >> 5] |= 1 << a; z[b >> 5] |= 1 << b; }
<span style="color: blue;">for</span> (; a < n; a += j) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (bq)
{ <span style="color: blue;">if</span> (a < y) q0.enqueue(a, j); <span style="color: blue;">if</span> (b < y) q0.enqueue(b, j); }
<span style="color: blue;">else</span>
{ <span style="color: blue;">if</span> (a < y) q1.enqueue(a, j); <span style="color: blue;">if</span> (b < y) q1.enqueue(b, j); }
}
u += 16; s += u; w += 4; j += 8;
}
}
<span style="color: blue;">while</span> (q0.count > 0)
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> a = q0.dequeue(), k = q0.dequeue(); a < y; a += k) z[a >> 5] |= 1 << a;
<span style="color: blue;">while</span> (q1.count > 0)
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> a = q1.dequeue(), k = q1.dequeue(); a < y; a += k) z[a >> 5] |= 1 << a;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> paraIsPrime(<span style="color: blue;">int</span> imax, <span style="color: blue;">int</span>[] x, <span style="color: blue;">int</span>[] z) <span style="color: green;">// z = isP</span>
{
<span style="color: blue;">int</span> pc = Environment.ProcessorCount;
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> n = 0; n < 2; n++)
{
Parallel.For(0, pc, k =>
{
<span style="color: blue;">int</span> m, i, j, u, v, y;
<span style="color: blue;">if</span> ((k & 1) == n)
{
j = pc * 2; v = (j - 1) * 48;
<span style="color: blue;">for</span> (m = 0; m < 2; m++)
{
i = m + k * 2; u = 2 + i * 48;
<span style="color: blue;">for</span> (; i < imax; i += j, u += v)
{
#region
y = x[i];
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2;
#endregion
}
}
}
});
}
}
}
<span style="color: blue;">class</span> queue
{
<span style="color: blue;">public</span> <span style="color: blue;">int</span> idxIn, idxOut, count;
<span style="color: blue;">int</span>[] q = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[26200];
<span style="color: blue;">public</span> <span style="color: blue;">void</span> enqueue(<span style="color: blue;">int</span> i, <span style="color: blue;">int</span> j) { count += 2; q[idxIn++] = i; q[idxIn++] = j; }
<span style="color: blue;">public</span> <span style="color: blue;">int</span> dequeue() { count--; <span style="color: blue;">return</span> q[idxOut++]; }
}
}</code></pre>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;">
</code></pre>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;">
</code></pre>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"></pre>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"></pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-9T18M_K7mKI/VwFXnMApKAI/AAAAAAAAAS4/0ztk6emzdyoPGgKdG4a-krxLYgu9kkBhw/s1600/8pc.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://2.bp.blogspot.com/-9T18M_K7mKI/VwFXnMApKAI/AAAAAAAAAS4/0ztk6emzdyoPGgKdG4a-krxLYgu9kkBhw/s1600/8pc.jpg" /></a></div>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><pre style="font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">/* Slightly faster, pre-sieving 5, 7, 11 & 13.
New times were measured with seperate versions
for "isPrime" and "getPrimes".
Old times(seconds) New times(seconds)
n x p isP? x p isP?
1e9 0.68 0.93 0.83 0.50 0.66 0.65
2e9 1.39 1.84 1.65 1.02 1.31 1.29
4e9 2.85 3.72 3.38 2.13 2.65 2.62
~0u 3.06 4.00 3.63 2.28 2.87 2.84
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">using</span> sw = System.Diagnostics.Stopwatch;
<span style="color: blue;">namespace</span> primes
{
<span style="color: blue;">class</span> Program
{
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
<span style="color: blue;">uint</span> n = (<span style="color: blue;">uint</span>)1e9;
testIsPrime(n);
Console.WriteLine();
testGetPrimes(n);
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> testIsPrime(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span>[] isP = <span style="color: blue;">new</span> soE().buildIsPrime(n);
<span style="color: blue;">int</span> check = 0; <span style="color: green;">// 1e9 1DF99124</span>
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = isP.Length - 1; i >= 0; i--) <span style="color: green;">// 2e9 E9D92C9E</span>
check ^= isP[i]; <span style="color: green;">// 4e9 DB1F9720</span>
Console.WriteLine(<span style="color: #a31515;">"check: {0:X8}"</span>, check); <span style="color: green;">// ~0u D696B791</span>
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> testGetPrimes(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">uint</span> pi_n; <span style="color: blue;">uint</span>[] p;
p = <span style="color: blue;">new</span> soE().getPrimes(n);
pi_n = p[p.Length - 1];
Console.WriteLine(<span style="color: #a31515;">"pi("</span> + n + <span style="color: #a31515;">") = "</span> + pi_n);
<span style="color: blue;">if</span> (pi_n > 0)
Console.Write(<span style="color: #a31515;">"largest prime = "</span> + p[pi_n - 1]);
}
}
<span style="color: blue;">class</span> soE
{
sw sw = <span style="color: blue;">new</span> sw();
<span style="color: blue;">public</span> <span style="color: blue;">uint</span>[] getPrimes(<span style="color: blue;">uint</span> n)
{
sw.Restart();
<span style="color: blue;">int</span> c, y, i, j; <span style="color: blue;">uint</span> u; <span style="color: blue;">double</span> logN; <span style="color: blue;">int</span>[] x; <span style="color: blue;">uint</span>[] p;
<span style="color: blue;">if</span> (n < 3) <span style="color: blue;">return</span> n < 2 ? <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { 0 } : <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { 2, 1 };
logN = Math.Log(n);
c = (<span style="color: blue;">int</span>)(n / logN * (1 + 1.2762 / logN));
p = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[c + 1]; p[0] = 2; p[1] = 3;
y = (<span style="color: blue;">int</span>)(n / 3); x = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(y >> 5) + 1];
<span style="color: blue;">if</span> (n < 50000000) mark0(y, x);
<span style="color: blue;">else</span> { preMark(y >> 5, x); mark1(y, x); }
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" x"</span>);
y = y <= 2 ? 0 : y - 2;
j = y < 32 ? 2 : paraPrimes(y >> 5, x, p);
i = y >> 5 << 5; u = 5 + 3 * (<span style="color: blue;">uint</span>)i;
<span style="color: blue;">while</span> (i < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) p[j++] = u; u += 2;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) p[j++] = u; u += 4;
}
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) p[j++] = u; u += 2;
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) p[j++] = u;
p[c] = (<span style="color: blue;">uint</span>)j;
sw.Stop(); Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" p"</span>);
<span style="color: blue;">return</span> p;
}
<span style="color: blue;">public</span> <span style="color: blue;">int</span>[] buildIsPrime(<span style="color: blue;">uint</span> n)
{
sw.Restart();
<span style="color: blue;">int</span> y, i, u; <span style="color: blue;">int</span>[] x, isP;
<span style="color: blue;">if</span> (n < 64) <span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: blue;">int</span>[] { 0x64b4cb6e };
isP = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(n >> 6) + 1]; isP[0] = 2;
y = (<span style="color: blue;">int</span>)(n / 3); x = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(y >> 5) + 1];
<span style="color: blue;">if</span> (n < 50000000) mark0(y, x);
<span style="color: blue;">else</span> { preMark(y >> 5, x); mark1(y, x); }
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" x"</span>);
y -= 2; n >>= 1;
paraIsPrime(y >> 5, x, isP);
u = (y >> 5 << 4) * 3 + 2; i = y >> 5 << 5;
<span style="color: blue;">while</span> (i < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 2;
}
<span style="color: blue;">if</span> (u <= n && ((x[i >> 5] & 1 << i++) == 0)) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> (u <= n && ((x[i >> 5] & 1 << i++) == 0)) isP[u >> 5] |= 1 << u;
sw.Stop(); Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" isP"</span>);
<span style="color: blue;">return</span> isP;
}
<span style="color: blue;">void</span> mark0(<span style="color: blue;">int</span> y, <span style="color: blue;">int</span>[] z)
{
<span style="color: blue;">int</span> u, v, w, x, s, i, j;
u = 8; v = 0; w = 3; x = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">while</span> (s < y)
{
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> a = s, b = s + j, c = s + w, d = c + j, k = j << 1;
<span style="color: blue;">for</span> (; d < y; a += k, b += k, c += k, d += k)
{
z[a >> 5] |= 1 << a; z[c >> 5] |= 1 << c;
z[b >> 5] |= 1 << b; z[d >> 5] |= 1 << d;
}
<span style="color: blue;">if</span> (a < y)
{
z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (c < y) z[c >> 5] |= 1 << c;
<span style="color: blue;">if</span> (b < y) z[b >> 5] |= 1 << b;
}
}
v += 8; s += v; x += 8; j += 4;
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> a = s, b = s + j, c = s + x, d = c + j, k = j << 1;
<span style="color: blue;">for</span> (; d < y; a += k, b += k, c += k, d += k)
{
z[a >> 5] |= 1 << a; z[c >> 5] |= 1 << c;
z[b >> 5] |= 1 << b; z[d >> 5] |= 1 << d;
}
<span style="color: blue;">if</span> (a < y)
{
z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (c < y) z[c >> 5] |= 1 << c;
<span style="color: blue;">if</span> (b < y) z[b >> 5] |= 1 << b;
}
}
u += 16; s += u; w += 4; j += 8;
}
}
<span style="color: blue;">void</span> preMark(<span style="color: blue;">int</span> y, <span style="color: blue;">int</span>[] z)
{
z[0] = 0x69128480;
Parallel.For(0, 5, k =>
{
<span style="color: blue;">if</span> (k == 0) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 1, j = y; i <= j; i += 5) z[i] = +0x12048120;
<span style="color: blue;">if</span> (k == 1) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 2, j = y; i <= j; i += 5) z[i] = +0x04812048;
<span style="color: blue;">if</span> (k == 2) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 3, j = y; i <= j; i += 5) z[i] = -0x7edfb7ee;
<span style="color: blue;">if</span> (k == 3) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 4, j = y; i <= j; i += 5) z[i] = +0x20481204;
<span style="color: blue;">if</span> (k == 4) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 5, j = y; i <= j; i += 5) z[i] = +0x48120481;
});
Parallel.For(0, 7, k =>
{
<span style="color: blue;">if</span> (k == 0) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 1, j = y; i <= j; i += 7) z[i] |= +0x02100840;
<span style="color: blue;">if</span> (k == 1) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 2, j = y; i <= j; i += 7) z[i] |= +0x40210084;
<span style="color: blue;">if</span> (k == 2) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 3, j = y; i <= j; i += 7) z[i] |= -0x7bfdeff8;
<span style="color: blue;">if</span> (k == 3) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 4, j = y; i <= j; i += 7) z[i] |= +0x08402100;
<span style="color: blue;">if</span> (k == 4) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 5, j = y; i <= j; i += 7) z[i] |= +0x00840210;
<span style="color: blue;">if</span> (k == 5) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 6, j = y; i <= j; i += 7) z[i] |= +0x10084021;
<span style="color: blue;">if</span> (k == 6) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 7, j = y; i <= j; i += 7) z[i] |= +0x21008402;
});
Parallel.For(0, 11, k =>
{
<span style="color: blue;">if</span> (k == 00) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 01, j = y; i <= j; i += 11) z[i] |= +0x20004080;
<span style="color: blue;">if</span> (k == 01) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 02, j = y; i <= j; i += 11) z[i] |= +0x04080010;
<span style="color: blue;">if</span> (k == 02) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 03, j = y; i <= j; i += 11) z[i] |= -0x7ffefe00;
<span style="color: blue;">if</span> (k == 03) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 04, j = y; i <= j; i += 11) z[i] |= +0x10200040;
<span style="color: blue;">if</span> (k == 04) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 05, j = y; i <= j; i += 11) z[i] |= +0x00040800;
<span style="color: blue;">if</span> (k == 05) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 06, j = y; i <= j; i += 11) z[i] |= +0x40800102;
<span style="color: blue;">if</span> (k == 06) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 07, j = y; i <= j; i += 11) z[i] |= +0x00102000;
<span style="color: blue;">if</span> (k == 07) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 08, j = y; i <= j; i += 11) z[i] |= +0x02000408;
<span style="color: blue;">if</span> (k == 08) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 09, j = y; i <= j; i += 11) z[i] |= +0x00408001;
<span style="color: blue;">if</span> (k == 09) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 10, j = y; i <= j; i += 11) z[i] |= +0x08001020;
<span style="color: blue;">if</span> (k == 10) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 11, j = y; i <= j; i += 11) z[i] |= +0x01020004;
});
z[1] |= 0x00800000;
Parallel.For(0, 13, k =>
{
<span style="color: blue;">if</span> (k == 00) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 02, j = y; i <= j; i += 13) z[i] |= +0x00020100;
<span style="color: blue;">if</span> (k == 01) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 03, j = y; i <= j; i += 13) z[i] |= +0x10000804;
<span style="color: blue;">if</span> (k == 02) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 04, j = y; i <= j; i += 13) z[i] |= -0x7fbfffe0;
<span style="color: blue;">if</span> (k == 03) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 05, j = y; i <= j; i += 13) z[i] |= +0x02010000;
<span style="color: blue;">if</span> (k == 04) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 06, j = y; i <= j; i += 13) z[i] |= +0x00080400;
<span style="color: blue;">if</span> (k == 05) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 07, j = y; i <= j; i += 13) z[i] |= +0x40002010;
<span style="color: blue;">if</span> (k == 06) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 08, j = y; i <= j; i += 13) z[i] |= +0x01000080;
<span style="color: blue;">if</span> (k == 07) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 09, j = y; i <= j; i += 13) z[i] |= +0x08040002;
<span style="color: blue;">if</span> (k == 08) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 10, j = y; i <= j; i += 13) z[i] |= +0x00201000;
<span style="color: blue;">if</span> (k == 09) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 11, j = y; i <= j; i += 13) z[i] |= +0x00008040;
<span style="color: blue;">if</span> (k == 10) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 12, j = y; i <= j; i += 13) z[i] |= +0x04000201;
<span style="color: blue;">if</span> (k == 11) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 13, j = y; i <= j; i += 13) z[i] |= +0x20100008;
<span style="color: blue;">if</span> (k == 12) <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 14, j = y; i <= j; i += 13) z[i] |= +0x00804000;
});
}
<span style="color: blue;">void</span> mark1(<span style="color: blue;">int</span> y, <span style="color: blue;">int</span>[] z)
{
<span style="color: blue;">bool</span> bl, bq; <span style="color: blue;">int</span> u, v, w, x, s, i, j, n; queue q0, q1;
bq = <span style="color: blue;">true</span>; q0 = <span style="color: blue;">new</span> queue(); q1 = <span style="color: blue;">new</span> queue();
bl = <span style="color: blue;">false</span>; u = 40; v = 16; w = 11; x = 17; s = 95; i = 4; j = 34;
<span style="color: blue;">for</span> (n = 1024; n < y; n += 1024)
{
<span style="color: blue;">if</span> (bl)
{
bl = <span style="color: blue;">false</span>;
<span style="color: blue;">if</span> (bq)
{
bq = <span style="color: blue;">false</span>;
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> idxOut = 0; q0.count > 0; q0.count -= 3)
{
<span style="color: blue;">int</span> a = q0.q[idxOut++], b = q0.q[idxOut++], k = q0.q[idxOut++];
<span style="color: blue;">for</span> (; b < n; a += k, b += k) { z[a >> 5] |= 1 << a; z[b >> 5] |= 1 << b; }
<span style="color: blue;">for</span> (; a < n; a += k) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (a < b)
{ q1.q[q1.idxIn++] = a; q1.q[q1.idxIn++] = b; }
<span style="color: blue;">else</span>
{ q1.q[q1.idxIn++] = b; q1.q[q1.idxIn++] = a; }
q1.q[q1.idxIn++] = k;
}
q1.count = q1.idxIn; q0.idxIn = 0;
}
<span style="color: blue;">else</span>
{
bq = <span style="color: blue;">true</span>;
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> idxOut = 0; q1.count > 0; q1.count -= 3)
{
<span style="color: blue;">int</span> a = q1.q[idxOut++], b = q1.q[idxOut++], k = q1.q[idxOut++];
<span style="color: blue;">for</span> (; b < n; a += k, b += k) { z[a >> 5] |= 1 << a; z[b >> 5] |= 1 << b; }
<span style="color: blue;">for</span> (; a < n; a += k) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (a < b)
{ q0.q[q0.idxIn++] = a; q0.q[q0.idxIn++] = b; }
<span style="color: blue;">else</span>
{ q0.q[q0.idxIn++] = b; q0.q[q0.idxIn++] = a; }
q0.q[q0.idxIn++] = k;
}
q0.count = q0.idxIn; q1.idxIn = 0;
}
}
<span style="color: blue;">while</span> (s < n)
{
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
bl = <span style="color: blue;">true</span>; <span style="color: blue;">int</span> a = s, b = s + w;
<span style="color: blue;">for</span> (; b < n; a += j, b += j) { z[a >> 5] |= 1 << a; z[b >> 5] |= 1 << b; }
<span style="color: blue;">for</span> (; a < n; a += j) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (bq) q0.enqueue(a, b, j); <span style="color: blue;">else</span> q1.enqueue(a, b, j);
}
v += 8; s += v; x += 8; j += 4;
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
bl = <span style="color: blue;">true</span>; <span style="color: blue;">int</span> a = s, b = s + x;
<span style="color: blue;">for</span> (; b < n; a += j, b += j) { z[a >> 5] |= 1 << a; z[b >> 5] |= 1 << b; }
<span style="color: blue;">for</span> (; a < n; a += j) z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (bq) q0.enqueue(a, b, j); <span style="color: blue;">else</span> q1.enqueue(a, b, j);
}
u += 16; s += u; w += 4; j += 8;
}
}
<span style="color: blue;">while</span> (q0.count > 0)
{
<span style="color: blue;">int</span> a = q0.dequeue(), b = q0.dequeue(), k = q0.dequeue();
<span style="color: blue;">for</span> (; b < y; a += k, b += k) { z[a >> 5] |= 1 << a; z[b >> 5] |= 1 << b; }
<span style="color: blue;">for</span> (; a < y; a += k) z[a >> 5] |= 1 << a;
}
<span style="color: blue;">while</span> (q1.count > 0)
{
<span style="color: blue;">int</span> a = q1.dequeue(), b = q1.dequeue(), k = q1.dequeue();
<span style="color: blue;">for</span> (; b < y; a += k, b += k) { z[a >> 5] |= 1 << a; z[b >> 5] |= 1 << b; }
<span style="color: blue;">for</span> (; a < y; a += k) z[a >> 5] |= 1 << a;
}
}
<span style="color: blue;">int</span> paraPrimes(<span style="color: blue;">int</span> imax, <span style="color: blue;">int</span>[] x, <span style="color: blue;">uint</span>[] p)
{
<span style="color: blue;">int</span> j0 = 0, j1 = 0, j2 = 0, j3 = 0;
Parallel.For(0, 4, k =>
{
<span style="color: blue;">int</span> i, j, y; <span style="color: blue;">uint</span> u; i = 0; j = 2; u = 5;
<span style="color: blue;">if</span> (k == 1) { <span style="color: blue;">if</span> (imax < 2) <span style="color: blue;">return</span>; i = 1; j = 25; u = 101; }
<span style="color: blue;">if</span> (k == 2) { <span style="color: blue;">if</span> (imax < 3) <span style="color: blue;">return</span>; i = 2; j = 44; u = 197; }
<span style="color: blue;">if</span> (k == 3) { <span style="color: blue;">if</span> (imax < 4) <span style="color: blue;">return</span>; i = 3; j = 61; u = 293; }
<span style="color: blue;">for</span> (; ; )
{
y = x[i];
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4;
i += 4;
<span style="color: blue;">if</span> (i >= imax)
{
<span style="color: blue;">if</span> (k == 0) j0 = j; <span style="color: blue;">if</span> (k == 1) j1 = j; <span style="color: blue;">if</span> (k == 2) j2 = j; <span style="color: blue;">if</span> (k == 3) j3 = j;
<span style="color: blue;">break</span>;
}
u += 288; j += bitsSet(i - 3, x) + bitsSet(i - 2, x) + bitsSet(i - 1, x);
}
});
<span style="color: blue;">if</span> (j0 < j1) j0 = j1; <span style="color: blue;">if</span> (j2 < j3) j2 = j3; <span style="color: blue;">return</span> j0 > j2 ? j0 : j2;
}
<span style="color: blue;">int</span> bitsSet(<span style="color: blue;">int</span> i, <span style="color: blue;">int</span>[] x)
{
<span style="color: blue;">if</span> (i < 0) <span style="color: blue;">return</span> 0;
i = ~x[i];
i -= i >> 1 & 0x55555555;
i = (i & 0x33333333) + (i >> 2 & 0x33333333);
<span style="color: blue;">return</span> (i + (i >> 4) & 0xf0f0f0f) * 0x1010101 >> 24;
}
<span style="color: blue;">void</span> paraIsPrime(<span style="color: blue;">int</span> imax, <span style="color: blue;">int</span>[] x, <span style="color: blue;">int</span>[] z) <span style="color: green;">// z = isP</span>
{
<span style="color: blue;">int</span> pc = Environment.ProcessorCount;
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> n = 0; n < 2; n++)
{
Parallel.For(0, pc, k =>
{
<span style="color: blue;">int</span> m, i, j, u, v, y;
<span style="color: blue;">if</span> ((k & 1) == n)
{
j = pc * 2; v = (j - 1) * 48;
<span style="color: blue;">for</span> (m = 0; m < 2; m++)
{
i = m + k * 2; u = 2 + i * 48;
<span style="color: blue;">for</span> (; i < imax; i += j, u += v)
{
#region
y = x[i];
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2;
#endregion
}
}
}
});
}
}
}
<span style="color: blue;">class</span> queue
{
<span style="color: blue;">public</span> <span style="color: blue;">int</span> idxIn, idxOut, count;
<span style="color: blue;">public</span> <span style="color: blue;">int</span>[] q = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[20000];
<span style="color: blue;">public</span> <span style="color: blue;">void</span> enqueue(<span style="color: blue;">int</span> i, <span style="color: blue;">int</span> j, <span style="color: blue;">int</span> k)
{
count += 3;
<span style="color: blue;">if</span> (i < j)
{ q[idxIn++] = i; q[idxIn++] = j; }
<span style="color: blue;">else</span>
{ q[idxIn++] = j; q[idxIn++] = i; }
q[idxIn++] = k;
}
<span style="color: blue;">public</span> <span style="color: blue;">int</span> dequeue() { count--; <span style="color: blue;">return</span> q[idxOut++]; }
}
}</code></pre>
</pre>
</code></pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-33183458010313893352016-03-14T08:42:00.000-07:002016-03-26T11:18:23.187-07:00isPrime<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-JezBQn7_rXQ/VubXSJtkHpI/AAAAAAAAASE/nYT6_6Ns9l8KHqKVCKPbmY3QemDtzIm2A/s1600/Untitled-drawing.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://2.bp.blogspot.com/-JezBQn7_rXQ/VubXSJtkHpI/AAAAAAAAASE/nYT6_6Ns9l8KHqKVCKPbmY3QemDtzIm2A/s1600/Untitled-drawing.gif" /></a></div>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"></pre>
<pre style="background-color: white; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="font-family: consolas, 'courier new', courier, monospace; font-size: 10pt;"><span style="color: green;">/*
Another version of the sieve of Eratosthenes, ~30% faster than before.
BitArrays are replaced by int arrays.
"isPrime" was useful for a few record times at <a href="https://projecteuler.net/about">Project Euler.</a>
Example: isP[0] = 0x64b4cb6e (each byte represents 8 odd numbers)
hex: 6 4 b 4 c b 6 e
bits: 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 1 0
primes: 6 5 5 4 4 4 3 3 2 2 1 1 1 1 0 0 0
1 9 3 7 3 1 7 1 9 3 9 7 3 1 7 5 3
Results:
time (in seconds) i7@3G6Hz </span><span style="color: red;"> faster ? scroll down</span><span style="color: green;">
n x p isP? x = composites
1e9 1.89 2.29 2.48 p = primes
2e9 4.16 4.94 5.31 isP? = isPrime[i], i odd, 1 <= i <= n < 2^32 ~ 4e9
4e9 9.02 10.54 11.31 = (isP[i >> 6] & 1 << (i << 26 >> 27)) != 0</span></code></pre>
<pre style="background-color: white; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="font-family: consolas, 'courier new', courier, monospace; font-size: 10pt;"><span style="color: green;"> = (isP[i >> 6] & 1 << (i >> 1)) != 0
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> sw = System.Diagnostics.Stopwatch;
<span style="color: blue;">class</span> isPrime
{
<span style="color: blue;">static</span> sw sw = <span style="color: blue;">new</span> sw();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
test(1000000000);
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> test(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span>[] isP;
sw.Start();
isP = buildIsPrime(n);
sw.Stop();
<span style="color: blue;">if</span> (n > 0) n -= 1 - (n & 1);
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 0; i < 10 && n > 1; n -= 2)
<span style="color: blue;">if</span> ((isP[n >> 6] & 1 << (<span style="color: blue;">int</span>)(n >> 1)) != 0)
{ Console.WriteLine(n); i++; }
}
<span style="color: blue;">static</span> <span style="color: blue;">int</span>[] buildIsPrime(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span> y, d, e, q, r, s, i, j, u; <span style="color: blue;">int</span>[] x, isP;
y = (<span style="color: blue;">int</span>)(n / 3); x = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(y >> 5) + 1];
d = 8; e = 0; q = 3; r = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">while</span> (s < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> k = s, m = s + q;
<span style="color: blue;">for</span> (; m < y; k += j, m += j)
{
x[k >> 5] |= 1 << k;
x[m >> 5] |= 1 << m;
}
<span style="color: blue;">for</span> (; k < y; k += j)
x[k >> 5] |= 1 << k;
}
e += 8; s += e; r += 8; j += 4;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0 && s < y)
{
<span style="color: blue;">int</span> k = s, m = s + r;
<span style="color: blue;">for</span> (; m < y; k += j, m += j)
{
x[k >> 5] |= 1 << k;
x[m >> 5] |= 1 << m;
}
<span style="color: blue;">for</span> (; k < y; k += j)
x[k >> 5] |= 1 << k;
}
d += 16; s += d; q += 4; j += 8;
}
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" x"</span>);
i = 0; y -= 2; d = y >> 5 << 5; u = 2; n >>= 1;
isP = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(n >> 5) + 1]; isP[0] = 2;
<span style="color: blue;">while</span> (i < d)
{
q = x[i >> 5];
<span style="color: blue;">for</span> (e = 16; e > 0; e--)
{
<span style="color: blue;">if</span> ((q & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 2;
}
}
<span style="color: blue;">while</span> (i < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 2;
}
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) isP[u >> 5] |= 1 << u;
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" p"</span>);
<span style="color: blue;">return</span> isP;
}
}</code></pre>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;">
</code></pre>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;">
</code></pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-CRZQNCkFGWk/VubYtq3wtkI/AAAAAAAAASQ/DNjNQTI8F7MQPmj20rzRlDKHCc2zAqOrA/s1600/ud.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://1.bp.blogspot.com/-CRZQNCkFGWk/VubYtq3wtkI/AAAAAAAAASQ/DNjNQTI8F7MQPmj20rzRlDKHCc2zAqOrA/s1600/ud.GIF" /></a></div>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green; font-size: 10pt; line-height: 18.48px;">/*</span>
</code></pre>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">With an unrolled loop.
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> sw = System.Diagnostics.Stopwatch;
<span style="color: blue;">class</span> Eratosthenes
{
<span style="color: blue;">static</span> sw sw = <span style="color: blue;">new</span> sw();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
test(1000000000);
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> test(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">uint</span> pi_n; <span style="color: blue;">uint</span>[] p;
sw.Start();
p = getPrimes(n);
sw.Stop();
pi_n = p[p.Length - 1];
Console.WriteLine(<span style="color: #a31515;">"pi("</span> + n + <span style="color: #a31515;">") = "</span> + pi_n);
<span style="color: blue;">if</span> (pi_n > 0)
Console.Write(<span style="color: #a31515;">"largest prime = "</span> + p[pi_n - 1]);
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] getPrimes(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span> c, y, d, e, q, r, s, i, j; <span style="color: blue;">uint</span> u; <span style="color: blue;">double</span> logN; <span style="color: blue;">int</span>[] x; <span style="color: blue;">uint</span>[] p;
<span style="color: blue;">if</span> (n < 3) <span style="color: blue;">return</span> n < 2 ? <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { 0 } : <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { 2, 1 };
logN = Math.Log(n);
c = (<span style="color: blue;">int</span>)(n / logN * (1 + 1.2762 / logN));
p = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[c + 1]; p[0] = 2; p[1] = 3;
y = (<span style="color: blue;">int</span>)(n / 3); x = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(y >> 5) + 1];
d = 8; e = 0; q = 3; r = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">while</span> (s < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> k = s, m = s + q;
<span style="color: blue;">for</span> (; m < y; k += j, m += j) { x[k >> 5] |= 1 << k; x[m >> 5] |= 1 << m; }
<span style="color: blue;">for</span> (; k < y; k += j) x[k >> 5] |= 1 << k;
}
e += 8; s += e; r += 8; j += 4;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0 && s < y)
{
<span style="color: blue;">int</span> k = s, m = s + r;
<span style="color: blue;">for</span> (; m < y; k += j, m += j) { x[k >> 5] |= 1 << k; x[m >> 5] |= 1 << m; }
<span style="color: blue;">for</span> (; k < y; k += j) x[k >> 5] |= 1 << k;
}
d += 16; s += d; q += 4; j += 8;
}
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" x"</span>);
j = 2; y -= 2; d = y >> 5; u = 5;
<span style="color: blue;">for</span> (i = 0; i < d; i++)
{
q = x[i];
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;
<span style="color: blue;">if</span> ((q & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((q & 2) == 0) p[j++] = u; u += 4;
}
i <<= 5;
<span style="color: blue;">while</span> (i < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) p[j++] = u; u += 2;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) p[j++] = u; u += 4;
}
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) p[j++] = u; u += 2;
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) p[j++] = u;
p[c] = (<span style="color: blue;">uint</span>)j;
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" p"</span>);
<span style="color: blue;">return</span> p;
}
}
<span style="color: green;">// for (i = 0; i < d; i++)</span>
<span style="color: green;">// {</span>
<span style="color: green;">// q = x[i];</span>
<span style="color: green;">// for (e = 16; e > 0; e--)</span>
<span style="color: green;">// {</span>
<span style="color: green;">// if ((q & 1) == 0) p[j++] = u; u += 2;</span>
<span style="color: green;">// if ((q & 2) == 0) p[j++] = u; u += 4; q >>= 2;</span>
<span style="color: green;">// }</span>
<span style="color: green;">// }</span></code></pre>
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;">
/*****************************************************</span></pre>
<pre style="background-color: white; margin: 0em; overflow: auto;"><code style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;"><span style="color: green;">"isPrime" as fast as Eratosthenes, ie isP(1e9) 2.29 s.
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> sw = System.Diagnostics.Stopwatch;
<span style="color: blue;">class</span> isPrime
{
<span style="color: blue;">static</span> sw sw = <span style="color: blue;">new</span> sw();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
test(1000000000);
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> test(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span>[] isP;
sw.Start();
isP = buildIsPrime(n);
sw.Stop();
<span style="color: blue;">if</span> (n > 0) n -= 1 - (n & 1);
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 0; i < 10 && n > 1; n -= 2)
<span style="color: blue;">if</span> ((isP[n >> 6] & 1 << (<span style="color: blue;">int</span>)(n >> 1)) != 0)
{ Console.WriteLine(n); i++; }
}
<span style="color: blue;">static</span> <span style="color: blue;">int</span>[] buildIsPrime(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span> y, d, e, q, r, s, i, j, u; <span style="color: blue;">int</span>[] x, isP;
isP = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(n >> 6) + 1]; isP[0] = 2;
y = (<span style="color: blue;">int</span>)(n / 3); x = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(y >> 5) + 1];
d = 8; e = 0; q = 3; r = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">while</span> (s < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> k = s, m = s + q;
<span style="color: blue;">for</span> (; m < y; k += j, m += j) { x[k >> 5] |= 1 << k; x[m >> 5] |= 1 << m; }
<span style="color: blue;">for</span> (; k < y; k += j) x[k >> 5] |= 1 << k;
}
e += 8; s += e; r += 8; j += 4;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0 && s < y)
{
<span style="color: blue;">int</span> k = s, m = s + r;
<span style="color: blue;">for</span> (; m < y; k += j, m += j) { x[k >> 5] |= 1 << k; x[m >> 5] |= 1 << m; }
<span style="color: blue;">for</span> (; k < y; k += j) x[k >> 5] |= 1 << k;
}
d += 16; s += d; q += 4; j += 8;
}
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" x"</span>);
y -= 2; d = y >> 5; u = 2; n >>= 1;
<span style="color: blue;">for</span> (i = 0; i < d; i++)
{
q = x[i];
<span style="color: blue;">if</span> ((q & 1) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 2) == 0) isP[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((q & 4) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 8) == 0) isP[u >> 5] |= 1 << u; u += 2; q >>= 4;
<span style="color: blue;">if</span> ((q & 1) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 2) == 0) isP[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((q & 4) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 8) == 0) isP[u >> 5] |= 1 << u; u += 2; q >>= 4;
<span style="color: blue;">if</span> ((q & 1) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 2) == 0) isP[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((q & 4) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 8) == 0) isP[u >> 5] |= 1 << u; u += 2; q >>= 4;
<span style="color: blue;">if</span> ((q & 1) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 2) == 0) isP[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((q & 4) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 8) == 0) isP[u >> 5] |= 1 << u; u += 2; q >>= 4;
<span style="color: blue;">if</span> ((q & 1) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 2) == 0) isP[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((q & 4) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 8) == 0) isP[u >> 5] |= 1 << u; u += 2; q >>= 4;
<span style="color: blue;">if</span> ((q & 1) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 2) == 0) isP[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((q & 4) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 8) == 0) isP[u >> 5] |= 1 << u; u += 2; q >>= 4;
<span style="color: blue;">if</span> ((q & 1) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 2) == 0) isP[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((q & 4) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 8) == 0) isP[u >> 5] |= 1 << u; u += 2; q >>= 4;
<span style="color: blue;">if</span> ((q & 1) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 2) == 0) isP[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((q & 4) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((q & 8) == 0) isP[u >> 5] |= 1 << u; u += 2;
}
i <<= 5;
<span style="color: blue;">while</span> (i < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 2;
}
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) isP[u >> 5] |= 1 << u;
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" p"</span>);
<span style="color: blue;">return</span> isP;
}
}
<span style="color: green;">/***********************************************************
Composites(4e9) 8.98 s, pi(4e9) 9.05 s. </span></code><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;"> </span><a href="https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel" style="font-family: consolas, 'courier new', courier, monospace; font-size: 10pt;">Bit Twiddling Hacks</a><span style="color: green; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;"> </span></pre>
<pre style="background-color: white; margin: 0em; overflow: auto;"><code style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;"><span style="color: green;">*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> sw = System.Diagnostics.Stopwatch;
<span style="color: blue;">class</span> countPrimes
{
<span style="color: blue;">static</span> sw sw = <span style="color: blue;">new</span> sw();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
test(4000000000);
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> test(<span style="color: blue;">uint</span> n)
{
sw.Start();
Console.Write(<span style="color: #a31515;">"pi("</span> + n + <span style="color: #a31515;">") = "</span> + pi(n));
sw.Stop();
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span> pi(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span> y, d, e, q, r, s, i, j; <span style="color: blue;">uint</span> c, u; <span style="color: blue;">uint</span>[] x;
<span style="color: blue;">if</span> (n < 3) <span style="color: blue;">return</span> n >> 1;
y = (<span style="color: blue;">int</span>)(n / 3); x = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[(y >> 5) + 1];
d = 8; e = 0; q = 3; r = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">while</span> (s < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> k = s, m = s + q;
<span style="color: blue;">for</span> (; m < y; k += j, m += j) { x[k >> 5] |= 1u << k; x[m >> 5] |= 1u << m; }
<span style="color: blue;">for</span> (; k < y; k += j) x[k >> 5] |= 1u << k;
}
e += 8; s += e; r += 8; j += 4;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0 && s < y)
{
<span style="color: blue;">int</span> k = s, m = s + r;
<span style="color: blue;">for</span> (; m < y; k += j, m += j) { x[k >> 5] |= 1u << k; x[m >> 5] |= 1u << m; }
<span style="color: blue;">for</span> (; k < y; k += j) x[k >> 5] |= 1u << k;
}
d += 16; s += d; q += 4; j += 8;
}
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" x"</span>);
c = 2; y -= 2; d = y >> 5;
<span style="color: blue;">for</span> (i = 0; i < d; i++)
{ <span style="color: green;">// Bit Twiddling Hacks</span>
u = ~x[i];
u -= u >> 1 & 0x55555555;
u = (u & 0x33333333) + (u >> 2 & 0x33333333);
c += (u + (u >> 4) & 0xf0f0f0f) * 0x1010101 >> 24;
}
i <<= 5; u = 5 + 3 * (<span style="color: blue;">uint</span>)i;
<span style="color: blue;">while</span> (i < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) c++;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) c++; u += 6;
}
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) c++; u += 2;
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) c++;
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" c"</span>);
<span style="color: blue;">return</span> c;
}
}
</code></pre>
<pre style="background-color: white; margin: 0em; overflow: auto;"><code style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;">
</code></pre>
<pre style="background-color: white; margin: 0em; overflow: auto;"><code style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;">
</code></pre>
<pre style="background-color: white; margin: 0em; overflow: auto;"><code style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;">
</code></pre>
<pre style="background-color: white; margin: 0em; overflow: auto;"><code style="color: black; font-family: "consolas" , "courier new" , "courier" , monospace; font-size: 10pt;"><pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">/*******************************************************************************
primes(1e9) 2.12 s, primes(2e9) 4.61 s, primes(4e9) 9.90 s, primes(~0u) 10.65 s.
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">using</span> sw = System.Diagnostics.Stopwatch;
<span style="color: blue;">class</span> Eratosthenes
{
<span style="color: blue;">static</span> sw sw = <span style="color: blue;">new</span> sw();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
test(1000000000);
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> test(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">uint</span> pi_n; <span style="color: blue;">uint</span>[] p;
sw.Start();
p = getPrimes(n);
sw.Stop();
pi_n = p[p.Length - 1];
Console.WriteLine(<span style="color: #a31515;">"pi("</span> + n + <span style="color: #a31515;">") = "</span> + pi_n);
<span style="color: blue;">if</span> (pi_n > 0)
Console.Write(<span style="color: #a31515;">"largest prime = "</span> + p[pi_n - 1]);
}
<span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] getPrimes(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span> c, y, d, e, q, r, s, i, j; <span style="color: blue;">uint</span> u; <span style="color: blue;">double</span> logN; <span style="color: blue;">int</span>[] x; <span style="color: blue;">uint</span>[] p;
<span style="color: blue;">if</span> (n < 3) <span style="color: blue;">return</span> n < 2 ? <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { 0 } : <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { 2, 1 };
logN = Math.Log(n);
c = (<span style="color: blue;">int</span>)(n / logN * (1 + 1.2762 / logN));
p = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[c + 1]; p[0] = 2; p[1] = 3;
y = (<span style="color: blue;">int</span>)(n / 3); x = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(y >> 5) + 1];
d = 8; e = 0; q = 3; r = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">while</span> (s < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> k = s, m = s + q;
<span style="color: blue;">for</span> (; m < y; k += j, m += j) { x[k >> 5] |= 1 << k; x[m >> 5] |= 1 << m; }
<span style="color: blue;">for</span> (; k < y; k += j) x[k >> 5] |= 1 << k;
}
e += 8; s += e; r += 8; j += 4;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0 && s < y)
{
<span style="color: blue;">int</span> k = s, m = s + r;
<span style="color: blue;">for</span> (; m < y; k += j, m += j) { x[k >> 5] |= 1 << k; x[m >> 5] |= 1 << m; }
<span style="color: blue;">for</span> (; k < y; k += j) x[k >> 5] |= 1 << k;
}
d += 16; s += d; q += 4; j += 8;
}
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" x"</span>);
y = y <= 2 ? 0 : y - 2;
j = y < 32 ? 2 : paraPrimes(y >> 5, x, p);
i = y >> 5 << 5; u = 5 + 3 * (<span style="color: blue;">uint</span>)i;
<span style="color: blue;">while</span> (i < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) p[j++] = u; u += 2;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) p[j++] = u; u += 4;
}
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) p[j++] = u; u += 2;
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) p[j++] = u;
p[c] = (<span style="color: blue;">uint</span>)j;
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" p"</span>);
<span style="color: blue;">return</span> p;
}
<span style="color: blue;">static</span> <span style="color: blue;">int</span> paraPrimes(<span style="color: blue;">int</span> imax, <span style="color: blue;">int</span>[] x, <span style="color: blue;">uint</span>[] p)
{
<span style="color: blue;">int</span> j0 = 0, j1 = 0;
Parallel.For(0, 2, k =>
{
<span style="color: blue;">int</span> i, j, y; <span style="color: blue;">uint</span> u;
<span style="color: blue;">if</span> (k == 0) { i = 0; j = 2; u = 5; }
<span style="color: blue;">else</span> { <span style="color: blue;">if</span> (imax < 2) <span style="color: blue;">return</span>; i = 1; j = 25; u = 101; }
<span style="color: blue;">for</span> (; ; )
{
y = x[i];
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4; y >>= 2;
<span style="color: blue;">if</span> ((y & 1) == 0) p[j++] = u; u += 2; <span style="color: blue;">if</span> ((y & 2) == 0) p[j++] = u; u += 4;
i += 2; <span style="color: blue;">if</span> (i >= imax) { <span style="color: blue;">if</span> (k == 0) j0 = j; <span style="color: blue;">else</span> j1 = j; <span style="color: blue;">break</span>; }
u += 96; j += bitsSet(~x[i - 1]);
}
});
<span style="color: blue;">return</span> j0 > j1 ? j0 : j1;
}
<span style="color: blue;">static</span> <span style="color: blue;">int</span> bitsSet(<span style="color: blue;">int</span> i)
{
i -= i >> 1 & 0x55555555;
i = (i & 0x33333333) + (i >> 2 & 0x33333333);
<span style="color: blue;">return</span> (i + (i >> 4) & 0xf0f0f0f) * 0x1010101 >> 24;
}
}</code></pre>
<pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"></pre>
<pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">
</span></code></pre>
<pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;"><pre style="color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;">/*******************************************************************
Faster isPrime time (s)
n x isP?
1e9 1.84 2.00
2e9 4.08 4.38
4e9 8.84 9.40
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">using</span> sw = System.Diagnostics.Stopwatch;
<span style="color: blue;">class</span> isPrime
{
<span style="color: blue;">static</span> sw sw = <span style="color: blue;">new</span> sw();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
test((<span style="color: blue;">uint</span>)1e9);
Console.Read();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> test(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span>[] isP;
sw.Start();
isP = buildIsPrime(n);
sw.Stop();
<span style="color: blue;">int</span> check = 0; <span style="color: green;">// n check</span>
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = isP.Length - 1; i >= 0; i--) <span style="color: green;">// 1e9 1DF99124</span>
check ^= isP[i]; <span style="color: green;">// 2e9 E9D92C9E</span>
Console.Write(<span style="color: #a31515;">"check: {0:X8}"</span>, check); <span style="color: green;">// 4e9 DB1F9720</span>
}
<span style="color: blue;">static</span> <span style="color: blue;">int</span>[] buildIsPrime(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span> y, i, u; <span style="color: blue;">int</span>[] x, isP;
<span style="color: blue;">if</span> (n < 64) <span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: blue;">int</span>[] { 0x64b4cb6e };
isP = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(n >> 6) + 1]; isP[0] = 2;
y = (<span style="color: blue;">int</span>)(n / 3); x = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[(y >> 5) + 1];
mark(y, x);
y -= 2; n >>= 1;
paraIsPrime(y >> 5, x, isP);
u = (y >> 5 << 4) * 3 + 2; i = y >> 5 << 5;
<span style="color: blue;">while</span> (i < y)
{
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((x[i >> 5] & 1 << i++) == 0) isP[u >> 5] |= 1 << u; u += 2;
}
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) isP[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> (u - 3 <= n - 3 && ((x[i >> 5] & 1 << i++) == 0)) isP[u >> 5] |= 1 << u;
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" p"</span>);
<span style="color: blue;">return</span> isP;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> mark(<span style="color: blue;">int</span> y, <span style="color: blue;">int</span>[] z)
{
<span style="color: blue;">int</span> u, v, w, x, s, i, j;
u = 8; v = 0; w = 3; x = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">while</span> (s < y)
{
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> a = s, b = s + j, c = s + w, d = c + j, k = j << 1;
<span style="color: blue;">for</span> (; d < y; a += k, b += k, c += k, d += k)
{
z[a >> 5] |= 1 << a; z[c >> 5] |= 1 << c;
z[b >> 5] |= 1 << b; z[d >> 5] |= 1 << d;
}
<span style="color: blue;">if</span> (a < y)
{
z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (c < y) z[c >> 5] |= 1 << c;
<span style="color: blue;">if</span> (b < y) z[b >> 5] |= 1 << b;
}
}
v += 8; s += v; x += 8; j += 4;
<span style="color: blue;">if</span> ((z[i >> 5] & 1 << i++) == 0)
{
<span style="color: blue;">int</span> a = s, b = s + j, c = s + x, d = c + j, k = j << 1;
<span style="color: blue;">for</span> (; d < y; a += k, b += k, c += k, d += k)
{
z[a >> 5] |= 1 << a; z[c >> 5] |= 1 << c;
z[b >> 5] |= 1 << b; z[d >> 5] |= 1 << d;
}
<span style="color: blue;">if</span> (a < y)
{
z[a >> 5] |= 1 << a;
<span style="color: blue;">if</span> (c < y) z[c >> 5] |= 1 << c;
<span style="color: blue;">if</span> (b < y) z[b >> 5] |= 1 << b;
}
}
u += 16; s += u; w += 4; j += 8;
}
Console.WriteLine(sw.Elapsed + <span style="color: #a31515;">" x"</span>);
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> paraIsPrime(<span style="color: blue;">int</span> imax, <span style="color: blue;">int</span>[] x, <span style="color: blue;">int</span>[] z) <span style="color: green;">// z = isP</span>
{
<span style="color: blue;">int</span> pc = Environment.ProcessorCount;
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> n = 0; n < 2; n++)
{
Parallel.For(0, pc, k =>
{
<span style="color: blue;">int</span> m, i, j, u, v, y;
<span style="color: blue;">if</span> ((k & 1) == n)
{
j = pc * 2; v = (j - 1) * 48;
<span style="color: blue;">for</span> (m = 0; m < 2; m++)
{
i = m + k * 2; u = 2 + i * 48;
<span style="color: blue;">for</span> (; i < imax; i += j, u += v)
{
#region
y = x[i];
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2; y >>= 4;
<span style="color: blue;">if</span> ((y & 1) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 2) == 0) z[u >> 5] |= 1 << u; u += 2;
<span style="color: blue;">if</span> ((y & 4) == 0) z[u >> 5] |= 1 << u; u += 1;
<span style="color: blue;">if</span> ((y & 8) == 0) z[u >> 5] |= 1 << u; u += 2;
#endregion
}
}
}
});
}
}
}</code></pre>
</span></code></pre>
</code></pre>
</code></pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-24662591922845706442016-02-10T08:14:00.000-08:002016-02-10T10:20:21.639-08:00Partition numbers<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-aCFtmCycF_g/Vrt_DvFWm6I/AAAAAAAAARo/Xu4mCkpyNh8/s1600/a.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-aCFtmCycF_g/Vrt_DvFWm6I/AAAAAAAAARo/Xu4mCkpyNh8/s1600/a.jpg" /></a></div>
<span style="background-color: white; color: green; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt; line-height: 18.48px;"><br /></span>
<span style="background-color: white; color: green; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt; line-height: 18.48px;">/*</span><br />
<pre style="background-color: white; color: #cccccc; font-size: 13.2px; line-height: 18.48px; margin: 0em; overflow: auto;"><code style="color: black; font-family: Consolas, 'Courier New', Courier, monospace; font-size: 10pt;"><span style="color: green;"> ms i7@3G6Hz
P[0]...P[10000] 100
P[0]...P[20000] 305
P[0]...P[40000] 970
P[0]...P[80000] 3420
p[0]..P[160000] 13800
P[0]..P[320000] 53000 P[320000] 624 digits
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Diagnostics;
<span style="color: blue;">using</span> Xint = System.Numerics.BigInteger;
<span style="color: blue;">class</span> Program
{
<span style="color: blue;">static</span> Stopwatch sw = <span style="color: blue;">new</span> Stopwatch();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
<span style="color: blue;">uint</span> n = 10000;
sw.Start();
Xint[] P = A000041(n);
sw.Stop();
Console.Write(sw.Elapsed + <span style="color: #a31515;">"\n"</span> + P[n]);
Console.Read();
}
<span style="color: blue;">static</span> Xint[] A000041(<span style="color: blue;">uint</span> n)
{
<span style="color: blue;">int</span> i, d, d0, d1; Xint S; Xint[] P;
P = <span style="color: blue;">new</span> Xint[n + 1]; P[0] = 1;
<span style="color: blue;">for</span> (i = 1; i <= n; i++)
{
S = d = d1 = 0; d0 = -2;
<span style="color: blue;">do</span>
{
d += d0 += 4; <span style="color: blue;">if</span> (i >= d) S += P[i - d];
d -= d1 += 1; <span style="color: blue;">if</span> (i >= d) S += P[i - d];
<span style="color: blue;">if</span> (i <= d) <span style="color: blue;">break</span>;
d += d0 += 4; <span style="color: blue;">if</span> (i >= d) S -= P[i - d];
d -= d1 += 1; <span style="color: blue;">if</span> (i >= d) S -= P[i - d];
}
<span style="color: blue;">while</span> (i > d);
P[i] = S;
}
<span style="color: blue;">return</span> P;
}
}</code></pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-71172864965704551262015-08-27T05:04:00.000-07:002015-08-30T12:26:41.616-07:00number of primes pi(x)<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/--Ed5PgQQgec/Vd78Py2rQ2I/AAAAAAAAAQk/xq_DwSFoF5I/s1600/Legendre_and_Fourier.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="http://1.bp.blogspot.com/--Ed5PgQQgec/Vd78Py2rQ2I/AAAAAAAAAQk/xq_DwSFoF5I/s640/Legendre_and_Fourier.jpg" width="640" /></a></div>
<pre style="color: #333333; line-height: 16.25px;"><pre><span style="color: green;">/* </span>
<span style="color: green;"> Adrien-Marie Legendre (1752-1833) observed that pi(x), the number of primes p <= x , </span>
<span style="color: green;"> can be calculated with the inclusion-exclusion principle.</span>
<span style="color: green;"> pi(x) - pi(sqrt(x)) + 1 = x - SIGMA(x/pi) + SIGMA(x/pi/pj) - SIGMA(x/pi/pj/pk) + ...</span>
<span style="color: green;"> i i<j i<j<k</span>
<span style="color: green;"> x = 26 , sqrt(26) = 5 , primes <= 5 : 2 3 5 , pi(5) = 3</span>
<span style="color: green;"> pi(26) - 3 + 1 = 26 - 26/2 - 26/3 - 26/5 + 26/2/3 + 26/2/5 + 26/3/5 - 26/2/3/5</span>
<span style="color: green;"> = 26 - 13 - 8 - 5 + 4 + 2 + 1 - 0</span>
<span style="color: green;"> = 26 - 26 + 7 </span>
<span style="color: green;"> pi(26) = 9 </span>
<span style="color: green;"> </span>
<span style="color: green;"> x pi(x) minutes seconds (Athlon 3GHz)</span>
<span style="color: green;"> 1e09 50847534 2.01 getPrimes(1e9): 12.5 s</span>
<span style="color: green;"> 1e10 455052511 20.90</span>
<span style="color: green;"> 1e11 4118054813 4 216.00</span>
<span style="color: green;"> 1e12 37607912018 38 2260.00</span>
<span style="color: green;"> 1e13 346065536839 399 23900.00</span>
<span style="color: green;"> </span>
<span style="color: green;"> Lagarias, Miller & Odlyzko: pi(1e13) 8 minutes (1985 on an IBM/370 3081 Model K).</span>
<span style="color: green;">*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Collections;
<span style="color: blue;">using</span> System.Collections.Generic;
<span style="color: blue;">using</span> System.Diagnostics;
<span style="color: blue;">class</span> <span style="color: #2b91af;">pi_x</span>
{
<span style="color: blue;">static</span> Stopwatch sw = <span style="color: blue;">new</span> Stopwatch();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
<span style="color: green;">//test();</span>
sw.Start();
<span style="color: #2b91af;">ulong</span> r = pi((<span style="color: #2b91af;">ulong</span>)1e9);
sw.Stop();
Console.Write(sw.Elapsed + <span style="color: #a31515;">" "</span> + r);
Console.Read();
}
<span style="color: green;">/*</span>
<span style="color: green;"> static uint _s32;</span>
<span style="color: green;"> static uint pi32(uint x)</span>
<span style="color: green;"> {</span>
<span style="color: green;"> _p = getPrimes((uint)Math.Sqrt(x));</span>
<span style="color: green;"> _pLen = _p.Length;</span>
<span style="color: green;"> _s32 = 0;</span>
<span style="color: green;"> sxnp32(x, 0, 0);</span>
<span style="color: green;"> return _s32 + (uint)_pLen - 1;</span>
<span style="color: green;"> }</span>
<span style="color: green;"> static void sxnp32(uint q, int n, int pIdx) // sum x divided by n primes</span>
<span style="color: green;"> {</span>
<span style="color: green;"> if ((n & 1) == 0)</span>
<span style="color: green;"> _s32 += q;</span>
<span style="color: green;"> else</span>
<span style="color: green;"> _s32 -= q;</span>
<span style="color: green;"> for (int i = pIdx; i < _pLen; i++)</span>
<span style="color: green;"> if (q < _p[i]) </span>
<span style="color: green;"> break;</span>
<span style="color: green;"> else</span>
<span style="color: green;"> sxnp32(q / _p[i], n + 1, i + 1);</span>
<span style="color: green;"> }</span>
<span style="color: green;"> */</span>
<span style="color: blue;">static</span> <span style="color: #2b91af;">uint</span>[] _p;
<span style="color: blue;">static</span> <span style="color: #2b91af;">int</span> _pLen;
<span style="color: blue;">static</span> <span style="color: #2b91af;">ulong</span> _s;
<span style="color: blue;">static</span> <span style="color: #2b91af;">ulong</span> pi(<span style="color: #2b91af;">ulong</span> x)
{
<span style="color: blue;">if</span> (x == 0) <span style="color: blue;">return</span> 0;
_p = getPrimes((<span style="color: #2b91af;">uint</span>)Math.Sqrt(x));
_pLen = _p.Length;
_s = 0;
<span style="color: blue;">if</span> (x <= ~0u)
sxnp((<span style="color: #2b91af;">uint</span>)x, 0, 0);
<span style="color: blue;">else</span>
sxnp(x, 0, 0);
<span style="color: blue;">return</span> _s + (<span style="color: #2b91af;">uint</span>)_pLen - 1;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> sxnp(<span style="color: #2b91af;">uint</span> q, <span style="color: #2b91af;">int</span> n, <span style="color: #2b91af;">int</span> pIdx)
{
<span style="color: blue;">if</span> ((n & 1) == 0)
{
_s += q;
<span style="color: blue;">for</span> (<span style="color: #2b91af;">int</span> i = pIdx; i < _pLen; i++)
<span style="color: blue;">if</span> (q < _p[i]) <span style="color: blue;">break</span>;
<span style="color: blue;">else</span>
if (q >> 1 < _p[i]) _s--;
<span style="color: blue;">else</span> sxnp(q / _p[i], n + 1, i + 1);
}
<span style="color: blue;">else</span>
{
_s -= q;
<span style="color: blue;">for</span> (<span style="color: #2b91af;">int</span> i = pIdx; i < _pLen; i++)
<span style="color: blue;">if</span> (q < _p[i]) <span style="color: blue;">break</span>;
<span style="color: blue;">else</span>
if (q >> 1 < _p[i]) _s++;
<span style="color: blue;">else</span> sxnp(q / _p[i], n + 1, i + 1);
}
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> sxnp(<span style="color: #2b91af;">ulong</span> q, <span style="color: #2b91af;">int</span> n, <span style="color: #2b91af;">int</span> pIdx)
{
<span style="color: blue;">if</span> ((n & 1) == 0)
{
_s += q;
<span style="color: blue;">for</span> (<span style="color: #2b91af;">int</span> i = pIdx; i < _pLen; i++)
{
<span style="color: blue;">if</span> (q < _p[i]) <span style="color: blue;">break</span>;
<span style="color: blue;">if</span> (q >> 1 < _p[i]) _s--;
<span style="color: blue;">else</span>
if (q > ~0u) sxnp(q / _p[i], n + 1, i + 1);
<span style="color: blue;">else</span> sxnp((<span style="color: #2b91af;">uint</span>)q / _p[i], n + 1, i + 1);
}
}
<span style="color: blue;">else</span>
{
_s -= q;
<span style="color: blue;">for</span> (<span style="color: #2b91af;">int</span> i = pIdx; i < _pLen; i++)
{
<span style="color: blue;">if</span> (q < _p[i]) <span style="color: blue;">break</span>;
<span style="color: blue;">if</span> (q >> 1 < _p[i]) _s++;
<span style="color: blue;">else</span>
if (q > ~0u) sxnp(q / _p[i], n + 1, i + 1);
<span style="color: blue;">else</span> sxnp((<span style="color: #2b91af;">uint</span>)q / _p[i], n + 1, i + 1);
}
}
}
<span style="color: blue;">static</span> <span style="color: #2b91af;">uint</span>[] getPrimes(<span style="color: #2b91af;">uint</span> n) <span style="color: green;">// primes <= n (Eratosthenes) </span>
{
<span style="color: #2b91af;">int</span> y, d, e, q, r, s, i, j;
<span style="color: #2b91af;">double</span> logN; List<<span style="color: #2b91af;">uint</span>> p; BitArray x; <span style="color: #2b91af;">uint</span> u;
<span style="color: blue;">if</span> (n < 3) <span style="color: blue;">return</span> n == 2 ? <span style="color: blue;">new</span> <span style="color: #2b91af;">uint</span>[] { 2 } : <span style="color: blue;">new</span> <span style="color: #2b91af;">uint</span>[] { };
logN = Math.Log(n);
p = <span style="color: blue;">new</span> List<<span style="color: #2b91af;">uint</span>>((<span style="color: #2b91af;">int</span>)(n / logN * (1 + 1.2762 / logN)));
x = <span style="color: blue;">new</span> BitArray((<span style="color: #2b91af;">int</span>)(n / 3));
y = x.Length; d = 8; e = 0; q = 3; r = 1; s = 7; i = 0; j = 10;
<span style="color: blue;">while</span> (s < y)
{
<span style="color: blue;">if</span> (!x[i++])
{
<span style="color: #2b91af;">int</span> k = s, m = s + q;
<span style="color: blue;">for</span> (; m < y; k += j, m += j) { x[k] = <span style="color: blue;">true</span>; x[m] = <span style="color: blue;">true</span>; }
<span style="color: blue;">for</span> (; k < y; k += j) x[k] = <span style="color: blue;">true</span>;
}
e += 8; s += e; r += 8; j += 4;
<span style="color: blue;">if</span> (!x[i++] && s < y)
{
<span style="color: #2b91af;">int</span> k = s, m = s + r;
<span style="color: blue;">for</span> (; m < y; k += j, m += j) { x[k] = <span style="color: blue;">true</span>; x[m] = <span style="color: blue;">true</span>; }
<span style="color: blue;">for</span> (; k < y; k += j) x[k] = <span style="color: blue;">true</span>;
}
d += 16; s += d; q += 4; j += 8;
}
p.Add(2); p.Add(3); i = 0; y -= 2; u = 5;
<span style="color: blue;">while</span> (i < y)
{
<span style="color: blue;">if</span> (!x[i++]) p.Add(u); u += 2;
<span style="color: blue;">if</span> (!x[i++]) p.Add(u); u += 4;
}
<span style="color: blue;">if</span> (u <= n && !x[i++]) p.Add(u); u += 2;
<span style="color: blue;">if</span> (u <= n && !x[i]) p.Add(u);
<span style="color: blue;">return</span> p.ToArray();
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> test()
{
<span style="color: blue;">for</span> (<span style="color: #2b91af;">uint</span> x = 0; x <= 50; x++)
Console.WriteLine(<span style="color: #a31515;">"{0,2} {1,2}"</span>, x, pi(x));
}
}</pre>
</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-68009227921357336462014-07-28T11:34:00.001-07:002014-07-29T07:23:42.045-07:00Sum of all divisors of all positive integers <= n.<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-63LM-YrIQH0/U9esd81MNII/AAAAAAAAAP8/yfBnpHP6Z5Y/s1600/fastssd.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-63LM-YrIQH0/U9esd81MNII/AAAAAAAAAP8/yfBnpHP6Z5Y/s1600/fastssd.gif" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<pre><span style="color: green;">/*
Example: N D SD SSD <a href="https://oeis.org/A024916">A024916</a>
1 1 1 1
2 1,2 3 4
3 1,3 4 8
4 1,2,4 7 15
5 1,5 6 21
6 1,2,3,6 12 33
Sum of all divisors of all positive integers <= 10^n.
<a href="https://oeis.org/A072692">A072692</a> as a simple table
n a(n) time
SSD SSD3
0 1 00:00:00.0000061
1 87 00:00:00.0000058
2 8299 00:00:00.0000092
3 823081 00:00:00.0000215
4 82256014 00:00:00.0000555
5 8224740835 00:00:00.0002824
6 822468118437 00:00:00.0007623
7 82246711794796 00:00:00.0022483
8 8224670422194237 00:00:00.0075755
9 822467034112360628 00:00:00.0247891
10 82246703352400266400 00:00:00.1029980 00:00:00.0536221
11 8224670334323560419029 00:00:00.3310292
12 822467033425357340138978 00:00:01.0792704 00:00:00.5139608
13 82246703342420509396897774 00:00:03.3665267
14 8224670334241228180927002517 00:00:10.7148327 00:00:05.1645348
15 822467033424114009326065894639 00:00:34.2567848
16 82246703342411333689227187822414 00:01:49.7741595 00:00:53.1228885
17 8224670334241132270081671519064067 00:05:55.3252935
18 822467033424113219363487627735401433 00:19:50.2083007
19 82246703342411321831834750379375676781 01:12:36.6691244
20 8224670334241132182459113152714495956789 04:38:51.4847697
21 822467033424113218236966661186847524013409 15:19:44.3197506
</span><span style="color: green;"> AMD Athlon II X4 640, 3 GHz, 2 GB, XP
N=10^16 time(s) CPU Usage(%)
SSD(N) 110 25
SSD3(N) 53 60
FSSD(N) 92 25
FSSD3(N) 41 60
FSSD4(N) 33 80</span></pre>
<pre><span style="color: green;">*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Diagnostics;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">using</span> Xint = System.Numerics.BigInteger;
<span style="color: blue;">class</span> A024916
{
<span style="color: blue;">static</span> Xint SSD(Xint N)
{
Xint D = <span style="color: maroon;">1</span>, Q = N, S = <span style="color: maroon;">0</span>;
<span style="color: blue;">while</span> (D < Q)
{
S += D++ * (Q - D);
S += Q++ * Q / <span style="color: maroon;">2</span>;
Q = N / D;
}
S += Q++ * Q / <span style="color: maroon;">2</span>;
S -= D-- * D-- * D / <span style="color: maroon;">6</span>;
<span style="color: blue;">return</span> S;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
var sw = <span style="color: blue;">new</span> Stopwatch();
<span style="color: blue;">int</span> p = <span style="color: maroon;">0</span>;
Xint N = <span style="color: maroon;">1</span>, S;
L0: sw.Restart();
S = SSD(N);
sw.Stop();
Console.WriteLine(p + <span style="color: maroon;">" "</span> + S + <span style="color: maroon;">" "</span> + sw.Elapsed);
p++;
N *= <span style="color: maroon;">10</span>;
<span style="color: blue;">goto</span> L0;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint[] SA, DA, QA;
<span style="color: blue;">static</span> Xint SSD3(Xint N)
{
SA = <span style="color: blue;">new</span> Xint[<span style="color: maroon;">3</span>];
DA = <span style="color: blue;">new</span> Xint[<span style="color: maroon;">3</span>];
QA = <span style="color: blue;">new</span> Xint[<span style="color: maroon;">3</span>];
Parallel.For(<span style="color: maroon;">0</span>, <span style="color: maroon;">3</span>, (<span style="color: blue;">int</span> d) => SSDP3(N, d));
Xint S = SA[<span style="color: maroon;">0</span>] + SA[<span style="color: maroon;">1</span>] + SA[<span style="color: maroon;">2</span>],
D = DA[<span style="color: maroon;">0</span>],
Q = QA[<span style="color: maroon;">0</span>];
<span style="color: blue;">if</span> (DA[<span style="color: maroon;">1</span>] < D)
{
D = DA[<span style="color: maroon;">1</span>];
Q = QA[<span style="color: maroon;">1</span>];
}
<span style="color: blue;">if</span> (DA[<span style="color: maroon;">2</span>] < D)
{
D = DA[<span style="color: maroon;">2</span>];
Q = QA[<span style="color: maroon;">2</span>];
}
S += Q++ * Q / <span style="color: maroon;">2</span>;
S -= D-- * D-- * D / <span style="color: maroon;">6</span>;
<span style="color: blue;">return</span> S;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> SSDP3(Xint N, <span style="color: blue;">int</span> d)
{
Xint D = d + <span style="color: maroon;">1</span>, Q = N / D, S = <span style="color: maroon;">0</span>;
<span style="color: blue;">while</span> (D < Q)
{
S += D * (Q - D - <span style="color: maroon;">1</span>);
S += Q * (Q + <span style="color: maroon;">1</span>) / <span style="color: maroon;">2</span>;
D += <span style="color: maroon;">3</span>;
Q = N / D;
}
SA[d] = S;
DA[d] = D;
QA[d] = Q;
}
<span style="color: blue;">static</span> Xint FSSD(Xint N)
{
Xint D = <span style="color: maroon;">1</span>, Q = N, S = <span style="color: maroon;">0</span>;
<span style="color: blue;">while</span> (D < Q)
{
S += Q * (Q + <span style="color: maroon;">1</span> + <span style="color: maroon;">2</span> * D) / <span style="color: maroon;">2</span>;
D += <span style="color: maroon;">1</span>;
Q = N / D;
}
S += Q * (Q + <span style="color: maroon;">1</span>) / <span style="color: maroon;">2</span>;
S -= D * D * (D - <span style="color: maroon;">1</span>) / <span style="color: maroon;">2</span>;
<span style="color: blue;">return</span> S;
}
<span style="color: blue;">static</span> Xint FSSD3(Xint N)
{
SA = <span style="color: blue;">new</span> Xint[<span style="color: maroon;">3</span>];
DA = <span style="color: blue;">new</span> Xint[<span style="color: maroon;">3</span>];
QA = <span style="color: blue;">new</span> Xint[<span style="color: maroon;">3</span>];
Parallel.For(<span style="color: maroon;">0</span>, <span style="color: maroon;">3</span>, (<span style="color: blue;">int</span> d) => FSSDP3(N, d));
Xint S = SA[<span style="color: maroon;">0</span>] + SA[<span style="color: maroon;">1</span>] + SA[<span style="color: maroon;">2</span>],
D = DA[<span style="color: maroon;">0</span>],
Q = QA[<span style="color: maroon;">0</span>];
<span style="color: blue;">if</span> (DA[<span style="color: maroon;">1</span>] < D)
{
D = DA[<span style="color: maroon;">1</span>];
Q = QA[<span style="color: maroon;">1</span>];
}
<span style="color: blue;">if</span> (DA[<span style="color: maroon;">2</span>] < D)
{
D = DA[<span style="color: maroon;">2</span>];
Q = QA[<span style="color: maroon;">2</span>];
}
S += Q * (Q + <span style="color: maroon;">1</span>) / <span style="color: maroon;">2</span>;
S -= D * D * (D - <span style="color: maroon;">1</span>) / <span style="color: maroon;">2</span>;
<span style="color: blue;">return</span> S;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> FSSDP3(Xint N, <span style="color: blue;">int</span> d)
{
Xint D = d + <span style="color: maroon;">1</span>, Q = N / D, S = <span style="color: maroon;">0</span>;
<span style="color: blue;">while</span> (D < Q)
{
S += Q * (Q + <span style="color: maroon;">1</span> + <span style="color: maroon;">2</span> * D) / <span style="color: maroon;">2</span>;
D += <span style="color: maroon;">3</span>;
Q = N / D;
}
SA[d] = S;
DA[d] = D;
QA[d] = Q;
}
<span style="color: blue;">static</span> Xint FSSD4(Xint N)
{
SA = <span style="color: blue;">new</span> Xint[<span style="color: maroon;">4</span>];
DA = <span style="color: blue;">new</span> Xint[<span style="color: maroon;">4</span>];
QA = <span style="color: blue;">new</span> Xint[<span style="color: maroon;">4</span>];
Parallel.For(<span style="color: maroon;">0</span>, <span style="color: maroon;">4</span>, (<span style="color: blue;">int</span> d) => FSSDP4(N, d));
Xint S = SA[<span style="color: maroon;">0</span>] + SA[<span style="color: maroon;">1</span>] + SA[<span style="color: maroon;">2</span>] + SA[<span style="color: maroon;">3</span>],
D = DA[<span style="color: maroon;">0</span>],
Q = QA[<span style="color: maroon;">0</span>];
<span style="color: blue;">if</span> (DA[<span style="color: maroon;">1</span>] < D)
{
D = DA[<span style="color: maroon;">1</span>];
Q = QA[<span style="color: maroon;">1</span>];
}
<span style="color: blue;">if</span> (DA[<span style="color: maroon;">2</span>] < D)
{
D = DA[<span style="color: maroon;">2</span>];
Q = QA[<span style="color: maroon;">2</span>];
}
<span style="color: blue;">if</span> (DA[<span style="color: maroon;">3</span>] < D)
{
D = DA[<span style="color: maroon;">3</span>];
Q = QA[<span style="color: maroon;">3</span>];
}
S += Q * (Q + <span style="color: maroon;">1</span>) / <span style="color: maroon;">2</span>;
S -= D * D * (D - <span style="color: maroon;">1</span>) / <span style="color: maroon;">2</span>;
<span style="color: blue;">return</span> S;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> FSSDP4(Xint N, <span style="color: blue;">int</span> d)
{
Xint D = d + <span style="color: maroon;">1</span>, Q = N / D, S = <span style="color: maroon;">0</span>;
<span style="color: blue;">while</span> (D < Q)
{
S += Q * (Q + <span style="color: maroon;">1</span> + <span style="color: maroon;">2</span> * D) / <span style="color: maroon;">2</span>;
D += <span style="color: maroon;">4</span>;
Q = N / D;
}
SA[d] = S;
DA[d] = D;
QA[d] = Q;
}
}</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-61404245207849095002014-01-23T10:17:00.000-08:002014-01-23T10:46:32.204-08:00The kth Permutation<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-8CWF_udfkZc/UuFbFNI-89I/AAAAAAAAAPE/CkAXAzqv0jI/s1600/perm.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-8CWF_udfkZc/UuFbFNI-89I/AAAAAAAAAPE/CkAXAzqv0jI/s1600/perm.jpg" /></a></div>
<pre><span style="color: green;">/*
It is based on:
<a href="http://msdn.microsoft.com/en-us/library/aa302371.aspx">"Using Permutations in .Net for Improved System Security"</a>
Factoradics are used to find the kth permutation of order n.
*/</span>
<span style="color: blue;">class</span> Permutation
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] kth_perm(<span style="color: blue;">uint</span> k, <span style="color: blue;">uint</span> n) <span style="color: green;">// k=0,n=3 ==> {0,1,2}</span>
{ <span style="color: green;">// k=1,n=3 ==> {0,2,1}</span>
<span style="color: blue;">if</span> (n == <span style="color: maroon;">0</span>) <span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { };
<span style="color: blue;">uint</span>[] perm = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[n++];
<span style="color: blue;">uint</span>[] fdic = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[n]; <span style="color: green;">// in factoradic form, no factorials!</span>
<span style="color: blue;">uint</span> i = <span style="color: maroon;">1</span>, d, m = n - <span style="color: maroon;">1</span>;
<span style="color: blue;">do</span>
{
d = k / i;
fdic[m--] = k - d * i++;
k = d;
}
<span style="color: blue;">while</span> (m != ~<span style="color: maroon;">0u</span>);
<span style="color: blue;">for</span> (k = n-- - <span style="color: maroon;">2</span>; k != ~<span style="color: maroon;">0u</span>; k--)
{
m = perm[k++] = fdic[k];
<span style="color: blue;">for</span> (i = k--; i < n; i++) <span style="color: blue;">if</span> (perm[i] >= m) perm[i]++;
}
<span style="color: blue;">return</span> perm;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] next_perm(<span style="color: blue;">uint</span>[] perm) <span style="color: green;">// {0,1,2} ==> {0,2,1}</span>
{
<span style="color: blue;">int</span> len = perm.Length - <span style="color: maroon;">1</span>;
<span style="color: blue;">if</span> (len <= <span style="color: maroon;">0</span>) <span style="color: blue;">return</span> perm;
<span style="color: blue;">int</span> i = len;
<span style="color: blue;">while</span> (i > <span style="color: maroon;">0</span> && perm[i--] <= perm[i]) ;
<span style="color: blue;">uint</span> swap = perm[i];
<span style="color: blue;">int</span> j = len;
<span style="color: blue;">while</span> (j > <span style="color: maroon;">0</span> && perm[j] <= swap) j--;
<span style="color: blue;">if</span> (j == <span style="color: maroon;">0</span>)
<span style="color: blue;">do</span>
{
swap = perm[len];
perm[len--] = perm[j];
perm[j++] = swap;
}
<span style="color: blue;">while</span> (j < len);
<span style="color: blue;">else</span>
{
perm[i++] = perm[j];
perm[j] = swap;
<span style="color: blue;">while</span> (len > i)
{
swap = perm[len];
perm[len--] = perm[i];
perm[i++] = swap;
}
}
<span style="color: blue;">return</span> perm;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
<span style="color: blue;">uint</span>[] perm = kth_perm(<span style="color: maroon;">999999</span>, <span style="color: maroon;">10</span>); <span style="color: green;">// {2,7,8,3,9,1,5,4,6,0}</span>
perm = next_perm(perm); <span style="color: green;">// {2,7,8,3,9,1,5,6,0,4}</span>
perm = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { <span style="color: maroon;">3</span>, <span style="color: maroon;">1</span>, <span style="color: maroon;">3</span>, <span style="color: maroon;">1</span> }; <span style="color: green;">// {3,1,3,1}</span>
perm = next_perm(perm); <span style="color: green;">// {3,3,1,1}</span>
perm = next_perm(perm); <span style="color: green;">// {1,1,3,3}</span>
perm = next_perm(perm); <span style="color: green;">// {1,3,1,3}</span>
perm = next_perm(perm); <span style="color: green;">// {1,3,3,1}</span>
perm = next_perm(perm); <span style="color: green;">// {3,1,1,3}</span>
perm = next_perm(perm); <span style="color: green;">// {3,1,3,1}</span>
}
}
</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-47283961504271709882014-01-20T14:58:00.003-08:002014-01-23T10:34:06.925-08:00The mth Combination<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ZOFT5b-n4Lo/Ut2kcMlP2FI/AAAAAAAAAO0/fQZg52dOsBc/s1600/comb.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-ZOFT5b-n4Lo/Ut2kcMlP2FI/AAAAAAAAAO0/fQZg52dOsBc/s1600/comb.jpg" /></a></div>
<pre><span style="color: green;">/*
In <a href="http://bigintegers.blogspot.com/2013/12/mwc58-fast-rng-small-period-part-4.html">"www.MWC58 Fast RNG"</a> appeared an off topic item:
The mth 2-element subset of the set { 0, 1 , 2 , 3 , ... , n } , or
<a href="http://msdn.microsoft.com/en-us/library/aa289166%28v=vs.71%29.aspx">"Generating the mth Lexicographical Element of a Mathematical Combination"</a>
The author, Dr. James McCaffrey, remarks: "Huh?" Also by McCaffrey:
<a href="http://msdn.microsoft.com/en-us/library/aa302371.aspx">"Using Permutations in .Net for Improved Systems Security"</a>
Factorials (factoradics) are used to find the m<i>th</i> permutation of order n.
It might be a good idea to read that first. A few years ago I published code
based on it, sorry, the site disappeared, but: <a href="http://bigintegers.blogspot.com/2014/01/the-kth-permutation.html">The kth Permutation</a>
Binomial Coefficients (combinadics) are used to find the m<i>th</i> combination of order n.
McCaffrey observed: "when you map from an index value to a vector value, alternate number
representations (factoradics, combinadics, ...) are often the key to an elegant solution".
<b>A few examples:</b>
A set contains 1 item (n=1): "0" (it will become clear that it is easier to work zero
based, like indices in an array), so we can choose 1 subset (k=1) , the set itself: "0"
With n=2 , the set is: {0,1} and k=1 , the first (m=0) subset is: "0" , the second one
(m=1) : "1" . With k=2 , 1 subset, the set itself.
n=1 n=2 n=2 n=3 n=3 n=3
k=1 k=1 k=2 k=1 k=2 k=3
s=set={0} s={0,1} s={0,1} s={0,1,2} s={0,1,2} s={0,1,2}
m ss(=subset) m ss m ss m ss m ss m ss
0 0 0 0 0 0,1 0 0 0 0,1 0 0,1,2
1 0 1 1 1 0,1 1 1 1 0,2 1 0,1,2
.... 2 0 ...... 2 2 2 1,2 ........
.... 3 0 3 0,1
.... ......
The number of possible combinations: " n! / k! / (n-k)! " = Choose(n,k) = bnm(n,k)
<b>Another combination algorithm:</b>
<a href="ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-239.pdf">Gosper's hack (item 175)</a>
A description: <a href="http://www.hackersdelight.org/basics2.pdf">A Novel Application (snoob, page 14)</a>
A remark from the author, Henry S. Warren: ... the problem of finding the next higher number
after a given number that has the same number of 1-bits. You are forgiven if you are asking,
"Why on earth would anyone want to compute that?" The "\\\\////" image above is made with it,
turn it 90 degrees, spot the pattern.
*/</span>
<span style="color: blue;">class</span> Combination
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">byte</span> snoob(<span style="color: blue;">byte</span> b)
{
<span style="color: blue;">byte</span> smallest, ripple, ones; <span style="color: green;">// x = 00001010 {1,3}</span>
smallest = (<span style="color: blue;">byte</span>)(b & (~b + <span style="color: maroon;">1</span>)); <span style="color: green;">// 00000010</span>
ripple = (<span style="color: blue;">byte</span>)(b + smallest); <span style="color: green;">// 00001100</span>
ones = (<span style="color: blue;">byte</span>)(b ^ ripple); <span style="color: green;">// 00000110</span>
ones = (<span style="color: blue;">byte</span>)((ones >> <span style="color: maroon;">2</span>) / smallest); <span style="color: green;">// 00000000</span>
<span style="color: blue;">return</span> (<span style="color: blue;">byte</span>)(ripple | ones); <span style="color: green;">// 00001100 {2,3}</span>
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] comb = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { };
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> g_n = <span style="color: maroon;">0</span>, g_k = <span style="color: maroon;">0</span>;
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> next_comb(<span style="color: blue;">uint</span> n, <span style="color: blue;">uint</span> k)
{
<span style="color: blue;">if</span> (k == <span style="color: maroon;">0</span> || k > n) comb = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { };
<span style="color: blue;">else</span>
{
<span style="color: blue;">if</span> (n != g_n || k != g_k)
{
g_n = n; g_k = k; comb = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[k];
<span style="color: blue;">for</span> (n = <span style="color: maroon;">1</span>; n < k; ) comb[n] = n++;
}
<span style="color: blue;">else</span>
{
<span style="color: blue;">if</span> (comb[<span style="color: maroon;">0</span>] == n - k) <span style="color: blue;">for</span> (n = <span style="color: maroon;">0</span>; n < k; ) comb[n] = n++;
<span style="color: blue;">else</span>
{
k--; n--; <span style="color: blue;">while</span> (comb[k--] == n--) ;
k++; n = ++comb[k]; <span style="color: blue;">while</span> (++k < g_k) comb[k] = ++n;
n = g_n;
}
}
}
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> next_comb() { next_comb(g_n, g_k); }
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] mth_comb(<span style="color: blue;">uint</span> m, <span style="color: blue;">uint</span> n, <span style="color: blue;">uint</span> k)
{
<span style="color: blue;">if</span> (k == <span style="color: maroon;">0</span> || k > n) <span style="color: blue;">return</span> <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[] { };
<span style="color: blue;">uint</span> i = <span style="color: maroon;">0</span>, nk = n - k;
g_n = n - <span style="color: maroon;">1</span>; g_k = k - <span style="color: maroon;">1</span>;
comb = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[k];
<span style="color: blue;">uint</span> c = bnm(n, k);
m = c - m % c - <span style="color: maroon;">1</span>;
c = c * nk-- / n--;
<span style="color: blue;">while</span> (i < g_k)
{
<span style="color: blue;">while</span> (c > m) c = c * nk-- / n--; <span style="color: green;">// while (c > m) c = c * nk-- / n--;</span>
m -= c; <span style="color: green;">// McCaffrey: A binary search approach for</span>
comb[i++] = g_n - n; <span style="color: green;">// large values of n could improve performance.</span>
c = c * k-- / n--; <span style="color: green;">// <a href="http://bigintegers.blogspot.com/2010/11/number-of-bits-of-factorial.html">www.bitlength factorial</a> </span>
} <span style="color: green;">// ==> approximation bitlength binomial,</span>
<span style="color: blue;">while</span> (c > m) c = c * nk-- / n--; <span style="color: green;">// ==> a way to narrow the search ?</span>
comb[i] = g_n - n;
g_n++; g_k++;
<span style="color: blue;">return</span> comb;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> bnm(<span style="color: blue;">uint</span> n, <span style="color: blue;">uint</span> k)
{
<span style="color: blue;">if</span> (k > n) <span style="color: blue;">return</span> <span style="color: maroon;">0</span>;
<span style="color: blue;">if</span> (k > n / <span style="color: maroon;">2</span>) k = n - k;
<span style="color: blue;">uint</span> nk = n - k, c = k = <span style="color: maroon;">1</span>;
<span style="color: blue;">while</span> (n > nk) c = c * n-- / k++;
<span style="color: blue;">return</span> c;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
mth_comb(<span style="color: maroon;">5</span>, <span style="color: maroon;">5</span>, <span style="color: maroon;">3</span>); <span style="color: green;">// { 0, 3 , 4 }</span>
next_comb(); <span style="color: green;">// { 1, 2 , 3 }</span>
next_comb(<span style="color: maroon;">4</span>, <span style="color: maroon;">2</span>); <span style="color: green;">// { 0, 1 }</span>
next_comb(); <span style="color: green;">// { 0, 2 }</span>
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">ulong</span> bnm64(<span style="color: blue;">uint</span> n, <span style="color: blue;">uint</span> k) <span style="color: green;">// <a href="http://bigintegers.blogspot.com/2012/02/binomial-coefficient-part-2-catalan.html">Binomial Coefficient</a> needs an update</span>
{
<span style="color: blue;">checked</span>
{
<span style="color: blue;">if</span> (k > n) <span style="color: blue;">return</span> <span style="color: maroon;">0</span>;
<span style="color: blue;">if</span> (k > n / <span style="color: maroon;">2</span>) k = n - k;
<span style="color: blue;">uint</span> nk = n - k;
<span style="color: blue;">uint</span> c = k = <span style="color: maroon;">1</span>;
<span style="color: blue;">ulong</span> cc;
<span style="color: blue;">try</span>
{
<span style="color: blue;">while</span> (n > nk) c = c * n-- / k++;
<span style="color: blue;">return</span> c;
}
<span style="color: blue;">catch</span>
{
<span style="color: blue;">try</span>
{
n++;
cc = c;
<span style="color: blue;">while</span> (n > nk) cc = cc * n-- / k++;
<span style="color: blue;">return</span> cc;
}
<span style="color: blue;">catch</span>
{
<span style="color: blue;">unchecked</span>
{
<span style="color: blue;">return</span> <span style="color: maroon;">0</span>;
<span style="color: green;">// using System.Numerics.BigInteger;</span>
<span style="color: green;">// n++; </span>
<span style="color: green;">// BigInteger C = cc; </span>
<span style="color: green;">// while (n > nk) C = C * n-- / k++;</span>
<span style="color: green;">// return C;</span>
}
}
}
}
}
}
</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-12639988771716800312014-01-06T06:18:00.000-08:002014-01-07T15:45:26.736-08:00CMR63 Fast Scaled Random Number Generator part 5<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-bqaChMyzOZA/Usq3jHf-yHI/AAAAAAAAAOU/WwgaZOVrZYc/s1600/d1_6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-bqaChMyzOZA/Usq3jHf-yHI/AAAAAAAAAOU/WwgaZOVrZYc/s1600/d1_6.jpg" /></a></div>
<pre><span style="color: green;">/*
"CMR" stands for "Constant Multiply Rotate",
"63" stands for the period: > 2^63 (almost 2^64).
It's based on a publication by Mark A. Overton(2011):
</span><span style="color: green;"><span style="color: green;"><a href="http://www.drdobbs.com/tools/fast-high-quality-parallel-random-number/229625477">http://www. Fast, High-Quality, Parallel Random Number Generators</a></span>
<b>CMR63:</b>
</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cmr()
{
z0 *= m0;
z1 *= m1;
z0 = z0 << s0 | z0 >> r0;
z1 = z1 << s1 | z1 >> r1;
<span style="color: blue;">return</span> z0 ^ z1;
}
<span style="color: green;">
The constants can be found in: <a href="http://www.twimgs.com/ddj/images/article/2011/0511/OvertonTables.zip">http://www.OvertonTables.zip</a> (cmr-32.txt)
A small part of the cmr-32 table:
cmr-32: x = Constant*x; x = rotl(x,RL);
Seed value can be 1, or SeedStart..(SeedStart+SeedCnt-1).
SB = number of bits in seed (2^SB <= SeedCnt).
SeedCnt SeedStart SB Period Constant RL Prime factors of period
-------- ---------- -- ---------- ---------- -- -----------------------
62973467 1377002680 25 4294966876 3563976171 16 2^2 1073741719
33525602 3202323436 24 4294965919 1422968075 16 307 757 18481
32022541 1180658772 24 4294966152 1977089609 19 2^3 3 41 1051 4153
31280659 554048116 24 4294966449 433149435 17 3 1259 1137137
2749407 2613580375 21 4294950337 272690735 19 4294950337 (prime)
1095230 3119024045 20 4294928147 64333559 18 4294928147 (prime)
998895 3255944955 19 4294915769 3152644205 13 4294915769 (prime)
664885 3993266363 19 4294881427 4031235431 15 4294881427 (prime)
The full table contains 5586 data rows, 272 periods are prime.
The smallest period is 4284340603. Thus the smallest period of two
combined generators (with periods having no common factors) is at least:
4284340603^2
4284340603^2 > 2^63.99 ==> 2^63.99 < period < 2^64
I use seed values to get unique pairs of constants (multipliers),
assuming random sequences generated by those unique pairs are not
correlated. Constants belonging to the 272 prime periods can be combined
with other constants (belonging to 272 of the 5586 - 272 non prime periods).
A more refined scheme might get the number of combinations closer to 5586/2.
On my pc (Athlon II X4 640, 3GHz, 2GB, XP) 10^9 iterations of CMR63 take
6.27 seconds, so the full period takes about 3600 years!
2^63.99 / 10^9 * 6.27 / (60 * 60 * 24 * 365) ~ 3600
<b>The scaled version:</b>
"cmr_uint(u)" returns a value x ( 0 <= x <= u ).
The time to generate one scaled random number is 21 ns, mean 14 ns,
more accurate, mean maximum time: 21 ns, mean mean is mean: 14 ns.
Lots of random bits are spoiled, it does not matter: 3600 years!
<b>CMR16:</b>
Uses rotation (shift) value 16. Periods of the sub generators
( z2 = m2 * ... , z3 = m3 * ... ) are prime.
Result: 22 Divergent High Quality Random Number Sequences.
*/</span>
<span style="color: blue;">class</span> cmr63
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> s0 = <span style="color: maroon;">16</span>, r0 = <span style="color: maroon;">16</span>, s1 = <span style="color: maroon;">15</span>, r1 = <span style="color: maroon;">17</span>; <span style="color: green;">// init_cmr(0);</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> m0 = <span style="color: maroon;">3563976171</span>, z0 = <span style="color: maroon;">4125873261</span>,
m1 = <span style="color: maroon;">4031235431</span>, z1 = <span style="color: maroon;">3803445283</span>;
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> init_cmr(<span style="color: blue;">uint</span> seed)
{
<span style="color: blue;">byte</span>[] s = { <span style="color: maroon;">16</span>, <span style="color: maroon;">16</span>, <span style="color: maroon;">19</span>, <span style="color: maroon;">17</span>, <span style="color: maroon;">19</span>, <span style="color: maroon;">18</span>, <span style="color: maroon;">13</span>, <span style="color: maroon;">15</span> };
<span style="color: blue;">uint</span>[] m = { <span style="color: maroon;">3563976171</span>, <span style="color: maroon;">1422968075</span>, <span style="color: maroon;">1977089609</span>, <span style="color: maroon;">433149435</span>,
<span style="color: maroon;">272690735</span>, <span style="color: maroon;">64333559</span>, <span style="color: maroon;">3152644205</span>, <span style="color: maroon;">4031235431</span>};
seed &= <span style="color: maroon;">3</span>; m0 = m[seed]; s0 = s[seed]; r0 = <span style="color: maroon;">32</span> - s0; z0 = <span style="color: maroon;">1</span>;
seed ^= <span style="color: maroon;">7</span>; m1 = m[seed]; s1 = s[seed]; r1 = <span style="color: maroon;">32</span> - s1; z1 = <span style="color: maroon;">1</span>;
cmr();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cmr()
{
z0 *= m0;
z1 *= m1;
z0 = z0 << s0 | z0 >> r0;
z1 = z1 << s1 | z1 >> r1;
<span style="color: blue;">return</span> z0 ^ z1;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> g_u = <span style="color: maroon;">0</span>;
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> g_s = <span style="color: maroon;">0</span>;
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cmr_uint(<span style="color: blue;">uint</span> u)
{
<span style="color: blue;">uint</span> x;
<span style="color: blue;">if</span> (u == <span style="color: maroon;">0</span>) <span style="color: blue;">return</span> <span style="color: maroon;">0</span>;
<span style="color: blue;">if</span> (u != g_u)
{
g_u = u;
g_s = <span style="color: maroon;">32</span> - nob(u);
}
<span style="color: blue;">do</span>
{
z0 *= m0;
z1 *= m1;
z0 = z0 << s0 | z0 >> r0;
z1 = z1 << s1 | z1 >> r1;
x = (z0 ^ z1) >> g_s;
}
<span style="color: blue;">while</span> (x > u);
<span style="color: blue;">return</span> x;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> nob(<span style="color: blue;">uint</span> u) <span style="color: green;">// number of bits, position of the highest set bit, u > 0 </span>
{
<span style="color: blue;">return</span>
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">16</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">08</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">04</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">02</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">01</span> ? <span style="color: maroon;">01</span> : <span style="color: maroon;">02</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">03</span> ? <span style="color: maroon;">03</span> : <span style="color: maroon;">04</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">05</span> ? <span style="color: maroon;">05</span> : <span style="color: maroon;">06</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">07</span> ? <span style="color: maroon;">07</span> : <span style="color: maroon;">08</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">10</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span> ? <span style="color: maroon;">09</span> : <span style="color: maroon;">10</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">11</span> ? <span style="color: maroon;">11</span> : <span style="color: maroon;">12</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">14</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">13</span> ? <span style="color: maroon;">13</span> : <span style="color: maroon;">14</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span> ? <span style="color: maroon;">15</span> : <span style="color: maroon;">16</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">17</span> ? <span style="color: maroon;">17</span> : <span style="color: maroon;">18</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">19</span> ? <span style="color: maroon;">19</span> : <span style="color: maroon;">20</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">22</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span> ? <span style="color: maroon;">21</span> : <span style="color: maroon;">22</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">23</span> ? <span style="color: maroon;">23</span> : <span style="color: maroon;">24</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">28</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">26</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">25</span> ? <span style="color: maroon;">25</span> : <span style="color: maroon;">26</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">27</span> ? <span style="color: maroon;">27</span> : <span style="color: maroon;">28</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">29</span> ? <span style="color: maroon;">29</span> : <span style="color: maroon;">30</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">31</span> ? <span style="color: maroon;">31</span> : <span style="color: maroon;">32</span>;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
<span style="color: green;">// <a href="http://www.en.wikipedia.org/wiki/TestU01">http://www.TestU01.BigCrush</a> ?</span>
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> m2 = <span style="color: maroon;">3745979853</span>, z2 = <span style="color: maroon;">500031303</span>,
m3 = <span style="color: maroon;">0623716905</span>, z3 = <span style="color: maroon;">707339565</span>;
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> init_cmr16(<span style="color: blue;">uint</span> seed)
{
<span style="color: blue;">uint</span>[] m = { <span style="color: maroon;">3745979853</span>, <span style="color: maroon;">4055716687</span>, <span style="color: maroon;">3693386591</span>, <span style="color: maroon;">3542220329</span>,
<span style="color: maroon;">1775851103</span>, <span style="color: maroon;">1866916287</span>, <span style="color: maroon;">4188393139</span>, <span style="color: maroon;">4141129223</span>,
<span style="color: maroon;">1173908643</span>, <span style="color: maroon;">3198474053</span>, <span style="color: maroon;">11119693</span>, <span style="color: maroon;">1282266473</span>,
<span style="color: maroon;">4076777453</span>, <span style="color: maroon;">3908725387</span>, <span style="color: maroon;">3293562383</span>, <span style="color: maroon;">2492630213</span>,
<span style="color: maroon;">1818407027</span>, <span style="color: maroon;">608828557</span>, <span style="color: maroon;">872259061</span>, <span style="color: maroon;">2075607481</span>,
<span style="color: maroon;">1573125557</span>, <span style="color: maroon;">2615661665</span>, <span style="color: maroon;">1402711077</span>, <span style="color: maroon;">3212405133</span>,
<span style="color: maroon;">680154359</span>, <span style="color: maroon;">2023590663</span>, <span style="color: maroon;">3458456891</span>, <span style="color: maroon;">4184846215</span>,
<span style="color: maroon;">2408125305</span>, <span style="color: maroon;">2558924297</span>, <span style="color: maroon;">3008413683</span>, <span style="color: maroon;">466035855</span>,
<span style="color: maroon;">1647905439</span>, <span style="color: maroon;">2930730743</span>, <span style="color: maroon;">733571709</span>, <span style="color: maroon;">3997625831</span>,
<span style="color: maroon;">1919196763</span>, <span style="color: maroon;">3392242035</span>, <span style="color: maroon;">100431167</span>, <span style="color: maroon;">579587817</span>,
<span style="color: maroon;">3074845609</span>, <span style="color: maroon;">1931914705</span>, <span style="color: maroon;">3131462569</span>, <span style="color: maroon;">623716905</span>};
seed %= <span style="color: maroon;">22</span>;
m2 = m[seed];
m3 = m[<span style="color: maroon;">43</span> - seed];
z2 = z3 = <span style="color: maroon;">1</span>;
cmr16();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cmr16() <span style="color: green;">// 2^63.99 < period < 2^64</span>
{
z2 *= m2;
z3 *= m3;
z2 = z2 << <span style="color: maroon;">16</span> | z2 >> <span style="color: maroon;">16</span>;
z3 = z3 << <span style="color: maroon;">16</span> | z3 >> <span style="color: maroon;">16</span>;
<span style="color: blue;">return</span> z2 ^ z3;
}
}
</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-25475190718716478822013-12-30T10:59:00.000-08:002014-01-09T05:58:53.301-08:00MWC58 Fast RNG small period part 4<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-tek5pB3j5kQ/UsL1_W06OkI/AAAAAAAAAOE/CaBpICL91mc/s1600/montecarlo910.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-tek5pB3j5kQ/UsL1_W06OkI/AAAAAAAAAOE/CaBpICL91mc/s1600/montecarlo910.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<pre><span style="color: green;">/*
"MWC" stands for "Multiply With Carry", "58" stands for the period: > 2^58
Actually the period is larger than 2^60, the first version had a smaller period.
A big drawback: The usable period is a lot smaller. Despite this drawback,
MWC58 might be usefull:
-128 non correlated sequences of random numbers,
each sequence contains at least 590 million numbers,
sequences are repeatable, initialisation is fast.
-seed another RNG
It's based on: <a href="http://www.ms.uky.edu/~mai/RandomNumber">Marsaglia's message(1998)</a>
<b>MWC58:</b>
<span style="color: blue;">private static uint</span> <span style="color: black;">mwc58()</span>
<span style="color: black;">{</span>
<span style="color: black;">z0 = m0 * (z0 &</span> </span><span style="color: maroon;">65535</span><span style="color: green;"><span style="color: black;">) + (z0 >></span> </span><span style="color: green;"><span style="color: red;"><span style="color: maroon;">16</span></span><span style="color: black;">);</span> // both (m0<<15)-1 and (m0<<16)-1 are prime
<span style="color: black;">z1 = m1 * (z1 &</span> </span><span style="color: maroon;">65535</span><span style="color: green;"><span style="color: black;">) + (z1 >></span> </span><span style="color: green;"><span style="color: red;"><span style="color: maroon;">16</span></span><span style="color: black;">);</span> // both (m1<<15)-1 and (m1<<16)-1 are prime
<span style="color: blue;">return</span> <span style="color: black;">z0 + (z1 <<</span> </span><span style="color: maroon;">16</span><span style="color: green;"><span style="color: black;">);</span>
<span style="color: black;">}</span>
Why is this fast? From a publication by Mark A. Overton(2011):
<a href="http://www.drdobbs.com/tools/fast-high-quality-parallel-random-number/229625477">Fast, High-Quality, Parallel Random Number Generators</a>
<i>Two independent generators are used:</i> z0 = m0 * ... , z1 = m1 * ...
<i>The compiler places instructions in an order that causes the processor to
pipeline the computations of the generators. As a result of this parallelizing,
the generators execute even faster than expected. The second multiply,</i> z1 = m1 * ...
<i>only adds one more clock cycle.</i>
The period "p0" of the first generator is: p0 = m0 * 2^15 ,
with a seed value "s0": 0 < s0 <= 2 * p0 - 2 .
The period of MWC58: m0 * m1 * 2^30 .
The usable period is a lot smaller. The 16 lsb's (least significant bits) are
the 16 lsb's of the first generator: z0 , with period: p0 = m0 * 2^15.
The most significant bits depend much on the second generator: z1 ,
where the highest bits have the largest dependencies.
For the smallest value of m0: 18030, MWC58 generates 18030 * 2^15 (~5.9 * 10^8)
random numbers in ~2.25 seconds. In other words: When 5.9 * 10^8 random numbers
are needed, MWC58 generates them fast.
With 18030 <= m <= 65184 , there are 256 valid multipliers:
ushort[] m = { 18030 ... 65184 };
With fixed multipliers it is possible to use a 32 bits seed value,
from which valid values for s0 and s1 can be dereived.
When we want different sequences, using different seed values,
to be more divergent (less correlated), it is better to use the seed for
indices in the "ushort[] m" array.
Off topic: The k-<i>th</i> (ordered) combination of { 0, 1, 2, 3, ... , n }</span><span style="color: green;"><span style="color: green;"> , or
the k-<i>th</i> 2-element subset of the set </span></span><span style="color: green;"><span style="color: green;"><span style="color: green;">{ 0, 1, 2, 3, ... , n }</span>
Triangular numbers and their inverse are involved.
</span></span><span style="color: green;"><span style="color: green;"><a href="http://4.bp.blogspot.com/-mxUYSJjhA94/Us6eMD5Lk_I/AAAAAAAAAOo/2appZvgQcpE/s1600/tn_finhish.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-mxUYSJjhA94/Us6eMD5Lk_I/AAAAAAAAAOo/2appZvgQcpE/s1600/tn_finhish.jpg" /></a></span>
<span style="color: black;">private static <span style="color: blue;">uint</span>[] tri_com(<span style="color: blue;">uint</span> k, <span style="color: blue;">uint</span> n)</span> // n > 0 // n = 3
<span style="color: black;">{</span> // k | i | j
<span style="color: blue;">uint</span> <span style="color: black;">t, i, j;</span> // ---|---|---
<span style="color: black;">t = n * (n + </span></span><span style="color: green;"><span style="color: black;"><span style="color: green;"><span style="color: red;"><span style="color: maroon;">1</span></span></span>) / </span></span><span style="color: green;"><span style="color: black;"><span style="color: red;"><span style="color: green;"><span style="color: red;"><span style="color: maroon;">2</span></span></span></span>;</span> // 0 | 0 | 1
<span style="color: black;">k %= t;</span> // 1 | 0 | 2
<span style="color: black;">i = n - </span></span><span style="color: green;"><span style="color: red;"><span style="color: maroon;">1</span></span></span><span style="color: green;"><span style="color: black;"> - (uint)((<span style="color: blue;">Math.Sqrt</span>(</span></span><span style="color: green;"><span style="color: black;"><span style="color: red;"><span style="color: green;"><span style="color: red;"><span style="color: maroon;">8</span></span></span></span></span></span><span style="color: green;"><span style="color: black;"> * (t - k - </span></span><span style="color: green;"><span style="color: black;"><span style="color: red;"><span style="color: green;"><span style="color: red;"><span style="color: maroon;">1</span></span></span></span>) + </span></span><span style="color: green;"><span style="color: black;"><span style="color: green;"><span style="color: red;"><span style="color: maroon;">1</span></span></span>) - </span></span><span style="color: green;"><span style="color: black;"><span style="color: red;"><span style="color: green;"><span style="color: red;"><span style="color: maroon;">1</span></span></span></span>) / </span></span><span style="color: green;"><span style="color: black;"><span style="color: red;"><span style="color: green;"><span style="color: red;"><span style="color: maroon;">2</span></span></span></span></span></span><span style="color: green;"><span style="color: black;">);</span> // 2 | 0 | 3
<span style="color: black;">j = (i * (i + </span></span><span style="color: green;"><span style="color: black;"><span style="color: green;"><span style="color: red;"><span style="color: maroon;">1</span></span></span>) / </span></span><span style="color: green;"><span style="color: black;"><span style="color: green;"><span style="color: black;"><span style="color: red;"><span style="color: green;"><span style="color: red;"><span style="color: maroon;">2</span></span></span></span></span></span> + k) % n + </span></span><span style="color: green;"><span style="color: black;"><span style="color: green;"><span style="color: red;"><span style="color: maroon;">1</span></span></span>;</span> // 3 | 1 | 2
<span style="color: black;"><span style="color: blue;">uint</span>[] ij = { i, j };</span> // 4 | 1 | 3
<span style="color: blue;">return</span> <span style="color: black;">ij;</span> // 5 | 2 | 3
<span style="color: black;">}</span> // 6 | 0 | 1
When combined indices are used like: 0,3 1,2 (2 combinations)
random sequences generated by those combinations are less (not?) correlated.
With 256 multipliers there are 128 combinations.
<b>The scaled version:</b>
"mwc_uint(u)" returns a value x ( 0 <= x <= u ).
Before I used a trick to save random bits, which is not necessary any longer.
An example: mwc_uint(1) returns 0 or 1.
Under the hood 32 random bits are/were generated, they were put in a buffer,
from which the bits were taken out, one by one.
That required some code: buffer empty? refill, etc.
Some code takes some time.
Now one bit is returned, 31 remaining bits are not used,
it is faster to generate 32 new bits, and to use just one of them.
The rather small period is a bottleneck, a solution: <a href="http://bigintegers.blogspot.com/2014/01/cmr63-fast-scaled-random-number.html">CMR63</a>
<b>Results:</b>
<span style="color: black;">10^7 times rand.Next() takes: 107 ms (~11 ns per random number)
10^7 times rand.Next(int someValue) takes: 236 ms (~24 ns ...)
|--------|--------------------------------------------------------|
| | ms 10^7 * | <span style="color: blue;">rand.Next()</span> 11 ns
| |-------------|--------------|-------------|-------------| <span style="color: blue;">mwc58()</span> <span style="color: red;">4</span> ns
| u | <span style="color: blue;">mwc_uint(u)</span> | <span style="color: blue;">well_uint(u)</span> | <span style="color: blue;">gen_uint(u)</span> | <span style="color: blue;">g_uint_c(u)</span> | <span style="color: blue;">rand.Next(i)</span> 24 ns
|--------|------|------|-------|------|-------|-----|------|------| <span style="color: blue;">mwc_uint(u)</span> <span style="color: red;">18</span> ns, mean ~<span style="color: red;">12</span> ns
| 0 | 20 | | 24 | | 24 | | 24 | | <span style="color: blue;">well_uint(u)</span> 44 ns, mean ~32 ns
| 1 | | 51 | | 74 | | 73 | | 139 | <span style="color: blue;">gen_uint(u)</span> 50 ns, mean ~35 ns
| 2 | 96 | | 121 | | 124 | | 296 | | <span style="color: blue;">g_uint_c(u)</span> 280 ns, mean ~250 ns
| 3 | | 51 | | 80 | | 78 | | 211 |
| 4 | 133 | | 222 | | 242 | | 518 | |
| 7 | | 51 | | 82 | | 83 | | 282 |
| 8 | 153 | | 272 | | 290 | | 680 | |
| 2^7-1 | | 51 | | 98 | | 102 | | 562 |
| 2^7-0 | 172 | | 344 | | 380 | | 1079 | |
| 2^15-1 | | 51 | | 131 | | 130 | | 1123 |
| 2^15-0 | 174 | | 379 | | 414 | | 1634 | |
| 2^30-1 | | 51 | | 193 | | 193 | | 2164 |
| 2^30-0 | 175 | | 431 | | 494 | | 2672 | |
| 2^31-1 | | 51 | | 195 | | 210 | | 2251 |
| 2^31-0 | 175 | | 427 | | 461 | | 2747 | |
| 2^32-1 | | 51 | | 196 | | 211 | | 2307 |
|--------|------|------|-------|------|-------|-----|------|------|</span>
<a href="http://www.cacert.at/cgi-bin/rngresults">http://www.cacert.at/cgi-bin/rngresults</a> (code: find and hover mouse over "MWC58")
<span style="color: black;">|---------|---------|--------|----------|----------|--------|---------|----------|----------|----------|----------|
| Gene- | Speed | Upload | Entropy | Birthday | Matrix | 6*8 Ma- | Minimum | Random | Squeeze | Overlap- |
| rator | (MiB/s) | Size | (->8) | Spacing | Ranks | trix R | Distance | Spheres | | ping Sums|
|-------- |---------|--------|----------|----------|--------|---------|----------|----------|----------|----------|
| <b>mwc58</b> | 1000 | 19 MiB | 7.999990 | 0.161056 | 0.504 | 0.920 | 0.877503 | 0.432728 | 0.677887 | 0.458630 |
| <b>well512</b> | 400 | 19 MiB | 7.999992 | 0.446363 | 0.636 | 0.879 | 0.967495 | 0.690789 | 0.942252 |<span style="background-color: yellow;"> 0.005987 </span>|
| <b>Random</b> | 370 | 17 MiB | 7.999989 |<span style="background-color: red;"> 0.000000 </span>| 0.392 | 0.136 | 0.063920 | 0.905097 | 0.098440 |<span style="background-color: yellow;"> 0.005467 </span>|
| <b>CSP</b> | 34 | 15 MiB | 7.999987 | 0.032102 | 0.084 | 0.942 | 0.894277 | 0.036221 | 0.706538 | 0.023523 |
|-------- |---------|--------|----------|----------|--------|---------|----------|----------|----------|----------|</span>
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">class</span> mwc
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> m0 = <span style="color: maroon;">18030</span>, z0 = <span style="color: maroon;">325080900</span>, m1 = <span style="color: maroon;">65184</span>, z1 = <span style="color: maroon;">4248953856</span>;
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> mwc58()
{
z0 = m0 * (z0 & <span style="color: maroon;">65535</span>) + (z0 >> <span style="color: maroon;">16</span>);
z1 = m1 * (z1 & <span style="color: maroon;">65535</span>) + (z1 >> <span style="color: maroon;">16</span>);
<span style="color: blue;">return</span> z0 + (z1 << <span style="color: maroon;">16</span>);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> g_u = <span style="color: maroon;">0</span>;
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> g_s = <span style="color: maroon;">0</span>;
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> mwc_uint(<span style="color: blue;">uint</span> u)
{
<span style="color: blue;">uint</span> x;
<span style="color: blue;">if</span> (u == <span style="color: maroon;">0</span>) <span style="color: blue;">return</span> <span style="color: maroon;">0</span>;
<span style="color: blue;">if</span> (u != g_u)
{
g_u = u;
g_s = <span style="color: maroon;">32</span> - nob(u);
}
<span style="color: blue;">do</span>
{
z0 = m0 * (z0 & <span style="color: maroon;">65535</span>) + (z0 >> <span style="color: maroon;">16</span>);
z1 = m1 * (z1 & <span style="color: maroon;">65535</span>) + (z1 >> <span style="color: maroon;">16</span>);
x = (z0 + (z1 << <span style="color: maroon;">16</span>)) >> g_s;
}
<span style="color: blue;">while</span> (x > u);
<span style="color: blue;">return</span> x;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> init(<span style="color: blue;">uint</span> seed)
{
<span style="color: blue;">ushort</span>[] m = {
<span style="color: maroon;">18030</span>, <span style="color: maroon;">18273</span>, <span style="color: maroon;">18513</span>, <span style="color: maroon;">18879</span>, <span style="color: maroon;">19074</span>, <span style="color: maroon;">19098</span>, <span style="color: maroon;">19164</span>, <span style="color: maroon;">19215</span>, <span style="color: maroon;">19584</span>, <span style="color: maroon;">19599</span>,
<span style="color: maroon;">19950</span>, <span style="color: maroon;">20088</span>, <span style="color: maroon;">20508</span>, <span style="color: maroon;">20544</span>, <span style="color: maroon;">20664</span>, <span style="color: maroon;">20814</span>, <span style="color: maroon;">20970</span>, <span style="color: maroon;">21153</span>, <span style="color: maroon;">21243</span>, <span style="color: maroon;">21423</span>,
<span style="color: maroon;">21723</span>, <span style="color: maroon;">21954</span>, <span style="color: maroon;">22125</span>, <span style="color: maroon;">22188</span>, <span style="color: maroon;">22293</span>, <span style="color: maroon;">22860</span>, <span style="color: maroon;">22938</span>, <span style="color: maroon;">22965</span>, <span style="color: maroon;">22974</span>, <span style="color: maroon;">23109</span>,
<span style="color: maroon;">23124</span>, <span style="color: maroon;">23163</span>, <span style="color: maroon;">23208</span>, <span style="color: maroon;">23508</span>, <span style="color: maroon;">23520</span>, <span style="color: maroon;">23553</span>, <span style="color: maroon;">23658</span>, <span style="color: maroon;">23865</span>, <span style="color: maroon;">24114</span>, <span style="color: maroon;">24219</span>,
<span style="color: maroon;">24660</span>, <span style="color: maroon;">24699</span>, <span style="color: maroon;">24864</span>, <span style="color: maroon;">24948</span>, <span style="color: maroon;">25023</span>, <span style="color: maroon;">25308</span>, <span style="color: maroon;">25443</span>, <span style="color: maroon;">26004</span>, <span style="color: maroon;">26088</span>, <span style="color: maroon;">26154</span>,
<span style="color: maroon;">26550</span>, <span style="color: maroon;">26679</span>, <span style="color: maroon;">26838</span>, <span style="color: maroon;">27183</span>, <span style="color: maroon;">27258</span>, <span style="color: maroon;">27753</span>, <span style="color: maroon;">27795</span>, <span style="color: maroon;">27810</span>, <span style="color: maroon;">27834</span>, <span style="color: maroon;">27960</span>,
<span style="color: maroon;">28320</span>, <span style="color: maroon;">28380</span>, <span style="color: maroon;">28689</span>, <span style="color: maroon;">28710</span>, <span style="color: maroon;">28794</span>, <span style="color: maroon;">28854</span>, <span style="color: maroon;">28959</span>, <span style="color: maroon;">28980</span>, <span style="color: maroon;">29013</span>, <span style="color: maroon;">29379</span>,
<span style="color: maroon;">29889</span>, <span style="color: maroon;">30135</span>, <span style="color: maroon;">30345</span>, <span style="color: maroon;">30459</span>, <span style="color: maroon;">30714</span>, <span style="color: maroon;">30903</span>, <span style="color: maroon;">30963</span>, <span style="color: maroon;">31059</span>, <span style="color: maroon;">31083</span>, <span style="color: maroon;">31215</span>,
<span style="color: maroon;">31353</span>, <span style="color: maroon;">31488</span>, <span style="color: maroon;">31743</span>, <span style="color: maroon;">32430</span>, <span style="color: maroon;">32718</span>, <span style="color: maroon;">33105</span>, <span style="color: maroon;">33189</span>, <span style="color: maroon;">33249</span>, <span style="color: maroon;">33375</span>, <span style="color: maroon;">33378</span>,
<span style="color: maroon;">33663</span>, <span style="color: maroon;">33768</span>, <span style="color: maroon;">33858</span>, <span style="color: maroon;">33894</span>, <span style="color: maroon;">34158</span>, <span style="color: maroon;">34323</span>, <span style="color: maroon;">34383</span>, <span style="color: maroon;">34590</span>, <span style="color: maroon;">34653</span>, <span style="color: maroon;">34890</span>,
<span style="color: maroon;">35355</span>, <span style="color: maroon;">35523</span>, <span style="color: maroon;">35643</span>, <span style="color: maroon;">36309</span>, <span style="color: maroon;">36594</span>, <span style="color: maroon;">36804</span>, <span style="color: maroon;">36969</span>, <span style="color: maroon;">37698</span>, <span style="color: maroon;">37935</span>, <span style="color: maroon;">37959</span>,
<span style="color: maroon;">38079</span>, <span style="color: maroon;">38223</span>, <span style="color: maroon;">38283</span>, <span style="color: maroon;">38484</span>, <span style="color: maroon;">38568</span>, <span style="color: maroon;">38610</span>, <span style="color: maroon;">38649</span>, <span style="color: maroon;">38733</span>, <span style="color: maroon;">38850</span>, <span style="color: maroon;">39444</span>,
<span style="color: maroon;">39618</span>, <span style="color: maroon;">39690</span>, <span style="color: maroon;">39948</span>, <span style="color: maroon;">40833</span>, <span style="color: maroon;">40995</span>, <span style="color: maroon;">41019</span>, <span style="color: maroon;">41064</span>, <span style="color: maroon;">41289</span>, <span style="color: maroon;">41628</span>, <span style="color: maroon;">41793</span>,
<span style="color: maroon;">41874</span>, <span style="color: maroon;">42153</span>, <span style="color: maroon;">42444</span>, <span style="color: maroon;">42513</span>, <span style="color: maroon;">42594</span>, <span style="color: maroon;">42633</span>, <span style="color: maroon;">42699</span>, <span style="color: maroon;">42819</span>, <span style="color: maroon;">42903</span>, <span style="color: maroon;">42975</span>,
<span style="color: maroon;">43038</span>, <span style="color: maroon;">43155</span>, <span style="color: maroon;">43473</span>, <span style="color: maroon;">43563</span>, <span style="color: maroon;">43995</span>, <span style="color: maroon;">44019</span>, <span style="color: maroon;">44568</span>, <span style="color: maroon;">44574</span>, <span style="color: maroon;">44994</span>, <span style="color: maroon;">45723</span>,
<span style="color: maroon;">45729</span>, <span style="color: maroon;">45780</span>, <span style="color: maroon;">45789</span>, <span style="color: maroon;">45915</span>, <span style="color: maroon;">45939</span>, <span style="color: maroon;">46515</span>, <span style="color: maroon;">47088</span>, <span style="color: maroon;">47529</span>, <span style="color: maroon;">48015</span>, <span style="color: maroon;">48033</span>,
<span style="color: maroon;">48195</span>, <span style="color: maroon;">48204</span>, <span style="color: maroon;">48393</span>, <span style="color: maroon;">49209</span>, <span style="color: maroon;">49248</span>, <span style="color: maroon;">49299</span>, <span style="color: maroon;">49458</span>, <span style="color: maroon;">50034</span>, <span style="color: maroon;">50223</span>, <span style="color: maroon;">50580</span>,
<span style="color: maroon;">50589</span>, <span style="color: maroon;">50694</span>, <span style="color: maroon;">50853</span>, <span style="color: maroon;">50988</span>, <span style="color: maroon;">51198</span>, <span style="color: maroon;">51558</span>, <span style="color: maroon;">51618</span>, <span style="color: maroon;">51729</span>, <span style="color: maroon;">51744</span>, <span style="color: maroon;">51813</span>,
<span style="color: maroon;">51873</span>, <span style="color: maroon;">51933</span>, <span style="color: maroon;">52023</span>, <span style="color: maroon;">52215</span>, <span style="color: maroon;">52275</span>, <span style="color: maroon;">52509</span>, <span style="color: maroon;">52743</span>, <span style="color: maroon;">52950</span>, <span style="color: maroon;">53130</span>, <span style="color: maroon;">53199</span>,
<span style="color: maroon;">53529</span>, <span style="color: maroon;">53709</span>, <span style="color: maroon;">53898</span>, <span style="color: maroon;">53934</span>, <span style="color: maroon;">53958</span>, <span style="color: maroon;">54144</span>, <span style="color: maroon;">54168</span>, <span style="color: maroon;">54399</span>, <span style="color: maroon;">54474</span>, <span style="color: maroon;">54564</span>,
<span style="color: maroon;">54885</span>, <span style="color: maroon;">55044</span>, <span style="color: maroon;">55074</span>, <span style="color: maroon;">55179</span>, <span style="color: maroon;">55254</span>, <span style="color: maroon;">55680</span>, <span style="color: maroon;">55809</span>, <span style="color: maroon;">55848</span>, <span style="color: maroon;">55869</span>, <span style="color: maroon;">56205</span>,
<span style="color: maroon;">56538</span>, <span style="color: maroon;">56604</span>, <span style="color: maroon;">56790</span>, <span style="color: maroon;">56859</span>, <span style="color: maroon;">57039</span>, <span style="color: maroon;">57204</span>, <span style="color: maroon;">57225</span>, <span style="color: maroon;">57525</span>, <span style="color: maroon;">57603</span>, <span style="color: maroon;">57774</span>,
<span style="color: maroon;">57780</span>, <span style="color: maroon;">57918</span>, <span style="color: maroon;">58149</span>, <span style="color: maroon;">58368</span>, <span style="color: maroon;">58443</span>, <span style="color: maroon;">58758</span>, <span style="color: maroon;">59253</span>, <span style="color: maroon;">59325</span>, <span style="color: maroon;">59775</span>, <span style="color: maroon;">60009</span>,
<span style="color: maroon;">60060</span>, <span style="color: maroon;">60489</span>, <span style="color: maroon;">60735</span>, <span style="color: maroon;">60990</span>, <span style="color: maroon;">61140</span>, <span style="color: maroon;">61578</span>, <span style="color: maroon;">61914</span>, <span style="color: maroon;">62505</span>, <span style="color: maroon;">62634</span>, <span style="color: maroon;">62778</span>,
<span style="color: maroon;">62790</span>, <span style="color: maroon;">62865</span>, <span style="color: maroon;">62874</span>, <span style="color: maroon;">62904</span>, <span style="color: maroon;">63129</span>, <span style="color: maroon;">63273</span>, <span style="color: maroon;">63444</span>, <span style="color: maroon;">63663</span>, <span style="color: maroon;">63765</span>, <span style="color: maroon;">63885</span>,
<span style="color: maroon;">64185</span>, <span style="color: maroon;">64314</span>, <span style="color: maroon;">64455</span>, <span style="color: maroon;">64545</span>, <span style="color: maroon;">64860</span>, <span style="color: maroon;">65184</span> };
seed &= <span style="color: maroon;">127</span>; m0 = m[seed]; z0 = m0 * m0;
seed ^= <span style="color: maroon;">255</span>; m1 = m[seed]; z1 = m1 * m1;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> nob(<span style="color: blue;">uint</span> u) <span style="color: green;">// number of bits, position of the highest set bit, u > 0 </span>
{
<span style="color: blue;">return</span>
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">16</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">08</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">04</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">02</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">01</span> ? <span style="color: maroon;">01</span> : <span style="color: maroon;">02</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">03</span> ? <span style="color: maroon;">03</span> : <span style="color: maroon;">04</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">05</span> ? <span style="color: maroon;">05</span> : <span style="color: maroon;">06</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">07</span> ? <span style="color: maroon;">07</span> : <span style="color: maroon;">08</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">10</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span> ? <span style="color: maroon;">09</span> : <span style="color: maroon;">10</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">11</span> ? <span style="color: maroon;">11</span> : <span style="color: maroon;">12</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">14</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">13</span> ? <span style="color: maroon;">13</span> : <span style="color: maroon;">14</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span> ? <span style="color: maroon;">15</span> : <span style="color: maroon;">16</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">17</span> ? <span style="color: maroon;">17</span> : <span style="color: maroon;">18</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">19</span> ? <span style="color: maroon;">19</span> : <span style="color: maroon;">20</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">22</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span> ? <span style="color: maroon;">21</span> : <span style="color: maroon;">22</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">23</span> ? <span style="color: maroon;">23</span> : <span style="color: maroon;">24</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">28</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">26</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">25</span> ? <span style="color: maroon;">25</span> : <span style="color: maroon;">26</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">27</span> ? <span style="color: maroon;">27</span> : <span style="color: maroon;">28</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">29</span> ? <span style="color: maroon;">29</span> : <span style="color: maroon;">30</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">31</span> ? <span style="color: maroon;">31</span> : <span style="color: maroon;">32</span>;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
<span style="color: green;">// test (<span style="color: black;"> <a href="http://bigintegers.blogspot.com/2013/10/uniform-pseudo-random-numbers-in-range.html">part 1 ?</a></span></span><span style="color: green;"> )</span>
}
}
</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-37544214532024997072013-12-09T08:24:00.000-08:002013-12-11T07:30:52.981-08:00WELL512 scaled random numbers part 3<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-t0fEdKW9-ks/UqiDAM6rcqI/AAAAAAAAANU/c1aI1oMS_HQ/s1600/well.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-t0fEdKW9-ks/UqiDAM6rcqI/AAAAAAAAANU/c1aI1oMS_HQ/s1600/well.jpg" /></a></div>
<pre><span style="color: green;">
/*
"WELL" stands for "Well Equidistributed Long-period Linear",
"512" stands for the period: 2^512
Chris Lomont's version is used, visit:
<a href="http://www.lomont.org/Math/Papers/2008/Lomont_PRNG_2008.pdf">http://www.lomont.org/Math/Papers/2008/Lomont_PRNG_2008.pdf</a>
and read about the advantages of the "WELL512" PRNG.
A "state" array of 16 uints is used, it's seeded by another PRNG: "System.Random".
"System.Random" uses a seed, the absolute value of an int.
Sequences of random numbers generated by System.Random, using different seed values,
are correlated, the left side of the image above clearly shows patterns.
The right side looks pretty random, sequences appear to be less correlated.
In other words: It is possible to regenerate a high quality random sequence,
using the same seed value. Different sequences, using different seed value's,
seem to be less correlated.
<b>Results:</b>
<span style="color: black;">10^7 times rand.Next() takes: 107 ms (~11 ns per random number)
10^7 times rand.Next(int someValue) takes: 236 ms (~24 ns ...)
|--------|------------------------------------------| <span style="color: blue;">rand.Next()</span> 11 ns
| | ms 10^7 * | <span style="color: blue;">rand.Next(i)</span> 24 ns
| |--------------|-------------|-------------| <span style="color: blue;">well_uint(u)</span> 44 ns, mean ~32 ns
| u | <span style="color: blue;">well_uint(u)</span> | <span style="color: blue;">gen_uint(u)</span> | <span style="color: blue;">g_uint_c(u)</span> | <span style="color: blue;">gen_uint(u)</span> 50 ns, mean ~35 ns
|--------|-------|------|-------|-----|------|------| <span style="color: blue;">g_uint_c(u)</span> 280 ns, mean ~250 ns
| 0 | 24 | | 24 | | 24 | |
| 1 | | 74 | | 73 | | 139 |
| 2 | 121 | | 124 | | 296 | |
| 3 | | 80 | | 78 | | 211 |
| 4 | 222 | | 242 | | 518 | |
| 7 | | 82 | | 83 | | 282 |
| 8 | 272 | | 290 | | 680 | |
| 2^7-1 | | 98 | | 102 | | 562 |
| 2^7-0 | 344 | | 380 | | 1079 | |
| 2^15-1 | | 131 | | 130 | | 1123 |
| 2^15-0 | 379 | | 414 | | 1634 | |
| 2^30-1 | | 193 | | 193 | | 2164 |
| 2^30-0 | 431 | | 494 | | 2672 | |
| 2^31-1 | | 195 | | 210 | | 2251 |
| 2^31-0 | 427 | | 461 | | 2747 | |
| 2^32-1 | | 196 | | 211 | | 2307 |
|--------|-------|------|-------|-----|------|------|</span>
<a href="http://www.cacert.at/cgi-bin/rngresults">http://www.cacert.at/cgi-bin/rngresults</a> find and hover mouse over "well512" for the code.
<span style="color: black;">|---------|---------|--------|----------|----------|--------|---------|----------|----------|----------|----------|
| Gene- | Speed | Upload | Entropy | Birthday | Matrix | 6*8 Ma- | Minimum | Random | Squeeze | Overlap- |
| rator | (MiB/s) | Size | (->8) | Spacing | Ranks | trix R | Distance | Spheres | | ping Sums|
|-------- |---------|--------|----------|----------|--------|---------|----------|----------|----------|----------|
| <b>WELL512</b> | 400 | 19 MiB | 7.999992 | 0.446363 | 0.636 | 0.879 | 0.967495 | 0.690789 | 0.942252 |<span style="background-color: yellow;"> 0.005987 </span>|
| <b>Random</b> | 370 | 17 MiB | 7.999989 |<span style="background-color: red;"> 0.000000 </span>| 0.392 | 0.136 | 0.063920 | 0.905097 | 0.098440 |<span style="background-color: yellow;"> 0.005467 </span>|
| <b>CSP</b> | 34 | 15 MiB | 7.999987 | 0.032102 | 0.084 | 0.942 | 0.894277 | 0.036221 | 0.706538 | 0.023523 |
|-------- |---------|--------|----------|----------|--------|---------|----------|----------|----------|----------|</span>
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Drawing; <span style="color: green;">// add a ref</span>
<span style="color: blue;">class</span> scaled_well512
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] state = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[<span style="color: maroon;">16</span>];
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> index = -<span style="color: maroon;">1</span>;
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> init_well(<span style="color: blue;">int</span> seed)
{
seed = Math.Abs(seed);
index = seed & <span style="color: maroon;">15</span>;
var rand = <span style="color: blue;">new</span> Random(seed);
<span style="color: blue;">uint</span> u = (<span style="color: blue;">uint</span>)rand.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>);
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">15</span>; i++)
{
state[i] = (<span style="color: blue;">uint</span>)rand.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>) << <span style="color: maroon;">2</span> | u & <span style="color: maroon;">3u</span>;
state[i] ^= (<span style="color: blue;">uint</span>)rand.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>);
state[i] ^= (<span style="color: blue;">uint</span>)rand.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>);
u >>= <span style="color: maroon;">2</span>;
}
state[<span style="color: maroon;">15</span>] = (<span style="color: blue;">uint</span>)rand.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>) << <span style="color: maroon;">2</span> | (<span style="color: blue;">uint</span>)rand.Next(<span style="color: maroon;">4</span>);
state[<span style="color: maroon;">15</span>] ^= (<span style="color: blue;">uint</span>)rand.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>);
state[<span style="color: maroon;">15</span>] ^= (<span style="color: blue;">uint</span>)rand.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> well512()
{
<span style="color: blue;">uint</span> a, b, c, d;
a = state[index];
c = state[index + <span style="color: maroon;">13</span> & <span style="color: maroon;">15</span>];
b = a ^ c ^ (a << <span style="color: maroon;">16</span>) ^ (c << <span style="color: maroon;">15</span>);
c = state[index + <span style="color: maroon;">9</span> & <span style="color: maroon;">15</span>];
c ^= c >> <span style="color: maroon;">11</span>;
a = state[index] = b ^ c;
d = a ^ ((a << <span style="color: maroon;">5</span>) & <span style="color: maroon;">0xda442d24u</span>);
index = index + <span style="color: maroon;">15</span> & <span style="color: maroon;">15</span>;
a = state[index];
state[index] = a ^ b ^ d ^ (a << <span style="color: maroon;">2</span>) ^ (b << <span style="color: maroon;">18</span>) ^ (c << <span style="color: maroon;">28</span>);
<span style="color: blue;">return</span> state[index];
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">ulong</span> buf = <span style="color: maroon;">0</span>; <span style="color: green;">// 64 random bits buffer</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> av = <span style="color: maroon;">0</span>; <span style="color: green;">// available bits in buf</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> g_u = <span style="color: maroon;">0</span>; <span style="color: green;">// copy of u</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> g_nd = <span style="color: maroon;">0</span>; <span style="color: green;">// nd (needed) bits = highest set bit of u</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> g_s = <span style="color: maroon;">0</span>; <span style="color: green;">// shift</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">bool</span> ones = <span style="color: maroon;">false</span>; <span style="color: green;">// true if u = 10, 110, 1110, ...</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> well_uint(<span style="color: blue;">uint</span> u)
{
<span style="color: blue;">uint</span> x; <span style="color: blue;">int</span> s;
<span style="color: blue;">if</span> (u == <span style="color: maroon;">0</span>) <span style="color: blue;">return</span> <span style="color: maroon;">0</span>;
<span style="color: blue;">if</span> (u != g_u)
{
g_u = u;
g_nd = nob(u);
g_s = <span style="color: maroon;">64</span> - g_nd;
ones = (u + <span style="color: maroon;">1</span> & u + <span style="color: maroon;">2</span>) == <span style="color: maroon;">0</span>;
}
L0: <span style="color: blue;">if</span> (av < g_nd)
{
av += <span style="color: maroon;">32</span>;
buf <<= <span style="color: maroon;">32</span>;
buf |= well512();
}
x = (<span style="color: blue;">uint</span>)buf << g_s >> g_s;
buf >>= g_nd;
av -= g_nd;
<span style="color: blue;">if</span> (x <= u) <span style="color: blue;">return</span> x;
<span style="color: blue;">if</span> (ones) <span style="color: blue;">goto</span> L0; <span style="color: green;">// faster when u = 2, 6, 14, ...</span>
s = nob(x ^ u) - <span style="color: maroon;">1</span>;
av += s;
buf <<= s;
buf ^= x;
<span style="color: blue;">goto</span> L0;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> nob(<span style="color: blue;">uint</span> u) <span style="color: green;">// number of bits, position of the highest set bit, u > 0 </span>
{
<span style="color: blue;">return</span>
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">16</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">08</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">04</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">02</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">01</span> ? <span style="color: maroon;">01</span> : <span style="color: maroon;">02</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">03</span> ? <span style="color: maroon;">03</span> : <span style="color: maroon;">04</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">05</span> ? <span style="color: maroon;">05</span> : <span style="color: maroon;">06</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">07</span> ? <span style="color: maroon;">07</span> : <span style="color: maroon;">08</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">10</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span> ? <span style="color: maroon;">09</span> : <span style="color: maroon;">10</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">11</span> ? <span style="color: maroon;">11</span> : <span style="color: maroon;">12</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">14</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">13</span> ? <span style="color: maroon;">13</span> : <span style="color: maroon;">14</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span> ? <span style="color: maroon;">15</span> : <span style="color: maroon;">16</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">17</span> ? <span style="color: maroon;">17</span> : <span style="color: maroon;">18</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">19</span> ? <span style="color: maroon;">19</span> : <span style="color: maroon;">20</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">22</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span> ? <span style="color: maroon;">21</span> : <span style="color: maroon;">22</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">23</span> ? <span style="color: maroon;">23</span> : <span style="color: maroon;">24</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">28</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">26</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">25</span> ? <span style="color: maroon;">25</span> : <span style="color: maroon;">26</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">27</span> ? <span style="color: maroon;">27</span> : <span style="color: maroon;">28</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">29</span> ? <span style="color: maroon;">29</span> : <span style="color: maroon;">30</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">31</span> ? <span style="color: maroon;">31</span> : <span style="color: maroon;">32</span>;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
random_bitmap();
well_bitmap();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> random_bitmap()
{
<span style="color: blue;">int</span> xmax = <span style="color: maroon;">450</span>;
<span style="color: blue;">int</span> ymax = <span style="color: maroon;">450</span>;
var bmp = <span style="color: blue;">new</span> Bitmap(xmax + <span style="color: maroon;">1</span>, ymax + <span style="color: maroon;">1</span>);
<span style="color: blue;">int</span> x, y, i = <span style="color: maroon;">0</span>; <span style="color: blue;">uint</span> z;
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x <= xmax; x++)
{
<span style="color: blue;">for</span> (y = <span style="color: maroon;">0</span>; y < ymax; y++)
{
var rand = <span style="color: blue;">new</span> Random(i++);
z = (<span style="color: blue;">uint</span>)rand.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>);
<span style="color: blue;">if</span> ((z & <span style="color: maroon;">1</span>) == <span style="color: maroon;">0</span>) bmp.SetPixel(x, y, Color.White);
<span style="color: blue;">else</span> bmp.SetPixel(x, y, Color.Black);
}
}
bmp.Save(xmax.ToString() + <span style="color: maroon;">"R.bmp"</span>);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> well_bitmap()
{
<span style="color: blue;">int</span> xmax = <span style="color: maroon;">450</span>;
<span style="color: blue;">int</span> ymax = <span style="color: maroon;">450</span>;
var bmp = <span style="color: blue;">new</span> Bitmap(xmax + <span style="color: maroon;">1</span>, ymax + <span style="color: maroon;">1</span>);
<span style="color: blue;">int</span> x, y, i = <span style="color: maroon;">0</span>; <span style="color: blue;">uint</span> z;
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x <= xmax; x++)
{
<span style="color: blue;">for</span> (y = <span style="color: maroon;">0</span>; y < ymax; y++)
{
init_well(i);
i += <span style="color: maroon;">1</span>;
<span style="color: green;">//z = well512();</span>
z = well_uint(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>);
z >>= <span style="color: maroon;">0</span>;
<span style="color: blue;">if</span> ((z & <span style="color: maroon;">1</span>) == <span style="color: maroon;">0</span>) bmp.SetPixel(x, y, Color.White);
<span style="color: blue;">else</span> bmp.SetPixel(x, y, Color.Black);
}
}
bmp.Save(xmax.ToString() + <span style="color: maroon;">"W.bmp"</span>);
}
}</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-37786489760277552562013-11-17T12:44:00.000-08:002013-12-10T08:11:36.166-08:00Uniform random numbers in a range, part 2<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-bp-J54fKZAQ/UokoUUlhEfI/AAAAAAAAANE/hgC6WOkvirE/s1600/Untitled-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-bp-J54fKZAQ/UokoUUlhEfI/AAAAAAAAANE/hgC6WOkvirE/s1600/Untitled-1.jpg" /></a></div>
<pre><span style="color: green;">/*
Source code of System.Random is available at: <a href="https://singularity.svn.codeplex.com/svn/base/Applications/Runtime/Full/System/Random.cs">CodePlex/Random.cs</a>
System.Random is fast, basically a new random number is generated by a subtraction
of two numbers. A straightforward copy of the source code is two times slower
compared to using rand.Next directly.
A way to speed it up: the codeplex code uses a multiplication by a double type.
The multiplication can be replaced by a shift and an "if" statement when 30
random bits are needed, very occasionally an addition "+ 1" (and an "& 1") are
necessary, that's what </span><span style="color: green;"><span style="color: green;">"</span>Next30()</span><span style="color: green;"><span style="color: green;">"</span> does in, voila:
<a href="https://fastsystemrandomrange.codeplex.com/SourceControl/latest#source.txt">Fast Random Range (CodePlex)</a>
Other improvements over <a href="http://bigintegers.blogspot.com/2013/10/uniform-pseudo-random-numbers-in-range.html">the previous version</a>:
-a 64 bits buffer, instead of a 32 bits one.
Operations like "uint + uint" are as fast as "ulong + uint",
same for: " - , ^ , | , << , >> "
-Random numbers were computed bit by bit, now the bits are taken at once,
some bit twiddling recycles unused random bits.
Finally: A probably very <b>true</b> scaled (pseudo) <b>random number generator</b>,
based on the .Net4 RNGCryptoServiceProvider class:
".. rng = new RNGCryptoServiceProvider".
The "rng.Getbytes(..)" method fills a byte array,
one byte as fast as 40 bytes, 40 bytes seems to be an optimum.
"Buffer.BlockCopy" copies the byte array to a uint array.
The uint array is used to fill a 64 random bits buffer, etc.
"uint x = g_uint_c(uint u)" gives a random value for x,
such that: 0 <= x <= u <= uint.MaxValue
<b>Results:</b>
<span style="color: black;"> 10^7 times rand.Next() takes: 107 ms (~11 ns per random number)
10^7 times rand.Next(int someValue) takes: 236 ms (~24 ns ...)
|--------|-------------------------| </span></span><span style="color: green;"><span style="color: black;"><span style="color: green;"><span style="color: black;"> <span style="color: blue;">rand.Next()</span> 11 ns </span></span>
| | ms 10^7 * | </span></span><span style="color: green;"><span style="color: black;"><span style="color: green;"><span style="color: black;"><span style="color: blue;">rand.Next(i)</span> 24 ns</span></span>
| |-----------|-------------| </span></span><span style="color: green;"><span style="color: black;"><span style="color: green;"><span style="color: black;"><span style="color: blue;">gen_uint(u)</span> 50 ns, mean ~35 ns</span></span>
| u |<span style="color: blue;">gen_uint(u)</span>| <span style="color: blue;">g_uint_c(u)</span> | </span></span><span style="color: green;"><span style="color: black;"><span style="color: green;"><span style="color: black;"><span style="color: blue;">g_uint_c(u)</span> 280 ns, mean ~250 ns</span></span>
|--------|-----|-----|------|------|
| 0 | 24 | | 24 | |
| 1 | | 73 | | 139 |
| 2 | 124 | | 296 | |
| 3 | | 78 | | 211 |
| 4 | 242 | | 518 | |
| 7 | | 83 | | 282 |
| 8 | 290 | | 680 | |
| 2^7-1 | | 102 | | 562 |
| 2^7-0 | 380 | | 1079 | |
| 2^15-1 | | 130 | | 1123 |
| 2^15-0 | 414 | | 1634 | |
| 2^30-1 | | 193 | | 2164 |
| 2^30-0 | 494 | | 2672 | |
| 2^31-1 | | 210 | | 2251 |
| 2^31-0 | 461 | | 2747 | |
| 2^32-1 | | 211 | | 2307 |
|--------|-----|-----|------|------|</span>
<a href="http://www.cacert.at/cgi-bin/rngresults">http://www.cacert.at/cgi-bin/rngresults</a>
find: "P_P" , hover mouse over "Net4 System.Random" for the code.
<b><span style="color: black;">Random</span></b> ~ <span style="color: blue;">gen_uint(u)</span>
<b><span style="color: black;">CSP</span></b> ~ <span style="color: blue;">g_uint_c(u)</span>
<span style="color: black;">|--------|---------|--------|----------|----------|--------|---------|----------|----------|----------|----------|
| Gene- | Speed | Upload | Entropy | Birthday | Matrix | 6*8 Ma- | Minimum | Random | Squeeze | Overlap- |
| rator | (MiB/s) | Size | (->8) | Spacing | Ranks | trix R | Distance | Spheres | | ping Sums|
|--------|---------|--------|----------|----------|--------|---------|----------|----------|----------|----------|
| <b>Random</b> | 370 | 17 MiB | 7.999989 |<span style="background-color: red;"> 0.000000 </span>| 0.392 | 0.136 | 0.063920 | 0.905097 | 0.098440 |<span style="background-color: yellow;"> 0.005467 </span>|
| <b>CSP</b> | 34 | 15 MiB | 7.999987 | 0.032102 | 0.084 | 0.942 | 0.894277 | 0.036221 | 0.706538 | 0.023523 |
|--------|---------|--------|----------|----------|--------|---------|----------|----------|----------|----------|</span>
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Diagnostics;
<span style="color: blue;">using</span> System.Security.Cryptography;
<span style="color: blue;">class</span> scaled_random_uint
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">ulong</span> buf = <span style="color: maroon;">0</span>; <span style="color: green;">// 64 random bits buffer</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> av = <span style="color: maroon;">0</span>; <span style="color: green;">// available bits in buf</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> g_u = <span style="color: maroon;">0</span>; <span style="color: green;">// copy of u</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> g_nd = <span style="color: maroon;">0</span>; <span style="color: green;">// nd (needed) bits = highest set bit of u</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> g_s = <span style="color: maroon;">0</span>; <span style="color: green;">// shift</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">bool</span> ones = <span style="color: maroon;">false</span>; <span style="color: green;">// true if u = 10, 110, 1110, ...</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> g_uint_c(<span style="color: blue;">uint</span> u)
{
<span style="color: blue;">uint</span> x; <span style="color: blue;">int</span> s;
<span style="color: blue;">if</span> (u == <span style="color: maroon;">0</span>) <span style="color: blue;">return</span> <span style="color: maroon;">0</span>;
<span style="color: blue;">if</span> (u != g_u)
{
g_u = u;
g_nd = nob(u);
g_s = <span style="color: maroon;">64</span> - g_nd;
ones = (u + <span style="color: maroon;">1</span> & u + <span style="color: maroon;">2</span>) == <span style="color: maroon;">0</span>;
}
L0: <span style="color: blue;">if</span> (av < g_nd)
{
av += <span style="color: maroon;">32</span>;
buf <<= <span style="color: maroon;">32</span>;
buf |= next32();
}
x = (<span style="color: blue;">uint</span>)buf << g_s >> g_s;
buf >>= g_nd;
av -= g_nd;
<span style="color: blue;">if</span> (x <= u) <span style="color: blue;">return</span> x;
<span style="color: blue;">if</span> (ones) <span style="color: blue;">goto</span> L0; <span style="color: green;">// faster when u = 2, 6, 14, ...</span>
s = nob(x ^ u) - <span style="color: maroon;">1</span>;
buf <<= s;
buf ^= x;
av += s;
<span style="color: blue;">goto</span> L0;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> RNGCryptoServiceProvider
rng = <span style="color: blue;">new</span> RNGCryptoServiceProvider();
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">byte</span>[] r08 = <span style="color: blue;">new</span> <span style="color: blue;">byte</span>[<span style="color: maroon;">40</span>]; <span style="color: green;">// ... [400] ... ~15% faster</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] r32 = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[<span style="color: maroon;">10</span>]; <span style="color: green;">// ... [100] ... ,, ,,</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> i_r32 = <span style="color: maroon;">10</span>; <span style="color: green;">// ... = 100 ... ,, ,, </span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> next32()
{
<span style="color: blue;">if</span> (i_r32 != <span style="color: maroon;">10</span>) <span style="color: blue;">return</span> r32[i_r32++]; <span style="color: green;">// ... != 100... ,, ,,</span>
i_r32 = <span style="color: maroon;">1</span>;
rng.GetBytes(r08);
Buffer.BlockCopy(r08, <span style="color: maroon;">0</span>, r32, <span style="color: maroon;">0</span>, <span style="color: maroon;">40</span>); <span style="color: green;">// ... , 400)... ,, ,,</span>
<span style="color: blue;">return</span> r32[<span style="color: maroon;">0</span>];
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> nob(<span style="color: blue;">uint</span> u) <span style="color: green;">// number of bits, position of the highest set bit, u > 0 </span>
{
<span style="color: blue;">return</span>
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">16</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">08</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">04</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">02</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">01</span> ? <span style="color: maroon;">01</span> : <span style="color: maroon;">02</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">03</span> ? <span style="color: maroon;">03</span> : <span style="color: maroon;">04</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">05</span> ? <span style="color: maroon;">05</span> : <span style="color: maroon;">06</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">07</span> ? <span style="color: maroon;">07</span> : <span style="color: maroon;">08</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">10</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span> ? <span style="color: maroon;">09</span> : <span style="color: maroon;">10</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">11</span> ? <span style="color: maroon;">11</span> : <span style="color: maroon;">12</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">14</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">13</span> ? <span style="color: maroon;">13</span> : <span style="color: maroon;">14</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span> ? <span style="color: maroon;">15</span> : <span style="color: maroon;">16</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">17</span> ? <span style="color: maroon;">17</span> : <span style="color: maroon;">18</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">19</span> ? <span style="color: maroon;">19</span> : <span style="color: maroon;">20</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">22</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span> ? <span style="color: maroon;">21</span> : <span style="color: maroon;">22</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">23</span> ? <span style="color: maroon;">23</span> : <span style="color: maroon;">24</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">28</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">26</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">25</span> ? <span style="color: maroon;">25</span> : <span style="color: maroon;">26</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">27</span> ? <span style="color: maroon;">27</span> : <span style="color: maroon;">28</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">29</span> ? <span style="color: maroon;">29</span> : <span style="color: maroon;">30</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">31</span> ? <span style="color: maroon;">31</span> : <span style="color: maroon;">32</span>;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Stopwatch sw = <span style="color: blue;">new</span> Stopwatch();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
speed((<span style="color: maroon;">1u</span> << <span style="color: maroon;">31</span>) - <span style="color: maroon;">0</span>);
Console.ReadLine();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> speed(<span style="color: blue;">uint</span> u)
{
<span style="color: blue;">int</span> i, j = <span style="color: maroon;">10000000</span>; <span style="color: blue;">double</span> t;
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < j; i++) g_uint_c(u);
sw.Stop();
t = sw.ElapsedMilliseconds;
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < j; i++) ; <span style="color: green;">// nada</span>
sw.Stop();
t -= sw.ElapsedMilliseconds;
Console.WriteLine(<span style="color: maroon;">"u: "</span> + u);
Console.WriteLine(<span style="color: maroon;">"gen_uint(u)"</span>);
Console.WriteLine(<span style="color: maroon;">" ms: "</span> + t);
Console.WriteLine(<span style="color: maroon;">" bits: "</span> + (<span style="color: blue;">double</span>)(nob(u)) * j);
Console.WriteLine(<span style="color: maroon;">" bits/s: {0:.000}"</span>, (<span style="color: blue;">double</span>)((nob(u)) * j) / t / <span style="color: maroon;">1000000</span>);
Console.WriteLine();
}
}</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-87704536258176572232013-11-04T16:02:00.000-08:002013-11-15T12:36:57.211-08:00Fast Cube Root ( < 2^32 ), part 2<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-bXt6-J0NMWY/UngwrOza5TI/AAAAAAAAAM0/wFYX28iHQg0/s1600/ss.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://3.bp.blogspot.com/-bXt6-J0NMWY/UngwrOza5TI/AAAAAAAAAM0/wFYX28iHQg0/s1600/ss.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"></td></tr>
</tbody></table>
<pre><span style="color: green;">/*
The mean time to take a cube root from a 32 bits uint was: < 13 ns
new mean time: < <span style="color: red;">12</span> ns
It is a bit faster, especially for large values, because variables are initialized properly.
<span style="color: black;">|--------------------------------|
| cro32(x) |
|-----|-----||------------|------|
| x | ns || x | ns |
|-----|-----||------------|------|
| 0 | 3,0 || 511 | 4,6 |
| 1 | 2,3 || 1023 | 5,3 |
| 3 | 2,3 || 2047 | 5,6 |</span> <span style="color: blue;">___</span>
<span style="color: black;"> | 7 | 2,3 || 4095 | 5,0 |</span> <span style="color: blue;">\3 /</span>
<span style="color: black;"> | 15 | 3,3 || 32768 | 7,6 |</span> <span style="color: blue;">\/ x = y</span>
<span style="color: black;">| 31 | 2,6 || 1048576 | 9,0 |</span>
<span style="color: black;">| 63 | 2,6 || 268435456 | 11,0 |</span> Input: <span style="color: blue;">0 <= x < 2^32</span>
<span style="color: black;">| 64 | 5,0 || 536870912 | 11,3 |</span> Output: <span style="color: blue;">y</span>, such that <span style="color: blue;">y^3 <= x < (y+1)^3</span>
<span style="color: black;">| 65 | 5,0 || 1070599167 | 13,0 |
| 100 | 5,0 || 1070599168 | 13,0 |
| 127 | 5,0 || 1073741824 | 11,3 |
| 128 | 5,3 || 1073774592 | 11,3 |
| 255 | 4,6 || 2147483648 | 11,0 |
| 256 | 4,6 || 4294967295 | 11,7 |
|-----|-----||------------|------|</span>
4294967295 roots in 50686 ms, mean time <span style="color: red;">11,80</span> ns (<a href="http://bigintegers.blogspot.com/2013/09/fast-cube-root-232.html">before 12,55 ns</a>)
Another way to find roots is using a look-up table. Below "fill_cubes" fills a "cubes" array,
"cro32t" does a binary search for a root. Mean time: 30 ns.
I have not tried to optimize it further, I see no reason why it should be much faster.
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Diagnostics;
<span style="color: blue;">class</span> cube_root
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cro32(<span style="color: blue;">uint</span> x)
{
<span style="color: blue;">uint</span> y = <span style="color: maroon;">4u</span>, z = <span style="color: maroon;">16u</span>, b = <span style="color: maroon;">61u</span> << <span style="color: maroon;">21</span>;
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">03</span>)
<span style="color: blue;">return</span> x == <span style="color: maroon;">0u</span> ? <span style="color: maroon;">0u</span> : <span style="color: maroon;">1u</span>;
<span style="color: blue;">else</span>
<span style="color: blue;">return</span> x < <span style="color: maroon;">27u</span> ? <span style="color: maroon;">2u</span> : <span style="color: maroon;">3u</span>;
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span>) <span style="color: blue;">goto</span> L8; <span style="color: blue;">else</span> <span style="color: blue;">goto</span> L7;
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>) <span style="color: blue;">goto</span> L6; <span style="color: blue;">else</span> <span style="color: blue;">goto</span> L5;
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span>) <span style="color: blue;">goto</span> L4; <span style="color: blue;">else</span> <span style="color: blue;">goto</span> L3;
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">27</span>) <span style="color: blue;">goto</span> L2;
<span style="color: blue;">else</span>
{
<span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">24</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">24</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; b = <span style="color: maroon;">127u</span> << <span style="color: maroon;">21</span>; }
<span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">27</span>; }
}
<span style="color: blue;">else</span>
{
<span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">27</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">27</span>; z = <span style="color: maroon;">144u</span>; y = <span style="color: maroon;">12u</span>; b = <span style="color: maroon;">469u</span> << <span style="color: maroon;">21</span>; }
<span style="color: blue;">else</span>
{
<span style="color: blue;">if</span> (x >= <span style="color: maroon;">125u</span> << <span style="color: maroon;">24</span>) { x -= <span style="color: maroon;">125u</span> << <span style="color: maroon;">24</span>; z = <span style="color: maroon;">100u</span>; y = <span style="color: maroon;">10u</span>; b = <span style="color: maroon;">331u</span> << <span style="color: maroon;">21</span>; }
<span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>; z = <span style="color: maroon;">64u</span>; y = <span style="color: maroon;">8u</span>; b = <span style="color: maroon;">217u</span> << <span style="color: maroon;">21</span>; }
}
}
<span style="color: blue;">goto</span> M1;
L2: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">21</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">21</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span>; } <span style="color: blue;">goto</span> M2;
L3: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">18</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">18</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span>; } <span style="color: blue;">goto</span> M3;
L4: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">15</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">15</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span>; } <span style="color: blue;">goto</span> M4;
L5: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">12</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">12</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>; } <span style="color: blue;">goto</span> M5;
L6: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">09</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">09</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span>; } <span style="color: blue;">goto</span> M6;
L7: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">06</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">06</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span>; } <span style="color: blue;">goto</span> M7;
L8: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">03</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">03</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span>; } <span style="color: blue;">goto</span> M8;
M1: <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M2: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M3: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M4: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M5: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M6: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M7: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">03</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M8: <span style="color: blue;">return</span> x <= (y + z) * <span style="color: maroon;">3</span> ? y : y + <span style="color: maroon;">1u</span>;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] cubes = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[<span style="color: maroon;">2048</span>];
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> fill_cubes()
{
<span style="color: blue;">int</span> i = <span style="color: maroon;">0</span>; <span style="color: blue;">uint</span> a = <span style="color: maroon;">0</span><span style="color: maroon;">u</span>, b = <span style="color: maroon;">1</span><span style="color: maroon;">u</span>, c = <span style="color: maroon;">6</span><span style="color: maroon;">u</span>;
<span style="color: blue;">do</span>
{
cubes[i++] = a;
a += b; b += c; c += <span style="color: maroon;">6u</span>;
}
<span style="color: blue;">while</span> (i < <span style="color: maroon;">1626</span>);
<span style="color: blue;">do</span> cubes[i++] = ~<span style="color: maroon;">0u</span>;
<span style="color: blue;">while</span> (i < <span style="color: maroon;">2048</span>);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cro32t(<span style="color: blue;">uint</span> x)
{
<span style="color: blue;">uint</span> i = <span style="color: maroon;">1u</span> << <span style="color: maroon;">10</span>, j = <span style="color: maroon;">1u</span> << <span style="color: maroon;">9</span>, u = <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>;
<span style="color: blue;">for</span> (; j > <span style="color: maroon;">0</span>; j >>= <span style="color: maroon;">1</span>)
{
<span style="color: blue;">if</span> (x < u) i -= j;
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (x > u) i += j;
<span style="color: blue;">else</span> <span style="color: blue;">return</span> i < <span style="color: maroon;">1625u </span>? i : <span style="color: maroon;">1625u</span>;
u = cubes[i];
}
<span style="color: blue;">return</span> x < u ? i - <span style="color: maroon;">1</span> : i;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Stopwatch sw = <span style="color: blue;">new</span> Stopwatch();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main(<span style="color: blue;">string</span>[] args)
{
cro32_all(); <span style="color: green;">// ~1 minute, comment out "cro32t" , uint[] cubes, etc.</span>
<span style="color: green;">// Or try seperate executables.</span>
fill_cubes();
cro32t_all(); <span style="color: green;">// ~2 minutes</span>
Console.ReadLine();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> cro32_all()
{
<span style="color: blue;">uint</span> x; <span style="color: blue;">double</span> t;
cro32(~<span style="color: maroon;">0u</span>);
sw.Restart();
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x < ~<span style="color: maroon;">0u</span>; x++) cro32(x);
sw.Stop();
t = sw.ElapsedMilliseconds;
sw.Restart();
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x < ~<span style="color: maroon;">0u</span>; x++) ; <span style="color: green;">// nada</span>
sw.Stop();
t -= sw.ElapsedMilliseconds;
Console.Write(x + <span style="color: maroon;">" roots in "</span> + t + <span style="color: maroon;">" ms, "</span>);
Console.WriteLine(<span style="color: maroon;">"mean time {0:.00} ns"</span>, t * <span style="color: maroon;">1000000</span> / x);
<span style="color: green;">// 4294967295 roots in 50686 ms, mean time 11,80 ns</span>
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> cro32t_all()
{
<span style="color: blue;">uint</span> x; <span style="color: blue;">double</span> t;
cro32t(~<span style="color: maroon;">0u</span>);
sw.Restart();
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x < ~<span style="color: maroon;">0u</span>; x++) cro32t(x);
sw.Stop();
t = sw.ElapsedMilliseconds;
sw.Restart();
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x < ~<span style="color: maroon;">0u</span>; x++) ; <span style="color: green;">// nada</span>
sw.Stop();
t -= sw.ElapsedMilliseconds;
Console.Write(x + <span style="color: maroon;">" roots in "</span> + t + <span style="color: maroon;">" ms, "</span>);
Console.WriteLine(<span style="color: maroon;">"mean time {0:.00} ns"</span>, t * <span style="color: maroon;">1000000</span> / x);
<span style="color: green;">// 4294967295 roots in 129254 ms, mean time 30,09 ns</span>
}
}</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-22991860778510673202013-10-19T12:41:00.000-07:002013-12-06T05:18:31.291-08:00Uniform pseudo random numbers in a range <div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-6ig4Uvwk0xA/UmLaoHOAhoI/AAAAAAAAAMU/IA-f3mDGJKI/s1600/r02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-6ig4Uvwk0xA/UmLaoHOAhoI/AAAAAAAAAMU/IA-f3mDGJKI/s1600/r02.jpg" /></a></div>
<pre><span style="color: green;"></span></pre>
<pre><span style="color: green;">/*
</span><span style="color: green;"><span style="color: green;"><a href="http://arxiv.org/pdf/1012.4290v1">Random number generators</a></span> (RNG) are divided in two categories,
hardware RNG, that provide “true” random numbers, and algorithmic RNG, that generate
pseudo random numbers (PRNG). Both types usually generate random numbers "X" as independent
uniform samples in a range 0, . . . 2^b − 1, with b = 8, 16, 32 or b = 64. In applications,
it is instead sometimes desirable to draw random numbers as independent uniform samples "U"
in a range " 1, . . . M ", where moreover "M" may change between drawings.
Transforming "X" to "U" , or many "X" to many "U" is sometimes known as scaling.
</span>
<span style="color: green;"><span style="color: green;"><i>Some text is copied from other sources. You find them in "References".
I found it quite hard to explain some of the underlying ideas.
I am grateful to the original authors. Their words saved me a lot of time.</i></span>
</span><span style="color: green;"><b><span style="color: green;"><b>Limits:</b>
</span></b><span style="color: green;">0 <= M <= 2^32 - 1 = uint.MaxValue
0 <= U <= M
</span><span class="Apple-style-span" style="color: red;"><b>UPDATE:</b></span><span style="color: green;"> <a href="http://bigintegers.blogspot.com/2013/11/uniform-random-numbers-in-range-part-2.html">part 2</a>
</span><b>
Example:</b> </span></pre>
<pre><span style="color: green;">Suppose a PRNG produces one random bit each time it is called, and we have: M = 5 ,
binary: M = 101. Call the generator three times to get three successive bits.
Result: 0 <= U <= 7, binary: 000 <= U <= 111. If "U > M" , than we take the next three bits
from the generator, and repeat to do so until "U <= M".
Another way to find a valid value for "U".
-Take the first, the most significant, bit from the generator.
If it's zero, take two other bits from the generator,
and return a valid value for "U": 000 or 001 or 010 or 011.
If the first bit isn't zero, so it's one,
take the second bit from the generator.
If the second bit is zero, take the third bit from the generator,
and return a valid value for "U": 100 or 101.
Finally: the first and the second bit are both set,
no need to take a third bit from the generator,
<i>a random bit is saved</i>, we have to try again.
-Take the first, the most significant, bit from the generator...
/ U = 0.. return 000 or 001 or 010 or 011
/
---< U = 10. return 100 or 101
| \
| \ U = 11 --try again--
| |
| |
----<<--------<<--------<<----
<b>The PRNG used: .Net 4.0 System.Random</b>
</span><span style="color: green;"><span style="color: green;"><span style="color: green;"><a href="http://connect.microsoft.com/VisualStudio/feedback/details/634761/system-random-serious-bug">It might have a bug</a></span></span>: The period is not guaranteed to be longer than: 2^55-1
(I do have some doubts, but no proof)
<b>Some important properties of </b></span><span style="color: green;"><b><span style="color: green;"><span style="color: green;"><a href="http://msdn.microsoft.com/en-us/library/system.random%28v=vs.100%29.aspx">System.Random</a></span></span>:
</b>
<b> Random Constructors</b>:
<span style="color: blue;">Random()</span> Initializes a new instance of the Random class, using a time-dependent value.
<span style="color: blue;"> Random(int seed)</span> Initializes a new instance of the Random class, using the specified seed.
To improve performance, create one Random object to generate many random numbers over time,
instead of repeatedly creating new Random objects to generate one random number, so:
<span style="color: blue;">private static Random rand = new Random()</span>
<b> Random Methods:</b>
<span style="color: blue;"> rand.Next()</span> Returns a positive random number, greater than or equal to zero,
<span style="color: red;"> less than</span> int.MaxValue
<span style="color: blue;"> rand.Next(int max)</span> Returns a positive random number, greater than or equal to zero,
less than max ( max >= 0 ) , ........ rand.Next(0) returns zero
<span style="color: blue;">rand.Next(int min, int max)</span> Returns a positive random number, greater than or equal to min,
less than max ( max >= min ) , ......
<span style="color: blue;"> rand.Next()</span> is about twice as fast as <span style="color: blue;">rand.Next(int max)</span> ,
<span style="color: blue;"> rand.Next(int max)</span> is almost as fast as <span style="color: blue;">rand.Next(int min, int max)</span>,
especially when you use something like: <span style="color: blue;">return min + rand.Next(max - min)</span>
It's impossible to create more than 30 random bits at once.
To create those 30 bits, use: <span style="color: blue;">rand.Next(1 << 30)</span>
Various sources warn about the lower bits of numbers generated by PRNG's, they shouldn't be random.
One way to <a href="http://www.random.org/analysis/">examine a PRNG</a> is to create a visualisation of the numbers it produces.
Humans are really good at spotting patterns, and visualisation allows you to use your eyes and
brain directly for this purpose. While you shouldn't consider this type of approach an exhaustive
or formal analysis, it is a nice and quick way to get a rough impression of a given generator's
performance. The background of the image at the top looks pretty random, no recognizable patterns.
It was created with the code at the very bottom: "<span style="color: blue;">random_bitmap()</span>"
<b>Description of the code:</b>
<span style="color: blue;">gen_nd_bits(int nd)</span> returns the needed amount of random bits. It uses a 32 bits buffer.
The buffer is replenished when necessary.
<span style="color: blue;">gen_uint_fast(uint u)</span> returns a random value between zero (incl.) and u (incl.)
It calls <span style="color: blue;">gen_nd_bits(int nd)</span> . When the value is too large another call is done.
<span style="color: blue;">gen_uint_eff(uint u)</span> uses random bits more efficiently.
It works bit by bit, from most to least significant bit. When it becomes clear that the (partial)
formed value is smaller than the upper limit ( uint u ) , remaining needed random bits are
added relatively fast. When the (partial) formed value is too large another call is done.
<b>On my trustworthy PC the average (full range) results are:
</b>
<span style="color: black;">|-----------------------|---------------|
| function | * 10^9 bits/s |
|-----------------------|---------------|
| rand.Next() | 2.9 | <span style="color: #38761d;"><-- 1 CD in 2 seconds!</span>
| rand.Next(1 << 30) | 1.5 |
| gen_nd_bits(int nd) | 1.2 |
| gen_uint_fast(uint u) | 0.9 |
| gen_uint_eff(uint u) | 0.7 |
|-----------------------|---------------|</span>
<b>The efficiency, random bits used per bit:</b>
<span style="color: blue;">gen_uint_fast(uint u)</span> 1.386 bits/bit, remarkably close to ln(4)
<span style="color: blue;">gen_uint_eff(uint u)</span> <span style="color: red;">1.044</span> bits/bit
</span><span style="color: green;"><span style="color: green;"><b>References</b>:
</span><span style="color: green;">
<a href="http://stackoverflow.com/a/18332307/1673752">José's Daylight Dices</a>
<a href="http://www.random.org/analysis/">RANDOM.ORG</a>
<a href="http://mathforum.org/library/drmath/view/65653.html">Ask Dr. Math, Probability and Random Numbers</a>
<a href="http://arxiv.org/pdf/1012.4290v1">Bit recycling for scaling random number generators</a>
<a href="http://mathnetnumerics.codeplex.com/wikipage?title=Random%20Numbers&referringTitle=Documentation">Math.NET Numerics</a>
<a href="http://msdn.microsoft.com/en-us/library/system.random%28v=vs.100%29.aspx">MSDN</a>
<a href="http://connect.microsoft.com/VisualStudio/feedback/details/634761/system-random-serious-bug">Bug ? System.Random (january 2011)</a></span>
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Drawing;<span style="color: green;"> // add a ref!</span>
<span style="color: blue;">class</span> scaled_random
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Random rand = <span style="color: blue;">new</span> Random();
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> buf = <span style="color: maroon;">0</span>; <span style="color: green;">// random bits buffer</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> av = <span style="color: maroon;">0</span>; <span style="color: green;">// available bits in buf</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> g_u = <span style="color: maroon;">0</span>; <span style="color: green;">// copy of u</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> g_nd = <span style="color: maroon;">0</span>; <span style="color: green;">// copy of nd (needed) = highest set bit of u</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> gen_nd_bits(<span style="color: blue;">int</span> nd) <span style="color: green;">// generate nd bits, 0 <= nd <= 32</span>
{
<span style="color: blue;">uint</span> x;
<span style="color: blue;">if</span> (nd == <span style="color: maroon;">0</span>) <span style="color: blue;">return</span> <span style="color: maroon;">0</span>;
<span style="color: blue;">if</span> (av <= <span style="color: maroon;">2</span>) <span style="color: green;">// buffer should contain at least 2 bits, other-</span>
{ <span style="color: green;">// wise there may be too few bits when nd > 30 </span>
buf <<= <span style="color: maroon;">30</span>;
buf |= (<span style="color: blue;">uint</span>)rand.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>);
av += <span style="color: maroon;">30</span>;
}
<span style="color: blue;">if</span> (av < nd)
{
x = buf;
buf = (<span style="color: blue;">uint</span>)rand.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>);
nd -= av;
x <<= nd;
x |= buf << <span style="color: maroon;">32</span> - nd >> <span style="color: maroon;">32</span> - nd;
buf >>= nd;
av = <span style="color: maroon;">30</span> - nd;
}
<span style="color: blue;">else</span>
{
x = buf << <span style="color: maroon;">32</span> - nd >> <span style="color: maroon;">32</span> - nd;
buf >>= nd;
av -= nd;
}
<span style="color: blue;">return</span> x;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> gen_uint_fast(<span style="color: blue;">uint</span> u) <span style="color: green;">// 0 <= returned value <= u </span>
{
<span style="color: blue;">uint</span> x;
<span style="color: blue;">if</span> (u == <span style="color: maroon;">0</span>) <span style="color: blue;">return</span> <span style="color: maroon;">0</span>;
<span style="color: blue;">if</span> (u != g_u) <span style="color: green;">// if u changes, g_nd might change </span>
{
g_u = u;
g_nd = nob(u); <span style="color: green;">// needed: number of bits of u</span>
}
L0: x = gen_nd_bits(g_nd);
<span style="color: blue;">if</span> (x <= u) <span style="color: blue;">return </span>x;
<span style="color: blue;"><span style="color: blue;">goto</span> </span>L0;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">bool</span> ones = <span style="color: maroon;">false</span>; <span style="color: green;">// true if u is (binary) 1, 11, 111, 1111, ...</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> gen_uint_eff(<span style="color: blue;">uint</span> u) <span style="color: green;">// 0 <= returned value <= u </span>
{
<span style="color: blue;">uint</span> x; <span style="color: blue;">int</span> nd;
<span style="color: blue;">if</span> (u == <span style="color: maroon;">0</span>) <span style="color: blue;">return</span> <span style="color: maroon;">0</span>;
<span style="color: blue;">if</span> (u != g_u)
{
g_u = u;
g_nd = nob(u);
ones = (u + <span style="color: maroon;">1</span> & u) == <span style="color: maroon;">0</span>;
}
<span style="color: blue;">if</span> (ones) <span style="color: blue;">return</span> gen_nd_bits(g_nd);
L0: nd = g_nd - <span style="color: maroon;">1</span>;
<span style="color: blue;">if</span> (gen_nd_bits(<span style="color: maroon;">1</span>) == <span style="color: maroon;">0</span>) <span style="color: blue;">return</span> gen_nd_bits(nd);
x = <span style="color: maroon;">1u</span> << nd;
nd--;
<span style="color: blue;">while</span> (nd > <span style="color: maroon;">0</span>)
{
x |= gen_nd_bits(<span style="color: maroon;">1</span>) << nd;
<span style="color: blue;">if</span> (x >> nd < u >> nd) <span style="color: blue;">return</span> x | gen_nd_bits(nd);
<span style="color: blue;">if</span> (x > u) <span style="color: blue;">goto</span> L0;
nd--;
}
x |= gen_nd_bits(<span style="color: maroon;">1</span>);
<span style="color: blue;">if</span> (x <= u) <span style="color: blue;">return</span> x;
<span style="color: blue;">goto</span> L0;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> nob(<span style="color: blue;">uint</span> u) <span style="color: green;">// number of bits, position of the highest set bit, u > 0 </span>
{ <span style="color: green;">// afaik fastest way in C#</span>
<span style="color: blue;">return</span>
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">16</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">08</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">04</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">02</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">01</span> ? <span style="color: maroon;">01</span> : <span style="color: maroon;">02</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">03</span> ? <span style="color: maroon;">03</span> : <span style="color: maroon;">04</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">05</span> ? <span style="color: maroon;">05</span> : <span style="color: maroon;">06</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">07</span> ? <span style="color: maroon;">07</span> : <span style="color: maroon;">08</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">10</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span> ? <span style="color: maroon;">09</span> : <span style="color: maroon;">10</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">11</span> ? <span style="color: maroon;">11</span> : <span style="color: maroon;">12</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">14</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">13</span> ? <span style="color: maroon;">13</span> : <span style="color: maroon;">14</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span> ? <span style="color: maroon;">15</span> : <span style="color: maroon;">16</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">17</span> ? <span style="color: maroon;">17</span> : <span style="color: maroon;">18</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">19</span> ? <span style="color: maroon;">19</span> : <span style="color: maroon;">20</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">22</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span> ? <span style="color: maroon;">21</span> : <span style="color: maroon;">22</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">23</span> ? <span style="color: maroon;">23</span> : <span style="color: maroon;">24</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">28</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">26</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">25</span> ? <span style="color: maroon;">25</span> : <span style="color: maroon;">26</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">27</span> ? <span style="color: maroon;">27</span> : <span style="color: maroon;">28</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span> ? u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">29</span> ? <span style="color: maroon;">29</span> : <span style="color: maroon;">30</span> :
u < <span style="color: maroon;">1u</span> << <span style="color: maroon;">31</span> ? <span style="color: maroon;">31</span> : <span style="color: maroon;">32</span>;
}
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
test_gen_uint_fast(<span style="color: maroon;">17</span>);
test_gen_uint_eff(<span style="color: maroon;">54</span>);
test_4_buckets_fast(<span style="color: maroon;">123456789</span>);
test_4_buckets_eff(~<span style="color: maroon;">0u</span>);
random_bitmap();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> test_gen_uint_fast(<span style="color: blue;">uint</span> u)
{
<span style="color: blue;">int</span> i; <span style="color: blue;">int</span>[] c = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[u + <span style="color: maroon;">1</span>];
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">1000000</span>; i++) c[gen_uint_fast(u)]++;
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i <= u; i++) Console.WriteLine(<span style="color: maroon;">"{0,3}{1,7}"</span>, i, c[i]);
Console.ReadLine(); Console.Clear();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> test_gen_uint_eff(<span style="color: blue;">uint</span> u)
{
<span style="color: blue;">int</span> i; <span style="color: blue;">int</span>[] c = <span style="color: blue;">new</span> <span style="color: blue;">int</span>[u + <span style="color: maroon;">1</span>];
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">1000000</span>; i++) c[gen_uint_eff(u)]++;
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i <= u; i++) Console.WriteLine(<span style="color: maroon;">"{0,3}{1,7}"</span>, i, c[i]);
Console.ReadLine(); Console.Clear();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> test_4_buckets_fast(<span style="color: blue;">uint</span> u) <span style="color: green;">// rounding errors!</span>
{
<span style="color: blue;">uint</span> x; <span style="color: blue;">int</span> i, c0 = <span style="color: maroon;">0</span>, c1 = <span style="color: maroon;">0</span>, c2 = <span style="color: maroon;">0</span>, c3 = <span style="color: maroon;">0</span>;
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">1000000</span>; i++)
{
x = gen_uint_fast(u);
<span style="color: blue;">if</span> (x < u / <span style="color: maroon;">4</span>) c0++;
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (x < u / <span style="color: maroon;">2</span>) c1++;
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (x < u / <span style="color: maroon;">2</span> + u / <span style="color: maroon;">4</span>) c2++; <span style="color: blue;">else</span> c3++;
}
Console.WriteLine(c0); Console.WriteLine(c1);
Console.WriteLine(c2); Console.WriteLine(c3);
Console.ReadLine(); Console.Clear();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> test_4_buckets_eff(<span style="color: blue;">uint</span> u)
{
<span style="color: blue;">uint</span> x; <span style="color: blue;">int</span> i, c0 = <span style="color: maroon;">0</span>, c1 = <span style="color: maroon;">0</span>, c2 = <span style="color: maroon;">0</span>, c3 = <span style="color: maroon;">0</span>;
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">1000000</span>; i++)
{
x = gen_uint_eff(u);
<span style="color: blue;">if</span> (x < u / <span style="color: maroon;">4</span>) c0++;
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (x < u / <span style="color: maroon;">2</span>) c1++;
<span style="color: blue;">else</span> <span style="color: blue;">if</span> (x < u / <span style="color: maroon;">2</span> + u / <span style="color: maroon;">4</span>) c2++; <span style="color: blue;">else</span> c3++;
}
Console.WriteLine(c0); Console.WriteLine(c1);
Console.WriteLine(c2); Console.WriteLine(c3);
Console.ReadLine(); Console.Clear();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> random_bitmap()
{
<span style="color: blue;">int</span> xmax = <span style="color: maroon;">900</span>;
<span style="color: blue;">int</span> ymax = <span style="color: maroon;">900</span>;
Bitmap bmp = <span style="color: blue;">new</span> Bitmap(xmax + <span style="color: maroon;">1</span>, ymax + <span style="color: maroon;">1</span>);
<span style="color: blue;">int</span> x, y, z;
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x <= xmax; x++)
{
<span style="color: blue;">for</span> (y = <span style="color: maroon;">0</span>; y <= ymax; y++)
{
z = <span style="color: maroon;">7</span> & rand.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">30</span>);
<span style="color: blue;">switch</span> (z)
{
<span style="color: blue;">case</span> <span style="color: maroon;">0</span>: bmp.SetPixel(x, y, Color.Yellow); <span style="color: blue;">break</span>;
<span style="color: blue;">case</span> <span style="color: maroon;">1</span>: bmp.SetPixel(x, y, Color.Orange); <span style="color: blue;">break</span>;
<span style="color: blue;">case</span> <span style="color: maroon;">2</span>: bmp.SetPixel(x, y, Color.Purple); <span style="color: blue;">break</span>;
<span style="color: blue;">case</span> <span style="color: maroon;">3</span>: bmp.SetPixel(x, y, Color.White); <span style="color: blue;">break</span>;
<span style="color: blue;">case</span> <span style="color: maroon;">4</span>: bmp.SetPixel(x, y, Color.Green); <span style="color: blue;">break</span>;
<span style="color: blue;">case</span> <span style="color: maroon;">5</span>: bmp.SetPixel(x, y, Color.Black); <span style="color: blue;">break</span>;
<span style="color: blue;">case</span> <span style="color: maroon;">6</span>: bmp.SetPixel(x, y, Color.Blue); <span style="color: blue;">break</span>;
<span style="color: blue;">case</span> <span style="color: maroon;">7</span>: bmp.SetPixel(x, y, Color.Red); <span style="color: blue;">break</span>;
}
}
}
bmp.Save(xmax.ToString() + <span style="color: maroon;">".bmp"</span>);
}
}
</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-87456255331521757392013-09-26T03:26:00.000-07:002013-11-15T12:42:40.824-08:00Fast Cube Root ( < 2^32 )<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-V7NDNLEVg1A/UkQG_Tn7BbI/AAAAAAAAAL8/IwJAzhQ6VmY/s1600/Screenshot-gac2004-i01.pdf.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-V7NDNLEVg1A/UkQG_Tn7BbI/AAAAAAAAAL8/IwJAzhQ6VmY/s1600/Screenshot-gac2004-i01.pdf.jpg" /></a></div>
<pre><span style="color: green;">/* <span style="color: red;">**</span>
The time to take a cube root from a 32 bits uint was: < 26 ns (mean: < 22 ns)
new time: < <span style="color: red;">14</span> ns (mean: < <span style="color: red;">13</span> ns)
The trick used for <a href="http://bigintegers.blogspot.com/2013/09/small-square-roots-232.html">small square roots</a> is used again: "unroll the loop".
First step: A binary search, the "if" statements, large values ( >= 1u << 24 )
are found relatively faster, small values ( < 64 ) are handled during the search.
Second step: A jump into the unrolled loop, the "labels".
|--------------------------------|
| cro32(x) |
|-----|-----||------------|------|
| x | ns || x | ns |
|-----|-----||------------|------|
| 0 | 2,4 || 511 | 4,6 |
| 1 | 2,3 || 1023 | 5,3 |
| 3 | 2,3 || 2047 | 5,3 |
| 7 | 2,3 || 4095 | 5,0 |
| 15 | 3,6 || 32768 | 7,2 |
| 31 | 3,0 || 1048576 | 8,5 |
| 63 | 3,0 || 268435456 | 12,0 |
| 64 | 5,0 || 536870912 | 12,3 | heaviest case,
| 65 | 5,0 || 1070599167 | 13,7 | <== 1070599167 is the
| 100 | 5,0 || 1070599168 | 13,7 | 3th power of 1023,
| 127 | 5,0 || 1073741824 | 12,3 | binary: 1111111111
| 128 | 5,0 || 1073774592 | 12,0 |
| 255 | 4,6 || 2147483648 | 12,3 |
| 256 | 4,6 || 4294967295 | 12,0 |
|-----|-----||------------|------|
4294967295 roots in 53884 ms, mean time 12,55 ns, faster than square root!
<span style="color: red;">UPDATE</span> 2013/11/04 50686 ms, mean time <span style="color: red;">11,80</span> ns, see: <a href="http://bigintegers.blogspot.com/2013/11/fast-cube-root-232-part-2.html">part 2</a>
<span style="color: red;">**</span> Original version: Figure 2: Architecture of the iteration (alternative A)
<a href="http://ac.usc.es/system/files/gac2004-i01.pdf.gz">A digit-by-digit algorithm for radix-2 cube root and its implementation</a> (2004)
J.-A.Pineiro, J.D.Bruguera, L.Ciminiera, P.Montuschi
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Diagnostics;
<span style="color: blue;">class</span> cro_32
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cro32(<span style="color: blue;">uint</span> x)
{
<span style="color: blue;">uint</span> y = <span style="color: maroon;">4u</span>, z = <span style="color: maroon;">16u</span>, b = <span style="color: maroon;">0u</span>;
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">03</span>)
<span style="color: blue;">return</span> x == <span style="color: maroon;">0u</span> ? <span style="color: maroon;">0u</span> : <span style="color: maroon;">1u</span>;
<span style="color: blue;">else</span>
<span style="color: blue;">return</span> x < <span style="color: maroon;">27u</span> ? <span style="color: maroon;">2u</span> : <span style="color: maroon;">3u</span>;
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span>) <span style="color: blue;">goto</span> L8; <span style="color: blue;">else</span> <span style="color: blue;">goto</span> L7;
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>) <span style="color: blue;">goto</span> L6; <span style="color: blue;">else</span> <span style="color: blue;">goto</span> L5;
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span>) <span style="color: blue;">goto</span> L4; <span style="color: blue;">else</span> <span style="color: blue;">goto</span> L3;
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">27</span>) <span style="color: blue;">goto</span> L2; <span style="color: blue;">else</span> <span style="color: blue;">goto</span> L1;
<span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">27</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">27</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>; } <span style="color: blue;">goto</span> M0;
L1: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">24</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">24</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">27</span>; } <span style="color: blue;">goto</span> M1;
L2: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">21</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">21</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span>; } <span style="color: blue;">goto</span> M2;
L3: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">18</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">18</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span>; } <span style="color: blue;">goto</span> M3;
L4: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">15</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">15</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span>; } <span style="color: blue;">goto</span> M4;
L5: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">12</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">12</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>; } <span style="color: blue;">goto</span> M5;
L6: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">09</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">09</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span>; } <span style="color: blue;">goto</span> M6;
L7: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">06</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">06</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span>; } <span style="color: blue;">goto</span> M7;
L8: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">27u</span> << <span style="color: maroon;">03</span>) { x -= <span style="color: maroon;">27u</span> << <span style="color: maroon;">03</span>; z = <span style="color: maroon;">36u</span>; y = <span style="color: maroon;">6u</span>; } <span style="color: blue;">else</span> { x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span>; } <span style="color: blue;">goto</span> M8;
M0: <span style="color: blue;">if</span> (x >= <span style="color: maroon;">61u</span> << <span style="color: maroon;">24</span>) { x -= <span style="color: maroon;">61u</span> << <span style="color: maroon;">24</span>; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M1: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M2: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M3: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M4: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M5: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M6: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M7: b = (y + z) * <span style="color: maroon;">3</span> + <span style="color: maroon;">1u</span> << <span style="color: maroon;">03</span>; <span style="color: blue;">if</span> (x >= b) { x -= b; z += y * <span style="color: maroon;">2</span> + <span style="color: maroon;">1u</span>; y += <span style="color: maroon;">1u</span>; } y *= <span style="color: maroon;">2</span>; z *= <span style="color: maroon;">4</span>;
M8: <span style="color: blue;">return</span> x <= (y + z) * <span style="color: maroon;">3</span> ? y : y + <span style="color: maroon;">1u</span>;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Stopwatch sw = <span style="color: blue;">new</span> Stopwatch();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
cro32(<span style="color: maroon;">225</span>);
cro32(<span style="color: maroon;">1070599167</span>);
check_perfect_cubes32();
time_cro32();
cro32_all();
Console.ReadLine();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> check_perfect_cubes32()
{
<span style="color: blue;">uint</span> n = <span style="color: maroon;">0</span>, a = <span style="color: maroon;">0</span>, b = <span style="color: maroon;">1</span>, c = <span style="color: maroon;">6</span>;
<span style="color: blue;">while</span> (n <= <span style="color: maroon;">1625</span>)
{
<span style="color: blue;">if</span> (n != cro32(a)) Console.WriteLine(<span style="color: maroon;">"WRONG"</span>);
a += b; b += c; c += <span style="color: maroon;">6</span>; n++;
}
Console.WriteLine(<span style="color: maroon;">"CHECKED PERFECT CUBES"</span>);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> time_cro32()
{
<span style="color: blue;">int</span> i, j; <span style="color: blue;">uint</span> x; <span style="color: blue;">double</span> t;
<span style="color: blue;">uint</span>[] a = { <span style="color: maroon;">0</span>, <span style="color: maroon;">1</span>, <span style="color: maroon;">3</span>, <span style="color: maroon;">7</span>, <span style="color: maroon;">15</span>, <span style="color: maroon;">31</span>, <span style="color: maroon;">63</span>, <span style="color: maroon;">64</span>, <span style="color: maroon;">65</span>,
<span style="color: maroon;">100</span>, <span style="color: maroon;">127</span>, <span style="color: maroon;">128</span>, <span style="color: maroon;">255</span>, <span style="color: maroon;">256</span>, <span style="color: maroon;">511</span>, <span style="color: maroon;">1023</span>, <span style="color: maroon;">2047</span>, <span style="color: maroon;">4095</span>,
<span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>, <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span>, <span style="color: maroon;">1u</span> << <span style="color: maroon;">28</span> ,<span style="color: maroon;">1u</span> << <span style="color: maroon;">29</span> , <span style="color: maroon;">1070599167</span>,
<span style="color: maroon;">1070599168</span>,<span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>,(<span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>) + (<span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>), <span style="color: maroon;">1u</span> << <span style="color: maroon;">31</span>, ~<span style="color: maroon;">0u</span> };
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
Console.WriteLine(<span style="color: maroon;">"| x | ns |"</span>);
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
<span style="color: blue;">for</span> (j = <span style="color: maroon;">0</span>; j < a.Length; j++)
{
x = a[j];
cro32(x);
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">10000000</span>; i++) cro32(x);
sw.Stop();
t = sw.ElapsedMilliseconds;
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">10000000</span>; i++) ; <span style="color: green;">// nada</span>
sw.Stop();
t -= sw.ElapsedMilliseconds;
Console.WriteLine(<span style="color: maroon;">"| {0,10} | {1:00.0} |"</span>, x, t / <span style="color: maroon;">10</span>);
}
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
Console.WriteLine();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> cro32_all()
{
<span style="color: blue;">uint</span> x; <span style="color: blue;">double</span> t;
cro32(~<span style="color: maroon;">0u</span>);
sw.Restart();
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x < ~<span style="color: maroon;">0u</span>; x++) cro32(x);
sw.Stop();
t = sw.ElapsedMilliseconds;
sw.Restart();
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x < ~<span style="color: maroon;">0u</span>; x++) ; <span style="color: green;">// nada</span>
sw.Stop();
t -= sw.ElapsedMilliseconds;
Console.Write(x + <span style="color: maroon;">" roots in "</span> + t + <span style="color: maroon;">" ms, "</span>);
Console.WriteLine(<span style="color: maroon;">"mean time {0:.00} ns"</span>, t * <span style="color: maroon;">1000000</span> / x);
<span style="color: green;">// 4294967295 roots in 53884 ms, mean time 12,55 ns</span>
}
}</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-69386605773801757032013-09-02T10:09:00.000-07:002013-11-05T11:13:22.328-08:00Fast Square Root ( < 2^32 )<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-YWuCzbR9Src/UiTEtWz8P_I/AAAAAAAAALs/GQNYGJ97Fao/s1600/b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-YWuCzbR9Src/UiTEtWz8P_I/AAAAAAAAALs/GQNYGJ97Fao/s1600/b.jpg" /></a></div>
<pre></pre>
<pre><span style="color: green;">/*
The time to take a square root from a 32 bits uint was: ~35 ns, new time: <<span style="color: red;">16</span> ns (mean: <14 ns).
It's based on: <a href="http://www.hackersdelight.org/hdcodetxt/isqrt.c.txt">A square root hardware algorithm from Guy L. Steele,Jr.</a>
The slightly optimized C# version below is nearly twice as fast. A few "goto Label" statements
are used, they are fairly easy to remove, but I doubt it will be any faster (at all).
|--------------------------------|
| Times "cro32(x)" |
| Athlon X4, XP, 2 GB |
|-----|-----||------------|------|
| x | ns || x | ns |
|-----|-----||------------|------|
| 0 | 1,6 || 511 | 4,3 |
| 1 | 1,6 || 1023 | 4,6 |
| 3 | 1,6 || 2047 | 5,0 |
| 7 | 2,3 || 4095 | 5,6 | 4294967295 roots in 56962 ms,
| 15 | 2,3 || 32768 | 6,6 | mean time 13,26 ns.
| 31 | 3,6 || 1048576 | 10,0 |
| 63 | 3,0 || 268435456 | 13,7 |
| 64 | 4,3 || 536870912 | 11,4 |
| 65 | 4,3 || 1070599167 | 13,0 |
| 100 | 5,0 || 1073741824 | 15,1 |
| 127 | 4,3 || 1073741824 | 15,1 |
| 128 | 4,3 || 1073774592 | 15,1 |
| 255 | 4,0 || 2147483648 | 13,1 |
| 256 | 4,7 || 4294967295 | 15,7 |
|-----|-----||------------|------|
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Diagnostics;
<span style="color: blue;">class</span> Square_Root
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> sro32(<span style="color: blue;">uint</span> x)
{
<span style="color: blue;">uint</span> y, z;
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">16</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">08</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">04</span>) <span style="color: blue;">return</span> x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">02</span> ? x + <span style="color: maroon;">3u</span> >> <span style="color: maroon;">2</span> : x + <span style="color: maroon;">15u</span> >> <span style="color: maroon;">3</span>;
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span>)
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">03</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">04</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">02</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">02</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">02</span>; } <span style="color: blue;">goto</span> L0; }
<span style="color: blue;">else</span>
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">05</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">04</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">04</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">04</span>; } <span style="color: blue;">goto</span> L1; }
<span style="color: blue;">else</span> <span style="color: #38761d;">// slower (on my pc): .... y = 3u << 04; } goto L1; }</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">10</span>)
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">07</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">08</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">06</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">06</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span>; } <span style="color: blue;">goto</span> L2; }
<span style="color: blue;">else</span>
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">10</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">08</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">08</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">08</span>; } <span style="color: blue;">goto</span> L3; }
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">14</span>)
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">11</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">10</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">10</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">10</span>; } <span style="color: blue;">goto</span> L4; }
<span style="color: blue;">else</span>
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">13</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">14</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">12</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">12</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span>; } <span style="color: blue;">goto</span> L5; }
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span>)
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">16</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">14</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">14</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">14</span>; } <span style="color: blue;">goto</span> L6; }
<span style="color: blue;">else</span>
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">17</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">16</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">16</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">16</span>; } <span style="color: blue;">goto</span> L7; }
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">22</span>)
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">19</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">18</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">18</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span>; } <span style="color: blue;">goto</span> L8; }
<span style="color: blue;">else</span>
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">22</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">20</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">20</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span>; } <span style="color: blue;">goto</span> L9; }
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">28</span>)
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">26</span>)
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">23</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">22</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">22</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">22</span>; } <span style="color: blue;">goto</span> La; }
<span style="color: blue;">else</span>
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">25</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">26</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">24</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">24</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span>; } <span style="color: blue;">goto</span> Lb; }
<span style="color: blue;">else</span>
<span style="color: blue;">if</span> (x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>)
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">27</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">28</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">26</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">26</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">26</span>; } <span style="color: blue;">goto</span> Lc; }
<span style="color: blue;">else</span>
{ y = <span style="color: maroon;">1u</span> << <span style="color: maroon;">29</span>; x -= <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>; <span style="color: blue;">if</span> (x >= <span style="color: maroon;">5u</span> << <span style="color: maroon;">28</span>) { x -= <span style="color: maroon;">5u</span> << <span style="color: maroon;">28</span>; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">28</span>; } }
z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">26</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">26</span>; }
Lc: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span>; }
Lb: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">22</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">22</span>; }
La: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span>; }
L9: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span>; }
L8: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">16</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">16</span>; }
L7: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">14</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">14</span>; }
L6: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span>; }
L5: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">10</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">10</span>; }
L4: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">08</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">08</span>; }
L3: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span>; }
L2: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">04</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">04</span>; }
L1: z = y | <span style="color: maroon;">1u</span> << <span style="color: maroon;">02</span>; y /= <span style="color: maroon;">2</span>; <span style="color: blue;">if</span> (x >= z) { x -= z; y |= <span style="color: maroon;">1u</span> << <span style="color: maroon;">02</span>; }
L0: <span style="color: blue;">return</span> x > y ? y / <span style="color: maroon;">2</span> | <span style="color: maroon;">1u</span> : y / <span style="color: maroon;">2</span>;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Stopwatch sw = <span style="color: blue;">new</span> Stopwatch();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
Console.WriteLine(sro32(<span style="color: maroon;">4</span>));
Console.WriteLine(sro32(<span style="color: maroon;">40</span>));
Console.WriteLine(sro32(<span style="color: maroon;">400</span>));
Console.WriteLine(sro32(<span style="color: maroon;">4000</span>));
Console.WriteLine(sro32(<span style="color: maroon;">40000</span>));
Console.WriteLine(sro32(<span style="color: maroon;">400000</span>));
Console.WriteLine(sro32(<span style="color: maroon;">4000000</span>));
Console.WriteLine(sro32(<span style="color: maroon;">40000000</span>));
Console.WriteLine(sro32(<span style="color: maroon;">400000000</span>));
Console.WriteLine(sro32(<span style="color: maroon;">4000000000</span>));
test_perfect_squares();
time_sro32();
sro32_all(); <span style="color: green;">// ~1 minute </span>
Console.ReadLine();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> test_perfect_squares()
{
<span style="color: blue;">uint</span> n = <span style="color: maroon;">0</span>, a = <span style="color: maroon;">0</span>, b = <span style="color: maroon;">1</span>;
<span style="color: blue;">do</span>
{
<span style="color: blue;">if</span> (sro32(a) != n) Console.WriteLine(<span style="color: maroon;">"WRONG"</span>);
a += b;
b += <span style="color: maroon;">2</span>;
}
<span style="color: blue;">while</span> (n++ < <span style="color: maroon;">65535</span>);
Console.WriteLine(<span style="color: maroon;">"Perfect squares tested"</span>);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> time_sro32()
{
<span style="color: blue;">int</span> i, j; <span style="color: blue;">uint</span> x; <span style="color: blue;">double</span> t;
<span style="color: green;">//uint[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };</span>
<span style="color: blue;">uint</span>[] a = { <span style="color: maroon;">0</span>, <span style="color: maroon;">1</span>, <span style="color: maroon;">3</span>, <span style="color: maroon;">7</span>, <span style="color: maroon;">15</span>, <span style="color: maroon;">31</span>, <span style="color: maroon;">63</span>, <span style="color: maroon;">64</span>, <span style="color: maroon;">65</span>,
<span style="color: maroon;">100</span>, <span style="color: maroon;">127</span>, <span style="color: maroon;">128</span>, <span style="color: maroon;">255</span>, <span style="color: maroon;">256</span>, <span style="color: maroon;">511</span>, <span style="color: maroon;">1023</span>, <span style="color: maroon;">2047</span>, <span style="color: maroon;">4095</span>,
<span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>, <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span>, <span style="color: maroon;">1u</span> << <span style="color: maroon;">28</span> ,<span style="color: maroon;">1u</span> << <span style="color: maroon;">29</span> , <span style="color: maroon;">1070599167</span>,
<span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>,<span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>,(<span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>) + (<span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>), <span style="color: maroon;">1u</span> << <span style="color: maroon;">31</span>, <span style="color: maroon;">0xfffe0001u</span>, ~<span style="color: maroon;">0u</span> };
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
Console.WriteLine(<span style="color: maroon;">"| x | ns |"</span>);
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
<span style="color: blue;">for</span> (j = <span style="color: maroon;">0</span>; j < a.Length; j++)
{
x = a[j];
sro32(x);
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">10000000</span>; i++) sro32(x);
sw.Stop();
t = sw.ElapsedMilliseconds;
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">10000000</span>; i++) ; <span style="color: green;">// nada</span>
sw.Stop();
t -= sw.ElapsedMilliseconds;
Console.WriteLine(<span style="color: maroon;">"| {0,10} | {1:00.0} |"</span>, x, t / <span style="color: maroon;">10</span>);
}
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
Console.WriteLine();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> sro32_all()
{
<span style="color: blue;">uint</span> x; <span style="color: blue;">double</span> t;
sro32(~<span style="color: maroon;">0u</span>);
sw.Restart();
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x < ~<span style="color: maroon;">0u</span>; x++) sro32(x);
sw.Stop();
t = sw.ElapsedMilliseconds;
sw.Restart();
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x < ~<span style="color: maroon;">0u</span>; x++) ; <span style="color: green;">// nada</span>
sw.Stop();
t -= sw.ElapsedMilliseconds;
Console.Write(x + <span style="color: maroon;">" roots in "</span> + t + <span style="color: maroon;">" ms, "</span>);
Console.WriteLine(<span style="color: maroon;">"mean time {0:.00} ns"</span>,
(<span style="color: blue;">double</span>)(t) * <span style="color: maroon;">1000000</span> / x);
<span style="color: green;">// 4294967295 roots in 56962 ms, mean time 13,26 ns</span>
}
}</pre>
<pre><span style="color: #6aa84f;">//------------------------------------------------------------</span>
<span style="color: #6aa84f;">// Another one, slower, the line "t = ..." is done many times.
//<span style="color: black;"><span style="color: #6aa84f;">
//</span> <span style="color: blue;">private static uint</span> sro32s(<span style="color: blue;">uint</span> x)<span style="color: #6aa84f;">
//</span> <span style="color: blue;">uint</span> y1 = </span></span><span style="color: maroon;">0</span><span style="color: #6aa84f;"><span style="color: black;">, y2 = </span></span><span style="color: #6aa84f;"><span style="color: black;"><span style="color: maroon;">0</span>, t; <span style="color: blue;">int</span> k = </span></span><span style="color: #6aa84f;"><span style="color: black;"><span style="color: maroon;">15</span>;<span style="color: #6aa84f;">
//</span> <span style="color: blue;">for</span> (; k >= </span></span><span style="color: #6aa84f;"><span style="color: black;"><span style="color: maroon;">0</span>; k--)</span>
//</span> {<span style="color: #6aa84f;">
//</span> t = y2 + (y1 << k + <span style="color: maroon;">1</span>) | <span style="color: maroon;"><span style="color: black;">(</span>1u</span> << k * <span style="color: maroon;">2</span>);<span style="color: #6aa84f;">
//</span> <span style="color: blue;">if</span> (x >= t) { y2 = t; y1 |= <span style="color: maroon;">1u</span> << k; }<span style="color: #6aa84f;">
//</span> }<span style="color: #6aa84f;">
//</span> <span style="color: blue;">return</span> y1;<span style="color: #6aa84f;">
//-----------------------------------------------------------</span></pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-1152399323110088142013-08-23T08:41:00.001-07:002013-09-28T06:08:18.262-07:00Small Cube Roots ( < 2^64 )<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Y0eNJV_zdPE/Uhd_z0_1MWI/AAAAAAAAALc/GgWeV_xJ0Jg/s1600/ccr.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-Y0eNJV_zdPE/Uhd_z0_1MWI/AAAAAAAAALc/GgWeV_xJ0Jg/s1600/ccr.jpg" /></a></div>
<pre><span style="color: green;">
/*
The time to take a cube root from a 64 bits ulong was: ~330 ns, new time: <<span style="color: red;"> 75</span> ns
The time to take a cube root from a 32 bits uint was: ~25 ns, new time: < 22 ns (mean)
<span style="color: red;">* UPDATE (2013-09-22) new time for 64 bits: < 70 ns, casting float to int is faster than
casting float to uint.
</span>
The 64 bits version:
<span style="color: red;"><a href="http://www.hackersdelight.org/hdcodetxt/acbrt.c.txt">www.hackersdelight.org/hdcodetxt/acbrt.c.txt</a></span>
Why? <a href="http://blog.quenta.org/2012/09/0x5f3759df.html"><span class="Apple-style-span" style="color: blue;">0x2a5137a0</span></a>
A union data type is used, not available in C#, first work around: "BitConverter", at the
bottom: "cro64old(x)". It takes ~110 ns, "BitConverter" takes ~10 ns, it's used four times,
so 40 ns are gone. A better solution:
<a href="http://www.hanselman.com/blog/UnionsOrAnEquivalentInCSairamasTipOfTheDay.aspx">Unions (or an equivalent) in C# - Sairama's Tip of the Day</a>
A 63 bits version might be slightly faster, no overflow checks, less correction loops?
The 32 bits version:
A while loop is replaced by a "do while", leading (triple) zero bits are counted to avoid
useless iterations, all (4294967295) roots in 92,7 s, mean time 21,6 ns.
<span style="color: red;">** UPDATE (2013-09-26) new time for 32 bits: < 15 ns, see: <a href="http://bigintegers.blogspot.com/2013/09/fast-cube-root-232.html">Fast Cube Root</a> </span>
|-------------||--------------------------||-------------------------------------------|
| cro12(x) || cr032(x) || cro64(random x) |
|------|------||------------|-------------||------|----------------------|-------------|
| x | ns || x | ns <span style="color: red;">**</span> || bits | x | ns <span style="color: red;"> * </span> |<span style="color: red;"></span>
|------|------||------------|------|------||------|----------------------|------|------|
| 0 | 3,3 || 0 | 5,8 | 2,4 || 64 | 13397031575470575331 | 74,7 | 69,8 |
| 1 | 3,7 || 1 | 6,5 | 2,3 || 63 | 6512002244030281881 | 70,4 | 66,8 |
| 3 | 5,2 || 3 | 6,5 | 2,3 || 62 | 4508122487018397160 | 73,6 | 68,5 |
| 7 | 5,3 || 7 | 6,5 | 2,3 || 61 | 1458795770683441400 | 74,0 | 66,8 |
| 15 | 6,3 || 15 | 7,7 | 3,6 || 60 | 994257496981222664 | 74,4 | 66,8 |
| 31 | 7,3 || 31 | 7,5 | 3,0 || 59 | 470915095588726850 | 74,0 | 66,8 |
| 63 | 7,3 || 63 | 7,5 | 3,0 || 58 | 201745106158251712 | 74,0 | 66,8 |
| 64 | 7,3 || 64 | 9,4 | 4,8 || 57 | 78804375734046440 | 74,0 | 66,8 |
| 65 | 8,3 || 65 | 9,4 | 4,6 || 56 | 57442872892622787 | 74,0 | 66,8 |
| 100 | 8,3 || 100 | 9,4 | 4,6 || 55 | 19109171792964730 | 74,0 | 66,8 |
| 127 | 9,3 || 127 | 9,4 | 4,6 || 54 | 9099755032911121 | 74,0 | 66,8 |
| 128 | 9,3 || 128 | 9,4 | 4,6 || 53 | 8170442697918990 | 74,0 | 66,8 |
| 255 | 10,3 || 255 | 9,4 | 5,0 || 52 | 2913033827815339 | 74,0 | 66,8 |
| 256 | 10,3 || 256 | 9,4 | 5,0 || 51 | 1395743698554671 | 74,0 | 66,8 |
| 511 | 11,3 || 511 | 9,6 | 5,0 || 50 | 929340477894354 | 74,0 | 66,8 |
| 1023 | 14,3 || 1023 | 10,7 | 5,0 || 49 | 351768287627885 | 74,1 | 66,8 |
| 2047 | 16,3 || 2047 | 10,5 | 5,7 || 48 | 165110734465934 | 70,9 | 66,5 |
| 4095 | 23,3 || 4095 | 11,5 | 5,3 || 47 | 116364019662847 | 73,6 | 66,8 |
| | || 32768 | 13,7 | 6,4 || 46 | 45894645838798 | 70,9 | 66,5 |
| | || 1048576 | 15,7 | 8,7 || 45 | 25652614759428 | 70,9 | 65,5 |
| | || 268435456 | 19,7 | 11,0 || 44 | 12123210057895 | 71,7 | 65,5 |
| | || 536870912 | 20,1 | 12,0 || 43 | 5902555891371 | 71,7 | 65,5 |
| | || 1073741824 | 25,8 | 11,3 || 42 | 3490450430912 | 71,7 | 65,5 |
| | || 1073741824 | 25,8 | 11,3 || 41 | 1149630654634 | 71,7 | 65,5 |
| | || 1073774592 | 25,8 | 11,3 || 40 | 902265632303 | 71,7 | 65,5 |
| | || 2147483648 | 21,1 | 12,3 || 39 | 343393482192 | 71,7 | 65,5 |
| | || 4294967295 | 21,8 | 12,3 || 38 | 198281228228 | 71,7 | 65,5 |
| | || | | || 37 | 93252157892 | 71,7 | 65,5 |
| | || | | || 36 | 41910484903 | 71,7 | 65,5 |
| | || | | || 35 | 23282355985 | 71,8 | 65,5 |
| | || | | || 34 | 8677323163 | 71,7 | 65,5 |
| | || | | || 33 | 6714386675 | 71,7 | 65,5 |
|------|------||------------|------|------||------|----------------------|------|------|
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Diagnostics;
<span style="color: blue;">using</span> System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
<span style="color: blue;">public</span> <span style="color: blue;">struct</span> fu_32 <span style="color: green;">// float <==> uint</span>
{
[FieldOffset(<span style="color: maroon;">0</span>)]
<span style="color: blue;">public</span> <span style="color: blue;">float</span> f;
[FieldOffset(<span style="color: maroon;">0</span>)]
<span style="color: blue;">public</span> <span style="color: blue;">uint</span> u;
}
<span style="color: blue;">class</span> cro_64_32
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cro64(<span style="color: blue;">ulong</span> x)
{
<span style="color: blue;">if</span> (x >= <span style="color: maroon;">18446724184312856125</span>) <span style="color: blue;">return</span> <span style="color: maroon;">2642245</span>;
<span style="color: blue;">float</span> fx = (<span style="color: blue;">float</span>)x;
fu_32 fu32 = <span style="color: blue;">new</span> fu_32();
fu32.f = fx;
<span style="color: blue;">uint</span> uy = fu32.u / <span style="color: maroon;">4</span>;
uy += uy / <span style="color: maroon;">4</span>;
uy += uy / <span style="color: maroon;">16</span>;
uy += uy / <span style="color: maroon;">256</span>;
uy += <span style="color: maroon;">0x2a5137a0</span>;
fu32.u = uy;
<span style="color: blue;">float</span> fy = fu32.f;
fy = <span style="color: maroon;">0</span><span style="color: maroon;">.33333333f</span> * (fx / (fy * fy) + <span style="color: maroon;">2</span><span style="color: maroon;">.0f</span> * fy);
<span style="color: #38761d;">// uint y1 = (uint)</span>
<span style="color: #38761d;">// (0.33333333f * (fx / (fy * fy) + 2.0f * fy));</span>
<span style="color: blue;">int</span> y0 = (<span style="color: blue;">int</span>) <span style="color: #38761d;">// 2013-09-22</span>
(<span style="color: #990000;">0.33333333f</span> * (fx / (fy * fy) + <span style="color: #990000;">2.0f</span> * fy)); <span style="color: #38761d;">// 5 ns</span>
<span style="color: blue;">uint</span> y1 = (<span style="color: blue;">uint</span>)y0; <span style="color: #38761d;">// faster</span>
<span style="color: blue;">ulong</span> y2, y3;
<span style="color: blue;">if</span> (y1 >= <span style="color: maroon;">2642245</span>)
{
y1 = <span style="color: maroon;">2642245</span>;
y2 = <span style="color: maroon;">6981458640025</span>;
y3 = <span style="color: maroon;">18446724184312856125</span>;
}
<span style="color: blue;">else</span>
{
y2 = (<span style="color: blue;">ulong</span>)y1 * y1;
y3 = y2 * y1;
}
<span style="color: blue;">if</span> (y3 > x)
{
y1 -= <span style="color: maroon;">1</span>;
y2 -= <span style="color: maroon;">2</span> * y1 + <span style="color: maroon;">1</span>;
y3 -= <span style="color: maroon;">3</span> * y2 + <span style="color: maroon;">3</span> * y1 + <span style="color: maroon;">1</span>;
<span style="color: blue;">while</span> (y3 > x)
{
y1 -= <span style="color: maroon;">1</span>;
y2 -= <span style="color: maroon;">2</span> * y1 + <span style="color: maroon;">1</span>;
y3 -= <span style="color: maroon;">3</span> * y2 + <span style="color: maroon;">3</span> * y1 + <span style="color: maroon;">1</span>;
}
<span style="color: blue;">return</span> y1;
}
<span style="color: blue;">do</span>
{
y3 += <span style="color: maroon;">3</span> * y2 + <span style="color: maroon;">3</span> * y1 + <span style="color: maroon;">1</span>;
y2 += <span style="color: maroon;">2</span> * y1 + <span style="color: maroon;">1</span>;
y1 += <span style="color: maroon;">1</span>;
}
<span style="color: blue;">while</span> (y3 <= x);
<span style="color: blue;">return</span> y1 - <span style="color: maroon;">1</span>;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cro32(<span style="color: blue;">uint</span> x)
{
<span style="color: blue;">uint</span> y = <span style="color: maroon;">0</span>, z = <span style="color: maroon;">0</span>, b = <span style="color: maroon;">0</span>;
<span style="color: blue;">int</span> s = x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">24</span> ? x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">12</span> ? x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">06</span> ? x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">03</span> ? <span style="color: maroon;">00</span> : <span style="color: maroon;">03</span> :
x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">09</span> ? <span style="color: maroon;">06</span> : <span style="color: maroon;">09</span> :
x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">18</span> ? x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span> ? <span style="color: maroon;">12</span> : <span style="color: maroon;">15</span> :
x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">21</span> ? <span style="color: maroon;">18</span> : <span style="color: maroon;">21</span> :
x >= <span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span> ? <span style="color: maroon;">30</span> : x < <span style="color: maroon;">1u</span> << <span style="color: maroon;">27</span> ? <span style="color: maroon;">24</span> : <span style="color: maroon;">27</span>;
<span style="color: blue;">do</span>
{
y *= <span style="color: maroon;">2</span>;
z *= <span style="color: maroon;">4</span>;
b = <span style="color: maroon;">3</span> * y + <span style="color: maroon;">3</span> * z + <span style="color: maroon;">1</span> << s;
<span style="color: blue;">if</span> (x >= b)
{
x -= b;
z += <span style="color: maroon;">2</span> * y + <span style="color: maroon;">1</span>;
y += <span style="color: maroon;">1</span>;
}
s -= <span style="color: maroon;">3</span>;
}
<span style="color: blue;">while</span> (s >= <span style="color: maroon;">0</span>);
<span style="color: blue;">return</span> y;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cro12(<span style="color: blue;">uint</span> x)
{
<span style="color: blue;">uint</span> y = <span style="color: maroon;">0</span>, a = <span style="color: maroon;">0</span>, b = <span style="color: maroon;">1</span>, c = <span style="color: maroon;">0</span>;
<span style="color: blue;">while</span> (a < x)
{
y++;
b += c;
a += b;
c += <span style="color: maroon;">6</span>;
}
<span style="color: blue;">if</span> (a != x) y--;
<span style="color: blue;">return</span> y;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Stopwatch sw = <span style="color: blue;">new</span> Stopwatch();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
cro64(<span style="color: blue;">long</span>.MaxValue);
check_perfect_cubes64();
check_perfect_cubes32();
time_cro64();
time_cro32();
time_cro12();
cro32_all(); <span style="color: green;">// ~90 s, sorry, no cro64_all() ;) it would take ~44 millennia. </span>
Console.ReadLine();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> check_perfect_cubes64()
{
<span style="color: blue;">ulong</span> n = <span style="color: maroon;">0</span>, a = <span style="color: maroon;">0</span>, b = <span style="color: maroon;">1</span>, c = <span style="color: maroon;">6</span>;
<span style="color: blue;">while</span> (n <= <span style="color: maroon;">2642245</span>)
{
<span style="color: blue;">if</span> (n != cro64(a)) Console.WriteLine(<span style="color: maroon;">"WRONG"</span>);
a += b; b += c; c += <span style="color: maroon;">6</span>; n++;
}
Console.WriteLine(<span style="color: maroon;">"CHECKED64"</span>);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> check_perfect_cubes32()
{
<span style="color: blue;">uint</span> n = <span style="color: maroon;">0</span>, a = <span style="color: maroon;">0</span>, b = <span style="color: maroon;">1</span>, c = <span style="color: maroon;">6</span>;
<span style="color: blue;">while</span> (n <= <span style="color: maroon;">1625</span>)
{
<span style="color: blue;">if</span> (n != cro32(a)) Console.WriteLine(<span style="color: maroon;">"WRONG"</span>);
a += b; b += c; c += <span style="color: maroon;">6</span>; n++;
}
Console.WriteLine(<span style="color: maroon;">"CHECKED32"</span>);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Random random = <span style="color: blue;">new</span> Random(<span style="color: maroon;">0</span>); <span style="color: green;">// Random(0)/Random(), same/random sequence </span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> rnd32() <span style="color: green;">// random uint</span>
{
<span style="color: blue;">return</span> (<span style="color: blue;">uint</span>)(random.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">16</span>)) << <span style="color: maroon;">16</span> |
(<span style="color: blue;">uint</span>)(random.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">16</span>));
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> rnd32(<span style="color: blue;">uint</span> n) <span style="color: green;">// random uint of n bits</span>
{
<span style="color: blue;">if</span> (n < <span style="color: maroon;">2</span>) <span style="color: blue;">return</span> n;
<span style="color: blue;">if</span> (n > <span style="color: maroon;">32</span>) n = <span style="color: maroon;">32</span>;
<span style="color: blue;">return</span> (((<span style="color: blue;">uint</span>)(random.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">16</span>)) << <span style="color: maroon;">16</span> |
(<span style="color: blue;">uint</span>)(random.Next(<span style="color: maroon;">1</span> << <span style="color: maroon;">16</span>)))
>> <span style="color: maroon;">32</span> - (<span style="color: blue;">int</span>)n) | (<span style="color: maroon;">1u</span> << (<span style="color: blue;">int</span>)n - <span style="color: maroon;">1</span>);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">ulong</span> rnd64(<span style="color: blue;">uint</span> n) <span style="color: green;">// random ulong of n bits</span>
{
<span style="color: blue;">if</span> (n < <span style="color: maroon;">2</span>) <span style="color: blue;">return</span> n;
<span style="color: blue;">if</span> (n > <span style="color: maroon;">64</span>) n = <span style="color: maroon;">64</span>;
<span style="color: blue;">ulong</span> u = rnd32();
u = u << <span style="color: maroon;">32</span> | rnd32();
u >>= <span style="color: maroon;">64</span> - (<span style="color: blue;">int</span>)n;
u |= <span style="color: maroon;">1uL</span> << (<span style="color: blue;">int</span>)n - <span style="color: maroon;">1</span>;
<span style="color: blue;">return</span> u;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> time_cro64()
{
<span style="color: blue;">int</span> i; <span style="color: blue;">uint</span> j; <span style="color: blue;">ulong</span> x; <span style="color: blue;">double</span> t;
Console.WriteLine(<span style="color: maroon;">"|------|----------------------|------|"</span>);
Console.WriteLine(<span style="color: maroon;">"| bits | x | ns |"</span>);
Console.WriteLine(<span style="color: maroon;">"|------|----------------------|------|"</span>);
Console.WriteLine(<span style="color: maroon;">"| PRESS A KEY |"</span>);
Console.ReadLine();
<span style="color: blue;">for</span> (j = <span style="color: maroon;">64</span>; j > <span style="color: maroon;">32</span>; j -= <span style="color: maroon;">1</span>)
{
x = rnd64(j);
cro64(x);
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">10000000</span>; i++) cro64(x);
sw.Stop();
t = sw.ElapsedMilliseconds;
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">10000000</span>; i++) ; <span style="color: green;">// nada</span>
sw.Stop();
t -= sw.ElapsedMilliseconds;
Console.WriteLine(<span style="color: maroon;">"| {0,2} | {1,20} | {2:00.0} |"</span>, j, x, t / <span style="color: maroon;">10</span>);
}
Console.WriteLine(<span style="color: maroon;">"|------|----------------------|------|"</span>);
Console.WriteLine();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> time_cro32()
{
<span style="color: blue;">int</span> i, j; <span style="color: blue;">uint</span> x; <span style="color: blue;">double</span> t;
<span style="color: blue;">uint</span>[] a = { <span style="color: maroon;">0</span>, <span style="color: maroon;">1</span>, <span style="color: maroon;">3</span>, <span style="color: maroon;">7</span>, <span style="color: maroon;">15</span>, <span style="color: maroon;">31</span>, <span style="color: maroon;">63</span>, <span style="color: maroon;">64</span>, <span style="color: maroon;">65</span>,
<span style="color: maroon;">100</span>, <span style="color: maroon;">127</span>, <span style="color: maroon;">128</span>, <span style="color: maroon;">255</span>, <span style="color: maroon;">256</span>, <span style="color: maroon;">511</span>, <span style="color: maroon;">1023</span>, <span style="color: maroon;">2047</span>, <span style="color: maroon;">4095</span>,
<span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>, <span style="color: maroon;">1u</span> << <span style="color: maroon;">20</span>, <span style="color: maroon;">1u</span> << <span style="color: maroon;">28</span> ,<span style="color: maroon;">1u</span> << <span style="color: maroon;">29</span> , <span style="color: maroon;">1070599167</span>,
<span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>,<span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>,(<span style="color: maroon;">1u</span> << <span style="color: maroon;">30</span>) + (<span style="color: maroon;">1u</span> << <span style="color: maroon;">15</span>), <span style="color: maroon;">1u</span> << <span style="color: maroon;">31</span>, ~<span style="color: maroon;">0u</span> };
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
Console.WriteLine(<span style="color: maroon;">"| x | ns |"</span>);
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
<span style="color: blue;">for</span> (j = <span style="color: maroon;">0</span>; j < a.Length; j++)
{
x = a[j];
cro32(x);
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">10000000</span>; i++) cro32(x);
sw.Stop();
t = sw.ElapsedMilliseconds;
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">10000000</span>; i++) ; <span style="color: green;">// nada</span>
sw.Stop();
t -= sw.ElapsedMilliseconds;
Console.WriteLine(<span style="color: maroon;">"| {0,10} | {1:00.0} |"</span>, x, t / <span style="color: maroon;">10</span>);
}
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
Console.WriteLine();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> time_cro12()
{
<span style="color: blue;">int</span> i, j; <span style="color: blue;">uint</span> x; <span style="color: blue;">double</span> t;
<span style="color: blue;">uint</span>[] a = { <span style="color: maroon;">0</span>, <span style="color: maroon;">1</span>, <span style="color: maroon;">3</span>, <span style="color: maroon;">7</span>, <span style="color: maroon;">15</span>, <span style="color: maroon;">31</span>, <span style="color: maroon;">63</span>, <span style="color: maroon;">64</span>, <span style="color: maroon;">65</span>,
<span style="color: maroon;">100</span>, <span style="color: maroon;">127</span>, <span style="color: maroon;">128</span>, <span style="color: maroon;">255</span>, <span style="color: maroon;">256</span>, <span style="color: maroon;">511</span>, <span style="color: maroon;">1023</span>, <span style="color: maroon;">2047</span>, <span style="color: maroon;">4095</span> };
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
Console.WriteLine(<span style="color: maroon;">"| x | ns |"</span>);
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
<span style="color: blue;">for</span> (j = <span style="color: maroon;">0</span>; j < a.Length; j++)
{
x = a[j];
cro12(x);
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">10000000</span>; i++) cro12(x);
sw.Stop();
t = sw.ElapsedMilliseconds;
sw.Restart();
<span style="color: blue;">for</span> (i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">10000000</span>; i++) ; <span style="color: green;">// nada</span>
sw.Stop();
t -= sw.ElapsedMilliseconds;
Console.WriteLine(<span style="color: maroon;">"| {0,10} | {1:00.0} |"</span>, x, t / <span style="color: maroon;">10</span>);
}
Console.WriteLine(<span style="color: maroon;">"|------------|------|"</span>);
Console.WriteLine();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> cro32_all()
{
<span style="color: blue;">uint</span> x; <span style="color: blue;">double</span> t;
cro32(~<span style="color: maroon;">0u</span>);
sw.Restart();
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x < ~<span style="color: maroon;">0u</span>; x++) cro32(x);
sw.Stop();
t = sw.ElapsedMilliseconds;
sw.Restart();
<span style="color: blue;">for</span> (x = <span style="color: maroon;">0</span>; x < ~<span style="color: maroon;">0u</span>; x++) ; <span style="color: green;">// nada</span>
sw.Stop();
t -= sw.ElapsedMilliseconds;
Console.Write(x + <span style="color: maroon;">" roots in "</span> + t + <span style="color: maroon;">" ms, "</span>);
Console.WriteLine(<span style="color: maroon;">"mean time {0:.00} ns"</span>,
(<span style="color: blue;">double</span>)(t) * <span style="color: maroon;">1000000</span> / x);
<span style="color: green;">// 4294967295 roots in 92732 ms, mean time 21,59 ns</span>
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cro64old(<span style="color: blue;">ulong</span> x)
{
<span style="color: blue;">if</span> (x >= <span style="color: maroon;">18446724184312856125</span>) <span style="color: blue;">return</span> <span style="color: maroon;">2642245</span>; <span style="color: green;">// avoid overflow</span>
<span style="color: blue;">float</span> fx = (<span style="color: blue;">float</span>)x; <span style="color: green;">//------------------------------------------------------\</span>
<span style="color: blue;">uint</span> uy = BitConverter.ToUInt32(BitConverter.GetBytes(fx), <span style="color: maroon;">0</span>) / <span style="color: maroon;">4</span>; <span style="color: green;">// ~20 ns \</span>
uy += uy / <span style="color: maroon;">4</span>; <span style="color: green;">// \</span>
uy += uy / <span style="color: maroon;">16</span>; <span style="color: green;">// \</span>
uy += uy / <span style="color: maroon;">256</span>; <span style="color: green;">// \</span>
uy += <span style="color: maroon;">0x2a5137a0</span>; <span style="color: green;">// \</span>
<span style="color: blue;">float</span> fy = BitConverter.ToSingle(BitConverter.GetBytes(uy), <span style="color: maroon;">0</span>); <span style="color: green;">// ~20 ns 32 bits</span>
fy = <span style="color: maroon;">0</span><span style="color: maroon;">.33333333f</span> * (fx / (fy * fy) + <span style="color: maroon;">2</span><span style="color: maroon;">.0f</span> * fy); <span style="color: green;">// /</span>
<span style="color: blue;">uint</span> y1 = (<span style="color: blue;">uint</span>)(<span style="color: maroon;">0</span><span style="color: maroon;">.33333333f</span> * (fx / (fy * fy) + <span style="color: maroon;">2</span><span style="color: maroon;">.0f</span> * fy)); <span style="color: green;">// /</span>
<span style="color: blue;">ulong</span> y2, y3; <span style="color: green;">// /</span>
<span style="color: blue;">if</span> (y1 >= <span style="color: maroon;">2642245</span>) <span style="color: green;">// avoid overflow /</span>
{ <span style="color: green;">// /</span>
y1 = <span style="color: maroon;">2642245</span>; <span style="color: green;">//------------------------------------------------------/ </span>
y2 = <span style="color: maroon;">6981458640025</span>;
y3 = <span style="color: maroon;">18446724184312856125</span>;
}
<span style="color: blue;">else</span>
{
y2 = (<span style="color: blue;">ulong</span>)y1 * y1;
y3 = y2 * y1;
}
<span style="color: blue;">if</span> (y3 > x)
{
y1 -= <span style="color: maroon;">1</span>;
y2 -= <span style="color: maroon;">2</span> * y1 + <span style="color: maroon;">1</span>;
y3 -= <span style="color: maroon;">3</span> * y2 + <span style="color: maroon;">3</span> * y1 + <span style="color: maroon;">1</span>;
<span style="color: blue;">while</span> (y3 > x)
{
y1 -= <span style="color: maroon;">1</span>;
y2 -= <span style="color: maroon;">2</span> * y1 + <span style="color: maroon;">1</span>;
y3 -= <span style="color: maroon;">3</span> * y2 + <span style="color: maroon;">3</span> * y1 + <span style="color: maroon;">1</span>;
}
<span style="color: blue;">return</span> y1;
}
<span style="color: blue;">do</span>
{
y3 += <span style="color: maroon;">3</span> * y2 + <span style="color: maroon;">3</span> * y1 + <span style="color: maroon;">1</span>;
y2 += <span style="color: maroon;">2</span> * y1 + <span style="color: maroon;">1</span>;
y1 += <span style="color: maroon;">1</span>;
}
<span style="color: blue;">while</span> (y3 <= x);
<span style="color: blue;">return</span> y1 - <span style="color: maroon;">1</span>;
}
}
</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-26802824092853730592013-08-14T06:11:00.000-07:002013-08-15T01:01:57.450-07:00Stirling numbers of the second kind<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-M3EFA2XJSYo/UgtsoVLeO_I/AAAAAAAAALM/38Be4r5SVYY/s1600/b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="312" src="http://2.bp.blogspot.com/-M3EFA2XJSYo/UgtsoVLeO_I/AAAAAAAAALM/38Be4r5SVYY/s400/b.jpg" width="400" /></a></div>
<pre><span style="color: green;">/*
<span style="color: blue;">k 1 1 1 1 1 1</span>
<span style="color: red;">n</span> <span style="color: blue;">0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5</span>
<span style="color: red;">0</span> 1 <span style="color: #d9ead3;">0 </span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> 0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">1</span> 0 1 </span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> 0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">2</span> 0 1 <span style="background-color: #fff2cc;">1<span style="background-color: white;"><span></span></span></span></span><span style="color: green;"><span style="background-color: #fff2cc;"><span style="background-color: white;"><span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span><span style="color: green;"><span style="background-color: #fff2cc;"><span style="background-color: white;"><span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span> </span></span></span></span><span style="color: green;"><span style="background-color: #fff2cc;"><span style="background-color: white;"><span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0 </span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">3</span> 0 1 <span style="background-color: #fff2cc;">3</span> <span style="background-color: #fff2cc;">1</span></span><span style="color: green;"> </span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span> </span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0 </span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0 </span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">4</span> 0 1 <span style="background-color: #fff2cc;">7</span> <span style="background-color: #fff2cc;">6</span> <span style="background-color: #fff2cc;">1</span></span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0 </span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">5</span> 0 1 1<span style="background-color: #fff2cc;">5</span> 2<span style="background-color: #fff2cc;">5</span> 1<span style="background-color: #fff2cc;">0</span> <span style="background-color: #fff2cc;">1</span></span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0 </span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">6</span> 0 1 3<span style="background-color: #cfe2f3;">1</span> 9<span style="background-color: #fff2cc;">0</span> 6<span style="background-color: #fff2cc;">5</span> 1<span style="background-color: #fff2cc;">5</span> <span style="background-color: #fce5cd;">1</span></span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0 </span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">7</span> 0 1 6<span style="background-color: #cfe2f3;">3</span> 30<span style="background-color: #cfe2f3;">1</span> 35<span style="background-color: #fff2cc;">0</span> 14<span style="background-color: #fff2cc;">0</span> 2<span style="background-color: #fce5cd;">1</span> 1</span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;"> 0 </span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">8</span> 0 1 12<span style="background-color: #cfe2f3;">7</span> 96<span style="background-color: #cfe2f3;">6</span> 170<span style="background-color: #cfe2f3;">1</span> 105<span style="background-color: #fff2cc;">0</span> 26<span style="background-color: #d9d2e9;">6</span> 28 1 </span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">9</span> 0 1 25<span style="background-color: #cfe2f3;">5</span> 302<span style="background-color: #cfe2f3;">5</span> 777<span style="background-color: #cfe2f3;">0</span> 695<span style="background-color: #cfe2f3;">1</span> 264<span style="background-color: #d9d2e9;">6</span> 462 36 <span style="background-color: #f4cccc;">1</span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">10</span> 0 1 51<span style="background-color: #fff2cc;">1</span> 933<span style="background-color: #cfe2f3;">0</span> 3410<span style="background-color: #cfe2f3;">5</span> 4252<span style="background-color: #cfe2f3;">5</span> 2282<span style="background-color: #fce5cd;">7</span> 5880 750 4<span style="background-color: #f4cccc;">5</span> <span style="background-color: #f4cccc;">1</span></span><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">11</span> 0 1 102<span style="background-color: #fff2cc;">3</span> 2850<span style="background-color: #fff2cc;">1</span> 14575<span style="background-color: #cfe2f3;">0</span> 24673<span style="background-color: #cfe2f3;">0</span> 17948<span style="background-color: #fce5cd;">7</span> 63987 11880 115<span style="background-color: #f4cccc;">5</span> 5<span style="background-color: #f4cccc;">5</span> 1 </span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> </span></span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> </span></span></span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> </span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">12</span> 0 1 204<span style="background-color: #fff2cc;">7</span> 8652<span style="background-color: #fff2cc;">6</span> 61150<span style="background-color: #fff2cc;">1</span> 137940<span style="background-color: #cfe2f3;">0</span> 132365<span style="background-color: #d9d2e9;">2</span> 627396 159027 2227<span style="background-color: #f4cccc;">5</span> 170<span style="background-color: #f4cccc;">5</span> 66 1</span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> 0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> 0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">13</span> 0 1 409<span style="background-color: #fff2cc;">5</span> 26162<span style="background-color: #fff2cc;">5</span> 253253<span style="background-color: #fff2cc;">0</span> 750850<span style="background-color: #fff2cc;">1</span> 932131<span style="background-color: #d9d2e9;">2</span> 5715424 1899612 35950<span style="background-color: #f4cccc;">2</span> 3932<span style="background-color: #f4cccc;">5</span> 2431 78 1 </span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> </span></span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;">0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">14</span> 0 1 819<span style="background-color: #cfe2f3;">1</span> 78897<span style="background-color: #fff2cc;">0</span> 1039174<span style="background-color: #fff2cc;">5</span> 4007503<span style="background-color: #fff2cc;">5</span> 634363<span style="background-color: #fce5cd;"><span style="background-color: white;">7</span>3</span> 49329280 20912320 513513<span style="background-color: #f4cccc;">0</span> 75275<span style="background-color: #f4cccc;">2</span> 66066 3367 91 1</span><span style="color: green;"><span style="color: green;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"><span style="color: green;"><span style="color: #d9ead3;"> 0</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color: red;">15</span> 0 1 1638<span style="background-color: #cfe2f3;">3</span> 237510<span style="background-color: #cfe2f3;">1</span> 4235595<span style="background-color: #fff2cc;">0</span> 21076692<span style="background-color: #fff2cc;">0</span> 4206932<span style="background-color: #fce5cd;"><span style="background-color: white;">7</span>3</span> 408741333 216627840 67128490 1266265<span style="background-color: #f4cccc;">0</span> 1479478 106470 4550 105 1
</span>
<span style="color: green;"><span class="short_text" id="result_box" lang="en"><span class="hps"> <span style="background-color: #fff2cc;">coin</span><span style="background-color: #cfe2f3;">cide</span><span style="background-color: #fff2cc;">nce?</span></span></span>
Two formula's:
<span style="color: black;">k
S2(n,k) = 1/k! * SIGMA[(-1)^(k-j) * C(k,j) * j^n ]
j=0
S2(n,k) = k * S2(n-1,k) + S2(n-1,k-1)
Initial value's: S2(j,j) = 1 , S2(j,0) = 0 , S2(0,j) = 0</span>
The first formula: * powers, * / factorials, + - (large) numbers .
The second one leads to a recursive solution. It's going top-down,
a larger number depends on two smaller ones. Bottom-up seems to be
an easier, faster, iterative way.
Top-down:
S2(5,3) = 3 * S2(4,3) + S2(4,2)
S2(4,3) = 3 * S2(3,3) + S2(3,2)
S2(4,2) = 2 * S2(3,2) + S2(2,2)
S2(3,2) = 2 * S2(2,2) + S2(2 ...
...complicated...
Bottom-up:
Rearrange table, remove empty (zero) items in colums:
_ _ _ _
| 1 | | 1 1 <span style="color: #93c47d;">1 1</span> |
| 0 1 | =====> | 0 1 <span style="color: #93c47d;">3 6</span> |
| 0 1 <span style="color: #93c47d;">1</span> | |_0 1 <span style="color: #93c47d;">7 25</span>_|
| <span style="color: #93c47d;">.</span> 1 <span style="color: #93c47d;">3 1</span> |
| <span style="color: #93c47d;">. . 7 6</span> |
|_<span style="color: #93c47d;">. . . 25</span>_|
1 1 1 + <span style="color: #38761d;">2</span> * 0 = <span style="color: red;">1</span> 1 + 3 * 0 = <span style="color: red;">1</span>
0 1 1 + 2 * <span style="color: red;">1</span> = <span style="color: blue;">3</span> 3 + 3 * <span style="color: red;">1</span> = <span style="color: blue;">6</span>
0 1 1 + 2 * <span style="color: blue;">3</span> = 7 7 + 3 * <span style="color: blue;">6</span> = 25 = S2(5,3) ...less complicated...
|---------------------------------------------------------------|
| S2(n,k) |
|------|------|-----------------------------------------|-------|
| n | k | Time in ms (Athlon X4, XP, 2GB) | bits |
|------|------|---------|---------|----------|----------|-------|
| 100 | 10 | 0,25 | | | | 311 |
| 100 | 25 | | 0,61 | | | 381 |
| 100 | 50 | | | 0,81 | | 338 |
| 100 | 89 | | | | 0,27 | 108 |
| | | | | | | |
| 200 | 20 | 1,5 | | | | 804 |
| 200 | 43 | | 3,1 | | | 910 |
| 200 | 86 | | | 4,4 | | 838 |
| 200 | 172 | | | | 1,6 | 295 |
| | | | | | | |
| 400 | 40 | 9,4 | | | | 1970 |
| 400 | 77 | | 18 | | | 2131 |
| 400 | 154 | | | 27 | | 1986 |
| 400 | 308 | | | | 14 | 982 |
| | | | | | | |
| 800 | 80 | 75 | | | | 4663 |
| 800 | 138 | | 124 | | | 4900 |
| 800 | 276 | | | 183 | | 4617 |
| 800 | 552 | | | | 119 | 2744 |
| | | | | | | |
| 1600 | 160 | 672 | | | | 10770 |
| 1600 | 250 | | 1010 | | | 11109 |
| 1600 | 500 | | | 1620 | | 10546 |
| 1600 | 1000 | | | | 1120 | 6974 |
| | | | | | | |
| 3200 | 320 | 7230 | | | | 24424 |
| 3200 | 456 | | 9930 | | | 24889 |
| 3200 | 912 | | | 15300 | | 23765 |
| 3200 | 1824 | | | | 11900 | 16881 |
|------|------|---------|---------|----------|----------|-------|
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Diagnostics;
<span style="color: blue;">using</span> Xint = System.Numerics.BigInteger;
<span style="color: blue;">class</span> Stirling_2nd_kind
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint S2(<span style="color: blue;">uint</span> n, <span style="color: blue;">uint</span> k)
{
<span style="color: blue;">if</span> (k >= n) <span style="color: blue;">return</span> k == n ? <span style="color: maroon;">1</span> : <span style="color: maroon;">0</span>;
<span style="color: blue;">if</span> (k <= <span style="color: maroon;">2</span>) <span style="color: blue;">return</span> k == <span style="color: maroon;">0</span> ? <span style="color: maroon;">0</span> : k == <span style="color: maroon;">1</span> ?
<span style="color: maroon;">1</span> : (Xint.One << (<span style="color: blue;">int</span>)(n - <span style="color: maroon;">1</span>)) - 1;
<span style="color: blue;">if</span> (k + <span style="color: maroon;">1</span> == n) <span style="color: blue;">return</span> (Xint)(n) * k / <span style="color: maroon;">2</span>;
n -= k - <span style="color: maroon;">1</span>;
<span style="color: blue;">uint</span> i = <span style="color: maroon;">0</span>, j = <span style="color: maroon;">3</span>;
Xint[] A = <span style="color: blue;">new</span> Xint[n];
<span style="color: blue;">for</span> (; i < n; i++)
A[i] = <span style="color: maroon;">1</span>;
Xint[] B = <span style="color: blue;">new</span> Xint[n];
<span style="color: blue;">for</span> (i = 0; i < n; i++)
B[i] = (Xint.One << (<span style="color: blue;">int</span>)(i + 1)) - 1;
<span style="color: blue;">do</span>
{
<span style="color: blue;">for</span> (i = <span style="color: maroon;">1</span>; i < n; i++)
A[i] = A[i - <span style="color: maroon;">1</span>] * j + B[i];
j++;
<span style="color: blue;">if</span> (j > k) <span style="color: blue;">return</span> A[n - <span style="color: maroon;">1</span>];
<span style="color: blue;">for</span> (i = <span style="color: maroon;">1</span>; i < n; i++)
B[i] = B[i - <span style="color: maroon;">1</span>] * j + A[i];
j++;
}
<span style="color: blue;">while</span> (j <= k);
<span style="color: blue;">return</span> B[n - <span style="color: maroon;">1</span>];
}
<span style="color: green;">// to do: - use uints/ulongs: - for smaller value's / </span>
<span style="color: green;">// - as long as possible </span>
<span style="color: green;">// - return row (array)</span>
<span style="color: green;">// - return previous/next row from row</span>
<span style="color: green;">// - k close to n , go from right to left in table ?</span>
<span style="color: green;">// - same/similar trick for: - other sequences ?</span>
<span style="color: green;">// - sequences using S2(n,k) ?</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Stopwatch sw = <span style="color: blue;">new</span> Stopwatch();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
Console.WriteLine(<span style="color: maroon;">"S2(50,17) = "</span> + S2(<span style="color: maroon;">50</span>, <span style="color: maroon;">17</span>));
Console.WriteLine(<span style="color: maroon;">" bits : "</span> + bL(S2(<span style="color: maroon;">50</span>, <span style="color: maroon;">17</span>)));
sw.Restart();
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = <span style="color: maroon;">0</span>; i < <span style="color: maroon;">1000</span>; i++) S2(<span style="color: maroon;">50</span>, <span style="color: maroon;">17</span>);
sw.Stop();
Console.WriteLine(<span style="color: maroon;">" ms : 0,"</span> + sw.ElapsedMilliseconds);
Console.ReadLine();
<span style="color: green;">// S2(50,17) = 37645241791600906804871080818625037726247519045</span>
<span style="color: green;">// bits : 155</span>
<span style="color: green;">// ms : 0,134</span>
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> bL(Xint U)
{
<span style="color: blue;">byte</span>[] bytes = (U.Sign * U).ToByteArray();
<span style="color: blue;">int</span> i = bytes.Length - <span style="color: maroon;">1</span>;
<span style="color: blue;">return</span> i * <span style="color: maroon;">8</span> | bitLengthMostSignificantByte(bytes[i]);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> bitLengthMostSignificantByte(<span style="color: blue;">byte</span> b)
{
<span style="color: blue;">return</span> b < <span style="color: maroon;">08</span> ? b < <span style="color: maroon;">02</span> ? b < <span style="color: maroon;">01</span> ? <span style="color: maroon;">0</span> : <span style="color: maroon;">1</span> :
b < <span style="color: maroon;">04</span> ? <span style="color: maroon;">2</span> : <span style="color: maroon;">3</span> :
b < <span style="color: maroon;">32</span> ? b < <span style="color: maroon;">16</span> ? <span style="color: maroon;">4</span> : <span style="color: maroon;">5</span> :
b < <span style="color: maroon;">64</span> ? <span style="color: maroon;">6</span> : <span style="color: maroon;">7</span>;
}
}
</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0tag:blogger.com,1999:blog-3824094400662352224.post-3751753801289139542013-08-09T00:46:00.000-07:002013-08-12T05:49:26.318-07:00Cube Root<pre><span style="color: green;">/*
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-RfewcrhtHIk/UgQA-SbcU3I/AAAAAAAAAK8/VkaT7Bu5-mM/s1600/p.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="235" src="http://1.bp.blogspot.com/-RfewcrhtHIk/UgQA-SbcU3I/AAAAAAAAAK8/VkaT7Bu5-mM/s400/p.jpg" width="400" /></a></div>
<span style="color: blue;"> <span style="color: green;"> _</span>__
\3 / </span> Input: integer x >= 0
<span style="color: blue;">\/ x = y </span> Output: integer y, such that y^3 <= x < (y+1)^3
Cube Roots are computed three to five times faster with the CR function,
compared to the <a href="http://bigintegers.blogspot.com/2013/07/nth-root-power.html">Nth Root</a> function.
</span><span style="color: green;">For small values it's obvious to use: " <span style="color: black;">y</span> <span style="color: black;">= (</span><span style="color: blue;">uint</span><span style="color: black;">)<span style="color: #3d85c6;"><span style="background-color: white;">Math</span></span>.Pow(x, 1d / 3))</span> ".
It takes ~125 ns, but for example with x = 4503569204744003 (a 52 bits number),
it returns 165139, wrong, it should be 165140. So errors have to be corrected.
Another option: the "Integer Cube Root" algorithm from "Hacker's Delight" (see Refs).
For a uint it takes ~25 ns, not too bad for a C# version, for a ulong ~330 ns.
Up to ulong.MaxValue there are ~2.5 million perfect cubes, they can be generated like below.
3th powers:
|-----|------|------|------|------| dy=growth of y, ddy=growth of dy, ...
| x | y=x^3| dy | ddy | dddy |
|-----|------|------|------|------| y=x^3 , y'=3*x^2 , y''=6*x , y'''=6
| 0 | 0 | | <span style="color: #b6d7a8;">0</span> | |
| | | 1 | | <span style="color: #b6d7a8;">6</span> | y=x^n ,,,,,,,,,,,,,, y''''...=n! <a href="http://oeis.org/A000142">A000142</a>
| 1 | 1 | | 6 | |
| | | 7 | | 6 | y: The cubes <a href="http://oeis.org/A000578">A000578</a>
| 2 | 8 | | 12 | | dy: Central hexagonal numbers <a href="http://oeis.org/A003215">A003215</a>
| | | 19 | | 6 | ddy: Multiples of 6 <a href="http://oeis.org/A008588">A008588</a>
| 3 | 27 | | 18 | | dddy: The six sequence <span style="color: red;"><a href="http://a010722/">A010722</a></span>
| | | 37 | | <span style="color: #b6d7a8;">6</span> | ddddy: The zero sequence <a href="http://oeis.org/A000004">A000004</a>
| 4 | 64 | | <span style="color: #b6d7a8;">24</span> | |
|-----|------|------|------|------| y=x^4 : <a href="http://oeis.org/A000583">A000583</a> , <a href="http://oeis.org/A010863">A010863</a> , <a href="http://oeis.org/A101103">A101103</a> , <a href="http://oeis.org/A005914">A005914</a> , <a href="http://oeis.org/A005917">A005917</a>
</span>
<span style="color: green;"> <span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> <span style="color: black;">abc()</span>
{
<span style="color: blue;">uint</span> <span style="color: black;">n = <span style="color: #990000;">0</span>, a = <span style="color: #990000;">0</span>, b = <span style="color: #990000;">1</span>, c = <span style="color: #990000;">6</span>;</span>
<span style="color: black;">Console.WriteLine(</span><span style="color: maroon;">"// {0,2}{1,4}{2,4}{3,3}"</span><span style="color: black;">, n, a, b, c);</span> <span style="color: green;">// 0 0 1 6</span>
<span style="color: blue;">while</span> <span style="color: black;">(n <</span> <span style="color: maroon;">7</span><span style="color: black;">)</span> <span style="color: green;">// 1 1 7 12</span>
<span style="color: black;">{ </span> <span style="color: green;">// 2 8 19 18</span>
<span style="color: black;"> n++; </span> <span style="color: green;">// 3 27 37 24</span>
<span style="color: black;">a += b; </span> <span style="color: green;">// 4 64 61 30</span>
<span style="color: black;">b += c; </span> <span style="color: green;">// 5 125 91 36</span>
<span style="color: black;"> c += <span style="color: #990000;">6</span>; </span> <span style="color: green;">// 6 216 127 42</span>
<span style="color: black;">Console.WriteLine(</span><span style="color: maroon;">"// {0,2}{1,4}{2,4}{3,3}"</span><span style="color: black;">, n, a, b, c);</span> <span style="color: green;">// 7 343 169 48</span>
<span style="color: black;">}
Console.ReadLine();
}</span></span>
<span style="color: green;"><span style="color: green;">4th powers:</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> <span style="color: black;">abcd()</span>
{
<span style="color: blue;">uint</span> <span style="color: black;">n = <span style="color: #990000;">0</span>;</span>
<span style="color: blue;">uint</span> <span style="color: black;">a = <span style="color: #990000;">0</span>, b = <span style="color: #990000;">1</span>, c = <span style="color: #990000;">14</span>, d = <span style="color: #990000;">36</span>;</span>
<span style="color: black;">Console.WriteLine(</span><span style="color: maroon;">"// {0,2}{1,5}{2,5}{3,4}{4,4}"</span><span style="color: black;">, n, a, b, c, d);</span> <span style="color: green;">// 0 0 1 14 36</span>
<span style="color: blue;">while</span> <span style="color: black;">(n <</span> <span style="color: maroon;">8</span><span style="color: black;">)</span> <span style="color: green;">// 1 1 15 50 60</span>
{ <span style="color: green;">// 2 16 65 110 84</span>
<span style="color: black;">n++; </span> <span style="color: green;">// 3 81 175 194 108</span>
<span style="color: black;">a += b;</span> <span style="color: green;">// 4 256 369 302 132</span>
<span style="color: black;">b += c;</span> <span style="color: green;">// 5 625 671 434 156</span>
<span style="color: black;">c += d; </span> <span style="color: green;">// 6 1296 1105 590 180</span>
<span style="color: black;">d += <span style="color: #990000;">24</span>; </span> <span style="color: green;">// 7 2401 1695 770 204</span>
<span style="color: black;">Console.WriteLine(</span><span style="color: maroon;">"// {0,2}{1,5}{2,5}{3,4}{4,4}"</span><span style="color: black;">, n, a, b, c, d);</span> <span style="color: green;">// 8 4096 2465 974 228</span>
<span style="color: black;"> }
Console.ReadLine();
}</span></span></pre>
<pre><span style="color: green;">The initialisation value's: "a = 0, b = 1, c = 14, d = 36, 24" : <a href="http://oeis.org/A019538">A019538</a>
It's getting a bit off topic, hence another topic: <a href="http://bigintegers.blogspot.com/2013/08/power-addition-only.html">Power Addition Only</a>.
Above leads to cro12 / CR12, "Hacker's Delight" hardware algorithms, and
a new "cro12", while writing ... this. It's ~1 ns faster than the one used.
</span>
<span style="color: green;"> <span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> <span style="color: black;">cro12new(</span><span style="color: blue;">uint</span> <span style="color: black;">x)</span> <span style="color: green;">// |------|----|</span>
{ <span style="color: green;">// | x | ns |</span>
<span style="color: blue;">uint</span> <span style="color: black;">y = <span style="color: #990000;">0</span>, a = <span style="color: #990000;">0</span>, b = <span style="color: #990000;">1</span>, c = <span style="color: #990000;">0</span>;</span> <span style="color: green;">// |------|----|</span>
<span style="color: blue;">while</span> <span style="color: black;">(a < x)</span> <span style="color: green;">// | 0 | 4 |</span>
{ <span style="color: green;">// | 1 | 4 |</span>
<span style="color: black;">y++; </span> <span style="color: green;">// | 7 | 5 |</span>
<span style="color: black;">b += c; </span> <span style="color: green;">// | 63 | 7 |</span>
<span style="color: black;">a += b; </span> <span style="color: green;">// | 255 | 10 |</span>
<span style="color: black;">c += <span style="color: #990000;">6</span>; </span> <span style="color: green;">// | 1000 | 13 |</span>
} <span style="color: green;">// | 1023 | 15 |</span>
<span style="color: blue;">if</span> <span style="color: black;">(a != x) y--; </span> <span style="color: green;">// | 4095 | 24 |</span>
<span style="color: blue;">return</span> <span style="color: black;">y;</span> <span style="color: green;">// |------|----|</span>
<span style="color: black;"> }</span>
|----------------------------------|
| Times in ns (Athlon X4, XP, 2GB) |
|----------|---------|-------------|
| | | output type |
| function | input |------|------|
| | | uint | Xint |
|----------|---------|------|------|
| cro12 | < 4096 | <=25 | <60 |
| cro32 | <= ~0u | ~25 | ~80 |
| cro64 | <= ~0uL | ~330 | ~360 |
| | | | |
| CR12 | < 4096 | <=35 | <130 |
| CR32 | <= ~0u | ~35 | ~135 |
| CR64 | <= ~0uL | ~340 | ~460 |
|----------------------------------|
Abbreviations:
ref reference
CR Cube Root & Remainder CR(9)={2,1}
CRO Cube Root Only CRO(9)= 2
RND Random number
~ bitwise not operator, or depending
on context, approximately
~0u uint.MaxValue
~0uL ulong.MaxValue
ns nanosecond (10^-9 s)
us microsecond (10^-6 s)
ms millisecond (10^-3 s)
Times:
|------------------------------------------------------------------------|
| Athlon X4, XP, 2GB |
|--------|--------|--------||----------|---------||------------|---------|
| | ns | ns || | us || | ms |
| X | CRO(X) | CR(X) || bits RND | CR(RND) || bits RND | CR(RND) |
|--------|--------|--------||----------|---------||------------|---------|
| 0 | 35 | 97 || 65 | 4 || 100.000 | 13 |
| 1 | 36 | 98 || 100 | 8 || 200.000 | 31 |
| 100 | 42 | 103 || 200 | 14 || 500.000 | 92 |
| 1000 | 47 | 112 || 500 | 27 || 1.000.000 | 237 |
| 4095 | 59 | 124 || 1000 | 38 || 2.000.000 | 620 |
| 4096 | 66 | 129 || 2000 | 59 || 5.000.000 | 2330 |
| ~0u | 83 | 142 || 5000 | 134 || 10.000.000 | 6250 |
| ~0u+1 | 329 | 395 || 10000 | 341 || 20.000.000 | 16500 |
| ~0uL | 382 | 474 || 20000 | 1060 || | |
| ~0uL+1 | 3870 | 3820 || 50000 | 4360 || | |
| | | || 100000 | 12400 || | |
|--------|--------|--------||----------|---------||------------|---------|
Refs: Hacker's Delight
Henry S. Warren, Jr.
ISBN 0-201-91465-4
8th Printing February 2008
<a href="http://www.hackersdelight.org/">http://www.hackersdelight.org</a>
(11-2 Integer Cube Root)
Modern Computer Arithmetic
Richard Brent and Paul Zimmermann
version 0.1, October 2006
<a href="http://www.loria.fr/~zimmerma/mca/mca-0.1.pdf">http://www.loria.fr/~zimmerma/mca/mca-0.1.pdf</a>
(1.5.2 k-th Root (Cube Root))
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">using</span> System.Diagnostics;
<span style="color: blue;">using</span> System.Threading.Tasks;
<span style="color: blue;">using</span> Xint = System.Numerics.BigInteger;
<span style="color: blue;">class</span> Cube_Root
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint[] CR(Xint D)
{
<span style="color: blue;">if</span> (D <= ~<span style="color: maroon;">0uL</span>) <span style="color: blue;">return</span> D < <span style="color: maroon;">4096</span> ? CR12((<span style="color: blue;">uint</span>)D) : D <= ~<span style="color: maroon;">0u</span> ? CR32((<span style="color: blue;">uint</span>)D) : CR64((<span style="color: blue;">ulong</span>)D);
<span style="color: blue;">int</span> n = bL(D) / <span style="color: maroon;">6</span>, m = <span style="color: maroon;">2</span> * n;
Xint BA = D & ((Xint.One << m) - <span style="color: maroon;">1</span>); <span style="color: green;">// |-------D------|</span>
D >>= m; <span style="color: green;">// | |</span>
Xint C = D & ((Xint.One << n) - <span style="color: maroon;">1</span>); <span style="color: green;">// |-D-|-C-|--BA--|</span>
D >>= n;
Xint[] R = CR(D); <span style="color: green;">// R[0] = CubeRoot</span>
Xint R0R0 = SQ(R[<span style="color: maroon;">0</span>]);
Xint[] Q = DQR(C + (R[<span style="color: maroon;">1</span>] << n), <span style="color: maroon;">3</span> * R0R0); <span style="color: green;">// Q[0] = Quotient</span>
Xint Q0Q0 = SQ(Q[<span style="color: maroon;">0</span>]);
R[<span style="color: maroon;">1</span>] = BA + (Q[<span style="color: maroon;">1</span>] << m) - MTP(Q0Q0, Q[<span style="color: maroon;">0</span>] + ((<span style="color: maroon;">3</span> * R[<span style="color: maroon;">0</span>]) << n));
<span style="color: blue;">if</span> (R[<span style="color: maroon;">1</span>] < <span style="color: maroon;">0</span>)
{
R0R0 <<= m;
R0R0 += Q0Q0 + (MTP(Q[<span style="color: maroon;">0</span>], R[<span style="color: maroon;">0</span>]) << (n + <span style="color: maroon;">1</span>));
R[<span style="color: maroon;">0</span>] <<= n;
R[<span style="color: maroon;">0</span>] += Q[<span style="color: maroon;">0</span>];
R[<span style="color: maroon;">1</span>] += <span style="color: maroon;">1</span> + <span style="color: maroon;">3</span> * (R0R0 - R[<span style="color: maroon;">0</span>]);
R[<span style="color: maroon;">0</span>] -= <span style="color: maroon;">1</span>;
<span style="color: blue;">while</span> (R[<span style="color: maroon;">1</span>] < <span style="color: maroon;">0</span>)
{
R0R0 -= <span style="color: maroon;">1</span> + <span style="color: maroon;">2</span> * R[<span style="color: maroon;">0</span>];
R[<span style="color: maroon;">1</span>] += <span style="color: maroon;">1</span> + <span style="color: maroon;">3</span> * (R0R0 - R[<span style="color: maroon;">0</span>]);
R[<span style="color: maroon;">0</span>] -= <span style="color: maroon;">1</span>;
}
}
<span style="color: blue;">else</span>
{
R[<span style="color: maroon;">0</span>] <<= n;
R[<span style="color: maroon;">0</span>] += Q[<span style="color: maroon;">0</span>];
}
<span style="color: blue;">return</span> R;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint[] CR12(<span style="color: blue;">uint</span> x)
{
<span style="color: blue;">uint</span> y = <span style="color: maroon;">0</span>, z = <span style="color: maroon;">0</span>, r = <span style="color: maroon;">0</span>, s = <span style="color: maroon;">0</span>;
<span style="color: blue;">while</span> (r < x)
{
s = r;
z += y * <span style="color: maroon;">6</span>;
r += z + <span style="color: maroon;">1</span>;
y += <span style="color: maroon;">1</span>;
}
<span style="color: blue;">return</span> r == x ?
<span style="color: blue;">new</span> Xint[] { y, <span style="color: maroon;">0</span> } : <span style="color: green;">// no need to use s, replace "x - s" by "x - (r + z + 1)",</span>
<span style="color: blue;">new</span> Xint[] { y - <span style="color: maroon;">1</span>, x - s }; <span style="color: green;">// but it's much slower, why?</span>
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint[] CR32(<span style="color: blue;">uint</span> x)
{
<span style="color: blue;">uint</span> y = <span style="color: maroon;">0</span>, z = <span style="color: maroon;">0</span>, b = <span style="color: maroon;">0</span>;
<span style="color: blue;">int</span> s = <span style="color: maroon;">30</span>;
<span style="color: blue;">while</span> (s >= <span style="color: maroon;">0</span>)
{
y *= <span style="color: maroon;">2</span>;
z *= <span style="color: maroon;">4</span>;
b = <span style="color: maroon;">3</span> * y + <span style="color: maroon;">3</span> * z + <span style="color: maroon;">1</span> << s;
s -= <span style="color: maroon;">3</span>;
<span style="color: blue;">if</span> (x >= b)
{
x -= b;
z += <span style="color: maroon;">2</span> * y + <span style="color: maroon;">1</span>;
y += <span style="color: maroon;">1</span>;
}
}
<span style="color: blue;">return</span> <span style="color: blue;">new</span> Xint[] { y, x };
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint[] CR64(<span style="color: blue;">ulong</span> x)
{
<span style="color: blue;">uint</span> y = <span style="color: maroon;">0</span>;
<span style="color: blue;">ulong</span> z = <span style="color: maroon;">0</span>, b = <span style="color: maroon;">0</span>, bs = <span style="color: maroon;">0</span>;
<span style="color: blue;">int</span> s = <span style="color: maroon;">63</span>;
<span style="color: blue;">while</span> (s >= <span style="color: maroon;">0</span>)
{
y *= <span style="color: maroon;">2</span>;
z *= <span style="color: maroon;">4</span>;
b = <span style="color: maroon;">3</span> * y + <span style="color: maroon;">3</span> * z + <span style="color: maroon;">1</span>;
bs = b << s;
<span style="color: blue;">if</span> (x >= bs && b == bs >> s)
{
x -= bs;
z += <span style="color: maroon;">2</span> * y + <span style="color: maroon;">1</span>;
y += <span style="color: maroon;">1</span>;
}
s -= <span style="color: maroon;">3</span>;
}
<span style="color: blue;">return</span> <span style="color: blue;">new</span> Xint[] { y, x };
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint CRO(Xint X)
{
<span style="color: blue;">if</span> (X <= ~<span style="color: maroon;">0ul</span>) <span style="color: blue;">return</span> X < <span style="color: maroon;">4096</span> ? cro12((<span style="color: blue;">uint</span>)X) : X <= ~<span style="color: maroon;">0u</span> ? cro32((<span style="color: blue;">uint</span>)X) : cro64((<span style="color: blue;">ulong</span>)X);
Xint[] R = CR(X);
<span style="color: blue;">return</span> R[<span style="color: maroon;">0</span>];
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cro12(<span style="color: blue;">uint</span> x)
{
<span style="color: blue;">uint</span> y = <span style="color: maroon;">0</span>, z = <span style="color: maroon;">0</span>, r = <span style="color: maroon;">0</span>;
<span style="color: blue;">while</span> (r < x)
{
z += y * <span style="color: maroon;">6</span>;
r += z + <span style="color: maroon;">1</span>;
y += <span style="color: maroon;">1</span>; <span style="color: green;">// y > 1625 causes overflow of r</span>
}
<span style="color: blue;">return</span> r == x ? y : y - <span style="color: maroon;">1</span>;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cro32(<span style="color: blue;">uint</span> x)
{
<span style="color: blue;">uint</span> y = <span style="color: maroon;">0</span>, z = <span style="color: maroon;">0</span>, b = <span style="color: maroon;">0</span>;
<span style="color: blue;">int</span> s = <span style="color: maroon;">30</span>;
<span style="color: blue;">while</span> (s >= <span style="color: maroon;">0</span>)
{
y *= <span style="color: maroon;">2</span>;
z *= <span style="color: maroon;">4</span>;
b = <span style="color: maroon;">3</span> * y + <span style="color: maroon;">3</span> * z + <span style="color: maroon;">1</span> << s;
s -= <span style="color: maroon;">3</span>;
<span style="color: blue;">if</span> (x >= b)
{
x -= b;
z += <span style="color: maroon;">2</span> * y + <span style="color: maroon;">1</span>;
y += <span style="color: maroon;">1</span>;
}
}
<span style="color: blue;">return</span> y;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> cro64(<span style="color: blue;">ulong</span> x)
{
<span style="color: blue;">uint</span> y = <span style="color: maroon;">0</span>;
<span style="color: blue;">ulong</span> z = <span style="color: maroon;">0</span>, b = <span style="color: maroon;">0</span>, bs = <span style="color: maroon;">0</span>;
<span style="color: blue;">int</span> s = <span style="color: maroon;">63</span>;
<span style="color: blue;">while</span> (s >= <span style="color: maroon;">0</span>)
{
y *= <span style="color: maroon;">2</span>;
z *= <span style="color: maroon;">4</span>;
b = <span style="color: maroon;">3</span> * y + <span style="color: maroon;">3</span> * z + <span style="color: maroon;">1</span>;
bs = b << s;
<span style="color: blue;">if</span> (x >= bs && b == bs >> s)
{
x -= bs;
z += <span style="color: maroon;">2</span> * y + <span style="color: maroon;">1</span>;
y += <span style="color: maroon;">1</span>;
}
s -= <span style="color: maroon;">3</span>;
}
<span style="color: blue;">return</span> y;
}
<span style="color: green;">// Use the faster versions from: </span><span style="color: green;"><a href="http://bigintegers.blogspot.com/2013/07/nth-root-power.html">Nth Root</a></span> <span style="color: #38761d;">////////////////////////////////////////////////////</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint SQ(Xint U) { <span style="color: blue;">return</span> U * U; } <span style="color: green;">//</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint MTP(Xint U, Xint V) { <span style="color: blue;">return</span> U * V; } <span style="color: green;">//</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint[] DQR(Xint U, Xint V) <span style="color: green;">//</span>
{ <span style="color: green;">//</span>
Xint[] QR = <span style="color: blue;">new</span> Xint[<span style="color: maroon;">2</span>]; <span style="color: green;">//</span>
QR[<span style="color: maroon;">0</span>] = Xint.DivRem(U, V, <span style="color: blue;">out</span> QR[<span style="color: maroon;">1</span>]); <span style="color: green;">//</span>
<span style="color: blue;">return</span> QR; <span style="color: green;">//</span>
} <span style="color: green;">//</span>
<span style="color: green;">// Use the faster versions: http://www.bigintegers.blogspot.com/2013/07/nth-root-power.html //</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Stopwatch sw = <span style="color: blue;">new</span> Stopwatch();
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main()
{
<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = <span style="color: maroon;">1</span>; i < <span style="color: maroon;">100</span>; i++)
{
Xint X = RND(<span style="color: maroon;">8</span> * i);
<span style="color: green;">//X = Xint.Pow(X, 3);</span>
<span style="color: green;">//X--;</span>
<span style="color: green;">//X++;</span>
sw.Start(); Xint[] R = CR(X); sw.Stop();
<span style="color: blue;">if</span> (Xint.Pow(R[<span style="color: maroon;">0</span>], <span style="color: maroon;">3</span>) > X) Console.WriteLine(<span style="color: maroon;">"WRONG1"</span>);
<span style="color: blue;">if</span> (Xint.Pow(R[<span style="color: maroon;">0</span>] + <span style="color: maroon;">1</span>, <span style="color: maroon;">3</span>) <= X) Console.WriteLine(<span style="color: maroon;">"WRONG2"</span>);
<span style="color: blue;">if</span> (Xint.Pow(R[<span style="color: maroon;">0</span>], <span style="color: maroon;">3</span>) + R[<span style="color: maroon;">1</span>] != X) Console.WriteLine(<span style="color: maroon;">"WRONG3"</span>);
}
Console.WriteLine(sw.ElapsedMilliseconds + <span style="color: maroon;">" ms"</span>);
Console.ReadLine();
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> bL(Xint U)
{
<span style="color: blue;">byte</span>[] bytes = (U.Sign * U).ToByteArray();
<span style="color: blue;">int</span> i = bytes.Length - <span style="color: maroon;">1</span>;
<span style="color: blue;">return</span> i * <span style="color: maroon;">8</span> | bitLengthMostSignificantByte(bytes[i]);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> bitLengthMostSignificantByte(<span style="color: blue;">byte</span> b)
{
<span style="color: blue;">return</span> b < <span style="color: maroon;">08</span> ? b < <span style="color: maroon;">02</span> ? b < <span style="color: maroon;">01</span> ? <span style="color: maroon;">0</span> : <span style="color: maroon;">1</span> :
b < <span style="color: maroon;">04</span> ? <span style="color: maroon;">2</span> : <span style="color: maroon;">3</span> :
b < <span style="color: maroon;">32</span> ? b < <span style="color: maroon;">16</span> ? <span style="color: maroon;">4</span> : <span style="color: maroon;">5</span> :
b < <span style="color: maroon;">64</span> ? <span style="color: maroon;">6</span> : <span style="color: maroon;">7</span>;
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">int</span> seed;
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint RND(<span style="color: blue;">int</span> n)
{
<span style="color: blue;">if</span> (n < <span style="color: maroon;">2</span>) <span style="color: blue;">return</span> n;
<span style="color: blue;">if</span> (seed == <span style="color: blue;">int</span>.MaxValue) seed = <span style="color: maroon;">0</span>; <span style="color: blue;">else</span> seed++;
Random rand = <span style="color: blue;">new</span> Random(seed);
<span style="color: blue;">byte</span>[] bytes = <span style="color: blue;">new</span> <span style="color: blue;">byte</span>[(n + <span style="color: maroon;">15</span>) >> <span style="color: maroon;">3</span>];
rand.NextBytes(bytes);
<span style="color: blue;">int</span> i = bytes.Length - <span style="color: maroon;">1</span>;
bytes[i] = <span style="color: maroon;">0</span>;
n = (i << <span style="color: maroon;">3</span>) - n;
i--;
bytes[i] >>= n;
bytes[i] |= (<span style="color: blue;">byte</span>)(<span style="color: maroon;">128</span> >> n);
<span style="color: blue;">return</span> <span style="color: blue;">new</span> Xint(bytes);
}
<span style="color: blue;">private</span> <span style="color: blue;">static</span> Xint[] CRold(Xint D)
{
<span style="color: blue;">if</span> (D < <span style="color: maroon;">64</span>)
{
<span style="color: blue;">int</span> d = (<span style="color: blue;">int</span>)D;
<span style="color: blue;">if</span> (d >= <span style="color: maroon;">27</span>) <span style="color: blue;">return</span> <span style="color: blue;">new</span> Xint[] { <span style="color: maroon;">3</span>, d - <span style="color: maroon;">27</span> };
<span style="color: blue;">if</span> (d >= <span style="color: maroon;">08</span>) <span style="color: blue;">return</span> <span style="color: blue;">new</span> Xint[] { <span style="color: maroon;">2</span>, d - <span style="color: maroon;">08</span> };
<span style="color: blue;">if</span> (d >= <span style="color: maroon;">01</span>) <span style="color: blue;">return</span> <span style="color: blue;">new</span> Xint[] { <span style="color: maroon;">1</span>, d - <span style="color: maroon;">01</span> };
<span style="color: blue;">return</span> <span style="color: blue;">new</span> Xint[] { <span style="color: maroon;">0</span>, <span style="color: maroon;">0</span> };
}
<span style="color: blue;">int</span> n = bL(D) / <span style="color: maroon;">6</span>;
Xint Mask = (Xint.One << n) - <span style="color: maroon;">1</span>;
Xint A = D & Mask; D >>= n;
Xint B = D & Mask; D >>= n;
Xint C = D & Mask; D >>= n;
Xint[] R = CRold(D); <span style="color: green;">// R[0] = CubeRoot, R[1] = Remainder</span>
Xint R0R0 = SQ(R[<span style="color: maroon;">0</span>]);
Xint[] Q = DQR(C + (R[<span style="color: maroon;">1</span>] << n), <span style="color: maroon;">3</span> * R0R0); <span style="color: green;">// Q[0] = Quotient, Q[1] = Remainder</span>
Xint Q0Q0 = SQ(Q[<span style="color: maroon;">0</span>]);
R[<span style="color: maroon;">1</span>] = A + ((B + (Q[<span style="color: maroon;">1</span>] << n)) << n) - MTP(Q0Q0, Q[<span style="color: maroon;">0</span>] + ((<span style="color: maroon;">3</span> * R[<span style="color: maroon;">0</span>]) << n));
<span style="color: blue;">if</span> (R[<span style="color: maroon;">1</span>] < <span style="color: maroon;">0</span>)
{
R0R0 <<= n * <span style="color: maroon;">2</span>;
R0R0 += Q0Q0 + (MTP(Q[<span style="color: maroon;">0</span>], R[<span style="color: maroon;">0</span>]) << (n + <span style="color: maroon;">1</span>));
R[<span style="color: maroon;">0</span>] <<= n;
R[<span style="color: maroon;">0</span>] += Q[<span style="color: maroon;">0</span>];
R[<span style="color: maroon;">1</span>] += <span style="color: maroon;">1</span> + <span style="color: maroon;">3</span> * (R0R0 - R[<span style="color: maroon;">0</span>]);
R[<span style="color: maroon;">0</span>] -= <span style="color: maroon;">1</span>;
<span style="color: blue;">while</span> (R[<span style="color: maroon;">1</span>] < <span style="color: maroon;">0</span>)
{
R0R0 -= <span style="color: maroon;">1</span> + <span style="color: maroon;">2</span> * R[<span style="color: maroon;">0</span>];
R[<span style="color: maroon;">1</span>] += <span style="color: maroon;">1</span> + <span style="color: maroon;">3</span> * (R0R0 - R[<span style="color: maroon;">0</span>]);
R[<span style="color: maroon;">0</span>] -= <span style="color: maroon;">1</span>;
}
}
<span style="color: blue;">else</span>
{
R[<span style="color: maroon;">0</span>] <<= n;
R[<span style="color: maroon;">0</span>] += Q[<span style="color: maroon;">0</span>];
}
<span style="color: blue;">return</span> R;
}
}
</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com1tag:blogger.com,1999:blog-3824094400662352224.post-15865441963744594732013-08-08T16:55:00.000-07:002013-08-10T11:44:05.672-07:00Power Addition Only<div class="separator" style="clear: both; text-align: center;">
</div>
<pre><span style="color: green;">/*
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-n8DkDD1lYvg/UgFazwAYkvI/AAAAAAAAAKk/HVFUB6kM9k4/s1600/b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="237" src="http://3.bp.blogspot.com/-n8DkDD1lYvg/UgFazwAYkvI/AAAAAAAAAKk/HVFUB6kM9k4/s320/b.jpg" width="320" /></a><a href="http://3.bp.blogspot.com/-NaZ-0NwqRfE/UgFbZa3ZBaI/AAAAAAAAAKw/BiK7LegnfkQ/s1600/a.gif" style="margin-left: 1em; margin-right: 1em;">
</a>
</div>
</span><pre><span style="color: green;">Finding Powers using only additions?
Multiplication is repeated addition:
3*2 = 3+3 or 2+2+2
Powering is repeated multiplication:
3^3 = 3*3*3
= 3*(3+3+3)
= (3+3+3)+(3+3+3)+(3+3+3)
But here's something different. It came along while I wrote Cube Root code,
it went off topic, thus another topic, this one.</span>
</pre>
</pre>
<h2>
<span style="color: red;"><span style="font-size: large;"> x <span style="color: black;">x^4</span><br /> 0 <span style="color: black;">0 1 14 36 24 0</span><br /> 1 <span style="color: black;">1 15 50 60 24 0</span><br /> 2 <span style="color: black;">16 <span style="color: red;"><span style="color: black;">65 110 84 24 0</span></span></span><br /> 3 <span style="color: black;">81 175 194 108 24 0<br /> <span style="color: red;">4</span> 256 369 302 132 24 0</span></span></span></h2>
<pre><span style="color: green;">
Above each <b><span style="color: black;">black number</span></b> is the sum of the numbers above and right above it,
because: "see <a href="http://bigintegers.blogspot.com/2013/08/cube-root.html">Cube Root</a>".
_ _ _ _
| 0 1 14 36 24 | | A B C D E | F=A+B , G=B+C , ...
| 1 15 50 60 24 | | F G H I . |
| 16 65 110 84 24 | = | J K L . . |
| 81 175 194 108 24 | | M N . . . |
|_ 256 369 302 132 24 _| |_ P . . . . _|
Each row depends on the row above it, depends on the first (magic?) row.
The other way round: How to get the first row: "<b> 0,<span style="color: red;">1,14,36,24</span>,0</b> ",
from the first colum (x^4): " 0,1,16,81,256 ".
C=G-B G=J-F C=<span style="color: red;">1</span>J-</span><span style="color: green;"><span style="color: green;"><span style="color: red;">2</span></span>F+</span><span style="color: green;"><span style="color: green;"><span style="color: red;">1</span></span>A
B=F-A
D=H-C H=K-G D=1K-2G+1B K=M-J D=M-J-2J+2F+F-A D=</span><span style="color: green;"><span style="color: green;"><span style="color: red;">1</span></span>M-</span><span style="color: green;"><span style="color: green;"><span style="color: red;">3</span></span>J+</span><span style="color: green;"><span style="color: green;"><span style="color: red;">3</span></span>F-</span><span style="color: green;"><span style="color: green;"><span style="color: red;">1</span></span>A
C=G-B G=J-F
B=F-A
E=I-D I=L-H E=1L-2H+1C L=N-K E=N-K-2K+2G+G-B E=N-3K+3G-B N=P-M E=P-M-3M+3J+3J-3F-F+A E=</span><span style="color: green;"><span style="color: green;"><span style="color: red;">1</span></span>P-</span><span style="color: green;"><span style="color: green;"><span style="color: red;">4</span></span>M+</span><span style="color: green;"><span style="color: green;"><span style="color: red;">6</span></span>J-</span><span style="color: green;"><span style="color: green;"><span style="color: red;">4</span></span>F+</span><span style="color: green;"><span style="color: green;"><span style="color: red;">1</span></span>A
D=H-C H=K-G K=M-J
C=G-B G=J-F
B=F-A
A=<span style="color: red;"> <b>1</b></span>.0 A=1.0^4=0 A= +2A+1.0
B=<span style="color: red;"> <b>1</b></span>F-</span><span style="color: green;"><b><span style="color: green;"><span style="color: red;">1</span></span></b>A B=1.1^4-1.0^4 B= 1F-2A+1A
C=</span><span style="color: green;"><span style="color: green;"><span style="color: red;"> <b>1</b></span></span>J-</span><span style="color: green;"><b><span style="color: green;"><span style="color: red;">2</span></span></b>F+</span><span style="color: green;"><b><span style="color: green;"><span style="color: red;">1</span></span></b>A C=1.2^4-2.1^4+1.0^4 C=1J-2F+1A+1B-(1F-1A) C= 1J-3F+2A+1B
D=</span><span style="color: green;"><span style="color: green;"><span style="color: red;"> <b>1</b></span></span>M-</span><span style="color: green;"><b><span style="color: green;"><span style="color: red;">3</span></span></b>J+</span><span style="color: green;"><b><span style="color: green;"><span style="color: red;">3</span></span></b>F-</span><span style="color: green;"><b><span style="color: green;"><span style="color: red;">1</span></span></b>A D=1.3^4-3.2^4+3.1^4-1.0^4 D=1M-3J+3F-1A+1C-(1J-2F+1A) D= 1M-4J+5F-2A+1C
E=</span><span style="color: green;"><b><span style="color: green;"><span style="color: red;">1</span></span></b>P-</span><span style="color: green;"><b><span style="color: green;"><span style="color: red;">4</span></span></b>M+</span><span style="color: green;"><b><span style="color: green;"><span style="color: red;">6</span></span></b>J-</span><span style="color: green;"><b><span style="color: green;"><span style="color: red;">4</span></span></b>F+</span><span style="color: green;"><b><span style="color: green;"><span style="color: red;">1</span></span></b>A E=1.4^4-4.3^4+6.2^4-4.1^4+1.0^4 E=1P-4M+6J-4F+1A+1D-(1M-3J+3F-1A) E=1P-5M+9J-7F+2A+1D
<span style="color: red;">Pascal's Triangle</span></span></pre>
<pre><span style="color: green;">
The first row is part of <span style="color: red;"><a href="http://oeis.org/A131689">A131689</a></span> (~<span style="color: red;"><a href="http://oeis.org/A019538">A019538</a></span>): Triangle of numbers: T(n,k)=k!*Stirling2(n,k)</span>
<span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;">Next step: Use Pascal's triangle, use Binomial Coefficients ( C(.,.) ).
<span style="color: black;"> C(1,1).1^1 = 1 <span style="color: #38761d;">\</span>
<span style="color: #38761d;">\</span>
C(1,1).1^2 = 1 <span style="color: #38761d;">\</span>
C(2,2).2^2 - C(2,1).1^2 = 2 <span style="color: #38761d;">\</span>
<span style="color: #38761d;">\</span>
C(1,1).1^3 = 1 <span style="color: #38761d;">\</span>
C(2,2).2^3 - C(2,1).1^3 = 6 <span style="color: #38761d;"> A019538</span>
C(3,3).3^3 - C(3,2).2^3 + C(3,1).1^3 = 6 </span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;"><span style="color: black;"><span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;"><span style="color: black;"><span style="color: #38761d;">/</span></span></span></span></span></span>
</span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;"><span style="color: black;"><span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;"><span style="color: black;"><span style="color: #38761d;">/</span></span></span></span></span></span>
C(1,1).1^4 = <b><span style="color: red;">1</span></b> </span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;"><span style="color: black;"><span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;"><span style="color: black;"><span style="color: #38761d;">/</span></span></span></span></span></span>
C(2,2).2^4 - C(2,1).1^4 = <b><span style="color: red;">14</span></b> </span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;"><span style="color: black;"><span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;"><span style="color: black;"><span style="color: #38761d;">/</span></span></span></span></span></span>
C(3,3).3^4 - C(3,2).2^4 + C(3,1).1^4 = <b><span style="color: red;">36</span></b> </span></span></span></span></span><span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;"><span style="color: black;"><span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;"><span style="color: black;"><span style="color: #38761d;">/</span></span></span></span></span></span>
C(4,4).4^4 - C(4,3).3^4 + C(4,2).2^4 - C(4,1).1^4 = <b><span style="color: red;">24 </span></b><span style="color: #38761d;">/</span></span>
</span></span></span>
*/</span>
<span style="color: blue;">using</span> System;
<span style="color: blue;">class</span> Power_Addition_Only
{
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> T(<span style="color: blue;">uint</span> n, <span style="color: blue;">uint</span> k) <span style="color: green;">// OEIS: </span><span style="color: green;"><span style="color: green;"><span style="color: red;"><span style="color: #38761d;"><span style="color: black;"><span style="color: #38761d;">A019538</span></span></span></span></span></span><span style="color: green;"> =============================>> // 1</span>
{ <span style="color: green;">// 1</span>
<span style="color: blue;">return</span> F(k) * S2(n, k); <span style="color: green;">// 2</span>
} <span style="color: green;">// 1</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> S2(<span style="color: blue;">uint</span> n, <span style="color: blue;">uint</span> k) <span style="color: green;">// Stirling numbers // 6</span>
{ <span style="color: green;">// 2nd kind // 6</span>
<span style="color: blue;">if</span> (n == k) <span style="color: blue;">return</span> <span style="color: maroon;">1</span>; <span style="color: green;">// 1</span>
<span style="color: blue;">if</span> (n == <span style="color: maroon;">0</span> || k == <span style="color: maroon;">0</span>) <span style="color: blue;">return</span> <span style="color: maroon;">0</span>; <span style="color: green;">// 14</span>
n--; <span style="color: green;">// 36</span>
<span style="color: blue;">return</span> k * S2(n, k--) + S2(n, k); <span style="color: green;">// 24</span>
} <span style="color: green;">// 1</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span> F(<span style="color: blue;">uint</span> k) <span style="color: green;">// Factorial // 30</span>
{ <span style="color: green;">// 150</span>
<span style="color: blue;">uint</span> f = <span style="color: maroon;">1</span>; <span style="color: green;">// 240</span>
<span style="color: blue;">while</span> (k > <span style="color: maroon;">1</span>) f *= k--; <span style="color: green;">// 120</span>
<span style="color: blue;">return</span> f; <span style="color: green;">// 1</span>
} <span style="color: green;">// 62</span>
<span style="color: green;">// 540</span>
<span style="color: blue;">static</span> <span style="color: blue;">void</span> Main() <span style="color: green;">// 1560</span>
{ <span style="color: green;">// 1800</span>
Console.WriteLine(); <span style="color: green;">// 720</span>
powers(<span style="color: maroon;">4</span>, <span style="color: maroon;">4</span>); <span style="color: green;">// 1</span>
powers(<span style="color: maroon;">3</span>, <span style="color: maroon;">1</span>); <span style="color: green;">// 126</span>
powers(<span style="color: maroon;">21</span>, <span style="color: maroon;">6</span>); <span style="color: green;">// 1806</span>
powers(<span style="color: maroon;">15</span>, <span style="color: maroon;">7</span>); <span style="color: green;">// 8400</span>
powers(<span style="color: maroon;">9</span>, <span style="color: maroon;">9</span>); <span style="color: green;">// 16800</span>
Console.ReadLine(); <span style="color: green;">// 15120</span>
} <span style="color: green;">// 5040</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> powers(<span style="color: blue;">uint</span> x, <span style="color: blue;">uint</span> p) <span style="color: green;">// up to x^p // 1</span>
{ <span style="color: green;">// 254</span>
Console.WindowWidth = <span style="color: maroon;">105</span>; <span style="color: green;">// 5796</span>
Console.WindowHeight = Console.LargestWindowHeight - <span style="color: maroon;">10</span>; <span style="color: green;">// 40824</span>
Console.WriteLine(<span style="color: maroon;">" x^"</span> + p); <span style="color: green;">// 126000</span>
Console.WriteLine(); <span style="color: green;">// 191520</span>
<span style="color: blue;">int</span> i = <span style="color: maroon;">0</span>, j; <span style="color: green;">// 141120</span>
<span style="color: blue;">uint</span>[] v = Init(p); <span style="color: green;">// 40320</span>
<span style="color: blue;">int</span> vL = v.Length - <span style="color: maroon;">1</span>; <span style="color: green;">// 1</span>
<span style="color: blue;">for</span> (j = <span style="color: maroon;">0</span>; j <= vL; j++) Console.Write(<span style="color: maroon;">"{0,10}"</span>, v[j]); <span style="color: green;">// 510</span>
Console.WriteLine(); <span style="color: green;">// 18150</span>
<span style="color: blue;">for</span> (; i < x; i++) <span style="color: green;">// 186480</span>
{ <span style="color: green;">// 834120</span>
<span style="color: blue;">for</span> (j = <span style="color: maroon;">0</span>; j < vL; ) v[j++] += v[j]; <span style="color: green;"> // 1905120</span>
<span style="color: blue;">for</span> (j = <span style="color: maroon;">0</span>; j <= vL; j++) Console.Write(<span style="color: maroon;">"{0,10}"</span>, v[j]); <span style="color: green;">// 2328480</span>
Console.WriteLine(); <span style="color: green;">// 1451520</span>
} <span style="color: green;">// 362880</span>
Console.WriteLine(); <span style="color: green;">// 1</span>
Console.WriteLine(); <span style="color: green;">// 1022</span>
} <span style="color: green;">// 55980</span>
<span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">uint</span>[] Init(<span style="color: blue;">uint</span> i) <span style="color: green;">// get Initial value's // 818520</span>
{ <span style="color: #38761d;">// 5103000</span>
<span style="color: blue;">uint</span>[] v = <span style="color: blue;">new</span> <span style="color: blue;">uint</span>[i + <span style="color: maroon;">1</span>]; <span style="color: #38761d;">// 16435440</span>
v[<span style="color: maroon;">0</span>] = <span style="color: maroon;">0</span>; <span style="color: #38761d;">// 29635200</span>
<span style="color: blue;">for</span> (<span style="color: blue;">uint</span> j = <span style="color: maroon;">1</span>; j <= i; j++) <span style="color: #38761d;">// 30240000</span>
v[j] = T(i, j); <span style="color: #38761d;">// 16329600</span>
<span style="color: blue;">return</span> v; <span style="color: #38761d;">// 3628800</span>
} <span style="color: #38761d;">// 1</span>
}
</pre>
Peterhttp://www.blogger.com/profile/17272766252412661668noreply@blogger.com0