Wieferich primes: Difference between revisions

Content added Content deleted
(Added Quackery.)
Line 19: Line 19:
;* [[oeis:A001220|OEIS A001220 - Wieferich primes]]
;* [[oeis:A001220|OEIS A001220 - Wieferich primes]]
<br>
<br>

=={{header|C}}==
{{trans|C++}}
<lang c>#include <stdbool.h>
#include <stdio.h>
#include <stdint.h>

#define LIMIT 5000
static bool PRIMES[LIMIT];

static void prime_sieve() {
uint64_t p;
int i;

PRIMES[0] = false;
PRIMES[1] = false;
for (i = 2; i < LIMIT; i++) {
PRIMES[i] = true;
}

for (i = 4; i < LIMIT; i += 2) {
PRIMES[i] = false;
}

for (p = 3;; p += 2) {
uint64_t q = p * p;
if (q >= LIMIT) {
break;
}
if (PRIMES[p]) {
uint64_t inc = 2 * p;
for (; q < LIMIT; q += inc) {
PRIMES[q] = false;
}
}
}
}

uint64_t modpow(uint64_t base, uint64_t exp, uint64_t mod) {
uint64_t result = 1;

if (mod == 1) {
return 0;
}

base %= mod;
for (; exp > 0; exp >>= 1) {
if ((exp & 1) == 1) {
result = (result * base) % mod;
}
base = (base * base) % mod;
}
return result;
}

void wieferich_primes() {
uint64_t p;

for (p = 2; p < LIMIT; ++p) {
if (PRIMES[p] && modpow(2, p - 1, p * p) == 1) {
printf("%lld\n", p);
}
}
}

int main() {
prime_sieve();

printf("Wieferich primes less than %d:\n", LIMIT);
wieferich_primes();

return 0;
}</lang>
{{out}}
<pre>Wieferich primes less than 5000:
1093
3511</pre>


=={{header|C++}}==
=={{header|C++}}==