2020年6月2日火曜日

学習環境

対話・おもしろ線形代数 (木村良夫(著)、現代数学社)の第3話(行列による世界旅行)、君も挑戦してみようの問1の解答を求めてみる。


  1. [ 0 1 2 3 ] [ 1 0 ] = [ 0 2 ] [ 2 1 ] [ 1 2 ] [ 2 3 ] [ 3 3 ] [ 3 0 ] [ 0 1 ] [ 1 3 ] [ 3 1 ] [ 1 4 ]
    [ 4 4 ] [ 4 0 ] [ 0 3 ] [ 3 4 ] [ 4 3 ]
    [ 3 2 ] [ 2 2 ] [ 2 0 ] [ 0 4 ] [ 4 2 ]
    [ 2 4 ] [ 4 1 ] [ 1 1 ] [ 1 0 ]

    よって長さ24のループを作る。

    逆回りのループをつくる行列、実際に確認。

    [ 1 3 1 0 ] [ 1 0 ] = [ 1 1 ] [ 4 1 ] [ 2 4 ] [ 4 2 ] [ 0 4 ]
    [ 2 0 ] [ 2 2 ] [ 3 2 ] [ 4 3 ] [ 3 4 ]
    [ 0 3 ] [ 4 0 ] [ 4 4 ] [ 1 4 ] [ 3 1 ]
    [ 1 3 ] [ 0 1 ] [ 3 0 ] [ 3 3 ] [ 2 3 ]
    [ 1 2 ] [ 2 1 ] [ 0 2 ] [ 1 0 ]

コード

#!/usr/bin/env python3
from unittest import TestCase, main
from sympy import Matrix

vs1 = []
vs2 = []


class TestMod5Loop(TestCase):
    def test1(self):
        m = Matrix([[0, 1],
                    [2, 3]])
        u = Matrix([[1], [0]])
        vs1.append(u)
        v = (m * u) % 5
        vs1.append(v)
        i = 1
        while u != v:
            v = (m * v) % 5
            vs1.append(v)
            i += 1
        self.assertEqual(i, 24)

    def test2(self):
        m = Matrix([[1, 3],
                    [1, 0]])
        u = Matrix([[1], [0]])
        vs2.append(u)
        v = (m * u) % 5
        i = 1
        vs2.append(v)
        while u != v:
            v = (m * v) % 5
            vs2.append(v)
            i += 1
        self.assertEqual(i, 24)
        self.assertEqual(vs1, list(reversed(vs2)))


if __name__ == "__main__":
    main()

入出力結果(Zsh、PowerShell、Terminal、Jupyter(IPython))

% ./sample1.py -v
test1 (__main__.TestMod5Loop) ... ok
test2 (__main__.TestMod5Loop) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.041s

OK
%

0 コメント:

コメントを投稿