tsujimotterのノートブック

日曜数学者 tsujimotter の「趣味で数学」実践ノート

FF5のレベル5デスと整数論

Final Fantasy Ⅴ(以下、FF5)というゲームをご存知でしょうか?

私が小学生ぐらいの頃に流行したロールプレイングゲームです。当時、私はFFの魅力がわからずプレイしたことすらなかったのですが、大人になってからその面白さに気づき、はまっています。

今回は、FF5にまつわるちょっぴり整数論っぽい問題についてです。

背景

さて、そのFFの5作目のFF5ですが、面白いシステムが導入されました。それが 青魔法 です。青魔法を使う青魔導士は、敵が使ってくる魔法を受けると、「ラーニング」といって、その魔法を習得し、次回以降の戦闘で使用することができるのです。もちろん、敵の扱う魔法すべてをラーニングできるわけではないのですが、バラエティ豊かな魔法を手にいれることができ、青魔法を収集することもゲームの楽しみの一つでした。

参考:
FF5 青魔法の効果と習得方法

その中でも、特に面白いなと思ったのは レベルに関する青魔法 です。FF5では、敵味方どちらもレベルという正の整数値が設定されています。このレベルに応じて効いたり効かなかったりする青魔法があるのです。

その代表例が レベル5デス という魔法です。なにやら怖い名前の魔法ですね。

FFシリーズには「デス」という魔法があって、これは名前の通り相手を即死させる魔法です。ただし、確率によって(あるいは相手の耐性よって)効いたり効かなかったりします。

一方、レベル5デスは「レベルが5の倍数の相手を即死させる」という魔法です。しかも、レベルが5の倍数であるという条件を満たせば、デスに耐性があろうと問答無用で即死です。たとえ相手がボスであっても!!!

これを利用してボス敵を倒す裏技が知られていて、レベルが5の倍数であるいくつかのボスは一撃で倒してしまうことができます。*1

参考:
レベル5デスが有効なモンスター|ファイナルファンタジー5/FF5 完全攻略(GBA/iOS/Android版対応)

小学生が敵のレベルを調べ(「ライブラ」という魔法を使って調べることができる)、そのレベルが5の倍数であるかどうか判定するという状況すごくないですか?


しかしながら、レベル5デスも万能ではありません。いくつかのボスキャラを除いて、ほとんどのボスはレベルが5の倍数ではないからです。ところが「黒の衝撃」「レベル2オールド」という青魔法を援用することで、レベルが5の倍数ではないボスもなんと攻略できてしまうのです。

黒の衝撃は、レベルを半減させる青魔法です。これだと、レベルが5の倍数かどうかは変わらないように思えるのですが、そうではありません。レベルが偶数のときは単に半分になるだけですが、奇数のときは半分にしたあと小数部分が切り捨てられます。つまり

 kuro(n) := \lfloor n/2 \rfloor

ということです。ゲームとかでありがちな計算ですね。

黒の衝撃によってたとえば、レベル11の相手でも  kuro(11) = 5 とすることができ、レベルが5の倍数になります。ここでレベル5デスが使えるようになります。なお、レベル1の相手に使ってもレベル0にすることはできません。レベルは1のままです。

レベル2オールドは、レベルが2の倍数の相手に「老化」という状態異常にさせる青魔法です。「老化」とは、戦闘中に 一定時間経過すると 10フレーム経過毎に、レベルが1ずつ下がるという状態異常です。これも同様に、レベル8の相手に対してレベル2オールドを適用し

 8 \xrightarrow{\text{10フレーム経過}} 7 \xrightarrow{\text{10フレーム経過}} 6\xrightarrow{\text{10フレーム経過}} 5

とすることで、レベルを5の倍数にすることができて、レベル5デスが使えるようになります。なお、老化状態かつレベル1の敵は、一定時間経過してもレベルは変化しません。レベルは1より下がりません。


「黒の衝撃」「レベル2オールド」を組み合わせることで、「レベル5デス」の適用範囲が大きく広がります。

例として、レベル33の場合を考えましょう。33は5の倍数ではないので、そのままでは「レベル5デス」は使えません。奇数なので「レベル2オールド」も使えません。「黒の衝撃」を使うと、レベルが半減して  \lfloor 33/2 \rfloor = 16 となります。ここで  16 は偶数なので「レベル2オールド」が使えます。老化によってレベルが1下がり  16 - 1 = 15。ここで5の倍数になったので「レベル5デス」が使えます。「黒の衝撃」「老化によるレベル低下」「レベル5デス」を計3ステップ適用することによって倒すことができました。

当然、相手のレベルによっては、簡単には5の倍数にもっていけない場合もあります。レベルが59の場合を考えると

  1. 黒の衝撃: 59 \mapsto 29
  2. 黒の衝撃: 29 \mapsto 14
  3. レベル2オールドをかけて老化状態になり10フレーム経過: 14 \mapsto 13
  4. 黒の衝撃: 13 \mapsto 6
  5. 老化状態で10フレーム経過: 6 \mapsto 5
  6. レベル5デス: 5 \mapsto 即死

というように、6ステップもかかってしまいました。


ここで私が気になったことは「今回のような作戦をとったときに、一番面倒な(ステップ数のかかる)レベルは何でしょう?」という問題です。こうやって考えてみると、整数論っぽくてなかなか面白そうだなと思えてきます。

補足:なお、今回は便宜上「10フレーム経過」と「1つの青魔法発動」を同じ「1ステップ」としてカウントするという特殊な設定で議論しています。実際上は、これらの時間は異なるため、今回の前提で得られた結果が最適な行動になるとは限りません。今回の記事の趣旨は、FF5の実際上の攻略を目指すものではなく、あくまで数学を使った一種の「遊び」であることをご理解ください。

また、FF5には「サムソンパワー」「ドラゴンパワー」という調合アイテムがあり、これにより対象のレベルを上げることができます。これを使って、レベルを255までカンストさせてからレベル5デスを使うという裏技もあるそうです。しかしながら、今回の記事では扱いません。

問題設定

上記の問題は少し曖昧なので、数学的に定式化しましょう。小難しい式が出てきますが、わからない場合は読みとばしてもかまいません。

 \mathbb{Z}_{\geq 0} を非負整数の集合、 \mathbb{B} = \{ T, F \} を真理値の集合とします。

まず、敵の状態としてレベル  n \in \mathbb{Z}_{\geq 0} と老化状態  o \in \mathbb{B} があります。レベルと老化状態の組  s = (n, o) \in \mathbb{Z}_{\geq 0} \times \mathbb{B} を敵の状態と定義します。

単にレベルだけを状態にしたかったのですが、レベル2オールドという魔法があるのでやや複雑になっています。また、レベル  n = 0 は即死状態と考えます。

黒の衝撃は次の関数  K : \mathbb{Z}_{\geq 0} \times \mathbb{B} \longrightarrow \mathbb{Z}_{\geq 0} \times \mathbb{B} によって定義します。

 K( (n, o) ) = \begin{cases} (\lfloor n/2 \rfloor, o) & n \neq 0 \; \land \; n \neq 1 \\ 
(n, o) & n = 0 \; \lor \; n = 1 \end{cases}

老化状態に変化なく、 n を小数以下を切り捨てて半減させるという関数になっています。 n = 0 n = 1 のときは変化なしです。

次にレベル2オールドですが、これは次の  O : \mathbb{Z}_{\geq 0} \times \mathbb{B} \longrightarrow \mathbb{Z}_{\geq 0} \times \mathbb{B} という関数によって定義します。

 O( (n, o) ) = \begin{cases} (n-1, T) & n \neq 0  \; \land \; n \equiv 0 \pmod{2}  \\
