/* Copyright © 2025 filifa This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ package lib /* MobiusSieve computes mobius(k) for k=1 to n, where mobius is the Mobius function. */ func MobiusSieve(n uint) chan int { sieve := make([]int, n) for i := 0; i < int(n); i++ { sieve[i] = i } ch := make(chan int) go func() { for i := 0; i < int(n); i++ { if i == 0 || i == 1 || sieve[i] != i { ch <- sieve[i] continue } ch <- -1 for j := 2 * i; j < int(n); j += i { if j%(i*i) == 0 { sieve[j] = 0 } sieve[j] /= -i } } close(ch) }() return ch }