Looking for a "smart" index for a Do-loop (Revised!)
- To: mathgroup at smc.vnet.net
- Subject: [mg50331] Looking for a "smart" index for a Do-loop (Revised!)
- From: gilmar.rodriguez at nwfwmd.state.fl.us (Gilmar Rodr?guez Pierluissi)
- Date: Fri, 27 Aug 2004 02:57:54 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Dear Mathematica Group: The following program is used to calculate the Minimal Goldbach Prime Partition Points corresponding to an even number n >= 4: MGPPP[n_] := Block[{p, q}, Do[If[PrimeQ[q = (n - (p = Prime[i]))], Return[{p, q}]], {i, PrimePi[n/2], 1, -1}]] To visualize these points try: ListPlot[Table[MGPPP[n], {n, 4, 100, 2}], PlotJoined -> True] Notice that the index i starts at the value PrimePi[n/2]. Next, 1 is sustracted from PrimePi[n/2] (as long as q = n- Prime[i] is not prime), with i (possibly) reaching the value 1. Now, I'm attempting to reduce the number of iterations of my index i, to make my program faster. Let K = PrimePi[n/2], and L = PrimePi[Ceiling[Sqrt[n]]]. Rather than {i, K, 1, -1}, I want to use {i, K, L, -1} in the above "Do-loop". The value PrimePi[Ceiling[Sqrt[n]]] takes advantage of the so called "Knjzek p lower bound". To visualize the geometry involved, please visit: http://gilmarlily.netfirms.com/goldbach/knjzekbands.htm The program takes the primes between Prime[PrimePi[n/2]] and Prime[PrimePi[Ceiling[Sqrt[n]]]] and looks for the first instance in which (n - Prime[i]) is prime for i = K, K-1, K-2, ..., perhaps up to L. When the program finds (n - Prime[i]) prime, it stops and returns MGPPP[n]. The problem with attempting: MGPPP[n_] := Block[{p, q}, Do[If[PrimeQ[q = (n - (p = Prime[i]))], Return[{p, q}]], {i, K, L, -1}]]] is that the do-loop will not work for 4 <=n <= 8. Keep in mind that i assumes values K, K-1, ...., until reaching L. The program works for n > 8 though, since for these n's, K is large enough to loop its way to L. To see this try: Table[{n,PrimePi[Ceiling[Sqrt[n]]],PrimePi[n/2]},{n, 4,300,2}]//TableForm and: Table[{n,Prime[PrimePi[Ceiling[Sqrt[n]]]],Prime[PrimePi[n/2]]},{n, 4,300,2}]//TableForm I would like to modify the above program to do something like this: MGPPP[n_] := Module[{p, q}, {m = n/2; If[Element[m, Primes], {p = m, q = m}, {K = PrimePi[m], If[Element[n], {4, 6, 8}], L = 1, L = PrimePi[Ceiling[Sqrt[ n]]]; Do[If[Element[n - Prime[ i], Primes], hit = i; Break[]], {i, K, L, -1}], p = Prime[ hit], q = n - p}]}; {p, q}] In other words; if 4 <=n <= 8 the lower index L becomes 1, if not (i.e. n > 8) L = PrimePi[Ceiling[Sqrt[n]]]. I'm looking for a "smart" index for my Do-loop, but any other approach to make this program work (using L) is definitely welcomed! Thank you for your help!
- Follow-Ups:
- Re: Looking for a "smart" index for a Do-loop (Revised!)
- From: DrBob <drbob@bigfoot.com>
- Re: Looking for a "smart" index for a Do-loop (Revised!)