Finite Functions
- To: mathgroup at yoda.physics.unc.edu
- Subject: Finite Functions
- From: roger at isy.liu.se (Roger Germundsson)
- Date: Thu, 26 Sep 91 10:38:28 +0200
Does anyone out there know of a good way of handling
finite functions in Mathematica?
One obvious way would be to use:
f[x1] = y1; f[x2] = y2; ...
Then you would have make f a global variable (!!!)
This approach is implemented in BuildFunction[] below.
Another obvious choice would be to use lists as follows
{{x1, y1}, {x2, y2}, ... }
and then search this list. This is implemented in
Lookup[] below. However this will run at least one
order of magnitude slower than the first approach.
What I think is really needed is something like Maples
table construct which build a list representation, but
packs a hashing function along with that (This is probably
the way Mathematica has implemented the approach
f[x1] = y1, ... ). This would enable you to send such
objects as arguments to functions and also receive those.
See below for implementation and experimental data:
// Roger Germundsson (roger at isy.liu.se)
(*
These functions assume that fun looks like:
{ { x1, f[x1] }, ... ,{ xn, f[xn] } }
*)
Lookup[ fun_List, key_ ] :=
Block[{pos},
(* Assume only one match .. since function *)
pos = Flatten[ Position[ fun, {key,_}] ];
Last[ Last[ fun[[ pos ]] ] ]
]
BuildFunction[ fun_List, fname_ ] :=
Block[{i, f},
f = fun;
Do[ (
fname[ f[[1,1]] ] = f[[1,2]];
f = Rest[f];
),
{i,Length[fun]}
];
fname
]
(* Experimental setup *)
flist = Table[ {i,Random[Integer,{0,10}]}, {i,1,100}];
TFun[k_] :=
Timing[
(
BuildFunction[flist,F];
Do[ F[ Random[ Integer, {1,100}] ], {k} ];
)
][[1]]/Second
TLook[k_] :=
Timing[
Do[ Lookup[flist, Random[Integer,{1,100}] ], {k} ];
][[1]]/Second
(* Experimental data *)
(*
In[1]:= <<FiniteFunction.m
In[2]:= tfun = Table[ TFun[l], {l,1000,10000,1000} ];
In[3]:= tlook = Table[ TLook[l], {l,1000,10000,1000} ];
In[4]:= pfun = ListPlot[ tfun, DisplayFunction -> Identity ];
In[5]:= plook = ListPlot[ tlook, DisplayFunction -> Identity ];
In[6]:= <<Terminal.m
-- Terminal graphics initialized --
In[7]:= Show[ {pfun, plook}, DisplayFunction :> $DisplayFunction ]
# #
#
70##
# #
#
## #
60 #
# #
50##
#
# #
##
40 # #
#
## #
30 #
#
## #
20 #
# #
#
## #
10 # # #
# # # # # # # # #
############################################################################
2 4 6 8 10
Out[7]= -Graphics-
In[8]:= tfun
Out[8]= {0.666667, 1.06667, 1.45, 1.98333, 2.43333, 2.81667, 3.2,
> 3.76667, 4.06667, 4.43333}
In[9]:= tlook
Out[9]= {7.7, 15.1833, 22.2833, 29.7833, 37.15, 44.55, 52.95,
> 60.4667, 67.4833, 74.9167}
*)