{"id":1282,"date":"2016-04-21T19:28:20","date_gmt":"2016-04-21T17:28:20","guid":{"rendered":"http:\/\/eskerahn.dk\/?p=1282"},"modified":"2024-03-05T01:52:34","modified_gmt":"2024-03-05T00:52:34","slug":"1282","status":"publish","type":"post","link":"https:\/\/eskerahn.dk\/?p=1282","title":{"rendered":"Working with numbers in Q with large nominator\/denominator in C#"},"content":{"rendered":"<p>A nerdy idea:<\/p>\n<p>A C# class that <strong>quicly can supply a lot of primes<\/strong> (here limited to about the largest prime about 50G &#8211; as arrays with over 2G entries are not currently supported without splitting the arrays)<\/p>\n<p>A struct that supports basic arithmetic for <strong>large accurately represented numbers in Q,<\/strong>\u00a0 by factorization into primes.<\/p>\n<p>A test program that tries to find solutions for <strong>a!b!=c!<\/strong> with 1&lt;a&lt;b&lt;c<\/p>\n<p><!--more--><\/p>\n<p><strong>UPDATE:<\/strong> The\u00a0 text (and code) here has beed modified quite a few times, last time 2016-05-09. (I have changed the basics of the &#8216;motors&#8217; a few times too&#8230;)<\/p>\n<p>&nbsp;<\/p>\n<p>Currently the <strong>Primes<\/strong> can deliver up to 4G primes (in a few minutes).<\/p>\n<p>(I speeded the prime-part up by making a class with a variant of the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Sieve_of_Atkin\">Sieve of Atkins<\/a> &#8211; slightly improved. I have also made it <strong>dynamical expanding<\/strong> (though that could be optimized!). Or you can chose to allocate a bunch initially. adding the first 26 millions primes less than 22222\u00b2 can be done in a few second. It can do both a bit array of prime yes\/no and\/or a list of primes.<\/p>\n<p>Flags can change the behaviour. if the isprime (Bit)Array is wanted (adds some limitations) it can be used rather than just for a temporary array for generating the primelist. I made that in two variants. A fast one, and one with a 64-bit entry array that can handle up to 256G, saving odd only, if a prime LIST is also needed it tops around 50G as the largest prime held in an array holding all lesser prime, due to the 2G entry limit.<\/p>\n<p>Currently the <strong>LargeQ<\/strong> has been modified so Addition and Subtraction is faster using BigInteger for adding the remaining denominator after removing already found common factors. The BigInt will be factorized when used for multiplications or division. This is a compromise solution, so problems using mainly plus\/minus do not need to use time on the factorisation, on the other hand if the problems (like the below) uses multiplication and division only, things are kept normalised. Note that displaying the value, will lead to normalisation (to display &#8220;1\/2&#8221; rather than &#8220;3\/6&#8221;)<\/p>\n<p>Example: 6\/35+14\/55 = [2*3]\/[5*7]+[2*7]\/[5*11] = [2]\/[5*7*11] [3*11+7*7] = [2]\/[5*7*11] (82) and if needed to [2]\/[5*7*11] [2*41] = [2*2*41]\/[5*7*11]<br \/>\nHere the 33, 49 and 82 are converted to BigInteger, and only factorised if needed. This makes stuff like repeated\u00a0 A +=B\u00a0 a LOT faster<\/p>\n<p>&nbsp;<\/p>\n<p>The <strong>LargeQ<\/strong> was developed to work with the below prime-problem, but I&#8217;m sorry to admit that the overhead in writing this in .Net does that it is actually a bit faster to just use <strong>BigInteger<\/strong> for this problem. See it more as an example, than as a place to use it&#8230;\u00a0 Using the LargeQ for it, time is wasted on creating and deleting objects, making the memory consumption fluctuate.<\/p>\n<p>The test problem here, is to look for solutions to <strong>a!b!=c!<\/strong> where <strong>1&lt;a&lt;b&lt;c.<\/strong> The obvious\/banal ones with a!=c=b+1 are thus found also.<br \/>\nEven on a simple laptop, <strong>c<\/strong> up to 40 millions (~11!) are done in about 100 seconds. It tests over a billion <strong>c<\/strong>&#8216;s per hour, and currently past 100 billions, and only found 6!7!=10! as a &#8216;real&#8217; solution. Due to the logarithmic &#8216;filter&#8217;. only about 4 <strong>b<\/strong>&#8216;s per million <strong>c<\/strong> needs to be accurately tested &#8211; so the algorithm used for the full factorials is not that important any more (Bigint or largeQ)<\/p>\n<p>&nbsp;<\/p>\n<h3>Code, Flags and using<\/h3>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\r\n\/\/#define UseLargeQ \/\/ Use LargeQ OR BigInteger for the test whether an actual product is a Factorial\r\n\/\/#define UsePreallocatedPrimes\r\n\/\/#define DEBUG\r\n\/\/#define UseGlobalIsPrimeArray \/\/Slightly more efficent, but limits the max to short of 2^31 0x7FFEA80F 46340\u00b2-1 \/ next square could not be Int32 addressed\r\n#define UseGlobalIsPrimeUI64Array \/\/Should be able to hold primes (less 2) up to 8G in 1G memory, with a max of 256G in 16GB memory\r\n\/\/#define StorePrimeList \/\/ONLY omit this with &quot;UseGlobalIsPrimeUI64Array&quot; set\r\n\r\n#define UseIsPrimeBitArray \/\/Generally more efficent and spacesaving, but for small arrays slightly slower than boolean array\r\n#define gcAllowVeryLargeObjects\u00a0 \/\/Set if the option is set in config, and on 64bit and need above 2GB data-elements\r\n\/\/See this link\u00a0 https:\/\/msdn.microsoft.com\/en-us\/library\/hh285054%28v=vs.110%29.aspx\r\n\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Numerics;\r\nusing System.Collections;\r\n\r\nnamespace FactorialProducts\r\n{\r\n\u00a0\u00a0\u00a0 using Ntyp = UInt64;\r\n\u00a0\u00a0\u00a0 using SqNtyp = UInt64; \/\/due to mem-size, limit to 32...\r\n\u00a0\u00a0\u00a0 using IdxTyp = Int32; \/\/The only currently allowed\r\n\u00a0\u00a0\u00a0 using Factorisation4 = List&lt;Int64&gt;; \/\/ N ^ x, xxxxxxxxxNNNNNNNN\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>Code, Primes<\/h3>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\r\n\u00a0\u00a0\u00a0 static class Primes {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/public static Ntyp gcd(Ntyp x, Ntyp y) { if (x == 0 || y == 0) return x + y; else return gcd(y, x % y); }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static SqNtyp gcd(SqNtyp x, SqNtyp y) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x == 0 || y == 0) return x + y;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 do {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((x %= y) == 0) return y;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((y %= x) == 0) return x;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } while (true);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static SqNtyp lcm(Ntyp x, Ntyp y) { if (x == 0 || y == 0) return 0; else return ((SqNtyp)(x \/ gcd(x, y))) * y; }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private static bool&#x5B;] IsPrimeOneToNine = new bool&#x5B;] { false, false, true, true, false, true, false, true, false, false }; \/\/2,3 and 5 are primes to small for the Sieve of Atkins...\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private static Ntyp HighestNTested = 9;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static Ntyp HighestNTestedForPrimes { get { return HighestNTested; } }\r\n#if (StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private static List&lt;Ntyp&gt; _PrimesList = new List&lt;Ntyp&gt;() { 2, 3, 5, 7 }; \/\/seed with primes less than 3\u00b2\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static List&lt;Ntyp&gt; PrimesList { get { return _PrimesList; } }\r\n#endif\r\n#if (UseGlobalIsPrimeUI64Array)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private static List&lt;UInt64&gt; GlobalOddIsPrimeU64Bits=new List&lt;UInt64&gt;{0xE};\/\/ =1110b (that is 7,5,3 and not 1) only set for 1-7 EXCEPT 2 initially...\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static Ntyp? NextPrimeLargerThan(Ntyp N) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (N&lt;=1) return 2;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp M = (N+ (N &amp; 1)) \/ 2; \/\/ This is (N'-1)\/2, with N' the next odd N, that is odd add two, even add one\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while ((M &gt;&gt; 6) &lt; (UInt64)GlobalOddIsPrimeU64Bits.Count) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (0 != (GlobalOddIsPrimeU64Bits&#x5B;(IdxTyp)(M &gt;&gt; 6)] &amp; (((UInt64)1) &lt;&lt; (Byte)(M &amp; 63)))) return M * 2 + 1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 M++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return null; \/\/######??????\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static Ntyp? NextPrimeSmallerThan(Ntyp N) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (N&lt;=2 || (UInt64)GlobalOddIsPrimeU64Bits.Count&lt; (N &gt;&gt; 7)) return null;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (N==3) return 2;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp M = (N-2- (N &amp; 1)) \/ 2; \/\/ This is (N'-1)\/2, with N' the previous odd N, that is odd subtract two, even substract one\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (0&lt;M) { \/\/Condition to keep compiler happy\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (0 != (GlobalOddIsPrimeU64Bits&#x5B;(IdxTyp)(M &gt;&gt; 6)] &amp; (((UInt64)1) &lt;&lt; (Byte)(M &amp; 63)))) return M * 2 + 1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 M--;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return null; \/\/Keep compiler happy\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static UInt64 BitCount(UInt64 x) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/string xx = x.ToString(&quot;X&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/+-------------------------------+\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/| 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |\u00a0 &lt;-x\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/| 1\u00a0\u00a0 0 | 0\u00a0\u00a0 1 | 0\u00a0\u00a0 1 | 0\u00a0\u00a0 0 |\u00a0 &lt;-first time merge\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/| 0\u00a0\u00a0 0\u00a0\u00a0 1\u00a0\u00a0 1 | 0\u00a0\u00a0 0\u00a0\u00a0 0\u00a0\u00a0 1 |\u00a0 &lt;-second time merge\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/| 0\u00a0\u00a0 0\u00a0\u00a0 0\u00a0\u00a0 0\u00a0\u00a0 0\u00a0\u00a0 1\u00a0\u00a0 0\u00a0\u00a0 0 |\u00a0 &lt;-third time Half bytes to bytes\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/+-------------------------------+\u00a0 The rest is plain add of bytes\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x -=\u00a0\u00a0\u00a0\u00a0 (x &gt;&gt; 1)\u00a0 &amp; 0x5555555555555555; ; \/\/Here lies the 'magic' counting in quarter-bytes\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = (x\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &amp; 0x3333333333333333) +\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (\u00a0\u00a0\u00a0 (x &gt;&gt; 2)\u00a0 &amp; 0x3333333333333333);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = (x + (x &gt;&gt; 4)) &amp; 0x0F0F0F0F0F0F0F0F; \/\/ Half Bytes to bytes .n.n.n.n.n.n.n.n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x +=\u00a0\u00a0\u00a0\u00a0 (x &gt;&gt; 8); \/\/Every even byte -- ..nn..nn..nn..nn\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x +=\u00a0\u00a0\u00a0\u00a0 (x &gt;&gt; 16);\/\/Every even byte in every even word -- ......nn......nn\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x +=\u00a0\u00a0\u00a0\u00a0 (x &gt;&gt; 32);\/\/Every even byte in every even word in every even dword -- ............nn\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return x &amp; 0xFF;\u00a0\u00a0 \/\/leaving only lowest byte\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static UInt64 PrimesCount() {\r\n\u00a0 #if (!StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt64 Cnt = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach (UInt64 U in GlobalOddIsPrimeU64Bits) Cnt+=BitCount(U) ;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return Cnt;\r\n\u00a0 #else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return _PrimesList.Count;\r\n\u00a0 #endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n#else\r\n\u00a0 #if (UseGlobalIsPrimeArray)\r\n\u00a0\u00a0\u00a0 #if (UseIsPrimeBitArray)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private static BitArray\u00a0\u00a0 IsPrimeAtkinDyn = new BitArray\u00a0 (IsPrimeOneToNine);\r\n\u00a0\u00a0\u00a0 #else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private static List&lt;bool&gt; IsPrimeAtkinDyn = new List&lt;bool&gt;(IsPrimeOneToNine);\r\n\u00a0\u00a0\u00a0 #endif\r\n\u00a0 #endif\r\n#endif\r\n\r\n#if (!StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static Ntyp IsNull(Ntyp? X, Ntyp Default) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return X != null ? (Ntyp)X : Default;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Prime by number. Note that a dynamic list is maintained so a request for a high number might take a while, populating the list with the intermediate ones\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;param name=&quot;no&quot;&gt;index in primes list, 0 for &quot;2&quot;&lt;\/param&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static Ntyp PrimesByNo(IdxTyp no) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Ntyp HighestNTested = _PrimesList.Last();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (_PrimesList.Count&lt;=no &amp;&amp; FillPrimesAtkinDynAddAbout25PctPlus1000(HighestNTested)) {;};\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (_PrimesList.Count&lt;=no) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HighestNTested += 2;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bool skip = false;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach (Ntyp p in _PrimesList) { if (HighestNTested &lt; p * p || (skip = gcd(p, HighestNTested) != 1)) break; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (!skip) _PrimesList.Add(HighestNTested);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return _PrimesList&#x5B;(Int32)no]; \/\/This will give the needed exception if the callers int-increments wrap around to negative...\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Is the number a prime?\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Behind the scene a dynamic list of primes is maintained, so this could take a while if large primes has to be found first\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ If NOT within the capacity of the list, numbers up the square of the highest cachable prime could be checked by simple check on all primes less \u221aN\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;param name=&quot;CachableOnly&quot;&gt;Only test if within the reach of cache, otherwise return false&lt;\/param&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static bool isprime(Ntyp N, bool CachableOnly=false) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (HighestNTested&lt;N) if (!FillPrimesAtkinDynAddAbout25PctPlus1000((Ntyp)N)) if (CachableOnly) return false;\r\n#if (UseGlobalIsPrimeUI64Array)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (N &lt;= HighestNTested) return (N==2 || ((N&amp;1)==1 &amp;&amp; 0!=(GlobalOddIsPrimeU64Bits&#x5B;(IdxTyp)(N &gt;&gt; 7)] &amp; (((UInt64)1) &lt;&lt; ((Byte)(N &amp; 126) \/ 2)))));\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (N &lt;= HighestNTested) return 0 &lt;= _PrimesList.BinarySearch((UInt32)N); \/\/In some contexts, this could speed up things.\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bool skip = false; \/\/Try the simple way, this should work up to the square of the largest stored prime...\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IdxTyp ppoi = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp P=1; \/\/SMALLER than first prime\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (true) {\r\n#if (!StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 P = (Ntyp)NextPrimeLargerThan(P);\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 P = PrimesByNo(ppoi++);\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (N &lt; (SqNtyp)P * P || (skip = gcd(P, N) != 1)) break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return !skip;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private static UInt64 MaxCacheMB { get {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt64 TmpOut =\r\n#if (gcAllowVeryLargeObjects)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2048* sizeof(Ntyp);\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2047;\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt64.TryParse(System.Configuration.ConfigurationManager.AppSettings.Get(&quot;MaxCacheMB&quot;), out TmpOut);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return TmpOut;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } }\r\n\r\n#if (StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private static IdxTyp MaxListLenNTyp \/\/This is a 'constant', but COULD be modified on OM-error\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = (IdxTyp) Math.Min( (UInt64)1048576* MaxCacheMB \/sizeof(Ntyp), 0x7FFFFFC7);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/0x7FEFFFFF=2G-1M-1, maxvalue allowed for any type array. (Byte-type arrays might be 0x7FFFFFC7=2G-56-1 though)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/see also https:\/\/msdn.microsoft.com\/en-us\/library\/hh285054%28v=vs.110%29.aspx\r\n#endif\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static bool FillPrimesAtkinDynAddAbout25PctPlus1000(Ntyp SeedN) {return FillPrimesAtkinDyn(SeedN + (SeedN &gt;&gt; 2)+1000);}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static bool FillPrimesAtkinDyn(Ntyp NextMax) {\r\n#if (!UseGlobalIsPrimeArray)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bool res=false;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (HighestNTested &lt; NextMax) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp LastHighestNTested = HighestNTested;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Console.WriteLine(&quot;{0:X16} {1:X16} {2:X16} {3:X16}&quot;, NextMax, (UInt64)HighestNTested + UInt32.MaxValue, (UInt64)HighestNTested , Int32.MaxValue);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp NextMaxCalc = (Ntyp)Math.Min(NextMax, (UInt64)HighestNTested+Int32.MaxValue);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 res |= FillPrimesAtkinDynInner(NextMaxCalc);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (LastHighestNTested== HighestNTested) break;\r\n#if (DEBUG &amp;&amp; StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(&quot; ## {0}, max {1}&quot;, Primes.PrimesList.Count, Primes.PrimesList.Last()); \/\/ ###########\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static bool FillPrimesAtkinDynInner(Ntyp limit) {\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ en.wikipedia.org\/wiki\/Sieve_of_Atkin\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ for (i,j) in NxN\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/3.1) 4x\u00b2+y\u00b2, y odd : flip when mod 60 in {1,13,17,29,37,41,49,53}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/3.2) 3x\u00b2+y\u00b2, x odd, y even : flip when mod 60 in {7,19,31,43}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/3.3) 3x\u00b2-y\u00b2, 2\u2264x, 1\u2264y&lt;x x-y odd : flip when mod 60 in {11,23,47,59}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ for (i,j) in NxN\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Note that: \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 (y\u00b2 % 60) are {0,1,4,9,16,21,24,25,36,40,45,49} \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 (y\u00b2 % 12) are {0,1,4,9} since 0,..,5 gives 0,1,4,9,4,1 \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ The fact that (x+6n)\u00b2 % 12 = (x\u00b2+12nx+36n\u00b2) % 12 = x\u00b2 % 12 are use to ignre adds of 6\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/on 3.1) \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ 4x\u00b2+y\u00b2 mod 60 possible values : 1 5 9 13 17 21 25 29 33 37 41 45 49 53 57\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 (4x\u00b2 % 12) are {0,4} since 0,..,5 gives 0,4,4,0,4,4 \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 (4x\u00b2+y\u00b2 % 12) are {0,1,4,5,8,9} \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 mod 60 {1,13,17,29,37,41,49,53}={1,9,13,17,21,29,33,37,41,45,49,53,57}\\{9+12i}={1+4j}\\{5+20k}\\{9+12i}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/on 3.2)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ 3x\u00b2+y\u00b2 mod 60 possible values : 1 5 9 13 17 21 25 29 33 37 41 45 49 53 57\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 (3x\u00b2 % 12) are {0,3} (multipli 0,1,4,9 by 3, and mod 12)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 mod 60 (7,19,31,43} = {7+12i}\\{55+60j}, and as 55 not possible no need to exclude\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 So only when (y\u00b2 % 12) = 4 we can get 7, so that is the start limit\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/on 3.3)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ 3x\u00b2-y\u00b2 mod 60 possible values : 3 11 15 23 27 35 39 47 51 59\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 3x\u00b2-y\u00b2, lowest value for fixed y when x=y+1 is 2y\u00b2+6y+3, so we start at {0,1,4,9}*2+3+n*6 % 12 ={3,5,11,9}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 (3x\u00b2 % 12) are {0,3} (multiply 0,1,4,9 by 3, and mod 12)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 (11,23,47,59) mod 60 -&gt; (11-12i)\\(33+*60j), and as 33 not possible no need to exclude\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 So only when (y\u00b2 % 12) = 11 we can get 11, so that is the start limit, and as +3 is not wanted only every second x is needed, adding 0 mod 12 every time\r\n\r\n#if (StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (MaxListLenNTyp &lt;= _PrimesList.Count) return false; \/\/List already full....\r\n#endif\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt64 LastMax = HighestNTested;\r\n#if (UseGlobalIsPrimeUI64Array)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 limit = limit|127; \/\/Round op to one below closest 127 bit border, that is &quot;...x1111111&quot; Note the last bit is NOT used as only Odd primes are saved\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (0x7FFFFFC7 &lt;= (limit-LastMax)) limit -= 128; \/\/ Too many added in the line above, back down...\r\n#endif\r\n\r\n#if (UseGlobalIsPrimeArray)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt64 ArrOfs = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 limit = Math.Min(limit, 0x7FFFFFC7);\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt64 ArrOfs = LastMax + 1;\r\n#if (UseIsPrimeBitArray)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BitArray IsPrimeAtkinDyn = new BitArray(0);\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 List&lt;bool&gt; IsPrimeAtkinDyn = new List&lt;bool&gt;(){};\r\n#endif\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (limit &lt;= HighestNTested) return false; \/\/Already got enough....\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp sqrtNmax = (Ntyp)Math.Ceiling(Math.Sqrt(limit)); \/\/Round up\r\n\r\n#if (UseIsPrimeBitArray)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IsPrimeAtkinDyn.Length += (int)(limit - LastMax); for (SqNtyp i = LastMax + 1; i &lt;= limit; i++) IsPrimeAtkinDyn&#x5B;(int)(i - ArrOfs)] = false;\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IsPrimeAtkinDyn.AddRange(Enumerable.Repeat(false, (int)(limit - LastMax)));\r\n#endif\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt64 y2;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp x;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ NOTE:\u00a0 (y2 % 12) are {0,1,4,9} since 0,..,5 gives 0,1,4,9,4,1 and (x+6n)\u00b2 % 12 = (x\u00b2+12nx+36n\u00b2) % 12 = x\u00b2 % 12\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/\/ in the increments below: Delta x\u00b2 from x-1 to x is (x-1)\u00b2-x\u00b2 = 2x-1 , used with 4x or 3x so 8x-4 or 6x-3\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt64 nstart;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (Ntyp y = 1; y &lt;= sqrtNmax; y++) { \/\/First value is y\u00b2+4, so Floor(Sqrt(LastMax-4)) should be a good start\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y2 = (UInt64)y * y;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = 1; \/\/4x\u00b2+y\u00b2 , 3.1) see above\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 nstart = 4 + y2;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((y2 % 4) == 1) \/\/ 1,5 or 9 mod 12, since nn only can adjust start with 0 or 8 mod 12\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/for (SqNtyp nn = 4 + y2; nn &lt;= limit; nn += (SqNtyp)8 * ++x - 4) if ((nn % 12) != 9 &amp;&amp; (nn % 20) != 5) IsPrime&#x5B;nn] ^= true;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (UInt64 nn = nstart; nn &lt;= limit; nn += (UInt64)8 * ++x - 4)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (LastMax &lt; nn) if ((nn % 12) != 9) IsPrimeAtkinDyn&#x5B;(int)(nn-ArrOfs)] ^= true;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (Ntyp y = 1; y &lt;= sqrtNmax; y++) { \/\/First value is y\u00b2+3, so Floor(Sqrt(LastMax-3)) should be a good start\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y2 = (UInt64)y * y;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = 1; \/\/3x\u00b2+y\u00b2 , 3.2) see above\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 nstart = 3 + y2;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((y2 % 12) == 4) \/\/ 7 +\/- 3 as nn only can adjust start with 0 or 3 mod 12, so only four from {0,1,4,9} can give 7\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (UInt64 nn = nstart; nn &lt;= limit; nn += (UInt64)12 * ++x, x++)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (LastMax &lt; nn) IsPrimeAtkinDyn&#x5B;(int)(nn - ArrOfs)] ^= true; \/\/as only the +3 not the +0 can give 7, only every second is relevant!!\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (Ntyp y = 1; y &lt;= sqrtNmax; y++) { \/\/First value is 2y\u00b2+6y+3=2(y+1\u00bd)\u00b2-1\u00bd, so Floor(Sqrt((LastMax+1.5)\/2)-1.5) should be a good start\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y2 = (UInt64)y * y;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x = y + 1; \/\/3x\u00b2-y\u00b2, so first is 2y\u00b2+6y+3 , 3.3) see above\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 nstart = 2 * y2 + 6 * y + 3; \/\/{0,1,4,9}*2+3+n*6 % 12 ={3,5,11,9}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ((nstart % 12) == 11) \/\/ 11 +\/- 3 as nn only can adjust start with 0 or 3 mod 12, so only 11 from {3,5,11,9} can give 11\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (UInt64 nn = nstart; nn &lt;= limit; nn += (UInt64)12 * ++x, x++)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (LastMax &lt; nn) IsPrimeAtkinDyn&#x5B;(int)(nn-ArrOfs)] ^= true; \/\/as only the +3 not the +0 can give 11, only every second is relevant!!\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt64 n2;\r\n#if (!StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp P = 3; \/\/Start by testing with 5 (=Next prime from 3)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (P &lt;= sqrtNmax) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (LastMax&lt;P) P+=2; \/\/Simple guess, next odd\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 P = IsNull(NextPrimeLargerThan(P) , (LastMax + 1)|1 );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (LastMax&lt;P) \/\/NO! NOT part of previous IF !!!\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (!IsPrimeAtkinDyn&#x5B;(int)(P - ArrOfs)]) continue;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 n2 = (SqNtyp)P * P;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (UInt64 q = (((UInt64)LastMax) \/ n2 + 1) * (n2); q &lt;= limit; q += n2) IsPrimeAtkinDyn&#x5B;(int)(q - ArrOfs)] = false;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int ppoi = 2; \/\/5 is index 2 on the zerobased primelist\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (Ntyp n = 5; n &lt;= sqrtNmax; n++) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (n &lt;= LastMax) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (_PrimesList.Last()&lt;n || n &lt; _PrimesList&#x5B;ppoi]) continue; \/\/not on primelist\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ppoi++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else if (!IsPrimeAtkinDyn&#x5B;(int)(n - ArrOfs)]) continue;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 n2 = (SqNtyp)n * n;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (UInt64 q = (((UInt64)LastMax) \/ n2 + 1) * (n2); q &lt;= limit; q += n2) IsPrimeAtkinDyn&#x5B;(int)(q - ArrOfs)] = false;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int PrimesAddCou = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Pass 1\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (SqNtyp n = HighestNTested + 1; n &lt;= limit; n++)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (IsPrimeAtkinDyn&#x5B;(int)(n - ArrOfs)]) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (MaxListLenNTyp &lt;= _PrimesList.Count+ PrimesAddCou) { limit = n-1; break; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PrimesAddCou++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Extend if needed and possible\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int OM_Reduce = Math.Max(0,PrimesList.Count - MaxListLenNTyp + PrimesAddCou);\r\n#if (UseGlobalIsPrimeUI64Array)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OM_Reduce= (OM_Reduce+127)&amp;(-128); \/\/Round up to multipla of 128\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while ( _PrimesList.Capacity &lt; PrimesList.Count + PrimesAddCou - OM_Reduce)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try { _PrimesList.Capacity = PrimesList.Count + PrimesAddCou - OM_Reduce; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 catch (OutOfMemoryException) { OM_Reduce += 1000000;} \/\/Try to backout a few MB\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (0 &lt; OM_Reduce) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MaxListLenNTyp = PrimesList.Count - OM_Reduce + PrimesAddCou;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(&quot;\\r Out of cache space, further caching is stopped a few MB short&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Pass 2\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (SqNtyp n = HighestNTested + 1; n &lt;= limit; n++) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (IsPrimeAtkinDyn&#x5B;(int)(n - ArrOfs)]) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (MaxListLenNTyp &lt;= _PrimesList.Count\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ) { limit = n-1; break; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 _PrimesList.Add((Ntyp)n);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (MaxListLenNTyp &lt;= _PrimesList.Count)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(&quot;\\r (Prime-cache is full {0} primes, 2-{1})&quot;, _PrimesList.Count, _PrimesList.Last());\r\n#endif\r\n\r\n#if (UseGlobalIsPrimeUI64Array)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GlobalOddIsPrimeU64Bits.AddRange(Enumerable.Repeat((UInt64)0, (int)((limit - HighestNTested)&gt;&gt;7))) ;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (SqNtyp n = HighestNTested + 1; n &lt;= limit; n++)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (IsPrimeAtkinDyn&#x5B;(int)(n - ArrOfs)])\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 GlobalOddIsPrimeU64Bits&#x5B;(IdxTyp)(n &gt;&gt; 7)] |= (((UInt64)1) &lt;&lt; ((Byte)(n &amp; 126)\/2));\r\n#endif\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bool res = HighestNTested != (SqNtyp)limit;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HighestNTested = (Ntyp)limit;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 }\r\n\/\/\/\/\r\n\/\/ http:\/\/webprimes.com\/?index=1073741824\r\n\/\/ prime&#x5B;1073741824] 24563311309\r\n\r\n<\/pre>\n<h3>Code, LargeQ<\/h3>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\r\n\u00a0\u00a0\u00a0 public struct LargeQ\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public BigInteger SignMM { get; private set; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public int Sign{get {return SignMM.Sign;}} \/\/-1, 0, +1\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private Factorisation4 _factorisation4;\/\/ null: Zero , empty list One....\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static public LargeQ Zero() { return new LargeQ((Int64)0); }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private void NormaliseToFactors() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (SignMM==0) return; \/\/0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BigInteger temp = BigInteger.Abs(SignMM);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (temp==1) return; \/\/ +\/- 1: already factorised\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Factorise...\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Factorisation4 Fact = new Factorisation4 { };\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int ppoi = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp P=1; \/\/SMALLER than first prime\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BigInteger DivRes, rem;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (1 &lt; temp) {\r\n#if (!StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 P = (Ntyp)Primes.NextPrimeLargerThan(P);\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 P = Primes.PrimesByNo(ppoi);\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int pow = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (1 &lt; temp) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DivRes=BigInteger.DivRem(temp,P, out rem);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (rem == 0) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pow++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp = DivRes;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(pow!=0)Fact.Add(((Int64)pow&lt;&lt;32)|(UInt32)P);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ppoi++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SignMM = Sign; \/\/ +\/- 1\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FactListMultiplyPow(_factorisation4, Fact,+1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Create a number from an BigInteger\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public LargeQ(BigInteger x) : this(){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 _factorisation4 = new Factorisation4 { }; \/\/SignMM * 1\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SignMM = x;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/public LargeQ(Int64 x) : this((BigInteger)x){}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public LargeQ(Int64 x) : this(){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 _factorisation4 = new Factorisation4 { }; \/\/Sign * 1\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SignMM = Math.Sign(x);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x == 0) {return;}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Factorise...\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt64 temp = (UInt64)(x * Sign);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int ppoi = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp P=1; \/\/SMALLER than first prime\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (1 &lt; temp) {\r\n#if (!StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 P = (Ntyp)Primes.NextPrimeLargerThan(P);\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 P = Primes.PrimesByNo(ppoi++);\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int pow = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (1 &lt; temp &amp;&amp; temp % P == 0) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pow++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp \/= P;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (pow != 0) _factorisation4.Add(((Int64)pow&lt;&lt;32)|(UInt32)P);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/public LargeQ(Int32 x) : this((BigInteger)x){}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public LargeQ(Int32 x) : this((Int64)x) { }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static public implicit operator LargeQ(Int32 value) { return new LargeQ(value); }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static public implicit operator Int32(LargeQ value) { return (Int32)value.deFactorizeI(); } \/\/Might loose some...\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static public implicit operator LargeQ(Int64 value) { return new LargeQ(value); }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static public implicit operator Int64(LargeQ value)\u00a0 { return value.deFactorizeI(); }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static public implicit operator LargeQ(BigInteger value) { return new LargeQ(value); }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static public implicit operator BigInteger(LargeQ value) { return value.deFactorizeBi(); }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static public implicit operator double(LargeQ value) { return value.deFactorizeDbl(); }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public bool isone() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CleanTail();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return _factorisation4.Count==0 &amp;&amp; SignMM==1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public bool isint(){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CleanTail();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach (Int64 FNP in _factorisation4) if (FNP &lt; 0) return false; \/\/x in Q\\N\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return true;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Clone the number\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public LargeQ(LargeQ x) : this() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 _factorisation4 = new Factorisation4(x._factorisation4);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SignMM = x.SignMM;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Attempt to create the Int64 representing the number, might give overflow, and will be inaccurate for non integral numbers.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public Int64 deFactorizeI() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Int64 res = 1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int ppoi = 0; ppoi &lt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 _factorisation4.Count; ppoi++)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int i = 1; i &lt;=\u00a0 (Int32)(_factorisation4&#x5B;ppoi]&gt;&gt;32);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 i++) res *= (_factorisation4&#x5B;ppoi] &amp; 0xFFFFFFFF);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int ppoi = 0; ppoi &lt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 _factorisation4.Count; ppoi++)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int i =\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (Int32)(_factorisation4&#x5B;ppoi]&gt;&gt;32); i &lt; 0; i++) res \/= (_factorisation4&#x5B;ppoi] &amp; 0xFFFFFFFF);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res * ((1 &lt; BigInteger.Abs(SignMM)) ? (Int64)SignMM : Sign); \/\/Might overflow\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Create the BigInteger representing the number, will be inaccurate for non integral numbers.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public BigInteger deFactorizeBi() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BigInteger res = 1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int ppoi = 0; ppoi &lt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 _factorisation4.Count; ppoi++)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int i = 1; i &lt;=\u00a0 (Int32)(_factorisation4&#x5B;ppoi]&gt;&gt;32);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 i++) res *= (_factorisation4&#x5B;ppoi] &amp; 0xFFFFFFFF);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int ppoi = 0; ppoi &lt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 _factorisation4.Count; ppoi++)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int i =\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (Int32)(_factorisation4&#x5B;ppoi]&gt;&gt;32); i &lt; 0; i++) res \/= (_factorisation4&#x5B;ppoi] &amp; 0xFFFFFFFF);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res * ((1&lt;BigInteger.Abs(SignMM))? SignMM:Sign);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Log10(number) as double. This is usualy possible to calculate (for positive numbers of course) without owerflow\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public double Log10deFactorizeDbl() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (SignMM&lt;=0) throw new ArithmeticException(&quot;Logarithm to none positive number&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double res = 0.0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (1&lt;SignMM) res = BigInteger.Log10(SignMM); \/\/We have checked that it is positive.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int ppoi = 0; ppoi &lt; _factorisation4.Count; ppoi++) res += (Int32)(_factorisation4&#x5B;ppoi]&gt;&gt;32) * Math.Log10(_factorisation4&#x5B;ppoi] &amp; 0xFFFFFFFF);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Convert the number to double, often possible, but may well loose accuracy, especially for large numbers\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public double deFactorizeDbl() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (Sign==0) return 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double res = 0.0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int ppoi = 0; ppoi &lt; _factorisation4.Count; ppoi++) res += (Int32)(_factorisation4&#x5B;ppoi]&gt;&gt;32) * Math.Log10(_factorisation4&#x5B;ppoi] &amp; 0xFFFFFFFF);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 res=Math.Pow(10,res); \/\/May throw exception\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res * ((1 &lt; BigInteger.Abs(SignMM)) ? (double)SignMM : Sign);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private static void FactListMultiplyPow(Factorisation4 XF, Factorisation4 YF, Int32 k) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int ComLng = Math.Min(XF.Count, YF.Count);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (YF.Count == 0) return;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt32 PX; Int32 VX = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt32 PY; Int32 VY = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int poiX = XF.Count - 1; int poiY = YF.Count - 1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (0&lt;=poiX || 0&lt;=poiY ) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (poiX &lt; 0) PX = 0; else { VX = (Int32)(XF&#x5B;poiX]&gt;&gt;32); PX=(UInt32)XF&#x5B;poiX]; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (poiY &lt; 0) PY = 0; else { VY = (Int32)(YF&#x5B;poiY]&gt;&gt;32); PY=(UInt32)YF&#x5B;poiY]; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if\u00a0\u00a0\u00a0\u00a0\u00a0 (PY &lt; PX) {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 poiX--; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if (PX &lt; PY) { XF.Insert(poiX+1,(((Int64)(VY*k))&lt;&lt;32)+PY); poiY--;}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if (PX &lt; PY) { XF.Insert(poiX+1,YF&#x5B;poiY]); poiY--;}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\/\/(PX== PY)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Int32 XY = VX + VY*k;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (XY==0) XF.RemoveAt(poiX); else XF&#x5B;poiX]=((Int64)XY&lt;&lt;32)+PX;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 poiX--; poiY--;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/private static void FactListMultiply(Factorisation4 XF, Factorisation4 YF) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 FactListMultiplyPow(XF, YF, +1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/private static void FactListDivide(Factorisation4 XF, Factorisation4 YF) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 FactListMultiplyPow(XF, YF, -1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Multiply the element with another raised to power. X = X * (Y^k)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;param name=&quot;x&quot;&gt;&lt;\/param&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;param name=&quot;y&quot;&gt;The Y that X is multipied\/divided with a suitable number of times&lt;\/param&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;param name=&quot;k&quot;&gt;Power, eg +1 and -1 for plain multiplikation and division&lt;\/param&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static LargeQ MultiplyPow(LargeQ x, LargeQ y, Int32 k) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (k&lt;0 &amp;&amp; y.Sign==0) throw new DivideByZeroException();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x.Sign==0|| y.Sign==0) return Zero();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x.NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y.NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ res = new LargeQ(x);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FactListMultiplyPow(res._factorisation4, y._factorisation4, k);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 res.SignMM = x.Sign*(k%1==1?y.Sign:1); \/\/if the sign of x swapped only if k is odd and y&lt;0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static LargeQ operator *(LargeQ x, LargeQ y) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return MultiplyPow(x, y, +1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/if (x.Sign==0|| y.Sign==0) return Zero();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/x.NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/y.NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/LargeQ res = new LargeQ(x);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/FactListMultiply(res._factorisation4, y._factorisation4);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/res.SignMM = x.Sign*y.Sign;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/return res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static LargeQ operator \/(LargeQ x, LargeQ y) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return MultiplyPow(x, y, -1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/if (x.Sign==0) return Zero();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/if (y.Sign==0) throw new DivideByZeroException();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/x.NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/y.NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/LargeQ res = new LargeQ(x);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/FactListDivide(res._factorisation4, y._factorisation4);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/res.SignMM = x.Sign * y.Sign;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/return res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Remove zero-entries from the tail of the primefactor lists\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private void CleanTail(){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (Sign==0 &amp;&amp; 0 &lt; _factorisation4.Count) _factorisation4.Clear();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public bool isdivisor(LargeQ y){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/return ((this\/y).isint());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y.NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (y._factorisation4.Count == 0) return true;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Factorisation4 XF =\u00a0\u00a0 _factorisation4;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Factorisation4 YF = y._factorisation4;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt32 PX; Int32 VX = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt32 PY; Int32 VY = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int poiX = XF.Count - 1; int poiY = YF.Count - 1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (0&lt;=poiX || 0&lt;=poiY ) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (poiX &lt; 0) PX = 0; else { VX = (Int32)(XF&#x5B;poiX]&gt;&gt;32); PX=(UInt32)XF&#x5B;poiX]; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (poiY &lt; 0) PY = 0; else { VY = (Int32)(YF&#x5B;poiY]&gt;&gt;32); PY=(UInt32)YF&#x5B;poiY]; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if\u00a0\u00a0\u00a0\u00a0\u00a0 (PY &lt; PX) {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 poiX--; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if (PX &lt; PY) {if( 0&lt;VY)return false; poiY--; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\/\/(PX== PY)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(VX&lt;VY)return false;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 poiX--; poiY--;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return true;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static bool operator ==(LargeQ x, LargeQ y) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x.Sign != y.Sign) return false;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x.NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y.NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x._factorisation4.Count != y._factorisation4.Count) return false;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int ppoi = 0; ppoi &lt; x._factorisation4.Count; ppoi++)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x._factorisation4&#x5B;ppoi] != y._factorisation4&#x5B;ppoi]) return false;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return true;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static bool operator !=(LargeQ x, LargeQ y) {return !(x == y);}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public override bool Equals(object obj) { return obj==null ? false : this == (LargeQ)obj; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public override int GetHashCode() { return this._factorisation4.GetHashCode(); }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static LargeQ Factorial(Int64 x) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ Res = x;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (1 &lt; x) Res *= (--x);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return Res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Check if the element could be a!, start without calculating a!, by simply checking for a minimal occurence of each prime p\u2264a\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ every 1 in w has w as a divisor, so for each w the occurrence nw of w in a! will abide a+1\u2264w(nw+1), this also go for every prime.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;param name=&quot;a&quot;&gt;&lt;\/param&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public bool IsFactorial(Int64 a) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Int64 P =2; IdxTyp ppoi =0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Int32 pow;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (P&lt;=a) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (_factorisation4.Count&lt;=ppoi || ((UInt32)_factorisation4&#x5B;ppoi] &amp; 0xFFFFFFFF) !=P) return false; \/\/all primes must be present\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pow = (Int32)(_factorisation4&#x5B;ppoi]&gt;&gt;32);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (P*(pow+1)&lt;a+1) return false; \/\/every 1 in p number has p as a divisor, at the least once, this goes for all p.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ppoi++;\r\n#if (!StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 P = (Int64)Primes.NextPrimeLargerThan((Ntyp)P);\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 P = (Int64)Primes.PrimesByNo(ppoi);\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return (Factorial(a) == this);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static LargeQ Factorial(UInt32 x)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return Factorial((Int64)x);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/LargeQ Res = new LargeQ((Int64)x);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/while (1&lt;x) Res*=((Int64)(--x));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/return Res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static LargeQ operator -(LargeQ x) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ res = new LargeQ(x);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 res.SignMM = -res.SignMM;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static LargeQ operator +(LargeQ x) { return x; }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Split a number into its integral denominator and nominator\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;param name=&quot;denominator&quot;&gt;&lt;\/param&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;param name=&quot;nominator&quot;&gt;&lt;\/param&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public void splitFraction(out LargeQ denominator, out LargeQ nominator) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 denominator = new LargeQ(this);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (this.isint()) { nominator = 1; return; }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 denominator.NormaliseToFactors();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 nominator = new LargeQ(denominator);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 nominator.SignMM=+1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(int i=denominator._factorisation4.Count-1;0&lt;=i;i--) if ( denominator._factorisation4&#x5B;i]&lt;0) denominator._factorisation4.RemoveAt(i);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(int i=\u00a0 nominator._factorisation4.Count-1;0&lt;=i;i--) if (0&lt;=nominator._factorisation4&#x5B;i]\u00a0 )\u00a0\u00a0 nominator._factorisation4.RemoveAt(i);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\u00a0\u00a0 nominator._factorisation4&#x5B;i] = (nominator._factorisation4&#x5B;i] &amp; 0xFFFFFFFF)*2\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -nominator._factorisation4&#x5B;i]; \/\/Swap to positive!\u00a0 X+P -&gt; 2P-(X+P) = -X + P for the prime P and power X\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 denominator.CleanTail();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 nominator.CleanTail();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public void splitFraction(out BigInteger denominatorBi, out BigInteger nominatorBi) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ denominator;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ nominator;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 splitFraction(out denominator, out nominator);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 denominatorBi = denominator;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 nominatorBi =\u00a0\u00a0 nominator;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public override string ToString() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return ToString(&quot;R&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public string ToString(string format) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/return &quot;####DEBUG_DISABLED####&quot;; \/\/####DEBUG#### to avoid the normalisition to be done implicit\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (isint()) return (deFactorizeBi().ToString());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BigInteger denominator;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BigInteger nominator;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BigInteger IntegralPart=0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 splitFraction(out denominator, out nominator);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bool AbsOverOne=BigInteger.Abs(nominator)&lt;BigInteger.Abs(denominator);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 switch (format){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case &quot;G&quot;: format=(AbsOverOne?&quot;{2:R};&quot;:&quot;&quot;)+&quot;{0:R}\/{1:R}&quot;; break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case &quot;R&quot;: format=\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &quot;{0:R}\/{1:R}&quot;; break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (AbsOverOne &amp;&amp; 0&lt;=format.IndexOf(&quot;{2&quot;)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IntegralPart=BigInteger.DivRem(denominator, nominator, out denominator);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 denominator =BigInteger.Abs(denominator);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return String.Format(format, denominator, nominator, IntegralPart);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Largest common divisor. including fractions. 6\/77 and 26\/35 returns 2\/(5*7*11), BUT ignoring UNNORMALISED factors for speed!!\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static LargeQ gcd_NORMALIZEDONLY(LargeQ x, LargeQ y) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x.Sign==0 &amp;&amp; y.Sign==0) return 1; \/\/A matter of definition.... Exception?\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (x.Sign==0) return new LargeQ(y);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (y.Sign==0) return new LargeQ(x);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/#### OBS OBS Ignore the value part of SignMM;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ res = 1;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Factorisation4 XF = x._factorisation4;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Factorisation4 YF = y._factorisation4;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int poiX = 0; int poiY = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt32 PX; Int32 VX = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UInt32 PY; Int32 VY = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (poiX&lt;XF.Count || poiY&lt;YF.Count) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (XF.Count&lt;=poiX) PX = UInt32.MaxValue; else { VX = (Int32)(XF&#x5B;poiX] &gt;&gt; 32); PX = (UInt32)XF&#x5B;poiX]; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (YF.Count&lt;=poiY) PY = UInt32.MaxValue; else { VY = (Int32)(YF&#x5B;poiY] &gt;&gt; 32); PY = (UInt32)YF&#x5B;poiY]; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if\u00a0\u00a0\u00a0\u00a0\u00a0 (PX &lt; PY) { {if((Int32)VX&lt;0) res._factorisation4.Add(XF&#x5B;poiX]);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }; poiX++;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if (PY &lt; PX) { {if((Int32)VY&lt;0) res._factorisation4.Add(YF&#x5B;poiY]);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 };\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 poiY++; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {VX=Math.Min(VX,VY); if(VX!=0){ res._factorisation4.Add((((Int64)VX)&lt;&lt;32)+PX); }; poiX++; poiY++; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ Largest common divisor. including fractions. 6\/77 and 26\/35 returns 2\/(5*7*11), dividing with this leaves integers (3*5 and 11*13)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/ &lt;\/summary&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static LargeQ gcd(LargeQ x, LargeQ y) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x.NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y.NormaliseToFactors();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return gcd_NORMALIZEDONLY(x, y);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static LargeQ operator +(LargeQ x, LargeQ y) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Simplified by dividing out largest common divisor before the add, as less needs to be expanded for the sum\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Method example: 6\/35+14\/55 = &#x5B;2*3]\/&#x5B;5*7]+&#x5B;2*7]\/&#x5B;5*11] = &#x5B;2\/5] &#x5B;3\/7+7\/11] = &#x5B;2]\/&#x5B;5*7*11] &#x5B;3*11+7*7] = &#x5B;2]\/&#x5B;5*7*11] (82) = &#x5B;2]\/&#x5B;5*7*11] &#x5B;2*41] = &#x5B;2*2*41]\/&#x5B;5*7*11]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ Res = gcd_NORMALIZEDONLY(x, y); \/\/Note this INCLUDES both fractional parts for fractions\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ x_r = new LargeQ(x); FactListMultiplyPow(x_r._factorisation4, Res._factorisation4,-1); \/\/The result is a (potentially large) integer\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ y_r = new LargeQ(y); FactListMultiplyPow(y_r._factorisation4, Res._factorisation4,-1); \/\/do\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/LargeQ x_r = new LargeQ(x); FactListDivide(x_r._factorisation4, Res._factorisation4); \/\/The result is a (potentially large) integer\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/LargeQ y_r = new LargeQ(y); FactListDivide(y_r._factorisation4, Res._factorisation4); \/\/do\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Res.SignMM = ((BigInteger)x_r) + ((BigInteger)y_r); \/\/If large BigInteger is needed, the decoding back to LargeQ is going to be slow.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return Res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static LargeQ operator -(LargeQ x, LargeQ y) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return x+(-y);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 }\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>Code, Main with test<\/h3>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\r\n\u00a0\u00a0\u00a0 class Program\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static List&lt;double&gt; SortedLog10nFac = new List&lt;double&gt; { 0 };\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static void FillSortedLog10nFacUpToLog10X(double Log10X)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (SortedLog10nFac.Last() &lt; Log10X) SortedLog10nFac.Add(SortedLog10nFac.Last() + Math.Log10(SortedLog10nFac.Count));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public static BigInteger FactorialBi(Ntyp x)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BigInteger Res = 1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (1 &lt; x) Res *= (x--);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return Res;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static void Main(string&#x5B;] args)\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n#if (DEBUG)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Console.WriteLine(Environment.Is64BitProcess);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int q1 = 3; q1 &lt;= 1003; q1 += 10) Primes.FillPrimesAtkinDyn((Ntyp)(q1 * q1));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Primes.FillPrimesAtkinDyn((Ntyp)(1003 * 1003));\r\n#if (StorePrimeList)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Int32 XX = Primes.PrimesList.Count; \/\/78941\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp YY = Primes.PrimesList.Last(); \/\/1006007\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp? YY = Primes.NextPrimeSmallerThan(8); \/\/1006007\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 YY = Primes.NextPrimeSmallerThan((Ntyp)YY); \/\/5\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 YY = Primes.NextPrimeSmallerThan((Ntyp)YY); \/\/3\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 YY = Primes.NextPrimeSmallerThan((Ntyp)YY); \/\/2\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 YY = Primes.NextPrimeSmallerThan((Ntyp)YY); \/\/Null\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 YY = Primes.HighestNTestedForPrimes; \/\/1006079 10003^2=1006009 rounded up to nearest 128 minus 1\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 YY = Primes.NextPrimeSmallerThan(Primes.HighestNTestedForPrimes); \/\/1006063\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 YY = Primes.PrimesCount();\/\/78943\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bool ZZ = Primes.isprime(9973); \/\/true; IsPrimeAtkinDyn.Count=1006010 = 1003*1003+1\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/for (UInt32 i = 23171; i &lt; 999999;i+=1 ) Primes.FillPrimesAtkinDyn(i * i);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ Xq = ((new LargeQ(77) * 99));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ Yq = Xq + Xq + Xq + Xq;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Yq -= Xq;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Yq.isdivisor(11));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Yq \/= 11;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Yq.isdivisor(11));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Yq \/= 11;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Yq.isdivisor(11));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Yq \/= 11;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Yq.ToString());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Yq *= 11;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Xq = (LargeQ)1 \/ 2;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Xq.ToString());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Xq.ToString());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Xq.ToString());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Yq = (LargeQ)1 \/ 6;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Yq.ToString());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Yq.ToString());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Yq.ToString());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Xq -= Yq;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Xq -= Yq;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Xq -= 7;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Xq.ToString());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Xq.ToString(&quot;R&quot;));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(Xq.ToString(&quot;G&quot;));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Xq -= Yq;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Xq += Yq;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Xq += 7;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Xq += Yq;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Xq += Yq;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Xq += Yq;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Method example: 6\/35+14\/55 = &#x5B;2*3]\/&#x5B;5*7]+&#x5B;2*7]\/&#x5B;5*11] = &#x5B;2]\/&#x5B;5*7*11] &#x5B;3*11+7*7] = &#x5B;2]\/&#x5B;5*7*11] (82) = &#x5B;2]\/&#x5B;5*7*11] &#x5B;2*41] = &#x5B;2*2*41]\/&#x5B;5*7*11]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ A = (LargeQ)6 \/ 35;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ B = (LargeQ)14 \/ 55;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ AB = A * B;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ AdB = A \/ B;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ C = A + B;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ D = C * (LargeQ)(5 * 7 * 11);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Int64 Di = D;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ E = A - B;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ F = E * (LargeQ)(5 * 7 * 11);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Int64 Fi = F;\r\n#endif\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Console.WriteLine((Int64)LargeQ.Factorial(5));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Console.WriteLine((Int64)LargeQ.Factorial(20));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Console.WriteLine((Int64)(LargeQ.Factorial(123456) \/ LargeQ.Factorial(123455)));\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\/\/Check that the inverting-algorithm works, even with 10 times narrower limit\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/double XXX = 0;\/\/ Math.Log10(2);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/for (int chk=2;chk&lt;33000000;chk++) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 XXX += Math.Log10(chk);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 FillSortedLog10nFacUpToLog10X(XXX + 0.01);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 int Ix = SortedLog10nFac.BinarySearch(XXX - 0.01); \/\/-0.01 to ensure that we do not get above the real number due to numerical errors\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 if (Ix &lt; 0) Ix = ~Ix; \/\/First element larger, minus one=last element smaller\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 if (Math.Abs(SortedLog10nFac&#x5B;Ix] - XXX) &lt; 0.000001 || Ix!=chk)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { int x = chk; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(&quot;Reverse algorithm failed for {0}!, found IX&quot;, chk, Ix);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0 if(chk%1000==0)Console.Write(chk.ToString() + &quot;\\r&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/};\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Console.Write(&quot;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\r&quot;);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(&quot;Solutions for a!b!=c! where 1&lt;a&lt;b&lt;c&quot;);\r\n#if (UsePreallocatedPrimes)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.Write(&quot;Primes preload&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Primes.FillPrimesAtkinDyn(0x7FFEA80F); \/\/46340\u00b2-1 adressing within 2Gb\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while (true)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.Write(&quot;.&quot;);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp LastHighestNTested = Primes.PrimesList.Last();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (!Primes.FillPrimesAtkinDynAddAbout25PctPlus1000(LastHighestNTested)) break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (LastHighestNTested == Primes.PrimesList.Last()) break;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(&quot;\\rPrimes preloaded {0}, max {1}&quot;, Primes.PrimesList.Count, Primes.PrimesList.Last());\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp c = 1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (0 &lt; args.Length) { if (!(Ntyp.TryParse(args&#x5B;0], out c))) c = 1; }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp CouTested = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 do\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (!Primes.isprime((Ntyp)c) \/\/&amp;&amp; !Primes.isprime((Ntyp)c-1) \/\/Adding this term, could the simple a!=c solutions\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 )\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double Log10CFdivBF = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (Ntyp b = c - 1; 3 &lt; b; b--)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log10CFdivBF += Math.Log10(b + 1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FillSortedLog10nFacUpToLog10X(Log10CFdivBF + 0.01);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int Ix = SortedLog10nFac.BinarySearch(Log10CFdivBF - 0.01); \/\/-0.01 to ensure that we do not get above the real number due to numerical errors\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (Ix &lt; 0) Ix = ~Ix; \/\/First element larger than search=last element smaller\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ntyp a = 0; \/\/Only do the real test if the estimate is close \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Limit changed to changed, way beyond estimated calculation error, based on (1e6!) where the error where less than 1:1.000000000001 (1:1e-12)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (Math.Abs(SortedLog10nFac&#x5B;Ix] - Log10CFdivBF) &lt; 0.000000001 * Log10CFdivBF ) a = (Ntyp)Ix; \/\/ was fixed limit &lt;0.00001 changed to factor\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (0 &lt; a &amp;&amp; a &lt; b)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n#if (UseLargeQ)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ CFdivBF = 1; for (Ntyp bb = b + 1; bb &lt;= c; bb++) CFdivBF *= (Int64)bb;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LargeQ aF = LargeQ.Factorial((Int64)a);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (CFdivBF.IsFactorial((Int64)a))\r\n#else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BigInteger CFdivBF = 1; for (Ntyp bb = b + 1; bb &lt;= c; bb++) CFdivBF *= bb;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BigInteger aF = FactorialBi(a);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (aF == CFdivBF)\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(&quot;{0}! * {1}! = {2}!&quot; + (b + 1 == c ? &quot;\u00a0 - simple solution: c=a!&quot; : &quot; - ******* REAL SOLUTION *******&quot;), a, b, c);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CouTested++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (Primes.isprime((Ntyp)b)) break; \/\/ next b=p-1: a&lt;b&lt;p&lt;c p divisor in c! but not in b! and certainly not in a! So no need to check further!\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (c % 10000 == 0) Console.Write(&quot;{0} {1} {2}\u00a0\u00a0\u00a0\u00a0\u00a0 \\r&quot;,c, SortedLog10nFac.Count, CouTested);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 c++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } while (c != 0);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A nerdy idea: A C# class that quicly can supply a lot of primes (here limited to about the largest prime about 50G &#8211; as arrays with over 2G entries are not currently supported without splitting the arrays) A struct that supports basic arithmetic for large accurately represented numbers in Q,\u00a0 by factorization into primes. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,15],"tags":[],"class_list":["post-1282","post","type-post","status-publish","format-standard","hentry","category-math","category-pc-and-code-samples"],"_links":{"self":[{"href":"https:\/\/eskerahn.dk\/index.php?rest_route=\/wp\/v2\/posts\/1282","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eskerahn.dk\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eskerahn.dk\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eskerahn.dk\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/eskerahn.dk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1282"}],"version-history":[{"count":15,"href":"https:\/\/eskerahn.dk\/index.php?rest_route=\/wp\/v2\/posts\/1282\/revisions"}],"predecessor-version":[{"id":1445,"href":"https:\/\/eskerahn.dk\/index.php?rest_route=\/wp\/v2\/posts\/1282\/revisions\/1445"}],"wp:attachment":[{"href":"https:\/\/eskerahn.dk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eskerahn.dk\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eskerahn.dk\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}