Prime numbers whose neighboring pairs are tetraprimes
- Definitions
The following definitions are needed for this task.
A tetraprime is a positive integer which is the product of four distinct primes. For example, 1155 is a tetraprime because 1155 = 3 x 5 x 7 x 11.
The neighboring pairs of a prime are the two consecutive numbers immediately preceding or immediately following that prime. For example, (5, 6) and (8, 9) are the neighboring pairs of the prime 7.
- Task
1. Find and show here all primes less than 100,000 whose preceding neighboring pair are both tetraprimes.
2. Find and show here all primes less than 100,000 whose following neighboring pair are both tetraprimes.
3. Of the primes in 1 and 2 above how many have a neighboring pair one of whose members has a prime factor of 7?
4. For the primes in 1 and 2 above, consider the gaps between consecutive primes. What are the minimum, median and maximum gaps?
5. Repeat these calculations for all primes less than 1 million but for 1 and 2 just show the number of primes - don't print them out individually.
If it is difficult for your language to meet all of these requirements, then just do what you reasonably can.
- Stretch
Repeat the calculations for all primes less than 10 million.
- References
- OEIS sequence A361796: Prime numbers preceded by two consecutive numbers which are products of four distinct primes (or tetraprimes).
- OEIS sequence A362578: Prime numbers followed by two consecutive numbers which are products of four distinct primes (or tetraprimes).
C
This follows the lines of the Wren example except that primesieve is used to iterate through the primes rather than sieving for them in advance. As a result, runs quickly - under 0.8 seconds on my machine.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <locale.h>
#include <primesieve.h>
#include <glib.h>
#define TEN_MILLION 10000000
void primeFactors(int n, int *factors, int *length) {
if (n < 2) return;
int count = 0;
int inc[8] = {4, 2, 4, 2, 4, 6, 2, 6};
while (!(n%2)) {
factors[count++] = 2;
n /= 2;
}
while (!(n%3)) {
factors[count++] = 3;
n /= 3;
}
while (!(n%5)) {
factors[count++] = 5;
n /= 5;
}
for (int k = 7, i = 0; k*k <= n; ) {
if (!(n%k)) {
factors[count++] = k;
n /= k;
} else {
k += inc[i];
i = (i + 1) % 8;
}
}
if (n > 1) {
factors[count++] = n;
}
*length = count;
}
bool hasDups(int *pf, int length) {
int i;
if (length == 1) return false;
for (i = 1; i < length; ++i) {
if (pf[i] == pf[i-1]) return true;
}
return false;
}
bool contains(int *pf, int length, int value) {
int i;
for (i = 0; i < length; ++i) {
if (pf[i] == value) return true;
}
return false;
}
int compare(const void* a, const void* b) {
int arg1 = *(const int*)a;
int arg2 = *(const int*)b;
if (arg1 < arg2) return -1;
if (arg1 > arg2) return 1;
return 0;
}
// Note that 'gaps' will only contain even numbers here.
int median(int *gaps, int length) {
int m = length/2;
if (length & 1 == 1) return gaps[m];
return (gaps[m] + gaps[m-1])/2;
}
int main() {
int i, p, c, k, length, sevens, min, max, med;
int j = 100000, sevens1 = 0, sevens2 = 0;
int pf1[24], pf2[24], pf3[24], pf4[24], *gaps;
bool cond1, cond2, cond3, cond4;
const char *t;
GArray *tetras1 = g_array_new(FALSE, FALSE, sizeof(int));
GArray *tetras2 = g_array_new(FALSE, FALSE, sizeof(int));
GArray *tetras;
primesieve_iterator it;
primesieve_init(&it);
setlocale(LC_NUMERIC, "");
while (j <= TEN_MILLION) {
p = primesieve_next_prime(&it);
primeFactors(p-2, pf1, &length);
cond1 = length == 4 && !hasDups(pf1, length);
primeFactors(p-1, pf2, &length);
cond2 = length == 4 && !hasDups(pf2, length);
primeFactors(p+1, pf3, &length);
cond3 = length == 4 && !hasDups(pf3, length);
primeFactors(p+2, pf4, &length);
cond4 = length == 4 && !hasDups(pf4, length);
if (cond1 && cond2) {
g_array_append_val(tetras1, p);
if (contains(pf1, 4, 7) || contains(pf2, 4, 7)) ++sevens1;
}
if (cond3 && cond4) {
g_array_append_val(tetras2, p);
if (contains(pf3, 4, 7) || contains(pf4, 4, 7)) ++sevens2;
}
if (p > j) {
for (i = 0; i < 2; ++i) {
tetras = (i == 0) ? tetras1 : tetras2;
sevens = (i == 0) ? sevens1 : sevens2;
c = tetras->len;
t = (i == 0) ? "preceding" : "following";
printf("Found %'d primes under %'d whose %s neighboring pair are tetraprimes", c, j, t);
if (j == 100000) {
printf(":\n");
for (k = 0; k < tetras->len; ++k) {
printf("%5d ", g_array_index(tetras, int, k));
if (!((k+1) % 10)) printf("\n");
}
printf("\n");
}
printf("\nof which %'d have a neighboring pair one of whose factors is 7.\n\n", sevens);
length = c - 1;
gaps = (int *)malloc(length * sizeof(int));
for (k = 0; k < length; ++k) {
gaps[k] = g_array_index(tetras, int, k+1) - g_array_index(tetras, int, k);
}
qsort(gaps, length, sizeof(int), compare);
min = gaps[0];
max = gaps[length - 1];
med = median(gaps, length);
printf("Minimum gap between those %'d primes : %'d\n", c, min);
printf("Median gap between those %'d primes : %'d\n", c, med);
printf("Maximum gap between those %'d primes : %'d\n", c, max);
printf("\n");
free(gaps);
}
j *= 10;
}
}
g_array_free(tetras1, FALSE);
g_array_free(tetras2, FALSE);
return 0;
}
- Output:
Identical to Wren example.
FreeBASIC
#include "isprime.bas"
Dim Shared As Boolean Have7 'A tetraprime factor is 7
Function isTetraprime(n As Integer) As Boolean
Dim As Boolean distinto
Dim As Integer div = 2, count = 0
While n >= div*div
distinto = True
While n Mod div = 0
If Not distinto Then Return False
distinto = False
count += 1
If div = 7 Then Have7 = True
n /= div
Wend
div += 1
Wend
If n > 1 Then count += 1
Return count = 4
End Function
Dim As Integer signo = -1
Dim As Integer TenPower = 1e5
Dim As Integer f, g, n, m, count, count7
Dim As Integer Gap, GapMin, GapMax, GapSum
For f = 5 To 7
For g = 1 To 2 'preceding or following neighboring pairs
count = 0
count7 = 0
m = 0
GapMin = -1
GapMax = 0
GapSum = 0
If f = 5 Then Print '100_000
For n = 3 To TenPower-1
If isPrime(n) Then
Have7 = False
If isTetraprime(n+1*signo) Then
If isTetraprime(n+2*signo) Then
count += 1
If f = 5 Then
Print Using "#######"; n;
If count Mod 10 = 0 Then Print
End If
If Have7 Then count7 += 1
If m <> 0 Then
Gap = n - m
If Gap <= GapMin Then GapMin = Gap
If Gap > GapMax Then GapMax = Gap
GapSum += Gap
End If
m = n
End If
End If
n += 1
End If
Next n
Print Using !"\nFound ##,### primes under ##,###,### whose preceding neighboring pair are tetraprimes"; count; TenPower
Print Using "of which #,### have a neighboring pair, one of whose factors is 7."; count7
Print Using !"\nMinimum gap between & primes : ##,###"; count; GapMin
Print Using "Average gap between & primes : ##,###"; count; (GapSum / (count-1))
Print Using "Maximum gap between & primes : ##,###"; count; GapMax
signo = signo * -1
Next g
TenPower *= 10
Next f
Sleep
- Output:
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 Found 49 primes under 100,000 whose preceding neighboring pair are tetraprimes of which 31 have a neighboring pair, one of whose factors is 7. Minimum gap between 49 primes : 56 Average gap between 49 primes : 1,891 Maximum gap between 49 primes : 6,460 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 Found 46 primes under 100,000 whose preceding neighboring pair are tetraprimes of which 36 have a neighboring pair, one of whose factors is 7. Minimum gap between 46 primes : 112 Average gap between 46 primes : 2,004 Maximum gap between 46 primes : 10,284 Found 885 primes under 1,000,000 whose preceding neighboring pair are tetraprimes of which 503 have a neighboring pair, one of whose factors is 7. Minimum gap between 885 primes : 4 Average gap between 885 primes : 1,119 Maximum gap between 885 primes : 7,712 Found 866 primes under 1,000,000 whose preceding neighboring pair are tetraprimes of which 492 have a neighboring pair, one of whose factors is 7. Minimum gap between 866 primes : 4 Average gap between 866 primes : 1,146 Maximum gap between 866 primes : 10,284 Found 10,815 primes under 10,000,000 whose preceding neighboring pair are tetraprimes of which 5,176 have a neighboring pair, one of whose factors is 7. Minimum gap between 10815 primes : 4 Average gap between 10815 primes : 924 Maximum gap between 10815 primes : 9,352 Found 10,551 primes under 10,000,000 whose preceding neighboring pair are tetraprimes of which 5,069 have a neighboring pair, one of whose factors is 7. Minimum gap between 10551 primes : 4 Average gap between 10551 primes : 947 Maximum gap between 10551 primes : 10,284
Wren
import "./math" for Int, Nums
import "./sort" for Find
import "./seq" for Lst
import "./fmt" for Fmt
var primes = Int.primeSieve(1e7)
var highest5 = primes[Find.nearest(primes, 1e5) - 1]
var highest6 = primes[Find.nearest(primes, 1e6) - 1]
var highest7 = primes[-1]
var tetras1 = []
var tetras2 = []
var sevens1 = 0
var sevens2 = 0
var j = 1e5
for (p in primes) {
var pf1 = Int.primeFactors(p-2)
var cond1 = pf1.count == 4 && Lst.distinct(pf1).count == 4
var pf2 = Int.primeFactors(p-1)
var cond2 = pf2.count == 4 && Lst.distinct(pf2).count == 4
var pf3 = Int.primeFactors(p+1)
var cond3 = pf3.count == 4 && Lst.distinct(pf3).count == 4
var pf4 = Int.primeFactors(p+2)
var cond4 = pf4.count == 4 && Lst.distinct(pf4).count == 4
if (cond1 && cond2) {
tetras1.add(p)
if (pf1.contains(7) || pf2.contains(7)) sevens1 = sevens1 + 1
}
if (cond3 && cond4) {
tetras2.add(p)
if (pf3.contains(7) || pf4.contains(7)) sevens2 = sevens2 + 1
}
if (p == highest5 || p == highest6 || p == highest7) {
for (i in 0..1) {
var tetras = (i == 0) ? tetras1 : tetras2
var sevens = (i == 0) ? sevens1 : sevens2
var c = tetras.count
var t = (i == 0) ? "preceding" : "following"
Fmt.write("Found $,d primes under $,d whose $s neighboring pair are tetraprimes", c, j, t)
if (p == highest5) {
Fmt.print(":")
Fmt.tprint("$5d ", tetras, 10)
}
Fmt.print()
Fmt.print("of which $,d have a neighboring pair one of whose factors is 7.\n", sevens)
var gaps = List.filled(tetras.count-1, 0)
for (k in 0...tetras.count-1) gaps[k] = tetras[k+1] - tetras[k]
gaps.sort()
var min = gaps[0]
var max = gaps[-1]
var med = Nums.median(gaps)
Fmt.print("Minimum gap between those $,d primes : $,d", c, min)
Fmt.print("Median gap between those $,d primes : $,d", c, med)
Fmt.print("Maximum gap between those $,d primes : $,d", c, max)
Fmt.print()
}
j = j * 10
}
}
- Output:
Found 49 primes under 100,000 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 : 1,208 Maximum gap between those 49 primes : 6,460 Found 46 primes under 100,000 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 : 1,460 Maximum gap between those 46 primes : 10,284 Found 885 primes under 1,000,000 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 : 7,712 Found 866 primes under 1,000,000 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 : 10,284 Found 10,815 primes under 10,000,000 whose preceding neighboring pair are tetraprimes of which 5,176 have a neighboring pair one of whose factors is 7. Minimum gap between those 10,815 primes : 4 Median gap between those 10,815 primes : 648 Maximum gap between those 10,815 primes : 9,352 Found 10,551 primes under 10,000,000 whose following neighboring pair are tetraprimes of which 5,069 have a neighboring pair one of whose factors is 7. Minimum gap between those 10,551 primes : 4 Median gap between those 10,551 primes : 660 Maximum gap between those 10,551 primes : 10,284
XPL0
include xpllib; \for Print
int Have7; \A tetraprime factor is 7
proc IsTetraprime(N); \Return 'true' if N is a tetraprime
int N;
int Div, Count, Distinct;
[Div:= 2; Count:= 0;
while N >= Div*Div do
[Distinct:= true;
while rem(N/Div) = 0 do
[if not Distinct then return false;
Distinct:= false;
Count:= Count+1;
if Div = 7 then Have7:= true;
N:= N/Div;
];
Div:= Div+1;
];
if N > 1 then Count:= Count+1;
return Count = 4;
];
int Sign, TenPower, TP, Case, N, N0, Count, Count7, Gap, GapMin, GapMax, GapSum;
[Sign:= -1; TenPower:= 100_000;
for TP:= 5 to 7 do
[for Case:= 1 to 2 do \preceding or following neighboring pairs
[Count:= 0; Count7:= 0; N0:= 0; GapMin:= -1>>1; GapMax:= 0; GapSum:= 0;
if TP = 5 then CrLf(0); \100_000
for N:= 3 to TenPower-1 do
[if IsPrime(N) then
[Have7:= false;
if IsTetraprime(N+1*Sign) then
if IsTetraprime(N+2*Sign) then
[Count:= Count+1;
if TP = 5 then
[Print("%7d", N);
if rem(Count/10) = 0 then CrLf(0);
];
if Have7 then Count7:= Count7+1;
if N0 # 0 then
[Gap:= N - N0;
if Gap < GapMin then GapMin:= Gap;
if Gap > GapMax then GapMax:= Gap;
GapSum:= GapSum + Gap;
];
N0:= N;
];
];
N:= N+1;
];
Print("\nFound %,d primes under %,d whose neighboring pair are tetraprimes\n",
Count, TenPower);
Print("of which %,d have a neighboring pair, one of whose factors is 7.\n\n",
Count7);
Print("Minimum gap between %d primes : %,d\n", Count, GapMin);
Print("Average gap between %d primes : %,d\n", Count,
fix(float(GapSum)/float(Count-1)));
Print("Maximum gap between %d primes : %,d\n", Count, GapMax);
Sign:= Sign * -1;
];
TenPower:= TenPower * 10;
];
]
- Output:
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 Found 49 primes under 100,000 whose neighboring pair are tetraprimes of which 31 have a neighboring pair, one of whose factors is 7. Minimum gap between 49 primes : 56 Average gap between 49 primes : 1,891 Maximum gap between 49 primes : 6,460 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 Found 46 primes under 100,000 whose neighboring pair are tetraprimes of which 36 have a neighboring pair, one of whose factors is 7. Minimum gap between 46 primes : 112 Average gap between 46 primes : 2,004 Maximum gap between 46 primes : 10,284 Found 885 primes under 1,000,000 whose neighboring pair are tetraprimes of which 503 have a neighboring pair, one of whose factors is 7. Minimum gap between 885 primes : 4 Average gap between 885 primes : 1,119 Maximum gap between 885 primes : 7,712 Found 866 primes under 1,000,000 whose neighboring pair are tetraprimes of which 492 have a neighboring pair, one of whose factors is 7. Minimum gap between 866 primes : 4 Average gap between 866 primes : 1,146 Maximum gap between 866 primes : 10,284 Found 10,815 primes under 10,000,000 whose neighboring pair are tetraprimes of which 5,176 have a neighboring pair, one of whose factors is 7. Minimum gap between 10815 primes : 4 Average gap between 10815 primes : 924 Maximum gap between 10815 primes : 9,352 Found 10,551 primes under 10,000,000 whose neighboring pair are tetraprimes of which 5,069 have a neighboring pair, one of whose factors is 7. Minimum gap between 10551 primes : 4 Average gap between 10551 primes : 947 Maximum gap between 10551 primes : 10,284