From 169a0ee704fd58c52c2d7c8a2561f0ddd3a892b9 Mon Sep 17 00:00:00 2001 From: codistmonk Date: Thu, 29 Mar 2012 15:48:40 +0000 Subject: [PATCH] [Aprog] Updated MathTools nCk function. git-svn-id: https://aprog.svn.sourceforge.net/svnroot/aprog/trunk@187 7cbf5e2b-b55d-4b93-acdd-c0d7b961df51 --- Aprog/src/net/sourceforge/aprog/tools/MathTools.java | 14 +++++++++++--- Aprog/test/net/sourceforge/aprog/tools/MathToolsTest.java | 3 +++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Aprog/src/net/sourceforge/aprog/tools/MathTools.java b/Aprog/src/net/sourceforge/aprog/tools/MathTools.java index 94eeeff..38975a6 100644 --- a/Aprog/src/net/sourceforge/aprog/tools/MathTools.java +++ b/Aprog/src/net/sourceforge/aprog/tools/MathTools.java @@ -24,6 +24,8 @@ package net.sourceforge.aprog.tools; +import static java.lang.Math.min; + /** * @author codistmonk (creation 2011-06-11) */ @@ -118,15 +120,21 @@ public final class MathTools { * @param n *
Range: [0L .. Long.MAX_VALUE] * @param k - *
Range: [0L .. k] + *
Range: [0L .. n] * @return n!/(k!(n-k)!) *
Range: [0L .. Long.MAX_VALUE] */ public static final long nCk(final long n, final long k) { - long numerator = n - k + 1L; + final long m = min(k, n - k); + + if (m == 0) { + return 1L; + } + + long numerator = n - m + 1L; long result = numerator; - for (long i = 2L; i <= k; ++i) { + for (long i = 2L; i <= m; ++i) { result = result * (++numerator) / i; } diff --git a/Aprog/test/net/sourceforge/aprog/tools/MathToolsTest.java b/Aprog/test/net/sourceforge/aprog/tools/MathToolsTest.java index 197c500..c6c81e4 100644 --- a/Aprog/test/net/sourceforge/aprog/tools/MathToolsTest.java +++ b/Aprog/test/net/sourceforge/aprog/tools/MathToolsTest.java @@ -64,7 +64,10 @@ public final class MathToolsTest { @Test public final void testNCk() { + assertEquals(1L, MathTools.nCk(0L, 0L)); + assertEquals(1L, MathTools.nCk(4L, 0L)); assertEquals(6L, MathTools.nCk(4L, 2L)); + assertEquals(1L, MathTools.nCk(4L, 4L)); } } \ No newline at end of file -- 2.11.4.GIT