(n-1, o) & o = T \; \land \; n \neq 1  \; \land  \; n \equiv 1 \pmod{2} \\
(n, o) & o = F \; \land \; n \neq 1  \; \land  \; n \equiv 1 \pmod{2} \\ 
(n, o) & n = 0 \; \lor \; n = 1 \end{cases}

ややこしい定義ですね。

一番上は、レベルが偶数のときは老化によりレベルが1低下することを表します。老化状態  o は、レベル2オールドがかかることにより  o = T に変化します。2番目はレベルが奇数のときの条件ですが、 o = T になっています。したがって、レベルが1低下します。3番目はレベルが奇数かつ老化ではないという条件なので、状態は変化しません。 n = 0 n = 1 のときは変化なしです。

最後にレベル5デスは、次の関数  D : \mathbb{Z}_{\geq 0} \times \mathbb{B} \longrightarrow \mathbb{Z}_{\geq 0} \times \mathbb{B} によって定義されます。

 D( (n, o) ) = \begin{cases} (0, o) & n \equiv 0 \pmod{5}  \\
(n, o) &  \mbox{otherwise} \end{cases}

これは簡単ですね。レベル  n が5の倍数であれば  n = 0 に変化し、そうでなければ変化なしです。


以上で問題を定式化する準備ができました。

レベル  n \in \mathbb{Z}_{>0}、老化状態  o = F の組  (n, F) からスタートします。このとき、 K, O, D のいずれかを  f_i とするような有限個の関数の列  \{ f_i \}_{i=1}^{k} をとって、その合成

 f_k \circ \cdots \circ f_2 \circ f_1

を考えます。これを  (n, F) に適用したときの関数値  (f_k \circ \cdots \circ f_2 \circ f_1)( (n, F) ) (0, T) または  (0, F) となるとき、 nレベル5デス可能ということにします。

また、合成関数の値  (f_k \circ \cdots \circ f_2 \circ f_1)( (n, F) ) (0, T) または  (0, F) になるような関数列  \{ f_i \}_{i=1}^{k} が存在しないときレベル5デス不可能ということにします。

レベル5デス可能なとき、関数列  \{ f_i \}_{i=1}^{k} を取り替えて  (f_k \circ \cdots \circ f_2 \circ f_1)( (n, F) ) = (0, F) \; \mbox{or} \; (0, T) となるような最小の  k を、 nステップ数  S(n) と定義します。レベル5デス不可能なとき、 S(n) = \infty とします。

 S(n) の定義をあえて数式で書くならこうでしょうか。
 \begin{align} S(n) := \min ( \{ k \in \mathbb{Z}_{>0} \; \mid \; & \exists(f_1, f_2, \ldots, f_k) \in \{K, O, D \}^k \; \\ 
& \mbox{s.t.}\;  (f_k \circ \cdots \circ f_2 \circ f_1)( (n, F) ) = (0, F) \; \mbox{or} \; (0, T) \} \cup \{\infty\} ) \end{align}

このとき

ステップ数  S(n) が最大となるような  n はいくつか?
また、 S(n) = \infty なる  n は存在するか?(そのような  n はどんな特徴を持つ数か?)

というのが今回考えたい問題です。

老化のせいでやや定式化が複雑になりましたが、言っていることはそれほど難しいものではないかと思います。

実験

それでは、上記の問題を調べていきましょう。

数学的に考えたかったところなのですが、とっかかりが見つからなかったので、プログラムで調べてみようと思います。

以下の表がレベル  n = 1 から  99 までのステップ数  S(n) と、そのステップ数に対応する関数列の適用例です。

# n, S(n), functions
 1, ∞
 2, ∞,  2-K> 1
 3, ∞,  3-K> 1
 4, ∞,  4-K> 2,  2-K> 1
 5, 1,  5-D> 0
 6, 2,  6-O> 5,  5-D> 0
 7, ∞,  7-K> 3,  3-K> 1
 8, 4,  8-O> 7,  7-O> 6,  6-O> 5,  5-D> 0
 9, ∞,  9-K> 4,  4-K> 2,  2-K> 1
10, 1, 10-D> 0
11, 2, 11-K> 5,  5-D> 0
12, 3, 12-K> 6,  6-O> 5,  5-D> 0
13, 3, 13-K> 6,  6-O> 5,  5-D> 0
14, 4, 14-O>13, 13-K> 6,  6-O> 5,  5-D> 0
15, 1, 15-D> 0
16, 2, 16-O>15, 15-D> 0
17, 5, 17-K> 8,  8-O> 7,  7-O> 6,  6-O> 5,  5-D> 0
18, 4, 18-O>17, 17-O>16, 16-O>15, 15-D> 0
19, ∞, 19-K> 9,  9-K> 4,  4-K> 2,  2-K> 1
20, 1, 20-D> 0
21, 2, 21-K>10, 10-D> 0
22, 3, 22-K>11, 11-K> 5,  5-D> 0
23, 3, 23-K>11, 11-K> 5,  5-D> 0
24, 4, 24-K>12, 12-K> 6,  6-O> 5,  5-D> 0
25, 1, 25-D> 0
26, 2, 26-O>25, 25-D> 0
27, 4, 27-K>13, 13-K> 6,  6-O> 5,  5-D> 0
28, 4, 28-O>27, 27-O>26, 26-O>25, 25-D> 0
29, 5, 29-K>14, 14-O>13, 13-K> 6,  6-O> 5,  5-D> 0
30, 1, 30-D> 0
31, 2, 31-K>15, 15-D> 0
32, 3, 32-K>16, 16-O>15, 15-D> 0
33, 3, 33-K>16, 16-O>15, 15-D> 0
34, 4, 34-O>33, 33-K>16, 16-O>15, 15-D> 0
35, 1, 35-D> 0
36, 2, 36-O>35, 35-D> 0
37, 5, 37-K>18, 18-O>17, 17-O>16, 16-O>15, 15-D> 0
38, 4, 38-O>37, 37-O>36, 36-O>35, 35-D> 0
39, ∞, 39-K>19, 19-K> 9,  9-K> 4,  4-K> 2,  2-K> 1
40, 1, 40-D> 0
41, 2, 41-K>20, 20-D> 0
42, 3, 42-K>21, 21-K>10, 10-D> 0
43, 3, 43-K>21, 21-K>10, 10-D> 0
44, 4, 44-K>22, 22-K>11, 11-K> 5,  5-D> 0
45, 1, 45-D> 0
46, 2, 46-O>45, 45-D> 0
47, 4, 47-K>23, 23-K>11, 11-K> 5,  5-D> 0
48, 4, 48-O>47, 47-O>46, 46-O>45, 45-D> 0
49, 5, 49-K>24, 24-K>12, 12-K> 6,  6-O> 5,  5-D> 0
50, 1, 50-D> 0
51, 2, 51-K>25, 25-D> 0
52, 3, 52-K>26, 26-O>25, 25-D> 0
53, 3, 53-K>26, 26-O>25, 25-D> 0
54, 4, 54-O>53, 53-K>26, 26-O>25, 25-D> 0
55, 1, 55-D> 0
56, 2, 56-O>55, 55-D> 0
57, 5, 57-K>28, 28-O>27, 27-O>26, 26-O>25, 25-D> 0
58, 4, 58-O>57, 57-O>56, 56-O>55, 55-D> 0
59, 6, 59-K>29, 29-K>14, 14-O>13, 13-K> 6,  6-O> 5,  5-D> 0
60, 1, 60-D> 0
61, 2, 61-K>30, 30-D> 0
62, 3, 62-K>31, 31-K>15, 15-D> 0
63, 3, 63-K>31, 31-K>15, 15-D> 0
64, 4, 64-K>32, 32-K>16, 16-O>15, 15-D> 0
65, 1, 65-D> 0
66, 2, 66-O>65, 65-D> 0
67, 4, 67-K>33, 33-K>16, 16-O>15, 15-D> 0
68, 4, 68-O>67, 67-O>66, 66-O>65, 65-D> 0
69, 5, 69-K>34, 34-O>33, 33-K>16, 16-O>15, 15-D> 0
70, 1, 70-D> 0
71, 2, 71-K>35, 35-D> 0
72, 3, 72-K>36, 36-O>35, 35-D> 0
73, 3, 73-K>36, 36-O>35, 35-D> 0
74, 4, 74-O>73, 73-K>36, 36-O>35, 35-D> 0
75, 1, 75-D> 0
76, 2, 76-O>75, 75-D> 0
77, 5, 77-K>38, 38-O>37, 37-O>36, 36-O>35, 35-D> 0
78, 4, 78-O>77, 77-O>76, 76-O>75, 75-D> 0
79, ∞, 79-K>39, 39-K>19, 19-K> 9,  9-K> 4,  4-K> 2,  2-K> 1
80, 1, 80-D> 0
81, 2, 81-K>40, 40-D> 0
82, 3, 82-K>41, 41-K>20, 20-D> 0
83, 3, 83-K>41, 41-K>20, 20-D> 0
84, 4, 84-K>42, 42-K>21, 21-K>10, 10-D> 0
85, 1, 85-D> 0
86, 2, 86-O>85, 85-D> 0
87, 4, 87-K>43, 43-K>21, 21-K>10, 10-D> 0
88, 4, 88-O>87, 87-O>86, 86-O>85, 85-D> 0
89, 5, 89-K>44, 44-K>22, 22-K>11, 11-K> 5,  5-D> 0
90, 1, 90-D> 0
91, 2, 91-K>45, 45-D> 0
92, 3, 92-K>46, 46-O>45, 45-D> 0
93, 3, 93-K>46, 46-O>45, 45-D> 0
94, 4, 94-O>93, 93-K>46, 46-O>45, 45-D> 0
95, 1, 95-D> 0
96, 2, 96-O>95, 95-D> 0
97, 5, 97-K>48, 48-O>47, 47-O>46, 46-O>45, 45-D> 0
98, 4, 98-O>97, 97-O>96, 96-O>95, 95-D> 0
99, 6, 99-K>49, 49-K>24, 24-K>12, 12-K> 6,  6-O> 5,  5-D> 0

