Project Euler

Problem #27

Euler published the remarkable quadratic formula:

n² + n + 41

It turns out that the formula will produce 40 primes for the consecutive values n = 0 to 39. However, when n = 40, 40^(2) + 40 + 41 = 40(40 + 1) + 41 is divisible by 41, and certainly when n = 41, 41² + 41 + 41 is clearly divisible by 41.

Using computers, the incredible formula  n² − 79n + 1601 was discovered, which produces 80 primes for the consecutive values n = 0 to 79. The product of the coefficients, −79 and 1601, is −126479.

Considering quadratics of the form:

n² + an + b, where |a| < 1000 and |b| < 1000

where |n| is the modulus/absolute value of n
e.g. |11| = 11 and |−4| = 4

Find the product of the coefficients, a and b, for the quadratic expression that produces the maximum number of primes for consecutive values of n, starting with n = 0.

Erlang: Running time = 4.62s
+%run_procs

+%echo

+%prime_list

p27()->
	PL=prime_list(),
	PL ! {all_below,1000,self()},
	put(primes,receive {primes_below,1000,V}->V end),
	{_,Ans}=run_procs(1999,fun(I)->[euler,p27,[run,I-1000,get(primes),{0,0},self()]] end,
			   fun({L1,V1},{done,{L2,V2}}) when L2 > L1->{L2,V2};
			   	(LV,_)->LV end,{0,0}),
	io:format("~w~n",[Ans]).	

p27(run,_,[],LV,Parent)->Parent ! {done,LV};
p27(run,A,[B|Others],{Largest,Value},Parent)->
	Res=p27(check,A,B,1,prime_list()),
	if
		Res > Largest->p27(run,A,Others,{Res,A*B},Parent);
		true->p27(run,A,Others,{Largest,Value},Parent)
	end;

p27(check,A,B,I,PL)->
	Test=I*I+I*A+B,
	if
		Test < 2->I-1;
		true->
			PL ! {is_prime,Test,self()},
			case receive {is_prime,Test,Res}->Res end of 
				true->
					p27(check,A,B,I+1,PL);
				false->
					I-1
			end
	end.

Ruby: Running time = 7.23s
+#cartesian_product

+#PrimeList

+#Enumerable

def p27
  candidates=cartesian_product((-999..999),(2..999).select{|i|PrimeList.isPrime? i}){|a,b|PrimeList.isPrime?(a+b+1)}
  n=1
  while candidates.length>1
    n+=1
    candidates.reject!{|p|not PrimeList.isPrime?(n**2+n*p[0]+p[1])}
  end
  puts candidates.first.product
end