Of course, in addition to considering all even numbers > 2 set to False, multiples of 2 and 3 can be excluded to further speed up
def countPrimes(n):
if n<=2:
return 0
if n<6:
return n//3+n//54
dimv=n//6
sieve5mod6 = [True] * (dimv+1)
sieve1mod6 = [True] * (dimv+1)
imax=int((n**0.5)/6)+1
for i in range(1,imax+1):
if sieve5mod6[i]:
imin=6*i*i
pi=6*i-1
sieve5mod6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1mod6[imin-2*i::pi]=[False]*((dimv-imin+2*i)//pi+1)
if sieve1mod6[i]:
imin=6*i*i
pi=6*i+1
sieve5mod6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1mod6[imin+2*i::pi]=[False]*((dimv-imin-2*i)//pi+1)
#since sieve5m6[0]=True and sieve1m6[0]=True is exploited to consider 2 and 3 in the count
#for an exact result it is necessary to distinguish the different values ??of n%6
if n%6>1: return sum(sieve5mod6)+sum(sieve1mod6)
return sum(sieve5mod6)+sum(sieve1mod6[:-1:])
Of course, in addition to considering all even numbers > 2 set to False, multiples of 2 and 3 can be excluded to further speed up
def countPrimes(n):
if n<=2:
return 0
if n<6:
return n//3+n//5
dimv=n//6
sieve5mod6 = [True] * (dimv+1)
sieve1mod6 = [True] * (dimv+1)
imax=int((n**0.5)/6)+1
for i in range(1,imax+1):
if sieve5mod6[i]:
imin=6*i*i
pi=6*i-1
sieve5mod6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1mod6[imin-2*i::pi]=[False]*((dimv-imin+2*i)//pi+1)
if sieve1mod6[i]:
imin=6*i*i
pi=6*i+1
sieve5mod6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1mod6[imin+2*i::pi]=[False]*((dimv-imin-2*i)//pi+1)
#since sieve5m6[0]=True and sieve1m6[0]=True is exploited to consider 2 and 3 in the count
#for an exact result it is necessary to distinguish the different values ??of n%6
if n%6>1: return sum(sieve5mod6)+sum(sieve1mod6)
return sum(sieve5mod6)+sum(sieve1mod6[:-1:])
Of course, in addition to considering all even numbers > 2 set to False, multiples of 2 and 3 can be excluded to further speed up
def countPrimes(n):
if n<=2:
return 0
if n<6:
return n//3+n//4
dimv=n//6
sieve5mod6 = [True] * (dimv+1)
sieve1mod6 = [True] * (dimv+1)
imax=int((n**0.5)/6)+1
for i in range(1,imax+1):
if sieve5mod6[i]:
imin=6*i*i
pi=6*i-1
sieve5mod6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1mod6[imin-2*i::pi]=[False]*((dimv-imin+2*i)//pi+1)
if sieve1mod6[i]:
imin=6*i*i
pi=6*i+1
sieve5mod6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1mod6[imin+2*i::pi]=[False]*((dimv-imin-2*i)//pi+1)
#since sieve5m6[0]=True and sieve1m6[0]=True is exploited to consider 2 and 3 in the count
#for an exact result it is necessary to distinguish the different values ??of n%6
if n%6>1: return sum(sieve5mod6)+sum(sieve1mod6)
return sum(sieve5mod6)+sum(sieve1mod6[:-1:])
Of course, in addition to considering all even numbers > 2 set to False, multiples of 2 and 3 can be excluded to further speed up
def countPrimes(n):
if n<2n<=2:
return 0
if n<7n<6:
return 1+nn//3+n//5
dimv=n//6+16
sieve5m6sieve5mod6 = [True] * (dimv+1)
sieve1m6sieve1mod6 = [True] * (dimv+1)
imax=int((n**0.5)/6)+1
for i in range(1,imax+1):
if sieve5m6[i]sieve5mod6[i]:
imin=6*i*i
pi=6*i-1
sieve5m6[iminsieve5mod6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1m6[iminsieve1mod6[imin-2*i::pi]=[False]*((dimv-imin+2*i)//pi+1)
if sieve1m6[i]sieve1mod6[i]:
imin=6*i*i
pi=6*i+1
sieve5m6[iminsieve5mod6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1m6[imin+2*isieve1mod6[imin+2*i::pi]=[False]*((dimv-imin-2*i)//pi+1)
#since sieve5m6[0]=True and sieve1m6[0]=True is exploited to consider 2 and 3 in the count
#for an exact result it is necessary to distinguish the different values of??of n%6
if n%6==5
return sum(sieve5m6)+sum(sieve1m6[:-1n%6>1:])
if n%6==0
return sum(sieve5m6[:-1:]sieve5mod6)+sum(sieve1m6[:-2:]sieve1mod6)
return sum(sieve5m6[:-1:]sieve5mod6)+sum(sieve1m6[sieve1mod6[:-1:])
Of course, in addition to considering all even numbers > 2 set to False, multiples of 2 and 3 can be excluded to further speed up
def countPrimes(n):
if n<2:
return 0
if n<7
return 1+n//3+n//5
dimv=n//6+1
sieve5m6 = [True] * (dimv+1)
sieve1m6 = [True] * (dimv+1)
imax=int((n**0.5)/6)+1
for i in range(1,imax+1):
if sieve5m6[i]:
imin=6*i*i
pi=6*i-1
sieve5m6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1m6[imin-2*i::pi]=[False]*((dimv-imin+2*i)//pi+1)
if sieve1m6[i]:
imin=6*i*i
pi=6*i+1
sieve5m6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1m6[imin+2*i::pi]=[False]*((dimv-imin-2*i)//pi+1)
#since sieve5m6[0]=True and sieve1m6[0]=True is exploited to consider 2 and 3 in the count
#for an exact result it is necessary to distinguish the different values of n%6
if n%6==5
return sum(sieve5m6)+sum(sieve1m6[:-1:])
if n%6==0
return sum(sieve5m6[:-1:])+sum(sieve1m6[:-2:])
return sum(sieve5m6[:-1:])+sum(sieve1m6[:-1:])
Of course, in addition to considering all even numbers > 2 set to False, multiples of 2 and 3 can be excluded to further speed up
def countPrimes(n):
if n<=2:
return 0
if n<6:
return n//3+n//5
dimv=n//6
sieve5mod6 = [True] * (dimv+1)
sieve1mod6 = [True] * (dimv+1)
imax=int((n**0.5)/6)+1
for i in range(1,imax+1):
if sieve5mod6[i]:
imin=6*i*i
pi=6*i-1
sieve5mod6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1mod6[imin-2*i::pi]=[False]*((dimv-imin+2*i)//pi+1)
if sieve1mod6[i]:
imin=6*i*i
pi=6*i+1
sieve5mod6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1mod6[imin+2*i::pi]=[False]*((dimv-imin-2*i)//pi+1)
#since sieve5m6[0]=True and sieve1m6[0]=True is exploited to consider 2 and 3 in the count
#for an exact result it is necessary to distinguish the different values ??of n%6
if n%6>1: return sum(sieve5mod6)+sum(sieve1mod6)
return sum(sieve5mod6)+sum(sieve1mod6[:-1:])
Of course, in addition to considering all even numbers > 2 set to False, multiples of 2 and 3 can be excluded to further speed up
def countPrimes(n):
if n<2:
return 0
if n<7
return 1+n//3+n//5
dimv=n//6+1
sieve5m6 = [True] * (dimv+1)
sieve1m6 = [True] * (dimv+1)
imax=int((n**0.5)/6)+1
for i in range(1,imax+1):
if sieve5m6[i]:
imin=6*i*i
pi=6*i-1
sieve5m6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1m6[imin-2*i::pi]=[False]*((dimv-imin+2*i)//pi+1)
if sieve1m6[i]:
imin=6*i*i
pi=6*i+1
sieve5m6[imin::pi]=[False]*((dimv-imin)//pi+1)
sieve1m6[imin+2*i::pi]=[False]*((dimv-imin-2*i)//pi+1)
#since sieve5m6[0]=True and sieve1m6[0]=True is exploited to consider 2 and 3 in the count
#for an exact result it is necessary to distinguish the different values of n%6
if n%6==5
return sum(sieve5m6)+sum(sieve1m6[:-1:])
if n%6==0
return sum(sieve5m6[:-1:])+sum(sieve1m6[:-2:])
return sum(sieve5m6[:-1:])+sum(sieve1m6[:-1:])