zer0-star / Nim-ACL

ACL (AtCoder Library) implementation in Nim
Creative Commons Zero v1.0 Universal
22 stars 3 forks source link

[verify] extra/math/pow_of_formal_power_series_test.nimのverifyが失敗する #52

Closed haruyama480 closed 11 months ago

haruyama480 commented 11 months ago
% ulimit -s 65000  
% oj-verify run verify/extra/math/pow_of_formal_power_series_test.nim
(略)
[INFO] slowest: 0.780420 sec  (for M_zero_00)
[FAILURE] test failed: 4 AC / 32 cases
(略)

結構失敗しちゃいます これは手強そう

chaemon commented 11 months ago

https://atcoder.jp/contests/abc317/submissions/46642639

一応、1.6.14で利用実績はあってACしているんですが、環境依存なんですかね。。。109行目です。

haruyama480 commented 11 months ago

AC実績情報ありがたいです

haruyama480 commented 11 months ago

overflowしてる..?

[INFO] monomial_02
fatal.nim(54)            sysFatal
Error: unhandled exception: over- or underflow [OverflowDefect]
chaemon commented 11 months ago

それは重要な手がかりですね!

chaemon commented 11 months ago

単純な入力でも落ちてるようです。(0の0乗的なものですかね。。。) この例以外はunderflowで落ちていますかね。

[FAILURE] WA input: 2 0 0 0

output: 0 0

expected: 1 0

chaemon commented 11 months ago

あと、こちらの環境では4個ではなく18個は通りましたよ!

[FAILURE] test failed: 18 AC / 32 cases

chaemon commented 11 months ago

Nim-ACL/src/atcoder/extra/math/formal_power_series.nim(485)でunderflowが起こっているようです。

/Users/toshihiroshimizu/git/Nim-ACL/src/verify/extra/math/pow_of_formal_power_series_test.nim(15) pow_of_formal_power_series_test /Users/toshihiroshimizu/git/Nim-ACL/src/verify/extra/math/pow_of_formal_power_series_test.nim(13) main /Users/toshihiroshimizu/git/Nim-ACL/src/atcoder/extra/math/formal_power_series.nim(485) pow /Users/toshihiroshimizu/.choosenim/toolchains/nim-1.6.14/lib/system/fatal.nim(54) sysFatal Error: unhandled exception: over- or underflow [OverflowDefect]

chaemon commented 11 months ago

あ、わかりました!485行目のif i k > deg:というところのi kでオーバーフローしているようです。

haruyama480 commented 11 months ago

ちょうど自分もそこ見てました! FPSちゃんと学習できてないので、一旦調査任せてもいいですか?

chaemon commented 11 months ago

はい。degは配列の長さ分しかとらないので常識的な大きさであれば、if i > deg or k > deg or i * k > deg:とすれば良さそうです。

chaemon commented 11 months ago

i, kが0だった場合だけ状況が変わるのでもう少し複雑ですね。

chaemon commented 11 months ago

さっきの0^0のケース以外AC出せました!

[INFO] slowest: 1.451678 sec (for M_zero_00) [INFO] max memory: 67.224000 MB (for monomial_01) [FAILURE] test failed: 31 AC / 32 cases

chaemon commented 11 months ago

0乗の場合に無条件で1にするようにしたら全部ACしました。

PRとか面倒なので、直接pushしちゃいました。すみません。。。

chaemon commented 11 months ago

変更点はこちらです。degが配列の長さでこれが32bitに収まらないサイズでないといけないのですが、配列の長さが32bitより大きくなるのは競プロでは考えられないので、これで大丈夫そうです。

https://github.com/zer0-star/Nim-ACL/commit/80bbcdea1738f47955707cd24547d584607b8dfb

haruyama480 commented 11 months ago

ありがとうございます!

degは配列の長さ分しかとらないので常識的な大きさであれば、if i > deg or k > deg or i * k > deg:とすれば良さそう

まさにこれですね

これでfloatの件以外はverifyできましたね:tada: closeよろしくお願いします

chaemon commented 11 months ago

Closeしました。if i > deg or k > deg or i k > deg:だとi=0でk > degの場合で意図した結果と違う結果になるので、pという変数にikの値を保存する(オーバーフローに注意する)としました。

chaemon commented 11 months ago

上記の利用実績ではべき乗するkの値が小さくてi*kでオーバーフローしないのでちゃんと動作していたんですかねー