summaryrefslogtreecommitdiff
path: root/math/primitiveRoot.cpp
blob: 464bdb3b18932402c4bd40d0eca61aea643d5901 (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 (powMod(g, phi / f, n) == 1) 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;
}