Skip to content

Instantly share code, notes, and snippets.

@Yepoleb
Created November 10, 2018 17:11
Show Gist options
  • Save Yepoleb/8baf2c0b933063395286da373bdee67c to your computer and use it in GitHub Desktop.
Save Yepoleb/8baf2c0b933063395286da373bdee67c to your computer and use it in GitHub Desktop.
#include <cstdio>
#include <cassert>
#include <stddef.h>
#include <gmp.h>
constexpr size_t PRIME_BITS = 1024;
constexpr size_t PRIME_BYTES = PRIME_BITS / 8;
constexpr int PRIME_REPS = 15;
int main(int argc, char** argv)
{
const char* filename = "/dev/urandom";
FILE* fp = std::fopen(filename, "rb");
if (!fp) {
std::printf("Failed to open input file");
return 1;
}
char buffer[PRIME_BYTES];
mpz_t r, p, q;
mpz_inits(r, p, q, NULL);
for (int c = 0; c < 10000; c++) {
size_t bytes_read = std::fread(buffer, 1, PRIME_BYTES, fp);
if (bytes_read < PRIME_BYTES) {
std::printf("EOF\n");
break;
}
mpz_import(p, PRIME_BYTES, 1, 1, 0, 0, buffer);
while (mpz_probab_prime_p(p, PRIME_REPS) == 0) {
mpz_add_ui(p, p, 1);
}
mpz_sub_ui(q, p, 1);
mpz_fdiv_q_ui(q, q, 2);
int q_prime = mpz_probab_prime_p(q, PRIME_REPS);
if (q_prime) {
std::putchar('+');
} else {
std::putchar('.');
}
std::fflush(stdout);
}
mpz_clears(r, p, q, NULL);
fclose(fp);
std::putchar('\n');
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment