{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 素数\n",
    "\n",
    "本日の授業では、プログラミングで素数に関する検討をします。また、Pythonのif文、while文の文法を勉強します。\n",
    "\n",
    "- if文については教科書40~45ページを参照する。\n",
    "- while文については教科書53~54ページを参照する。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Python言語の流れ制御\n",
    "\n",
    "### 1.1 if文\n",
    "コードの流れを制御するために、if文やwhile文が使用されます。\n",
    "\n",
    "「ある条件が満たされる場合、指定のコードを実行する」という条件分岐によるコードの流れの制御が考えられます。\n",
    "\n",
    "例えば、与えられる数値xの絶対値を求めるとき、以下の条件分岐が利用されています。\n",
    "\n",
    "<img src='http://www.ces-alpha.org/hp/image/?conf_id=CM2020&label=IMG4&x=1' style=\"width:550px\">\n",
    "\n",
    "\n",
    "### if文の書き方\n",
    "\n",
    "<pre style=\"border:1px solid #444;padding:15px\">\n",
    "if 条件式:\n",
    "  条件式を満たす場合に実行する処理\n",
    "else:\n",
    "  条件式を満たさない場合に実行する処理\n",
    "</pre>  \n",
    "\n",
    "ただし、「else」の部分は使用しなくても良いです。\n",
    "\n",
    "以下はPythonのコードです。絶対値を求める処理を独自の関数myabsとして書きます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "def myabs(x):\n",
    "    if x > 0:\n",
    "        return x\n",
    "    else:\n",
    "        return -x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3\n",
      "3\n"
     ]
    }
   ],
   "source": [
    "# myabsの処理を確認します。\n",
    "print(myabs(3))\n",
    "print(myabs(-3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 複雑なif文\n",
    "\n",
    "多くの条件式があり条件分岐が複雑な場合には、elif（else ifという意味）を使用することができます。\n",
    "\n",
    "以下のコードでは、与えられる整数の因数を1つ探します。\n",
    "条件式では、剰余算（割り算の余り）が使用されます。Pythonでは「%」が剰余算の演算子です。\n",
    "\n",
    "例えば、15 % 3 = 0、14 % 3 = 2、13 % 3 =1。よって、15は因数3を持っています。14と13は因数3を持っていません。\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "因数3を持っています。\n"
     ]
    }
   ],
   "source": [
    "x=15\n",
    "if x % 2 == 0:\n",
    "    print(\"因数2を持っています。\")\n",
    "elif x % 3 == 0:\n",
    "    print(\"因数3を持っています。\")\n",
    "elif x % 5 == 0:\n",
    "    print(\"因数5を持っています。\")\n",
    "else:\n",
    "    print(\"5以下の素因数を持っていません。\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.2 Python言語の条件式で使用される「比較演算子」と「論理演算子」\n",
    "\n",
    "条件式はTrueまたはFalseを返します。\n",
    "\n",
    "値の比較するために、比較演算子が使用されます。例えば「3>2」はTrue、「3<2」はFalseとなります。\n",
    "\n",
    "よく使用される「>」と「<」以外に、以下の比較演算子も利用できます。\n",
    "\n",
    "|演算子|意味|使用例|\n",
    "|--|--|--|\n",
    "|==|左辺と右辺が等しいときTrueを返す| 20==20|\n",
    "|!=|左辺と右辺が等しくないときTrueを返す| 10!=20|\n",
    "|>=|左辺が右辺以上のときTrueを返す| 30>=20, 20>=20|\n",
    "|<=|左辺が右辺以下のときTrueを返す| 10<=20, 10<=10|\n",
    "\n",
    "\n",
    "### 条件式の論理演算子\n",
    "\n",
    "２つの条件式の合成もできます。\n",
    "\n",
    "|論理演算子|使用方法|意味|例|\n",
    "|--|--|--|--|\n",
    "|AND演算(aかつb)|(条件式a) and (条件式b) |２つの条件式の両方がTrueであれば、結果がTrueとなる| 3>2 and 3>1|\n",
    "|OR演算(aまたb)|(条件式a) or  (条件式b) | ２つの条件式のいずれかがTrueであれば、結果がTrueとなる| 2<3 or 2<1 |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.3 while文\n",
    "\n",
    "Python言語では、for文以外のループ処理としてwhile文が使用されます。「指定される条件式が満たされている限り、コードの実行を繰り返す」という処理です。\n",
    "\n",
    "while文の書き方\n",
    "\n",
    "<pre style=\"border:1px solid #444;padding:15px\">\n",
    "while 条件式:\n",
    "    処理コード\n",
    "</pre>  \n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 例\n",
    "\n",
    "以下のコードでは、1から順に整数を足して、足し算の和が初めて100以上になるとき終了します。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "3\n",
      "6\n",
      "10\n",
      "15\n",
      "21\n",
      "28\n",
      "36\n",
      "45\n",
      "55\n",
      "66\n",
      "78\n",
      "91\n",
      "105\n"
     ]
    }
   ],
   "source": [
    "sum = 0\n",
    "i = 0\n",
    "while sum < 100:\n",
    "    i = i+1\n",
    "    sum = sum+i\n",
    "    print(sum)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習1：リストの最大値の計算\n",
    "\n",
    "リストxの各成分から最大値を求める関数my_max(x)を作成してください。\n",
    "\n",
    "ヒント：\n",
    "\n",
    "- max_valueという変数を用意して、xの各成分と比較します。ある成分がmax_valueより大きいのであれば、max_valueの値をその成分の値に更新します。\n",
    "- max_valueの初期値はリストxの1番目の成分の値にします。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def my_max(x):\n",
    "    pass\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#テストのためのコード。my_maxが完成したら、以下のコードを実行して結果を確認してください。\n",
    "x=[2,3,10,3,32,22,11]\n",
    "my_max(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 素数の判定法\n",
    "\n",
    "自然数の中で、1より大きく正の約数が1と自分自身のみであるものが素数です。この定義によって、ある自然数nが素数であるかどうかを判定するとき、1とn以外のnの約数（因数）があるかどうかを確認すれば十分です。\n",
    "\n",
    "素数判定のアルゴリズム\n",
    "- 与えられるnについて、2からn-1までのいずれかの整数mに対してn % m == 0 の場合、mはnの因数になり、「素数でない」という判定ができます。\n",
    "- 2からn-1までの全ての整数が因数にならないとき、「素数である」という判定ができます。\n",
    "\n",
    "以下のコードでは、与えられるnが素数であるかどうかを判定しています。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def is_prime(n):\n",
    "    for m in range(2,n):\n",
    "        if n % m == 0:\n",
    "            #print(\"因数%dを持っています。\"%m)\n",
    "            return False        \n",
    "    return True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "is_prime(11)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習2\n",
    "- 2.1) 1000以下で小さい方から順に20個の素数を求めてください。\n",
    "- 2.2) 素数と素数の番号との関係図を描いてください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "#2.1)のコードのヒント\n",
    "\n",
    "prime_list = []\n",
    "num = 0\n",
    "n = 2\n",
    "while num < 20 and n <= 1000:\n",
    "    #コードをここに書いてください。\n",
    "        \n",
    "    n = n + 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prime_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f26e5e3f3c8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#2.2)のコードのヒント\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(prime_list,'.')\n",
    "plt.grid()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習3（オプション）\n",
    "\n",
    "演習2で使用する判定法はあまり効率が良くありません。\n",
    "例えば、$m$が$\\sqrt{n}$より大きくなるとき、$m$は$n$の因数になりません。よって、forループ処理では$m$を$n-1$までにする必要がないです。\n",
    "また、$m$を2から$\\sqrt{n}$までの素数にして$n$の因数判定を行っても十分です。\n",
    "\n",
    "上記のアイデアを利用して、is_prime()を改善し、効率を良くしてください。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div style=\"border:1px dotted #4444FF;padding:10px\" align=\"center\">\n",
    "計算機演習A・Bのノート「素数」　授業担当：劉雪峰　　2021年5月31日\n",
    "</div>"
   ]
  }
 ],
 "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
}
