ベズーの等式もどき

言葉の誤用

ここ何回かの日記で出てきている「ベズーの等式」という言葉は、数学の詳しい人によると、用法が間違っていたみたい。本来のベズーの等式は右辺の値が、最大公約数でないといけない。クリ率実験で出てくるタイプの等式には特に名前が付いていないらしい。この日記では、とりあえず「ベズーの等式もどき」とでも呼んでおく。

解法

解法については、本当のベズーの等式でもベズーの等式もどきでも、ほとんど変わらない。プログラムで書いてみるとこんな感じ。

def gcdr(a,b,s,t,u,v)  
  return [a,s,t] if b==0
  q=a/b
  gcdr(b,a-q*b,u,v,s-q*u,t-q*v)
end

def gcd(a,b)
  gcdr(a,b,1,0,0,1)
end

# Find x, y such that a*x+b*y=c
def bezout(a,b,c)
  (d,n,m)=gcd(a,b)
  return nil unless c%d == 0
  k=c/d
  (x,y)=[k*n,k*m]
  (dx,dy) = [b/d, a/d]
  m=x/dx
  [x-m*dx, y+m*dy]
end

与ダメの端数

与ダメの端数

この日記の過去記事に書いた与ダメの計算式を使うと、敵を叩いた時の与ダメを計算することが出来る。その場合、計算上は与ダメに端数が出てくる。けれど、実際に叩いてみて表示される与ダメは端数を切り捨てた値になっている。

二つの可能性

となると、ここで二つの可能性が出てくる。

  • 与ダメは、内部的には端数込みの値で扱われている。
  • 与ダメは、内部的にも切り捨てられた整数値で扱われている。

この違いは、狩りをする上では誤差の範囲で、どうでもいいこと。けれど実は、ベズーの方法でクリ率を計算しようという場合には、すごく重要になってくる。ベズーの方法は整数という性質に強く依存しているため、与ダメが端数込みで計算されていた場合には全く使えなくなってしまう。

Tさんの書き込み

3月21日のTさんのコメは、そのことを指摘する鋭い質問で、本来であれば「与ダメが整数である事」をきちんと確かめた上でベズーの方法を使うという話の流れでなければいけなかった。

実は、個人的には既に与ダメが整数であることはチェックしていたのだけれど、そのことを日記には書いていなかった。今回あらためてその検証記事を書いてみる。

検証

きちんと検証するには、まず敵の防御力を調べて…、という感じになるだろうけれど、今回はもっと簡単な方法で検証してみる。

叩く相手は、カーラ危険のサテュ。クリ率を低くし、クリが全くでない状態にする。
訓練用の武器を付け、チェインスキルを外す。こうすると、非クリダメの83しかでない状態なる。これでサテュを10回叩いてみると、ダメージメータは830となった。確かに端数が現れないことが分かる。

ただ、ここでやめてしまうと、もしかしたら今回たまたま本当に与ダメが83.0だったという可能性が残る。そこで、最終ダメ10%を付けてみる。すると与ダメは92になった。
この状態で10回叩いてみると、ダメージメータは920となった。

最終ダメ増10%で、ダメが1.1倍になるはずなので、 与ダメ83と与ダメ92の両方とも端数を含んでいないということはあり得ない。なので結局、与ダメは切り捨てた値がカウントだという事が確認できたことになる。

クリ実験6

昨日の日記に書いた手法を使って、クリ率の実験をしてみる。

カーラ危険のサテュ

実験相手はカーラ危険のサテュ。この実験の目的はクリ耐性を調べる事ではなく、よく聞く定説

(実際のクリ率) = (自分のクリ率) - (敵のクリ耐性)

が正しいかどうかを確かめること。なので、敵は何でもよい。そこで、今人気の湖畔ではなく、他の人の邪魔にならないように寂れた狩場を選んだ。ホント人っ子一人居なかった、さみしいね。

それと、こっちだと狩場までの移動が楽という利点もある。極みで一発で移動できる。

実験とその結果

訓練用の武器を付け、チェインスキルを外した98プリでカーラ危険のサテュを叩く。
プリのクリ率は、132.1%, 142.1%, 152.1%, 162.1%と変化させる。

