Skip to main content
Code Review

Return to Answer

edited body
Source Link

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:])
deleted 82 characters in body
Source Link

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:])
Source Link

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:])
lang-py

AltStyle によって変換されたページ (->オリジナル) /