# Sum of primes between given range

Write the shortest code for finding the sum of primes between $$\a\$$ and $$\b\$$ (inclusive).

Input

1. $$\a\$$ and $$\b\$$ can be taken from command line or stdin (space seperated)
2. Assume $$\1 \le a \le b \le 10^8\$$

Output Just print the sum with a newline character.

Bonus Points

1. If the program accepts multiple ranges (print one sum on each line), you get extra points. :)
• The upper limit is too big to allow many interesting solutions (if they have to complete in reasonable time, at least). – hallvabo Jan 28 '11 at 9:13
• @hallvabo You find inefficient solutions interesting? – Matthew Read Jan 28 '11 at 9:25
• @hallvabo, That's ok. I don't think anyone minds an ineffcient solution. If other's object, i'll be more than happy to lower the limit – st0le Jan 28 '11 at 9:38
• Just made and ran a not very optimised or concise version of the program in C#, using 1 to 10^8. Assuming my algorithm's correct, it ran in under 1m30s, and didn't overflow from a long. Seems like a fine upper limit to me! – Nellius Jan 28 '11 at 12:08
• A quick easy check: sum of primes between 1 and 100 = 1060. – Nellius Jan 28 '11 at 12:50

# J,41 32 19 characters:

Update

(simple sieve)

g=:+/@(*1&p:)@-.&i.

e.g.

100 g 1
1060
250000x g 48
2623030823

Previous

h=:3 :'+/p:i.(_1 p:>:y)'
f=:-&h<:

eg:

100 f 1
1060

## Mathematica 7 (31 chars in plain text)

If PARI/GP solution allowed, then:

Plus@@Select[Range[a,b],PrimeQ]
• What's your point? PARI/GP and Mathematica are fine programming languages. – Eelvex Jan 29 '11 at 8:28
• @Eelvex, no, they break one of golf rules: using built-in specific highlevel functions. – Nakilon Jan 29 '11 at 9:19
• I don't think there is such a rule. It's still an open matter when to use highlevel functions. See for ex. this meta question – Eelvex Jan 29 '11 at 9:42
• 28 chars Range[a,b]~Select~PrimeQ//Tr. – chyanog Sep 9 '13 at 5:12

# C, 117 bytes

main(a,b,s,j){
s=0,scanf("%d%d",&a,&b);
for(a+=a==1;a<=b;a++)
for(s+=a,j=2;j<a;)
s-=a%j++?0:(j=a);
printf("%d",s);
}

# PARI/GP, 44 characters

sum(x=nextprime(a),precprime(b),x*isprime(x))
• Shouldn't down voters give a reason for their -1? – Eelvex Jan 29 '11 at 8:27
• The downvote was probably for using built-ins. – mbomb007 Jun 26 '15 at 21:48

# C#, 294 characters

using System;class P{static void Main(){int a=int.Parse(Console.ReadLine()),b=int.Parse(Console.ReadLine());long t=0;for(int i=a;i<=b;i++)if(p(i))t+=i;Console.WriteLine(t);}static bool p(int n){if((n%2<1&&n!=2)||n<2)return 0>1;for(int i=3;i<=Math.Sqrt(n);i+=2)if(n%i==0)return 0>1;return 1>0;}}
• You can make all your ints long and save a few characters: long a=...,b=...,t=0,i=a;for(;i<=b;i++). This gets it to 288 chars. You can also let p return a long and just return either 0 or n and shorten the loop to t+=p(i). 277 chars, then. – Joey Jun 19 '11 at 9:28

# Perl, 62 chars

<>=~/\d+/;map$s+=$_*(1x$_)!~/^1$|(^11+)\1+$/,$&..$';print$s,$/ This one uses the prime number regex. # C#, 183 characters using System;class P{static void Main(string[] a){long s=0,i=Math.Max(int.Parse(a[0]),2),j;for(;i<=int.Parse(a[1]);s+=i++)for(j=2;j<i;)if(i%j++==0){s-=i;break;}Console.WriteLine(s);}} This would be much shorter if it didn't have to check for 1, or if there was a better way to... In a more readable format: using System; class P { static void Main(string[] a) { long s = 0, i = Math.Max(int.Parse(a[0]),2), j; for (; i <= int.Parse(a[1]);s+=i++) for (j = 2; j < i; ) if (i % j++ == 0) { s -= i; break; } Console.WriteLine(s); } } • I like how short this is, but I wonder how inefficient it would be when calculating up to 10^8! – Nellius Jan 28 '11 at 17:24 • True, but efficiency wasn't in the rules! – Nick Larsen Jan 28 '11 at 18:20 • You know the compiler defaults numerics to 0 right? That'ld save you a couple more chars in there – jcolebrand Jan 29 '11 at 6:20 • Gives error when compiled without it – Nick Larsen Jan 29 '11 at 21:21 • ...because it is never assigned before it is used (via s -= i; because thats just syntactic sugar for s = s - i; which tries to access s before setting it) – Nick Larsen Jan 29 '11 at 21:28 ## Haskell (80) c=u[2..];u(p:xs)=p:u[x|x<-xs,xmodp>0];s a b=(sum.filter(>=a).takeWhile(<=b))c s 1 100 == 1060 • This is code-golf! Why do you use such long names for your stuff? – FUZxxl Feb 3 '11 at 16:30 • It's hard to find shorter names than c, u, s... The rest is language standard library. – J B Feb 7 '11 at 10:04 ## Normal Task (Python 3): 95 chars a,b=map(int,input().split()) r=range print(sum(1%i*all(i%j for j in r(2,i))*i for i in r(a,b+1))) ## Bonus Task (Python 3): 119 chars L=iter(map(int,input().split())) r=range for a,b in zip(L,L):print(sum(1%i*all(i%j for j in r(2,i))*i for i in r(a,b+1))) # Pari/GP (24 characters) s=0;forprime(i=a,b,s+=i) Like some other solutions, this doesn't strictly meet the requirements, as a and b aren't read from stdin or the command line. I thought it was a nice alternative to the other Pari/GP and Mathematica solutions however. • +1: This is the way I'd actually do it, even without golfing. – Charles Apr 28 '15 at 14:55 # Japt, 7 bytes òV fj x Try it here. • Welcome to Japt :) – Shaggy Oct 11 '17 at 12:00 • @Shaggy I originally tried to find a "prime range" builtin in Japt, but then decided to accept the challenge :p – Erik the Outgolfer Oct 11 '17 at 12:01 • Given how many challenges there are related to primes, a shortcut for fj<space> could be handy. – Shaggy Oct 11 '17 at 12:02 # BASH Shell, 47 Characters seq 1 100|factor|awk 'NF==2{s+=$2}END{print s}'

Edit: Just realized the sum overflows and is coerced as a double.

### 52 50 Characters

Here's a bit longer solution, but handles overflows aswell
seq 1 100|factor|awk NF==2{print$2}|paste -sd+|bc • tr is shorter than paste, and you can remove the single quotes (escape the ). – Nabb Feb 4 '11 at 4:25 • @Nabb, will fix it as soon as i get my hands on a *nix box, or you could do the honours. – st0le Feb 4 '11 at 4:28 • @Nabb, can't get it to work, tr adds a trailing '+' at the end, fixing it will take more chars. – st0le Feb 6 '11 at 11:47 • Ah, missed that. Although I think you can still change to awk NF==2{print$2} to save a byte on the longer solution (we won't accidentally run into brace expansion because there are no commas or ..s). – Nabb Feb 6 '11 at 19:29
• @Nabb, you're right. Done :) – st0le Feb 7 '11 at 4:25

# Ruby 1.9, 63 chars

require'prime';p=->a,b{Prime.each(b).select{|x|x>a}.inject(:+)}

Use like this

p[1,100] #=> 1060

Using the Prime class feels like cheating, but since the Mathematica solutions used built-in prime functions...

## APL (25 characters)

+/((R≥⎕)^~R∊R∘.×R)/R←1↓⍳⎕

This is a modification of a well-known idiom (see this page for an explanation) for generating a list of primes in APL.

Example:

+/((R≥⎕)^~R∊R∘.×R)/R←1↓⍳⎕
⎕:
100
⎕:
1
1060

# Factor -> 98

:: s ( a b -- n )
:: i ( n -- ? )
n 1 - 2 [a,b] [ n swap mod 0 > ] all? ;
a b [a,b] [ i ] filter sum ;

Output:

( scratchpad ) 100 1000 s

--- Data stack:
75067

æRS

Try it online!

# 05AB1E, 5 bytes

ŸDp*O

Try it online!

Ÿ      Push the list [a, ..., b]
D     Push a duplicate of that list
p    Replace primes with 1 and everything else with 0
*   Element-wise multiply the two lists [1*0, 2*1, 3*1, 4*0, ...]
O  Sum of the final list of primes
• ✓ I didn't think of using p* – Someone Jan 3 at 17:00
• More boring solution with filter: Ÿʒp}O – Makonede 2 days ago

# Common Lisp, 107 chars

(flet((p(i)(loop for j from 2 below i never (= (mod i j) 0))))(loop for x from(read)to(read)when(p x)sum x))

only works for starting points $$\\ge 1\$$

# R, 57 characters

a=scan();b=a[1]:a[2];sum(b[rowSums(!outer(b,b,%%))==2])
• Is specifying n=2 necessary in scan()? If the input is standard, is there a problem with omitting the argument and assuming an extra <enter> is required? – Gaffi Oct 30 '13 at 19:16
• No actually you're right I could have done without. It was purely for aesthetic reasons (since i knew my code wasn't the shortest anyway :) ) – plannapus Oct 30 '13 at 19:26
• Well, +1 from me just the same, as it's definitely not the longest. – Gaffi Oct 30 '13 at 19:27

# Factor + math.primes math.unicode, 32 bytes

[ [a,b] [ prime? ] filter Σ . ]

Try it online!

• prime? and Σ are not available by default, so you need to change the header to "Factor + math.primes math.unicode" like this. – Bubbler Mar 14 at 23:27
• Thank you, @Bubbler I changed the header of my answers :) – Michael Chatiskatzi Mar 14 at 23:59
• primes-between is shorter than [a,b] [ prime? ] filter. – chunes 2 days ago

Sample Usage:

q)d[1;100]
1060

## Mathematica, 27

Predefined a and b:

a~Range~b~Select~PrimeQ//Tr

As a function (also 27):

Tr[Range@##~Select~PrimeQ]&

## Python 3.1(153 chars):

from sys import*
p=[]
for i in range(int(argv[1]),int(argv[2])):
r=1
for j in range(2,int(argv[2])):
if i%j==0and i!=j:r=0
if r:p+=[i]
print(sum(p))
• 1. from sys import* 2. r=True -> r=1 (and respectively 0 for False) 3. if i%j==0and i!=j:r=0 4. if r:p+=[i] 5. print(sum(p)) (replaces last 4 lines) – seequ Aug 7 '14 at 21:13
• You can use input() to be shorter. Also, can you use if i%j<1and instead? – mbomb007 Jun 26 '15 at 21:51

## Python 3: 86 chars

a,b=map(int,input().split())
P=k=1
s=0
while k<=b:s+=P%k*k*(k>=a);P*=k*k;k+=1
print(s)

Uses the factorial trick with Wilson's Theorem to check whether k is prime. P%k is 1 if k is prime and 0 otherwise. If it is prime, k is added to the running sum s.

# GolfScript, 27 24 bytes

~,>{:x,{)x\%!},,2=},{+}*

This is based off of @w0lf's prime number algorithm.

• Could you please add a "how it works"? – Someone Jan 3 at 21:08

L,d@ßrÞP¦+

Try it online!

## How it works

D,f,@@,		; Define a dyadic function, f
; Example arguments:	[2 23]
d	; Duplicate;	STACK = [2 23 23]
@	; Reverse;	STACK = [23 23 2]
ßr	; Range;	STACK = [23 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22]
Þ	; Filter on:
P	;  Primality	STACK = [23 2 3 5 7 11 13 17 19]
¦+	; Sum;		STACK = [100]

# C#, 302 bytes

using System;namespace X{class B{static void Main(){long x=long.Parse(Console.ReadLine()),y=long.Parse(Console.ReadLine()),r=0;for(long i=x;i<=y;i++){if(I(i)){r+=i;}}Console.WriteLine(r);}static bool I(long n){bool b=true;if(n==1){b=false;}for(long i=2;i<n;++i){if(n%i==0){b=false;break;}}return b;}}}

# R, 85 characters

x=scan(nmax=2);sum(sapply(x[1]:x[2],function(n)if(n==2||all(n %% 2:(n-1)))n else 0))

Extremely inefficient! I'm pretty sure it takes O(n^2) time. It might give warnings about coercing a double to a logical.

Deobfuscated:

x <- scan(nmax=2)
start <- x[1]
end <- x[2]

#this function returns n if n is prime, otherwise it returns 0.
return.prime <- function(n) {
# if n is 2, n is prime. Otherwise, if, for each number y between 2 and n, n mod y is 0, then n must be prime
is.prime <- n==2 || all(n%% 2:(n-1))
if (is.prime)
n
else
0
}
primes <- sapply(start:end, return.prime)
sum(primes)

# Whispers v3, 69 bytes

> Input
> Input
>> 1…2
>> L’
>> Select∧ 4 3
>> ∑5
>> Output 6

Try it online!

simply makes an inclusive range and filters it, then sums it.