Re: NestWhile

*To*: mathgroup at smc.vnet.net*Subject*: [mg23060] Re: [mg23039] NestWhile*From*: Andrzej Kozlowski <andrzej at tuins.ac.jp>*Date*: Sat, 15 Apr 2000 03:00:21 -0400 (EDT)*Sender*: owner-wri-mathgroup at wolfram.com

on 4/13/00 3:43 PM, Alan W.Hopper at awhopper at hermes.net.au wrote: > Others like myself who are still using Mathematica 3, may have been > interested to see that the new cryptic @@@ function can be programmed > into a user function for version 3, as explained by Hartmut Wolf and > Daniel Reeves. > > But I have a query to pose about another new version 4 function , > that is NestWhile, which I assume can also be approximated in version > 3.0. > > > This code was taken from Eric Weisstein's IntegerSequences.m package, > obtained from the mathworld.wolfram site ; > > KeithNumberQ[n_Integer?Positive]:=(KeithSequence[n][[-1]] == n) > > KeithSequence[n_Integer?Positive]:= Module[{d = IntegerDigits[n], l}, > l = Length[d]; > NestWhile[Append[#, Plus @@ Take[#,-l]] &, d, #[[-1]] < n &] > ] > > > The first Keith Number is 197 and it's Keith Sequence should be > {1, 9, 7, 17, 33, 57, 107, 197}, or similar. > > as starting with the digits of 197 , > 1 + 9 + 7 = 17 > 9 + 7 + 17 = 33 > 7 + 17 + 33 = 57 > 17 + 33 + 57 = 107 > 33 + 57 + 107 = 197 > > Other small Keith Numbers are 742, 1104, 1537, 2208, > a large one is 97295849958669 . > (see Don Piele - Mathematica Pearls - Mathematica in Research and > Education - Vol 6 No 3 , p 50, also Vol 7 No 1, p 45. > > > So the question is how can a Mathematica 3 version of NestWhile be > substituted into the above code? > > > > Alan Hopper > > awhopper at hermes.net.au > > Actually, NestWhile has a lot of forms than is needed for KeithNumbers: In[1]:= ?NestWhile NestWhile[f, expr, test] starts with expr, then repeatedly applies f until applying test to the result no longer yields True. NestWhile[f, expr, test, m] supplies the most recent m results as arguments for test at each step. NestWhile[f, expr, test, All] supplies all results so far as arguments for test at each step. NestWhile[f, expr, test, m, max] applies f at most max times. NestWhile[f, expr, test, m, max, n] applies f an extra n times. NestWhile[f, expr, test, m, max, -n] returns the result found when f had been applied n fewer times. Here is one possible implementation of the first three forms. In[2]:= MyNestWhile[f_, expr_, test_, n_Integer?Positive] := Module[{l = NestList[f, expr, n - 1]}, FixedPoint[If[Apply[test, l], l = Append[Rest[l], f[#]]; f[#], #] &, Last[l]]] In[3]:= MyNestWhile[f_, expr_, test_] := MyNestWhile[f, expr, test, 1] In[4]:= MyNestWhile[f_, expr_, test_, All] := Module[{l = {expr}}, FixedPoint[If[Apply[test, l], l = Append[l, f[#]]; f[#], #] &, Last[l]]] We can check that this works with Keith numbers: In[5]:= KeithNumberQ[n_Integer?Positive] := (KeithSequence[n][[-1]] == n) In[6]:= KeithSequence[n_Integer?Positive] := Module[{d = IntegerDigits[n], l}, l = Length[d]; MyNestWhile[Append[#, Plus @@ Take[#, -l]] &, d, #[[-1]] < n &] ] In[7]:= KeithNumberQ[197] Out[7]= True In[8]:= KeithSequence[197] Out[8]= {1, 9, 7, 17, 33, 57, 107, 197} There are of course countless other ways of implementing this and I have not considered the question of efficiency at all. -- Andrzej Kozlowski Toyama International University JAPAN