{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<!-- dom:TITLE: Арифметические операции -->\n",
    "# Арифметические операции\n",
    "<!-- dom:AUTHOR: С.В. Лемешевский Email:sergey.lemeshevsky@gmail.com at Институт математики НАН Беларуси -->\n",
    "<!-- Author: -->  \n",
    "**С.В. Лемешевский** (email: `sergey.lemeshevsky@gmail.com`), Институт математики НАН Беларуси\n",
    "\n",
    "\n",
    "Язык Python , благодаря наличию огромного количества библиотек для решения\n",
    "разного рода вычислительных задач, является конкурентом таким пакетам как Matlab и\n",
    "Octave. Запущенный в интерактивном режиме, он, фактически, превращается в\n",
    "мощный калькулятор. В этой главе речь пойдет об арифметических операциях,\n",
    "доступных в данном языке.\n",
    "\n",
    "Как было сказано в предыдущей главе, посвященной типам и модели данных\n",
    "Python, в этом языке существует три встроенных числовых типа данных:\n",
    "* целые числа (`int`);\n",
    "\n",
    "* вещественные числа (`float`);\n",
    "\n",
    "* комплексные числа (`complex`).\n",
    "\n",
    "Если в качестве операндов некоторого арифметического выражения используются\n",
    "только целые числа, то результат тоже будет целое число. Исключением является\n",
    "операция деления, результатом которой является вещественное число.\n",
    "При совместном использовании целочисленных и вещественных переменных, результат\n",
    "будет вещественным.\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "<!-- Common Mako variable and functions -->\n",
    "<!-- -*- coding: utf-8 -*- -->\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "# Арифметические операции с целыми и вещественными числами\n",
    "<div id=\"arithmetic:numbers\"></div>\n",
    "\n",
    "Все эксперименты будем проводить в Python, запущенном в интерактивном\n",
    "режиме.\n",
    "\n",
    "\n",
    "**Сложение.** Складывать можно непосредственно сами числа ..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "3 + 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "либо переменные, но они должны предварительно быть проинициализированы."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = 3\n",
    "b = 2\n",
    "a + b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Результат операции сложения можно присвоить другой переменной..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = 3\n",
    "b = 2\n",
    "c = a + b\n",
    "print (c)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "либо ей же самой, в таком случае можно использовать полную или сокращенную\n",
    "запись, полная выглядит так:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = 3\n",
    "b = 2\n",
    "a = a + b\n",
    "print (a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "сокращенная так:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = 3\n",
    "b = 2\n",
    "a += b\n",
    "print (a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Все перечисленные выше варианты использования операции сложения могут быть\n",
    "применены для всех нижеследующих операций.\n",
    "\n",
    "**Вычитание.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "4 - 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = 5\n",
    "b = 7\n",
    "a - b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Деление.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "9 / 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = 7\n",
    "b = 4\n",
    "a / b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Получение целой части от деления.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "9 // 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = 7\n",
    "b = 4\n",
    "a // b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Получение дробной части от деления.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "9 % 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = 7\n",
    "b = 4\n",
    "a % b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Возведение в степень.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "5**4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "a = 4\n",
    "b = 3\n",
    "a ** b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<!-- Local Variables: -->\n",
    "<!-- doconce-chapter-nickname: \"arithmetic\" -->\n",
    "<!-- doconce-section-nickname: \"numbers\" -->\n",
    "<!-- End: -->\n",
    "# Работа с комплексными числами\n",
    "<div id=\"arithmetic:complex\"></div>\n",
    "\n",
    "Для создания комплексного числа можно использовать функцию `complex(a, b)`, в\n",
    "которую, в качестве первого аргумента, передается действительная часть, в качестве\n",
    "второго – мнимая. Либо записать число в виде `a + bj`.\n",
    "\n",
    "Рассмотрим несколько примеров.\n",
    "\n",
    "Создание комплексного числа."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "z = 1 + 2j\n",
    "print(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x = complex ( 3 , 2 )\n",
    "print (x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Комплексные числа можно складывать, вычитать, умножать, делить и возводить в\n",
    "степень."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x + z"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x - z"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x * z"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x / z"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x ** z"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x ** 3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "У комплексного числа можно извлечь действительную и мнимую части."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x = 3 + 2j\n",
    "x.real"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x.imag"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Для получения комплексносопряженного число необходимо использовать метод\n",
    "`conjugate()`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x.conjugate()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<!-- Local Variables: -->\n",
    "<!-- doconce-chapter-nickname: \"arithmetic\" -->\n",
    "<!-- doconce-section-nickname: \"complex\" -->\n",
    "<!-- End: -->\n",
    "# Битовые операции\n",
    "<div id=\"arithmetic:bit\"></div>\n",
    "\n",
    "В Python доступны битовые операции, их можно производить над целыми числами.\n",
    "\n",
    "**Побитовое И (AND).**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "p = 9\n",
    "q = 3\n",
    "p & q"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Побитовое ИЛИ (OR).**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "p | q"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Побитовое Исключающее ИЛИ (XOR).**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "p^q"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Инверсия.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "~p"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Сдвиг вправо и влево.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "p<<1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<!-- Local Variables: -->\n",
    "<!-- doconce-chapter-nickname: \"arithmetic\" -->\n",
    "<!-- doconce-section-nickname: \"bit\" -->\n",
    "<!-- End: -->\n",
    "# Представление чисел в других системах счисления\n",
    "<div id=\"arithmetic:other\"></div>\n",
    "\n",
    "В своей повседневной жизни мы используем десятичную систему исчисления, но\n",
    "при программирования, очень часто, приходится работать с шестнадцатеричной,\n",
    "двоичной и восьмеричной.\n",
    "\n",
    "**Представление числа в шестнадцатеричной системе.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "m = 124504\n",
    "hex(m)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Представление числа в восьмеричной системе.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "oct(m)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Представление числа в двоичной системе.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "bin(m)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<!-- Local Variables: -->\n",
    "<!-- doconce-chapter-nickname: \"arithmetic\" -->\n",
    "<!-- doconce-section-nickname: \"other\" -->\n",
    "<!-- End: -->\n",
    "# Библиотека (модуль) `math`\n",
    "<div id=\"arithmetic:math\"></div>\n",
    "\n",
    "В стандартную поставку Python входит библиотека math , в которой содержится\n",
    "большое количество часто используемых математических функций.\n",
    "\n",
    "Для работы с данным модулем его предварительно нужно импортировать."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import math"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Рассмотрим наиболее часто используемые функции.\n",
    "\n",
    "**Функция `math.ceil(x)`.**\n",
    "\n",
    "Возвращает ближайшее целое число большее, чем `x`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "math.ceil( 3.2 )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Функция `math.fabs(x)`.**\n",
    "\n",
    "Возвращает абсолютное значение числа."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "math.fabs(-7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Функция `math.factorial(x)`.**\n",
    "\n",
    "Вычисляет факториал `x`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "math.factorial(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "** Функция `math.floor(x)`.**\n",
    "\n",
    "Возвращает ближайшее целое число меньшее, чем `x`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "math.floor( 3.2 )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Функция `math.exp(x)`.**\n",
    "Вычисляет `e**x`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "math.exp( 3 )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Функция `math.log2(x)`.**\n",
    "Логарифм по основанию `2`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "math.log2(8)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Функция `math.log10(x)`.**\n",
    "\n",
    "Логарифм по основанию 10."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "math.log10( 1000 )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Функция `math.log(x[, base])`.**\n",
    "\n",
    "По умолчанию вычисляет логарифм по основанию `e`, дополнительно можно указать\n",
    "основание логарифма."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "math.log(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "math.log()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Функция `math.pow(x, y)`.**\n",
    "\n",
    "Вычисляет значение `x` в степени `y`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "math.pow(3 , 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Функция `math.sqrt(x)`.**\n",
    "\n",
    "Корень квадратный от `x`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "math.sqrt(25)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Тригонометрические функции, их мы оставим без примера.**\n",
    "\n",
    "* `math.cos(x)`\n",
    "\n",
    "* `math.sin(x)`\n",
    "\n",
    "* `math.tan(x)`\n",
    "\n",
    "* `math.acos(x)`\n",
    "\n",
    "* `math.asin(x)`\n",
    "\n",
    "* `math.atan(x)`\n",
    "\n",
    "И напоследок пару констант.\n",
    "* `math.pi` — число $\\pi$.\n",
    "\n",
    "* `math.e` — число $e$.\n",
    "\n",
    "Помимо перечисленных, модуль `math` содержит ещё много различных\n",
    "функций, за более подробной информацией можете обратиться eна\n",
    "официальный сайт (<https://docs.python.org/3/library/math.html>).\n",
    "\n",
    "\n",
    "<!-- Local Variables: -->\n",
    "<!-- doconce-chapter-nickname: \"arithmetic\" -->\n",
    "<!-- doconce-section-nickname: \"math\" -->\n",
    "<!-- End: -->\n",
    "\n",
    "\n",
    "<!-- Local Variables: -->\n",
    "<!-- doconce-chapter-nickname: \"arithmetic\" -->\n",
    "<!-- End: -->"
   ]
  }
 ],
 "metadata": {},
 "nbformat": 4,
 "nbformat_minor": 2
}
