Branch data Line data Source code
1 : : #include "miller_rabin.h" 2 : : 3 : 0 : static inline cmph_uint64 int_pow(cmph_uint64 a, cmph_uint64 d, cmph_uint64 n) 4 : : { 5 : 0 : cmph_uint64 a_pow = a; 6 : 0 : cmph_uint64 res = 1; 7 [ # # ]: 0 : while(d > 0) 8 : : { 9 [ # # ]: 0 : if((d & 1) == 1) 10 : 0 : res =(((cmph_uint64)res) * a_pow) % n; 11 : 0 : a_pow = (((cmph_uint64)a_pow) * a_pow) % n; 12 : 0 : d /= 2; 13 : : }; 14 : 0 : return res; 15 : : }; 16 : : 17 : 0 : static inline cmph_uint8 check_witness(cmph_uint64 a_exp_d, cmph_uint64 n, cmph_uint64 s) 18 : : { 19 : : cmph_uint64 i; 20 : 0 : cmph_uint64 a_exp = a_exp_d; 21 [ # # # # ]: 0 : if(a_exp == 1 || a_exp == (n - 1)) 22 : 0 : return 1; 23 [ # # ]: 0 : for(i = 1; i < s; i++) 24 : : { 25 : 0 : a_exp = (((cmph_uint64)a_exp) * a_exp) % n; 26 [ # # ]: 0 : if(a_exp == (n - 1)) 27 : 0 : return 1; 28 : : }; 29 : 0 : return 0; 30 : : }; 31 : : 32 : 0 : cmph_uint8 check_primality(cmph_uint64 n) 33 : : { 34 : : cmph_uint64 a, d, s, a_exp_d; 35 [ # # ]: 0 : if((n % 2) == 0) 36 : 0 : return 0; 37 [ # # ]: 0 : if((n % 3) == 0) 38 : 0 : return 0; 39 [ # # ]: 0 : if((n % 5) == 0) 40 : 0 : return 0; 41 [ # # ]: 0 : if((n % 7 ) == 0) 42 : 0 : return 0; 43 : : //we decompoe the number n - 1 into 2^s*d 44 : 0 : s = 0; 45 : 0 : d = n - 1; 46 : : do 47 : : { 48 : 0 : s++; 49 : 0 : d /= 2; 50 [ # # ]: 0 : }while((d % 2) == 0); 51 : : 52 : 0 : a = 2; 53 : 0 : a_exp_d = int_pow(a, d, n); 54 [ # # ]: 0 : if(check_witness(a_exp_d, n, s) == 0) 55 : 0 : return 0; 56 : 0 : a = 7; 57 : 0 : a_exp_d = int_pow(a, d, n); 58 [ # # ]: 0 : if(check_witness(a_exp_d, n, s) == 0) 59 : 0 : return 0; 60 : 0 : a = 61; 61 : 0 : a_exp_d = int_pow(a, d, n); 62 [ # # ]: 0 : if(check_witness(a_exp_d, n, s) == 0) 63 : 0 : return 0; 64 : 0 : return 1; 65 : : }; 66 : : 67 : :