{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# コンピュータ物理学 Quarter 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> # class 01 自分の名前を表示するプログラム (answer01.py)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ----------------------------------- 解答一覧 -----------------------------------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **解答1 [文字列はダブルクォーテーション「\"」で囲む]**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "My name is Pythonist.\n" ] } ], "source": [ "print(\"My name is Pythonist.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **解答2 [シングルクォーテーション「'」で囲んでもよい]**" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "My name is Pythonist\n" ] } ], "source": [ "print('My name is Pythonist')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ----------------------------------- 別解答集 -----------------------------------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " - **別解1 : 変数nameに文字列を代入して表示**" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "My name is Phthonist\n" ] } ], "source": [ "name = \"My name is Phthonist\"\n", "print(name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **別解2 : formatメソッドを用いて{ }内を置換**" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "My name is Pythonist\n" ] } ], "source": [ "name = \"Pythonist\"\n", "print(\"My name is {}\".format(name))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **別解3 : string(文字列)型の要素として表示**" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "My name is Pythonist\n" ] } ], "source": [ "print('My name is %s' % 'Pythonist')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "\n", "> # class 02 木の絵を出力するプログラム (answer02.py)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ----------------------------------- 解答一覧 -----------------------------------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " - **解答1**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " * \n", " *** \n", "**X**\n", " X \n" ] } ], "source": [ "print(' * ')\n", "print(' *** ')\n", "print('**X**')\n", "print(' X ')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "> # class 03 長方形の周辺の長さ及び面積を求めるプログラム (answer03.py)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ----------------------------------- 解答一覧 -----------------------------------" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The perimeter of a rectangle [(height,width)=(3.25,5.72)] is 17.94\n", "\n", "\n", "The area of a rectangle [(height,width)=(3.25,5.72)] is 18.59\n" ] } ], "source": [ "height = 3.25 #(cm)\n", "width = 5.72 #(cm)\n", "\n", "perimeter = 2 * height + 2 * width\n", "perimeter = round(perimeter,3) # 小数点3桁で四捨五入(解答で四捨五入はなくてもよい)\n", "area = height * width\n", "\n", "params = '[(height,width)=({},{})]'.format(height,width)\n", "print(\"The perimeter of a rectangle \" + params + \" is\", perimeter)\n", "print(\"\\n\")# 改行コード\n", "print(\"The area of a rectangle \" + params + \" is\", area)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "> # class 04 配列(行列)の逆行列を乗算するプログラム (answer04.py)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ----------------------------------- 解答一覧 -----------------------------------" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A=\n", " [[ 1 -1]\n", " [ 1 1]]\n", "\n", "B=\n", " [[ 0.5 0.5]\n", " [-0.5 0.5]]\n", "\n", "C=A.B=\n", " [[1. 0.]\n", " [0. 1.]]\n" ] } ], "source": [ "A = np.matrix([[1,-1],[1,1]])\n", "B = np.matrix([[0.5, 0.5],[-0.5, 0.5]])\n", "C = A * B\n", "\n", "print(\"A=\\n\", A)\n", "print(\"\\nB=\\n\", B)\n", "print(\"\\nC=A.B=\\n\", C)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "行列の表示は行列自体をprintしても,各成分をprintしても良しとします" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ----------------------------------- 別解答集 -----------------------------------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **解答1 [numpyのarrayを用い,逆行列を数値計算で求める.(numpyの行列matrixと配列arrayで行列の積演算が違うので注意)]**\n", "\n", "問題文では手計算で逆行列を求めるよう指示されているのでこの回答は推奨されませんが,いずれ研究で数値計算を扱う場合はnumpyの用意されたモジュールを有効活用してください" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A=\n", " [[ 1 -1]\n", " [ 1 1]]\n", "\n", "B=\n", " [[ 0.5 0.5]\n", " [-0.5 0.5]]\n", "____________________\n", "\n", "C1=A.B=\n", " [[1. 0.]\n", " [0. 1.]]\n", "\n", "C2=\n", " [[1. 0.]\n", " [0. 1.]]\n", "\n", "C3=\n", " [[1. 0.]\n", " [0. 1.]]\n" ] } ], "source": [ "'''\n", "numpyのarray配列を用いてもよい\n", "逆行列はnumpy線形代数パッケージ(linalg)の関数(inv)を使った\n", "'''\n", "A = np.array([[1,-1],[1,1]])\n", "B = np.linalg.inv(A)\n", "\n", "# 行列積はnumpyのdot関数を用いる or '@'演算子を用いることで計算可能\n", "\n", "C1 = np.dot(A,B)\n", "C2 = A.dot(B)\n", "C3 = A @ B\n", "\n", "\n", "print(\"A=\\n\", A)\n", "print(\"\\nB=\\n\", B)\n", "print(\"_\"*20)\n", "print(\"\\nC1=A.B=\\n\", C1)\n", "print(\"\\nC2=\\n\", C2)\n", "print(\"\\nC3=\\n\", C3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "***\n", "> # class 05 成績判定プログラム (answer05.py)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "キーボードからテストの点数を入力すると、それに対する成績を次のようにアルファベットと対応付けし,出力する.\n", "\n", "if文を使う練習問題である.elifやelseのインデントに注意する.\n", "\n", "| 点数 | 成績 |\n", "|: ----- | ----- |\n", "| 0~60 | F |\n", "| 61~70 | D |\n", "| 71~80 | C |\n", "| 81~90 | B |\n", "| 91~100 | A |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ----------------------------------- 解答一覧 -----------------------------------" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enter your score:100\n", "Your grade is A\n" ] } ], "source": [ "score = input(\"Enter your score:\")\n", "\n", "\n", "# 以下の1文は入力された値(score)が整数値かの判定(なくても点数には関係ありません)\n", "assert score.isdecimal(), 'input value must be positive integer'\n", "\n", "score = int(score)\n", "grade = None\n", "\n", "if (0 <= score) & (score <= 60):\n", " grade = 'F' # 問題文にある通り最低成績は'F'であるのに注意\n", "elif (61 <= score) & (score <= 70):\n", " grade = 'D'\n", "elif (71 <= score) & (score <= 80):\n", " grade = 'C'\n", "elif (81 <= score) & (score <= 90):\n", " grade = 'B'\n", "elif (91 <= score) & (score <= 100):\n", " grade = 'A'\n", "else:\n", " raise Exception('The input value must be an integer between 0 and 100')\n", " # 100点以上の点数など予期せぬ値が入力された場合にも対応(else文を書いている時点で加点します)\n", "\n", "print('Your grade is {}'.format(grade))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "***\n", "> # class 06 素数判定アルゴリズム (answer06.py)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ----------------------------------- 解答一覧 -----------------------------------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **解答1 [for文を使用]**" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "prime num: 53\n", "prime num: 59\n", "prime num: 61\n", "prime num: 67\n", "prime num: 71\n", "prime num: 73\n", "prime num: 79\n", "prime num: 83\n", "prime num: 89\n", "prime num: 97\n", "prime num: 101\n", "prime num: 103\n", "prime num: 107\n", "prime num: 109\n", "prime num: 113\n", "prime num: 127\n", "prime num: 131\n", "prime num: 137\n", "prime num: 139\n", "prime num: 149\n" ] } ], "source": [ "for n in range(50, 151): # 50以上150以下の整数範囲を指定する場合はrange(50, 151)となる\n", " for m in range(1, n): # 同様に1以上n-1以下の整数範囲はrange(1,n)で指定\n", " if n % m == 0:\n", " m0 = m\n", " if m0 == 1:\n", " print('prime num: {}'.format(n))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **解答2 [while文を使用]**" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "prime num: 53\n", "prime num: 59\n", "prime num: 61\n", "prime num: 67\n", "prime num: 71\n", "prime num: 73\n", "prime num: 79\n", "prime num: 83\n", "prime num: 89\n", "prime num: 97\n", "prime num: 101\n", "prime num: 103\n", "prime num: 107\n", "prime num: 109\n", "prime num: 113\n", "prime num: 127\n", "prime num: 131\n", "prime num: 137\n", "prime num: 139\n", "prime num: 149\n" ] } ], "source": [ "n = 50\n", "while n <= 150:\n", " m = 1\n", " while m <= n-1: \n", " \n", " if n % m == 0:\n", " m0 = m\n", "\n", " m += 1 # m = m+1と同じ(mの値を1つ進める)\n", "\n", " if m0 == 1:\n", " print('prime num: {}'.format(n))\n", " n += 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ----------------------------------- 別解答集 -----------------------------------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **解答1 [フェルマーの小定理を利用]**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " **フェルマーの小定理**\n", " \n", " 任意の正の整数$a\\ (>1)$に対して$a,p$が互いに素(すなわち最大公約数が1)であるときに,$p$が素数ならば以下の式が成立する.\n", "

\n", " $$\n", " a^{p-1}\\equiv 1\\quad (\\mathrm{mod}\\ p)\n", " $$\n", "

\n", " この性質を利用して次のように素数かどうかを判定する関数を定義する.(関数定義は第7回講義で出てくる)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def is_prime(p):\n", " p = int(abs(p)) # 絶対値をとった整数値に変換\n", " if p == 2: return True\n", " return pow(2, p-1, p) == 1 # 2^{p-1}をpで割ったあまりが1になるか判定 (条件が真ならTrueを返す)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上で定義した関数は引数に「整数」を入力し,出力としてそれが素数かどうかのbool値を返す.\n", "\n", "bool値は命題が真ならばTrueを,偽ならばFalseを対応させる.試しに上の関数を使ってみる." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "is_prime(2)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "is_prime(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これを利用して$\\ 50\\leqq n \\leqq150\\ $の整数$n$を上の関数 is_prime() に食わせ,真なら出力すればよい." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "prime num: 53\n", "prime num: 59\n", "prime num: 61\n", "prime num: 67\n", "prime num: 71\n", "prime num: 73\n", "prime num: 79\n", "prime num: 83\n", "prime num: 89\n", "prime num: 97\n", "prime num: 101\n", "prime num: 103\n", "prime num: 107\n", "prime num: 109\n", "prime num: 113\n", "prime num: 127\n", "prime num: 131\n", "prime num: 137\n", "prime num: 139\n", "prime num: 149\n" ] } ], "source": [ "for n in range(50, 151):\n", " if is_prime(n):\n", " print('prime num: ', n)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pythonにはfor文を一行で簡略化表記できるlist内包表記というものがある.list内包表記は以下のような表記ルールで記述される.\n", "
\n", "\n", "## `[条件式を満たした際に実行する文 for 繰り返し変数 in range(下端, 上端+1) if 条件式]`\n", "\n", "\n", "
\n", "上記ルールを用い,素数表示プログラムを一行で簡略化すると以下のようになる." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "53\n", "59\n", "61\n", "67\n", "71\n", "73\n", "79\n", "83\n", "89\n", "97\n", "101\n", "103\n", "107\n", "109\n", "113\n", "127\n", "131\n", "137\n", "139\n", "149\n" ] } ], "source": [ "a = [print(n) for n in range(50, 151) if is_prime(n)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "> # class 07 フィボナッチ数列から黄金比の近似値を割り出すプログラム (answer07.py)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1$\\leqq n \\leqq100$の自然数$n$に対し,フィボナッチ数列$f_n$を求め,隣接2項間の比$f_{n+1}/f_n$をグラフに描く" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ----------------------------------- 解答一覧 -----------------------------------" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **解答1**" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt # <- matplotlibはグラフを描くためのモジュール,これを「plt」という名前でインポート\n", "\n", "def fibo(n):# 関数fibo(n)はスライドのものをそのまま記述すればよい\n", " if n==0:\n", " f_p = 0\n", " elif n==1:\n", " f_p = 1\n", " else:\n", " f_p_2 = 0\n", " f_p_1 = 1\n", " for p in range(2, n+1):\n", " f_p = f_p_1 + f_p_2\n", " f_p_2 = f_p_1\n", " f_p_1 = f_p\n", " return f_p\n", "\n", "x_list = range(1, 101)\n", "y_list = [] # y_listという名前の空配列を宣言\n", "\n", "for n in x_list:\n", " f_n = fibo(n)\n", " f_nn = fibo(n+1)\n", " ratio = f_nn / f_n\n", " y_list.append(ratio) #append関数でy_listに順次 値を追加していく\n", "\n", "plt.plot(x_list, y_list) # pltモジュールのplot関数を使う\n", "plt.show() #<-この行がないとグラフが表示されない" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ちなみにフィボナッチ数列を求める関数fibo()は「再帰(関数内部で自分自身の関数を呼び出す)」を使って次のようにも書ける." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "def new_fibo(n:int):\n", " if n <= 2:\n", " return 1\n", " else:\n", " return new_fibo(n - 2) + new_fibo(n - 1) #自身の2項前と1項前の和を返す" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ためしに,適当な値を代入してチェックしてみる." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_fibo(1)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_fibo(6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "フィボナッチ数列第10項までを出力すると,以下のようになる." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "term 1: 1\n", "term 2: 1\n", "term 3: 2\n", "term 4: 3\n", "term 5: 5\n", "term 6: 8\n", "term 7: 13\n", "term 8: 21\n", "term 9: 34\n", "term 10: 55\n" ] } ], "source": [ "for n in range(1, 11):\n", " print('term {}: '.format(n), new_fibo(n))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### **例:再帰を用いた階乗の計算**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ちなみに,再帰呼び出しを応用すると階乗を計算する関数も定義できる" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "def calc_factorial(n):\n", " if n<=1:\n", " return 1\n", " else:\n", " return n * calc_factorial(n-1)\n" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "120" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "calc_factorial(5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }