From c842762ca9cfd189703fd742ec1178c7ac79632a Mon Sep 17 00:00:00 2001 From: filifa Date: Tue, 7 Oct 2025 18:10:44 -0400 Subject: [PATCH] adapt to update sieves for additive functions --- internal/lib/sieve/common.go | 8 ++++++-- internal/lib/sieve/divisors.go | 2 +- internal/lib/sieve/primeOmega.go | 17 +---------------- internal/lib/sieve/radical.go | 2 +- 4 files changed, 9 insertions(+), 20 deletions(-) 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] } }()