Closed riantkb closed 3 years ago
MoveSemantics
$ cat fib.py
def f(n: int) -> int: a = 0 b = 1 for _ in range(n): c = (a + b) % 1000000007 a = b b = c return a def solve(n: int) -> int: return f(n)
$ stack run convert fib.py > fib.cpp $ cat fib.cpp
$ stack run convert fib.py > fib.cpp
$ cat fib.cpp
// ... int64_t solve(int64_t n_0) { int64_t x1_4 = 1; int64_t x1_5 = 0; for (int32_t i2 = 0; i2 < int32_t(n_0); ++ i2) { int64_t x6 = jikka::mod::plus(jikka::modmat::floormod<2>(std::array<int64_t, 2>{x1_4, x1_5}, 1000000007)[1], jikka::modmat::floormod<2>(std::array<int64_t, 2>{x1_4, x1_5}, 1000000007)[0], 1000000007); x1_4 = x6; x1_5 = x1_4; } return x1_5; } // ...
下をコメントアウトした状態で生成した fib.cpp https://github.com/kmyk/Jikka/blob/cae51d2d847c340e0c81f3aa64f49e3d995b67be/src/Jikka/CPlusPlus/Convert.hs#L25
下をコメントアウトした状態で生成した fib.cpp
// ... int64_t solve(int64_t n_0) { int64_t x1_4 = 1; int64_t x1_5 = 0; for (int32_t i2 = 0; i2 < int32_t(n_0); ++ i2) { int64_t x6 = jikka::mod::plus(jikka::modmat::floormod<2>(std::array<int64_t, 2>{x1_4, x1_5}, 1000000007)[1], jikka::modmat::floormod<2>(std::array<int64_t, 2>{x1_4, x1_5}, 1000000007)[0], 1000000007); int64_t x7 = x1_4; x1_4 = x6; x1_5 = x7; } return x1_5; } // ...
153
Summary
Comment
Tests
153 に貼ったコードに関しては、N が小さいケースでは正しく動作することが確認しています。
MoveSemantics
により一時変数が消されて正しくないコードに変換されていることがわかりました。$ cat fib.py
$ stack run convert fib.py > fib.cpp
$ cat fib.cpp
下をコメントアウトした状態で生成した fib.cpp
https://github.com/kmyk/Jikka/blob/cae51d2d847c340e0c81f3aa64f49e3d995b67be/src/Jikka/CPlusPlus/Convert.hs#L25