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)

```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

```

• Prev by Date: Re: Solve vs. NSolve
• Next by Date: Re: Nested If
• Previous by thread: Re: loops?
• Next by thread: Multiple Slaves in Parallel Computing Toolkit