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