LinearAlgebla 3×3行列トレーニングアプリ

LinearAlgebla – 3×3行列の「手計算感覚」を取り戻すトレーニングアプリ

LinearAlgeblaは、3×3行列の足し算・引き算・掛け算をクイズ形式で解きまくれる 線形代数トレーニングアプリです。
スワイプで問題を切り替え、マス目に答えを直接入力。 「パターンとして覚える」のではなく、「手が勝手に動く」感覚に近づくことを目標にしています。

作品の説明

教科書や講義で行列の計算方法はわかっても、 いざ紙とペンで3×3を計算しようとすると、時間がかかったり、 「どこに何を掛ければ良いか」を毎回思い出してしまうことがあります。

LinearAlgeblaでは、ランダムに生成された3×3行列どうしの 足し算・引き算・掛け算をテンポよく解かせることで、 行列積のパターンを身体に染み込ませることを狙っています。 問題の難易度は、要素の範囲(−3〜3, −5〜5, −9〜9など)や 零行列・単位行列を含むかどうかで調整可能です。

  • ① 3×3行列A, Bをランダム生成
  • ② 「A+B」「A−B」「AB」などの課題を出題
  • ③ ユーザーが9マスに回答を入力
  • ④ 即座に正誤チェック・マスごとのフィードバック
  • ⑤ 解答履歴を保存し、苦手パターンを分析

システム概要

LinearAlgebla システム構成図

スマートフォン単体で完結する構成です。 フロントエンドはJetpack Composeで行列のマス目UIを描画し、 内部で問題生成ロジックと採点ロジックを持つシンプルな構造になっています。 学習履歴はローカルのデータベース(Room)に保存し、 オフラインでもトレーニングを継続できます。

技術スタック

  • Android: Kotlin, Jetpack Compose, ViewModel, StateFlow
  • Data: Room(問題履歴・スコア・苦手パターンの保存)
  • Logic: 独自行列クラス(3×3専用)+クイズ生成エンジン

主要コンポーネント

  • MatrixQuestionGenerator: 難易度設定に基づいて3×3行列をランダム生成し、 足し算・引き算・掛け算の問題を組み立てるモジュール。
  • MatrixQuizScreen: 3×3のマスをタイルとして並べて表示し、タップで数字入力・ 正誤に応じて色を変えるCompose画面。
  • ResultEvaluator: 正解行列を内部で計算し、ユーザーの回答行列との一致を要素ごとに判定。 誤答の多い行・列を記録して「苦手パターン」として保存。
  • StatsView / HistoryView: 日ごとの正答率や、足し算・掛け算ごとの得意/苦手傾向を可視化する画面。

技術解説

QUIZ LOGIC

3×3行列のランダム生成と難易度設計

行列要素は一様乱数で生成しますが、「ただランダムにする」だけでは 計算が面倒すぎたり、逆に簡単すぎる問題ばかりになります。 そのため、難易度ごとに以下のルールを設けています。

・Easy: 要素は −3〜3、0 を多めに含める(計算負荷を下げる)
・Normal: 要素は −5〜5、0と±1の偏りを少なくしてバランスを取る
・Hard: 要素は −9〜9、行列積では桁数が増えすぎないよう出題回数を制御
LINEAR ALGEBRA

3×3専用の軽量行列クラス

Kotlinの2次元配列でも実装できますが、本アプリでは 「3×3に特化した軽量行列クラス」を別途定義しています。 行列積は C[i,j] = Σ A[i,k] B[k,j] を愚直に実装しますが、 3×3固定であることを活かし、ループではなくインライン展開することで 計算コストとGC負荷を抑えています。

class Mat3( val a11:Int, val a12:Int, ... val a33:Int ) {
  fun plus(other:Mat3): Mat3 { ... }
  fun times(other:Mat3): Mat3 { ... }
}
UI / COMPOSE

紙に書く感覚に近い3×3マスUI

UIは、紙のノートに書くときのレイアウトに近づけることを意識しました。 3×3のマスをグリッドで並べ、タップすると小さなテンキーが下からスライドしてきて、 即座に数字を入力できます。 正解すると淡い緑、誤答は赤でハイライトし、 その場でどこの要素を間違えたかが直感的にわかります。

