github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/mini-gmp/tests/t-pprime_p.c (about) 1 /* test mpz_probab_prime_p 2 3 Copyright 2001, 2002, 2004, 2011, 2012, 2014, 2016 Free Software 4 Foundation, Inc. 5 6 This file is part of the GNU MP Library test suite. 7 8 The GNU MP Library test suite is free software; you can redistribute it 9 and/or modify it under the terms of the GNU General Public License as 10 published by the Free Software Foundation; either version 3 of the License, 11 or (at your option) any later version. 12 13 The GNU MP Library test suite is distributed in the hope that it will be 14 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 16 Public License for more details. 17 18 You should have received a copy of the GNU General Public License along with 19 the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ 20 21 #include "testutils.h" 22 23 static int 24 isprime (unsigned long int t) 25 { 26 unsigned long int q, r, d; 27 28 if (t < 32) 29 return (0xa08a28acUL >> t) & 1; 30 if ((t & 1) == 0) 31 return 0; 32 33 if (t % 3 == 0) 34 return 0; 35 if (t % 5 == 0) 36 return 0; 37 if (t % 7 == 0) 38 return 0; 39 40 for (d = 11;;) 41 { 42 q = t / d; 43 r = t - q * d; 44 if (q < d) 45 return 1; 46 if (r == 0) 47 break; 48 d += 2; 49 q = t / d; 50 r = t - q * d; 51 if (q < d) 52 return 1; 53 if (r == 0) 54 break; 55 d += 4; 56 } 57 return 0; 58 } 59 60 static void 61 check_one (mpz_srcptr n, int want) 62 { 63 int got; 64 65 got = mpz_probab_prime_p (n, 25); 66 67 /* "definitely prime" is fine if we only wanted "probably prime" */ 68 if (got == 2 && want == 1) 69 want = 2; 70 71 if (got != want) 72 { 73 printf ("mpz_probab_prime_p\n"); 74 dump (" n ", n); 75 printf (" got =%d", got); 76 printf (" want=%d\n", want); 77 abort (); 78 } 79 } 80 81 static void 82 check_pn (mpz_ptr n, int want) 83 { 84 check_one (n, want); 85 mpz_neg (n, n); 86 check_one (n, want); 87 } 88 89 static void 90 check_small (void) 91 { 92 mpz_t n; 93 long i; 94 95 mpz_init (n); 96 97 for (i = 0; i < 1700; i++) 98 { 99 mpz_set_si (n, i); 100 check_pn (n, isprime (i)); 101 } 102 103 mpz_clear (n); 104 } 105 106 void 107 check_composites (void) 108 { 109 int i; 110 int reps = 1000; 111 mpz_t a, b, n, bs; 112 unsigned long size_range, size; 113 114 mpz_init (a); 115 mpz_init (b); 116 mpz_init (n); 117 mpz_init (bs); 118 119 for (i = 0; i < reps; i++) 120 { 121 mini_urandomb (bs, 16); 122 size_range = mpz_get_ui (bs) % 10 + 1; /* 0..1024 bit operands */ 123 124 mini_urandomb (bs, size_range); 125 size = mpz_get_ui (bs); 126 mini_rrandomb (a, size); 127 128 mini_urandomb (bs, size_range); 129 size = mpz_get_ui (bs); 130 mini_rrandomb (b, size); 131 132 /* Exclude trivial factors */ 133 if (mpz_cmp_ui (a, 1) == 0) 134 mpz_set_ui (a, 2); 135 if (mpz_cmp_ui (b, 1) == 0) 136 mpz_set_ui (b, 2); 137 138 mpz_mul (n, a, b); 139 140 check_pn (n, 0); 141 } 142 mpz_clear (a); 143 mpz_clear (b); 144 mpz_clear (n); 145 mpz_clear (bs); 146 } 147 148 static void 149 check_primes (void) 150 { 151 static const char * const primes[] = { 152 "2", "17", "65537", 153 /* diffie-hellman-group1-sha1, also "Well known group 2" in RFC 154 2412, 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 } */ 155 "0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" 156 "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" 157 "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" 158 "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" 159 "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" 160 "FFFFFFFFFFFFFFFF", 161 NULL 162 }; 163 164 mpz_t n; 165 int i; 166 167 mpz_init (n); 168 169 for (i = 0; primes[i]; i++) 170 { 171 mpz_set_str_or_abort (n, primes[i], 0); 172 check_one (n, 1); 173 } 174 mpz_clear (n); 175 } 176 177 void 178 testmain (int argc, char *argv[]) 179 { 180 check_small (); 181 check_composites (); 182 check_primes (); 183 }