Prime numbers whose neighboring pairs are tetraprimes: Difference between revisions

Add C# implementation
m (→‎{{header|Wren}}: Changed to Wren S/H)
(Add C# implementation)
 
Line 326:
<pre>
Identical to Wren example.
</pre>
 
 
=={{header|C#}}==
{{trans|Java}}
<syntaxhighlight lang="C#">
using System;
using System.Collections.Generic;
 
public class PrimeNumbersNeighboringPairsTetraprimes
{
private static List<int> primes;
 
public static void Main(string[] args)
{
ListPrimeNumbers(10_000_000);
 
int largestPrime5 = LargestLessThan(100_000);
int largestPrime6 = LargestLessThan(1_000_000);
int largestPrime7 = primes[primes.Count - 1];
var tetrasPreceding = new List<int>();
var tetrasFollowing = new List<int>();
int sevensPreceding = 0;
int sevensFollowing = 0;
int limit = 100_000;
 
foreach (var prime in primes)
{
if (IsTetraPrime(prime - 1) && IsTetraPrime(prime - 2))
{
tetrasPreceding.Add(prime);
if ((prime - 1) % 7 == 0 || (prime - 2) % 7 == 0)
{
sevensPreceding++;
}
}
 
if (IsTetraPrime(prime + 1) && IsTetraPrime(prime + 2))
{
tetrasFollowing.Add(prime);
if ((prime + 1) % 7 == 0 || (prime + 2) % 7 == 0)
{
sevensFollowing++;
}
}
 
if (prime == largestPrime5 || prime == largestPrime6 || prime == largestPrime7)
{
for (int i = 0; i <= 1; i++)
{
List<int> tetras = (i == 0) ? new List<int>(tetrasPreceding) : new List<int>(tetrasFollowing);
int size = tetras.Count;
int sevens = (i == 0) ? sevensPreceding : sevensFollowing;
string text = (i == 0) ? "preceding" : "following";
 
Console.Write("Found " + size + " primes under " + limit + " whose " + text + " neighboring pair are tetraprimes");
if (prime == largestPrime5)
{
Console.WriteLine(":");
for (int j = 0; j < size; j++)
{
Console.Write($"{tetras[j],7}{(j % 10 == 9 ? "\n" : "")}");
}
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine("of which " + sevens + " have a neighboring pair one of whose factors is 7.");
Console.WriteLine();
 
var gaps = new List<int>();
for (int k = 0; k < size - 1; k++)
{
gaps.Add(tetras[k + 1] - tetras[k]);
}
gaps.Sort();
int minimum = gaps[0];
int maximum = gaps[gaps.Count - 1];
int middle = Median(gaps);
Console.WriteLine("Minimum gap between those " + size + " primes: " + minimum);
Console.WriteLine("Median gap between those " + size + " primes: " + middle);
Console.WriteLine("Maximum gap between those " + size + " primes: " + maximum);
Console.WriteLine();
}
limit *= 10;
}
}
}
 
private static bool IsTetraPrime(int number)
{
int count = 0;
int previousFactor = 1;
foreach (var prime in primes)
{
int limit = prime * prime;
if (count == 0)
{
limit *= limit;
}
else if (count == 1)
{
limit *= prime;
}
if (limit <= number)
{
while (number % prime == 0)
{
if (count == 4 || prime == previousFactor)
{
return false;
}
count++;
number /= prime;
previousFactor = prime;
}
}
else
{
break;
}
}
 
if (number > 1)
{
if (count == 4 || number == previousFactor)
{
return false;
}
count++;
}
return count == 4;
}
 
private static int Median(List<int> list)
{
int size = list.Count;
if (size % 2 == 0)
{
return (list[size / 2 - 1] + list[size / 2]) / 2;
}
return list[size / 2];
}
 
private static int LargestLessThan(int number)
{
int index = primes.BinarySearch(number);
if (index > 0)
{
return primes[index - 1];
}
return primes[~index - 2];
}
 
private static void ListPrimeNumbers(int limit)
{
int halfLimit = (limit + 1) / 2;
var composite = new bool[halfLimit];
for (int i = 1, p = 3; i < halfLimit; p += 2, i++)
{
if (!composite[i])
{
for (int j = i + p; j < halfLimit; j += p)
{
composite[j] = true;
}
}
}
 
primes = new List<int> { 2 };
for (int i = 1, p = 3; i < halfLimit; p += 2, i++)
{
if (!composite[i])
{
primes.Add(p);
}
}
}
}
</syntaxhighlight>
{{out}}
<pre>
Found 49 primes under 100000 whose preceding neighboring pair are tetraprimes:
8647 15107 20407 20771 21491 23003 23531 24767 24971 27967
29147 33287 34847 36779 42187 42407 42667 43331 43991 46807
46867 51431 52691 52747 53891 54167 58567 63247 63367 69379
71711 73607 73867 74167 76507 76631 76847 80447 83591 84247
86243 87187 87803 89387 93887 97547 97847 98347 99431
 
of which 31 have a neighboring pair one of whose factors is 7.
 
Minimum gap between those 49 primes: 56
Median gap between those 49 primes: 1208
Maximum gap between those 49 primes: 6460
 
Found 46 primes under 100000 whose following neighboring pair are tetraprimes:
8293 16553 17389 18289 22153 26893 29209 33409 35509 36293
39233 39829 40493 41809 45589 48109 58393 59629 59753 59981
60493 60913 64013 64921 65713 66169 69221 71329 74093 75577
75853 77689 77933 79393 79609 82913 84533 85853 87589 87701
88681 91153 93889 96017 97381 98453
 
of which 36 have a neighboring pair one of whose factors is 7.
 
Minimum gap between those 46 primes: 112
Median gap between those 46 primes: 1460
Maximum gap between those 46 primes: 10284
 
Found 885 primes under 1000000 whose preceding neighboring pair are tetraprimes
of which 503 have a neighboring pair one of whose factors is 7.
 
Minimum gap between those 885 primes: 4
Median gap between those 885 primes: 756
Maximum gap between those 885 primes: 7712
 
Found 866 primes under 1000000 whose following neighboring pair are tetraprimes
of which 492 have a neighboring pair one of whose factors is 7.
 
Minimum gap between those 866 primes: 4
Median gap between those 866 primes: 832
Maximum gap between those 866 primes: 10284
 
Found 10815 primes under 10000000 whose preceding neighboring pair are tetraprimes
of which 5176 have a neighboring pair one of whose factors is 7.
 
Minimum gap between those 10815 primes: 4
Median gap between those 10815 primes: 648
Maximum gap between those 10815 primes: 9352
 
Found 10551 primes under 10000000 whose following neighboring pair are tetraprimes
of which 5069 have a neighboring pair one of whose factors is 7.
 
Minimum gap between those 10551 primes: 4
Median gap between those 10551 primes: 660
Maximum gap between those 10551 primes: 10284
 
 
</pre>
 
337

edits