of *x* and are floats.
-.. function:: perm(n, k)
+.. function:: perm(n, k=None)
Return the number of ways to choose *k* items from *n* items
without repetition and with order.
Evaluates to ``n! / (n - k)!`` when ``k <= n`` and evaluates
to zero when ``k > n``.
+ If *k* is not specified or is None, then *k* defaults to *n*
+ and the function returns ``n!``.
+
Raises :exc:`TypeError` if either of the arguments are not integers.
Raises :exc:`ValueError` if either of the arguments are negative.
self.assertEqual(perm(n, 1), n)
self.assertEqual(perm(n, n), factorial(n))
+ # Test one argument form
+ for n in range(20):
+ self.assertEqual(perm(n), factorial(n))
+ self.assertEqual(perm(n, None), factorial(n))
+
# Raises TypeError if any argument is non-integer or argument count is
- # not 2
+ # not 1 or 2
self.assertRaises(TypeError, perm, 10, 1.0)
self.assertRaises(TypeError, perm, 10, decimal.Decimal(1.0))
self.assertRaises(TypeError, perm, 10, "1")
self.assertRaises(TypeError, perm, decimal.Decimal(10.0), 1)
self.assertRaises(TypeError, perm, "10", 1)
- self.assertRaises(TypeError, perm, 10)
+ self.assertRaises(TypeError, perm)
self.assertRaises(TypeError, perm, 10, 1, 3)
self.assertRaises(TypeError, perm)
--- /dev/null
+For math.perm(n, k), let k default to n, giving the same result as
+factorial.
--- /dev/null
+Give math.perm() a one argument form that means the same as
+math.factorial().
}
PyDoc_STRVAR(math_perm__doc__,
-"perm($module, n, k, /)\n"
+"perm($module, n, k=None, /)\n"
"--\n"
"\n"
"Number of ways to choose k items from n items without repetition and with order.\n"
"Evaluates to n! / (n - k)! when k <= n and evaluates\n"
"to zero when k > n.\n"
"\n"
+"If k is not specified or is None, then k defaults to n\n"
+"and the function returns n!.\n"
+"\n"
"Raises TypeError if either of the arguments are not integers.\n"
"Raises ValueError if either of the arguments are negative.");
{
PyObject *return_value = NULL;
PyObject *n;
- PyObject *k;
+ PyObject *k = Py_None;
- if (!_PyArg_CheckPositional("perm", nargs, 2, 2)) {
+ if (!_PyArg_CheckPositional("perm", nargs, 1, 2)) {
goto exit;
}
n = args[0];
+ if (nargs < 2) {
+ goto skip_optional;
+ }
k = args[1];
+skip_optional:
return_value = math_perm_impl(module, n, k);
exit:
exit:
return return_value;
}
-/*[clinic end generated code: output=5004266613284dcc input=a9049054013a1b77]*/
+/*[clinic end generated code: output=0eb1e76a769cdd30 input=a9049054013a1b77]*/
math.perm
n: object
- k: object
+ k: object = None
/
Number of ways to choose k items from n items without repetition and with order.
Evaluates to n! / (n - k)! when k <= n and evaluates
to zero when k > n.
+If k is not specified or is None, then k defaults to n
+and the function returns n!.
+
Raises TypeError if either of the arguments are not integers.
Raises ValueError if either of the arguments are negative.
[clinic start generated code]*/
static PyObject *
math_perm_impl(PyObject *module, PyObject *n, PyObject *k)
-/*[clinic end generated code: output=e021a25469653e23 input=b2e7729d9a1949cf]*/
+/*[clinic end generated code: output=e021a25469653e23 input=5311c5a00f359b53]*/
{
PyObject *result = NULL, *factor = NULL;
int overflow, cmp;
long long i, factors;
+ if (k == Py_None) {
+ return math_factorial(module, n);
+ }
n = PyNumber_Index(n);
if (n == NULL) {
return NULL;