Home » Count Prime Numbers in Range

Count Prime Numbers in Range

Count prime numbers between given Lower and Upper Limits. Prime numbers are those numbers which can be divided only by 1 and that number itself and by no other number. Hence, 6 is not a prime number as it is divisible by 2 and 3. But 7 is a prime number. 1 is regarded as a non-prime number.

📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 58
Challenge Difficulty: ⭐️⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Count Prime Numbers in Range with Power Query

Power Query solution 1 for Count Prime Numbers in Range, proposed by Aditya Kumar Darak 🇮🇳:
let
  Source = Excel.CurrentWorkbook(){[Name = "data"]}[Content], 
  MyFun = (Number as number) =>
    let
      Sqrt = Number.Sqrt(Number), 
      Int  = Number.IntegerDivide(Sqrt, 1), 
      Seq  = {2 .. Int}, 
      Mod  = List.Transform(Seq, each Number.Mod(Number, _)), 
      TF   = List.Min(Mod) <> 0
    in
      TF, 
  Min = List.Min(Source[Lower Limit]), 
  Max = List.Max(Source[Upper Limit]), 
  Calc = List.Generate(
    () => [x = 2, y = 2], 
    each [x] <= Max, 
    each [x = [x] + 1, y = if MyFun(x) then x else null], 
    each [y]
  ), 
  Prime = List.Buffer(List.RemoveNulls(Calc)), 
  Return = Table.AddColumn(
    Source, 
    "Count", 
    each List.Count(List.Select(Prime, (f) => f >= [Lower Limit] and f <= [Upper Limit]))
  )
in
  Return
Power Query solution 2 for Count Prime Numbers in Range, proposed by Brian Julius:
let
  Source = Table.FromRows(
    Json.Document(
      Binary.Decompress(
        Binary.FromText(
          "PcqxEcAwCAPAXVRTCGxlGY7910iwuVToJTLhhGELZQl1dvKgryFG4myXwd/zrXi+Qh5ro+oF", 
          BinaryEncoding.Base64
        ), 
        Compression.Deflate
      )
    ), 
    let
      _t = ((type nullable text) meta [Serialized.Text = true])
    in
      type table [#"Lower Limit" = _t, #"Upper Limit" = _t]
  ), 
  Index = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type), 
  Type = Table.TransformColumnTypes(
    Index, 
    {{"Lower Limit", Int64.Type}, {"Upper Limit", Int64.Type}}
  ), 
  NumList = Table.AddColumn(
    Type, 
    "Number", 
    each List.Numbers([Lower Limit], [Upper Limit] - [Lower Limit] + 1)
  ), 
  Expand = Table.ExpandListColumn(NumList, "Number"), 
  RScriptPrimes = R.Execute(
    "# 'dataset' holds the input data for this script#(lf)library(primes)#(lf)dataset$isprime <- is_prime( dataset$Number)#(lf)answer <- as.data.frame(dataset)", 
    [dataset = Expand]
  ), 
  #"""answer""" = RScriptPrimes{[Name = "answer"]}[Value], 
  TrueOnly = Table.SelectRows(#"""answer""", each ([isprime] = true)), 
  CountPrimes = Table.Group(
    TrueOnly, 
    {"Lower Limit", "Upper Limit"}, 
    {{"Count", each Table.RowCount(_), Int64.Type}}
  )
in
  CountPrimes
Power Query solution 3 for Count Prime Numbers in Range, proposed by Matthias Friedmann:
let
  Source = Excel.CurrentWorkbook(){[Name = "PrimeRange"]}[Content], 
  #"Added Custom" = Table.AddColumn(
    Source, 
    "Count", 
    each List.Count(
      List.Select(
        {[Lower Limit] .. [Upper Limit]}, 
        each 
          let
            num = _
          in
            num
              > 1
                and List.IsEmpty(
                  List.Select(
                    {2 .. Number.RoundDown(Number.Sqrt(num))}, 
                    each Number.Mod(num, Number.From(_)) = 0
                  )
                )
      )
    )
  )[[Count]]
in
  #"Added Custom"

Solving the challenge of Count Prime Numbers in Range with Excel

Excel solution 1 for Count Prime Numbers in Range, proposed by John V.:
=b (a: lower limit, b: upper limit)

=MAP(A2:A7,B2:B7,LAMBDA(a,b,SUM(--(MAP(SEQUENCE(1+b-a,,a),LAMBDA(x,SUM(--(MOD(x,SEQUENCE(SQRT(x)))=0))))=1),-(a=1))))
Excel solution 2 for Count Prime Numbers in Range, proposed by محمد حلمي:
=MAP(A2:A7,
    B2:B7,
    
LAMBDA(a,
    b,
    
SUM(--MAP(SEQUENCE(
    b-a+1,
    ,
    a
),
    
LAMBDA(x,
    SUM(--(MOD(
        x/SEQUENCE(
            x
        ),
        1
    )=0))=2)))))
Excel solution 3 for Count Prime Numbers in Range, proposed by Julian Poeltl:
=MAP(A2:A7,B2:B7,LAMBDA(L,U,LET(S,SEQUENCE(U-L,,L),SUM(--MAP(S,LAMBDA(N,LET(c,{2357},D,N/TOCOL(VSTACK(c,SEQUENCE(N^0,5/6,,2)*6+{-11}),3),OR(N=c,AND(D-INT(D),N>1)))))))))
Excel solution 4 for Count Prime Numbers in Range, proposed by Timothée BLIOT:
=LET(LowerLimit,
    A2:A7,
     UpperLimit,
     B2:B7,
    

Numbers,
     SEQUENCE(
         ,
         INDEX(
             UpperLimit,
             1
         )-INDEX(
             LowerLimit,
             1
         )+1,
         INDEX(
             LowerLimit,
             1
         ),
         1
     ),
    
Divisors,
     BYCOL(Numbers,
     LAMBDA(b,
     ROUNDDOWN( b^(1/2),
    0) )),
    

Isprime,
     MAP( SEQUENCE(
         1,
         COLUMNS(
             Numbers
         )
     ),
     LAMBDA(b,
    

IF( SUM(
--(INDEX(
    Numbers,
    1,
    b
) /SEQUENCE(
    ,
    INDEX(
        Divisors,
        1,
        b
    )-1,
    2,
    1
) =
INT(
    INDEX(
    Numbers,
    1,
    b
)/SEQUENCE(
    ,
    INDEX(
        Divisors,
        1,
        b
    )-1,
    2,
    1
)
))
) >0,
     0,
     1)
 )),
    

SUM(
    Isprime
))
Excel solution 5 for Count Prime Numbers in Range, proposed by Charles Roldan:
=LET(Primes,
     LAMBDA(n,
     REDUCE(
DROP(
    SEQUENCE(
        n
    ),
     1
),
     DROP(
         SEQUENCE(
             ,
              SQRT(
        n
    )
         ),
          ,
          1
     ),
     
LAMBDA(a,
    b,
     FILTER(a,
     (a <= b) + MOD(
         a,
          b
     ))))),
     
MMULT(
    MATCH(
        A2:B7,
         Primes(
             MAX(
                 A2:B7
             )
         )
    ),
     {-1; 1}
))
Excel solution 6 for Count Prime Numbers in Range, proposed by Victor Momoh (MVP, MOS, R.Eng):
=MAP(A2:A7,B2:B7,LAMBDA(p,q,LET(a,SEQUENCE(q-p,,p),b,MAP(a,LAMBDA(x,SUM(--(MOD(x,SEQUENCE(INT(SQRT(x)),,2))=0)))),COUNT(FILTER(b,b=0)))))
Excel solution 7 for Count Prime Numbers in Range, proposed by Amardeep Singh:
=MAP(A2:A7,B2:B7,LAMBDA(a,b,
COUNT(LET(n,SEQUENCE(b-a+1,1,a),pchk,MAP(n,LAMBDA(x,IFS(x=1,FALSE,x<4,TRUE,TRUE,SUM(--(MOD(x,SEQUENCE(1,INT(x/2)-1,2))=0))=0))),FILTER(n,pchk)))))
Excel solution 8 for Count Prime Numbers in Range, proposed by Viswanathan M B:
=LET(a, MIN(A2:A7),
 b, MAX(B2:B7),
 Seqn, SEQUENCE(b-a+1,1,a),
 Func, LAMBDA(x, LET(b, x/SEQUENCE(SQRT(x)-1,1,2), SUM(--(b=INT(b)))=0)),
 IsPrime, MAP(Seqn, Func),
 PrimeList, FILTER(Seqn, IsPrime),
 BYROW((TRANSPOSE(PrimeList)>=A2:A7)*(TRANSPOSE(PrimeList)<=B2:B7), LAMBDA(a, SUM(a))))
Excel solution 9 for Count Prime Numbers in Range, proposed by Sarun Chimamphant:
=MAP(
    A2:A7,
    B2:B7,
    LAMBDA(
        lb,
        ub,
        REDUCE(
            0,
            SEQUENCE(
                ub-lb+1,
                ,
                lb
            ),
            LAMBDA(
                a,
                c,
                LET(
                    cs,
                    c^0.5,
                    IF(
                        OR(
                            MOD(
                                cs,
                                1
                            )=0,
                            ISEVEN(
                                c
                            )
                        ),
                        a,
                        IF(
                            OR(
                                MOD(
                                    c,
                                    SEQUENCE(
                                        cs,
                                        ,
                                        2
                                    )
                                )=0
                            ),
                            a,
                            a+1
                        )
                    )
                )
            )
        )
    )
)

Solving the challenge of Count Prime Numbers in Range with Python in Excel

Python in Excel solution 1 for Count Prime Numbers in Range, proposed by Alejandro Campos:
def is_prime(n): return n > 1 and all(n % i for i in range(2, int(n**0.5) + 1))
def count_primes(l, u): return sum(is_prime(n) for n in range(l, u + 1))
data = xl("A1:B7", headers=True)
[count_primes(l, u) for l, u in zip(data["Lower Limit"], data["Upper Limit"])]
                    
                  

Solving the challenge of Count Prime Numbers in Range with Excel VBA

Excel VBA solution 1 for Count Prime Numbers in Range, proposed by Rick Rothstein:
Function PrimeCountBetween(FromNumber As Long, ToNumber As Long) As Long
 Dim X As Long, NthPrime As Long, Test As Long, Sum As Long
 Const MaxPrime As Long = 20000003
 Static Initialized As Boolean, PrimesFlag() As Byte
 If FromNumber > 0 And FromNumber < ToNumber And ToNumber < 20000001 Then
 If Not Initialized Then
 Initialized = True
 PrimesFlag = ChrW(1) & ChrW(257) & String(10000000, ChrW(256))
 Test = 3
 Do While Test <= MaxPrime
 For X = 2 * Test To MaxPrime Step Test
 PrimesFlag(X) = 0
 Next
 Test = Test + 1 - (Test > 2)
 Loop
 End If
 For X = FromNumber To ToNumber
 If PrimesFlag(X) = 1 Then PrimeCountBetween = PrimeCountBetween + 1
 Next
 Else
 PrimeCountBetween = -1
 End If
End Function
                    
                  

&&&

Leave a Reply