Skip to content

Instantly share code, notes, and snippets.

@igorvanloo
Last active December 8, 2022 14:51
Show Gist options
  • Save igorvanloo/0aaf6599a95cd7325ed497106b9cf634 to your computer and use it in GitHub Desktop.
Save igorvanloo/0aaf6599a95cd7325ed497106b9cf634 to your computer and use it in GitHub Desktop.
mobius sieve/counting k free numbers
def mobius_k_sieve(n, k):
isprime = [1]*(n + 1)
isprime[0] = isprime[1] = 0
mob = [0] + [1]*(n)
for p in range(2, n + 1):
if isprime[p]:
mob[p] *= -1
for i in range(2*p, n + 1, p):
isprime[i] = 0
mob[i] *= -1
sq = pow(p, k)
if sq <= n:
for j in range(sq, n + 1, sq):
mob[j] = 0
return mob
def count_kfree(n, k):
sq = int(pow(n, 1/k))
mobius_k = mobius_k_sieve(sq, 2)
return sum([mobius_k[i]*(n//pow(i, k)) for i in range(1, sq + 1)])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment