はじめに
hkob の雑記録の第399回目(通算796日目)は、Notion AI で試験解説を行った件を記録しておきます。
PDF のファイルを Notion に展開
前回は昨年度の試験問題を小テストとして実施しましたが、今日は一昨年度の試験問題を小テストを行いました。小テスト自体は昨年度作ったものなので、Notion AI は使っていません。
学生が小テストを行なっている間は特にやることがないので、後半の解説のために PDF の試験問題を Notion に展開してもらいました。

確かに数式やコードブロックなども問題なく展開されています。

下の方を見ると、解答用紙の部分も頑張ってシンプルテーブルで枠を作っていました。
正答の作成
解答用紙の部分が空欄のままだったので、遊び心で正答をうめてもらいました。少し時間がかかりましたが、満点の解答を埋めてくれました。このくらいのレベルだと全く問題なく解いてくれますね。

正答だけだとつまらないので、2つのステップの中を覗いてみました。授業中も私自身が解説しましたが、このテキストも Notion の公開ページに貼り付けておきました。
ユーザーは試験問題の解答欄に正答を記入してほしいと言っています。PDFから展開した試験問題を解いて、各空欄に正しい答えを入れる必要があります。
問題を順番に解いていきましょう:
(1) コンストラクタのテスト
- f = Polynomial([-3.0, 2.0, 1.0]) # -3x2 + 2x + 1
- g = Polynomial([-1.0, 2.0]) # -x + 2
- h = Polynomial([-4.0, 3.0, -2.0, 1.0]) # -4x3 + 3x2 - 2x + 1
係数はそのまま降順で格納されるので:
- (a) -3.0, (b) 2.0, (c) 1.0
- (d) -1.0, (e) 2.0
- (f) -4.0, (g) 3.0, (h) -2.0, (i) 1.0
- (j) ValueError
(2) コンストラクタの実装
- (k) init
- (l) array
(3) 加算メソッドのテスト
- f = Polynomial([-3.0, 2.0, 1.0]) # -3x2 + 2x + 1
- g = Polynomial([-1.0, 2.0]) # -x + 2
- h = Polynomial([-4.0, 3.0, -2.0, 1.0]) # -4x3 + 3x2 - 2x + 1
- f + g の計算:(-3x2 + 2x + 1) + (-x + 2) = -3x2 + x + 3 となるため、(m) -3.0, (n) 1.0, (o) 3.0
- f + h の計算:(-3x2 + 2x + 1) + (-4x3 + 3x2 - 2x + 1) = -4x3 + 0x2 + 0x + 2 となるため、(p) -4.0, (q) 0.0, (r) 0.0, (s) 2.0
加算メソッドの実装では、両方の多項式の配列の長さを取得し、より長い方の長さを基準にして右合わせで加算する必要がある。そのため (t) と (u) で各配列の長さを得て、(v) でその最大値を求める。(w) はこの最大値を使用し、(x) と (y) はそれぞれ左側にパディングするためのオフセット値となる。
substitute メソッドのテストでは、f(0) = 1.0 となり、f(-3) の計算も進める。
f(-3) = -3(-3)2 + 2(-3) + 1 = -3(9) - 6 + 1 = -27 - 6 + 1 = -32.0 となる。f(1) = -3 + 2 + 1 = 0.0 である。別の多項式 g(x) = -x + 2 では g(0) = 2.0、g(2) = 0.0 となり、さらに h(x) = -4x3 + 3x2 - 2x + 1 では h(0) = 1.0 となる。
h(-1) = -4(-1)3 + 3(-1)2 - 2(-1) + 1 = 4 + 3 + 2 + 1 = 10.0 である。
次に substitute メソッドを実装する必要がある。多項式 f(x) = x2 + 2x + 3 は係数配列 [1, 2, 3] で表現され、配列が降順で格納されているため、べき乗も降順 [2, 1, 0] の順番で処理する必要がある。self.array と x の値を使い、配列の長さから各項のべき乗を計算していく。
derivative メソッドのテストでは、f = Polynomial([-3.0, 2.0, 1.0]) の導関数 f'(x) = -6x + 2 が正しく計算されることを確認し、g = Polynomial([-1.0, 2.0]) では g'(x) = -1 となる。さらに h = Polynomial([-4.0, 3.0, -2.0, 1.0]) のような高次多項式についても導関数が正しく求められることを検証する。
実装の観点では、配列の各係数に対応する次数を掛け合わせることが鍵となる。例えば [1, 2, 3] という係数に対して [2, 1, 0] という次数を乗算し、最後の要素を削除することで導関数の係数 [2, 2] が得られる。配列長が3の場合、np.arange(2, -1, -1) で次数の配列を生成できる。
その後、np.delete を使用して最後の要素を削除し、インデックス len(self.array) - 1 の位置から削除する。
おわりに
この程度の試験問題であれば、簡単に解答してくれますね。単に解答を出すだけでなく、どうやって AI が思考したのかを調べるのも面白いと思いました。明日からの試験頑張ってもらいたいですね。先日 Notion AI に作成してもらった試験問題も印刷して提出しました。私の試験の本番は木曜日です。