Mercurial > octave-nkf
diff scripts/elfun/lcm.m @ 4870:2cbc6f37b0c2
[project @ 2004-04-21 17:30:51 by jwe]
author | jwe |
---|---|
date | Wed, 21 Apr 2004 17:30:52 +0000 |
parents | e0b7a493e5a8 |
children | c08cb1098afc |
line wrap: on
line diff
--- a/scripts/elfun/lcm.m Wed Apr 21 17:03:02 2004 +0000 +++ b/scripts/elfun/lcm.m Wed Apr 21 17:30:52 2004 +0000 @@ -33,36 +33,62 @@ ## lcm ([a1, ..., ak]). ## @end example ## @end deftypefn +## +## All elements must be the same size or scalar. ## @seealso{gcd, min, max, ceil, and floor} ## Author: KH <Kurt.Hornik@ci.tuwien.ac.at> ## Created: 16 September 1994 ## Adapted-By: jwe -function l = lcm (a, varargin) +function l = lcm (varargin) if (nargin == 0) usage ("lcm (a, ...)"); endif - if (nargin > 1) - k = 1; - for i = 2:nargin - a = [a, varargin{k++}]; - endfor - endif + if (nargin == 1) + a = varargin{1}; + + if (round (a) != a) + error ("lcm: all arguments must be integer"); + endif - if (round (a) != a) - error ("lcm: all arguments must be integer"); - endif + if (any (a) == 0) + l = 0; + else + a = abs (a); + l = a (1); + for k = 1:(length (a) - 1) + l = l * a(k+1) / gcd (l, a(k+1)); + endfor + endif + else + + l = varargin{1}; + sz = size (l); + nel = numel (l); + + for i=2:nargin + a = varargin{i}; - if (any (a) == 0) - l = 0; - else - a = abs (a); - l = a (1); - for k = 1:(length (a) - 1) - l = l * a(k+1) / gcd (l, a(k+1)); + if (size (a) != sz) + if (nel == 1) + sz = size (a); + nel = numel (a); + elseif (numel (a) != 1) + error ("lcm: all arguments must be the same size or scalar"); + endif + endif + + if (round (a) != a) + error ("lcm: all arguments must be integer"); + endif + + idx = find (l == 0 || a == 0); + a = abs (a); + l = l .* a ./ gcd (l, a); + l(idx) = 0; endfor endif