Sunday, January 11, 2009

n choose r

Just for fun I cooked up a little bit of PostScript to calculate nCr that uses purely stack-based storage - quite efficient.

/nCr {                                    % n r
    2 copy sub 2 copy lt {exch} if        % n r maxd mind
    1 1 5 3 roll                          % mind j=1 v=1 n maxd
    1 add -1 exch {                       % for i : n -> maxd+1 step -1
        mul                               % mind j v*i
        1 index 3 index le {              % j > mind ?
            1 index idiv exch 1 add exch  % mind j+1 v/j
        } if
    } for
    {                                     % mind j v
        1 index 3 index gt {exit} if      % j > mind ?
        1 index idiv exch 1 add exch      % mind j+1 v/j
    } loop
    exch pop exch pop                     % v
} bind def

No comments: