Re: Re: Nested If
- To: mathgroup at smc.vnet.net
- Subject: [mg92857] Re: [mg92823] Re: [mg92779] Nested If
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Wed, 15 Oct 2008 05:38:15 -0400 (EDT)
- References: <gcn4ge$7ad$1@smc.vnet.net> <200810120833.EAA08815@smc.vnet.net> <200810131018.GAA14254@smc.vnet.net> <200810140857.EAA14426@smc.vnet.net>
Daniel Lichtblau wrote: > Artur 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 >> > > len = 9; > mlist = ConstantArray[-1,len] > > Could do this procedurally with a nested loop. > > Do [Do [If [Mod[n,Prime[k]]==0, mlist[[k]]=mlist[[k]]+1;Break[]], > {k,len}], {n,6!}] > > Or use NestWhile to keep looking for a prime divisor, > > Do[NestWhile[#+1&,1,(Mod[n,Prime[#]]!=0||(mlist[[#]]=mlist[[#]]+1;False))&, > 1,len], {n,6!}] > > Me, I'd do it the first way. > > Daniel Lichtblau > Wolfram Research Somewhat faster: countFirstDivisors = Compile[{{max,_Integer},{ndivs,_Integer}}, Module[{mlist=ConstantArray[-1,ndivs],primes=Prime[Range[ndivs]]}, Do [Do [If [Mod[n,primes[[k]]]==0,mlist[[k]]++;Break[]], {k,ndivs}], {n,max}]; mlist ]] Example: In[51]:= Timing[countFirstDivisors[10!,9]] Out[51]= {2.18167, {1814399, 604799, 241919, 138239, 75402, 58003, 40941, 34478, 26982}} Much faster is to work out the right formula for these counts. Lucky me, I did that in a MathGroup thread around a decade ago. frac[k_] := Product[(Prime[j]-1)/Prime[j],{j,k-1}]/Prime[k] countFirstDivisors2[max_,ndivs_] := Table[-1+Floor[max*frac[k]], {k,ndivs}] In[55]:= Timing[countFirstDivisors2[10!,9]] // InputForm Out[55]//InputForm= {8.895661984809067*^-15, {1814399, 604799, 241919, 138239, 75402, 58001, 40942, 34477, 26982}} Daniel Lichtblau Wolfram Research
- References:
- Re: error region in parametric plot
- From: m.r@inbox.ru
- Nested If
- From: Artur <grafix@csl.pl>
- Re: Nested If
- From: Daniel Lichtblau <danl@wolfram.com>
- Re: error region in parametric plot