ある程度叩いて、ダメージメータの総ダメを記録する。これを各クリ率ごとに6セットやってみる。

結果はこんな感じになった。

■ 132.1%

クリ率: 132.1%
一打のダメ: クリダメ 315, 非クリダメ 122
総ダメ(6セット分): 34356, 34904, 33939, 34764, 35221, 32843

■ 142.1%

クリ率: 142.1%
一打のダメ: クリダメ 315, 非クリダメ 122
総ダメ(6セット分): 31264, 35319, 31122, 32291, 33520, 33125

■ 152.1%

クリ率: 152.1%
一打のダメ: クリダメ 347, 非クリダメ 135
総ダメ(6セット分): 43209, 42225, 43247, 42765, 45291, 40913

■ 162.1%

クリ率: 162.1%
一打のダメ: クリダメ 375, 非クリダメ 146
総ダメ(6セット分): 52870, 52913, 53623, 50351, 50162, 52747

ベズーの等式

この結果からベズーの方法で、クリと非クリの回数を計算してみる。

結果はこんな感じ。分子がクリの回数、分母がクリと非クリを合わせた回数。
カッコ内が統計上のクリ率。

■ 132.1%

各セットごとのデータ:
44/212 (20.8%), 50/207 (24.2%), 45/207 (21.7%),
36/228 (15.8%), 39/227 (17.2%), 33/217 (15.2%)

合計: 247/1298 (19.0%)

■ 142.1%

各セットごとのデータ:
52/174 (29.9%), 61/193 (31.6%), 50/176 (28.4%),
51/184 (27.7%), 58/183 (31.7%), 49/194 (25.3%)

合計: 321/1104 (29.1%)

■ 152.1%

各セットごとのデータ:
72/207 (34.8%), 75/195 (38.5%), 76/201 (37.8%),
75/199 (37.7%), 78/213 (36.6%), 79/179 (44.1%)

合計: 455/1194 (38.1%)

■ 162.1%

各セットごとのデータ:
104/199 (52.3%), 101/204 (49.5%), 99/212 (46.7%),
93/199 (46.7%), 96/193 (49.7%), 99/206 (48.1%)

合計: 592/1213 (48.8%)

詳しい分析は、また後日。

ベズーの等式

昨日の話が割と込み入っていたので、もう一度話を整理してみる。

ベズーの等式

a,b,c という正の整数が3つ与えられたときに、未知の0以上の整数変数 x, yに関する

a*x+b*y=c

という方程式を考える。これは「ベズーの等式」と呼ばれ、 aとbの最小公倍数よりもcの方が小さければ、
この等式を満たす(x,y)は一組しか存在しない。また、その(x,y)は「ユークリッドの互除法」と呼ばれる
方法で求めることができる。

ここまでが、純粋に数学の話。

応用

そしてこれを、ロードスのクリ実験に活かしたい。チェインを外し、訓練用の武器でグロしない敵を叩いた場合、クリと非クリでそれぞれ一通りのダメ値しか出ない。それを、a, bとする。そして、適当な回数だけたたいてダメージメータの値を読み取る。その値をcとする。その後、ベズーの等式 a*x+b*y=cを考えて、
(x,y)を求めると、クリの回数がx、非クリの回数がyと分かる、という仕組み。
叩く回数を自分で数える必要がないところが大きなポイント。

メリット

素朴に考えれば、クリ率の実験をするには例えば「100回叩いてクリが何回出るか」というような実験をすればいいじゃないかという話になる。

確かにこれは、考え方は分かりやすい。けれど、実際に実験するのは面倒。なにしろ1,2,3,4, …と数えなければいけない。しかも、数え間違いがあれば、実験データを捨てなければいけない。まぁ100回ならともかく、1000回とかなるとね。

一方、ベズーの方法は、原理を理解するのは結構ムズイ。特に自分のような文系人間には最初は意味がさっぱり分からなかった。けれど、一度原理を理解し、その原理を応用して実験する段階になると、逆に実験そのものはすごく簡単。何故なら、ただ通常放置して適当なタイミングでダメージメータの値を読み取るだけでよいから。数える必要がなくなることで負担が大幅に減る。

