diff options
| author | ananthan-123 <ananthakrishnan15.2001@gmail.com> | 2020-02-19 23:51:37 +0530 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-19 18:21:37 +0000 | 
| commit | f2ee21d858bc03dd801b97afe60ee2ea289e2fe9 (patch) | |
| tree | 7a35d8b02a53df4505d275b67bc56462cda33619 /Modules | |
| parent | 4dee92b0ad9f4e3ea2fbbbb5253340801bb92dc7 (diff) | |
| download | cpython-git-f2ee21d858bc03dd801b97afe60ee2ea289e2fe9.tar.gz | |
bpo-39479:Add math.lcm() function: Least Common Multiple (#18547)
* Update math.rst
* Update math.rst
* updated whats new
* Update test_math.py
* Update mathmodule.c
* Update mathmodule.c.h
* Update ACKS
* 📜🤖 Added by blurb_it.
* Update 3.9.rst
* Update 2020-02-18-12-37-16.bpo-39479.j3UcCq.rst
* Update math.rst
* Update 2020-02-18-12-37-16.bpo-39479.j3UcCq.rst
* Update test_math.py
* Update ACKS
* Update mathmodule.c.h
* Update mathmodule.c
* Update mathmodule.c.h
* Update mathmodule.c.h
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Diffstat (limited to 'Modules')
| -rw-r--r-- | Modules/clinic/mathmodule.c.h | 32 | ||||
| -rw-r--r-- | Modules/mathmodule.c | 54 | 
2 files changed, 85 insertions, 1 deletions
diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index f95d291d41..df45a1a0c5 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -85,6 +85,36 @@ PyDoc_STRVAR(math_factorial__doc__,  #define MATH_FACTORIAL_METHODDEF    \      {"factorial", (PyCFunction)math_factorial, METH_O, math_factorial__doc__}, +PyDoc_STRVAR(math_lcm__doc__, +"lcm($module, x, y, /)\n" +"--\n" +"\n" +"least common multiple of x and y"); + +#define MATH_LCM_METHODDEF    \ +    {"lcm", (PyCFunction)(void(*)(void))math_lcm, METH_FASTCALL, math_lcm__doc__}, + +static PyObject * +math_lcm_impl(PyObject *module, PyObject *a, PyObject *b); + +static PyObject * +math_lcm(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ +    PyObject *return_value = NULL; +    PyObject *a; +    PyObject *b; + +    if (!_PyArg_CheckPositional("lcm", nargs, 2, 2)) { +        goto exit; +    } +    a = args[0]; +    b = args[1]; +    return_value = math_lcm_impl(module, a, b); + +exit: +    return return_value; +} +  PyDoc_STRVAR(math_trunc__doc__,  "trunc($module, x, /)\n"  "--\n" @@ -895,4 +925,4 @@ math_ulp(PyObject *module, PyObject *arg)  exit:      return return_value;  } -/*[clinic end generated code: output=9b51d215dbcac060 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=f8daa185c043a7b7 input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 309f229159..f74b7e1a34 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -2018,6 +2018,59 @@ math_factorial(PyObject *module, PyObject *arg)  /*[clinic input] +math.lcm +    x as a: object +    y as b: object +    / +least common multiple of x and y +[clinic start generated code]*/ + +static PyObject * +math_lcm_impl(PyObject *module, PyObject *a, PyObject *b) +/*[clinic end generated code: output=6f83fb6d671074ba input=efb3d7b7334b7118]*/ +{ +    PyObject *g, *m, *f, *ab; + +    a = PyNumber_Index(a); +    if (a == NULL) { +        return NULL; +    } +    b = PyNumber_Index(b); +    if (b == NULL) { +        Py_DECREF(a); +        return NULL; +    } +    if (_PyLong_Sign(a) == 0 || _PyLong_Sign(b) == 0) { +        Py_DECREF(a); +        Py_DECREF(b); +        return PyLong_FromLong(0); +    } +    g = _PyLong_GCD(a, b); +    if (g == NULL) { +        Py_DECREF(a); +        Py_DECREF(b); +        return NULL; +    } +    f = PyNumber_FloorDivide(a, g); +    Py_DECREF(g); +    Py_DECREF(a); +    if (f == NULL) { +        Py_DECREF(b); +        return NULL; +    } +    m = PyNumber_Multiply(f, b); +    Py_DECREF(f); +    Py_DECREF(b); +    if (m == NULL) { +        return NULL; +    } +    ab = PyNumber_Absolute(m); +    Py_DECREF(m); +    return ab; +} + + +/*[clinic input]  math.trunc      x: object @@ -3362,6 +3415,7 @@ static PyMethodDef math_methods[] = {      MATH_ISINF_METHODDEF      MATH_ISNAN_METHODDEF      MATH_ISQRT_METHODDEF +    MATH_LCM_METHODDEF      MATH_LDEXP_METHODDEF      {"lgamma",          math_lgamma,    METH_O,         math_lgamma_doc},      MATH_LOG_METHODDEF  | 
