『ベクトル単純積』という提案〜あるいはベクトルの割り算〜

まず最初にお詫びさせていただきたい。
この記事を書いているのは数学の素人だ。
間違いや既出である点などあれば、ご指摘いただけると幸いである。

私は、積年の望みを叶えて、コツコツとゲームを作っていた。
その時、私は
「ベクトルも割り算ができればいいのに」
と思った。

例えば、プレイヤーが右を向いていることを、ベクトルで(1,0)と表すとする。
この時、相対位置(4,0)にいる敵と、(5,0)にいる敵とで、(4,0)にいる敵にだけ攻撃を当てたいのだ。
ベクトルを考えると、(4,0)は(1,0)の4倍、(5,0)は(1,0)の5倍のベクトルなので、割り算をした答えが小さい方だけにダメージを与えればいい。

ここではたと、
「ベクトルに割り算ってあっただろうか?」
と疑問に思った。

ベクトルには2種類の積が定義されている。
内積と外積だ。
では、商は?

『ベクトル 割り算』
で検索すると、みんな大好きなこのサイトで明快な解説があった。

いわく、『ベクトルには割り算が定義されていません』と。

理由の解説にも納得がいくけれど、どこか悔しい。
『ベクトルの積』というのは非常に重要な計算のはずなのに、その逆演算がなくていいのか。
ベクトルは乗群にならなくていいのか。
『ベクトル全体の集合』は体にならなくていいのか。

そこで、私はベクトルの新しい(あるいは古い)積の演算を提案したい。

名前を『ベクトル単純積』という。
(いま考えた)(既出の概念かもしれないが、もしそうなら何故もっと重要なものとして取り上げられないのだろう?)

『ベクトル単純積』というのは以下のような演算だ。

・2つのベクトルから、1つのベクトルを求める計算
・ベクトルを(a,b),(c,d)とした時、ベクトル単純積は
(a,b)かける(c,d)=(ac,bd)

以上だ。つまり、(x成分の積,y成分の積)というベクトルを求める計算だ。
何も知らない人が『ベクトルの掛け算』と言われた時に、一番に思いつく計算では無いだろうか。
(“かける”は仮の演算子だ。ドットもクロスも既に使われてしまっているから。何かいいのがないだろうか?)

さて、このベクトル単純積は、以下の性質を満たす。
・結合法則 (AかけるB)かけるC=Aかける(BかけるC)
・単位元の存在 (1,1)が単位元で、Aかける(1,1)=A
・逆元の存在 (a,b)の逆元は(1/a,1/b)

以上より、ベクトル全体の集合と『ベクトル単純積』は群になる。
(成分に0を含むベクトルを除く)

また、ベクトル単純積は既存の演算、つまり内積とも矛盾しない。
以下のように定義しよう。

『内積は、単純積ベクトルのマンハッタン長さである』

(単純積ベクトルは、ベクトル単純積の演算で得られたベクトルのこと)

マンハッタン長さという言葉を急に使ってしまったが、これはベクトルを矢印と考えた時の、根本から先端までのマンハッタン距離のことだ。
マンハッタン距離というのは、おそらくこの記事をお読みの方の方が詳しいと思うけれど、簡単にいうなら直角にしか曲がれない人が2点間を移動する際の道のりのことだ。
ベクトルでいうなら、x成分とy成分を足したものになる。
ただし、普通のマンハッタン距離では座標の差の|絶対値|を取るけれど、今回は絶対値は取らず、符号を残す。
ベクトル(-1,-1)のマンハッタン長さは-2とする。
『符号付きマンハッタン長さ』
といったような、独自の概念かもしれない。

単純積ベクトルは(ac,bd)なので、このマンハッタン長さは、ac+bdになる。
これはすなわち、お馴染みの内積の定義だ。
なので、ベクトル単純積は内積を算出するのにも使える。
また、ここで以下のことがわかる
・直交するベクトルの単純積ベクトルは(n,-n)
(内積ac+bd=0より、ac=-bd=n)

さて、ベクトル単純積にどんなメリットがあるかというと、
『ベクトル単純積は割り算ができる』
ということだ。

先ほど、ベクトル単純積の演算に逆元があることを示した。
ここで、『逆元をかける』ということを、実数の場合と同じように『割る』と定義すればいい。
つまり
(a,b)かける(1/a,1/b)=(1,1)

(a,b)÷(a,b)=(1,1)
と書くことができるのだ。

実際に、簡単な具体例を計算してみよう。
2つのベクトル(1,2),(2,1)を考える。
(1,2)かける(2,1)=(2,2)だ
(ちなみに内積は4)

さて、(2,1)を移項して割ってみよう
(2,2)÷(2,1)=(1,2)
あえて積の形で書くなら、
(2,2)かける(1/2,1)=(1,2)

