数论

数论的知识点的总结,可能不会很注重结论的证明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;
}
/*
return x, a^x\equav b(mod n), and n is a prime.
*/
ll bsgs(ll a, ll b, ll n){
ll m, v, e=1, i;
m = sqrt(n+0.5);
//cout<<pow_mod(a, m, n)<<endl;
v = inv(pow_mod(a, m, n), n);
map<int, int> x;
x.clear();
x[1] = 0;
//cout<<v<<endl;
for(int i=1; i<m; i++){
e = mul_mod(e, a, n);
//cout<<e<<endl;
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:

未解决的问题

文章目录
  1. 1. 欧拉函数及其应用
  2. 2. miller-rabin素性判断
  3. 3. Pollard-rho算法
  4. 4. 二次剩余
  5. 5. 离散对数
    1. 5.0.1. 模板题目
    2. 5.0.2. T了的代码
  • 6. ex-离散对数
  • 7. 原根及其应用
  • 8. 未解决的问题
  • {{ live2d() }}