{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2023年度計算機演習A・B\n",
    "\n",
    "# 第5回レポート課題の解説"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習1\n",
    "\n",
    "フィボナッチ数列の第1項から第20項までを要素に持つリストを作成し、そのグラフを描画してください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "N = 20  #最後の項の番号（変数Nを使うメリットとして、この値を変えるだけで実行結果が変わる）\n",
    "F_list = [1,1]  #フィボナッチ数列を格納するリスト\n",
    "\n",
    "for n in range(2,N):  #F_list[0]とF_list[1]を元に、F_list[2]～F_list[N-1]を追加する\n",
    "    F_list.append(F_list[n-2]+F_list[n-1])\n",
    "\n",
    "print(F_list)\n",
    "\n",
    "n_list = range(1,N+1)\n",
    "plt.plot(n_list,F_list,\".-\")\n",
    "\n",
    "plt.grid()\n",
    "plt.xticks(range(5,N+1,5))  #横軸の目盛りを指定できる\n",
    "plt.title(\"Fibonacci sequence\")\n",
    "plt.legend([\"$F_n$\"])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習2\n",
    "\n",
    "関数の再帰的定義によって、自然数 $n$ に対してフィボナッチ数列の第 $n$ 項を返す関数`fibonacci`を定義してください。定義した関数を呼び出す例も付けてください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "55\n"
     ]
    }
   ],
   "source": [
    "def fibonacci(n):\n",
    "    #ここに「print(n)」を入れると、関数が再帰的に呼び出される様子が分かる\n",
    "    if n == 1 or n == 2:\n",
    "        return 1\n",
    "    else:\n",
    "        return fibonacci(n-2)+fibonacci(n-1)\n",
    "\n",
    "print(fibonacci(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### （注意）\n",
    "\n",
    "関数の再帰的定義を利用するとコードを簡潔に書くことができる反面、上の`fibonacci`のように関数の一回の処理の中で自身を二回以上呼び出す場合には、引数が大きくなるほどに計算効率が悪くなります。これは、同じ引数に対する計算を何度も行うことで無駄が生じるからです。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習3\n",
    "\n",
    "フィボナッチ数列 $\\{F_n\\}$ と黄金比 $\\varphi$ の関係を示す一つの性質として、次の式が成り立つことが知られています。\n",
    "\n",
    "$$\n",
    "\\lim_{n\\to\\infty}\\frac{F_{n+1}}{F_n}=\\varphi\n",
    "$$\n",
    "\n",
    "次の式で定まる数列 $\\{Q_n\\}$ に対して第1項から第19項までを用いてグラフを描画することによって、上記の性質を確認してください。\n",
    "\n",
    "$$\n",
    "Q_n=\\frac{F_{n+1}}{F_n}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "N = 20\n",
    "F_list = [1,1]\n",
    "for n in range(2,N):\n",
    "    F_list.append(F_list[n-2]+F_list[n-1])\n",
    "#↑演習1のコード実行後であれば、ここまでは無くてもよい\n",
    "\n",
    "Q_list = []\n",
    "\n",
    "for n in range(N-1):  #Q_list[0]～Q_list[N-2]を追加する\n",
    "    Q_list.append(F_list[n+1]/F_list[n])\n",
    "\n",
    "n_list = range(1,N)\n",
    "plt.plot(n_list,Q_list,\".-\")\n",
    "\n",
    "phi = (1+5**(1/2))/2  #黄金比\n",
    "plt.plot([0,N],[phi,phi],\"-\")  #点(0,phi)と(N,phi)を結ぶ線分を描画する\n",
    "\n",
    "plt.grid()\n",
    "plt.xticks(range(5,N+1,5))\n",
    "plt.legend([\"$Q_n$\",\"phi\"])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習4（オプション）\n",
    "\n",
    "フィボナッチ数列に関する上記以外の性質をインターネット等で一つ調べ、プログラミングによってその性質を確認してください。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ゼッケンドルフの定理（Zeckendorf's theorem）\n",
    "\n",
    "> 任意の自然数は、一つ以上の連続しない相異なるフィボナッチ数列の項の和として一意に表現できる。\n",
    "\n",
    "ここでは、この定理における「表現の一意性」以外の主張についてプログラミングで確認してみる。\n",
    "\n",
    "フィボナッチ数列を $\\{F_n\\}$、任意の $m\\in\\mathbb{N}$ に対して $m$ 以下の最大のフィボナッチ数列の項の番号を $n_m$ とするとき、\n",
    "\n",
    "$$\n",
    "\\begin{gathered}\n",
    "\\mathrm{Zeckendorf}(m)=F_{n_m}+\\mathrm{Zeckendorf}\\left(m-F_{n_m}\\right)\\quad (m\\in\\mathbb{N})\\\\\n",
    "\\mathrm{Zeckendorf}(0)=0\n",
    "\\end{gathered}\n",
    "$$\n",
    "\n",
    "により定まる $\\mathrm{Zeckendorf}(m)$ が $m\\in\\mathbb{N}$ に対する上記の表現（ゼッケンドルフ表現）を与えることを利用する。\n",
    "\n",
    "（※以下のコードはかなり難しいため、無理に理解しなくて大丈夫です。）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]\n",
      "1 = F_2 = 1\n",
      "2 = F_3 = 2\n",
      "3 = F_4 = 3\n",
      "4 = F_2+F_4 = 1+3\n",
      "5 = F_5 = 5\n",
      "6 = F_2+F_5 = 1+5\n",
      "7 = F_3+F_5 = 2+5\n",
      "8 = F_6 = 8\n",
      "9 = F_2+F_6 = 1+8\n",
      "10 = F_3+F_6 = 2+8\n",
      "11 = F_4+F_6 = 3+8\n",
      "12 = F_2+F_4+F_6 = 1+3+8\n",
      "13 = F_7 = 13\n",
      "14 = F_2+F_7 = 1+13\n",
      "15 = F_3+F_7 = 2+13\n",
      "16 = F_4+F_7 = 3+13\n",
      "17 = F_2+F_4+F_7 = 1+3+13\n",
      "18 = F_5+F_7 = 5+13\n",
      "19 = F_2+F_5+F_7 = 1+5+13\n",
      "20 = F_3+F_5+F_7 = 2+5+13\n",
      "21 = F_8 = 21\n",
      "22 = F_2+F_8 = 1+21\n",
      "23 = F_3+F_8 = 2+21\n",
      "24 = F_4+F_8 = 3+21\n",
      "25 = F_2+F_4+F_8 = 1+3+21\n",
      "26 = F_5+F_8 = 5+21\n",
      "27 = F_2+F_5+F_8 = 1+5+21\n",
      "28 = F_3+F_5+F_8 = 2+5+21\n",
      "29 = F_6+F_8 = 8+21\n",
      "30 = F_2+F_6+F_8 = 1+8+21\n",
      "31 = F_3+F_6+F_8 = 2+8+21\n",
      "32 = F_4+F_6+F_8 = 3+8+21\n",
      "33 = F_2+F_4+F_6+F_8 = 1+3+8+21\n",
      "34 = F_9 = 34\n",
      "35 = F_2+F_9 = 1+34\n",
      "36 = F_3+F_9 = 2+34\n",
      "37 = F_4+F_9 = 3+34\n",
      "38 = F_2+F_4+F_9 = 1+3+34\n",
      "39 = F_5+F_9 = 5+34\n",
      "40 = F_2+F_5+F_9 = 1+5+34\n",
      "41 = F_3+F_5+F_9 = 2+5+34\n",
      "42 = F_6+F_9 = 8+34\n",
      "43 = F_2+F_6+F_9 = 1+8+34\n",
      "44 = F_3+F_6+F_9 = 2+8+34\n",
      "45 = F_4+F_6+F_9 = 3+8+34\n",
      "46 = F_2+F_4+F_6+F_9 = 1+3+8+34\n",
      "47 = F_7+F_9 = 13+34\n",
      "48 = F_2+F_7+F_9 = 1+13+34\n",
      "49 = F_3+F_7+F_9 = 2+13+34\n",
      "50 = F_4+F_7+F_9 = 3+13+34\n"
     ]
    }
   ],
   "source": [
    "N = 20\n",
    "F_list = [1,1]\n",
    "for n in range(2,N):\n",
    "    F_list.append(F_list[n-2]+F_list[n-1])  #フィボナッチ数列を求めておく\n",
    "print(F_list)\n",
    "\n",
    "def Zeckendorf(m):  #ゼッケンドルフ表現におけるフィボナッチ数列の項の番号のリストを返す関数\n",
    "    if m == 0:\n",
    "        return []  #空のリストを返す\n",
    "    else:\n",
    "        n_m = 0  #m以下の最大のフィボナッチ数列の項の番号を求める（プログラム上は番号が0から始まることに注意）\n",
    "        while F_list[n_m] <= m:\n",
    "            n_m = n_m+1\n",
    "        n_m = n_m-1\n",
    "        return Zeckendorf(m-F_list[n_m])+[n_m]  #再帰的呼び出し　+でリストを結合する\n",
    "\n",
    "for m in range(1,51):  #1～50のゼッケンドルフ表現を表示する\n",
    "    index_list = Zeckendorf(m)\n",
    "    text1 = \"\"\n",
    "    text2 = \"\"\n",
    "    for n in index_list:\n",
    "        text1 = text1+\"F_\"+str(n+1)  #+で文字列を結合する　strは文字列に変換する関数\n",
    "        text2 = text2+str(F_list[n])\n",
    "        if n != index_list[-1]:  #リストの最後の要素でなければ（番号に負の数を指定すると末尾から数えた要素になる）\n",
    "            text1 = text1+\"+\"\n",
    "            text2 = text2+\"+\"\n",
    "    text = str(m)+\" = \"+text1+\" = \"+text2  #表示する文字列をまとめる\n",
    "    print(text)"
   ]
  }
 ],
 "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.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