以上のように、確かに逆演算を行なって、(1,2)というベクトルを求めることができた。

もう一つ、直交する例はどうだろうか。
(1,2)と直交するベクトルとして、(-2,1)を考える。
(1,2)かける(-2,1)=(-2,2)
(内積は0)

(-2,1)を移項して
(-2,2)÷(-2,1)=(1,2)
と、直交するベクトルの単純積からでも、元のベクトルを求めることができた。

さて、ベクトル単純積をベクトルで割ることで、元のベクトルを得られることがわかったけれど、正直なところあまりピンと来てはいないのではないだろうか。なにせ、ベクトル単純積という概念は私がいま持ち出したものだから。
では、内積から元のベクトルを求めることはできるだろうか?

ここまでの議論で、『内積には逆演算が存在しない』ということが分かる。
内積は『積』と呼び習わされているけれど、実は積の計算ではなく、積と和を組み合わせた計算なのだ。(いや、見ればわかるか?)

『積と和を組み合わせた計算』なら、実は単なる実数でも逆演算に解がない。

簡単な例を示すと、
『12は2に何かをかけた数字です』
という計算には
12÷2=6
という逆演算が存在するが、
『13は2に何かをかけて、何かを足した数字です』
という計算には逆演算が存在しない。
2x+y=13
という計算になって、答えは無数に存在する。

内積も同様だ。
例えば先ほどの(1,2),(2,1)について、
(1,2)・(2,1)=4
を考えると、この内積の意味は、
『単純積ベクトルのマンハッタン長さが4』
という意味になる。
数式で表すと以下の式を満たすベクトルだ。
x+y=4
これもやはり変数が足りなくて、解を決定することができないのだ。

内積を逆演算するには、変数が足りないということが分かった。
では、何が分かっていれば内積に逆演算を行うことができるだろうか?

それは、単純積ベクトルの2成分のうちの1つだ。

引き続き、内積4、ベクトル(1,2)について考えよう。
ここで、単純積ベクトルのx成分を2とする。
すると以下のような計算ができる。
【4】2=(2,2)

……申し訳ない。訳の分からない演算子をアドリブで使った。説明させて欲しい。
【n】x は2つのスカラーから1つのベクトルを作る演算で、nのマンハッタン長さを持ち、x成分がxのベクトルを求める。
【n】x=(x,n-x)
ということだ。
先ほどは【4】2=(2,4-2)=(2,2)ということになる。

さて単純積ベクトル(2,2)が手に入ったので、これを(1,2)で割ると
(2,2)÷(1,2)=(2,1)

……内積の4から元々のベクトル(2,1)を求めることができた!!

もう一つ、直交する場合も考えよう。
(1,2)・(-2,1)=0
0から元々のベクトルを求めることができるだろうか?
単純積ベクトルのx成分を-2としよう。
【0】-2=(-2,2)
得られた(-2,2)を(1,2)で割る
(-2,2)÷(1,2)=(-2,1)
……できた!!!

内積と、単純積ベクトルの1成分が分かれば、ベクトルの割り算で元々のベクトルを演算できるのだ!!

ただし、普通の掛け算と同じ法則に従っているので、ゼロの掛け算を逆算することはできない。
例えば
(1,0)・(0,1)=0
これは、ベクトルの割り算を使っても逆算することはできない。

また、先ほどの2回の計算で
『単純積ベクトルのx成分を⚪︎とする』
としたけれど、内積からはその情報は得ることができない。ac+bdの足し算をした時に、その情報は失われるのだ。

議論をまとめよう。

私は『ベクトル単純積』という新しい演算を提案する。
その演算は2つのベクトル(a,b),(c,d)を
(a,b)かける(c,d)=(ac,bd)
とする演算であり、これが『ベクトルの積』である。
『内積』は積と呼ばれているが、実は積そのものではなく、『単純積ベクトルのマンハッタン長さ』という、単純積が持っているプロパティの1つなのだ。そのため、逆演算に必要な、変数1つ分の情報が失われている。
対して、ベクトル単純積は逆演算・ベクトルの割り算で元のベクトルを求めることができる。
ベクトル全体の集合とベクトル単純積は群となる。

以上。検討されたし。

……さて、ベクトルの割り算も定義できたことだし、私のゲームに実装を……
というところで、はたと気づいた。
上述の『ベクトルの割り算』をするならば、
(4,0)÷(1,0)=(4/1,0/0)

……“0/0”?

恐る恐る、iPhoneの電卓に『0÷0』と入力する。……“エラー”
Excelのセルに『=0/0』と入力する。“DIV/0!”

……どうやら当初の目的には使えないようだ。仕方がない、掛け算で代用しよう……

以上になります。長文をお読みいただきありがとうございました。間違いやご指摘、既出の事項、洗練された演算子のアイデアなどございましたら、お教えいただければ幸いです。

ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?