summaryrefslogtreecommitdiff
path: root/factors/type.go
diff options
context:
space:
mode:
Diffstat (limited to 'factors/type.go')
-rw-r--r--factors/type.go27
1 files changed, 17 insertions, 10 deletions
diff --git a/factors/type.go b/factors/type.go
index 7a0f877..b58d01c 100644
--- a/factors/type.go
+++ b/factors/type.go
@@ -76,6 +76,15 @@ func Type(n uint) NumberType {
}
}
+// invariant: p must be odd and >= 3
+func nextPrime(p uint) uint {
+ possiblePrime := p + 2
+ for !isPrime(possiblePrime) {
+ possiblePrime += 2
+ }
+ return possiblePrime
+}
+
func exponentsOrdered(n uint) bool {
if n <= 2 {
return true
@@ -83,19 +92,17 @@ func exponentsOrdered(n uint) bool {
return false
}
- pf := PrimeFactorize(uint(n))
+ pf := PrimeFactorize(n)
maxPrime := slices.Max(pf.Primes())
- lastPrime := uint(2)
- for p := uint(3); p <= maxPrime; p += 2 {
- if PrimeFactorize(p).Exponent(p) == 1 {
- if pf.Exponent(p) > pf.Exponent(lastPrime) {
- return false
- } else if pf.Exponent(p) == 0 && p < maxPrime {
- return false
- }
- lastPrime = p
+ for prime, prevPrime := uint(3), uint(2); prime <= maxPrime; {
+ if pf.Exponent(prime) > pf.Exponent(prevPrime) {
+ return false
+ } else if pf.Exponent(prime) == 0 && prime < maxPrime {
+ return false
}
+
+ prime, prevPrime = nextPrime(prime), prime
}
return true