Skip to content

Commit add9355

Browse files
committed
fix: Ensure unique factors in prime_primitive_root function
1 parent b23c214 commit add9355

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

weilycoder/number-theory/primitive_root.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,16 @@ bool is_primitive_root(uint64_t g, uint64_t p, const std::vector<uint64_t> &fact
6262
* @param p The prime modulus
6363
* @return A primitive root modulo p, or 0 if p is not prime
6464
*/
65-
template <bool bit32 = false> constexpr uint64_t prime_primitive_root(uint64_t p) {
65+
template <bool bit32 = false, size_t N = 64>
66+
constexpr uint64_t prime_primitive_root(uint64_t p) {
6667
if (p == 2)
6768
return 1;
6869
if (!is_prime(p))
6970
return 0;
70-
auto factors = factorize_fixed<64, bit32>(p - 1);
71+
auto factors = factorize_fixed<N, bit32>(p - 1);
72+
auto factor_end = std::unique(factors.begin(), factors.end());
73+
if (factor_end != factors.end())
74+
*factor_end = 0;
7175
for (uint64_t g = 2; g < p; ++g)
7276
if (is_primitive_root<64, bit32>(g, p, factors))
7377
return g;

0 commit comments

Comments
 (0)