ということで、この利点を活かして、今後クリ率の実験をしていくつもり。

レイドのお知らせ

今日から18時の81レイドがスタートしたみたい。いままで0時のに行っていて眠かったので、18時に行けるのはとても助かる。

クリ率実験の方法について考えてみる

かかし相手のクリ率実験は終わったので、今度は本当の敵相手にクリ率の実験をしてみる。単純に敵のクリ耐性が引き算されるだけだと思うけれど、念のためこれを確かめてみたい。

今度の実験では、精度をもっと高くしたいと思っているのだけれど、その為には叩く回数を増やすしかない。ただ、今までの実験方法のままだと手間がかかって、回数を増やすのは大変。というのも、かかしの実験では60回ずつ叩いた。そして、それを毎回数えていた。しかも、数え間違いがあると、せっかくの実験結果を捨てなければいけなくなる。もっと手間を省けないか、特に回数を数えなくてもよいようにできないか、と考えてみる。

手間を減らす

一つ着目すべき点は、何か所かの敵はスタミナ回復能力を持っているというところ。
ある程度、スタミナ回復力のある敵だと、一人で叩いている限り全くグロさせることができない。これは、狩りの時は嫌だけれど、クリ実験をするには逆に好都合。というのも、訓練用の武器を使えば、クリ時と非クリ時の2通りのダメ値しかなくなるから。この性質をうまく利用することで、実験の手間を減らすことができる。それはこんな感じ:

新しい実験法

はじめに、クリダメと非クリダメを確認しておく。例えば、317と128とする。
そして、特に回数を数えずに適当に叩いて総与ダメを確認する。例えば、26950とする。

このとき、クリの回数をx、非クリの回数をyとすると

318*x + 128 * y= 26950

という関係式が成り立つ。この方程式は未知変数が2個あるので一見解けないように見える。けれど、今xとyは0以上の整数であるという条件があるので、これは「ベズーの等式」と呼ばれていて、解き方が確立されている。

ベズーの等式 - Wikipedia

この解放を使うと、xとyが求められてx=62, y=57と分かる。62+57=119なので、119回中62回がクリだったと分かる。 いままでの実験手法との大きな違いは、119回という回数は数えたのではなく、計算から求まったという点。数える手間がないので、実験がずっと楽。要するに、ただ通常放置して、暫くしたらダメージメータの値を読み取ればよい。

実験

実は、上で例として挙げた 318, 128, 26950という値は、カーラ危険のサテュ相手に実際に試してみた結果。
98プリでクリ率を167.9%として実験した。折角なので、もう何回かやってみた。その結果がこちら。

31900, 36423, 33747, 14551

これは、何回か叩いたのちにダメージメータの値を記録したもの。何回叩いたか数えてはいない。けれどもベズーの計算法を使うと

31900 → クリ 76回、非クリ61回
36423 → クリ 83回、非クリ79回
33747 → クリ 79回、非クリ68回
14551 → クリ 35回、非クリ27回

と分かってしまう。今日はアイディアだけ。もう少し詳しい話はまた後日。

クリ率実験5

今日はクリ率実験を71%と81%でやってみた。割と慣れてきたので、さくさくできるようになってきた。これで、前回、前々回と合わせて 51%, 61%, 71%, 81%で、それぞれ1200回ずつ叩いたことになる。今日は結果のみで分析は後日。

実験結果

71%

19800
19460
18440
18780
18270

19460
18270
19120
19460
18440

18610
19290
18950
19460
19120

19290
18780
18950
18610
18610

81%

20480
19290
19630
19120
19460

19630
20650
20820
19290
19460

19460
18440
19630
20480
20310

19970
19630
20310
19290
19970

クリ率実験4

昨日に引き続きクリ率実験をした。昨日は20セットやったつもりが、19セットしか
していなかったので、同じ条件でもう1セットやった。その結果がこれ。

17590

51%での実験

それと、今日はクリ率を10%下げて、51%での実験もした。結果はこんな感じ。

16910
17420
17590
16230
16400

18100
17080
17080
16910
17250

17080
17760
16570
15720
16060

17080
17080
18270
17420
17080

分析は後日