たとえば  n = 29 のときは

29, 5, 29-K>14, 14-O>13, 13-K> 6,  6-O> 5,  5-D> 0

という結果ですが、ステップ数が  S(29) = 5 であることがわかります。また、その各ステップは

  1. 黒の衝撃: 29 \mapsto 14
  2. レベル2オールドをかけて老化状態になり10フレーム経過: 14 \mapsto 13
  3. 黒の衝撃: 13 \mapsto 6
  4. 老化状態で10フレーム経過: 6 \mapsto 5
  5. レベル5デス: 5 \mapsto 即死

であることがわかります。


 S(n) をグラフに表したものが次の図です。

f:id:tsujimotter:20190321165241p:plain:w400

特徴的なのは、いくつかの点で  S(n) = \infty となっていることです。

また、 n\equiv 0 \pmod{5} のところで  S(n) = 1 となるのは明らかですが、 n\equiv 4 \pmod{5} のところが  S(n) の値が大きくなるようです。この結果は、 n\equiv 4 \pmod{5} から老化によって  n\equiv 0 \pmod{5} に持っていくためには、少なくとも4ステップがかかることからも納得できます。

 S(n) = \infty となる条件

上の表を見てみると、 n = 1, 2, 3, 4, 7, 9, 19, 39, 79 のときに、 S(n) = \infty となっています。これらの  n に何か特徴はあるでしょうか。

まず、 n = 1, 2, 3, 4 n \equiv 0 \pmod{5} に持っていくことができないのは明らかです。そのため、 n \{K, O, D\} を適用して  1, 2, 3, 4 に持っていくことができれば に到達する経路の他に、5の倍数に到達せず同じ数でループする経路しかなければ、 S(n) = \infty となるわけです。

 n = 7 はレベル2オールド  O で変化しないので、黒の衝撃  K を使えます。

 K( (7, F) ) = (3, F)
 O( (7, F) ) = (7, F)
 D( (7, F) ) = (7, F)

