PyQチームのtsutomuです。
今日は、PyQのパート「数学のチャレンジ」のクエスト「ブラックボックスの処理から関数を考えよう」の内容を紹介します。
さらに、同じ処理を一次式で書けるかどうか判断する方法も紹介します。
クエストの問題
以下を満たす関数 func を作成してください。
func(0, 0) = 0 func(0, 1) = 1 func(1, 0) = 1 func(1, 1) = 0
解答と一次式についての考え方
解答は無数に考えられますが、ここでは2種の解答を紹介します。
# 解答その1 def func(x, y): return x ^ y
# 解答その2 def func(x, y): return x + y - 2 * x * y
これらの解答は、一次式以外(x ^ y
や2 * x * y
)も使っていますが、一次式だけで書ければわかりやすくなるでしょう。
さて、x
とy
の一次式だけでfunc
を作成することはできるでしょうか?
実は、func
を一次式だけで作成することはできません。理由を説明します。
下記にあるように、一次式は直線や平面になります。
「一次式は直線や平面になる」の対偶を考えると、「直線や平面上でなければ一次式にならない」です。
(x, y, func(x, y))
を3次元で考えると、平面には乗りません。これは、Matplotlibを使って次のように3次元グラフ上に実際にプロットするとイメージしやすいです。
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # プロットするデータの作成 points = [[0, 0, 0], # func(0, 0) = 0 [0, 1, 1], # func(0, 1) = 1 [1, 0, 1], # func(1, 0) = 1 [1, 1, 0]] # func(1, 1) = 0 # 3次元のグラフを作成 fig = plt.figure() ax = fig.add_subplot(111, projection="3d") ax.view_init(30, 15) # カメラの角度を調整 for x, y, z in points: ax.scatter(x, y, z) plt.show()
これらの4点は三角錐の頂点なので、平面に乗りません。そのためfunc
を(x, y)
の一次式だけでは表現できません。
まとめ
一次式で表現できるものは、直線や平面だけになります。
もっと問題を解いてみたい方へ
PyQのパート「数学のチャレンジ」では、以下のようなクイズみたいな問題を用意しています。
- クエスト「逆関数を考えよう」:指定された関数の逆関数を答える問題です。
- クエスト「ブラックボックスの処理から関数を考えよう」:関数の振るまいから関数の定義を答える問題です。
興味のある方は是非チャレンジしてみてください。