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
10ll 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}
bool PrimalityTest(ll n)
ミラーラビン素数判定法により n が素数であるかを判定する
ll PrimitiveRoot(ll n)
n の原始根を求める https://37zigen.com/primitive-root/ verify: https://judge.yosupo.jp/problem/primitive_root
ll Xor128(ll l, ll r)
Definition xor128.hpp:18