Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <gmp.h>
- int is_prime(mpz_t n) {
- unsigned long j, r;
- int prime = 0;
- mpz_t d, a, x, n_sub_1;
- mpz_inits(d, a, x, n_sub_1, NULL);
- mpz_sub_ui(n_sub_1, n, 1);
- r = mpz_scan1(n_sub_1, 0);
- mpz_fdiv_q_2exp(d, n_sub_1, r);
- mpz_set_ui(a, 3);
- mpz_powm(x, a, d, n);
- if (mpz_cmp_ui(x, 1) == 0 || mpz_cmp(x, n_sub_1) == 0) {
- mpz_clears(d, a, x, n_sub_1, NULL);
- return 1;
- }
- for (j = 0; j < r-1; j++) {
- mpz_powm_ui(x, x, 2, n);
- if (mpz_cmp_ui(x, 1) == 0) break;
- if (mpz_cmp(x, n_sub_1) == 0) {
- prime = 1;
- break;
- }
- }
- mpz_clears(d, a, x, n_sub_1, NULL);
- return prime;
- }
- int main(int argc, char **argv) {
- mpz_t n;
- mpz_init(n);
- mpz_set_str(n, argv[1], 10);
- if (is_prime(n)) printf("prp\n");
- else printf("composite\n");
- mpz_clear(n);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement