Re: Nested If
- To: mathgroup at smc.vnet.net
- Subject: [mg92836] Re: [mg92779] Nested If
- From: Bob Hanlon <hanlonr at cox.net>
- Date: Tue, 14 Oct 2008 05:00:11 -0400 (EDT)
- Reply-to: hanlonr at cox.net
f1[k_Integer?Positive] := Module[{m1, m2, m3, m4, m5, m6, m7, m8, m9}, {m1, m2, m3, m4, m5, m6, m7, m8, m9} = Table[-1, {9}]; Do[If[Mod[n, 2] == 0, m1 = m1 + 1, If[Mod[n, 3] == 0, m2 = m2 + 1, If[Mod[n, 5] == 0, m3 = m3 + 1, If[Mod[n, 7] == 0, m4 = m4 + 1, If[Mod[n, 11] == 0, m5 = m5 + 1, If[Mod[n, 13] == 0, m6 = m6 + 1, If[Mod[n, 17] == 0, m7 = m7 + 1, If[Mod[n, 19] == 0, m8 = m8 + 1, If[Mod[n, 23] == 0, m9 = m9 + 1]]]]]]]]], {n, 1, k}]; {m1, m2, m3, m4, m5, m6, m7, m8, m9}]; t1 = f1[6!] // Timing {0.003438,{359,119,47,26,14,11,7,5,3}} This can be made more flexible; however, much slower. f2[k_Integer?Positive, i_Integer?Positive] := Module[{f, m}, f[x_] := Catch[Fold[ If[Mod[x, Prime[#2]] == 0, Throw[m[#2] = m[#2] + 1], #1] &, If[Mod[x, 2] == 0, Throw[m[1] = m[1] + 1]], Range[2, i]]]; Table[m[n] = -1, {n, i}]; f /@ Range[k]; Table[m[n], {n, i}]]; t2 = f2[6!, 9] // Timing {0.018913,{359,119,47,26,14,11,7,5,3}} t2[[1]]/t1[[1]] 5.50116 This can be made slightly faster f3[k_Integer?Positive, i_Integer?Positive] := Module[{f, m, r, p}, p = Transpose[{r = Range[2, i], Prime[r]}]; f[x_] := Catch[Fold[ If[Mod[x, #2[[2]]] == 0, Throw[m[#2[[1]]] = m[#2[[1]]] + 1], #1] &, If[Mod[x, 2] == 0, Throw[m[1] = m[1] + 1]], p]]; Table[m[n] = -1, {n, i}]; f /@ Range[k]; Table[m[n], {n, i}]]; t3 = f3[6!, 9] // Timing {0.01468,{359,119,47,26,14,11,7,5,3}} t3[[1]]/{t1[[1]], t2[[1]]} {4.26992,0.776186} Verifying that the results are the same: t1[[2]] == t2[[2]] == t3[[2]] True For a larger range and more primes: f3[7!, 15] {2519,839,335,191,104,79,57,49,39,31,27,21,18,17,14} Bob Hanlon ---- Artur <grafix at csl.pl> wrote: ============= Dear Mathematica Gurus, Who know how nested or folded multiple If procedure in following: {m1, m2, m3, m4, m5, m6, m7, m8, m9} = {-1, -1, -1, -1, -1, -1, -1, -1, -1}; Do[ If[Mod[n, 2] == 0, m1 = m1 + 1, If[Mod[n, 3] == 0, m2 = m2 + 1, If[Mod[n, 5] == 0, m3 = m3 + 1, If[Mod[n, 7] == 0, m4 = m4 + 1, If[Mod[n, 11] == 0, m5 = m5 + 1, If[Mod[n, 13] == 0, m6 = m6 + 1, If[Mod[n, 17] == 0, m7 = m7 + 1, If[Mod[n, 19] == 0, m8 = m8 + 1, If[Mod[n, 23] == 0, m9 = m9 + 1]]]]]]]]], {n, 1, 6!}]; Print[{m1, m2, m3, m4, m5, m6, m7, m8, m9}] I want nested 9 times If[Mod[n,Prime[k]]==0,m[k]=m[k]+1],{k,1,9}] I will be greatfull for any idea! Best wishes Artur -- Bob Hanlon