* Bug 7589 fixed: nchoosek() introduced
[scilab.git] / scilab / modules / elementary_functions / tests / unit_tests / nchoosek.tst
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 //
3 // Copyright (C) 2010 - DIGITEO - Michael Baudin
4 // Copyright (C) 2019 - Samuel GOUGEON - Le Mans Université
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12 // ===========================================================================
13 // <-- CLI SHELL MODE -->
14 // <-- NO CHECK REF -->
15 // <-- ENGLISH IMPOSED -->
16 //
17 // <-- Description -->
18 // -------------------------
19 // Unit tests for nchoosek()
20 // -------------------------
21
22 assert_checkequal( nchoosek( 4 , 1 ) , 4 );
23 assert_checkequal( nchoosek( 5 , 0 ) , 1 );
24 assert_checkequal( nchoosek( 5 , 1 ) , 5 );
25 assert_checkequal( nchoosek( 5 , 2 ) , 10 );
26 assert_checkequal( nchoosek( 5 , 3 ) , 10 );
27 assert_checkequal( nchoosek( 5 , 4 ) , 5 );
28 assert_checkequal( nchoosek( 5 , 5 ) , 1 );
29 assert_checkalmostequal ( nchoosek( 10000 , 134 ) , 2.050083865033972676e307 , 1.e-13 );
30 assert_checkequal( nchoosek(10,0:10) , [1,10,45,120,210,252,210,120,45,10,1] );
31 assert_checkequal( nchoosek(1:6,0:5) , 1:6 );
32
33 // Special cases
34 // -------------
35 // C(n,1) = n
36 assert_checkalmostequal( nchoosek(1e20, 1), 1e20, 1e-15 );
37 assert_checkalmostequal( nchoosek(1e200, 1), 1e200, 1e-13 );
38 // C(n,n) = 1
39 assert_checkalmostequal( nchoosek(1e20, 1e20), 1, %eps);
40 assert_checkalmostequal( nchoosek(1e200, 1e200), 1, %eps);
41 // C(n,n-1) = n : limit case
42 assert_checkalmostequal( nchoosek(1/%eps, 1/%eps-1), 1/%eps, 20*%eps);
43 // For any k < n*%eps, numerically C(n,k) = n^k/k!
44 assert_checkalmostequal( nchoosek(1e20, 2), 1e40/2, 1e-13 );
45 assert_checkalmostequal( nchoosek(1e100, 2),1e200/2, 1e-13 );
46 assert_checkalmostequal( nchoosek(1e20, 3), 1e60/6, 1e-13 );
47 assert_checkalmostequal( nchoosek(1e50, 3), 1e150/6, 1e-13 );
48
49 // Log argout / Huge values
50 // ------------------------
51 // Refs from  W o l f r a m  alpha
52 [logb, b] = nchoosek(1029, 514);
53 ref = [1.42982068649890408D+308, 308.1552815761035049036];
54 assert_checkalmostequal(b, ref(1), 1e-13);
55 assert_checkalmostequal(logb, ref(2), 0);
56 logb = nchoosek(1029, 514, "10.mant");
57 assert_checkalmostequal(logb, 308.1429820686498904, 1e-15);
58 [logb, b] = nchoosek(1030, 515);
59 assert_checkalmostequal(b, %inf);
60 assert_checkalmostequal(logb, 308.45631157176751324655, 1e-15);
61 logb = nchoosek(1030, 515, "10.mant");
62 assert_checkalmostequal(logb, 308.28596413729978081637, 1e-15);
63
64 // 1e14, 1e4 : 33.51338111119899206051 × 10^104340
65 logb = nchoosek(1e14, 1e4, "10.mant");
66 assert_checkalmostequal(logb, 104340.35133826920627, 1e-6);
67 // 1e13, 100 : 1.071510287595069331e1142
68 logb = nchoosek(1e13, 100, "log10");
69 assert_checkalmostequal(logb, 1142.0299963450692358, 1e-5);
70 logb = nchoosek(1e12, 100, "log10");
71 assert_checkalmostequal(logb, 1042.0299963431344539, 1e-6);
72 // 1e11, 100  : 1.071510235085708956115 × 10^942
73 logb = nchoosek(1e11, 100, "10.mant");
74 assert_checkalmostequal(logb, 942.10715102350857089, 1e-8);
75 // 1e11, 1000 : 2.485155729882870340071 × 10^8432
76 logb = nchoosek(1e11, 1000, "10.mant");
77 assert_checkalmostequal(logb, 8432.24851557298828703, 1e-8);
78 // 1e11, 10000 : 3.51162679090294954661 × 10^74340
79 logb = nchoosek(1e11, 10000, "10.mant");
80 assert_checkalmostequal(logb, 74340.3511626790902950, 1e-8);
81 // 1e11, 1e5 : 3.3681041688073051733304 × 10^643426
82 logb = nchoosek(1e11, 1e5, "10.mant");
83 assert_checkalmostequal(logb, 643426.336810416880730, 1e-9);
84 // 1e11, 1e6 : 8.1533447321246152778592 × 10^5434288
85 logb = nchoosek(1e11, 1e6, "10.mant");
86 assert_checkalmostequal(logb, 5434288.8153344732124, 1e-10);
87
88 // Check error cases
89 // -----------------
90 msg = "nchoosek: Wrong number of input arguments: 2 or 3 expected."
91 assert_checkerror("nchoosek()", msg);
92 assert_checkerror("nchoosek([])", msg );
93 assert_checkerror("nchoosek(4)", msg );
94 assert_checkerror("[logb, b]=nchoosek()", msg);
95 assert_checkerror("[logb, b]=nchoosek(4)", msg );
96
97 msg = "nchoosek: Arguments #1 and #2: Incompatible sizes.";
98 assert_checkerror("nchoosek(10:12, 2:6)", msg );
99
100 msg = "nchoosek: Argument #1: Decimal integer expected.";
101 assert_checkerror("nchoosek( [4.5 1.5], [2 1])", msg);
102 assert_checkerror("nchoosek( [4.5 1.5], [2 -1])", msg);
103 msg = "nchoosek: Argument #2: Decimal integer expected.";
104 assert_checkerror("nchoosek( [4  3], [2.5 1])", msg );
105 assert_checkerror("nchoosek( [4  3], ""log10"")", msg );
106
107 msg = "nchoosek: Argument #1: Non-negative integers expected.";
108 assert_checkerror("nchoosek( [-4 3], [2  1])", msg);
109 assert_checkerror("nchoosek( [-4 3], [2 -1])", msg);
110 msg = "nchoosek: Argument #2: Non-negative integers expected.";
111 assert_checkerror("nchoosek( [4 3], [2 -1])", msg);
112
113 assert_checkerror("nchoosek( 17 , 18 )", "nchoosek: n(1) < k(1) is forbidden." );