summaryrefslogtreecommitdiff
path: root/math/primitiveRoot.cpp
blob: 7973c24c06a3e505127c6cbeaa7888e2d9edadc3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bool isPrimitive(ll g, ll n, ll phi, map<ll, int> phiFacs) {
	if (g == 1) return n == 2;
	for (auto& f : phiFacs)
		if (1 == powMod(g, phi / f.first, n)) return false;
	return true;
}

bool isPrimitive(ll g, ll n) {
	ll phin = phi(n); //isPrime(n) => phi(n) = n - 1 
	map<ll, int> phiFacs;
	factor(phin, phiFacs);
	return isPrimitive(g, n, phin, phiFacs);
}

ll findPrimitive(ll n) {
	ll phin = phi(n); //isPrime(n) => phi(n) = n - 1
	map<ll, int> phiFacs;
	factor(phin, phiFacs);
	//auch zufällige Reihenfolge möglich!
	for (ll res = 1; res < n; res++)
		if (isPrimitive(res, n, phin, phiFacs)) return res;
	return -1;
}