により  S(7) = \infty であるとわかります。

興味深いのは、 n = 9, 19, 39, 79 の系列です。レベル  n = 79 は奇数なので使えるのは  K だけですが、 K( (79, F) ) = (39, F) となります。同様に  K を繰り返し適用させ

 (79, F) \; \mapsto \; (39, F) \; \mapsto \; (19, F) \; \mapsto \; (9, F) \; \mapsto \; (4, F)

とすると、 n = 9, 19, 39, 79 をすべて通過して  4 に到達します。


上記の実験ではレベル  99 までに限定して考えていますが、レベル  100 以上を考えたときに、同様に  K(n) = \infty なものは作れるでしょうか。

先ほどの  n = 9, 19, 39, 79

 a_{k+1} = 2 a_k + 1, \;\; a_1 = 4

という漸化式で定義される数列になっています。 a_{k+1} が奇数であれば、逆に黒の衝撃によって  \lfloor a_{k+1} / 2 \rfloor = a_k と戻すことができます。漸化式は  a_{k+1} が奇数であることを保証します。したがって、 a_{k+1} が5の倍数にならない限り、 S(a_{k}) = \infty なる列を続けることができます。

そこで  a_k \pmod{5} を考えましょう。

 a_1 = 4
 a_2 = 9 \equiv 4 \pmod{5}
 a_3 = 19 \equiv 4 \pmod{5}
 a_4 = 39 \equiv 4 \pmod{5}

これは「おっ」と思いますね。この先もずっと  4 が続きます。これは簡単に証明できて、 a_k \equiv 4 \pmod{5} のとき

 a_{k+1} = 2a_k + 1 \equiv 2\cdot 4 + 1 \equiv 4 \pmod{5}

となるからです。

したがって、 n = 4 から  f(n) = 2n+1 を繰り返し適用して生成される数列

 4, \; f(4) = 9, \; f^2(4) = 19, \; f^3(4) = 39, \; f^4(4) = 79, \; f^5(4) = 159, \; \ldots

のレベルの敵は、レベル5デス不可能ということがわかりました。この数列は先ほどの証明により、なんと無限に続きます!!


ちなみに、今は  n = 4 からスタートしましたが、他の数からスタートした場合はどうでしょうか。 n = 1 の場合は

 1 \mapsto 3 \mapsto 7 \mapsto 15

となり  15 が5の倍数となりストップします。 n = 3 もこの系列に含まれます。

 n = 2 のときは

 2 \mapsto 5

となり、これ以上先に進みません。

したがって、レベル5デス不可能な系列は以上ですべて であることがわかりました。

まとめ

今回は、FF5に登場する青魔法「レベル5デス」によって倒せる敵キャラのレベルについて考察しました。

「黒の衝撃」「レベル2オールド」を組み合わせると、たいていのレベルの敵を倒すことができます。また

 1, 2, 3, 4, 7, 9, 19, 39, 79, 159, \ldots

という無限に続く系列は、すべて今回の作戦によっては倒すことができないことも示すことができました。さらにいうと、このようなレベルはこれですべてです。

Final Fantasyシリーズは、レベルが倍数かどうかで効果が変わったりするような独特なシステムが搭載されていますが、これが整数論的に考察できるというのは面白いなと思いました。

それでは今日はこの辺で。

続きあります!

tsujimotter.hatenablog.com

*1:たとえば、ラストダンジョンに登場する「ツインタニア」というボスは、通常通り戦うとなかなか手強いボスですが、レベル5デスが使えます。通常時はレベルが5の倍数ではないのですが、一時的にパワーを貯める瞬間があり、その際にレベルが30(つまり5の倍数)になります。このときレベル5デスを使えば一撃で葬ることができます。