static int is_primitive_root(UV n, UV r) { UV fac[MPU_MAX_FACTORS+1]; int i, nfacs; /* if ( (r&1) & powmod(n, (r-1)>>1, r) == 1 ) return 0; */ nfacs = factor_exp(r-1, fac, 0); for (i = 0; i < nfacs; i++) { UV m = powmod(n, (r-1)/fac[i], r); if (m == 1) return 0; } return (gcd_ui(n,r) == 1); }
unsigned long binomial(unsigned long n, unsigned long k) { unsigned long d, g, r = 1; if (k == 0) return 1; if (k == 1) return n; if (k >= n) return (k == n); if (k > n/2) k = n-k; for (d = 1; d <= k; d++) { if (r >= ULONG_MAX/n) { /* Possible overflow */ unsigned long nr, dr; /* reduced numerator / denominator */ g = gcd_ui(n, d); nr = n/g; dr = d/g; g = gcd_ui(r, dr); r = r/g; dr = dr/g; if (r >= ULONG_MAX/nr) return 0; /* Unavoidable overflow */ r *= nr; r /= dr; n--; } else { r *= n--; r /= d; } } return r; }