Talk:Rare numbers: Difference between revisions

m
→‎Tweaks, C++: Further syntax-highlighting fixes
m (→‎Tweaks, C++: Further syntax-highlighting fixes)
 
(6 intermediate revisions by 3 users not shown)
Line 76:
== the 1<sup>st</sup> REXX version ==
This is the 1<sup>st</sup> REXX version, &nbsp; before all the optimizations were added:
<syntaxhighlight lang="rexx">
<lang rexx>/*REXX program to calculate and display an specified amount of rare numbers. */
numeric digits 20; w= digits() + digits() % 3 /*ensure enough decimal digs for calcs.*/
parse arg many start . /*obtain optional argument from the CL.*/
Line 103 ⟶ 104:
if _>=0 then do; x= _; $= $ + q
end
end /*while q>1*/; return $</lang>
</syntaxhighlight>
Pretty simple, &nbsp; but slow as molasses in January.
 
Line 112 ⟶ 114:
of &nbsp; ''rare'' &nbsp; numbers) &nbsp; within Shyam Sunder Gupta's
<br>[http://www.shyamsundergupta.com/rare.htm <u>webpage</u>] &nbsp; have been incorporated in this REXX program.
<langsyntaxhighlight lang="rexx">/*REXX program to calculate and display an specified amount of rare numbers. */
numeric digits 20; w= digits() + digits() % 3 /*ensure enough decimal digs for calcs.*/
parse arg many start . /*obtain optional argument from the CL.*/
Line 219 ⟶ 221:
if _>=0 then do; x= _; $= $ + q
end
end /*while q>1*/; return $</langsyntaxhighlight>
Still pretty sluggish, &nbsp; like molasses in March.
 
Line 521 ⟶ 523:
square containing the combination 9 or 14 as the first/last digit.
 
<langsyntaxhighlight lang="go">package main
import (
Line 778 ⟶ 780:
bStart = time.Now() // restart block timing
}
}</langsyntaxhighlight>
{{out}}
Results on the core i7-7700 @ 3.6Ghz.
Line 862 ⟶ 864:
:I've also updated Nigel's C++ version with the same tweaks:
 
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <functional>
#include <bitset>
Line 902 ⟶ 904:
int main(){
Rare(19);
}</langsyntaxhighlight>
:Compiling this with g++ brings the overall execution time down from 30 to 21 minutes in round figures. So the figures for clang or mingw may well come in at below 10 minutes now.
 
Line 922 ⟶ 924:
== Tweaks, C++ ==
Wringing out some more performance here, just over 5 minutes for 19 digits by themselves, and just over 6 minutes for digits 2 thru 19. See the code comments for details on what was tweaked. Curiously, I found that the g++ version executes faster than the clang++ version. Compiler arguments used: <code>g++ rare.cpp -o rare.exe -std=c++17 -O3</code><br/>Curious to see if it can go faster on a different platform - But the original executed faster on g++ than clang++ for me on my platform too. Perhaps I don't have clang++ set up the same as others?
<langsyntaxhighlight lang="cpp">// Rare Numbers : Nigel Galloway - December 20th., 2019
 
/*
Line 1,058 ⟶ 1,060:
printf("%4s %19s %11s %10s %5s %11s %9s\n", "nth", "forward", "rt.sum", "rt.diff", "digs", "block.et", "total.et");
for (int nd = 2; nd <= max; nd++) Rare(int(nd));
}</langsyntaxhighlight>
{{out}}
Results on the core i7-7700 @ 3.6Ghz.
Line 1,271 ⟶ 1,273:
</pre>
--[[User:Nigel Galloway|Nigel Galloway]] ([[User talk:Nigel Galloway|talk]]) 14:09, 4 January 2021 (UTC)
* diffsDo 2 through 11 digits by only looking at "middles" (no "outers") pre-computation ofaccomplished squaresby doesadding an additional definition for nLH() that takes only multiplesthe function of 9optional don'tlong compute everywhen squaredoing upless tothat 12 100_000digits, splitlimit diffs pre-computationto ofbe squaresabove from sums pre-computationzero, and eachsums hasto abe separateabove a limit forat which smaller squares produced are less than the preforward number itself (pow10[n-computation:1] One* lot4) of bsmakeL(), ismakeH() enoughreturn fornLH() anynow, program.instead Bothof rangesnLH() cancomponents: beOkay storedbut inno aneed singlefor pilean ofextra bsglobal variable. IfIt theis rangesreally overlapa theyparameter areto stillnLH's bothconstructor (single) as now only one constructor is truerequired.--[[User:Nigel Galloway|Nigel Galloway]] ([[User talk:Nigel Galloway|talk]]) 14:09, 4 January 2021 (UTC)
* 8The do 2 through 11 digits by only looking atpair "middlesconstruction" (noshouldn't "outers") - accomplished by addingincur an additionaloverhead definition for nLH() that takes onlyas the functioncompiler ofshould optionaloptimize longit away. whenIt doingadds less that 12 digits, limit diffsflexability to bethe above zerodesign, and sums to be above a limit at which smaller squares produced are less than the forward number itself (pow10[n-1] * 4) makeL(), makeH() return nLH() now, instead of nLH() components: Okay but no need for an extra global variable. It is really a parameter to nLH's constructor (single) as now onlywhich oneI constructorshall isreserve requiredjudgement.--[[User:Nigel Galloway|Nigel Galloway]] ([[User talk:Nigel Galloway|talk]]) 14:09, 4 January 2021 (UTC)
:::Thank you for the code review and adopting some of the tweaks I presented. Good fix for my awkward handling of digits 2-11. I agree about the pair construction, I only removed it to speed up my C# translation, which was slightly impacting performance (perhaps due to an awkward translation on my part.)<br><br>
* The pair "construction" shouldn't incur an overhad as the compiler should optimize it away. It adds flexability to the design, the need for which I shall reserve judgement.--[[User:Nigel Galloway|Nigel Galloway]] ([[User talk:Nigel Galloway|talk]]) 14:09, 4 January 2021 (UTC)
:::I agree that digit '5' ought to be considered in the "diff" side. Even though it doesn't contribute to any solution in the ''Int64'' range, if ''Int128'' ever becomes part of C++, your program should be easily extended to the point where checking "diff 5" will contribute a solution. My decision to omit checking '5' was for performance reasons since we are constricted to ''Int64''.--[[User:Enter your username|Enter your username]] ([[User talk:Enter your username|talk]]) 00:01, 25 January 2021 (UTC)
 
== 21+ digit rare numbers ==
35

edits