adapt to update sieves for additive functions
This commit is contained in:
parent
df317e0837
commit
c842762ca9
|
|
@ -16,12 +16,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
package sieve
|
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 {
|
for q := p; ; q *= p {
|
||||||
// sieve[a*b] = sieve[a] * sieve[b] if gcd(a,b) = 1
|
// sieve[a*b] = sieve[a] * sieve[b] if gcd(a,b) = 1
|
||||||
for i := 2 * q; i < n; i += q {
|
for i := 2 * q; i < n; i += q {
|
||||||
if i%(p*q) != 0 {
|
if i%(p*q) != 0 {
|
||||||
sieve[i] *= sieve[q]
|
if additive {
|
||||||
|
sieve[i] += sieve[q]
|
||||||
|
} else {
|
||||||
|
sieve[i] *= sieve[q]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ func Divisors(n uint, x uint, buflen uint) chan uint {
|
||||||
sieve[i*j] = pow(i*j, x) + sieve[j]
|
sieve[i*j] = pow(i*j, x) + sieve[j]
|
||||||
}
|
}
|
||||||
|
|
||||||
updateMultiples(sieve, i, n)
|
updateMultiples(sieve, i, n, false)
|
||||||
ch <- sieve[i]
|
ch <- sieve[i]
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
|
||||||
|
|
@ -16,21 +16,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
package sieve
|
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) {
|
func updatePowers(sieve []uint, p uint, n uint) {
|
||||||
for q := p; p*q < n; q *= p {
|
for q := p; p*q < n; q *= p {
|
||||||
sieve[p*q] = 1 + sieve[q]
|
sieve[p*q] = 1 + sieve[q]
|
||||||
|
|
@ -60,7 +45,7 @@ func PrimeOmega(n uint, multiplicity bool, buflen uint) chan uint {
|
||||||
updatePowers(sieve, i, n)
|
updatePowers(sieve, i, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
primeOmegaUpdateMultiples(sieve, i, n)
|
updateMultiples(sieve, i, n, true)
|
||||||
ch <- sieve[i]
|
ch <- sieve[i]
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ func Radical(n uint, buflen uint) chan uint {
|
||||||
sieve[i*j] = sieve[i]
|
sieve[i*j] = sieve[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
updateMultiples(sieve, i, n)
|
updateMultiples(sieve, i, n, false)
|
||||||
ch <- sieve[i]
|
ch <- sieve[i]
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue