{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Algorytm Euklidesa\n",
    "\n",
    "Algorytm Euklidesa służy do obliczania __NWD__ (największego wspólnego dzielnika) dwóch liczb całkowitych.\n",
    "Został opisany przez greckiego matematyka, **Euklidesa** w jego dziele **„Elementy”**, około trzysetnego roku przed naszą erą, co sprawia, że jest jednym z najstarszych, wciąż używanych algorytmów numerycznych.\n",
    "\n",
    "## Algorytm\n",
    "\n",
    "Aby obliczyć NWD(a,b), wykonujemy kolejno następujące kroki:\n",
    "*  Dzielimy z resztą liczbę a przez liczbę b\n",
    "    * jeżeli reszta jest równa 0, to NWD(a,b)=b\n",
    "    * jeżeli reszta jest różna od 0, to przypisujemy liczbie a wartość liczby b, liczbie b wartość otrzymanej reszty, a następnie wykonujemy ponownie punkt 1.\n",
    "    \n",
    "### Przykład\n",
    "\n",
    "Wyznacz największy wspólny dzielnik liczb\n",
    "\n",
    "\n",
    "\n",
    "#### Program ilustrujący działanie algorytmu Eukldesa."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Podaj pierwszą liczbę całkowitą dodatnią: 55\n",
      "Podaj drugą liczbę całkowitą dodatnią: 20\n",
      "a = 55; b = 20\n",
      "a = 35; b = 20\n",
      "a = 20; b = 15\n",
      "a = 15; b = 5\n",
      "a = 10; b = 5\n",
      "a = 5; b = 5\n",
      "nNajwiększy wspólny dzielnik liczb 55 i 20 jest równy: 5\n"
     ]
    },
    {
     "ename": "SystemExit",
     "evalue": "0",
     "output_type": "error",
     "traceback": [
      "An exception has occurred, use %tb to see the full traceback.\n",
      "\u001b[1;31mSystemExit\u001b[0m\u001b[1;31m:\u001b[0m 0\n"
     ]
    }
   ],
   "source": [
    "def NWD(a, b):\n",
    "    while a != b:\n",
    "        a, b = max(a, b), min(a, b)\n",
    "        print(\"a = {a}; b = {b}\".format(a = a, b = b))\n",
    "        a = a - b\n",
    "    print(\"a = {a}; b = {b}\".format(a = a, b = b))\n",
    "    return a\n",
    "\n",
    "def main(args):\n",
    "    a = int(input(\"Podaj pierwszą liczbę całkowitą dodatnią: \"))\n",
    "    b = int(input(\"Podaj drugą liczbę całkowitą dodatnią: \"))\n",
    "    print(\"nNajwiększy wspólny dzielnik liczb {a} i {b} jest równy: {NWD}\".format(a = a, b = b, NWD = NWD(a, b)))\n",
    "    50\n",
    "    \n",
    "    \n",
    "    return 0\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    import sys\n",
    "    sys.exit(main(sys.argv))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Strony z których kożystałem\n",
    "[Obliczeniowo](https://www.obliczeniowo.com.pl/707)\n",
    "\n",
    "[Matemaks](https://www.matemaks.pl/algorytm-euklidesa.html).\n",
    "\n",
    "[Wikipedia](https://pl.wikipedia.org/wiki/Algorytm_Euklidesa).\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}