2020年6月9日火曜日

学習環境

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



    1. m o d 2 [ 0 1 1 0 ] [ 1 0 ] = [ 0 1 ] [ 1 0 ]
      [ 0 1 1 1 ] [ 1 0 ] = [ 0 1 ] [ 1 1 ] [ 1 0 ]
      [ 0 0 1 0 ] [ 1 0 ] = [ 0 1 ] [ 0 0 ] [ 0 0 ]

      ここから
      mod 3

      [ 0 1 2 0 ] [ 1 0 ] = [ 0 2 ] [ 2 0 ] [ 0 1 ] [ 1 0 ]

      この逆回りのループをつくる行列。

      [ 0 2 1 0 ] [ 1 0 ] = [ 0 1 ] [ 2 0 ] [ 0 2 ] [ 1 0 ]

      別の行列。

      [ 0 1 2 1 ] [ 1 0 ] = [ 0 2 ] [ 2 2 ] [ 2 0 ] [ 0 1 ] [ 1 1 ] [ 1 0 ]

      この逆回りのループをつくる行列。

      [ 1 2 1 0 ] [ 1 0 ] = [ 1 1 ] [ 0 1 ] [ 2 0 ] [ 2 2 ] [ 0 2 ] [ 1 0 ]

      ここから
      mod 4

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

      別の行列。

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

      別の行列。

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

      これと逆回りのループをつくる行列。

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

    2. mod 6

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

      別の行列。

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

      別の行列。

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

      別の行列。

      [ 0 1 1 2 ] [ 1 0 ] = [ 0 1 ] [ 1 2 ] [ 2 5 ] [ 5 0 ] [ 0 5 ] [ 5 4 ] [ 4 1 ] [ 1 0 ]

      これと逆回りのループをつくる行列。

      [ 4 1 1 0 ] [ 1 0 ] = [ 4 1 ] [ 5 4 ] [ 0 5 ] [ 5 0 ] [ 2 5 ] [ 1 2 ] [ 0 1 ] [ 1 0 ]

コード

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

vs1 = []
vs2 = []


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

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


if __name__ == "__main__":
    main()

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

% ./sample2.py -v
test1 (__main__.TestMod6Loop) ... ok
test2 (__main__.TestMod6Loop) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.031s

OK
%

0 コメント:

コメントを投稿