diff --git a/internal/lib/sieve/common.go b/internal/lib/sieve/common.go
index 1045e9a..4cd3d93 100644
--- a/internal/lib/sieve/common.go
+++ b/internal/lib/sieve/common.go
@@ -16,12 +16,16 @@ along with this program. If not, see .
*/
package sieve
-func updateMultiples(sieve []uint, p uint, n uint) {
+func updateMultiples(sieve []uint, p uint, n uint, additive bool) {
for q := p; ; q *= p {
// sieve[a*b] = sieve[a] * sieve[b] if gcd(a,b) = 1
for i := 2 * q; i < n; i += q {
if i%(p*q) != 0 {
- sieve[i] *= sieve[q]
+ if additive {
+ sieve[i] += sieve[q]
+ } else {
+ sieve[i] *= sieve[q]
+ }
}
}
diff --git a/internal/lib/sieve/divisors.go b/internal/lib/sieve/divisors.go
index 2a8d9df..b1fc09c 100644
--- a/internal/lib/sieve/divisors.go
+++ b/internal/lib/sieve/divisors.go
@@ -55,7 +55,7 @@ func Divisors(n uint, x uint, buflen uint) chan uint {
sieve[i*j] = pow(i*j, x) + sieve[j]
}
- updateMultiples(sieve, i, n)
+ updateMultiples(sieve, i, n, false)
ch <- sieve[i]
}
}()
diff --git a/internal/lib/sieve/primeOmega.go b/internal/lib/sieve/primeOmega.go
index d1a1579..6287954 100644
--- a/internal/lib/sieve/primeOmega.go
+++ b/internal/lib/sieve/primeOmega.go
@@ -16,21 +16,6 @@ along with this program. If not, see .
*/
package sieve
-func primeOmegaUpdateMultiples(sieve []uint, p uint, n uint) {
- for q := p; ; q *= p {
- // omega(a*b) = omega(a) + omega(b) if gcd(a,b) = 1
- for i := 2 * q; i < n; i += q {
- if i%(p*q) != 0 {
- sieve[i] += sieve[q]
- }
- }
-
- if p*q >= n {
- break
- }
- }
-}
-
func updatePowers(sieve []uint, p uint, n uint) {
for q := p; p*q < n; q *= p {
sieve[p*q] = 1 + sieve[q]
@@ -60,7 +45,7 @@ func PrimeOmega(n uint, multiplicity bool, buflen uint) chan uint {
updatePowers(sieve, i, n)
}
- primeOmegaUpdateMultiples(sieve, i, n)
+ updateMultiples(sieve, i, n, true)
ch <- sieve[i]
}
}()
diff --git a/internal/lib/sieve/radical.go b/internal/lib/sieve/radical.go
index 6804630..49676ef 100644
--- a/internal/lib/sieve/radical.go
+++ b/internal/lib/sieve/radical.go
@@ -59,7 +59,7 @@ func Radical(n uint, buflen uint) chan uint {
sieve[i*j] = sieve[i]
}
- updateMultiples(sieve, i, n)
+ updateMultiples(sieve, i, n, false)
ch <- sieve[i]
}
}()