数论的知识点的总结,可能不会很注重结论的证明emmmmm。然而并不会证啊
欧拉函数及其应用
miller-rabin素性判断
我们平时判断一个数是否为素数的范围为1e6左右,因为还要保存。
这个算法是单独判断一个数是否为素数
Pollard-rho算法
一个超大数的质因数分解
二次剩余
需要求x的值
离散对数
其中n必须是素数
模板题目
poj2417
T了的代码
lrj书上面的代码不够优秀
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include <iostream> #include<cstring> #include <cmath> #include <map> #include <cstdio> using namespace std; const int maxn = 1e5+10; typedef long long ll; ll ex_gcd(ll a, ll b, ll &x, ll &y){ if(a == 0&& b == 0) return -1; if(b == 0){ x = 1, y = 0; return a; } ll d = ex_gcd(b, a%b, y, x); y -= a/b*x; return d; } ll inv(ll a, ll n){ ll x, y; ll d = ex_gcd(a, n, x, y); if(d == -1) return -1; else return (x+n)%n; } ll pow_mod(ll a, ll b, ll p){ ll ans = 1; while(b){ if(b&1){ ans = ans*a%p; } a = a*a%p; b>>=1; } return ans; } ll mul_mod(ll a, ll b, ll p){ return (a%p)*(b%p)%p; } ll bsgs(ll a, ll b, ll n){ ll m, v, e=1, i; m = sqrt(n+0.5); v = inv(pow_mod(a, m, n), n); map<int, int> x; x.clear(); x[1] = 0; for(int i=1; i<m; i++){ e = mul_mod(e, a, n); if(!x.count(e)) x[e] = i; } for(int i=0; i<m ;i++){ if(x.count(b)) return i*m+x[b]; b = mul_mod(b, v, n); } return -1; } int main() { ll b, n, p; while(~scanf("%lld%lld%lld", &p, &b, &n)){ ll ans = bsgs(b, n, p); if(ans == -1) printf("no solution\n"); else printf("%lld\n", ans); } return 0; }
|
ex-离散对数
n不是素数的时候该怎么求解呢
原根及其应用
definition:
未解决的问题