Kyopro Library
読み取り中…
検索中…
一致する文字列を見つけられません
primitive_root.hpp
[詳解]
1
#
pragma
once
2
#
include
"../../kyopro_library/template.hpp"
3
#
include
"../../kyopro_library/others/modcal.hpp"
4
#
include
"../../kyopro_library/math/prime_factorize.hpp"
5
#
include
"../../kyopro_library/others/xor128.hpp"
6
7
/// @brief n の原始根を求める
8
/// @ref https://37zigen.com/primitive-root/
9
/// @ref verify: https://judge.yosupo.jp/problem/primitive_root
10
ll
PrimitiveRoot
(ll n) {
11
if
(!
PrimalityTest
(
n
)
)
return
-1;
12
if
(n==2)
return
1;
13
14
auto
pf=PrimeFactorize(n-1);
15
while
(
true
) {
16
ll i=
Xor128
(
2
,
n
)
;
17
bool
ok=
true
;
18
for
(
auto
[p,_]: pf) {
19
if
(ModPow(i,(n-1)/p,n)==1) {
20
ok=
false
;
21
break
;
22
}
23
}
24
if
(ok)
return
i;
25
}
26
return
-1;
27
}
PrimalityTest
bool PrimalityTest(ll n)
ミラーラビン素数判定法により n が素数であるかを判定する
Definition
primality_test.hpp:9
PrimitiveRoot
ll PrimitiveRoot(ll n)
n の原始根を求める https://37zigen.com/primitive-root/ verify: https://judge.yosupo.jp/problem/primitive_root
Definition
primitive_root.hpp:10
Xor128
ll Xor128(ll l, ll r)
Definition
xor128.hpp:18
math
primitive_root.hpp
構築:
1.13.2