・LazyVerticalGrid を使った3×3マスのレイアウト
・正誤に応じて modifier.background(...) で色を変更
・数字入力は bottom sheet のカスタムテンキーで実装
LEARNING DESIGN

「どの要素を間違えたか」を記録して復習へつなげる

単に正解/不正解だけを記録するのではなく、 「行列積で第2行第3列ばかり間違える」「−と+の扱いで符号ミスが多い」など、 もう一段細かい粒度で誤答を記録します。 これにより、「感覚的に弱い位置」が見えてきて、 復習問題を自動生成する際に使うことができます。

・問題IDごとに、(row, col, correct, answered, opType) を保存
・集計時に「どの (row, col) × 演算種別」が苦手かをヒートマップ表示

実験・結果・課題

クイズUIの試作と体感の確認

自分で1日数十問を解いてみて、「紙より速いか」「頭に残るか」を検証しました。 特に行列積では、行や列をなぞる視線の動きと、 指でマスに入力する動きが一致するかどうかを意識しました。

LinearAlgebla 問題画面(初期版)
(a) 初期版UI(単純なマスと入力欄)
LinearAlgebla 問題画面(改善版)
(b) 正誤に応じて色分けする改善版UI

現在の課題

現在は3×3の足し算・引き算・掛け算に絞っていますが、 線形代数としては「行列式」「逆行列」「固有値・固有ベクトル」など、 さらに練習したいテーマがたくさんあります。 どこまでをアプリの範囲とし、どこから先を紙の演習に任せるかの線引きが課題です。

行列式・逆行列クイズは未実装 苦手パターンからの自動出題はプロトタイプ段階

動画リンク

実際にスマホ上で行列クイズを解いている様子を収録したデモ動画です。 問題生成から採点、履歴への記録までの流れを確認できます。

3×3行列の足し算・掛け算クイズを解く様子

まだできていない部分と今後

「計算のための線形代数」から「発想のための線形代数」へ

LinearAlgeblaは今のところ、「手計算を速く・正確にする」ことにフォーカスしています。 将来的には、この計算力をベースに、 「この行列を掛けると何が変わるのか」「固有値が何を意味しているのか」 といった直感につなげるコンテンツも追加していきたいと考えています。

  • 短期: 行列式・逆行列の3×3クイズを追加し、基本演算を一通りカバー。
  • 中期: 2×2/3×3の固有値・固有ベクトルを「計算+図形のイメージ」で学べるモード。
  • 長期: 実際のアプリ開発や画像処理・機械学習で現れる行列を題材にした応用問題モード。

これからの改善点と開発計画

機能拡張・学習ログ・UIの3つの軸で進めます。

  • 機能: 行列式・逆行列クイズ、複数行列の連続掛け算問題の追加。
  • ログ: 日ごとのトレーニング時間・解いた問題数・正答率を記録し、グラフで可視化。
  • UI: タブレット・折りたたみ端末でも使いやすいレイアウトへの対応。
17
18
19
20
21
22
23
24
25
26
27
28
29
30
行列式・逆行列クイズの実装
トレーニング履歴とグラフ表示
タブレット向けUIの調整

このプロジェクトを通して

感じていること

数学の問題はどうしても「紙とペン」でやるもの、というイメージが強いですが、 実際にアプリ化してみると、「一問解くまでの心理的コスト」を下げる効果が大きいと感じました。 ちょっとした空き時間に、3問だけ、5問だけ解いてみる。 そうやって積み重ねた計算経験が、あとから証明や応用問題を読むときの 「あれ、この計算やったことあるな」という感覚につながっていきます。

今の自分へのメモ

  • ・「アプリを作ること」が目的ではなく、「自分の線形代数力を底上げすること」が目的であることを忘れない。
  • ・そのうえで、このアプリが将来の自分や誰かの役に立つなら、どんどん機能を育てていく。

リファレンス & リンク

リファレンス

  • 線形代数学の標準的な教科書(行列演算・行列式・逆行列の章)
  • Android Developers – Jetpack Compose
  • Android Developers – Room Persistence Library

リンク