Chernick's Carmichael numbers: Difference between revisions

Content added Content deleted
m (Added back the optional task to find a(10))
(Added C++)
Line 52: Line 52:


<br><br>
<br><br>
=={{header|C++}}==
<lang cpp>#include <gmp.h>
#include <iostream>

using namespace std;

typedef unsigned long long int u64;

bool primality_pretest(u64 k) { // for k > 23

if (!(k % 3) || !(k % 5) || !(k % 7) || !(k % 11) ||
!(k % 13) || !(k % 17) || !(k % 19) || !(k % 23)
) {
return (k <= 23);
}

return true;
}

bool probprime(u64 k, mpz_t n) {
mpz_set_ui(n, k);
return mpz_probab_prime_p(n, 0);
}

bool is_chernick(int n, u64 m, mpz_t z) {

if (!primality_pretest(6 * m + 1)) {
return false;
}

if (!primality_pretest(12 * m + 1)) {
return false;
}

if (!primality_pretest(18 * m + 1)) {
return false;
}

u64 t = 9 * m;

for (int i = 2; i <= n - 2; i++) {
if (!primality_pretest((t << i) + 1)) {
return false;
}
}

if (!probprime(6 * m + 1, z)) {
return false;
}

if (!probprime(12 * m + 1, z)) {
return false;
}

if (!probprime(18 * m + 1, z)) {
return false;
}

for (int i = 2; i <= n - 2; i++) {
if (!probprime((t << i) + 1, z)) {
return false;
}
}

return true;
}

int main() {

mpz_t z;
mpz_inits(z, NULL);

for (int n = 3; n <= 10; n++) {

// `m` is a multiple of 2^(n-4), for n > 4
u64 multiplier = (n > 4) ? (1 << (n - 4)) : 1;

// For n > 5, m is also a multiple of 5
if (n > 5) {
multiplier *= 5;
}

for (u64 k = 1; ; k++) {

u64 m = k * multiplier;

if (is_chernick(n, m, z)) {
cout << "a(" << n << ") has m = " << m << endl;
break;
}
}
}

return 0;
}</lang>
{{out}}
<pre>
a(3) has m = 1
a(4) has m = 1
a(5) has m = 380
a(6) has m = 380
a(7) has m = 780320
a(8) has m = 950560
a(9) has m = 950560
a(10) has m = 3208386195840
</pre>
(takes ~3.5 minutes)

=={{header|F_Sharp|F#}}==
=={{header|F_Sharp|F#}}==
This task uses [http://www.rosettacode.org/wiki/Extensible_prime_generator#The_function Extensible Prime Generator (F#)]
This task uses [http://www.rosettacode.org/wiki/Extensible_prime_generator#The_function Extensible Prime Generator (F#)]